1. 从Demo到工程:AI+CAD落地的真实鸿沟
过去两年,我参与过三个AI辅助CAD的项目,从图纸识别到参数化生成,从二维线稿到三维重建,几乎每个方向都摸过一遍。最深的感受就是:Demo演示和工程落地之间,隔着一整个太平洋。你在GitHub上搜“AI CAD”,能翻出几百个仓库,每个README都写得天花乱坠,但真正能塞进设计院生产流程、让一线工程师愿意天天用的,凤毛麟角。
这个现象不是AI不行,而是CAD这个领域太特殊了。它不像NLP或者CV,拿个预训练模型微调一下就能出效果。CAD文件承载的是精确的几何语义、工程约束和行业规范,一个尺寸标错,下游的制造、施工全得跟着崩。所以当我们在讨论“AI+CAD落地”时,本质上是在讨论如何让概率性的AI输出,去适配确定性的工程需求。
这篇文章面向的是正在或准备做AI+CAD方向的技术人、产品经理,以及被各种Demo汇报轰炸过的工程负责人。我会从数据格式、技术选型、实操流程、踩坑经验几个维度,把这件事拆开揉碎讲清楚。核心关键词:AI、CAD、DXF、DWG、FreeCAD,这些词会贯穿全文,因为它们就是这条路上绕不开的关卡。
2. 为什么CAD是AI落地的硬骨头
2.1 几何精度与语义鸿沟
先说一个最根本的矛盾。AI模型,尤其是深度学习那一套,擅长的是从模糊中找规律——你给它一万张猫的图片,它能学会识别猫。但CAD要的是从精确中保精确——一条线段的端点坐标是(100.0, 200.0),你预测成(100.1, 200.2),在屏幕上可能看不出差别,但到了装配环节,这就是干涉。
我见过一个团队做“AI自动标注尺寸”,模型在测试集上准确率92%,听起来不错对吧?但实际用的时候,工程师发现那8%的错误里,有一半是把基准标错了。基准一错,整个零件的公差链全废。这就是几何精度和工程语义之间的鸿沟:AI看到的是像素或点云,工程师看到的是“这个面是配合面,那个孔是定位孔”。
更麻烦的是,CAD图纸里大量的信息是隐含的。比如两条线看起来平行,但实际有0.01度的夹角;一个标注写着“Φ10 H7”,懂行的知道这是基孔制配合,不懂的就只看到一串字符。AI模型如果没有注入这些领域知识,学到的就只是“画线”而不是“设计”。
2.2 DWG/DXF格式的封闭性与碎片化
再来说数据格式。做AI+CAD,第一步就是读文件。DXF是Autodesk公开的交换格式,算是比较友好的,但DWG作为原生格式,其二进制结构并没有完全公开。虽然市面上有ODA(Open Design Alliance)这样的组织提供解析库,但版本碎片化极其严重:R12、R14、2000、2004、2007、2010、2013、2018……每个版本的内部结构都有差异。
我实测过用Python的ezdxf库读DXF,简单图形没问题,但遇到自定义实体(比如AutoCAD的ACAD_PROXY_ENTITY)就直接歇菜。而这些自定义实体在机械、建筑图纸里遍地都是——门窗、标注、填充图案,很多都是第三方插件生成的。你读不出来,后面的AI处理就无从谈起。
还有一个坑是编码问题。DXF文件里的文字可能用GBK、UTF-8、甚至ANSI编码,中文图纸尤其混乱。我遇到过一张图纸,图层名是乱码,但打开CAD看又是正常的,最后发现是文件头里的代码页声明和实际编码不一致。这种问题在Demo阶段根本不会暴露,因为Demo用的都是清洗过的标准数据。
2.3 工程约束的不可妥协性
最后说说工程约束。在互联网产品里,AI推荐错了,用户划走就行。但在CAD里,AI生成一个错误的倒角,可能导致整个零件报废。容错率极低,这是AI+CAD落地最硬的约束。
举个例子,做“AI根据草图生成三维模型”,Demo里展示的是画个圆就出来个圆柱,很酷。但实际工程中,草图可能包含欠约束或过约束的情况。欠约束时,AI可以自由发挥,但生成的结果可能不符合设计意图;过约束时,模型根本解不出来。更别提还有参数化关联——改了A尺寸,B、C、D要跟着变,这种联动关系AI很难自动推断。
所以我的判断是:AI在CAD里的角色,短期内只能是“副驾驶”,不能是“自动驾驶”。它可以帮你加速,但最终确认必须由工程师完成。任何试图完全替代工程师的Demo,都是在耍流氓。
3. 技术选型:从读图到生成的全链路拆解
3.1 图纸解析:DXF/DWG读取的几种路线
读图是第一步,也是决定后续所有工作的基础。目前主流路线有这么几条:
路线一:纯Python方案(ezdxf + matplotlib)
适合快速原型。ezdxf能解析大部分标准实体,配合matplotlib可以可视化。优点是轻量、跨平台、免费。缺点是遇到复杂实体就崩,而且性能一般,大图纸(几十MB)读起来很慢。
import ezdxf doc = ezdxf.readfile("drawing.dxf") msp = doc.modelspace() for entity in msp: if entity.dxftype() == "LINE": start = entity.dxf.start end = entity.dxf.end print(f"Line: {start} -> {end}")路线二:ODA Teigha/ODA Drawings SDK
这是工业级方案,能读DWG原生格式,支持所有实体类型。缺点是商业授权费用不低,而且C++接口对AI团队不太友好。很多CAD软件厂商(包括国内的中望、浩辰)底层都用ODA。
路线三:FreeCAD作为解析引擎
FreeCAD是开源CAD里生态最完整的,它的Part模块和Import模块能处理DXF/DWG(DWG需要额外配置ODA File Converter)。优势是开源免费,而且Python API很完善,可以直接在FreeCAD环境里做几何运算。
import FreeCAD import Import Import.insert("drawing.dxf", "Unnamed") doc = FreeCAD.ActiveDocument for obj in doc.Objects: print(obj.Shape)路线四:OpenCASCADE直接操作几何内核
如果你要做深度的几何处理(比如布尔运算、倒角、抽壳),OpenCASCADE(OCCT)是绕不开的。它提供了完整的B-Rep几何模型,但学习曲线陡峭。我见过一个团队用PythonOCC做“AI生成的特征与原始模型的布尔运算”,效果不错,但开发周期比预期长了三倍。
我的建议是:原型阶段用ezdxf+FreeCAD,生产阶段根据预算选ODA或OCCT。不要一上来就追求大而全,先把数据流跑通。
3.2 AI模型选型:不是越新越好
选模型这块,很多人容易陷入“追新”的误区。看到Transformer、Diffusion就想往上套,但CAD数据有它的特殊性。
对于二维图纸理解,我推荐从图神经网络(GNN)入手。把图纸里的线段、圆弧、标注当作图的节点和边,用GNN做关系推理。比如判断哪些线构成一个封闭轮廓,哪些标注属于同一个尺寸链。这比直接用CNN处理像素图要靠谱得多,因为CNN会丢失矢量信息。
对于三维重建,PointNet++或VoxelNet是常见选择,但要注意CAD模型是参数化的,不是简单的点云。更好的思路是用B-Rep表示,把面、边、顶点作为输入,用专门的B-Rep网络(如UV-Net、BRepNet)来学习。这类模型在ABC数据集上表现不错,但迁移到实际工程图纸上,还需要大量微调。
对于生成任务,比如“根据文字描述生成CAD草图”,Diffusion模型确实有优势,因为它能生成多样化的结果。但CAD需要的是确定性,所以生成后必须加一个约束求解器来修正。我试过用Stable Diffusion生成草图轮廓,再丢给FreeCAD的Sketcher加约束,效果勉强能用,但速度很慢。
提示:不要迷信SOTA。在CAD领域,一个调优过的传统算法(比如Hough变换检测直线)可能比一个庞大的深度学习模型更实用。先跑通流程,再考虑换模型。
3.3 几何内核:OpenCASCADE vs FreeCAD vs 商业内核
几何内核是CAD的“心脏”。AI生成的结果,最终要落到几何内核里做验证和运算。
OpenCASCADE(OCCT)是开源首选,功能全,但文档差、社区响应慢。我踩过的一个坑是:OCCT的布尔运算在遇到微小面或退化边时容易失败,而AI生成的几何恰恰经常有这些瑕疵。解决办法是在布尔运算前加一步几何清理(用ShapeFix模块),把容差内的点合并、把短边去掉。
FreeCAD本质上是OCCT的上层封装,Python接口友好,适合快速开发。但它的性能瓶颈很明显,处理复杂装配体时卡顿严重。如果你的场景是单零件,FreeCAD够用;如果是大装配,还是得用OCCT原生接口。
商业内核(如Parasolid、ACIS)稳定性和性能最好,但授权费高,而且AI团队通常拿不到底层API。除非你在大厂,否则不建议一开始就上商业内核。
我的实操建议:用FreeCAD做原型验证,用OCCT做生产部署。两者之间的迁移成本主要是API熟悉度,几何数据可以通过STEP格式互换。
4. 实操全流程:从一张DWG到AI可处理的数据
4.1 环境搭建与依赖安装
先列一下我常用的环境配置。操作系统用Ubuntu 22.04(Windows也行,但Linux下OCCT编译更方便),Python 3.10。
# 基础依赖 pip install ezdxf matplotlib numpy scipy pip install pythonocc-core # 需要conda环境,pip安装容易出问题 conda install -c conda-forge pythonocc-core # FreeCAD sudo apt install freecad # 或者用AppImage,避免依赖冲突如果你要用ODA,需要去官网下载SDK,然后编译C++绑定。这一步比较折腾,建议先用FreeCAD的ODA File Converter做格式转换,把DWG转成DXF,再用ezdxf读。
注意:FreeCAD的DWG导入依赖外部转换器,默认没装。在“编辑-首选项-导入-导出-DWG”里设置ODA File Converter的路径。没有的话,DWG文件会导入失败。
4.2 图纸清洗:把“脏数据”变成“干净数据”
实际工程图纸几乎没有干净的。我总结了一套清洗流程:
第一步:图层过滤。只保留需要的图层,把标注、图框、标题栏先剥离。这些信息对几何处理是噪声。
def filter_layers(doc, keep_layers): msp = doc.modelspace() entities = [e for e in msp if e.dxf.layer in keep_layers] return entities第二步:实体去重。AI生成的图纸或者多次复制粘贴的图纸,经常有重叠实体。两条完全一样的线段叠在一起,会导致后续轮廓识别出错。用ezdxf的audit功能可以检测部分问题,但重叠实体需要自己写逻辑:比较端点坐标,容差设0.001mm。
第三步:闭合轮廓提取。这是最关键的一步。把离散的线段、圆弧拼成封闭的多段线(Polyline)。我试过用shapely做多边形化,但CAD的圆弧不是直线段,直接转会有精度损失。更好的办法是用FreeCAD的Part.Wire,它能处理圆弧和样条曲线。
import Part edges = [Part.LineSegment(...), Part.Arc(...)] # 从DXF实体转换 wire = Part.Wire(edges) if wire.isClosed(): face = Part.Face(wire)第四步:坐标归一化。不同图纸的原点位置千奇百怪,有的在左下角,有的在图纸中心,有的甚至跑到很远的地方。统一把包围盒左下角移到原点,方便后续处理。
4.3 AI模型训练数据的制备
数据是AI的燃料。CAD领域没有ImageNet,你得自己造数据。
方案一:从公开数据集入手。ABC数据集(A Big CAD Model Dataset)包含100万个CAD模型,格式是STEP,可以转成DXF。但它主要是机械零件,建筑图纸很少。
方案二:合成数据。用FreeCAD的Python脚本批量生成参数化模型,然后随机改变参数,生成大量变体。比如生成1000个不同尺寸的法兰盘,每个都导出DXF。这种数据标注是自动的,因为参数已知。
import FreeCAD import Part for i in range(1000): radius = 10 + i * 0.1 height = 5 + i * 0.05 cylinder = Part.makeCylinder(radius, height) # 导出DXF Part.export([cylinder], f"flange_{i}.dxf")方案三:人工标注。最贵但最准。找有经验的工程师,把图纸里的关键特征(孔、槽、倒角)标出来。我参与过一个项目,标了500张图纸,花了两个月,但模型效果比合成数据好很多。
实操心得:合成数据用来预训练,人工标注用来微调。比例大概是10:1。纯合成数据训出来的模型,在实际图纸上泛化能力很差,因为合成数据太“干净”了。
4.4 从AI输出到CAD可编辑模型的转换
AI输出的是张量、点云或者参数序列,要变成CAD能编辑的模型,中间需要一个转换层。
如果是二维,把AI预测的线段端点、圆弧参数,用ezdxf写回DXF:
doc = ezdxf.new("R2010") msp = doc.modelspace() msp.add_line((0, 0), (100, 0)) msp.add_arc((50, 50), 25, 0, 90) doc.saveas("output.dxf")如果是三维,用OCCT的BRepBuilderAPI构建拓扑:
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire from OCC.Core.gp import gp_Pnt edge1 = BRepBuilderAPI_MakeEdge(gp_Pnt(0,0,0), gp_Pnt(100,0,0)).Edge() edge2 = BRepBuilderAPI_MakeEdge(gp_Pnt(100,0,0), gp_Pnt(100,100,0)).Edge() wire = BRepBuilderAPI_MakeWire(edge1, edge2).Wire()这一步的难点在于容差处理。AI预测的端点可能有微小偏差,直接构建拓扑会失败。我的做法是:先做点合并(距离小于0.01的点视为同一点),再做边缝合。
5. 踩坑实录:那些Demo不会告诉你的问题
5.1 常见报错与排查表
| 报错信息 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
ezdxf.DXFStructureError | 文件损坏或版本不兼容 | 用CAD软件打开看是否正常 | 用ODA转换器转成R2010格式 |
FreeCAD: ImportError: No module named Import | FreeCAD环境未正确初始化 | 检查Python路径 | 用FreeCAD自带的Python解释器 |
OCCT: BRep_API: command not done | 几何数据有退化边或微小面 | 用ShapeAnalysis检查 | 先做ShapeFix修复 |
MemoryError | 图纸太大,一次性加载爆内存 | 看文件大小和实体数 | 分块读取,或用流式解析 |
| 中文乱码 | 编码不一致 | 用十六进制查看文件头 | 手动指定编码,或用chardet检测 |
5.2 性能优化:大图纸怎么处理
一张建筑总图,可能几十MB,几十万个实体。直接全量加载,内存直接爆。我的优化策略:
空间索引。用R-tree或者四叉树,只加载当前视口范围内的实体。rtree库配合ezdxf可以做到。
from rtree import index idx = index.Index() for i, entity in enumerate(entities): bbox = entity.get_bbox() # 获取包围盒 idx.insert(i, bbox) # 查询某个区域 results = idx.intersection((xmin, ymin, xmax, ymax))多进程并行。把图纸按图层或区域切分,每个进程处理一块,最后合并结果。Python的multiprocessing配合ezdxf,速度能提升3-5倍。
GPU加速。如果AI模型是瓶颈,用CUDA或者TensorRT做推理加速。但要注意,CAD数据的预处理(比如点云采样)往往比模型推理更耗时,别只盯着模型优化。
5.3 精度与容差的平衡艺术
CAD里有个概念叫容差(Tolerance),就是允许的误差范围。AI模型输出的结果,容差设多少,直接决定成败。
设太小(比如0.0001mm),AI预测的微小偏差会导致几何运算失败;设太大(比如1mm),又可能把本该分开的特征合并了。我的经验值是:二维图纸用0.01mm,三维模型用0.1mm。这个值不是拍脑袋来的,是根据常见加工精度反推的——一般机加工能到0.01mm,3D打印能到0.1mm。
还有一个技巧是动态容差。在轮廓识别阶段用大容差(0.1mm),把大致形状先拼出来;在尺寸标注阶段用小容差(0.001mm),保证标注准确。分阶段处理,比一刀切要好。
6. 工具链与资源推荐
6.1 开源工具实测对比
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| ezdxf | 轻量、Pythonic、文档全 | 不支持DWG、复杂实体弱 | 快速原型、DXF处理 |
| FreeCAD | 开源、Python API完善 | 性能一般、DWG需转换 | 几何运算、原型验证 |
| OpenCASCADE | 功能最强、工业级 | 学习曲线陡、文档差 | 生产环境、复杂几何 |
| LibreCAD | 轻量CAD查看器 | 无编程接口 | 人工检查图纸 |
| ODA File Converter | DWG转DXF神器 | 免费版有功能限制 | 格式转换 |
6.2 学习路径与资料
如果你是新手,我建议这个顺序:
- 先学CAD基础。不用学到能画图,但要能看懂图纸。推荐《AutoCAD 2024从入门到精通》,重点看图层、标注、块这几章。
- 再学Python CAD库。
ezdxf的官方文档写得很好,跟着例子走一遍。然后看FreeCAD的Python脚本教程。 - 然后学几何内核。OCCT的官方文档比较晦涩,推荐看《OpenCASCADE Technology Explained》这本书,或者PythonOCC的示例代码。
- 最后学AI。如果已经有AI基础,直接看B-Rep相关的论文(UV-Net、BRepNet)。如果没有,先补深度学习基础,再往CAD方向靠。
提示:不要试图一次性学完所有东西。我见过太多人卡在OCCT的编译上就放弃了。先用ezdxf跑通一个“读取DXF-提取线段-可视化”的小流程,建立信心,再逐步深入。
6.3 专利与合规注意事项
做AI+CAD,尤其是涉及生成式AI,要注意专利风险。CAD模型本身可能涉及外观专利或实用新型专利,AI训练时如果用了受专利保护的模型,生成的结果可能有侵权风险。
我的建议是:训练数据尽量用开源数据集(如ABC、Thingi10K),或者自己生成的合成数据。如果要用企业内部的图纸,确保有授权,并且做去标识化处理——把标题栏、图号、公司logo这些信息抹掉。
另外,AI生成的CAD模型,其知识产权归属目前法律上还不明确。如果是商业项目,最好在合同里写清楚。
7. 我对AI+CAD落地的一些真实体会
做了这几年,我最大的体会是:AI+CAD的难点不在AI,在CAD。很多AI团队技术很强,但对CAD的理解太浅,做出来的东西工程师一看就摇头。反过来,CAD团队懂工程,但不懂AI,也不知道怎么把需求翻译成模型能理解的任务。
所以落地成功的关键,是两边的人能坐在一张桌子上,用同一种语言说话。AI工程师要学一点CAD基础,知道什么是B-Rep、什么是约束、什么是公差;CAD工程师要学一点AI基础,知道模型能做什么、不能做什么、需要什么数据。
还有一个体会是:不要追求全自动。我见过最成功的AI+CAD项目,都是“人机协作”模式——AI做初稿,工程师做审核和修改。这样既提高了效率,又保证了质量。那些号称“一键生成”的,基本都死在演示阶段。
最后说一个具体的技巧:从最简单的任务开始。比如“AI自动识别图纸里的孔”,这个任务定义清晰、数据容易标注、效果容易验证。做成了,再往“AI自动生成装配体”这种复杂任务推进。别一上来就搞大新闻,容易翻车。
这个方向后续还可以这样扩展:把AI和参数化设计结合起来,让AI不仅生成几何,还生成设计意图。比如AI画了一个孔,同时标注“这个孔是用于M6螺栓的过孔,公差H12”。这样工程师拿到的不只是一堆线条,而是一个有工程语义的模型。这条路更难,但价值也更大。