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