如何统计图块
请教各位大神,如何实现材料统计,常规统计块已经知道,但是有些块是嵌套在另外的块中间的,这个块就统计不上了,有什么办法可以统计到嵌套块的?或者提供一种材料统计的思路的?1. 可以遍历块获得块中块。2. 可以炸掉块。 都要注意嵌套块的层数。 mikewolf2k 发表于 2016-5-16 10:35 static/image/common/back.gif
1. 可以遍历块获得块中块。2. 可以炸掉块。 都要注意嵌套块的层数。
能否提示,如何才能知道嵌套块的层数?? Summer__sir 发表于 2016-5-16 15:34 static/image/common/back.gif
能否提示,如何才能知道嵌套块的层数??
事先不知道,要一层层的遍历下去才知道。另外用户应该知道,要项目统一规定执行。 本帖最后由 chg 于 2016-5-17 13:08 编辑
;;;扫描数据库,将本图中所有的已经插入的块的名称,数量统计后,输出到指定文本文档,包含嵌套块
;;;遍历嵌套块,将所有块名组成表
(defun listblock (blkname / blklist en en1 name)
(setq blklist (append (list blkname) blklist))
(setq en (cdr (assoc -2 (tblsearch "block" blkname))))
(setq en1 (entget en))
(if (= "INSERT" (cdr (assoc 0 en1)))
(progn
(setq name (cdr (assoc 2 en1)))
(setq blklist (append (list (listblock name)) blklist))
)
)
(while (setq en (entnext en))
(setq en1 (entget en))
(if (= "INSERT" (cdr (assoc 0 en1)))
(progn
(setq name (cdr (assoc 2 en1)))
(setq blklist (append (list (listblock name)) blklist))
)
)
)
(reverse blklist)
)
;;;将块名表变换成(块名 . 数量)的点对表
(defun list-sort (blist / bname qty newitem firstbname)
(Setq qty 1)
(setq bname (car blist))
(while (= (type bname) 'LIST)
(setq bname (car blist))
(if (= (type bname) 'LIST)
(setq blist bname)
)
) ;取出块表中的第一项
(if (assoc bname cons-name) ;判断取出的块名,在块名表中是否有旧项
(progn
(setq qty (1+ (cdr (assoc bname cons-name))))
(setq newitem (cons bname qty)
cons-name (subst newitem (assoc bname cons-name) cons-name)
)
)
(progn
(setq firstbname (cons bname qty))
(Setq cons-name (append (list firstbname) cons-name))
)
)
(while (setq blist (cdr blist)) ;去除块表的第一项,留下剩下的表项
(setq bname (car blist))
(Setq cons-name (list-sort blist))
)
cons-name
) 其他的代码怎么不让上传,说是有不合法参数? 其他的代码怎么不让上传,说是有不合法参数?多了一个,请版主删除多余的,谢谢。 本帖最后由 kozmosovia 于 2016-5-17 14:17 编辑
遍历可能比较耗时,而且嵌套层次不好判断和控制,尤其是多重插入或列阵时,具体个数可能性很多。
个人建议比较暴力的方法是:
1)给图块定义添加一个特殊的记号,如文字内容
2)循环将图块全部分解到底
3)统计特殊符号的个数 关注一下! 嵌套块可以利用递归统计,应该也不算难吧,关于块递归的代码论坛里应该有很多。
页:
[1]
2