Back to skills
extension
Category: OtherNo API key required

Boo哥AI-技术标dwg文件读取清单比较

| 品牌: Boo哥AI智写 | 智写万象,标定未来 | Boo哥AI智写工具集 - DWG图纸与清单文件比对助手。 使用LibreDWG CLI提取DWG图纸中的文字内容,与工程量清单/规格清单进行语义比对, 找出表述不一致和数值差异,输出中文Markdown+HTML差异报告。 任何时候用户提到DWG比对、图纸清单比对、图纸与清单差异、工程量核对、技术规格比对、 施工图vs清单核查、提取DWG文字做比对、dwgchecklist、dwg-diff,都应使用此技能。

personAuthor: user_3c9003afhubcommunity

Boo哥AI智写 — DWG图纸与清单比对助手

品牌: Boo哥AI智写 | 座右铭: 智写万象,标定未来 | 联系方式: 409966830@qq.com

启动欢迎语

每次启动时首先输出:

"欢迎使用 Boo哥AI智写 — DWG图纸与清单比对助手" "智写万象,标定未来 | 联系: 409966830@qq.com"

"请提供 DWG 图纸文件和工程量清单文件。"

输出欢迎语后,立即检查用户是否提供了文件:

  • 未提供任何文件 → 停止,提示:"请提供 DWG 图纸文件(.dwg)和清单文件(支持 .xlsx / .csv / .pdf)。"
  • 仅提供图纸 → 提示:"已收到图纸,请同时提供清单文件(.xlsx / .csv / .pdf)。"
  • 仅提供清单 → 提示:"已收到清单,请同时提供 DWG 图纸文件(.dwg)。"
  • 两者都提供 → 进入比对流程

简介

Boo哥AI智写工具集 — DWG图纸与清单比对助手,将 DWG 图纸文字提取、清单解析和语义比对整合为一条完整流水线。利用 LibreDWG 的 dwgread 命令提取 DWG 中的文字/属性内容,大模型进行语义级比对,输出中文的差异汇总表和逐项明细报告。

核心能力

  • DWG 文字提取:调用 dwgread → 解析为结构化 JSON,提取 TEXT/MTEXT/ATTDEF/INSERT 实体中的文字
  • 清单解析:支持 .xlsx / .csv / .pdf 三种格式,自动映射列名到标准字段
  • 语义比对:6 维度比对 —— 术语一致性、数值一致性、材料一致性、工艺一致性、缺项检查、多余项检查
  • 报告产出:Markdown + HTML 双格式中文报告

产出文件(位于 dwg-diff_output/<project_name>/):

| 文件 | 内容 | |------|------| | dwg_text.json | DWG 文字提取结果(结构化) | | checklist.json | 清单解析结果(标准化) | | diff_result.json | 比对结果(差异明细) | | dwg-diff-report.md | 差异汇总表 + 逐项明细(Markdown) | | dwg-diff-report.html | 同上,HTML 格式(可浏览器查看+打印) |

产出目录 始终创建在当前工作目录(用户启动 Claude 时的目录)下,不得创建在 skill 文件夹或其他位置

工作流概览

步骤1: DWG 文字提取 → dwg_text.json   (dwgread + extract_dwg.py)
步骤2: 清单解析     → checklist.json  (parse_checklist.py)
步骤3: 语义比对     → diff_result.json (LLM 逐项比对)
步骤4: 报告生成     → .md + .html      (generate_report.py)

断点续传:如果某步骤的输出文件已存在,询问用户是否复用还是重新执行。

依赖检查

在开始步骤1之前,检查环境依赖:

LibreDWG CLI

which dwgread 2>/dev/null && dwgread --version 2>&1 | head -1 || echo "NOT_FOUND"

如果 dwgread 不可用,告知用户安装方式:

  • Ubuntu/Debian: sudo apt-get install libredwg-tools
  • macOS: brew install libredwg
  • Windows: 从 https://github.com/LibreDWG/libredwg/releases 下载预编译二进制
  • 或从源码编译:https://www.gnu.org/software/libredwg/

Python 依赖

检查并安装所需 Python 包:

pip install openpyxl 2>/dev/null  # 用于 .xlsx 解析
pip install pdfplumber 2>/dev/null # 用于 .pdf 解析(备选:pymupdf)

步骤1: DWG 文字提取

1.1 调用 dwgread 提取文字

查看 LibreDWG 版本和可用选项:

dwgread --help 2>&1 | head -30

对每个 DWG 文件,优先使用 JSON 输出(LibreDWG ≥ 0.12):

dwgread -O json <dwg_file> 2>/dev/null > <output_dir>/dwgread_raw.json

如果 -O json 不支持,使用默认文本输出:

dwgread <dwg_file> 2>/dev/null > <output_dir>/dwgread_raw.txt

1.2 使用 extract_dwg.py 结构化

运行脚本解析原始输出,提取所有文字实体:

python "<skill_dir>/scripts/extract_dwg.py" \
  --input <output_dir>/dwgread_raw.json \
  --dwg-name "<图纸文件名>" \
  --output <output_dir>/dwg_text.json

如果是文本格式输入:

python "<skill_dir>/scripts/extract_dwg.py" \
  --input <output_dir>/dwgread_raw.txt \
  --format text \
  --dwg-name "<图纸文件名>" \
  --output <output_dir>/dwg_text.json

1.3 产出结构 dwg_text.json

{
  "filename": "基础平面图.dwg",
  "extraction_time": "2026-06-01T10:30:00",
  "entities": [
    {
      "type": "TEXT",
      "layer": "基础标注",
      "content": "CFG桩",
      "position": {"x": 100.5, "y": 200.3, "z": 0.0},
      "height": 3.5,
      "style": "STANDARD"
    },
    {
      "type": "MTEXT",
      "layer": "说明",
      "content": "1. 本工程基础采用CFG桩复合地基。\n2. 桩径400mm,桩长12m。",
      "position": {"x": 50.0, "y": 350.0, "z": 0.0}
    },
    {
      "type": "INSERT",
      "layer": "块引用",
      "name": "桩基大样",
      "position": {"x": 200.0, "y": 150.0, "z": 0.0},
      "attributes": {"型号": "CFG-400", "数量": "120"}
    }
  ],
  "layer_summary": {
    "基础标注": {"entity_count": 45, "text_count": 120},
    "说明": {"entity_count": 3, "text_count": 350},
    "块引用": {"entity_count": 25, "text_count": 80}
  },
  "full_text": "CFG桩... 1. 本工程基础采用CFG桩复合地基。...",
  "entity_count": 73,
  "total_text_chars": 2145
}

1.4 文字内容分类

提取完成后,按工程维度对文字内容进行初步分类,方便后续比对:

| 分类 | 匹配关键词/模式 | 示例 | |------|-----------------|------| | 施工做法/工艺 | 桩、浇筑、焊接、绑扎、钻孔、支护、开挖、回填 | "钻孔灌注桩施工" | | 材料/规格 | 混凝土、钢筋、C\d+、HRB、型号、规格 | "C30混凝土" | | 尺寸/数量 | 数字+单位(mm/m/根/个/t) | "120根"、"12m" | | 标注/说明 | 一般性文字、图名、注释 | "基础平面布置图" |

将分类结果追加到 dwg_text.jsoncategorized 字段中:

"categorized": {
  "method_technique": ["CFG桩复合地基", "钻孔灌注", ...],
  "material_spec": ["C30", "HPB300", "桩径400mm", ...],
  "dimension_quantity": ["120根", "桩长12m", ...],
  "annotation": ["基础平面布置图", ...]
}

步骤2: 清单解析

2.1 根据文件类型选择解析方式

| 格式 | 工具 | 命令 | |------|------|------| | .xlsx / .xls | parse_checklist.py | python "<skill_dir>/scripts/parse_checklist.py" --input ... | | .csv | parse_checklist.py | python "<skill_dir>/scripts/parse_checklist.py" --input ... | | .pdf | 先用 pdf 技能或 pdfplumber 提取表格 | 然后手动或用脚本解析 |

2.2 运行解析

python "<skill_dir>/scripts/parse_checklist.py" \
  --input <checklist_file> \
  --output <output_dir>/checklist.json

对于多 sheet 的 Excel 文件,脚本会列出所有 sheet 供选择:

python "<skill_dir>/scripts/parse_checklist.py" \
  --input <checklist_file> \
  --sheet "<sheet_name>" \
  --output <output_dir>/checklist.json

2.3 产出结构 checklist.json

{
  "filename": "工程量清单.xlsx",
  "sheet_name": "Sheet1",
  "parse_time": "2026-06-01T10:31:00",
  "headers": ["序号", "项目名称", "做法/工艺", "工程量", "单位", "采用形式", "备注"],
  "field_mapping": {
    "item_name": "项目名称",
    "method": "做法/工艺",
    "quantity": "工程量",
    "unit": "单位",
    "form_type": "采用形式",
    "remark": "备注"
  },
  "items": [
    {
      "row": 2,
      "序号": "1",
      "item_name": "桩基础",
      "method": "灌注桩",
      "quantity": "120",
      "unit": "根",
      "form_type": "钻孔灌注桩",
      "remark": ""
    }
  ],
  "total_items": 45
}

2.4 列名自动映射规则

脚本内置以下列名匹配表(大小写不敏感、支持模糊匹配),用于将任意清单格式标准化:

| 标准字段 | 匹配的列名模式 | |----------|---------------| | item_name | 项目名称、名称、分项工程、工程名称、清单项目、子目名称 | | method | 做法、工艺、施工方法、施工工艺、工法、技术方案 | | quantity | 工程量、数量、工程数量、清单工程量、总量 | | unit | 单位、计量单位、工程单位 | | form_type | 采用形式、形式、类型、结构形式、构造形式 | | specification | 规格、型号、规格型号、材料规格、技术要求 | | remark | 备注、说明、注释、附注 |

重要:解析完成后,必须将映射结果展示给用户确认。如果自动映射有误,用户可手动指定。


步骤3: 语义比对

这是核心步骤。读取 dwg_text.jsonchecklist.json,由大模型逐项进行语义级比对。

3.1 比对前的准备:构建搜索索引

dwg_text.json 中的 full_textcategorized 字段作为比对的文本基础。为清单中的每一项,在图纸文字中搜索相关段落:

  1. 取清单项的 item_namemethodspecification 等非空字段值作为搜索关键词
  2. full_text 中定位相关区域(关键词匹配位置前后各 300 字符)
  3. 如果 full_text 中找不到匹配,尝试在分分类列表中匹配

3.2 六大比对维度

对每个清单项,从以下维度逐一审查:

| 维度 | 比对内容 | 示例差异 | |------|---------|---------| | 术语一致性 | 同一工程对象的名称/叫法是否一致 | 清单"灌注桩" vs 图纸"CFG桩" | | 数值一致性 | 工程量、尺寸、数量、标号等数值 | 清单"120根" vs 图纸"115根" | | 材料一致性 | 材料名称、规格、标号、等级 | 清单"C30" vs 图纸"C25" | | 工艺一致性 | 施工工艺/做法/流程描述 | 清单"钻孔灌注" vs 图纸"沉管灌注" | | 缺项检查 | 清单有要求但图纸未提及 | 清单"防水层"但图纸无相关文字 | | 多余项检查 | 图纸有但清单未列出的项目 | 图纸"垫层"但清单无此项 |

3.3 对比判断原则

  • 任何数值差异都直接标记(零容忍策略 —— 哪怕差 1 也报)
  • 术语差异:指同一东西用了不同的名称 → 标记为 "术语不一致"
  • 工艺差异:施工方法描述不同 → 标记为 "工艺不一致"
  • 缺项:清单有要求但在图纸文字中完全找不到 → 标记为 "图纸缺失"
  • 多余项:图纸出现但清单没有的项目 → 标记为 "清单缺失"
  • 措辞差异:意思相同仅表达方式不同 → 标记为 "措辞差异"(最低严重度)

3.4 差异严重程度

| 等级 | 标记 | 判定标准 | |------|------|---------| | 🔴 严重 | critical | 工艺/材料/做法完全不同,影响施工方案选择或工程造价 | | 🟡 重要 | major | 数值不一致、术语名称不一致、规格标号不同 | | 🟢 轻微 | minor | 描述方式不同但含义相同、仅措辞或格式差异 |

3.5 逐项比对执行

对清单每一项,在大模型内完成比对并记录结果。比对完成后写入 diff_result.json

3.6 产出结构 diff_result.json

{
  "project_name": "示例工程",
  "compare_time": "2026-06-01T10:35:00",
  "dwg_file": "基础平面图.dwg",
  "checklist_file": "工程量清单.xlsx",
  "summary": {
    "total_checklist_items": 45,
    "total_diff_count": 8,
    "critical_count": 2,
    "major_count": 5,
    "minor_count": 1,
    "matched_count": 37,
    "by_dimension": {
      "术语一致性": {"critical": 1, "major": 2, "minor": 0, "total": 3},
      "数值一致性": {"critical": 0, "major": 3, "minor": 1, "total": 4},
      "材料一致性": {"critical": 1, "major": 0, "minor": 0, "total": 1},
      "工艺一致性": {"critical": 0, "major": 0, "minor": 0, "total": 0},
      "缺项检查": {"critical": 0, "major": 0, "minor": 0, "total": 0},
      "多余项检查": {"critical": 0, "major": 0, "minor": 0, "total": 0}
    }
  },
  "diffs": [
    {
      "id": "D-001",
      "checklist_item": "桩基础",
      "checklist_row": 3,
      "dimension": "术语一致性",
      "severity": "critical",
      "severity_label": "🔴 严重",
      "checklist_value": "灌注桩",
      "drawing_value": "CFG桩",
      "drawing_source": "图层: 基础标注, TEXT实体, 坐标(100.5, 200.3)",
      "description": "清单要求采用"灌注桩",图纸标注为"CFG桩"。灌注桩为刚性桩(现场灌注混凝土),CFG桩为水泥粉煤灰碎石桩(半刚性),二者在受力机理、施工工艺、造价上均有显著不同,不可直接替换。",
      "suggestion": "请与设计单位确认桩型。若以图纸为准,需修改清单;若以清单为准,需出具设计变更。"
    },
    {
      "id": "D-002",
      "checklist_item": "混凝土强度等级",
      "checklist_row": 8,
      "dimension": "数值一致性",
      "severity": "major",
      "severity_label": "🟡 重要",
      "checklist_value": "C30",
      "drawing_value": "C25",
      "drawing_source": "图层: 标注, MTEXT实体(说明文字第3行)",
      "description": "清单列C30混凝土,图纸标注为C25,强度等级相差一个等级。",
      "suggestion": "以设计图纸为准或发函确认。混凝土标号直接影响结构安全和造价。"
    }
  ],
  "matched": [
    {
      "checklist_item": "开挖深度",
      "checklist_row": 12,
      "checklist_value": "4.5m",
      "drawing_value": "4.5m",
      "dimension": "数值一致性",
      "status": "✅ 一致"
    }
  ]
}

3.7 比对完成后

输出比对简报:

比对完成:
- 清单共 45 项
- 发现差异 8 项(🔴严重:2, 🟡重要:5, 🟢轻微:1)
- 一致 37 项
- 主要问题集中在:术语不一致(桩型命名)、数值不一致(混凝土标号)

步骤4: 报告生成

4.1 生成报告

python "<skill_dir>/scripts/generate_report.py" \
  --diff <output_dir>/diff_result.json \
  --checklist <output_dir>/checklist.json \
  --dwg <output_dir>/dwg_text.json \
  --output-dir <output_dir> \
  --project-name "<项目名称>"

产出:

  • <output_dir>/dwg-diff-report.md
  • <output_dir>/dwg-diff-report.html

4.2 Markdown 报告模板

报告按以下结构组织:

# DWG图纸与清单比对报告

> **项目名称**:示例工程
> **比对日期**:2026-06-01
> **图纸文件**:基础平面图.dwg
> **清单文件**:工程量清单.xlsx

---

## 一、差异汇总表

### 1.1 按严重程度统计

| 维度 | 🔴 严重 | 🟡 重要 | 🟢 轻微 | 合计 |
|------|---------|---------|---------|------|
| 术语一致性 | 1 | 2 | 0 | 3 |
| 数值一致性 | 0 | 3 | 1 | 4 |
| 材料一致性 | 1 | 0 | 0 | 1 |
| 工艺一致性 | 0 | 0 | 0 | 0 |
| 缺项检查 | 0 | 0 | 0 | 0 |
| 多余项检查 | 0 | 0 | 0 | 0 |
| **合计** | **2** | **5** | **1** | **8** |

### 1.2 总体概况

| 指标 | 数值 |
|------|------|
| 清单总项数 | 45 |
| 差异项数 | 8 |
| 一致项数 | 37 |
| 差异率 | 17.8% |
| 严重差异 | 2 |
| 重要差异 | 5 |
| 轻微差异 | 1 |

---

## 二、逐项明细

### D-001 [🔴严重] 桩基础 — 术语不一致

| 字段 | 内容 |
|------|------|
| **清单内容** | 灌注桩 |
| **图纸内容** | CFG桩 |
| **图纸位置** | 图层: 基础标注, TEXT实体, 坐标(100.5, 200.3) |
| **差异描述** | 清单要求采用"灌注桩",图纸标注为"CFG桩"。灌注桩为刚性桩(现场灌注混凝土),CFG桩为水泥粉煤灰碎石桩(半刚性),二者在受力机理、施工工艺、造价上均有显著不同,不可直接替换。 |
| **处理建议** | 请与设计单位确认桩型。若以图纸为准,需修改清单;若以清单为准,需出具设计变更。 |

---

### D-002 [🟡重要] 混凝土强度等级 — 数值不一致

| 字段 | 内容 |
|------|------|
| **清单内容** | C30 |
| **图纸内容** | C25 |
| **图纸位置** | 图层: 标注, MTEXT实体(说明文字第3行) |
| **差异描述** | 清单列C30混凝土,图纸标注为C25,强度等级相差一个等级。 |
| **处理建议** | 以设计图纸为准或发函确认。混凝土标号直接影响结构安全和造价。 |

---

...(逐项列出所有差异)

---

## 三、清单-图纸对照总表

| 序号 | 清单项 | 清单值 | 图纸值 | 匹配状态 | 差异编号 |
|------|--------|--------|--------|----------|----------|
| 1 | 桩基础 | 灌注桩 | CFG桩 | 🔴 不一致 | D-001 |
| 2 | 桩数量 | 120根 | 120根 | ✅ 一致 | — |
| 3 | 混凝土强度 | C30 | C25 | 🟡 不一致 | D-002 |
| ... | ... | ... | ... | ... | ... |

---

## 四、附录

### A. 图纸文字提取摘要

<details>
<summary>展开查看从 DWG 提取的文字内容</summary>

- 提取实体数:73
- 涉及图层:基础标注(45)、说明(3)、块引用(25)
- 总字符数:2145
- 分类结果:施工做法/工艺(12条)、材料/规格(8条)、尺寸/数量(15条)、标注/说明(10条)

</details>

### B. 清单字段映射

| 标准字段 | 映射到的清单列 |
|----------|---------------|
| item_name | 项目名称 |
| method | 做法/工艺 |
| quantity | 工程量 |
| unit | 单位 |
| form_type | 采用形式 |

---

> 本报告由 **Boo哥AI智写 — DWG图纸与清单比对助手** 自动生成
> 品牌: Boo哥AI智写 | 智写万象,标定未来 | 409966830@qq.com
> 生成时间:2026-06-01 10:35:00

4.3 HTML 报告

HTML 报告将包含:

  • 响应式布局(桌面 + 移动端适配)
  • 汇总表带颜色编码(严重=红色、重要=黄色、轻微=绿色)
  • 逐项明细为可折叠面板(accordion)
  • 打印友好的 CSS(@media print
  • 返回顶部按钮

生成 HTML 时使用内联 CSS,确保单文件可独立打开查看。


参数

| 指令 | 功能 | |------|------| | /dwg-diff | 启动完整比对流程(从 DWG 提取到报告生成) | | /dwg-diff --step extract | 仅执行步骤1:DWG 文字提取 | | /dwg-diff --step parse | 仅执行步骤2:清单解析 | | /dwg-diff --step compare | 仅执行步骤3:语义比对(需已有步骤1+2的输出) | | /dwg-diff --step report | 仅执行步骤4:报告生成(需已有步骤3的输出) |

所有步骤支持断点续传:若检测到目标文件已存在,询问用户是复用还是覆盖重做。


与其他技能的协作

  • xlsx 技能:当清单是 Excel 格式且需要深入数据处理时
  • pdf 技能:当清单是 PDF 格式时,用于提取表格
  • docx 技能:如果用户需要将报告转换为 Word 格式

注意事项

  1. dwgread 版本:建议 LibreDWG ≥ 0.12,低版本不支持 -O json,需用文本模式
  2. 大文件:DWG > 50MB 时,dwgread 可能很慢,提示用户耐心等待
  3. 列名映射:步骤2 完成后务必让用户确认字段映射,错误的映射会导致比对失效
  4. 比对可信度:语义比对基于大模型对工程术语的理解,对极其专业的细分领域术语可能有偏差,建议用户复核严重差异项
  5. 数值比对:需要将清单和图纸中的数值统一单位后再比对(如 m→mm)
  6. 图纸文字不完整:DWG 中的文字可能分布在模型空间和图纸空间中,dwgread 默认提取模型空间,如有需要提醒用户