VBA/AutoLisp - 如何在 AutoCAD 中通过代码检查块是否分组

VBA/AutoLisp - How to check if a block is grouped through code in AutoCAD

我在 AutoCAD 中使用组,由于​​从不同的图形复制粘贴它们,它们取消了组。 我可能会忘记重新组合它们,我想创建一个代码,当我认为我完成了绘图时,可以检查块列表(每个组都有一个块)是否不在组内。

因此,想法是它会 运行 从选择的块(例如:块 1、块 3、块 7)中检查这些特定块是否已分组。如果没有,它会告诉我哪个块未分组。

如标签所示,vba 或 autolisp 都可以。我在这方面相当新手,任何帮助将不胜感激。

编辑:知道如何在 vba 中获取块组名称会很棒

背景

一个方块定义可能有很多方块引用:方块定义类似于建筑的蓝图,每个方块都有引用类似于建筑物本身的建造。

因此,仅给定块列表名称,每个块名称可能对应多个块引用,其中一些包含在组,其他则不是。


方法

因此,您可以从两个角度处理此任务:

  • 迭代绘图中定义的所有 Groups(使用 ActiveX Groups Collection,或命名对象字典中包含的 ACAD_GROUP 字典),并获得一组不同的块名称对应于至少一个组中包含的块。

  • 遍历绘图中的所有 块引用 并测试块引用是否通过 [=14= link 到 GROUP 实体] DXF 数据中的条目。编译与块对应的块名称列表,这些块要么包含在至少一个组中,要么不包含在任何组中。

给定这样一个列表,然后您可以轻松地测试您的任何块名称是否不在列表中。


示例代码

下面是一个函数,它将遍历命名对象字典的 ACAD_GROUP 字典中定义的所有组,并将 return 包含在一个或多个中的块引用的名称列表群组:

(defun blocknamesfromgroups ( / blk dic enx grp rtn )
    (if (setq dic (cdr (assoc -1 (dictsearch (namedobjdict) "acad_group"))))
        (while (setq grp (dictnext dic (not grp)))
            (foreach itm grp
                (if (and (= 340 (car itm)) (= "INSERT" (cdr (assoc 0 (setq enx (entget (cdr itm)))))))
                    (if (not (member (setq blk (cdr (assoc 2 enx))) rtn))
                        (setq rtn (cons blk rtn))
                    )
                )
            )
        )
    )
    (reverse rtn)
)

或者,以下函数将遍历活动图形中的所有主要块引用,并将报告不包含在组中的块引用的名称:

(defun blocknamesnotgrouped ( / blk enx grp idx sel rtn )
    (if (setq sel (ssget "_X" '((0 . "INSERT"))))
        (repeat (setq idx (sslength sel))
            (setq idx (1- idx)
                  enx (entget (ssname sel idx))
                  blk (cdr (assoc 2 enx))
            )
            (if
                (not
                    (or
                        (and
                            (setq enx  (member '(102 . "{ACAD_REACTORS") enx))
                            (setq grp  (cdr (assoc 330 enx)))
                            (= "GROUP" (cdr (assoc 0 (entget grp))))
                        )
                        (member blk rtn)
                    )
                )
                (setq rtn (cons blk rtn))
            )
        )
    )
    (reverse rtn)
)