所以我试图选择所有矩形的实体。我试过这样做 (setq ss (ssget "X" '((0 . "RECTANG"))))
但它似乎选择了所有的多条线,包括多边形。我试着检查顶点=4,但它也选择了钻石。 我怎样才能实现这样的代码呢?
我非常惊讶,如果你目前的代码使用的是 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)
)
)
)