明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1915|回复: 4

统计块

[复制链接]
发表于 2009-1-17 16:01:00 | 显示全部楼层 |阅读模式

转载的:

(prompt "\n命令为: BC ,用法如下: ")
(prompt "\n先选择要统计的块,然后选择要统计的区域,结束后按F2显示出统计数量.")
;;;*****************************
;;;highflybird  2007-2-8 kunming
;;;主程序-----------------------
;;;*****************************
(defun C:BC (/ ss1 ss2 NamLst BList str1 str2 f)
  (graphscr)
  (prompt "\n请选择要统计的块:")
  (if (setq ss1 (ssget '((-4 . "<OR")
    (0 . "INSERT")
    (0 . "TCH_BLOCK_INSERT")
    (-4 . "OR>"))))
    (progn
      (prompt "\n请选择要统计的区域:")
      (if (setq ss2 (ssget '((-4 . "<OR")
        (0 . "INSERT")
        (0 . "TCH_BLOCK_INSERT")
        (-4 . "OR>"))))
        (progn
          (setq NamLst (Name-list ss1))
          (setq BList (Name-count ss2 NamLst))
   (setq f (open "blksum.txt" "w"))
          (princ "\n块名" f)
          (princ (setq str1 "...............................") f)
          (princ "数量" f)
          (princ "\n---------------------------------------" f)
          (foreach n BList
            (princ "\n" f)
            (princ (setq str2 (car n)) f)
     (princ (substr str1 (1+ (strlen str2)) (strlen str1)) f)
     (princ "...." f)
     (princ (cdr n) f)
          )
   (close f)                                ;关闭文件
   (startapp "notepad" "blksum.txt")        ;启动记事本打开数据
 )
 (princ "\n所选区域没有要统计的块!")
      )
    )
    (princ "\n你没有选择要统计的块!")
  )
  (princ)
)
;;;图块名列表函数
(defun Name-list (ss1 / i l EName EList BName NList)
  (setq l (sslength ss1))            
  (setq i 0 NList nil)                ;计数器归零,表清空
  (while (< i l)                      ;对要统计的选择集循环
    (setq EName (ssname ss1 i))       ;取得图元名
    (setq EList (entget EName))       ;取得图元表
    (setq BName (cdr (assoc 2 EList)));取得图块名
    (if (not (member BName NList))    ;如果表中没有图块名
      (setq NList (cons BName NList)) ;添加到表中
    )
    (setq i (1+ i))                   ;计数器加1
  )
  NList
)
;;;计数函数
(defun Name-count (ss2 NamLst / blist i l ename elist bname oldcount newcount)
  (setq Blist (mapcar '(lambda (x) (cons x 0)) NamLst))       ;计数器归零
  (setq i 0 l (sslength ss2))
  (while (< i l)                                              ;对选择区域循环
    (setq ename (ssname ss2 i))                               ;取得图元名
    (setq elist (entget ename))                               ;取得图元表
    (setq bname (cdr (assoc 2 elist)))                        ;取得图块名
    (if (member bname NamLst)                                 ;如果是要统计的块
      (setq OldCount (assoc bname Blist)                      ;取得块旧数量
     NewCount (1+ (cdr OldCount))                      ;+1得到新数量
     Blist (subst (cons bname NewCount) OldCount Blist);替代原数量
      )      
    )                                                        
    (setq i (1+ i))                                           ;计数器加1
  )
  BList
)

发表于 2009-3-8 19:14:00 | 显示全部楼层
强啊!!
发表于 2009-3-9 09:18:00 | 显示全部楼层
很想知道这句(setq ss1 (ssget '((-4 . "<OR")
    (0 . "INSERT")
    (0 . "TCH_BLOCK_INSERT")
    (-4 . "OR>"))))
中的两个-4是什么意思,正在查组码表……
发表于 2015-4-13 13:01:48 | 显示全部楼层
本帖最后由 哇哦大叔 于 2015-4-13 13:33 编辑

非常好,感谢分享。
就是选择区域的时候光标不是十字光标,有点不习惯
发表于 2019-7-6 15:47:07 | 显示全部楼层
好用,如果不是单独出个txt,而是直接在命令栏就好了,还得去关闭它
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-10-24 04:07 , Processed in 0.184206 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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