[原创]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 "
请选择需要过滤的参考图块: ")))
    (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 ""))
      )
    )
  )

  

后记:感谢LTools 指出的一个错误,2019-4-3 15:01:10。

原文地址:https://www.cnblogs.com/edata/p/6797362.html