【问题标题】:AutoLisp trying to select LWPolyline BUT ONLY RECTANGLES. How do I do that?AutoLisp 试图选择 LWPolyline 但只有矩形。我怎么做?
【发布时间】:2020-05-06 02:17:23
【问题描述】:

所以我试图选择所有矩形实体。 我试过这个 (setq ss (ssget "X" '((0 . "RECTANG")))) ,但它似乎选择了所有折线,包括多边形。我尝试检查 vertices = 4 但随后它也选择了菱形。我怎么能实现这样的代码?

【问题讨论】:

    标签: lisp autocad autocad-plugin autolisp


    【解决方案1】:

    如果您当前使用 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)
            )
        )
    )
    

    【讨论】:

    • 非常感谢!还有一个问题。我必须调用哪个属性来更改矩形的大小和位置?谢谢指教!!
    • 不客气。要更改矩形的大小和位置,您需要修改折线顶点的坐标 - 不过,这属于单独的问题。
    猜你喜欢
    • 2022-06-10
    • 2014-09-20
    • 2020-08-20
    • 2019-08-25
    • 2021-11-02
    • 1970-01-01
    • 2011-06-03
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多