njygx 发表于 2023-9-13 15:40:35

关于过滤的块的程序

下面这个程序是完整的,我只是个搬运工,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 ""))
    )
)
)


jun353835273 发表于 2023-9-13 16:13:31

上图测试呢, 你这个都全选了直接通过比较块名,不是需要的排除
就不需要第二步执行的操作了 (setq ss2 (ssget (list '(0 . "insert") (cons 2 blkName))))

jun353835273 发表于 2023-9-13 16:31:27

本帖最后由 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 那个块名如果太多了,估计也有问题。

njygx 发表于 2023-9-13 18:38:33

jun353835273 发表于 2023-9-13 16:31


大神,我回头试试:D-

lingduwx 发表于 2023-9-15 23:11:58

本帖最后由 lingduwx 于 2023-9-15 23:13 编辑

jun353835273 发表于 2023-9-13 16:31

大哥你好,请问如果这种比较复杂的能否一次选择呢
这个是截图详见cad



jh3030912 发表于 2023-9-16 07:27:42

不懂这个有什么用?快速选择不一样吗?

jun353835273 发表于 2023-9-16 09:22:58

lingduwx 发表于 2023-9-15 23:11
大哥你好,请问如果这种比较复杂的能否一次选择呢
这个是截图详见cad

块名不一样,应该可以用ssget先选一次需要的那几种类型,后面在过滤

njygx 发表于 2023-11-10 15:46:52

jun353835273 发表于 2023-9-13 16:31


这个程序有点问题,动态不支持了哦
页: [1]
查看完整版本: 关于过滤的块的程序