明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1973|回复: 12

[提问] CAD按块属性统计

[复制链接]
发表于 2024-5-12 18:12:49 | 显示全部楼层 |阅读模式
本帖最后由 359321852 于 2024-5-12 18:24 编辑

请问各位老大,如何实现通过块属性里的编号统计数量

比如想统计按块属性里编号统计数量


获取不到编号的属性值,情高手们帮忙修改一下,
  1. (defun c:tjk1(/ en mpl ss n nn m xx pt0 mpl_new i);统计块数量的源码
  2.     (if *table-zg (princ)(setq *table-zg (* 3 (getvar "DIMSCALE"))));设置模式全局变量,初始默认值=1
  3.     (setq ss (ssget '((0 . "INSERT"))))
  4.     (or ss (setq ss (ssadd)))
  5.     (setq n 0 nn (sslength ss) mpl '())
  6.     (while (< n nn)
  7.         (setq en (ssname ss n) data (entget en))
  8.         (setq n (1+ n))
  9.         (setq name (cdr (assoc 2 data)))
  10.         (setq number (cdr (assoc 41 data))) ; 获取块的属性编号
  11.         (setq xx (assoc number mpl)) ; 检查属性编号是否已存在于 mpl 列表中
  12.         (if xx
  13.             (setq m (cadr xx) m (1+ m) mpl (subst (list number name m) xx mpl)) ; 属性编号存在,则更新数量
  14.             (setq mpl (append (list (list number name 1)) mpl)) ; 属性编号不存在,则添加新项
  15.         )
  16.     )
  17.     (if mpl
  18.         (progn
  19.             (setq i 0)
  20.             (setq mpl_new '())
  21.             (foreach x mpl
  22.                 (setq mpl_new (append (list(cons (setq i (1+ i)) x)) mpl_new))              
  23.             )               
  24.             (setq mpl_new (append (list (list "序号" "属性编号" "图块名称" "数量")) (reverse mpl_new)))            
  25.             (initget 0 "S")
  26.             (if (/= (setq pt0 (getpoint (strcat "\n当前文字高度:" (rtos *table-zg)))) nil)
  27.                 (progn
  28.                     (while (= pt0 "S")
  29.                         (setq str (strcat "\n(建议高度:"(rtos (* 3 (getvar "DIMSCALE"))) ")" "  请输表格文字高度:"  "<" (rtos *table-zg) ">"))
  30.                         (if (setq temp (getint str))(setq *table-zg temp));采用新输入值
  31.                         (initget 0 "S")
  32.                         (setq pt0 (getpoint (strcat "\n当前文字高度:" (rtos *table-zg))))
  33.                         (if (null pt0)(exit))
  34.                     )               
  35.                     (if (and pt0 *table-zg)
  36.                         (TableLst2Table mpl_new pt0 *table-zg)                     
  37.                     )
  38.                 )
  39.             )
  40.             (princ "/nNothing!")      
  41.         )
  42.         (princ)
  43.     )
  44. )

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-5-18 01:29:52 | 显示全部楼层
  1. (defun c:TTT ()
  2.   (setq ss (ssget '((0 . "INSERT")))) ; 选择所有的块
  3.   (if ss
  4.     (progn
  5.       (setq count-alist nil)  ; 初始化编号计数的关联列表
  6.       (setq sslen (sslength ss))
  7.       (setq i 0)
  8.       (while (< i sslen)
  9.         (setq ent (ssname ss i))
  10.         (setq entdata (entget ent))
  11.         (setq attribs (entnext ent))
  12.         ;(princ "\nBlock Reference Data:\n")
  13.         ;(princ (cdr (assoc 2 entdata))) ;; 显示块名
  14.         (while (= (cdr (assoc 0 (entget attribs))) "ATTRIB")
  15.           (setq attribdata (entget attribs))
  16.           (if (= (cdr (assoc 2 attribdata)) "编号")
  17.             (progn
  18.               (setq num (cdr (assoc 1 attribdata)))
  19.               (setq existing-pair (assoc num count-alist))
  20.               (if existing-pair
  21.                 (setq count-alist (subst (cons num (+ 1 (cdr existing-pair)))
  22.                                          existing-pair
  23.                                          count-alist))
  24.                 (setq count-alist (cons (cons num 1) count-alist))
  25.               )
  26.             )
  27.           )
  28.           (setq attribs (entnext attribs))
  29.         )
  30.         (setq i (+ i 1))
  31.       )
  32.       (princ "\nCount of '编号' Values:\n")
  33.       (foreach item count-alist
  34.         (princ (strcat (car item) ": " (itoa (cdr item)) "\n"))) ; 输出所有编号及其出现次数
  35.     )
  36.     (princ "\nNo attribute blocks selected.")
  37.   )
  38.   (princ)
  39. )


回复 支持 1 反对 0

使用道具 举报

发表于 2024-5-13 15:51:35 | 显示全部楼层
tranque 发表于 2024-5-13 09:42
数据提取命令吗,这个命令的交互步骤和过程太繁琐

第一次做完可以保存DXE文件,后面再执行,选DXE,就是无脑下一步直接出结果
回复 支持 1 反对 0

使用道具 举报

发表于 2024-5-12 18:33:47 | 显示全部楼层
dataextraction命令就行,不需要写程序
发表于 2024-5-12 19:35:44 | 显示全部楼层

发表于 2024-5-13 09:42:03 | 显示全部楼层
kozmosovia 发表于 2024-5-12 18:33
dataextraction命令就行,不需要写程序

数据提取命令吗,这个命令的交互步骤和过程太繁琐
发表于 2024-5-13 17:40:28 | 显示全部楼层
kozmosovia 发表于 2024-5-13 15:51
第一次做完可以保存DXE文件,后面再执行,选DXE,就是无脑下一步直接出结果

学习了
发表于 2024-5-14 00:53:32 | 显示全部楼层
如果你知道hashmap这个数据结构,就知道这个多简单了.
因为lisp没有map,因此可以lisp调用html的js,js里面有map,然后调用它
发表于 2024-5-14 14:27:43 | 显示全部楼层
数据提取使用好了,非常方便,不过限值也很大就是,全公司只有你一个人会
发表于 2024-5-15 12:12:16 | 显示全部楼层
发个dwg我看看
 楼主| 发表于 2024-5-16 10:04:43 | 显示全部楼层

http://bbs.mjtd.com/forum.php?mod=attachment&aid=MTM0NTAzfDZkMWFiMjdhNTUwYzY3MGQ2MzMwNGI3NGM3MDZjYjNhfDE3MzI1MjcyNDU%3D&request=yes&_f=.dwg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 17:34 , Processed in 0.174216 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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