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)
        )
    )
)