很多人以为 DWG 图纸翻译就是"把字读出来、翻完、写回去"三步。真正做过的人都知道:DWG 不是 Word 文档,它本质上是一个图形数据库——一张中等规模的图纸展开后有数百万行数据,文字占比不到 1%,而且这不到 1% 的文字以七八种完全不同的方式散落在文件各处。这篇文章从 CAD 格式层面讲清楚提取和回写各自难在哪,也算是我们开发 CAD图纸翻译神器 过程中趟过的坑的一份记录。
难点一:DWG 格式本身——专有、二进制、版本众多
DWG 是专有二进制格式,从 R12 到 2018 每个大版本的内部结构都有差异,直接读取没有公开规范可循。工程上的通行做法是借助 ODA(Open Design Alliance)引擎把 DWG 转成 DXF 交换格式再处理——这也是我们的方案。
但 DXF 只是"可读",不等于"好读"。它是按组码逐行记录的纯文本,一张图纸动辄数百万行,其中 99% 是坐标点、线型定义、图层表、块定义这些图形数据。真正的文字淹没在里面,必须按实体类型逐一筛出来。更麻烦的是编码:早期国内图纸大量是 GBK 编码(DWGCODEPAGE 为 ANSI_936),新图纸多为 UTF-8,编码判错一次,整图文字全是乱码——这也是为什么老图纸用普通工具提取经常出问号。
难点二:文字的八种存在形态,一种都不能漏
CAD 里的"文字"远不止你看到的单行文本。完整的提取范围至少覆盖八类实体:
- TEXT 单行文字:最简单的一种;
- MTEXT 多行文字:内容里嵌着大量内联格式码——字体、字高、宽度因子、换行、对齐、堆叠分数都是控制符,长和复杂图纸说明全是它;
- ATTRIB/ATTDEF 块属性:嵌在图块(INSERT)内部,图框标题栏、轴号、门窗编号几乎都是这种形态,而且不可见属性(组码 70 标志位)是程序用的数据,绝不能当文字提取出来;
- DIMENSION 标注:标注文字可以是被人工改写过的,不和测量值一致;
- MULTILEADER 多重引线、TOLERANCE 公差:存储结构各自独立;
- 表格(ACAD_TABLE)单元格:行列寻址,设备表、材料表的重灾区。
第三方设计软件又加了一层复杂性。天正画的图,文字经常包在 TCH 自定义实体(代理对象)里,不按天正的对象结构理解就读不到;Revit 导出的 DWG,标注和符号文字大量转成块属性;Tekla、浩辰、中望导出的文件在编码和实体组织上也各有脾气。此外,外部参照(Xref)里的文字根本不在当前文件内,技术上有义务检测出来并明确提醒用户"这部分不会被翻译",而不是默默漏掉。
难点三:回写——比提取难一个量级
提取读错了可以重读,回写写错了就是废图。回写要同时解决四个问题:
1. 精确定位。每个实体靠唯一 handle(句柄)寻址,但块内属性、表格单元格需要"图块句柄+属性""表格+行列号"这样的复合定位,差一个层级译文就写飞。
2. 只换内容,不动格式。MTEXT 的格式码和文字内容是混排的,回写必须只替换文字部分,字体、字高、对齐、换行控制符原样保留;同一段文字在图里重复出现多次(标准说明、通用详图)时,要全部命中、一处不漏。
3. 字体问题。中文图纸的文字样式普遍挂 SHX 大字体,直接写入英文、法文、俄文,CAD 找不到对应字形就显示问号或方框。正确做法是按目标语言克隆一套新文字样式并切换字体,原文样式和图面其他对象一概不动——这是"翻译后不乱码"的核心。
4. 排版适配。中文译成英、法、俄后长度通常增加三到八成(经验估算),原样写回必然顶出图框。需要同步调整文字的宽度因子(组码 41),把译文压缩回原来的占位空间,才能做到排版不挤压、不炸行。
为什么"500 余张图纸实测"是硬指标
上面每一个坑,都不是看格式文档能预见的——GBK 老图、被改写过的标注文字、天正代理对象里的说明、Revit 导出的嵌套属性,全是拿真实海外工程图纸一张一张趟出来的。我们的软件累计经 500 余张英、法、俄、中真实工程图纸实测调教,才敢说"翻译完成即是可交付图纸"。回写时原文件不动、输出 _translated 新文件,也是为了让用户随时对照原图验收——技术上自信,才敢让你对比。
判断一个图纸翻译工具是否专业,问三个问题就够了:块属性里的文字提取得到吗?回写后 MTEXT 的行内格式还在吗?译成外文后字体样式换了吗?