01 / 流水线
整条链路由七个环节和两条闭环组成。关键在于每一步都留下**可被下一环检验的产物**,而不是留下"我觉得对了"。
02 / 七个环节
每一环给出:它要解决的问题、它的失效模式、以及失效时最容易被忽略的信号。
造标准答案
GROUND TRUTH没有 ground truth,就无法区分"重建成功"和"看起来像"。要求:程序化生成、几何量可解析计算、覆盖不同难度等级(P1 常规件 / P2 含外公切线与键槽 / P3 标注被删减)。
拿真实商业图纸当 GT——无法自动评估,人工比对又引入主观差异,实验变成"我觉得像"。
解析体积/包围盒是后续所有争议的裁决基准。没有它,差分归因无据可依。
GT 的建模路径要和重建路径刻意不同(草图拉伸 vs 圆柱+切除),才能证明得到的是同一个几何而非同一段代码。
投影成图纸
HLR PROJECTION隐藏线(虚线)承载了大量信息:被遮挡的孔、加强筋、交线都在里面。同时必须导出像素↔毫米变换矩阵,否则第 ④ 环没有比例尺可用。
只出可见线——信息量少一半;或导出了图却没导出坐标变换,后续只能靠肉眼估读。
三视图是受约束的投影,不是缩略图。虚线与实线的组合决定了孔是否存在、筋在哪里。
视图比例尺要统一,标注文字与真实棱边在灰度上必须可区分(否则像素测量会把标注当成几何)。
只读重建
NO SOURCE ACCESS重建者只看图纸,不允许回看建模参数。这是全流程唯一无法自动化的环节,也是最关键的一环:它要求把"视觉—几何"映射显式化——圆弧对应圆/圆柱,公切线由两圆半径与心距解析反推,隐轮廓由相邻视图的几何约束推出。
回看源码 → 测出来的是抄写精度;或凭直觉猜尺寸 → 误差不可控且无法归因。
"只读"是实验有效性的前提。一旦破坏,后续所有数字都失去意义。
重建要显式写出"特征 → 参数"的映射表(哪些尺寸来自标注、哪些来自推导、哪些来自测量),便于事后核对。
像素测量补标注
PIXEL METROLOGY标注不全时,用像素反推尺寸。棱边靠扫描线取暗像素簇;孔心靠 ROI 内的代数圆拟合;比例尺由已知标注标定并自校验。
# 孔心:ROI 内暗像素的代数圆拟合(Kasa)—— 抗直线干扰 A = np.column_stack([2*X, 2*Y, np.ones_like(X)]) sol, *_ = np.linalg.lstsq(A, X**2 + Y**2, rcond=None) cx, cy = sol[0], sol[1]; r = np.sqrt(sol[2] + cx**2 + cy**2)
用"最暗点"找孔心——当孔被加强筋穿过时,筋的直线像素会带偏结果,必须改用圆拟合。
这一步把"读图"从定性猜测变成可量化误差:实测读图精度 ±0.25mm,比例尺自校验误差 0.11%。
灰度要分档取阈值:黑实线 ≈27、灰虚线 ≈154、红标注 ≈194、纸底 ≈251,用单一阈值必然误伤。
量化评估
QUANTIFIED四个指标各管一件事:体积与包围盒做粗筛;体素 IoV 同时给 precision 与 recall,能区分"缺料"与"多料";Chamfer 只作补充(采样噪声主导时它没有判别力);三视图叠加图负责几何归因。
只看体积误差——等体积但形状不同的情况会被完全放过。
precision 与 recall 的组合能直接指出错误方向:recall 低 = 重建缺料,precision 低 = 重建多料。
体素分辨率要高于待测误差一个数量级,否则 0.2% 级差异已落在分辨力以下。
差分归因
ATTRIBUTION当重建与 GT 不一致时,先定位是谁错,再决定改谁。手段按优先级:叠加图看差异形态 → 解析体积看差多少 → 回到最可能的层(几何 / API / 投影 / 图像 / 环境)。
看到 15.5% 体积差就去调重建参数——本次案例中重建是对的,是 GT 的布尔切除没穿透板厚。
改错的一侧会把正确的结果改坏,还制造出"调参后更接近"的假象。
归因时先问"哪一侧的假设更强":GT 是解析构造出来的,重建是基于图纸的,优先怀疑 GT 的建模缺陷。
第三方复读
INDEPENDENT READBACK自己写、自己导、自己读,不算验证。用 FreeCAD 独立打开 STEP/IGES 自己算实体数、面数、体积、包围盒;用 Blender 渲染 STL 确认在真实查看器里成立。
只用自己的库回读——同一套实现的自洽,证明不了格式与几何本身正确。
逐位一致(体积 93628.09、22 面、120×60×80)才说明格式无损、没有拓扑丢失或单位缩放偏差。
换格式复读(STEP ↔ IGES ↔ STL)也要互校,IGES 尤其容易在拓扑缝合上出问题。
03 / 失败模式分类
实战中出现的每一个坑都可以归入四类。分层的意义在于:症状相同的东西,根因可能完全不同——"图上多了一条线"既可能是几何错、也可能是合并错、还可能是绘制顺序错。
| 症状 | 根因 | 修复 |
|---|---|---|
草图挤出报 wires not planar | arc 参数与直线参数不在同一坐标系 | threePointArc 用全局 3D 点,而 moveTo/lineTo 用 workplane 局部 2D。混用即错位。改在统一平面画草图后整体旋转到位 |
| 布尔切除"没切穿" | workplane 法向方向被忽略 | XZ 法向是 −Y;offset(-5).extrude(t) 实际只覆盖 y∈[0,5]。切除范围要按法向显式展开 |
| 条件判断恒为真 | 跨枚举同名常量 | GeomAbs_C0 实为 GeomAbs_Shape.GeomAbs_C0(值 0),与 GeomAbs_CurveType.GeomAbs_Line(值也是 0) 相等。必须写全 GeomAbs_CurveType.GeomAbs_XXX |
| 直线边整批消失 | 离散器对直线退化抛异常被吞 | GCPnts_QuasiUniformDeflection 对直线不适用,单独取两端点;异常不要静默 catch |
| 症状 | 根因 | 修复 |
|---|---|---|
| 侧视图里圆弧整段消失 | 视线与圆柱轴平行时 OCC HLR 退化 | 丢弃了正对观察者的圆弧边。按"圆弧所在平面法向 ∥ 视线"判据补真实圆弧 |
| 圆弧位置出现一条直线弦 | 曲面轮廓被降级成端点连线 | 补真实圆弧的同时,剔除对应的假弦 |
| 视图里横贯一条对角线 | 碎片合并在几何顶点错接 | 合并必须区分前接/后接,且要求接缝方向连续;精确 B-Rep 的 HLR 输出本就是完整边,干脆不合并 |
| 可见线被画成虚线 | 正投影下顶面与底面边界重合,隐藏线后画覆盖 | 绘制顺序:先隐藏线后可见线 |
| 轮廓缺失成矩形 | 相切轮廓线未纳入输出 | 可见线要合并 VCompound + Rg1LineVCompound + OutLineVCompound 三类 |
| 症状 | 根因 | 修复 |
|---|---|---|
| 测量结果整体上下翻转 | 图像 y 轴向下、figure y 轴向上 | 换算统一走"图像像素 → 视图数据"单向函数,别在两套坐标里混算 |
| 孔心位置偏移几毫米 | 用"最暗点"找孔心 | 孔被筋穿过时失效,改用 ROI 内暗像素的代数圆拟合 |
| 棱边读数总偏一点点 | 线条有宽度,簇边缘≠几何边 | 取簇中心并扣掉线宽;或用线宽标定一次 |
| 把标注箭头当成几何线 | 单一灰度阈值 | 分档阈值:黑实线/灰虚线/红标注各取各的区间 |
| 比例尺自校验通过但绝对值偏 | 基准长度选错(量到的是含标注的边框) | 用模型已知特征的两端做基准,并做一次自校验 |
| 症状 | 根因 | 修复 |
|---|---|---|
| 渲染出纯背景/纯黑,模型完全不见 | Blender 导入 STL 按 mm→m 缩放,模型落在 clip_end 之外 | 相机距离取模型尺度的相对倍数,clip_end 按模型尺度设;别用绝对魔数 |
| 整幅过曝纯白 | 面光源能量与内部尺度耦合 | 改用太阳光(辐照度与距离无关),能量与模型尺度解耦 |
| GUI 自动化全部报权限错 | 系统辅助功能/屏幕录制权限 | 改用应用内注入:启动脚本 + 抓自身窗口,不抓全屏 |
| 离屏渲染首张是空白 | OpenGL 上下文未就绪 | 延迟启动 + 强制事件循环若干秒后再导出 |
| 脚本突然 exit 127 | macOS 没有 timeout 命令 | 用 shell 工具自身的超时,或 perl/gtimeout;先分清是"命令不存在"还是"程序失败" |
| 截图拍到了桌面私人内容 | 全屏截图 | 只抓应用自身窗口;产出的图片先自检再交付 |
| 新目录被 git 静默忽略 | .gitignore 白名单模式 | 先看历史提交怎么做的(同样可能是 add -f),别擅自改用户的 ignore 规则 |
04 / 方法论原则
把上面的经验收敛成八条可迁移的原则——换一套零件、换一套工具,仍然成立的那部分。
先造标准答案
没有可比的答案,就只能得到"看起来像"。评估能力必须先于生成能力被建立。
输入约束比模型能力更重要
标注密度、投影标准、歧义消解决定了误差下限。图纸侧补一条基准线,收益大于换更强的模型。
只读约束是有效性的前提
破坏"不看源码",实验就退化成了抄写练习,数字全部失去意义。
用不同路径重建
换一种建模方式得到同一几何,才能证明是等价而非复制。这是低成本的强验证。
差分归因优先于调参
不一致时先定位是谁错。双方都可能是错的来源,解析量是最快的裁决者。
量级要匹配
评估分辨率必须高于待测误差一个数量级,否则好指标也可能是噪声。
自己写自己读不算数
独立复读、独立渲染。格式是否无损,只能由第三方工具说了算。
失败要定位到层
几何 / API / 投影 / 图像 / 环境,五层分开定位。不分层就会用错误的手段修正确的现象。
05 / 执行检查清单
照表执行。新一轮实验直接复制这份清单逐项打勾,缺项就是风险。
06 / 泛化路线
这套方法论目前只在"程序化生成的简单零件 + 完整标注"上验证过。往下走有四条明显的扩展方向,各自需要补什么、风险在哪。
更复杂的零件
自由曲面、钣金展开、装配体、螺纹与花键。瓶颈在 HLR 对曲面的轮廓补齐,目前只覆盖了圆柱/锥台轴向平行的退化情形。
NEEDS · 曲面轮廓的解析求交真实图纸
扫描件去畸变、OCR 读标注、线段与符号识别、自动比例尺标定。图纸质量本身就是噪声源。
NEEDS · OCR + 去畸变 + 鲁棒标定通用图元提取
把当前的测量器从"针对特定零件"扩展为通用图元提取器:自动识别圆、线、圆弧、中心线,并输出带置信度的候选集。
NEEDS · 从脚本到模型歧义消解与形状先验
用制造可行性(可加工、常见结构、尺寸规范)给歧义候选排序,让"圆柱 vs 等径圆柱"这类问题有可依据的默认答案。
NEEDS · 制造知识库07 / 边界
这份方法论目前能支撑的结论范围如下,超出范围的推论没有依据。
成立:在标注完整或比例尺已知的正交三视图上,可复原零件的几何特征与拓扑;读图精度可达 ±0.25mm 量级;重建结果可被第三方 CAD 逐位复读验证。
不成立:纯轮廓零标注时的绝对尺度不可解;三视图固有歧义(圆柱 vs 等径圆柱、圆角 vs 倒角)并未被消除;曲面零件的轮廓补齐只覆盖了有限情形。
未验证:真实商业图纸、扫描件、装配体与自由曲面;像素测量在非等比图纸上的鲁棒性;多零件装配关系的重建。
方法论本身:本文的清单与分层来自三次实验的归纳,样本量小;它在更复杂的零件上大概率需要修订,尤其是第 ⑤ 环的评估分辨率与第 ③ 环的歧义处理。