Summer__sir 发表于 2016-5-15 20:02:16

如何统计图块

请教各位大神,如何实现材料统计,常规统计块已经知道,但是有些块是嵌套在另外的块中间的,这个块就统计不上了,有什么办法可以统计到嵌套块的?或者提供一种材料统计的思路的?

mikewolf2k 发表于 2016-5-16 10:35:52

1. 可以遍历块获得块中块。2. 可以炸掉块。 都要注意嵌套块的层数。

Summer__sir 发表于 2016-5-16 15:34:44

mikewolf2k 发表于 2016-5-16 10:35 static/image/common/back.gif
1. 可以遍历块获得块中块。2. 可以炸掉块。 都要注意嵌套块的层数。

能否提示,如何才能知道嵌套块的层数??

mikewolf2k 发表于 2016-5-16 16:39:33

Summer__sir 发表于 2016-5-16 15:34 static/image/common/back.gif
能否提示,如何才能知道嵌套块的层数??

事先不知道,要一层层的遍历下去才知道。另外用户应该知道,要项目统一规定执行。

chg 发表于 2016-5-17 13:03:32

本帖最后由 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
    )

chg 发表于 2016-5-17 13:22:20

其他的代码怎么不让上传,说是有不合法参数?

chg 发表于 2016-5-17 13:30:45

其他的代码怎么不让上传,说是有不合法参数?多了一个,请版主删除多余的,谢谢。

kozmosovia 发表于 2016-5-17 14:15:37

本帖最后由 kozmosovia 于 2016-5-17 14:17 编辑

遍历可能比较耗时,而且嵌套层次不好判断和控制,尤其是多重插入或列阵时,具体个数可能性很多。
个人建议比较暴力的方法是:
1)给图块定义添加一个特殊的记号,如文字内容
2)循环将图块全部分解到底
3)统计特殊符号的个数

panliang9 发表于 2016-5-17 15:14:34

关注一下!

springwillow 发表于 2016-5-17 15:31:52

嵌套块可以利用递归统计,应该也不算难吧,关于块递归的代码论坛里应该有很多。
页: [1] 2
查看完整版本: 如何统计图块