为什么要把 DWG 先转成 DXF
甲方甩过来的图纸九成是 .dwg,而大多数开源解析库(含我自己搭的分析器)对 DWG 的版本兼容性很差,R2018 以上的文件经常读不全、甚至直接崩。我们的做法很朴素:进流水线第一步一律用 LibreDWG(GPL、完全免费)先转成 .dxf,后面的图层/实体/文字解析全部针对 DXF 做,稳定性立刻上一个台阶。
经验:转换在前、解析在后,把"格式兼容"这层脏活隔离成一个独立环节,后面所有逻辑只认 DXF,排查问题范围直接砍半。
流水线的三个环节
1. 转换(LibreDWG)
- 用
dwg2dxf命令行批量转,指定版本输出为 R2013 DXF,兼容性好; - 转换失败的留原文件名进
_fail/目录,绝不原地删除,方便回头重跑; - 大图(几十 MB)转换慢,用队列限速,别一次性并发把机器打满。
2. 分析(图层 / 实体 / 文字)
- 读
LAYER表,把甲方乱命名的图层归并成"墙体/设备/标注/尺寸"几类; - 统计实体类型数量(LINE / POLYLINE / INSERT 块引用),快速判断这是建筑图还是电气图;
- 抽 TEXT/MTEXT,做编码清洗(GBK 与 UTF-8 混排是重灾区)。
3. 报告(前端呈现)
报告不堆原始数据,只给甲方看得懂的三块:图件基本信息、图层清单带占比、疑似问题清单(缺标题栏、尺寸线游离、块未定义)。能点开看明细,也能一键导出。
卡死我们的坑:转换失败就永久跳过
第一版分析器写得很"聪明":转换环节返回非 0,就 continue 跳到下一张,并在数据库标 skipped。结果某天 LibreDWG 升级后一批图纸报了"版本警告但转出了可用 DXF"——我们的代码把"非零退出码"当致命错误,整批被标 skipped,之后再跑因为已标记 skipped 又直接跳过,永远停在失败态。
坑:"转换失败 = 永久跳过"是个自杀式设计。非零退出码里混着"真失败"和"警告但产出可用",一刀切跳过会把可救的图也埋了,而且状态位一旦写下就再不回头。
修法:① 把"退出码"和"是否产出有效 DXF 文件"拆开判断——文件存在且非空才算成功,退出码只当参考;② skipped 状态改成"可重试",每次重跑都先清掉旧跳过标记;③ 转换环节单独保留日志,区分 FATAL(真没文件)与 WARN(有文件但带告警)。改完那批图全部正常产出。
前端怎么把报告呈现出来
- 报告页头部放"图件 / 张数 / 处理时长",让甲方一眼知道跑没跑完;
- 图层清单用占比条,哪类图层占大头一眼可见;
- 疑似问题做成可折叠列表,严重的红标、提示性的灰标,不吓人也不漏;
- 整页纯静态 HTML,无需登录,甲方微信里点开就能看。
经验:分析器的价值不在"读出了多少实体",而在"甲方能不能 30 秒判断这张图能不能用"。呈现层省下的沟通成本,比多解析两个图层值钱。
小结
CAD 图纸自动分析不是单点技术,而是一条"转换→解析→报告"的流水线。最贵的教训是:任何"失败即永久跳过"的状态机,都会把可救的活变成永久烂尾。把"是否产出"和"退出码"分开、给重跑留后路,流水线才真正扛得住真实甲方的脏数据。