【发布时间】:2020-05-06 02:17:23
【问题描述】:
所以我试图选择所有矩形实体。
我试过这个 (setq ss (ssget "X" '((0 . "RECTANG")))) ,但它似乎选择了所有折线,包括多边形。我尝试检查 vertices = 4 但随后它也选择了菱形。我怎么能实现这样的代码?
【问题讨论】:
标签: lisp autocad autocad-plugin autolisp
所以我试图选择所有矩形实体。
我试过这个 (setq ss (ssget "X" '((0 . "RECTANG")))) ,但它似乎选择了所有折线,包括多边形。我尝试检查 vertices = 4 但随后它也选择了菱形。我怎么能实现这样的代码?
【问题讨论】:
标签: lisp autocad autocad-plugin autolisp
如果您当前使用 ssget 过滤器列表 '((0 . "RECTANG")) 的代码完全选择任何内容,我会感到非常惊讶,因为 RECTANG 不是 DXF 组 0 的有效实体类型。
在 AutoCAD 中,标准的 RECTANG 命令实际上创建了 2D 多段线,其实体类型(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)
)
)
)
【讨论】: