|
ssget过滤动态块的方式
Autocad在2006增加了新的动态块功能,方便了对块的动态修改,但是修改动态块后,块名会变成一个匿名块,导致无法通过块名来快速过滤。
明经论坛上有人通过全选块后再来遍历筛选,我通过研究简化了这个问题。采用同时改过的和没改过的块,减少了选择对象的数量,甚至可以说是直接过滤块名的效果。
方法就是在过滤块名的增加一个匿名块的功能。
(ssget '((2 . "`*U*,图框")))
这样可以同时过滤到 图框和修改后的动态图框,这时候我们再来遍历验证一下选择的块是否正确,再来筛选一下,如果图中没有什么匿名块,几乎和过滤块名是一样的。
再此基础之上,可以再更进一步,预先获取该块名的所有动态块的匿名名称,加入到当前选择过滤名称表中。这样就会比较精准的过滤到指定块名的对象,下面是个简单的例子.
(vl-load-com)
(defun c:tt(/ BLKNAME EN ENT LST OBJ SS SS2 TMPBLKNAME TMPOBJ)
(if(setq ent(car(entsel "\n请选择需要过滤的参考图块: ")))
(progn
(setq obj(vlax-ename->vla-object ent))
;;先获取参考块的真实块名
(setq blkName(vla-get-EffectiveName obj))
;;如果是动态块执行添加动态块的匿名块名进行过滤
(if (= (vla-get-IsDynamicBlock obj) :vlax-true)
(progn
;;全选所有匿名块
(if (setq ss(ssget "x" '((0 . "insert")(2 . "`*U*"))))
(progn
(setq lst '())
;;循环判定匿名块的块名是否是参考块的块名
(while (setq en(ssname ss 0))
(setq Tmpobj(vlax-ename->vla-object en))
(setq TmpblkName(vla-get-EffectiveName Tmpobj))
(if (= TmpblkName blkName)
(progn
;;添加到lst表中
(setq lst (cons (vla-get-Name Tmpobj) lst))
)
)
(ssdel en ss)
)
;;反转表,可省略
(setq lst(reverse lst))
(if lst
(progn
;;将匿名块的块名表连接为一个字符串,并处理*问题.
(setq blkName(strcat (apply 'strcat (mapcar '(lambda(x)(strcat "`" x ",")) lst)) blkName))
)
)
)
)
)
)
;;执行过滤选择
(setq ss2(ssget (list '(0 . "insert") (cons 2 blkName))))
(if (and ss2 (= 0 (getvar "cmdactive"))) (command "._select" ss2 "" "._pselect" ss2 ""))
)
)
) |
|