AutoLisp试图选择LWPolyline BUT ONLY RECTANGLES。我该怎么做呢?

问题描述 投票:0回答:1

所以我试图选择所有矩形的实体。我试过这样做 (setq ss (ssget "X" '((0 . "RECTANG")))) 但它似乎选择了所有的多条线,包括多边形。我试着检查顶点=4,但它也选择了钻石。 我怎样才能实现这样的代码呢?

autocad autolisp
1个回答
1
投票

我非常惊讶,如果你目前的代码使用的是 ssget 滤单 '((0 . "RECTANG")) 是选择任何东西,因为 RECTANG 不是 DXF 组 0 的有效实体类型。


在 AutoCAD 中,标准的 RECTANG 命令实际上是创建二维多线,其实体类型(DXF组0)是 LWPOLYLINE. 因此,你的 ssget 过滤器列表应该开始。

(ssget "_X" '((0 . "LWPOLYLINE")))

我们可以进一步过滤这个选择,只选择有4个顶点的二维多段线,使用:

(ssget "_X" '((0 . "LWPOLYLINE") (90 . 4)))

我们还可以使用过滤列表来过滤有4个顶点的闭合多段线

(ssget "_X" '((0 . "LWPOLYLINE") (90 . 4) (-4 . "&=") (70 . 1)))

然而,我们不可能再进一步缩小选择范围,只需使用 ssget 过滤器列表,因此要特别针对矩形,您需要对上述表达式返回的选择进行迭代,并删除任何非矩形的多条线。

你可以用下面的方式写这样一个函数。

(defun selrectang ( / a b c d e i s )
    (if (setq s (ssget "_X" '((0 . "LWPOLYLINE") (90 . 4) (-4 . "&=") (70 . 1))))
        (progn
            (repeat (setq i (sslength s))
                (setq i (1- i)
                      e (ssname s i)
                )
                (mapcar 'set '(a b c d) (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget e))))
                (if
                    (not
                        (and
                            (equal (distance a b) (distance c d) 1e-8)
                            (equal (distance b c) (distance a d) 1e-8)
                            (equal (distance a c) (distance b d) 1e-8)
                        )
                    )
                    (ssdel e s)
                )
            )
            (if (< 0 (sslength s)) s)
        )
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.