闲时
  • 首页
  • 归档
  • 搜索
  • 夜间模式
    ©2020-2026  我的技术记录 主题 OneBlog

    我的技术闲时记录

    搜索
    标签
    # AIGC # SSL # CDN # 学习 # 土力学 # 脚本 # 备份 # 数据库 # 群晖 # FFmpeg

    CAD快速统计文字数量

    2026.05.25 / 1.3 k 阅读 / 0 评论 / 5302 字

    CAD快速统计文字数量

    阅读 1.3 k 评论 0 发表于2026.05.25

    在CAD图纸中,经常需要统计不同文字内容的出现次数,比如房间名称、设备编号、材料标注等。当文字种类达到十几种甚至几十种时,手动计数或重复使用“快速选择”会非常低效。本文将介绍几种实用的统计方法,并重点给出一种能够在图纸内自动生成统计表格的完整解决方案。


    一、常见统计方法对比

    方法 核心操作 适用场景 是否支持一键分类
    TEXTCOUNT / TC 直接输入命令,全选文字 只需文字总数 否
    查找和替换 (FIND) 输入具体文字串,查看匹配数 统计某一种特定文字 否(每次一种)
    快速选择 (QSELECT) 按“内容”特性筛选指定文字 文字种类较少时 否(需重复操作)
    数据提取 + Excel 将文字内容导出为CSV/XLS,用透视表统计 任意数量种类,一次性导出 是
    专用LISP插件 运行程序,自动生成表格 频繁需要统计并出表 是

    当文字种类达到16种以上时,数据提取法和LISP插件法是最佳选择。


    二、方法一:数据提取 + Excel(无需插件)

    该方法利用AutoCAD自带的“数据提取”功能,将所有文字内容导出到外部表格,再借助Excel的数据透视表完成分类计数。

    操作步骤

    1. 启动数据提取
      命令行输入 DATAEXTRACTION(或 DX),回车。

    2. 创建新提取
      选择“创建新提取”,为.dxe文件命名并保存。

    3. 选择对象

      • 选择“在当前图形中选择对象”
      • 点击“选择对象”,框选整个图形或按Ctrl+A全选
      • 确认后进入下一步。
    4. 选择对象类型
      在对象类型列表中只勾选“文字”和“多行文字”。(若需统计块内文字或属性文字,可额外勾选相应类型)

    5. 选择特性
      只勾选“内容”(TextString / Content),其余特性(如图层、位置)可不选,以保持数据纯净。

    6. 优化输出
      推荐不合并相同行,保留每条原始记录,以便后续在Excel中灵活透视。

    7. 输出到外部文件
      选择输出格式为XLS或CSV,指定保存路径,完成导出。

    Excel中统计

    • 打开导出的文件,选中“内容”列。
    • 插入“数据透视表”,将“内容”拖入“行”区域和“值”区域(计数)。
    • 立即得到所有不同文字及其出现次数,无论多少种,整个过程只需几分钟。

    三、方法二:专用LISP插件(生成图纸内表格)

    如果需要直接在CAD图形中生成表格(TABLE对象),并且希望以后反复快速运行,可以加载以下AutoLISP程序。该程序会:

    • 让用户框选(或全选)文字对象
    • 统计每种文字内容的出现次数
    • 按内容升序排序
    • 在当前图形中创建一个两列表格:“文字内容”和“数量”

    完整LISP代码

    将以下代码保存为 TextCountTable.lsp(编码ANSI):

    ;;; ============================================================
    ;;; 文字内容统计并生成 AutoCAD 表格 (TABLE)
    ;;; 命令: TCT
    ;;; 功能: 统计所选文字对象(单行/多行)的内容,生成统计表格
    ;;; ============================================================
    
    (defun c:TCT (/ ss i ent txt lst pair item pt rowCnt tblObj
                   colWidth1 colWidth2 rowHeight tblHeight)
      (princ "\n请选择需要统计的文字对象 (可框选或直接回车选择全部): ")
      
      ;; 选择文字对象(支持单行文字、多行文字)
      (setq ss (ssget '((0 . "*TEXT"))))
      (if (null ss)
        (progn
          (alert "没有选中任何文字对象,程序退出。")
          (exit)
        )
      )
    
      ;; 统计文字内容
      (setq i 0)
      (while (< i (sslength ss))
        (setq ent (entget (ssname ss i))
              txt (cdr (assoc 1 ent))
        )
        ;; 忽略空字符串
        (if (and txt (/= txt ""))
          (if (setq pair (assoc txt lst))
            (setq lst (subst (cons txt (1+ (cdr pair))) pair lst))
            (setq lst (cons (cons txt 1) lst))
          )
        )
        (setq i (1+ i))
      )
    
      ;; 检查统计结果
      (if (null lst)
        (progn
          (alert "所选文字中没有有效内容。")
          (exit)
        )
      )
    
      ;; 按文字内容排序 (升序)
      (setq lst (vl-sort lst '(lambda (a b) (< (car a) (car b)))))
    
      ;; 显示简要统计信息
      (princ (strcat "\n共统计 " (itoa (sslength ss)) " 个文字对象,"
                     (itoa (length lst)) " 种不同内容。\n"))
      
      ;; 准备表格参数
      (setq rowCnt   (1+ (length lst))  ; 总行数 = 表头 + 数据行
            colWidth1 30.0               ; 第一列宽度 (内容列)
            colWidth2 15.0               ; 第二列宽度 (数量列)
            rowHeight 8.0                ; 行高
            tblHeight (* rowHeight rowCnt)
      )
      
      ;; 获取插入点(表格左上角)
      (initget 1)  ; 不允许空输入
      (setq pt (getpoint "\n请指定表格左上角插入点: "))
      
      ;; 创建 AutoCAD 表格对象 (ActiveX)
      (setq acadObj (vlax-get-acad-object)
            doc     (vla-get-ActiveDocument acadObj)
            mSpace  (vla-get-ModelSpace doc)
      )
      
      ;; 创建表格: (vla-addtable 空间 插入点 行数 列数 行高 列宽)
      (setq tblObj (vla-addtable mSpace (vlax-3d-point pt) rowCnt 2 rowHeight colWidth1))
      
      ;; 设置第二列宽度
      (vla-SetColumnWidth tblObj 1 colWidth2)
      
      ;; 设置表头样式 (加粗、居中)
      (vla-SetTextHeight tblObj 1 5.0)   ; 表头文字高度
      (vla-SetTextHeight tblObj 2 4.0)   ; 数据行文字高度
      
      (vla-SetText tblObj 0 0 "文字内容")
      (vla-SetText tblObj 0 1 "数量")
      
      ;; 填充数据行
      (setq i 0)  ; 数据行索引从1开始 (0是表头)
      (foreach item lst
        (setq content (car item)
              count   (cdr item)
              rowIdx  (1+ i)
        )
        (vla-SetText tblObj rowIdx 0 content)
        (vla-SetText tblObj rowIdx 1 (itoa count))
        (setq i (1+ i))
      )
      
      (vla-Update tblObj)
      (princ "\n✅ 统计表格已生成。")
      (princ)
    )
    
    (princ "\n文字统计表格程序已加载,请输入 TCT 运行。")
    (princ)
    

    加载与运行

    1. 保存文件:将上述代码保存为 TextCountTable.lsp。
    2. 加载程序:在CAD命令行输入 AP(或 APPLOAD),找到并加载该文件。
    3. 执行命令:输入 TCT 并按回车。
    4. 操作提示:
      • 框选需要统计的文字对象(也可直接按回车选择全部对象)。
      • 在图纸中点击一个位置作为表格左上角插入点。
    5. 结果:CAD自动生成一个表格,列出每种文字内容及其数量,按内容升序排列。

    表格效果示例

    文字内容 数量
    卧室 12
    客厅 8
    卫生间 6
    厨房 5
    ... ...

    参数自定义

    • 列宽调整:修改代码中的 colWidth1(内容列)和 colWidth2(数量列),例如 30.0 和 15.0。
    • 行高调整:修改 rowHeight。
    • 排序方式:若想按数量降序排列,将排序语句替换为:
      (setq lst (vl-sort lst '(lambda (a b) (> (cdr a) (cdr b)))))
    • 全图自动统计(无需手动选择):将选择语句改为:
      (setq ss (ssget "_X" '((0 . "*TEXT"))))

    四、两种方案的选择建议

    需求场景 推荐方案
    一次性统计,希望导出数据到Excel做进一步分析 数据提取 + Excel
    经常需要统计文字数量,且希望结果以表格形式保留在图纸中 LISP插件(TCT命令)
    图纸中包含大量块内文字或属性文字 数据提取法更灵活(可勾选多种对象类型)
    追求最快操作、无需安装任何外部文件 数据提取法(原生功能)

    五、总结

    • 当文字种类达到16种以上时,避免使用重复的“快速选择”或手动计数。
    • AutoCAD自带的数据提取功能可以一次性将所有文字内容导出到Excel,配合透视表快速分类统计。
    • 若希望在图纸内部直接生成统计表格,加载提供的LISP程序,输入TCT命令,即可一键完成统计与制表。
    • 两种方法均无需额外付费插件,适用于AutoCAD 2010及以上版本。

    通过上述方法,设计师可以轻松应对大量文字标注的统计工作,提升图纸信息管理的效率。


    由 AI 生成

    本文著作权归作者 [ HORiZON ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    AIGC
    CAD
    — END —
    首页归档
    由 Typecho 驱动  已运行 2175 天
    豫ICP备2022003436号-1
    OneBlog   0.173 s
    深色
    OneBlog主题  Load 0.173 sCopyRight © 2026 HORiZON. All Rights Reserved

    开源不易,请尊重作者版权,保留基本的版权信息。