AutoLisp 试图 select LWPolyline 但只有矩形。我怎么做?
AutoLisp trying to select LWPolyline BUT ONLY RECTANGLES. How do I do that?
所以我正在尝试 select 所有矩形实体。
我试过 (setq ss (ssget "X" '((0 . "RECTANG"))))
,但它似乎 select 所有折线,包括多边形。我尝试检查 vertices = 4 但它也是 selects 钻石。我怎么能实现这样的代码?
如果您当前使用 ssget
过滤器列表 '((0 . "RECTANG"))
的代码是 select 任何东西,我会感到非常惊讶,因为 RECTANG
无效DXF 组 0 的实体类型。
在 AutoCAD 中,标准 RECTANG
命令实际上创建了实体类型(DXF 组 0)为 LWPOLYLINE
的二维多段线。因此,您的 ssget
过滤器列表应该开始于:
(ssget "_X" '((0 . "LWPOLYLINE")))
我们可以使用以下方法将此 selection 进一步过滤为 select 只有具有 4 个顶点的 2D 多段线:
(ssget "_X" '((0 . "LWPOLYLINE") (90 . 4)))
我们可以使用以下方法过滤具有 4 个顶点的闭合多段线:
(ssget "_X" '((0 . "LWPOLYLINE") (90 . 4) (-4 . "&=") (70 . 1)))
但是,仅使用 ssget
过滤器列表不可能进一步缩小 selection,因此要专门针对矩形,您需要迭代select离子由上述表达式返回并删除所有非矩形的多段线。
您可以按以下方式编写这样的函数:
(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)
)
)
)
所以我正在尝试 select 所有矩形实体。
我试过 (setq ss (ssget "X" '((0 . "RECTANG"))))
,但它似乎 select 所有折线,包括多边形。我尝试检查 vertices = 4 但它也是 selects 钻石。我怎么能实现这样的代码?
如果您当前使用 ssget
过滤器列表 '((0 . "RECTANG"))
的代码是 select 任何东西,我会感到非常惊讶,因为 RECTANG
无效DXF 组 0 的实体类型。
在 AutoCAD 中,标准 RECTANG
命令实际上创建了实体类型(DXF 组 0)为 LWPOLYLINE
的二维多段线。因此,您的 ssget
过滤器列表应该开始于:
(ssget "_X" '((0 . "LWPOLYLINE")))
我们可以使用以下方法将此 selection 进一步过滤为 select 只有具有 4 个顶点的 2D 多段线:
(ssget "_X" '((0 . "LWPOLYLINE") (90 . 4)))
我们可以使用以下方法过滤具有 4 个顶点的闭合多段线:
(ssget "_X" '((0 . "LWPOLYLINE") (90 . 4) (-4 . "&=") (70 . 1)))
但是,仅使用 ssget
过滤器列表不可能进一步缩小 selection,因此要专门针对矩形,您需要迭代select离子由上述表达式返回并删除所有非矩形的多段线。
您可以按以下方式编写这样的函数:
(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)
)
)
)