明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1403|回复: 13

[提问] 如何统计图块

[复制链接]
发表于 2016-5-15 20:02 | 显示全部楼层 |阅读模式
请教各位大神,如何实现材料统计,常规统计块已经知道,但是有些块是嵌套在另外的块中间的,这个块就统计不上了,有什么办法可以统计到嵌套块的?或者提供一种材料统计的思路的?
发表于 2016-5-16 10:35 | 显示全部楼层
1. 可以遍历块获得块中块。2. 可以炸掉块。 都要注意嵌套块的层数。
 楼主| 发表于 2016-5-16 15:34 | 显示全部楼层
mikewolf2k 发表于 2016-5-16 10:35
1. 可以遍历块获得块中块。2. 可以炸掉块。 都要注意嵌套块的层数。

能否提示,如何才能知道嵌套块的层数??
发表于 2016-5-16 16:39 | 显示全部楼层
Summer__sir 发表于 2016-5-16 15:34
能否提示,如何才能知道嵌套块的层数??

事先不知道,要一层层的遍历下去才知道。另外用户应该知道,要项目统一规定执行。
发表于 2016-5-17 13:03 | 显示全部楼层
本帖最后由 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
    )
发表于 2016-5-17 13:22 | 显示全部楼层
其他的代码怎么不让上传,说是有不合法参数?
发表于 2016-5-17 13:30 | 显示全部楼层
其他的代码怎么不让上传,说是有不合法参数?多了一个,请版主删除多余的,谢谢。
发表于 2016-5-17 14:15 | 显示全部楼层
本帖最后由 kozmosovia 于 2016-5-17 14:17 编辑

遍历可能比较耗时,而且嵌套层次不好判断和控制,尤其是多重插入或列阵时,具体个数可能性很多。
个人建议比较暴力的方法是:
1)给图块定义添加一个特殊的记号,如文字内容
2)循环将图块全部分解到底
3)统计特殊符号的个数
发表于 2016-5-17 15:14 | 显示全部楼层
关注一下!
发表于 2016-5-17 15:31 | 显示全部楼层
嵌套块可以利用递归统计,应该也不算难吧,关于块递归的代码论坛里应该有很多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 00:21 , Processed in 0.195148 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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