明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1089|回复: 6

[建筑] 如何构建一个组码表

[复制链接]
发表于 2015-8-31 07:55 | 显示全部楼层 |阅读模式
本帖最后由 ZZXXQQ 于 2015-8-31 15:45 编辑

原程序代码如下:
  1. ;删除与选中图块同名的图中所有的图块,处理建筑图时使用。
  2. ;图中的家具等无用的图块。
  3. (defun c:eb ( /  ent entl  i   ss ssx len)
  4. (print "请选择需要删除的块:")
  5. (setq ss (ssget  '((0 . "INSERT"))))
  6. (setq len (sslength ss))
  7. (setq i 0)
  8. (while (< i len)
  9.       (setq ent (ssname ss i))
  10.       (setq entl2 (assoc 2 (entget ent)))
  11.       (setq ssx (ssget "X" entl2))
  12.       (command ".erase" ssx "")     
  13.       (setq i (+ 1 i))   
  14.   )
  15. )
其中 倒数第5行中的(setq ssx (ssget "X" entl2))语句有问题,问题在于ssget函数的filter-list原应该是组码表,但程序中现只是点对。
思考了多种方法均没有成功:
1、想采用quote函数,但该函数后面不可以跟带变量,如果跟带变量之后,只会变成变量名的字符串;
2、想创建一个只含有一项内容的一组码表,采用 (ssadd entl2),将entl2点对创建到一个新的表里,但不知道哪里出问题了,程序运行到这步断了;
3、想采用得到图元的组码表后,将这个表里的除entl2外的其它内容均删除,得到只包含entl2点对的组码表;

想请问一下,对于这种情况,是否有什么好的解决办法,是否有命令直接创建图元组码表?

谢谢!




发表于 2015-8-31 08:24 | 显示全部楼层
(defun c:eb (/  ent entl  i   ss ssx len)
(print "请选择需要删除的块:")
(setq ss (ssget  '((0 . "INSERT"))))
(setq len (sslength ss))
(setq i 0)
(while (< i len)
      (setq ent (ssname ss i))
      (setq entl2 (assoc 2 (entget ent)))
      (setq ssx (ssget "X" (list '(0 . "INSERT") entl2 )))
      (command ".erase" ssx "")     
      (setq i (+ 1 i))   
  )
)
发表于 2015-8-31 09:03 | 显示全部楼层
ssget的过滤是两层表结构为(list(cons 2 变量))
cons可以构件点对表(2 . "blkname")-> (cons 2 "blkname")
也可以插入表,(cons 2 (list 1 3 4))->( 2 1 3 4)
将点对表用list cons apend+list等函数均能生成新表
ssadd是添加到选择集的函数,格式(ssadd 图元名 选择集)
至于去除之外的表,直接是(assoc 2 (entget ent)) 得到的表,无需去除其他表了。
 楼主| 发表于 2015-8-31 09:48 | 显示全部楼层
本帖最后由 BenjaminXM 于 2015-8-31 10:21 编辑
vlisp2012 发表于 2015-8-31 08:24
(defun c:eb (/  ent entl  i   ss ssx len)
(print "请选择需要删除的块:")
(setq ss (ssget  '((0 . ...


我绕不过弯的原因是我把quote(')函数与list函数混淆了,所以一直解决不了。

直接list(entl2)就可以解决了,不过你添加的块属性很合适。

非常感谢,很有效的解决了问题,谢谢~

 楼主| 发表于 2015-8-31 10:18 | 显示全部楼层
edata 发表于 2015-8-31 09:03
ssget的过滤是两层表结构为(list(cons 2 变量))
cons可以构件点对表(2 . "blkname")-> (cons 2 "blkname") ...

谢谢你的回答。
前三行回答都明白。
以下部分不太明白:
1.将点对表用list cons apend+list等函数均能生成新表:
原entl2是点对,现在想将其两层表结构,‘(entl2),这样写得到的值(entl2),无法变成双层表。
我原先一直把'()当成list函数了,这里出现了错误。采用list(entl2)就直接可以变成双层表了。

但用cons函数就不知道怎么操作了,(cons entl2  '(0 . "INSERT")) 也得不到双层表
append('(0 . "INSERT") entl2),这个函数不是将所有点对表都合并成一个非点对子集的一层大表了吗?

2.ssadd的想法错误来源于我对集合和表的混淆,以为集合会加了外围的括号就是双层表了,应该不是吧?

3.至于去除之外的表,直接是(assoc 2 (entget ent)) 得到的表,无需去除其他表了。这里我提问中的表达不清楚,产生了歧义,这里我本想问的是,原先得到实体的图元组码是双层表,我保留组码中entl2的点对,得到一个双层表,表中只含有entl2点对这个值。我想问的是这个。(assoc 2 (entget ent)) 得到的是entl2点对,但我想要双层表,不是点对。

非常感谢你提供的帮助!

发表于 2015-8-31 10:50 | 显示全部楼层
cons append list这三个函数的运用例子。
通过以下方式就能得到双层表。而这三种方式在面对不同的情况下选择合适的方式。
(append (list 1 2 3)(list  4 5 6))=>(1 2 3 4 5 6)
  1. _$ (setq entl2(cons 1 "test1"))
  2. (setq entl3(cons 2 "test2"))
  3. (setq duble_l1(cons entl3 (list entl2)));cons+list
  4. (setq duble_l2(append (list entl3) (list entl2)));append + list
  5. (setq duble_l3(list entl2 entl3));list
  6. (1 . "test1")
  7. (2 . "test2")
  8. ((2 . "test2") (1 . "test1"))
  9. ((2 . "test2") (1 . "test1"))
  10. ((1 . "test1") (2 . "test2"))
  11. _$


选择集是个特殊对象,类似于表结构,但是不是表。
他是一个以图元名为单个元素构成的集合,比如你建立了SS1这个选择集,那么可以通过ssname或ssnamex函数获得该集合中的某个图元名,ssdel是删除选择集中的图元名,ssadd是添加图元名到这个集合。sslength可以判断出该选择集的图元名数量,具体的可以去翻一下帮助。

至于去除表,因为去除操作需要循环或vl-remove或vl-remove-if vl-remove-if-not之类的。比较耗费时间,而且在你的要求下,只需要用(assoc 2(enget ent))即可返回点对表,那么直接加(list (assoc 2(enget ent)))即可获得双层表,快速的,并且满足要求。
 楼主| 发表于 2015-8-31 11:06 | 显示全部楼层
edata 发表于 2015-8-31 10:50
cons append list这三个函数的运用例子。
通过以下方式就能得到双层表。而这三种方式在面对不同的情况下选 ...

这回全都看明白了,非常感谢你提供的帮助,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 05:10 , Processed in 0.222004 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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