ARTICLE · 1334555
PDF版轴测图自动化标注
一、先算一笔人工账
一张 A1 幅面的管道轴测图(单线图),平均十到二十道焊口。一套八十来张的图册,就是九百多道焊缝。
手工做这件事的流程是这样的:翻图找焊口 → 对照标准判焊缝类型 → 按顺序编号 → 找一块不压管线不压文字的空白 → 把编号写上去、拉一条引线指回焊口 → 抄进台账,补上管径和材质。
一套图册,熟手三到五天。而且做到第三天,编号就开始错位了——这不是态度问题,是人的工作记忆撑不住九百条流水号。
所以我想的是:能不能把这套动作交给程序,人只做复核。
二、第一个坏消息:图纸里没有一个字
图纸是从 CAD 导出的 PDF,看着到处是文字,但用程序一读,文本层是空的。
原因不复杂:导出时汉字被打散成了轮廓曲线。屏幕上你看到的是“弯头 DN150”,程序看到的是一堆首尾相接的短线段。文本提取、全文检索、乃至按关键词定位,全部失效。
OCR 也不是解法。图面上大量信息是单字符——材料表的 ID 是 1、2、3,数量是 1、2,默认阈值下根本读不出来;而坐标、管径这些必须精确的东西,OCR 一次误读就够返工一天。
结论只有一个:所有判断必须来自几何,不能来自文字。
三、先给图元建一本“语义词典”
这是整件事最关键的一步,也是最容易被跳过的一步。同一张图上,程序看到的是几百个填充路径和描边线段,长得差不多。要判断哪个是焊口,必须先定义清楚“什么样子的东西是焊口”。
我们做的第一件事,是把图面标记逐一量出来,建了一张对照表:
这张表后来被反复改写了好几轮。最开始的版本只认“落在端点上的圆点”,结果支管根部、阀门端那些圆点不在任何线段端点上——因为主管在那里并没有断开——整批漏掉。
先定义语义,再写代码。这句话听起来像废话,但实际做的时候,绝大多数返工都来自这一步没做完就急着调参数。
四、把编号落到标准上
焊口编号不是随便起个号,行业里有明确规则。我们按 SH/T 3558-2016 附录 B 实现:
◦︎ B.1 对接焊缝:1、2、3… 流水号
◦︎ B.2 支管连接:D1、D2…(带补强圈的加 Q)
◦︎ B.3 受压元件间角焊缝:C1、C2…(双面焊另有标记)
◦︎ B.4 非受压元件角接:E1、E2…
◦︎ B.6 增加焊口:Z 系列
落到代码里,就是一张分类表:先看这个节点连了几条管道边、材料表里有没有三通、附近有没有成对的法兰盘线,再决定它走流水号还是 D 还是 C。
这里有个容易踩的点:法兰型式决定归类。板式平焊法兰的焊缝是角焊缝,走 C 类;而对焊颈法兰的端部是对接焊,必须走数字流水号。同一套判据套到两种图纸上,结果会全错。
五、编号放哪儿,比识别更难
识别出焊口只是上半场。真正的麻烦是:编号放在哪里。
要求是很具体的——不能压管线、不能压文字、不能压尺寸线,最好引线还别穿来穿去。手工做的时候老师傅一眼就知道该放哪儿,程序不知道。
我们的做法是把“空白”变成可计算的东西:
◦︎ 整页按 144dpi 渲染成灰度图;
◦︎ 按 1.5pt 网格统计每格有没有墨;
◦︎ 做积分图,这样任意矩形区域的墨量可以 O(1) 查出来;
◦︎ 从焊口向外,16 个方向、半径 9 到 120pt 逐圈搜索,只接受墨量为零的位置;
◦︎ 同一圈里优先选“引线不穿墨、不压其他编号框”的。
然后立一条硬规矩:找不到零墨位置就不放,绝不回退到压墨的位置。
这条规矩很重要。早期版本允许“实在没地方就凑合放一下”,结果交付出来最扎眼的恰恰是那几个凑合的位置。后来改成只认零墨,宁可少标一个让人工补,也不出一处压盖。
最终这套图册里,引线中位数 9pt,最长 27pt,没有一处压盖。
六、三个差点毁掉结果的 Bug
这一段是全文最值得看的部分。三个问题都不是算法不够聪明,而是判据写错了。
Bug 1:图框规则把主管道删了。为了排除图纸外框,早期写了条规则——“轴对齐、长度超过 380pt 的直线视为图框”。听着很合理,实际很致命:主干直管也是轴对齐的长直线。有一页竖管长 457pt,整条被当成图框删掉,那一页的焊口从十几个掉到 1 个。改法是:图框的正确定义不是“长”,而是“靠边”或“在表格区”——距页边 60pt 以内,或完全落在材料表、标题栏禁放区内,才排除。
Bug 2:两个真焊点被合并成一个。异径三通的两侧各有一道焊缝,圆心间距实测只有 5.7pt;而 PDF 里重复绘制的同一个点,间距是 0.1pt。去重阈值当时设的 7pt——本意是合并重复点,实际把两个真焊点吃成了一个。每个三通少编一个号,全册少了几十个。改法是把阈值压到 2pt:0.1 和 5.7 之间,阈值放在哪儿都行,但绝不能跨过 5.7。
Bug 3:支管根部的圆点不在任何线段端点上。这个问题最隐蔽。支管接主管的地方,主管线并没有断开,圆点落在一条长线的中间。只按“线段端点”找焊口,这一整类全部漏掉。改法是:除了端点,再接受“距轴线 ≤1.8pt、且落在线段内部(t 在 0.03~0.97 之间)”的点。
三个 Bug 有个共同点:它们都不报错。程序跑完,输出一份看起来像模像样的图纸,只有懂行的人一眼才能看出“这里少了个号”。
这就是为什么这类工具必须配人工复核,也是为什么判据的验证比算法的优化更值钱。
七、光有编号,交不了工
编号只是台账的第一列。真要用起来,每道焊缝还得有管径和材质。管径的取法按优先级:
◦︎ 图面上离该焊口最近的距离标注(比如 150 NS、80X50 NS);
◦︎ 找不到标注就取材料表“无缝钢管”那一行的规格;
◦︎ 再没有就退到图号里的 DN。
变径处单独记成 DN150×80,因为异径三通和大小头的两侧本来就是两种管径。
材质来自材料表:管子管件是 06Cr19Ni10(GB/T 14976 II 系列),板式平焊法兰是 S30408。管-法兰角焊缝涉及两种母材,台账里就写成“管材 / 法兰材”两段。
材料表是 OCR 读的。这里有个坑:ID 和数量列都是 1~2 个字符,默认识别阈值读不出来,必须把检测阈值降到 0.2 才认。
最后加了一层交叉校核:按材料表件数推算应该有多少道焊缝——弯头两道、平焊法兰一道、大小头两道、三通三道——和实际识别数对比,差异大于等于 3 的页标黄。全册标黄的只有 4 页,逐页看下来,差异都来自法兰盖、软管接头这类本来就不计焊口的项。也就是说,识别结果和材料表是对得上的。这一步不做,你永远不知道自己漏了多少。
八、把复核做进工具里,而不是做完再补
机器能覆盖 95%,剩下 5% 必须人来看。但这 5% 不能靠“在 PDF 上画圈口头交代”,得留痕。所以配了一个本地网页编辑器:
◦︎ 图上点一下,就在那个位置补一个焊口,自动重编号;
◦︎ 选中编号,可以改类型、可以删(Del 键);
◦︎ 编号框可以直接拖到别处,引线自动跟随;
◦︎ 增、删、改、移全部写进一份覆盖表。
这份覆盖表是可复现的:下次重跑,人工改动不会被机器结果冲掉,也不会因为换了个人接手就说不清哪几个号是后加的。
交付的台账里,每一行都带坐标、识别来源(自动 / 人工增补)、引线长度——任何一条都能回到图上核对。
九、说清楚它不做什么
一个工具的可信度,一半来自它边界讲得多清楚。
◦︎ 只处理矢量 PDF。扫描件、图片、DWG 原生文件不行,得先矢量化。
◦︎ 只处理单线图。双线图、流程图、设备布置图的图元语义不同,默认判据不保证命中。
◦︎ 法兰默认按板式平焊判。以对焊颈法兰为主的图纸要改一处判据再用。
◦︎ 支吊架的 E 类焊口不在单张轴测图里,需要支架图另外统计。
◦︎ 跨图同一道焊口,现在按图内唯一编号,不自动做 B.6 去重——这个必须人工合并。
以及一条必须写在最前面的:输出是辅助成果,不是交工资料。焊缝编号、管径、材质必须由具备资格的焊接或管道专业人员复核后才能用于施工和检验。
十、最后
回头看,这套东西真正的价值不在“自动”两个字。
自动只是省了三天里的两天半。它真正的价值是可复核:九百多道焊缝,每一条都有坐标、有来源、有引线长度、有和材料表的交叉校核。老师傅不用再凭记忆去查“这个号我当时标哪儿了”,打开台账就能定位。
如果非要总结一句经验:把判据写清楚,比把模型调聪明更有用。三个 Bug 里没有一个需要更复杂的算法,全都只需要把“什么算焊口”这件事重新想明白一遍。
(本文所述技能已整理为通用版本,支持矢量 PDF 轴测图自动识别、SH/T 3558 编号、空白位排版与含管径材质的焊缝台账输出。识别结果为辅助成果,使用前请由专业人员复核。)















































































