在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.015.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及以上版本。

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