钢筋下料单自动识别
概述
从 PDF 图纸中自动提取钢筋表(配筋表),解析每条钢筋的编号、规格、数量、 加工尺寸,按直径×形状×中间段长度分组生成工地标准下料单。
何时使用
- 用户上传 PDF 图纸并要求"统计钢筋""下料单""钢筋表""配筋表"
- 用户要求按长度和数量统计钢筋
- 用户提及"单钩""双钩""直段"等钢筋加工术语
工作流程
1. 确认输入文件
确认用户提供的文件路径。支持格式:
- PDF(有文字层):直接提取文字,精度最高
- PDF(扫描件):需 OCR,精度较低(告知用户限制)
- 图片:需 OCR,目前未内置(告知用户转 PDF 后再处理)
- DWG:需先转 PDF/DXF(aspose-cad 转 DXF 会丢失文字,不推荐)
2. 运行识别脚本
使用 scripts/rebar_tool.py,命令格式:
python scripts/rebar_tool.py "<pdf路径>" --output "<输出目录>" --title "<标题>"
脚本自动完成 5 个步骤:
- 提取 PDF 文字(PyMuPDF)
- 解析钢筋表(自动检测构件编号、钢筋编号、规格、加工尺寸)
- 验证数据(根数×单根长=总长、形状判断、异常检测)
- 生成下料单分组(直径×形状×中间段长度)
- 输出 Excel + HTML + JSON
3. 检查验证结果
脚本运行结束后会输出验证结果:
✓ 全部验证通过→ 数据可信,直接展示✗ N 个错误→ 需逐条检查,可能是 PDF 格式差异导致解析偏差
4. 展示结果
用 present_files 展示三个输出文件:
<标题>_下料单.html— 打印友好,只有"长度"和"数量"两列<标题>_钢筋下料单.xlsx— 3 个 sheet:下料单/钢筋明细/下料单汇总<标题>_钢筋数据.json— 原始数据 + 验证结果
核心规则
形状判断(关键)
| 加工尺寸段数 | 形状 | 示例 |
|:---:|:---:|---|
| 0 段 / 1 段 | 直段 | 3600 |
| 2 段 | 单钩 | 40+2105(一端有弯钩) |
| 3 段 | 双钩 | 40+2230+40(两端都有弯钩) |
| 4+ 段 | 其他 | 复杂形状 |
中间段长度提取(参考用)
- 直段:加工尺寸本身
- 单钩/双钩:取
max(加工尺寸段)(弯钩值通常为 40,远小于中间段) - 此值仅用于钢筋明细表展示,不作为下料单的长度
下料单格式
- 按
Φ{直径}{形状}分组(如 Φ8单钩、Φ8双钩、Φ8直段) - 每组内按下料长度排序
- 只显示「长度(mm)」和「数量(根)」两列
- 「长度」= 下料长 = 单根长 − 弯钩扣减(按下方差异化规则)
- 每组末尾显示小计,最后显示总计
下料长度计算规则(差异化弯钩扣减)
下料长 = 单根长 − 弯钩扣减,扣减值按直径区分:
| 直径 | 直段 | 单钩扣减 | 双钩扣减 | |:----:|:----:|--------:|--------:| | Φ8 | 不减 | 63 | 126 | | Φ10 | 不减 | 79 | 158 | | Φ12 | 不减 | 95 | 190 | | Φ14 | 不减 | 111 | 222 | | Φ16 | 不减 | 127 | 254 |
扩展直径(18/20/22/25)也已内置,按
单钩=直径×8−1、双钩=单钩×2自动计算。 如果用户在对话中指定了不同的扣减规则,按用户当次指定的规则执行。默认使用此差异化规则表。
依赖
脚本依赖以下 Python 包(需安装到 WorkBuddy 托管的 Python 环境):
PyMuPDF(fitz)— PDF 文字提取openpyxl— Excel 生成
安装命令(请用本机 WorkBuddy 托管的 Python 运行,python 即指代该解释器):
python -m pip install PyMuPDF openpyxl
常见问题处理
PDF 没有文字层(扫描件)
脚本会输出 未识别到任何钢筋数据。告知用户需要先用 OCR 工具(如 Adobe Acrobat)将扫描件转为可搜索 PDF,或提供截图进行手动 OCR 识别。
验证有错误
检查 JSON 中的 verification.errors:
count × single_len ≠ total_len→ 可能是规格行和数字行混合导致解析偏移- 形状判断错误 → 检查
process_parts是否正确分离
构件编号未识别
脚本支持自动检测 3F-X、4F-X、5#-X、A9-X 等格式。如果图纸使用其他编号格式,在 COMPONENT_PATTERNS 中添加正则。
钢筋编号未识别
支持 1#钢筋、1a#钢筋、JQJ、DD1a、XH1、1a 等格式。如遇新格式,在 REBAR_ID_PATTERNS 中添加正则。
输出文件说明
Excel(3 个 sheet)
| Sheet | 内容 | |-------|------| | 钢筋下料单 | 按 Φ{直径}{形状} 分组,只有长度+数量两列 | | 钢筋明细 | 全部钢筋记录,含构件/编号/规格/加工尺寸/单根长/下料长/总长/总重/形状/中间段长 | | 下料单汇总 | 分组列表,含涉及构件 |
JSON 结构
{
"title": "标题",
"total_records": 313,
"total_count": 3734,
"total_weight_kg": 4025.96,
"cutting_list_items": 70,
"verification": { "errors": [], "warnings": [], "passed": true },
"rebars": [
{
"component": "3F-1",
"rebar_id": "1#钢筋",
"diameter": 8,
"count": 19,
"process_parts": [40, 2380, 40],
"single_len": 2506,
"cutting_len": 2380,
"total_len": 47622,
"total_weight": 18.80,
"shape": "双钩",
"mid_len": 2380
}
],
"cutting_list": [
{ "diameter": 8, "shape": "双钩", "cutting_len": 2380, "count": 54 }
]
}
Scan to join WeChat group