关于过滤的块的程序
下面这个程序是完整的,我只是个搬运工,tt命令是我改的,为了方便一些。输入命令后,选择要选择的块,支持动态快,然后框选所有,就会过滤排除掉其它块了。
但这个程序对我的可见性块(动态快)好像不起作用,也就是无法过滤一个动态快中不同的可见性块,哪位大神出来帮忙修改一下呢:lol
程序如下:
(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 ""))
)
)
)
上图测试呢, 你这个都全选了直接通过比较块名,不是需要的排除
就不需要第二步执行的操作了 (setq ss2 (ssget (list '(0 . "insert") (cons 2 blkName)))) 本帖最后由 jun353835273 于 2023-9-13 16:36 编辑
(vl-load-com)
(defun c:tt1(/ i 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 i -1)
(setq lst nil)
(while (setq en (ssname ss (setq i (1+ i))))
(setq Tmpobj (vlax-ename->vla-object en))
(setq TmpblkName (vla-get-EffectiveName Tmpobj))
(if (/= TmpblkName blkName)
(setq lst (cons en lst))
)
)
(and lst (mapcar (function(lambda(x) (setq ss (ssdel x ss)))) lst))
)
)
)
(progn
;;全选所有名块
(setq ss (ssget "x" (list '(0 . "insert") (cons 2 blkName))))
)
)
)
;;执行过滤选择
(if (and ss (= 0 (getvar "cmdactive"))) (command "._select" ss "" "._pselect" ss ""))
)
)
改了下,这种结构应该比之前的好一点,不然strcat 那个块名如果太多了,估计也有问题。
jun353835273 发表于 2023-9-13 16:31
大神,我回头试试:D- 本帖最后由 lingduwx 于 2023-9-15 23:13 编辑
jun353835273 发表于 2023-9-13 16:31
大哥你好,请问如果这种比较复杂的能否一次选择呢
这个是截图详见cad
不懂这个有什么用?快速选择不一样吗? lingduwx 发表于 2023-9-15 23:11
大哥你好,请问如果这种比较复杂的能否一次选择呢
这个是截图详见cad
块名不一样,应该可以用ssget先选一次需要的那几种类型,后面在过滤 jun353835273 发表于 2023-9-13 16:31
这个程序有点问题,动态不支持了哦
页:
[1]