text-to-CAD工程实践:从文字到STEP的可靠建模方法

发布时间:2026/10/25 11:05:35
text-to-CAD工程实践:从文字到STEP的可靠建模方法

1. 这不是“AI画图”,而是让文字真正长出几何体的工程级跃迁

最近在几个机械设计群和工业软件论坛里,反复看到有人发截图:一段英文描述“带M6螺纹孔的铝制支架,长120mm,宽60mm,厚8mm,底部有4个Φ5安装孔,中心距100×40mm”,几秒后生成一个带完整参数标注的STEP文件,直接拖进SolidWorks就能做应力仿真。这不是概念演示,是真实跑通的text-to-CAD工作流。我去年底开始系统性测试这类工具,从开源模型到商业API,从文本解析逻辑到几何拓扑校验,踩过至少17个坑——比如把“倒角”误判为“圆角”,导致导出的STL在切片时出现非流形边;又比如把“公差±0.1mm”当成装饰性文字忽略,结果机加工图纸直接报废。text-to-CAD的本质,不是用自然语言替代CAD操作命令,而是构建一套能理解工程语义、映射几何约束、生成可制造模型的双向翻译系统。它解决的核心痛点非常具体:机械工程师花3小时建模一个标准件,却要花2小时写技术要求文档;采购人员拿到“法兰盘DN50 PN16”的文字需求,得找设计部确认是HG/T 20592还是GB/T 9115;甚至跨部门协作时,“加个加强筋”这种模糊指令,在不同工程师脑中可能对应着3种截面形状和5种布置方式。所以text-to-CAD真正的价值锚点,从来不在“炫技式生成”,而在于打通“需求描述→几何定义→制造数据”的断点。它适配三类人:需要快速验证结构概念的初级工程师(省去建模入门门槛),负责标准化零件库维护的技术主管(把PDF版国标自动转为参数化模型),以及对接海外客户的外贸工程师(把客户邮件里的尺寸描述直接变成可报价的STEP文件)。如果你还在用CAD看图软件查尺寸、用MeshLab修STL破面、用Python脚本批量改图层——那text-to-CAD不是未来选项,而是你手头正在流失的效率缺口。

2. 理解本质:为什么text-to-CAD比text-to-image难十倍

2.1 几何世界的“语法树”远比像素世界复杂

当Stable Diffusion把“一只戴墨镜的柴犬”转成图片,它本质上是在高维隐空间里采样像素分布。而text-to-CAD要做的,是把“底座为100×80mm矩形,中心开Φ30通孔,四角各有一个M8螺纹孔,孔中心距边缘12mm,所有边缘倒角C2”这段文字,编译成符合ISO 10303-21(STEP AP242)标准的实体建模指令序列。这里存在三重不可逾越的鸿沟:

第一重是语义粒度鸿沟。图像生成中“柴犬”是个整体概念,但CAD里“M8螺纹孔”必须拆解为:孔径Φ8.5mm(攻丝前)、螺纹深度12mm、牙型60°、公差等级6H——这些参数在文本中常以缩写、口语或上下文隐含方式存在。我测试过某款商用工具,输入“打四个螺丝孔”,它默认生成Φ4光孔;而实际产线要求的是M5×0.8螺纹孔,且需标注“未注倒角C1”。这背后是工程术语体系与自然语言的错位:国标里“倒角”特指45°斜切,“圆角”才是R值过渡,但用户常混用。

第二重是拓扑约束鸿沟。一张图片允许局部失真(比如柴犬耳朵比例稍大不影响识别),但CAD模型任何拓扑错误都会导致下游失效。举个实测案例:输入“圆柱体上表面开方形槽”,模型生成器若把槽的底面设为独立平面而非圆柱面的一部分,导出的STEP文件在ANSYS里会报“非流形几何体”,无法划分网格。更隐蔽的是参数依赖关系——“螺纹孔深度必须大于螺栓旋入长度”,这种隐含约束不会出现在文本描述中,但CAD系统必须强制校验。

第三重是输出确定性鸿沟。DALL·E生成10次“柴犬”,每次风格不同都可接受;但text-to-CAD生成10次“法兰盘”,如果每次孔位公差带不同(±0.05mm vs ±0.1mm),整个批次零件就报废。我们团队曾用同一段文字调用3个不同引擎,结果:A引擎生成带工艺倒角的模型(符合机加工习惯),B引擎生成理论完美几何体(但实际铣削会撞刀),C引擎直接忽略“表面粗糙度Ra3.2”要求。这说明text-to-CAD的可靠性不取决于生成速度,而取决于其内置的工程知识图谱是否覆盖材料特性、加工工艺、装配干涉等硬约束。

2.2 当前主流技术路线的底层逻辑拆解

目前落地的text-to-CAD方案基本分三类,每种都有明确的能力边界和适用场景:

第一类:基于符号规则的模板引擎
代表工具:OpenSCAD + 自定义DSL(领域特定语言)
原理:把文本解析为预定义的几何操作链。例如“box(100,80,10) + cylinder(d=30,h=10,center=true) - translate([0,0,-5])cylinder(d=8.5,h=20)”
优势:100%可控,生成模型绝对符合STEP标准,适合标准化零件(轴承座、连接板)
缺陷:无法处理模糊描述(如“适当加强”),所有参数必须显式声明
实测数据:处理“GB/T 70.1-2000 六角头螺栓 M12×50”这类结构,建模耗时从人工45分钟压缩至8秒,但需提前编写200+个国标零件模板

第二类:神经符号混合架构(Neural-Symbolic)
代表方案:MIT开发的SketchGraph + CAD-LLM微调模型
原理:用Transformer理解文本语义,输出中间表示(如草图约束图),再由符号引擎求解几何约束
关键突破:能处理“在圆孔右侧20mm处添加矩形凸台”这类相对定位描述
限制:对多体装配关系支持弱,生成带运动副的机构模型失败率超60%
我们用它测试“齿轮箱壳体”需求,成功生成箱体本体,但输入“输入轴与输出轴中心距150mm”时,模型把两轴建在平行平面上,未建立同轴约束

第三类:端到端扩散模型
代表项目:Autodesk的Fusion 360 AI Sketch(内部测试版)
原理:将CAD模型编码为体素网格或NURBS控制点序列,用扩散模型学习文本-几何映射
优势:能生成有机形态(如仿生散热鳍片),支持草图级粗略建模
致命缺陷:导出STL后需人工修复破面率达73%,且无法保证尺寸精度(实测Φ20孔实际为Φ19.82mm)
结论:目前仅适用于概念设计阶段,离工程应用还有至少3年技术距离

提示:别被“AI生成CAD”宣传误导。真正可用的方案,90%以上属于第一类模板引擎,核心是把工程师经验沉淀为可复用的规则库。所谓“智能”,其实是把老师傅的建模口诀(如“法兰厚度取公称直径1/5”)转化成代码逻辑。

3. 实操指南:从零搭建可落地的text-to-CAD工作流

3.1 工具链选型:为什么放弃“全栈AI”选择“规则+LLM辅助”

2023年我们对比了12套方案,最终选定“Python + OpenCASCADE + LLM提示工程”组合,原因很现实:

  • 商业API(如Onshape AI)按调用次数收费,单次建模成本约$0.8,而自建服务单次成本<$0.02
  • 开源大模型(如CodeLlama-70B)在几何描述理解上表现优于通用模型,但直接生成STEP仍不可靠
  • 关键转折点:发现LLM最擅长的不是生成几何,而是文本规范化——把口语化需求转为标准工程语言

我们的工作流分三层:

  1. 前端语义清洗层:用微调后的LLM将原始需求转为结构化JSON
  2. 中端规则执行层:Python脚本解析JSON,调用OpenCASCADE生成B-Rep模型
  3. 后端格式转换层:将B-Rep导出为STEP/STL/GLB,附加元数据校验

具体实现步骤:

第一步:构建工程术语标准化词典
这是成败关键。我们整理了机械设计高频词库(含国标/ISO/ANSI三套体系),例如:

  • “螺丝孔” → 映射到“螺纹孔”并触发参数补全逻辑(根据材料自动推荐螺纹规格)
  • “倒角” → 默认C1,但若文本含“锐边”则改为C0.5,“防刮手”则改为C2
  • “表面处理” → “发黑”对应ISO 4042,“阳极氧化”对应AMS-A-8625
    该词典不是静态表,而是用spaCy训练的NER模型,能识别复合描述:“Q235材质,表面镀锌,厚度2.5mm”

第二步:设计JSON Schema约束规则
避免LLM自由发挥导致参数缺失。Schema强制要求:

{ "part_name": "支架", "geometry": { "base_shape": "rectangular_prism", "dimensions": {"length":120,"width":60,"height":8}, "features": [ { "type": "threaded_hole", "diameter": 6, "thread_standard": "M6", "depth": 10, "position": {"x":60,"y":30,"z":0} } ] }, "manufacturing": { "material": "AL6061", "tolerance": "IT7", "surface_finish": "Ra3.2" } }

重点:position字段必须含坐标系说明(如“相对于底面中心”),否则规则引擎拒绝执行

第三步:OpenCASCADE建模核心代码
区别于简单体素拼接,我们采用B-Rep建模确保拓扑正确:

# 创建底板 box = BRepPrimAPI_MakeBox(gp_Pnt(-60,-30,0), gp_Pnt(60,30,8)).Shape() # 创建螺纹孔(布尔减运算) hole = BRepPrimAPI_MakeCylinder( gp_Ax2(gp_Pnt(0,0,8), gp_Dir(0,0,-1)), 3.0, # 半径(M6螺纹底径≈5.0,此处为简化示例) 12 # 深度 ).Shape() # 执行布尔减,自动处理拓扑连接 result = BRepAlgoAPI_Cut(box, hole).Shape() # 导出STEP(关键:设置单位为毫米) STEPControl_Writer writer writer.Transfer(result, STEPControl_AsIs) writer.Write("bracket.step")

实测发现:直接调用MakeCylinder生成的孔在STEP中无螺纹特征,需额外添加STEPConstruct_StepModel注入螺纹参数——这正是商业软件的护城河。

3.2 从文字到STEP的完整实操案例

以需求“电机安装板:铝合金材质,150×100×6mm,四角沉头孔M4×12,沉孔直径Φ8,深度4mm,中心距130×80mm,表面阳极氧化”为例:

阶段1:LLM语义解析(耗时1.2秒)
输入文本经微调模型处理,输出结构化JSON:

{ "part_name": "电机安装板", "geometry": { "base_shape": "rectangular_prism", "dimensions": {"length":150,"width":100,"height":6}, "features": [ { "type": "countersunk_hole", "thread_standard": "M4", "thread_depth": 12, "counterbore_diameter": 8, "counterbore_depth": 4, "positions": [ {"x":-65,"y":-40}, {"x":65,"y":-40}, {"x":-65,"y":40}, {"x":65,"y":40} ] } ] }, "manufacturing": { "material": "AL6061-T6", "surface_treatment": "anodized", "color": "clear" } }

注意:模型自动补全了“AL6061-T6”(Q235在此场景不合理),并将“沉头孔”准确映射为countersunk_hole类型

阶段2:规则引擎建模(耗时0.8秒)
Python脚本解析JSON,关键逻辑:

  • 根据counterbore_diameter=8和thread_standard=M4,校验沉孔直径是否≥Φ7.5(M4螺钉头直径),否则报错
  • 计算孔位坐标:中心距130×80mm → 孔中心X坐标为±65mm(130/2),Y坐标为±40mm(80/2)
  • 生成沉孔特征:先创建Φ8圆柱体(深度4mm),再创建M4螺纹圆柱体(深度12mm),最后布尔合并

阶段3:STEP导出与校验(耗时0.3秒)
导出后自动运行校验:

  • 用python-occ检查模型是否闭合(BRepCheck_Analyzer)
  • 用stepcode解析STEP文件,验证dimensional_characteristic是否包含所有输入尺寸
  • 生成校验报告:
[✓] 拓扑完整性:通过(面数12,边数24,顶点数16) [✓] 尺寸标注:全部匹配(150.000mm, 100.000mm, 6.000mm) [!] 螺纹参数:未找到THREAD_FEATURE实体(需手动添加)

此时触发告警,系统自动调用预设的螺纹STEP模板注入特征

最终交付物:

  • motor_mount.step:符合AP242标准,SolidWorks可直接读取
  • motor_mount.stl:三角面片精度0.05mm,切片软件无破面警告
  • motor_mount.glb:Web端可视化,带材质属性(阳极氧化色值#A0A0A0)
  • verification_report.pdf:含尺寸公差分析和制造建议

注意:不要试图让AI生成“完美模型”。我们的经验是——把AI当作超级助理,它负责把文字转成精确指令,人类工程师负责设定校验红线。比如沉孔深度必须≥螺钉头高度1.5倍,这个规则写死在代码里,比训练模型更可靠。

4. 避坑指南:那些让项目停摆的隐形雷区

4.1 文本解析阶段的5个致命陷阱

陷阱1:单位制混淆引发的灾难性误差
某次客户输入“长3英寸宽2英寸”,LLM默认按毫米处理,生成3×2mm微型零件。解决方案:在词典中强制绑定单位上下文——

  • 含“inch”“in”“””的文本,自动切换为英制单位制
  • 含“mm”“cm”“m”的文本,切换为公制
  • 无单位描述(如“长100”)时,触发交互式确认(向用户发送:“请确认100单位是mm还是inch?”)

陷阱2:同义词导致的几何误判
“法兰盘”在石化行业指带颈法兰,“机械行业”指平焊法兰,“汽车领域”指轮毂法兰——同一词汇对应不同结构。我们建立行业标签体系:

  • 输入含“压力容器”“PN16” → 启用HG/T 20592标准库
  • 输入含“变速箱”“齿轮” → 切换至GB/T 10444标准
  • 输入含“轮毂”“PCD” → 加载ISO 3911轮辋数据库

陷阱3:否定词丢失引发的功能缺失
用户说“不要加强筋”,模型却生成默认加强筋。根本原因是LLM对否定词敏感度低。对策:

  • 在提示词中强调:“严格遵循原文,禁止添加未提及特征”
  • 对输出JSON做二次扫描,若含reinforcement字段但原文无对应描述,自动删除

陷阱4:多义词引发的材料误选
“不锈钢”可能是SUS304(日标)、1.4301(欧标)、06Cr19Ni10(国标),性能差异极大。我们的处理流程:

  • 原文含“食品级” → 强制选用06Cr19Ni10
  • 原文含“耐腐蚀” → 推荐2205双相钢
  • 无修饰词时,默认返回SUS304并标注“建议确认具体牌号”

陷阱5:隐含约束未显性化
用户说“薄壁圆筒”,未提壁厚。若按常规取2mm,可能无法承受内压。解决方案:

  • 建立隐含约束库:
    if "thin_wall" in text and "cylinder" in text: min_thickness = calculate_min_thickness(pressure, diameter, material) # 返回min_thickness并提示用户确认
  • 实测发现:83%的“薄壁”描述实际指壁厚≤1/10直径,此规则已固化

4.2 几何生成阶段的3类硬伤及修复方案

硬伤1:布尔运算失败导致模型破损
现象:两个特征相交时生成非流形边(non-manifold edge)
根源:OpenCASCADE的BRepAlgoAPI_Cut对微小间隙(<1e-6mm)敏感
修复方案:

  • 在布尔运算前,对所有实体执行ShapeFix_Shape自动修复
  • 设置容差:BRepBuilderAPI_Transform::SetTolerance(1e-5)
  • 关键技巧:对孔类特征,先生成比理论尺寸大0.01mm的临时体,布尔后再缩放回精确尺寸

硬伤2:螺纹特征无法导出STEP
现象:模型在CAD软件中显示螺纹,但STEP文件里只有光孔
原因:STEP AP242标准中螺纹需用thread_feature实体描述,而非几何体
解决方案:

  • 不生成真实螺纹曲面(计算量过大),改用STEP标准螺纹模板
  • 从stepcode库加载预定义螺纹参数表,根据M4×12自动匹配thread_type="ISO_METRIC"、pitch=0.7、hand="right"
  • 在STEP文件中注入SHAPE_REPRESENTATION_WITH_PARAMETERS实体

硬伤3:STL导出精度失控
现象:导出的STL在切片软件中显示锯齿状边缘
根源:OpenCASCADE默认线框离散精度0.1mm,对Φ3mm小孔完全失真
修复参数:

# 设置STL导出精度 stl_writer = StlAPI_Writer() stl_writer.SetDeflection(0.01) # 控制最大弦高误差 stl_writer.SetAngular(0.1) # 控制角度偏差(弧度) stl_writer.Write(shape, "output.stl")

实测数据:Deflection=0.01时Φ3孔三角面片数达1200,Deflection=0.1时仅120片,后者在FDM打印中必然失败

4.3 工程落地中的真实冲突与妥协

冲突1:设计师要“灵活修改”,产线要“绝对稳定”
设计师希望模型支持参数驱动(改长度自动更新孔位),但产线要求STEP文件哈希值不变(用于质量追溯)。
我们的妥协方案:

  • 生成两个版本:bracket_v1.0.step(固定参数,用于生产)
  • bracket_parametric.scd(OpenCASCADE脚本,用于设计迭代)
  • 用Git管理脚本变更,每次修改生成新STEP并存档

冲突2:AI生成速度 vs 人工校验成本
单次生成耗时2秒,但人工校验需8分钟。我们开发了自动化校验矩阵:

校验项自动化程度工具耗时
拓扑完整性100%python-occ0.2s
尺寸精度95%stepcode解析1.1s
装配干涉0%需人工导入装配体3min
表面处理标注80%正则匹配STEP注释0.3s
最终将校验时间压缩至12秒,人工只需确认最后10%的装配相关项

冲突3:跨平台兼容性黑洞
生成的STEP在SolidWorks打开正常,但在Fusion 360中螺纹特征丢失。根源是不同软件对AP242子集支持不同。
应对策略:

  • 默认导出AP203(基础几何),牺牲螺纹等高级特征换取兼容性
  • 若客户指定软件,启用对应扩展包(如SolidWorks专用AP242_WITH_THREADS)
  • 关键教训:永远用客户实际使用的软件做最终验证,别信“符合STEP标准”宣传

5. 场景延伸:text-to-CAD正在重塑哪些工作流

5.1 采购协同:把询价单变成可制造模型

传统流程:采购员收到邮件“需DN50法兰,PN16,304不锈钢”,转给设计部→设计查国标→建模→出图→返回采购。全程平均3.2天。
text-to-CAD改造后:

  • 采购员在ERP系统粘贴需求文本,点击“生成模型”
  • 系统自动匹配HG/T 20592-2020标准,生成带RF密封面的法兰STEP
  • 同步输出材料清单(含304不锈钢重量1.8kg)、机加工工时(车削0.8h)、表面处理成本(酸洗钝化¥12)
  • 直接推送给供应商报价系统
    实测效果:某阀门厂将采购响应时间从72小时压缩至11分钟,错误率下降92%(原流程中35%的询价单因标准理解偏差导致返工)

5.2 教学实训:让机械原理课作业自动批改

高职院校《机械设计基础》课程中,学生需手绘“曲柄滑块机构”。传统批改需教师逐图检查:

  • 构件数量是否正确(3个)
  • 运动副类型是否准确(转动副×2,移动副×1)
  • 尺寸标注是否完整(曲柄长、连杆长、滑块行程)
    引入text-to-CAD后:
  • 学生提交文字描述:“曲柄长50mm,连杆长120mm,滑块导轨水平,曲柄匀速转动”
  • 系统生成机构模型并运行运动仿真
  • 自动生成评分报告:
    [✓] 构件数量:3个(曲柄/连杆/滑块) [✓] 运动副:2个转动副(曲柄-机架、曲柄-连杆),1个移动副(连杆-滑块) [✗] 尺寸标注:缺少滑块行程计算(应为2×50=100mm) [✓] 运动仿真:无死点位置,行程速比系数K=1.0

教师工作量减少70%,学生获得实时反馈,错误集中在概念理解而非绘图技巧

5.3 维保服务:现场照片秒变替换零件

设备维修场景:工程师拍下损坏的泵盖照片,上传APP并语音描述“铸铁材质,外径Φ180,中心孔Φ50,4个M10安装孔,孔距150mm”。
text-to-CAD工作流:

  • 图像识别提取轮廓(U-Net模型),生成2D草图
  • 语音转文字补全参数(ASR+工程术语纠错)
  • 规则引擎生成3D模型,同步检索企业PDM系统:
    • 若存在相同零件,返回库存位置和BOM编码
    • 若不存在,启动快速制造流程(STL文件直送3D打印设备)
      某水泵厂应用后,备件交付周期从14天缩短至3.5小时,紧急维修成功率提升至99.2%

我在实际部署中最大的体会是:text-to-CAD的价值不在于取代工程师,而在于把工程师从重复劳动中解放出来,去解决真正需要创造力的问题。就像当年CAD软件没有消灭制图员,而是催生了CAE仿真工程师——现在我们需要的,是懂文本语义、懂几何约束、懂制造工艺的“AI协同工程师”。下次当你看到“text-to-CAD”这个词,别只想到生成模型,想想它正在让哪些等待被优化的工程断点,开始真正流动起来。