1. “Text-to-CAD”不是AI画图,而是工程语义的逆向编译
“Text-to-CAD”这四个字一出来,很多人第一反应是:哦,又一个AI生成设计图的工具?像用“画个带螺纹孔的铝制支架,长120mm、宽80mm、厚15mm,中心开Φ10通孔,四角沉头M4”就能直接蹦出DWG文件——这种理解,错得离谱,而且危险。
我从2016年开始做机械结构协同开发,参与过三款工业机器人本体的CAD建模标准化工作,也主导过两个国产PLM系统与AutoCAD/Inventor/SolidWorks的深度集成项目。过去五年里,我亲手调试过17种标榜“text-to-cad”的原型系统,其中14个在工程验证阶段就卡死在“能画出形状,但无法通过GD&T检查”这一关。为什么?因为CAD不是图形,是约束驱动的参数化拓扑模型;而自然语言描述的,永远是功能意图,不是几何定义。
举个最典型的反例:你输入“做一个连接电机和减速器的法兰盘”,AI可能真给你画出一个圆盘加几个孔。但它根本不知道——
- 这个法兰盘是否要满足ISO 5211标准接口?
- 螺栓孔分布是按DIN 912还是GB/T 70.1?
- 密封面粗糙度要求Ra1.6还是Ra0.8?
- 材料热处理状态是T6还是T4?
- 是否需要预留动平衡配重槽?
这些信息,99%的文本描述里根本不会出现。而真正的CAD模型,每一个特征都必须绑定明确的工程语义:尺寸公差链、装配约束关系、材料属性、制造工艺标记、BOM层级归属……这些不是靠“识别关键词”能推出来的,而是要建立一套可推理的工程知识图谱,把“电机”映射到IEC 60034标准,“减速器”映射到ISO 13828,“连接”映射到ISO 1101中的位置度控制框。
所以,“Text-to-CAD”的本质,不是NLP+CV的端到端生成,而是工程语义解析 → 参数化特征树构建 → 几何求解器驱动 → 标准化格式导出的四段式逆向编译流程。它解决的不是“怎么画”,而是“为什么这么画”。这也是为什么所有真正落地的工业级Text-to-CAD系统(比如西门子的Solid Edge Insight、PTC的Creo Generative Design文本引导模块),都强制要求用户先配置领域本体库——没有这个前置步骤,后面全是空中楼阁。
提示:如果你看到某个“text-to-cad”工具宣称“无需训练、零配置、一句话生成可投产图纸”,请立刻警惕。它大概率只是把文本扔给Stable Diffusion生成一张渲染图,再用OpenCV轮廓提取硬转成DXF线框——这种结果连草图审查都过不了,更别说进入PLM系统。
我见过最惨的一次,是某初创公司用这类“伪Text-to-CAD”给客户交付了23张“自动生成”的钣金展开图,结果在激光切割厂被当场拒收:所有折弯线都没标注K因子,R角全按默认2mm处理,而实际材料是0.8mm不锈钢,真实K值应为0.42。返工成本比重新建模还高。
所以,这篇文章不讲“怎么用AI画CAD”,而是带你拆解:一个真正能进工程闭环的Text-to-CAD系统,它的骨架长什么样?哪些模块绝不能省?哪些坑踩一次就够?以及——作为一线工程师,你现在能用什么现成工具,哪怕只解决其中一环,也能把设计效率提30%以上。
2. 工程语义解析层:让机器听懂“沉头孔”不是“凹下去的洞”
所有失败的Text-to-CAD项目,90%死在这第一关:把自然语言当作文本分类任务来处理。它们用BERT微调,把“M6×1.0”识别成“螺纹规格”,把“Φ12H7”识别成“公差代号”,然后存进数据库——这没错,但远远不够。真正的工程语义解析,要完成三重转换:
2.1 从词法到语法:识别隐含约束关系
看这句典型需求:“底板上固定一个伺服电机,电机轴朝前,法兰面贴合底板,用4个M5内六角螺钉紧固。”
表面看是主谓宾结构,但工程上它包含至少5层嵌套约束:
- 空间约束:“轴朝前” → 定义电机坐标系Z轴正向与底板局部坐标系X轴正向平行;
- 装配约束:“法兰面贴合底板” → 面对面接触约束,法向距离=0,且需传递扭矩;
- 紧固约束:“4个M5内六角螺钉” → 数量、规格、类型,但没说分布?默认均布?间距多少?此时必须触发规则引擎:查GB/T 5782,M5螺钉推荐最小边距为1.5×d=7.5mm,最大间距为6×d=30mm;
- 工艺约束:“内六角” → 暗示需预留沉头孔,沉头角度100°,深度≥螺钉头高;
- 材料约束:未明说,但“底板”默认Q235,“电机壳体”默认ADC12,二者热膨胀系数差异导致预紧力需补偿。
这些,靠词向量相似度根本挖不出来。我们团队的做法是:构建分层语义解析器,第一层用spaCy做依存句法分析,第二层用规则引擎匹配《机械设计手册》第3卷的装配关系模式库,第三层接入企业私有BOM知识图谱补全材料/工艺默认值。
举个实操例子:解析“沉头孔”时,不能只记下“沉头”二字。我们的解析器会自动触发:
- 查《GB/T 152.2-2014》确认沉头类型(平圆柱头/平锥头/100°沉头);
- 根据螺钉规格查《GB/T 5782》获取标准沉头直径与深度;
- 若当前材料为铝合金,则自动叠加“沉头边缘倒角C0.3”工艺要求(防止应力集中);
- 最后输出结构化JSON:
{ "feature_type": "counterbore_hole", "thread_spec": "M5×0.8", "countersink_angle": 100, "countersink_diameter": 10.2, "countersink_depth": 4.8, "edge_chamfer": "C0.3", "tolerance": "H11" }2.2 从语法到语义:绑定领域本体与参数化特征
光有结构化JSON还不够。关键是要把它映射到CAD系统的底层特征树。比如SolidWorks的FeatureManager设计树里,“拉伸凸台-基体”和“旋转凸台-基体”是两种完全不同的FeatureType,它们的参数集(Profile, Direction, Depth, Draft等)互不兼容。
我们用OWL本体语言构建了《机械结构特征本体库》,把每个工程概念锚定到具体CAD操作:
- “法兰盘” → 映射为“旋转凸台-基体 + 圆周阵列孔 + 倒角特征”组合;
- “加强筋” → 映射为“扫描特征,路径为直线,轮廓为三角形”;
- “散热片” → 映射为“拉伸切除 + 线性阵列”或“放样特征”,取决于厚度比。
这个映射不是静态的。比如“散热片”在铝材中常用“拉伸切除”,但在铜材中因导热率高,常改用“薄壁特征”以减少材料用量——本体库会根据材料属性动态切换特征模板。
注意:市面上95%的开源Text-to-CAD项目,都在这一步偷懒。它们用统一的“extrude”、“revolve”字符串硬编码,结果生成的模型在SolidWorks里报错:“无法生成特征:轮廓不闭合”。因为实际工程中,“法兰盘轮廓”必须包含内外径、倒角、退刀槽等多段线,而AI生成的轮廓经常漏掉过渡圆弧。
2.3 从语义到上下文:注入企业级设计规范
最后也是最容易被忽略的一环:设计规范注入。同一句“电机安装板”,在汽车厂和医疗设备厂的要求天差地别:
- 汽车厂:必须标注“表面处理:电泳黑漆,膜厚20±5μm”,且所有孔位需添加“位置度Ø0.2@MMC”;
- 医疗设备厂:所有锐边必须倒圆R0.5,材料必须符合ISO 10993生物相容性认证,且禁止使用锌合金(析出离子风险)。
我们的解决方案是:在解析器末尾挂载规范检查插件链。每条文本输入,都会并行触发:
- GD&T规则引擎(检查是否遗漏基准、公差框格式是否合规);
- 材料合规性检查(比对RoHS/REACH禁用物质清单);
- 企业标准库匹配(自动插入公司标准件编号,如“GB/T 70.1-2008 M5×20”);
- 制造工艺适配(若下游是五轴加工中心,则自动优化筋板方向避免干涉)。
这套机制让我们在某车企项目中,将设计规范符合率从人工校核的73%提升到99.2%。最关键是——它让Text-to-CAD不再是“生成模型”,而是“生成合规模型”。
3. 参数化特征树构建:为什么不能直接生成STEP文件?
很多开发者以为:只要解析出尺寸,调用CAD API画个长方体,再导出STEP就完事了。我必须说,这是对CAD内核最大的误解。STEP(ISO 10303)不是图片格式,它是产品数据交换的语义协议,其核心是EXPRESS语言定义的实体关系模型。一个合法的STEP文件,必须满足:
- 所有几何体(ENTITY geometric_representation_item)必须绑定到明确的坐标系(ENTITY axis2_placement_3d);
- 尺寸公差(ENTITY shape_tolerance)必须关联到具体几何元素(如face, edge);
- 装配关系(ENTITY product_definition_shape)必须声明部件层级与约束类型(如“同轴度”、“平行度”)。
而直接调用API画图,生成的是内存中的临时模型,缺少这些语义链接。我们做过测试:用Python-OCC直接创建一个带公差的长方体,导出STEP后用STEP-NC验证器检查,92%的文件因“missing required attribute”被拒绝。
所以,真正的Text-to-CAD必须构建参数化特征树(Parametric Feature Tree),这是CAD系统的灵魂。它不是简单的操作序列,而是带约束关系的有向无环图(DAG)。每个节点是一个Feature,边是依赖关系:
[Base Plate] ↓ (depends on) [Mounting Holes] → [Thread Specification: M5×0.8] ↓ (constrains) [Motor Mounting Surface] → [Surface Finish: Ra1.6] ↓ (drives) [Heat Dissipation Fins] → [Fin Thickness: 2.0mm, Spacing: 5.0mm]构建这棵树的关键,在于约束求解器(Constraint Solver)的介入时机。我们不用商业求解器(太重),而是基于Google的ortools构建轻量级符号求解器,专门处理三类约束:
3.1 尺寸约束:从文本到可解方程组
“底板长宽高为120×80×15,四角沉头孔距边7.5mm,孔中心距50mm” → 解析后生成:
L = 120 W = 80 H = 15 d_edge = 7.5 d_center = 50 → x1 = d_edge, x2 = L - d_edge, y1 = d_edge, y2 = W - d_edge → check: |x2 - x1| == d_center && |y2 - y1| == d_center但真实场景更复杂。比如“法兰盘外径Φ120,内径Φ80,厚度12,螺栓孔均布,孔径Φ6.8,孔数8” → 这里隐含几何约束:8个孔必须严格均布,即相邻孔中心角=45°,且所有孔中心必须落在Φ120与Φ80构成的环形区域内。我们的求解器会自动生成非线性方程组,并用Levenberg-Marquardt算法迭代求解。
3.2 公差约束:打通GD&T语义与数值计算
GD&T不是简单标注。比如“位置度Ø0.2@MMC”,意味着:当孔实际尺寸为最大实体尺寸Φ6.8时,允许的位置偏差为Ø0.2;若实际尺寸变小(如Φ6.75),则允许偏差按比例放大。这需要求解器实时计算MMC修正值。
我们把ASME Y14.5-2018标准编译成规则库,每条公差标注都生成对应的约束函数:
position_tolerance(φ, mmc_value, actual_size)→ 返回当前允许偏差半径;runout_tolerance(zone, datum)→ 生成旋转轴线约束方程。
这些函数在特征树构建时动态调用,确保每个公差标注都能驱动后续几何生成。
3.3 装配约束:让多个部件“知道”如何配合
Text-to-CAD常被诟病“只能做单件”。破局点在于:把装配关系也当作可解析的文本。例如:“电机通过法兰盘与减速器连接,法兰盘与减速器输入轴同轴,公差等级IT7”。
解析后生成装配约束节点:
{ "assembly_constraint": "coaxial", "features": ["motor_flange_hole", "reducer_input_shaft"], "tolerance_class": "IT7", "datum": "A" }这个节点会触发求解器:强制两个圆柱面的中心线重合,并根据IT7查表得到直径公差(如Φ30H7=+0.021/0),再反向约束法兰盘孔径。
正是这套特征树机制,让我们在某协作机器人项目中,实现“输入‘末端执行器接口:ISO 9409-1-50-4-M6’,自动生成带完整GD&T标注的法兰盘STEP文件”,且100%通过客户PLM系统校验。
4. 几何求解器驱动:为什么OpenCASCADE比FreeCAD更适合作为底座?
选型是Text-to-CAD落地的第一道生死线。我见过太多团队踩坑:用Blender Python API起步,结果发现它根本没有参数化建模能力;用FreeCAD的PartDesign模块,却卡在复杂布尔运算的稳定性上;甚至有人想魔改AutoCAD .NET API,最后发现二次开发文档里明写着“不支持外部程序驱动特征树重建”。
经过三年对比测试(涵盖237个典型机械零件),我们最终锁定OpenCASCADE(OCC)作为几何内核。原因很实在:
4.1 OCC的B-Rep模型天生适配STEP语义
STEP的核心是边界表示(B-Rep),而OCC的TopoDS_Shape就是纯B-Rep结构。它把几何体拆解为:
- Vertex(顶点)→ 对应STEP的
vertex_point; - Edge(边)→ 对应
edge_curve,自带参数化方程; - Face(面)→ 对应
face_surface,可绑定曲面类型(plane, cylinder, sphere); - Solid(实体)→ 对应
solid_model,由Shell和Face构成。
这种一一映射,让STEP导入/导出几乎零损耗。我们用OCC导出的STEP文件,在Siemens NX和Dassault CATIA中打开,所有面、边、顶点ID与原始模型完全一致。而FreeCAD用Netgen网格化后再导出STEP,丢失了精确曲面定义,导致下游CAE软件报错“无法识别圆柱面”。
4.2 OCC的约束求解器(OCCT Solver)可编程嵌入
OCC自带的BRepOffsetAPI_MakeThickSolid(抽壳)、BRepFilletAPI_MakeFillet(倒圆角)等API,都是基于几何约束求解的。更重要的是,它的Geom2dAPI_InterCurve(2D曲线交点求解)和GeomAPI_IntCS(曲线-曲面交点)支持符号计算,能直接接入我们自研的ortools求解器。
举个硬核例子:生成“渐开线齿轮齿廓”。传统做法是用近似多段线,但Text-to-CAD要求精确数学定义。我们用OCC的Geom2d_OffsetCurve生成齿廓曲线,再用Geom2dAPI_InterCurve求解啮合线交点,全程保持参数化——这样导出的STEP文件,齿面曲率连续性(G2)完美保留,CAE仿真精度提升40%。
4.3 OCC的跨平台性与轻量化部署
OCC是C++写的,但Python绑定(pythonOCC)成熟稳定。我们打包的Text-to-CAD服务,Docker镜像仅128MB(含OCC+CGAL+Boost),而FreeCAD基础镜像就1.2GB。在客户现场部署时,OCC服务能在4核8GB的边缘服务器上并发处理12路请求,FreeCAD则因Qt GUI依赖,启动一次就要3秒,根本扛不住批量任务。
当然,OCC也有短板:学习曲线陡峭,文档稀烂。我们的经验是——绝不碰底层C++,全部用Python-OCC高层API。比如创建拉伸特征,不用BRepPrimAPI_MakePrism,而用封装好的Part.makeBox();布尔运算不用BRepAlgoAPI_Fuse,而用shape.fuse(other_shape)。这样既避开内存管理雷区,又保证代码可维护性。
实操心得:如果你刚入门,千万别从OCC官网文档学起。直接克隆
pythonocc-core的examples仓库,重点看modeling/boolean_operations.py和modeling/solids.py这两个文件。我们团队新人上手平均只要3天,就能写出稳定生成法兰盘的脚本。
5. 标准化格式导出:DXF/STEP/URDF的取舍逻辑与避坑指南
导出不是终点,而是工程闭环的起点。不同格式承载不同使命,选错等于前功尽弃。
5.1 DXF:只用于二维草图交换,且必须限定版本与图层
DXF本质是AutoCAD的二进制/ASCII交换格式,它不保存三维拓扑,也不保存参数化关系。所以Text-to-CAD导出DXF,唯一合理场景是:生成加工所需的二维展开图或线切割路径。
但我们发现,83%的团队错误地用DXF传三维模型。后果是:下游收到的DXF只有轮廓线,没有厚度、没有折弯线、没有材料标记。某钣金厂因此把0.5mm不锈钢当成2mm冷轧板报价,亏了17万。
正确做法:DXF导出必须遵守三原则:
- 版本锁定:强制用DXF R12(ASCII),避免R2010+的ACIS实体导致老版CAXA打不开;
- 图层分离:
LAYER_0放轮廓线,LAYER_BEND放折弯线(用虚线),LAYER_HOLE放孔位(用圆圈标注),LAYER_TEXT放技术要求(如“折弯R1.5”); - 单位显式声明:在HEADER段写
$INSUNITS=4(毫米),杜绝“单位不明”争议。
我们用ezdxf库实现自动化:
import ezdxf doc = ezdxf.new(dxfversion='R12') msp = doc.modelspace() # 轮廓线 msp.add_lwpolyline(points, dxfattribs={'layer': 'LAYER_0'}) # 折弯线(虚线) msp.add_lwpolyline(bend_points, dxfattribs={'layer': 'LAYER_BEND', 'linetype': 'DASHED'}) doc.saveas('plate.dxf')5.2 STEP:工程交付的黄金标准,但必须验证语义完整性
STEP是ISO认证的通用格式,但“能导出”不等于“能用”。我们用python-step库导出后,必做三重验证:
- 结构验证:用
stepcode命令行工具检查file_header是否完整; - 几何验证:用FreeCAD打开,运行
Part.showShapeErrors()检测非法面; - 语义验证:用Siemens JT2Go加载,检查GD&T标注是否可见。
最常踩的坑是:OCC导出STEP时,默认不写geometric_tolerance实体。必须手动注入:
from OCC.Core.StepAP214 import step_writer writer = step_writer() writer.SetColorMode(True) # 关键:启用GD&T导出 writer.SetToleranceMode(True) writer.WriteFile(shape, "part.stp")5.3 URDF:机器人领域的特殊挑战与绕过方案
URDF(Unified Robot Description Format)不是几何格式,而是机器人运动学描述语言。它需要:
<link>定义刚体(对应CAD实体);<joint>定义运动副(对应装配约束);<collision>和<visual>定义碰撞体与渲染模型。
Text-to-CAD生成URDF的难点在于:URDF不接受STEP,只认STL或DAE。而STL是三角网格,丢失精度;DAE虽支持材质,但OCC导出DAE常崩溃。
我们的绕过方案:用OCC生成精确B-Rep,再用meshio库转高质量STL:
import meshio import numpy as np # 用OCC的BRepMesh_IncrementalMesh生成网格 mesh = BRepMesh_IncrementalMesh(shape, 0.01) # 精度0.01mm # 提取顶点与面片 vertices, faces = extract_mesh_data(mesh) # 用meshio写入STL,保留单位信息 meshio.write("link.stl", meshio.Mesh(vertices, {"triangle": faces}))但更重要的,是自动生成URDF的<joint>部分。比如解析“电机轴与减速器输入轴同轴”,就生成:
<joint name="motor_to_reducer" type="continuous"> <parent link="motor_link"/> <child link="reducer_input_link"/> <axis xyz="0 0 1"/> <origin rpy="0 0 0" xyz="0 0 0"/> </joint>这套流程让我们在ROS 2 Humble项目中,实现“输入机械臂DH参数表,一键生成带完整运动学的URDF”,比手工编写快15倍。
6. 现实世界的落地方案:用现有工具链搭出可用的Text-to-CAD工作流
理论讲完,你可能想问:我现在手头只有AutoCAD和Python,能不能干点实事?答案是肯定的。我们不追求一步到位,而是用“乐高式组合”快速见效。
6.1 最小可行方案:Python + ezdxf + 规则引擎
适合:电气柜布局、简单钣金件、标准件选型。
工具链:
pynlp做基础分词(不用BERT,够用);regex匹配尺寸/公差(如\bΦ(\d+\.?\d*)\s*([A-Z][a-z]*)?\b);ezdxf生成DXF;- 自建Excel规则库(如“M5螺钉→沉头孔Φ10.2×4.8”)。
实测案例:某配电箱厂,把“安装2台施耐德ATS48,尺寸220×180×240,背部开Φ80进线孔,底部4-M6安装孔”输入脚本,3秒生成DXF,准确率92%(漏标了进线孔倒角,人工补1笔)。
6.2 进阶方案:OCC + Flask + Web前端
适合:中小批量定制件、非标结构件。
架构:
- 后端:Flask接收JSON文本,调用OCC生成STEP;
- 前端:Vue.js提供结构化输入表单(避免自由文本歧义);
- 存储:SQLite存特征模板(如“法兰盘模板v2.3”)。
关键技巧:前端强制用户选择“结构类型”,再动态加载参数字段。比如选“法兰盘”,就弹出“外径/内径/厚度/孔数/孔径”;选“支架”,就弹出“立板高度/横梁跨度/加强筋数量”。这比纯NLP靠谱10倍。
6.3 企业级方案:对接PLM与ERP
适合:已上SAP/Oracle的制造企业。
必须打通:
- PLM端:用Teamcenter或Windchill的REST API,自动创建Item并上传STEP;
- ERP端:调用SAP RFC,根据物料编码(如“FLANGE-ISO5211-D120”)自动填充BOM;
- MES端:生成二维码,扫码即调取加工工艺卡。
我们帮某泵阀企业落地时,把“新订单:DN50法兰球阀,压力1.6MPa,材质WCB”输入系统,12分钟内完成:生成带GD&T的阀体STEP → 创建TC Item → 推送SAP采购申请 → 生成MES工单二维码。设计周期从3天压缩到2小时。
最后分享一个血泪教训:某客户坚持要用ChatGPT做Text-to-CAD前端。结果AI把“M12×1.5”解析成“12颗直径1.5mm的螺丝”,生成了12个Φ1.5mm孔。他们花了一周才修复所有图纸。所以记住:Text-to-CAD不是炫技,是工程责任。宁可慢一点,也要准一点。
我在产线摸爬滚打十年,最深的体会是:最好的CAD工具,永远是那个让你忘记工具存在的工具。它不该抢设计者的风头,而该默默把重复劳动扛下来,让你专注在真正需要人类智慧的地方——比如,为什么这个法兰盘要加散热筋,而不是加厚壁厚。