通信工程设计图绘制
概述
本技能通过Python ezdxf库生成DXF格式工程图纸,输出可直接用AutoCAD、中望CAD、浩辰CAD等软件打开编辑的正式CAD文件。支持A0-A4图幅,内置标准图框标题栏、14+专业图层、60+种通信工程符号(含基于真实设计图提炼的杆路/光交/室分器件符号库)。
两条主线(本技能 = 出图 + 前段融合校核,原 telecom-survey-data-fusion 技能已并入):
| 主线 | 干什么 | 章节 |
|---|---|---|
| ① 前段:三源融合校核 | 设计院 DWG/报审表 → 现场勘察草图 → 奥维等地图数据,三源互证、算式勾稽、量差分析、出复测清单 | 见下方「查勘资料三源数据融合与校核」 |
| ② 后段:成套出图 | 按定案口径生成 DXF/PNG,存疑项进 校核 层,设计值/实测值并列标注 |
见「工作流程」第1~5步 |
铁律:资料到手先做三源互证再出图,别拿到一份资料就画。
技能规范已用用户提供的三份真实 DWG(秦淮区宽带接入新建工程、六合区补盲工程、67小视研发中心室分)实际解码数据校准:经 ODA File Converter 转 DXF(带 audit 修复)后提取出真实图号、图层体系与图例符号,对齐中讯邮电咨询设计院/联通设计图惯例(标题栏字段、图号格式、图层命名、图例)。新图仍可用 compliance_check.py <图.dwg> --dump 持续反哺(见末节“真实 DWG 反哺工作流”)。
L1 输入归一化 与 L2 设计决策引擎(2026-09-29 新增)
> 目标:把技能从「我告诉它画什么,它画得规范」推进到「我给它一堆查勘资料,它自己走完设计流程」。
> 本节是这条进化路线的前两层地基。详细数据结构见 references/ir_schema.md。
为什么要加这两层
此前技能默认「JSON spec 已由人写好」——中间缺了「资料 → 理解 → 定案」的整段推理。
L1 补输入归一化,L2 补设计定案与算式校验。
| 层 | 干什么 | 落地产物 |
|---|---|---|
| L1 输入归一化 | 三类异构资料 → 统一 IR(带来源与置信度) | ir_schema.py、ingest_all.py |
| L2 勾稽内核 | 算式勾稽:长度构成 / 材料 / 容量 | quantity_calc.py + rules/ |
核心设计:一切字段都是「带证据值」
IR 里没有裸值。每个数都带 source(来源类型)+ sid(具体文件)+ confidence(置信度)+ raw(原文),
冲突值并存于 candidates 而不覆盖主值。这是「出口可追溯」与「置信度门控」唯一的技术基础。
来源类型与默认可信度:设计院 DWG 0.95 / 报审表 0.90 / 预算表 0.88 / 现网查询单 0.90 /
需求文档 0.75 / 查勘报告 0.70 / 草图 0.45 / 地图数据 0.80 / 现场复测 0.95 / 规则推导 1.00。
快速上手(四步)
# ① 资料包 → IR(自动分类清点 + ovkml/xlsx 结构化解析 + 合并录入补丁)
python scripts/ingest_all.py <资料包目录> -o project.ir.json --patch manual.patch.json
# --list 只清点不产 IR;三源不齐时退出码 2 并给出补齐清单
# ② 校验 IR(结构 + 来源可追溯性)
python scripts/ir_schema.py --validate project.ir.json
# ③ 算式勾稽(长度构成 / 材料 / 容量)
python scripts/quantity_calc.py project.ir.json --rules rules/ -o checked.ir.json
# ④ 三源融合与冲突裁决(实体对齐 + 逐项比对 + 采信写回 + 待现场核实清单)
python scripts/fuse.py checked.ir.json -o fused.ir.json --report 融合报告.txt
# 有 high 级冲突时退出码 3(须现场核实/设计澄清后才可进 L2 定案)
# ⑤ 再用其结果构建 spec 出图(原工作流程第 3~5 步不变)
录入补丁:非结构化内容的正规入口
技能刻意不对手绘草图做硬编码图像识别——手写字迹千变万化,识别精度有硬天花板。
正确处理是:由人工或 LLM 读图后,写成 manual.patch.json(支持简写,_default 声明一次来源即可)。
这把不确定性交给了「看得见的环节」,而不是藏在脚本里。
规则库(rules/)
设计规则从提示词里抠出来,落成可人工审阅的 YAML(规则与推理分离):
| 文件 | 内容 | 实证状态 |
|---|---|---|
rules/quantity_rules.yaml |
长度构成公式、反向勾稽、定额映射(TXL3-194/TXL4-015/TXL5-074/TXL6-005/TXL7-044/TXL6-082)、量差速查 5 项、容差 | ✅ 案例实证 |
rules/fusion_rules.yaml |
三源交叉校验矩阵 12 项(C01~C12) + 采信优先级 + 冲突处置手册 + 对齐/容差规则(原为 SKILL.md 人工填表,现程序化) | ✅ 矩阵来自本技能既有规范 |
引擎只在已确认规则内推理,超出范围一律进「未决项」,不硬猜。
YAML 中 verified: false 的条目(如坐标容差 20m 的取值)引擎仍执行,但会在报告【六】里单列「待专业确认」。
勾稽校验(L2 内核,已实测)
quantity_calc.py 做三类校验:
- A 正向:缆段「长度构成」各分项之和 == 段定案长度(含单位换算,如 百米条→m)
- B 材料:材料表光缆长度 == Σ 缆段定案长度
- C 成端容量:成端芯数 = 缆芯数 × 端数(一条光缆 2 个端头;144 芯双端成端 = 288 芯,正常)。端数非整数倍或 >2 端才判冲突
永腾广场案例实测(tests/golden/yongteng/):
【A】109.00 m + 97.00 m + 0.85 百米条(=85.00 m) = 291.00 m == 定案 291.00 m ✓
【B】材料表 291.00 m == 缆段定案 291.00 m ✓
【C】成端 288 芯 = 缆芯 144 芯 × 2 端 → ✓ 通过(双端成端)
C 项尤其有价值——它能自动发现草案里挂着待设计澄清的专业错误。
三源铁律的程序化
- 资料不齐 →
ingest_all.py退出码 2,并列出缺哪个源(不是"尽力而为"地编一个数) - 无来源的字段 → 校验直接判错误(不是警告)
- 未实测要素 → 进
issues并注明,不出比例图
三源融合与冲突裁决(fuse.py,已落地)
把本文档后面的「三源交叉校验矩阵」从人工填表落成字段级比对 + 规则化裁决,分三层:
| 层 | 做什么 | 关键点 |
|---|---|---|
| ① 对齐 | 跨源实体对齐 | 名称归一化完全相等 → 同一实体;包含关系(…光交 vs …光交东)→ 只记「疑似同一」,绝不自动合并;名称不同但坐标邻近 → 亦记「疑似同一」 |
| ② 裁决 | 按 fusion_rules.yaml 逐项比对(C01~C12) |
各项 preference 硬覆盖全局采信顺序(如 C05 坐标「以实测为准」——即便地图源在全局可信度里更低也按该项规则采信);不一致值写入 candidates,不覆盖主值 |
| ③ 产出 | 融合 IR + 报告 + 待核实清单 | 冲突写回 issues(幂等,重复运行不重复追加);报告【五】《待现场核实事项》表可直接随交付 |
永腾广场实测(ingest → quantity_calc → fuse 全链路):
实体对齐 2 组(机房门 / 光交:design_dwg ↔ map_data 同名归簇)
C05 坐标 一致 2 项 C07 勾稽未决 1 项
C03 段长 冲突 ⚠ 采信 291(design_dwg);另有 600(需求阶段估算) → 现场复测(以定案为准)
C03 段长 冲突 ! 采信 291;另有 600(需求估算 0.6km) → 列复测清单
退出码 3(存在 high 级冲突,须现场核实/设计澄清后才可进 L2 定案)
融合的三条硬规矩(铁律的代码化):
- 「采信」只是按权威度选出的主值,不代表该值正确 —— 报告里明写这一句,防止被误读成"系统认定如此"
- 单源数据不得直接进图(杆号须两源一致);无现网资源查询单则一切利旧结论标「待确认」
- 仅手绘草图支撑的数据项定级 low 并注明「只提示量差、不作核减依据」
设计决策引擎(design_engine.py,L2 核心,已落地)
IR(已融合) + 规则库 → design.json + 定案报告。它与"AI 拍脑袋定案"的区别全在三重门控:
| 门控 | 触发条件 | 行为 |
|---|---|---|
| ① 融合未清 | IR 存在 high 级未决冲突 | 拒绝输出定案(退出码 3)——先核实、再定案;有 high 冲突还敢定案,等于替设计签字 |
| ② 无规则不定案 | 某项找不到规则依据 | 进 undecided,并说明缺哪一类规则;绝不取默认值凑一个数 |
| ③ 草案规则不自动定案 | 命中 verified: false 的规则 |
只进 suggestions(建议+须人工确认);--allow-draft 才升级为定案,且仍标 rule_verified: false |
输出三块:decisions(有已验证规则依据,带 rule_id/basis/alternatives)、suggestions、undecided。
IR 里已有的设计定案值登记为 「沿用设计定案」(is_carryover),与"引擎推断"明确区分。
python scripts/design_engine.py fused.ir.json -o design.json --report 定案报告.txt
python scripts/design_engine.py fused.ir.json --allow-draft --strict # 允许草案规则;未决项即报错
永腾广场实测:冲突清理后 → 引擎输出 4 项定案(长度构成 291m ✓、材料勾稽 291m ✓、成端 288 = 缆芯 144 × 2 端 ✓、沿用定案 G.652D 144芯)+ 2 项未决(缆型规则缺、设备选型规则缺)。门控①另有专项演练:注入 high 冲突时拒绝定案(退出码 3)。行为准则不变:不替设计签字,但把该补的东西列清楚。
尚未落地(下一步)
rules/routing.yaml(路由优选)、rules/odn_design.yaml(分光级联与配纤)、rules/terminal.yaml(成端跳纤)- L3 布局求解与成套编排、L4 回读自校与知识库、L5 置信度门控与回归样本集(
tests/golden/已具雏形)
工作流程
第1步:确定图纸类型和输入来源
六类图纸及典型触发场景:
- 光缆线路图 — "画一段光缆路由图"、"光缆敷设设计图"
- 基站设备图 — "基站机房布置图"、"5G宏站设备图"
- 室分系统图 — "室分天线分布图"、"室内覆盖设计图"
- 通信管道图 — "通信管道平面图"、"管孔断面图"
- 传输组网图 — "传输网络拓扑图"、"OTN组网图";子类·传输设备安装工程(OTN):"机房设备平面布置图"、"设备面板图"、"ODF面板图"、"通信系统图及布线计划表"、"电源系统及布线计划图"、"供货界面图"、"OTN设备安装图"(机房内整套设备落地图纸集,常为多图打包 DWG)
- 电源系统图 — "基站电源系统图"、"交直流供电图";子类·动力配套更新改造(核心机房):"机房动力配套改造"、"UPS/蓄电池更换"、"开关电源系统图"、"割接方案"(多局点×多层机房打包设计,属改造类非新建类)
- 宽带覆盖图 — "宽带接入设计图"、"ODN网络图"、"光纤到户设计图"
输入来源处理:
- 设计院原始 DWG → scripts/dwg2dxf.py(调 ODA 转 DXF)→ scripts/read_dwg.py(提取图签/图层/块库/文字/折线几何);要渲染肉眼比对用 scripts/render_dxf.py。别只要 PDF——PDF 提不出图层与块库
- 地图数据文件(ovkml/kml/gpx) → scripts/parse_ovkml.py,算分段长/真方位/累积里程/曲折系数,并判定是否手绘折线
- 自然语言 → 直接解析描述,提取设备/路由/参数信息
- 参数表格(Excel/CSV) → 逐行读取设备清单,转为elements
- 勘察草图/照片 → 调用 image_understanding 工具分析图片,提取设备位置、线缆走向、标注文字(分块放大逐块核读,手写数字最易误读)
- 勘察报告(文字) → 解析报告描述,推算坐标和布局
- 标注地图/卫星图 → 调用 image_understanding 分析打点位置和线路走向
> 上述 DWG/地图数据两类输入,都要先过下面「查勘资料三源数据融合与校核」的交叉校验,再来构建 spec。
第2步:加载制图模式参考
根据图纸类型,读取 references/drawing_patterns.md 中对应章节,获取该类型图纸的布局要点和示例JSON骨架。
同时读取 references/element_reference.md 查阅可用的元素类型及其参数。
宽带接入工程、室分工程、动力配套更新改造(核心机房)绘制前,重点参考 references/drawing_patterns.md 末尾「真实图纸规范」章节——含真实图号格式(Z2026SJ0425(NJ)S-GL-001(1/5))、真实图层体系、真实图例符号、图纸组成;其中动力配套更新改造子类(参照南京联通 2026 一期/二期真实 DWG)记录:多局点×多层机房打包形态、113 图层体系、TN-S 联合接地、南京 7 度抗震、UPS/蓄电池/开关电源/列头柜/ATS/空调 改造内容与监理三源定位。
传输设备安装工程(OTN)子类(参照 2026 南京移动·中通服咨询设计研究院华为 OptiX OSN 9800 真实 DWG)记录:16 张图构成(GSTY 通用图 + TX 工程图)、设备平面/设备面板槽位/通信系统(Oi 编号)/布线计划表/电源系统/接地/供货界面 各图要点、图名图号 Δy 恒定 1422 的配对规律;逐图范式见 references/transmission_equipment_case.md。收到设备专业图时,先跑 scripts/inspect_drawing_set.py 出图纸清单(多图打包 DWG 的第一步),再用 scripts/title_block.py 下钻图框块读图签(标签/会签签名/设计资质编号都在块内),最后才决定是否逐张精读。⚠️ 该图集三个易踩点:图签字段在块定义内(顶层看不到,须下钻)、图面无比例(以「示意图」表达,属专业惯例)、文件名为 图纸.dwg 无专业关键字 —— 正是检查器需要兜底的地方。
第3步:构建JSON规范
根据用户需求和参考模式,构建JSON规范文件。核心结构:
{
"paper_size": "A3",
"auto_scale": true,
"signoff": true,
"auto_legend": true,
"title_block": {
"project_name": "项目名称",
"drawing_name": "图纸名称",
"drawing_number": "Z2026SJ0425(NJ)S-GL-001(1/5)",
"scale": "1:500",
"designer": "设计人",
"single_leader": "单项负责人",
"lead_person": "总负责人",
"dept_supervisor": "处主管",
"reviewer": "审核人",
"date": "2026.09",
"company": "中讯邮电咨询设计院有限公司"
},
"elements": [
{"type": "元素类型", "参数": "值", ...}
]
}
关键说明:
- auto_scale: 默认true,自动计算图纸比例。元素坐标与符号尺寸一律用真实工程尺寸(mm),脚本按图纸幅面自动适配;只有"图纸元素"(图框/标题栏/会签栏/图例框/字号)会按放大倍数 _G 放大,元素与表格不得再乘 _G(表格的行高/列宽同样是实尺 mm,如行高 600 = 0.6m)
- auto_fit: 默认false。设为true时,把所有元素整体平移到图框内容区(自动避开右下标题栏,底部预留 60 图纸mm),元素自身尺寸不变。适用于"只管按实尺画、不想换算落位"的场景;元素之间的相对位置保持不变
- signoff: 默认true,在左上角绘制会签栏(专业/姓名/日期)
- auto_legend: 默认false,设为true自动生成标准图例表(左上区域)
- paper_size: A0/A1/A2/A3/A4,默认A3
- elements: 元素数组,每个元素至少含 type 和位置参数
- 元素类型和参数详见 references/element_reference.md
- 标题栏位于右下角(对齐中讯邮电咨询设计院标准),字段:设 计 人 / 单项负责人 / 总负责人 / 处 主 管 / 审 核 人 / 单 位 / 比 例 / 日 期 / 图 号 + 项目名称 / 图纸名称(两行大栏,均需带标签)
- ⚠️ 真实图框实测:中讯出图里 项目名称/图纸名称 是“值单元格”(不带前缀标签),仅其余字段带前缀标签(且常加空格如“设 计 人”)。生成时务必同时给出标签与值。
- 图号建议格式(按设计院体系):
- 联通(中讯邮电咨询设计院):Z{年份}SJ{工程编号}({地区}){专业代码}-{序号}({张}/{总张}),如 Z2026SJ0425(NJ)S-GL-001(1/5);严禁使用 NJLT-2026-ODF-001 等地市自建非标图号
- 专业代码:S-GL=光缆(宽带)、S-YDW=无线网/室分;室分图号分张后缀 (张/总) 常省略(如 Z2025SJ0033(NJ)S-YDW-2067)
- 移动(中国移动通信集团设计院):{年}JSCT{工程号}-{子项}-{专业}-[{站点码}-]{张号},如 2026JSCT0004-005-WJ-001、2026JSCT0004-005-WJ-XXXXXXXX-011(专业代码 WJ=无线/室分;站点码段可省略)
- 中通服(中通服咨询设计研究院,承接移动等项目):双体系 —— GSTY-{序号}({张}/{总张})=通用/工艺图(全院复用,如 GSTY-001(1/3))、TX{工程号}-{张号}=本工程图(如 TX0046-001、TX0018-027);图号常直接写图面、不带“图号”标签
- 设计院体系判据(★运营商 ≠ 设计院):设计单位名最长匹配(中讯邮电 / 中国移动通信集团设计院 / 中通服)→ 图号特征反推(Z…SJ / JSCT / GSTY-·TX…-)→ 都不可用时回退联通并提示人工指定。同一运营商的项目可能由不同设计院出图(已在移动项目上双实例验证:移动院 JSCT 与中通服 GSTY/TX)
- title_block 字段(Python 键):project_name / drawing_name / drawing_number / scale / designer / single_leader / lead_person / dept_supervisor / reviewer / date / company。旧字段 approver(审定人)已并入 reviewer,保留兼容但不建议新用
第4步:生成DXF文件
将JSON规范保存到 .temp/ 目录,运行脚本:
python scripts/dxf_generator.py <spec.json> <output.dxf> [--preview <preview.png>]
- 脚本路径:
scripts/dxf_generator.py --preview: 可选,同时生成PNG预览图(需matplotlib)- 输出DXF文件保存到工作目录根作为最终交付物
- JSON spec和预览PNG等中间文件保存到
.temp/
第5步:验证和交付
- 检查脚本输出是否有WARN信息,修正后重新生成
- 运行
python scripts/compliance_check.py <输出.dxf>做规范性自检,确保标题栏/图号/图层合规(评分≥85 且无错误项) - DXF文件可用AutoCAD/中望CAD/浩辰CAD打开验证
- 如需PNG预览但matplotlib不可用,可跳过(DXF本身是最终交付物)
图层标准
脚本内置英文图层;如需对齐真实设计图(中讯/联通),可在 layer 参数中直接使用中文图层名(ezdxf自动创建):
| 图层名 | 颜色 | 用途 |
|---|---|---|
| BORDER | 白(7) | 图框外框 |
| TITLE_BLOCK | 白(7) | 标题栏 |
| SIGNOFF | 白(7) | 会签栏 |
| FIBER | 绿(3) | 光缆线路(新建缆线) |
| PIPE | 蓝(5) | 通信管道 |
| MANHOLE | 红(1) | 人手孔(手井图) |
| EQUIP | 青(4) | 通信设备(新增) |
| EQUIP_OLD | 灰(8) | 原有设备(虚线) |
| ANTENNA | 洋红(6) | 天线 |
| POWER | 黄(2) | 电源系统 |
| CABLE | 白(7) | 电缆/馈线 |
| ROAD | 灰(8) | 道路轮廓 |
| BUILDING | 白(7) | 建筑轮廓 |
| ANNOTATION | 白(7) | 标注文字 |
| DIMENSION | 白(7) | 尺寸标注 |
| TABLE | 白(7) | 表格/图例 |
| DASHED | 白(7) | 虚线(备用/保护) |
| CENTER | 白(7) | 中心线 |
| GRID | 灰(8) | 网格 |
> 真实图纸常用中文图层(可直接使用):新建缆线、原有缆线、ODN改造光缆、新建管道、原有管道、光交/光交接箱、手井图、地形地貌、图签1、工程界面图、面板图、覆盖范围、楼栋标注
制图标准(对齐中讯设计院规范)
- 图框: 左25mm装订边、其余10mm边距(A3/A4);外框粗线、内框细线
- 标题栏: 右下角,设计人/单项负责人/总负责人/处主管/审核人/单位/比例/日期/图号 + 项目名称/图纸名称
- 会签栏: 左上角装订边内侧,专业/姓名/日期三栏
- 图号格式:
Z2026SJ0425(NJ)S-GL-001(1/5)(专业代码:S-GL光缆/宽带、S-YDW无线网/室分;室分图号分张后缀(张/总)常省略,如Z2025SJ0033(NJ)S-YDW-2067) - 字号: 图纸名称5.0mm、图内文字3.0mm、标注2.5mm、小号2.0mm
- 尺寸单位: 管线长度以毫米(mm)为单位,设备尺寸以毫米(mm)为单位
- 设备状态: 新增=实线、原有=灰虚线、利旧=灰虚线、扩容=实线
- 机架表示: 统一采用双线表示正面
- 图例: auto_legend=true 自动生成标准图例表;图例惯例为"所有新建在图例基础上加粗"
图纸规范性检查(判断图是否规范)
技能内置 scripts/compliance_check.py,可自动判定一张 DXF/DWG 是否规范并给出整改清单。它是“画图格式”的守门员:生成后自检、收到他人图纸时把关。
用法
# 单图检查(DXF 直接读;DWG 需本机已装 ODA File Converter)
python scripts/compliance_check.py 某图.dxf
python scripts/compliance_check.py 某图.dwg --dump # 额外导出该图“真实格式”
python scripts/compliance_check.py 某图.dwg --carrier 移动 # 指定出图体系标准(默认自动识别;可选 联通|移动|中通服)
# 整套工程目录自查(检查路由/跳纤/面板/纤芯/界面/安全风险 等子图是否齐全)
python scripts/compliance_check.py ./工程目录 --json 报告.json
出图体系可配置(联通 / 移动 / 中通服)
不同设计院出图规范不同,检查器按设计院切换「核心字段 / 图号正则 / 图层提示」,默认按设计单位名最长匹配 → 图号特征反推自动识别:
| 中讯邮电咨询设计院(联通项目) | 中国移动通信集团设计院(移动项目) | 中通服咨询设计研究院(移动等项目) | |
|---|---|---|---|
| 图号 | Z2026SJ0425(NJ)S-GL-001(1/5) |
2026JSCT0004-005-WJ-001 |
GSTY-001(1/3) / TX0046-001 |
| 核心字段 | 项目名称/图纸名称/设计人/审核人/单位/比例/日期/图号 | 图号/建设单位/专业负责人/专业审核人/校审人/项目总负责人/出图日期/比例 | 图号/设计/审核/单位/比例/日期(图签块 A4图框-横 内标签)+资质字段 设计证书编号 |
| 识别特征 | 文本含“中讯邮电”、图号含 Z…SJ |
文本含“中国移动通信集团设计院”、图号含 JSCT |
文本含“中通服/咨询设计研究院”、图号含 GSTY-/TX…- |
| 签名形式 | 会签栏 | 会签栏 | 块形式插入(块名即人名,笔迹为矢量图形不可 OCR) |
> ⚠️ 运营商 ≠ 设计院:识别按设计院而非运营商(移动项目既可能是移动院、也可能是中通服出图)。特征名采用最长匹配,避免短串(如 咨询设计院)误吃长名(咨询设计研究院);全部不中时回退联通并在报告中提示需人工 --carrier。
> 图号格式非本体系标准时,仅给“待校准”警告/提示,不判 error、不计入不规范(避免把规范的他院图误判)。
判定维度
- 标题栏核心字段完整性(按出图体系字段集;核心字段缺失即判不规范)
- ⚠️ 必须下钻块定义:真实图签的标签常在图框块内部(如中通服A4图框-横),iter_texts已递归下钻;
用scripts/title_block.py可单独出「图签字段 + 会签签名 + 设计资质编号」报告。
- 中通服档案已回填core_fields(图号/设计/审核/单位/比例/日期),并设qualification_field: 设计证书编号。 - 图号格式:按体系正则匹配(中讯
Z{年}SJ…(张/总);移动院{年}JSCT…;中通服GSTY-…/TX…-);非本体系格式给“待校准”提示 - 图层命名:占位图层(图层N/LayerN/纯数字/含“自建”)占比 >50% 才判不规范;有含义命名图层不扣分(真实设计图含大量建筑/暖通/厂商自动图层,属正常)
- 比例与单位:比例标注
1:XXX或示意;设备/机房类专业允许仅以图名含「示意」表达(不强制数值比例);绘图单位必须为毫米(mm) - 图例/会签栏存在性
- 成套组成:宽带接入应含 路由/跳纤/面板/纤芯/界面/安全风险 六类子图;室分应含 点位路由/电源接地/安装 三类
判定阈值
- 评分 ≥85 且无错误项 → 规范
- 60–84 → 基本规范(有瑕疵)
- <60 → 不规范
真实 DWG 反哺工作流
收到一线设计院真实 DWG 时,本机装好 ODA File Converter 后运行 compliance_check.py <图.dwg> --dump,即可导出其标题栏字段值、图层清单、图号等“实际画图格式”,据此持续校准本技能的符号库与规范,使生成图无限贴近真实设计院出图习惯。
查勘资料三源数据融合与校核(出图前段)
设计图往往只反映"一个来源"的数据,现场实况、设计笔误、量差都藏不住。把三源资料互证起来,输出:①完善版图纸 ②量差与存疑项清单 ③现场复测清单。
三源及能力边界
| 源 | 载体 | 能定什么 | 定不了什么 |
|---|---|---|---|
| ① 查勘基础资料 | 设计院 DWG/PDF、报审表 XLSX、预算表、签证单、现网资源查询单 | 权威口径:图号、路由、杆档、缆型与长度构成、成端、工程量表、材料表、系统图、造价 | 现场是否已变、实际坐标、图上笔误 |
| ② 现场勘察草图 | 手绘照片 JPG | 现场实况:真实杆档、跨越位置、成端/接纤芯数、实物(托盘等)、手写 GPS | 无比例、字迹易误读、易漏项,不能当尺度 |
| ③ 地图软件数据文件 | 奥维 ovkml/kml/gpx、GPS 轨迹 | 点位真实坐标、真方位、直线距离、沿路里程 | 手绘折线≠实测轨迹;不含杆位/杆号/缆型/成端 |
铁律:三源不一致一律标"待核实",不得推定;手绘折线只能提示量差,不能作核减依据;不得替施工方填"确认数量为××"。
SOP(七步,方括号为卡口)
S0 立项登记 → 收三源资料(用清单逐项打勾) 〔三源不齐不得进 S1〕
↓
S1 基础资料解析:DWG→DXF → 图签/图层/块库/文字/几何 → 抄录工程量表、材料表、系统图
↓
S2 草图核读:分块放大 → 逐项抄录(杆档/跨越/成端/实物/GPS)→ 标记字迹不确定项
↓
S3 地图数据解析:ovkml → 分段长/真方位/累积里程/直线距离/曲折系数 → 判定是否实测轨迹
↓
S4 三源交叉校验(填下方矩阵) 〔有未处置冲突不得进 S5〕
├─ 全一致 → S5
└─ 有冲突 → 按冲突处置规则办,生成《待现场核实事项》
↓
S5 数据定案:路由、杆档、缆型与长度构成、成端、分光器、上联链路、工程量、材料表
↓
S6 出图:按定案口径出图 → 并列标注"设计值/实测值/差值" → 存疑项进校核层
↓
S7 自检归档 〔自检未过不得交付〕
三源交叉校验矩阵(核心)
> 本矩阵已程序化:rules/fusion_rules.yaml 的 checks:(C01~C12)即下表逐行,由 scripts/fuse.py 执行。
> 下表保留为人读版与规则审阅底稿——要改规则请改 YAML,不要改代码。
逐项填表,三源一致才可据实出图:
| 校验项 | 基础资料 | 草图 | 地图数据 | 采信规则 |
|---|---|---|---|---|
| 工程名称/图号 | ★权威 | 参考 | — | 以图签为准 |
| 路由走向 | ★ | ★ | 参考 | 三者一致;不一致取两两相符者 |
| 杆档长度 | ★ | ★ | 当时实测轨迹可校核 | 不一致→现场复测 |
| 杆号/杆位 | 可能有 | 可能有 | 无 | 无两源一致→图上不标杆号 |
| 光交/分纤箱坐标 | 图面标注 | 手写 | ★实测 | 以实测为准,设计值并列标注 |
| 缆型/芯数 | ★ | ★ | 无 | 以设计为准,草图核对 |
| 总长及构成 | ★(架空+进出局箱+预留) | ★ | 折线仅校核架空段 | 用算式勾稽 |
| 成端芯数 | ★ | ★ | 无 | 按端数关系判定(成端 = 缆芯 × 端数),非整数倍/超 2 端才退澄清 |
| 分光器/端口 | ★ | ★ | 无 | 以设计为准 |
| 实物数量(托盘等) | 可能漏 | ★ | 无 | 草图给线索,回查设计是否已含 |
| 上联路由/利旧资源 | ★ | 参考 | 无 | 需现网资源查询单二次确认 |
| 地形地貌/跨路 | 示意 | ★ | 影像 | 无实测不出比例图 |
算式勾稽是最有效的一招:把"总长"拆成 架空 = 各杆档之和 + 引上 + 进出局箱 + 预留。数字对上说明各方理解一致;对不上就知道差在哪一段。实证:架空98 = 引上6 + 3 + 25 + 43 + 21、108 = 98 + 进光交5 + 预留5。
反向勾稽同样有效:系统图反算跳纤条数(FC-FC 3m×2 = 两处内跳)、工程量表反算成端芯数(15芯 = 光交12 + 分纤箱3),再与材料表比对。
冲突处置规则
> 已映射为 rules/fusion_rules.yaml → conflict_playbook:(六个键:coord/length/name/unit/sketch_line/unknown),
> 由 fuse.py 自动附到每条冲突的「处置建议」上。
- 坐标冲突 → 以 GPS 实测为准,设计值并列标注"设计值/实测值/差值"
- 长度冲突 → 先算式勾稽;自洽一方暂可信;仍不符→列复测清单
- 名称冲突 → 名称差异("…光交" vs "…东光交")必须现场确认是否同一箱体,不得默认等同
- 量纲冲突(孤立数字)→ 用相邻数据反算;仍不确定标"待核实"
- 手绘折线 vs 设计量 → 只能提示"存在量差",结论须现场复测+设计会审确认
- 存疑项统一进醒目图层(约定
校核层),并出《待现场核实事项》表
解析要点与常见坑
- DWG 文件名含中文/全角冒号时先复制成 ASCII 名,ODA 更稳
- DXF 里层
0常承载绝大多数实体,别只看命名层 - 块库(BLOCKS)名就是符号库清单(如
SNG-原有移动杆、GJ-新建架空光交、SK-新建手孔),可直接反推对方图例体系 - 图签与工程量文字都在 TEXT/MTEXT/ATTRIB 里,逐条抄录即可还原原图的表
.ovkml是 KML 方言但含OvCoordType等自定义标签,别当标准 KML 硬解- 奥维折线若为
TrackStyle type=4说明是手绘,长度只能参考;点位若没写名称就无法与设计对应——导出时必须带名称 - ⚠ parse_ovkml 原点选择坑:路由起点必须取折线首顶点,不要默认取命名点/末点。若原点恰为折线末顶点,total 会含一段虚假引出段、曲折系数塌缩为 0(实测:机房→光交 折线107.61m/直线74.21m/曲折系数≈1.45)。修正法见
references/optical_cable_line_case.md第3节 - 设计图坐标可能是笔误(把分纤箱坐标抄成光交坐标):两个"设备坐标"相距远小于缆长,就是红牌
- 曲折系数 = 沿路里程/直线距离,可用于判断手绘折线是否离谱
输出物
- 完善版图纸集(DXF + PNG)
- 《待现场核实事项》清单(矛盾点/涉及数据/处理建议)
- 量差校核表(设计值/报审值/实测值/差值/结论)
- 三量勾稽校核表(合格证量 = 报审量 = 竣工资料用量,并与竣工工作量反算勾稽;监理只勾稽提异议,意见中禁写"确认数量为××")
- 《查勘资料三源数据融合与校核作业指导书》(可直接随交付;全文见
references/survey_fusion_workflow.md,含采集要求、校验矩阵、量差成因速查、丁家山25号实证案例)
坐标怎么进图
ovkml 经纬度 → 元素 mm 坐标、比例怎么定、存疑项图层约定、最小可跑示例,见 references/survey_data_fusion.md。
图上必须并列标注"设计值/实测值/差值",未实测要素(杆号、地形地貌)注明"未实测/以现场为准",示意部分写明"示意"。
环境约定
- Python 用托管环境:
C:\Users\<user>\.workbuddy\binaries\python\envs\default\Scripts\python.exe;依赖ezdxf openpyxl matplotlib pillow(只装该 venv) - DWG 转换依赖本机 ODA File Converter(
C:\Program Files\ODA\ODAFileConverter <ver>\ODAFileConverter.exe)。缺失时先问用户能否安装 - Windows 下 PowerShell 不回传子进程 stdout:把输出
Out-File落盘再 Read;命令行 JSON 参数会被 shell 吃掉引号,改成写 JSON 文件再传路径 - 同一个文件不要并行发多个 Edit(会互相覆盖丢改动),一次只改一处
已知缺陷与修订记录
- v1.2(2026-09-14)合并
telecom-survey-data-fusion:原独立技能「查勘资料三源数据融合与校核」整体并入本技能——5 个脚本(dwg2dxf.py/read_dwg.py/render_dxf.py/parse_ovkml.py/check_dxf.py)与 2 份参考(references/survey_fusion_workflow.md作业指导书全文、references/survey_data_fusion.md坐标进图桥接)已迁入,SKILL.md 新增「查勘资料三源数据融合与校核」章节。出图前段与后段从此在同一个技能内闭环,不再需要跨技能调用。 - v1.1(2026-09-14)修正
_s()误用:s_workshop_table/s_material_table/s_risk_table/s_panel_diagram/s_core_usage_table/s_legend六个表格函数曾对实尺尺寸也调用_s()(即乘图纸放大倍数_G);在auto_scale模式下_G可达数百倍,会生成上百米宽的巨型表格。同时修正s_dimension、s_north_arrow的标注偏移与grid_spacing。现全部改为实尺 mm,并实测校验:样张_G=478时 TABLE 图层尺寸 71.5m×31.5m(占图幅 0.36×0.23),正常。 - v1.1 新增
auto_fit:此前脚本对元素不做平移,内容必须由作者自己算好落在图框内(auto_scale只缩放图框,不动元素),实际很难一次对。现提供"auto_fit": true自动落位。 - v1.1 改进
_collect_coords:此前只取元素锚点,表格/面板/图例的单向延展被忽略,导致包围盒偏小、比例算不准。现按各类型的实际延展范围计入。 - 遗留:脚本不缩放元素(刻意如此,保证实尺语义),因此
auto_scale只决定图框尺寸;元素过大/过小请自行调整实尺尺寸或改paper_size。 - v1.3(2026-09-15)光缆线路实战反哺:新增
references/optical_cable_line_case.md(永腾广场主干补缆实证)——固化三源清单范式、量差速查5项、parse_ovkml 原点修正(取折线首顶点,避免曲折系数塌缩为0)、大DWG聚焦提取法、草图分块放大核读法、OLE.doc乱码处理、联通小包 JRW(NJ) 预算表结构与关键定额(TXL3-194/TXL4-015/TXL5-074/TXL6-005/TXL7-044/TXL6-082);SKILL.md 解析要点补「⚠ parse_ovkml 原点选择坑」、参考索引补该案例文件。 - v1.4(2026-09-29)新增 L1 输入归一化 + L2 勾稽内核:新增
scripts/ir_schema.py(IR 数据契约:一切字段为「带证据值」,含 source/sid/confidence/raw/candidates;校验器 + 三源齐备性检查)、
scripts/ingest_all.py(资料包 → IR:分类清点、ovkml/xlsx 结构化解析、录入补丁简写展开与合并)、
scripts/quantity_calc.py(算式勾稽:长度构成正向 / 材料表 / 成端容量三类)、
rules/quantity_rules.yaml(规则库首份:长度构成公式、反向勾稽、定额映射、量差速查、容差)、
references/ir_schema.md、tests/golden/yongteng/(永腾广场 golden sample 含录入补丁)。
实测结论:109m + 97m + 0.85百米条(=85m) = 291m 勾稽通过;材料表与缆段 291m 一致;
成端 288 芯 > 缆芯 144 芯被自动判为冲突(复现案例中的待澄清项)。
⚠️ 此判据已于 v1.9 更正:成端芯数 = 缆芯数 × 端数,144 芯缆双端成端 = 288 芯属正常,
当时的"冲突"是误判(详解见 v1.9 记录)。
设计原则:草图识别刻意不做硬编码,改由录入补丁承接;三源铁律程序化(资料不齐即退出码 2)。
下一步:fuse.py三源融合与冲突裁决、design_engine.py设计定案、L3 布局与成套编排。 -
v1.5(2026-09-29)新增传输设备专业(OTN)制图能力:新增
references/transmission_equipment_case.md(传输设备专业实战范式:16 张图清单、图号双体系 GSTY/TX、8 个专业信息核、图例体系、解析要点、监理三源定位、常见坑)、
scripts/inspect_drawing_set.py(图纸集清点:多图打包 DXF → 大字号文字 → 图名/图号「同列就近 + Δy 最小」配对 → 图纸清单 + 图框块引用数交叉校验 + 语义块库)。
drawing_patterns.md新增子类 5.1 传输设备安装工程(OTN)(12 类图 + 布局要点 + JSON 骨架)与末章真实规范小节;
element_reference.md新增「传输设备专业专用元素」16 个图元(rack_9800 / rack_panel / odf / cable_route 五类路由 / bus_bar / fiber_tray / anchor / cable_schedule 等)。
实测:本例 DWG(24MB DXF)经inspect_drawing_set.py清点,16 图号 16/16 全部配对成功,与A4图框-横块引用数 16 一致。
专业覆盖由「线路 + 电源」扩至「线路 + 电源 + 设备(传输)」。 -
v1.6(2026-09-29)出图体系档案扩至三套 + 检查器三处兜底:据委托信息确认「2026 南京 OTN 设备安装工程」=建设单位 中国移动(南京公司)+ 设计单位 中通服咨询设计研究院有限公司(此前误记为联通),据此:
compliance_check.py新增RE_DRAWING_NO_CTC正则与CARRIER_PROFILES["中通服"],--carrier可选值扩为 联通|移动|中通服;- 识别逻辑改为「设计院特征名最长匹配 → 图号体系反推 → 回退」,纠正旧版「按运营商名识别、识别不出默认联通」会把中通服图误判进联通标准的问题(旧特征串
咨询设计院与「咨询设计研究院」近似,属高危坑); - 三处兜底补强:① 图号「有值但无标签」不再误报“缺少图号”(该院图号直接写图面)② 设备/机房类专业以图名「示意图」表达比例,不再误报“未标注比例”③ 文件名无专业关键字(如
图纸.dwg)时改用图面文字兜底识别类型(新增TYPE_RULES_TEXT→ 判「传输设备安装图」); references/transmission_equipment_case.md、references/drawing_patterns.md同步更正建设单位/设计院,并新增「中通服咨询设计研究院出图规范」小节与「设计院与图号体系归属」结论。- 实测:同一 DWG 复跑 —— 体系识别=中通服、图号=
GSTY-001(1/3)、类型=传输设备安装图、比例=示意,评分 100/100「规范」(修正前 70 分且含 2 个假错误);三体系自动识别回归测试 12/12 通过。 -
新增
tests/golden/test_carrier_detect.py(出图体系识别回归测试,12 项断言全通过,含“普通数字串不得被 CTC 正则误吃”的负例)。 -
v1.7(2026-09-29)L1 收尾:三源融合与冲突裁决落地:新增
scripts/fuse.py(跨源实体对齐 + 逐项比对 + 采信写回 + 冲突清单 + 《待现场核实事项》表,三层结构)、
rules/fusion_rules.yaml(把 SKILL.md「三源交叉校验矩阵」12 项 C01~C12、「冲突处置规则」6 条从人工填表落成可审阅规则)、
tests/golden/test_fuse.py(21 项断言)。 - 关键设计:① 实体对齐区分「强匹配(名称完全相等)」与「疑似同一(包含关系 / 坐标邻近)」——后者绝不自动合并,只进待核实;② 每项校验的
preference硬覆盖全局采信顺序(C05 坐标「以实测为准」);③ 冲突只写candidates、不覆盖主值;④ 冲突写回 issues 幂等(重复运行不重复追加)。 - 实测(永腾广场全链路
ingest → quantity_calc → fuse):实体对齐 2 组;C03 段长「291 vs 600(需求估算)」量差;端到端回归由 28 项增至 36 项断言,全通过。(原记「C08 成端芯数冲突」已于 v1.9 更正为误判并移交quantity_calc) -
报告按东亚字符宽度对齐表格,且明写「采信=主值,不代表该值正确」。
-
v1.8(2026-09-29)L2 核心:设计决策引擎落地(三重门控):新增
scripts/design_engine.py(IR + 规则 →design.json:decisions / suggestions / undecided)、
rules/cable_selection.yaml与rules/device_placement.yaml(status: draft 骨架,条目待老尚补)、
tests/golden/test_design_engine.py(24 项断言)。 - 三重门控(本引擎的全部价值所在):① 融合有 high 级未决冲突 → 拒绝输出定案(退出码 3);② 找不到规则依据 → 进未决项并说明缺哪类规则,绝不取默认值;③ 命中
verified: false的草案规则 → 只进suggestions,--allow-draft才可升级为定案且仍标注未确认。 - 不抢设计的活:IR 中已有的设计定案值登记为「沿用设计定案」(
is_carryover),与"引擎推断"严格区分;引擎只在已验证规则范围内推。 -
实测:永腾广场(冲突清理后)→ 输出 4 项定案(长度构成 291m ✓ / 材料 291m ✓ / 成端 288 = 缆芯 144 × 2 端 ✓ / 沿用定案 G.652D 144芯)+ 2 项未决(缆型规则缺、设备选型规则缺);门控①另有专项演练(注入 high 冲突 → 退出码 3)。(原记「容量 288>144 未决」已于 v1.9 更正)
-
v1.9(2026-09-29)两处专业认知更正 + 图签解析能力:据老尚指出,修正两个实质错误:
- ① 成端容量的判据错了(最该改的一处)。旧规则「成端芯数 ≤ 缆芯数,超过即『不可能』」把正常数据判成冲突。
正确口径:一条光缆有 2 个端头,每个端头按缆内芯数全部成端 → 成端总芯数 = 缆芯数 × 端数;
144 芯缆双端成端 = 288 芯,本来就是对的。
→quantity_calc.py::check_capacity改为端数判定(整数倍且 1~2 端 → 通过;非整数倍或 >2 端 → 冲突);
rules/quantity_rules.yaml新增termination段(max_ends: 2)并更正量差速查条目;
rules/cable_selection.yaml的capacity_check改写;rules/fusion_rules.yaml的 C08 撤出——
成端↔缆芯是「两个字段之间的关系校验」,不属「同字段跨源比对」,本矩阵不该管,已移交quantity_calc;
design_engine.py定案表述、golden 样本I002(改closed并留痕)、四套测试断言全部同步更正。 - ② 图签解析漏了下钻块定义。旧版
read_dwg.py/compliance_check.py只抽模型空间顶层文字,
而真实图签(A4图框-横块)的标签与签名全在块定义内部 → 图签被读成空的,进而误判「无字段、无标签」。
→ 新增scripts/title_block.py(图签专用解析器);compliance_check.py的iter_texts/iter_texts_pos
改为递归下钻块定义(带缓存,避免 16 次重复解析同一图框块);read_dwg.py增「含文字的块定义」清单;
中通服档案core_fields按实际标签回填(图号/设计/审核/单位/比例/日期),并新增qualification_field。 - 新发现(都有实用价值):
- 图签含
设计证书编号 A132003592—— 设计资质核查依据,此前完全漏掉;已列入检查器核查项。 - 会签签名以块形式插入,块名即人名(本图:
何宝磊=设计 /唐修元=审定 /田杰_签名=批准);
手写笔迹是矢量图形(LINE/SPLINE/HATCH)不可 OCR,块名不是人名者该栏姓名不可机读,只能人工看图。 - 图内混有
标准图框块(含上海邮电设计咨询研究院有限公司字样,属复用/残留)→
⚠ 归属不可仅凭图内院名,否则会把图纸错判给他院;title_block.py已就此告警。
- 图签含
- 实测:真实 DWG 复跑 —— 图签读到 10 个标签 + 4 个值 + 5 个签名块 + 设计证书编号;
检查器评分 100/100「规范」 且零 error;四套回归(test_carrier_detect/test_fuse/
test_design_engine/run_regression)全通过。 - 四套测试全通过:
test_carrier_detect(12) /test_fuse(21) /test_design_engine(24) / 端到端run_regression(36)。 - v1.11(2026-09-30)扩展名白名单合规 +「源不入包、运行时装」:平台第二轮拒收暴露新规则 ——
校验的是扩展名,不是内容是否为文本。
① 事故与定性
- 报错:提交失败 / 不允许的文件类型: tests/golden/yongteng/永腾广场主干.ovkml。
截图里的路径不含最外层目录名,说明平台已把技能文件夹识别为包根(外层包裹层不是问题)。
- .ovkml(奥维打点)与 .dxf(CAD)内容都是纯文本,照样被拒 → 平台按扩展名白名单校验。
- 官方口径(腾讯云《Skills 文件规范》):只允许纯文本(示例 .md/.py/.js/.txt/.json/.yaml);
禁可执行/图片媒体/压缩归档;单包 ≤10MB、≤300 文件、SKILL.md 须在包根。
错误码 450033 = 含不支持的文件,450019 = SKILL.md 不在根目录。
- 这条与二进制闸门是两回事:内容纯文本时二进制闸门会放行,平台却拒收。
② 「源不入包、运行时装」(这两个文件不能删也不能入包:patch 的 sid 正引用其文件名)
- 新增 tests/golden/make_synthetic_ovkml.py:纯标准库生成 ovkml,内容与原文件等价。
- 新增 tests/golden/golden_prep.py 金样按需装配器:build_sample() 把金样复制到
临时目录并补出 .ovkml/.dxf;run_regression.py/test_drawing_chain.py 开头调用。
- 好处:① 仓库始终处于可直接打包状态(不会"跑完测试就打包失败");
② 文件名一字不变、sid 引用不破;③ 生成物可复现。
- 金样目录由 8 个文件降为 6 个,自身即零越界扩展名。
③ 打包器升级为双重闸门
- 闸门一 扩展名白名单(deny-by-default):清单 = 官方示例 + 客户端 isTextFile 白名单 +
常见纯文本源码/配置;图片类(含 .svg)不收;点文件(.gitignore)与 LICENSE 等无扩展名文件按名放行。
- 闸门二 二进制探测(保留);回读复验同时查扩展名;文件数 >300 或体积超 10MB 拒绝。
- 新增排除客户端本地簿记文件(_user_meta.json/_icon.png/.in_use/ 等)——
上一版包把 _user_meta.json 打了进去,实为安装状态,不该分发。
- 新增 tests/golden/test_pack_gate.py 闸门自身回归(38 项):在技能目录临时副本上植入
各类违规样本(含本次两个真凶 ovkml/dxf)验证拦截,并有纯文本反向对照防误报。
教训:闸门自己没被测,"以为有闸门"比"没有闸门"更危险。
六套回归全通过(177 项):run_regression34 / test_drawing_chain39 / test_pack_gate38 /
test_fuse26 / test_design_engine28 / test_carrier_detect12。
- v1.10(2026-09-30)发布合规改造 + 图纸链回归补齐:据「skillhub 不接受二进制文件」的规则处理,
并把此前唯一没被回归覆盖的那条链钉住。
① 二进制清零(技能包合规)
- 新增 scripts/pack_release.py 发布打包器(带二进制闸门):三重探测(扩展名/内容 NUL 字节/魔数
PK·JPEG·PNG·PDF·AC10(DWG)·OLE2),命中即拒绝打包(退出码 2);打包后回读 zip 逐条复验;
体积超 3MB 同样拒绝。改扩展名藏不住。--check 供开工前预检。
- 金样全面文本化:清掉 4 个假二进制占位桩(47B 假 DWG、22B 假 JPG、20B 假 DOCX)与 2 个真 xlsx,
换成 ASCII DXF(52KB 纯文本)+ 2 个 CSV + 草图核读转录 md + 需求依据处理记录 md。
文件名刻意保持 slug 不变 → manual.patch.json 的 sid 引用不破。
- ⚠️ 边界要清楚:只约束技能包自身,不约束运行时 —— 用户真实 DWG/xlsx/jpg 照旧直喂 ingest_all.py,
不要矫枉过正去要求用户转格式。
② 顺手补齐的能力缺口(都是实际会踩的坑)
- ingest_all.py::parse_sheet 新增 CSV/TSV 分支:.csv 一直挂在 SHEET_EXT 里,但解析只有 openpyxl
分支,真拿到 CSV 版工程量表会静默失败。现补标准库 csv(UTF-8-SIG→GBK→UTF-8 三级回退)与
_as_num() 数字归一(只认纯数字;1/3、0.291km 这类复合串交人工,避免把分张号当数量)。
- ingest_all.py::classify 让 .txt/.md 也能承担「源」角色:草图核读转录→survey_sketch、
需求依据→design_doc。此前文本一律归 survey_report,「现场勘察草图.md」会白丢现场源。
- ingest_all.py 忽略 README/LICENSE 等说明文件,不再污染「来源登记」(否则三源齐备性被无关项凑齐)。
- title_block.py 修资质字段误报:旧启发式「长度≥8 且含字母数字」会把项目名与图号也报成
「疑似设计资质/证书号」—— 根因是中文的 str.isalpha() 返回 True,中文项目名必中。
改用证书号形态正则 ^[A-Z]{1,3}\d{8,13}(?:[-/]\d{1,3})?$,只认 A132003592 这类。
③ 补上此前唯一没被覆盖的链(v1.9 那个 bug 就长在这条链上)
- 新增 tests/golden/make_synthetic_dxf.py 合成金样生成器:造纯文本 ASCII DXF,模拟联通/中讯体系
A4 横图框,重点复刻「标签与签名都藏在图框块定义内部」 —— 9 个标签、2 个人名签名块(块内只有矢量
笔迹、无文字)、设计证书编号、图面工作量表(承载 I003 桥架 100m 叙述与 I005 48 芯接续漏项)。
- 新增 tests/golden/test_drawing_chain.py:read_dwg → compliance_check → title_block 全链回归,40 项。
第④段是反证:先验证模型空间顶层读不到设计证书编号与设计单位名,再断言报告里确实读到了
→ 证明字段只能来自块定义下钻。谁把递归下钻改回去,这条立刻失败。另含「金样自身必须纯文本」的合规断言。
实测:合成样本 compliance_check 100/100「规范」、体系「联通/中讯邮电咨询设计院」、类型「光缆线路图」;
title_block 读到 9 标签 + 7 值 + 2 签名块,配对「设计人←何宝磊、审核人←唐修元」。
打包闸门反向测试(假 xlsx/伪装 PNG 的 .txt/藏 NUL 的 .md/伪装 zip 的 .csv)4⁄4 全拦下,纯文本不误报。
五套回归全通过(132 项):run_regression34 / test_drawing_chain40 / test_fuse22 /
test_design_engine24 / test_carrier_detect12。
脚本与参考文件索引
| 文件 | 用途 |
|---|---|
scripts/dxf_generator.py |
出图主脚本:按 JSON spec 生成 DXF(+可选 PNG 预览) |
scripts/compliance_check.py |
图纸规范性自检/真实 DWG 格式反哺(--dump) |
scripts/dwg2dxf.py |
DWG → DXF 批量转换(调 ODA File Converter,按目录批处理) |
scripts/read_dwg.py |
DXF 结构提取:模型空间图签文字、图层清单、块定义与插入坐标、折线几何(⚠ 不自动下钻块内文字;图签标签用 title_block.py) |
scripts/title_block.py |
图签解析器(下钻图框块):标题栏字段(批准/审定/审核/设计/单位/比例/日期/图号/设计阶段)、设计资质编号、会签签名块(块名即人名)、多套图框模板告警 |
scripts/inspect_drawing_set.py |
图纸集清点(多图打包 DWG):大字号文字、图名/图号配对出图纸清单、图框块引用数、语义块库 |
scripts/dump_real_dwgs.py |
批量导出真实 DWG 的"画图格式"JSON(图号/图层/标题栏字段),用于反哺校准 |
scripts/render_dxf.py |
通用 DXF→PNG 渲染(INSERT 递归、多窗口裁剪、自动识别图幅),用于与原图肉眼比对 |
scripts/parse_ovkml.py |
解析奥维 ovkml/kml/gpx,输出点位、分段长、真方位、累积里程、曲折系数、与报审量差值 |
scripts/check_dxf.py |
DXF 完整性审计(audit 错误数、图层引用、INSUNITS) |
references/element_reference.md |
元素类型与参数总表 |
references/drawing_patterns.md |
通信工程专业分类树 + 各类图纸布局要点与 JSON 骨架 + 末章真实图纸规范(已含 5.1 传输设备安装工程(OTN)、6.1 动力配套更新改造(核心机房) 两个真实子类) |
references/survey_fusion_workflow.md |
《查勘资料三源数据融合与校核作业指导书》全文 |
references/survey_data_fusion.md |
三源资料 → 本技能 spec 的桥接(坐标进图、比例定法、存疑项图层) |
references/optical_cable_line_case.md |
光缆线路实战案例(永腾广场主干补缆):三源清单范式、量差速查5项、parse_ovkml原点修正、大DWG聚焦提取、草图分块放大、OLE.doc乱码、联通小包 JRW(NJ)预算结构与关键定额 |
references/transmission_equipment_case.md |
传输设备专业实战范式(OTN / 华为 OSN 9800):16 张图清单、图号双体系 GSTY/TX、8 个专业信息核(槽位/Oi/A-B方向/供电链路/电缆规格/接地分类/安装工艺/供货界面)、图例体系、解析要点(图名图号 Δy=1422 配对)、监理三源定位、常见坑 |
scripts/ir_schema.py |
IR 数据契约(L1):带证据值模型、校验器、三源齐备性检查 |
scripts/ingest_all.py |
资料包 → IR 入口(L1):分类清点、ovkml 与表格(.xlsx/.xls/.csv/.tsv)结构化解析、录入补丁合并;README/LICENSE 等说明文件不计为资料源 |
scripts/pack_release.py |
发布打包器(双重闸门):闸门一扩展名白名单(deny-by-default,平台只看扩展名)、闸门二二进制探测(扩展名/NUL/魔数);命中即拒绝打包 rc=2;打包后回读复验;排除客户端本地簿记文件;--check 供预检 |
scripts/quantity_calc.py |
算式勾稽计算器(L2):长度构成/材料/容量三类校验 |
scripts/fuse.py |
三源融合与冲突裁决(L1 收尾):跨源实体对齐 → 按规则逐项比对 → 采信写回 candidates → 冲突清单 + 《待现场核实事项》表;high 冲突退出码 3 |
scripts/design_engine.py |
设计决策引擎(L2 核心):IR + 规则 → design.json(decisions/suggestions/undecided);三重门控(融合未清拒绝定案 / 无规则不定案 / 草案规则只出建议) |
rules/quantity_rules.yaml |
规则库(L2):长度构成公式、定额映射、量差速查、勾稽容差 |
rules/fusion_rules.yaml |
规则库(L1):三源校验矩阵 C01~C12、采信优先级、冲突处置手册、对齐与容差规则 |
rules/cable_selection.yaml |
规则库(L2):缆型/芯数选择。status: draft——结构已定、条目待老尚补;引擎默认不据此定案 |
rules/device_placement.yaml |
规则库(L2):设备选型与安装方式。status: draft,同上 |
references/ir_schema.md |
IR 数据契约文档:字段说明、来源可信度表、补丁简写规则、校验规则 |
tests/golden/yongteng/ |
永腾广场 golden sample 资料包(全文本、零二进制、零越界扩展名,含录入补丁),端到端回归样本;构成与来由见该目录 README.md |
tests/golden/golden_prep.py |
金样按需装配器:把金样复制到临时目录,并补出 .ovkml/.dxf 两个"源不入包"的生成物;build_sample() 供各回归调用,python golden_prep.py 可人工装配 |
tests/golden/make_synthetic_dxf.py |
合成金样生成器:造纯文本 ASCII DXF(含图签块定义、人名签名块、工作量表),样本可用它重建 |
tests/golden/make_synthetic_ovkml.py |
合成金样生成器:造奥维打点 ovkml(命名点位 + 手绘折线 TrackStyle type=4),纯标准库实现 |
tests/golden/test_pack_gate.py |
发布闸门回归测试:白名单基线 / 扩展名拦截(ovkml·dxf·kml·gpx·png·svg·无扩展名)/ 改名绕过(NUL·魔数)/ 反向对照,共 30 项;在技能目录临时副本上作业 |
tests/golden/test_drawing_chain.py |
图纸解析链回归测试:read_dwg → compliance_check → title_block,含「图签字段不在模型空间顶层」的反证断言,共 39 项 |
tests/golden/test_carrier_detect.py |
出图体系识别回归测试:三套体系(中通服/中讯·联通/移动院)+ 图号反推 + 无信息回退,共 12 项断言 |
tests/golden/test_fuse.py |
三源融合回归测试:实体对齐(含"包含关系不得合并")/ 坐标冲突 / 跨容器芯数冲突 / 单源守卫 / 手绘草图单源 / 主值不被覆盖 / issues 幂等,共 26 项断言 |
tests/golden/test_design_engine.py |
设计决策引擎回归测试:三重门控 + 定案依据 + --strict + 规则匹配器,共 28 项断言 |
发布合规:技能包内只允许纯文本(2026-09-30 立规)
平台(skillhub)对技能包有硬校验,不满足即上传被拒。此前靠人记得排除,
已实际踩坑两轮,现全部改为程序强制。
规则一:校验的是扩展名,不只是"是不是二进制"
- 第一轮被拒:金样里混了
.dwg/.xlsx/.jpg/.docx。 - 第二轮被拒:
提交失败 / 不允许的文件类型: tests/golden/yongteng/永腾广场主干.ovkml
——.ovkml(奥维打点)与.dxf(CAD)内容明明是纯文本 XML/文本,照样被拒。
结论:平台看的是扩展名白名单,不是内容是否为文本。 官方口径(腾讯云
《Skills 文件规范》):包内只允许纯文本文件(示例 .md/.py/.js/.txt/
.json/.yaml 等),明令禁止可执行文件、图片媒体、压缩归档;单包 ≤10MB、
文件数 ≤300、SKILL.md 须在包根。错误码 450033 = 包内含不支持的文件,
450019 = SKILL.md 不在根目录。
防线一:打包闸门(别靠记性)
<python> scripts/pack_release.py --check # 只查,两项闸门都跑
<python> scripts/pack_release.py --version 1.11.0 # 打包;命中即拒绝,退出码 2
- 闸门一 · 扩展名白名单(deny-by-default):不在允许清单内一律拒绝。
清单 = 官方示例 + 客户端isTextFile白名单 + 常见纯文本源码/配置类型。
图片类(含.svg)一并不收。 - 闸门二 · 二进制探测:已知二进制扩展名 → 内容 NUL 字节 → 已知魔数
(PK=xlsx/docx/zip、JPEG、PNG、PDF、AC10=DWG、OLE2=doc/xls…)。改扩展名也藏不住。 - 打包后回读 zip 逐条复验扩展名与二进制特征;文件数 >300 或体积超限同样拒绝。
- 顺带排除客户端本地簿记文件(
_user_meta.json/_meta.json/
_skillhub_meta.json/_icon.png/.in_use/)——那是安装状态,不是技能内容。 - 闸门自身也有回归:
tests/golden/test_pack_gate.py(38 项,在技能目录的
临时副本上作业,绝不触碰真实目录)。
防线二:内容纯文本、但扩展名不被接受的 →「源不入包、运行时装」
.ovkml/.dxf 这类文件不能删(manual.patch.json 的 sid 正引用其文件名),
又不能入包。解法是仓库只留生成器,跑测试时补出来:
| 不入包的生成物 | 生成器 |
|---|---|
永腾广场主干.ovkml(奥维打点) |
tests/golden/make_synthetic_ovkml.py |
永腾广场主干光缆设计.dxf(CAD) |
tests/golden/make_synthetic_dxf.py |
run_regression.py/test_drawing_chain.py 开头调 golden_prep.build_sample():
把金样复制到临时目录并补出这两个文件后开跑。好处有三 ——
① 仓库始终处于可直接打包状态(不会出现"跑完测试就打包失败");
② 文件名一字不变,patch 的 sid 引用不断;③ 生成物可复现。
人工装配一份完整金样:python tests/golden/golden_prep.py。
防线三:其余入包资料一律取纯文本等价物
| 真实的源(二进制) | 包内文本等价物 | 谁负责 |
|---|---|---|
| 预算表/会审单 xlsx | CSV(ingest_all.py 已支持 .csv/.tsv 输入) |
导出 |
| 现场勘察草图 jpg | 草图核读转录 .md |
人工核读 |
| 需求依据 doc | 处理记录 .md(原件不可读就如实记"不可读",勿臆测) |
人工 |
⚠️ 只约束「包里」,不约束「运行时」
技能实际作业时,用户的真实 DWG/xlsx/jpg/ovkml 照旧直接喂给 ingest_all.py,
不需要任何转换 —— 它们进的是 IR,不是技能包。别矫枉过正去要求用户转格式。
真实项目资料的额外考虑
真实图纸属甲方/设计院成果,除合规外还有保密问题:不应随技能包对外分发。
需要样本时用合成样本(两个 make_synthetic_* 就是为此而写),或由使用者本地放置。
依赖
- Python 3.10+
- ezdxf >= 1.0 (
pip install ezdxf) - matplotlib(可选,PNG预览需要;推荐 matplotlib<=3.10 兼容性最佳)
- openpyxl(读报审表/预算表/签证单 XLSX)、pillow(勘察草图分块放大核读)
- ODA File Converter(DWG→DXF 必需;脚本会自动定位安装目录,无需手动加 PATH)