明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2725|回复: 13

[已解答] 如何选取所有同名字的块并且亮显?

[复制链接]
发表于 2014-12-23 16:33 | 显示全部楼层 |阅读模式
  1. (defun c:t ()
  2. (setq st t)
  3. (while st
  4. (while  (not (setq st (entsel "\n选择需要统计的块:"))))
  5.             (if  (= (cdr (assoc '0 (entget (car st)))) "INSERT")
  6.                  (progn
  7.                  (setq blockname (cdr (assoc '2 (entget (car st)))))
  8.                  (setq st nil)
  9.                  )
  10.                  (princ "\n未选择到块!")
  11.             )               
  12. )
  13. (princ (strcat "\n选择块" blockname "<全选>:"))
  14. (setq ss (ssget '((-4 . "<OR")(0 . "INSERT")(0 . "TCH_BLOCK_INSERT")(-4 . "OR>"))))
  15. (if (= ss nil) (setq ss (ssget '((-4 . "<OR")(0 . "INSERT")(0 . "TCH_BLOCK_INSERT")(-4 . "OR>")))))
  16. (setq n 0 m 0 sslist '())
  17. (while (and ss (< n (sslength ss)))
  18.            (setq ssn (ssname ss n))
  19.            (if (= (cdr (assoc '0 (entget ssn))) "INSERT")
  20.                (progn
  21.               (setq blockname1 (cdr (assoc '2 (entget ssn))))            
  22.               (if (= blockname blockname1)
  23.                   (setq m (+ m 1))
  24.                   (setq sslist (cons blockname sslist))
  25.               )
  26.               )
  27.             )
  28.             (setq n (+ n 1))
  29. )
  30. (alert  (strcat "块" blockname ":" (rtos m 2 0) "个"))
  31.   (setq q nil)      
  32.   (MAPCAR '(LAMBDA(X)(SSADD (VLAX-VLA-OBJECT->ENAME X) sslist))(MAPCAR 'CAR q))         
  33.       (cond
  34.         ((command "select" sslist "")
  35.          (sssetfirst nil (ssget"p")))
  36.         (    sslist (sssetfirst nil sslist))
  37.       )
  38. )
上面的亮显代码,是参考论坛里面,查找替换的文字亮显的那位(忘记名字了)
然后,现在存在的问题是,如果是用 SS选择集,是可以将所有选择范围内所有的块都亮显的。
但是如果将想要统计数量的块放到一个选择集里面,再针对这个选择集亮显,提示参数类型错误。
原来的正确的应该是 PICKSET  但是这里是list
不是太懂这些函数和公式的意思,都是拼拼凑凑弄出来的。
求解答,或者直接修改下代码,让选择的块可以在弹出数量提示窗口之后,亮显。

 楼主| 发表于 2014-12-23 16:39 | 显示全部楼层
  1. (defun c:t ()
  2. (setq st t)
  3. (while st
  4. (while  (not (setq st (entsel "\n选择需要统计的块:"))))
  5.             (if  (= (cdr (assoc '0 (entget (car st)))) "INSERT")
  6.                  (progn
  7.                  (setq blockname (cdr (assoc '2 (entget (car st)))))
  8.                  (setq st nil)
  9.                  )
  10.                  (princ "\n未选择到块!")
  11.             )               
  12. )
  13. (princ (strcat "\n选择块" blockname "<全选>:"))
  14. (setq ss (ssget '((-4 . "<OR")(0 . "INSERT")(0 . "TCH_BLOCK_INSERT")(-4 . "OR>"))))
  15. (if (= ss nil) (setq ss (ssget '((-4 . "<OR")(0 . "INSERT")(0 . "TCH_BLOCK_INSERT")(-4 . "OR>")))))
  16. (setq n 0 m 0 sslist '())
  17. (while (and ss (< n (sslength ss)))
  18.            (setq ssn (ssname ss n))
  19.            (if (= (cdr (assoc '0 (entget ssn))) "INSERT")
  20.                (progn
  21.               (setq blockname1 (cdr (assoc '2 (entget ssn))))            
  22.               (if (= blockname blockname1)
  23.                   (setq m (+ m 1))
  24.                   (setq sslist (cons blockname sslist)) ;;这里是我自己加的,把所有需要计算数量的块都放到一个集合里面。
  25.               )
  26.               )
  27.             )
  28.             (setq n (+ n 1))
  29. )
  30. (alert  (strcat "块" blockname ":" (rtos m 2 0) "个"))
  31.   (setq q nil)      ;;;从这里开始是亮显的代码
  32.   (MAPCAR '(LAMBDA(X)(SSADD (VLAX-VLA-OBJECT->ENAME X) sslist))(MAPCAR 'CAR q))         
  33.       (cond
  34.         ((command "select" sslist "")  ;;;这里不是已经选择了这个隔离出来的块集合嘛
  35.          (sssetfirst nil (ssget"p")))  ;;;然后这里把这选择的部分创建为一个获取的选择集,怎么到了下面还会是list。
  36.         (    sslist (sssetfirst nil sslist))  ;;然后这个sslist 里面就是(块名,块名,块名)类型是list
  37.       )
  38. )  ;;;;如果直接使用 SS这个选集,是会亮显所有框选范围内的块的。
不好意思,代码里面忘记带注释了。

 楼主| 发表于 2014-12-23 17:29 | 显示全部楼层
有人查看,没人回复,十分苦恼的说啊。。。。。刚才又去是了按层全选,自己需要的那部分图层还是可以亮显的,怎么就没有办法让需要的块亮显呢?难道是因为是二次选择?
 楼主| 发表于 2014-12-23 20:00 | 显示全部楼层
各位大神都很忙碌么,没人帮小弟解答一下这个问题么。是不是问的太没水平了?只是真的搞不懂,按照程序走的意思,翻译出来应该是这个意思的啊,但是就是没法选择到。
发表于 2014-12-23 20:32 | 显示全部楼层
guerearou 发表于 2014-12-23 20:00
各位大神都很忙碌么,没人帮小弟解答一下这个问题么。是不是问的太没水平了?只是真的搞不懂,按照程序走的 ...
  1. (defun c:tt ()
  2. (while (and(setq st (entsel "\n选择需要统计的块:"))
  3.             (wcmatch (cdr(assoc 0 (entget(car st)))) "INSERT,TCH_BLOCK_INSERT"))
  4.   (setq blockname (cdr (assoc 2 (entget (car st)))))
  5.   (princ (strcat "\n选择块" blockname ":"))
  6.   (if (setq ss (ssget (list '(0 . "INSERT,TCH_BLOCK_INSERT") (cons 2 blockname)))) (progn
  7.    (sssetfirst nil ss)
  8.    (alert (strcat "块" blockname ":" (rtos (sslength ss) 2 0) "个"))
  9.   ))
  10. )
  11. (princ)
  12. )
发表于 2014-12-23 20:53 | 显示全部楼层
一般的,用 select similar 命令就可以了。
 楼主| 发表于 2014-12-23 20:58 | 显示全部楼层
ZZXXQQ 发表于 2014-12-23 20:32
  1. (defun C:tk()
  2. (setq sslist '())
  3. (setq st (entsel "\n选择需要统计的块:"))
  4. (setq blockname (cdr (assoc '2 (entget (car st)))))
  5. (princ (strcat "\n选择块" blockname ))  
  6.   (setq sslist (ssget(list(assoc 2 (entget (car st))))))  
  7. (setq n 0 m 0)
  8. (while (and sslist (< n (sslength sslist)))
  9.            (setq ssn (ssname sslist n))
  10.               (progn
  11.               (setq blockname1 (cdr (assoc '2 (entget ssn))))            
  12.               (if (= blockname blockname1)
  13.                   (setq m (+ m 1))
  14.               )
  15.               )
  16.             (setq n (+ n 1))
  17. )
  18. (alert  (strcat "块" blockname ":" (rtos m 2 0) "个"))

  19.   (setq q nil)      
  20.   (MAPCAR '(LAMBDA(X)(SSADD (VLAX-VLA-OBJECT->ENAME X) sslist))(MAPCAR 'CAR q))         
  21.       (cond
  22.         ((command "select" sslist "")  
  23.          (sssetfirst nil (ssget"p")))  
  24.         (    sslist (sssetfirst nil sslist))   ))  ;;后面我自己想到的这么写的......比起您的来说真是又臭又长啊,其实我后来想到,好像是因为先前那个是把选择的名字放到了一起,对名字去选择,选不到。应该是用图元去选择才对的。可惜我对函数不熟悉更不知道VLISP怎么做。只能拼凑着弄点将就用了。
 楼主| 发表于 2014-12-23 21:03 | 显示全部楼层
e2002 发表于 2014-12-23 20:53
一般的,用 select similar 命令就可以了。

额  选择相似  不知道是不是一个命令,对 这个不是很清楚。我主要是想自己把一些需要的命令放到一起,自己做个箱子。大体什么的都参照论坛里面的例子做好了。就是有几个不是太清楚,其中主要就是这个亮显,不过现在这个问题也得到解答了。这两天弄的头都疼了,完全是没有一点基础,照着别人的成品加上自己的理解些的,估计写出来的东西都是将就够用,还有很多没有想周全的。恩,感谢回答。十分感谢。

点评

就是一个命令: SELECTSIMILAR 还有一个类似的好东西 :ADDSELECTED  发表于 2014-12-23 23:06
 楼主| 发表于 2014-12-23 21:05 | 显示全部楼层
ZZXXQQ 发表于 2014-12-23 20:32

再次感谢你的代码,让我知道了我其他几个lisp还可以再精简很多不必要的叙述。
这个里面应该判断了,普通块和天正块的。本来我也相加进去的,只是不知道怎么去判断。
感谢。
发表于 2014-12-23 23:10 | 显示全部楼层
本帖最后由 e2002 于 2014-12-23 23:13 编辑
guerearou 发表于 2014-12-23 21:05
再次感谢你的代码,让我知道了我其他几个lisp还可以再精简很多不必要的叙述。
这个里面应该判断了,普通 ...

看你的需求,你的代码不需要这般复杂的,继续改善吧。
你都知道了 sslength 了, 还要循环 1+n 这些做什么呢?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 16:16 , Processed in 0.274911 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表