ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

text-to-cad 实战:从自然语言到参数化 CAD 模型的完整工程链路

text-to-cad 实战:从自然语言到参数化 CAD 模型的完整工程链路 1. 从一句话到三维模型text-to-cad 到底在解决什么问题把一句自然语言描述直接变成可用的 CAD 模型这件事在几年前还只存在于论文里。现在你打开任何一个 AI 编程工具输入“生成一个长宽高 100x60x40mm、壁厚 3mm、四角带 M4 沉头孔安装位的钣金外壳”几秒钟后就能拿到一段可渲染的几何代码——这就是text-to-cad正在做的事。它的核心链路其实不复杂自然语言 → 结构化参数 → 几何内核脚本 → 标准格式文件。但真正落地时会发现每一步都有大量工程细节需要处理。比如“四角带 M4 沉头孔”这句话模型需要理解沉头孔的标准尺寸M4 沉头孔通常头部直径 8mm、沉头角度 90°还要知道孔位应该距离边缘多少一般取板厚的 2 倍或至少 6mm这些隐含知识如果不在提示词或后处理里补全生成的模型就是废的。这篇文章面向三类人一是想用 AI 加速原型设计的硬件工程师二是需要批量生成参数化模型的工艺人员三是想把 CAD 能力集成到自己工具链里的开发者。我会把 text-to-cad 的完整实现路径拆开讲清楚包括几何内核选型、提示词工程、格式导出STEP、URDF、G-code、以及实际踩过的坑。读完你至少能自己搭一条可用的生成流水线而不是停留在“让 AI 画个方块”的玩具阶段。提示text-to-cad 不是要替代 CAD 工程师它替代的是“重复性建模劳动”。理解这一点你才不会在工具选型上走弯路。2. 核心架构拆解为什么是“代码生成”而不是“直接建模”2.1 两条技术路线的本质区别目前 text-to-cad 的实现大致分两派。一派是直接生成网格用扩散模型或点云生成网络直接输出 STL 或 OBJ 网格另一派是生成几何脚本让大模型输出 CadQuery、OpenSCAD 或 build123d 的代码再由几何内核执行得到 B-rep 实体。我实测下来直接生成网格的路线在“看起来像”这件事上表现不错但一旦你要修改尺寸、加个孔、导出 STEP基本就废了。因为网格没有参数化信息也没有拓扑关系后续根本没法做特征编辑。而代码生成路线虽然对提示词要求更高但生成的模型是真正的参数化实体可以导出 STEP、可以改参数重新执行、可以导入 URDF 做仿真。所以如果你做的是工程用途代码生成路线是唯一选择。直接生成网格那套更适合游戏资产或视觉展示不在本文讨论范围内。2.2 几何内核选型CadQuery vs OpenSCAD vs build123d选哪个内核直接决定了你后续的能力边界。我列一个实际对比表内核底层输出格式参数化能力学习曲线适合场景OpenSCADCSGSTL、OFF、DXF强低简单结构、快速验证CadQueryOCCTSTEP、STL、DXF极强中工程零件、装配体build123dOCCTSTEP、STL极强中高复杂特征、Python 原生FreeCAD 脚本OCCTSTEP、IGES强高已有 FreeCAD 工作流OpenSCAD 的优势是语法简单大模型生成准确率高但它只有 CSG构造实体几何做圆角、倒角、复杂曲面很吃力。CadQuery 基于 OCCTOpen CASCADE Technology能输出真正的 STEP 文件支持完整的 B-rep 操作是目前 text-to-cad 项目里用得最多的内核。我个人的选择是CadQuery 为主OpenSCAD 为辅。简单零件用 OpenSCAD 快速出结果需要 STEP 导出或复杂特征的用 CadQuery。build123d 虽然更现代但大模型对它的训练数据相对少生成准确率还不如 CadQuery 稳定。2.3 大模型输出代码的可靠性问题这里有个很多人忽略的点大模型生成的 CadQuery 代码经常有 API 幻觉。比如它会写出cq.Workplane(XY).box(100, 60, 40).fillet(3)这种代码但fillet在 CadQuery 里需要先选中边直接调用会报错。再比如它会混用 CadQuery 2.x 和 1.x 的 API导致运行失败。解决办法不是换更大的模型而是建立代码校验和自动修复层。我的做法是生成代码后先在沙箱里执行捕获异常把错误信息回传给模型让它自我修复最多重试 3 次。实测这个策略能把首次生成的成功率从 40% 左右提升到 85% 以上。注意不要让模型直接生成最终代码就完事一定要有执行验证环节。没有验证的 text-to-cad 流水线产出全是“看起来对但跑不通”的废代码。3. 提示词工程怎么把一句话变成可执行的几何参数3.1 提示词的结构化模板直接丢一句“帮我画个盒子”给模型出来的东西基本不能用。我总结了一个结构化模板把提示词分成五个部分几何类型明确是拉伸体、旋转体、扫掠体还是装配体关键尺寸长宽高、直径、壁厚、孔径全部带单位和数值特征列表孔、槽、圆角、倒角、螺纹逐项列出坐标系约定原点在哪、Z 轴朝哪、基准面是哪个输出要求目标格式STEP/STL/URDF、单位制mm/inch、精度举个例子同样是“一个带孔的板”好的提示词是这样的生成一个矩形板 - 尺寸120mm x 80mm x 6mm - 原点位于板底面中心Z轴向上 - 四角各有一个 M5 通孔孔中心距边缘 10mm - 所有外边缘倒角 R2 - 输出 STEP 格式单位 mm这样模型生成的代码基本一次就能跑通。而“画个带孔的板”这种提示词你得到的可能是任意尺寸、任意孔位、任意格式的东西。3.2 隐含工程知识的补全策略自然语言里大量信息是省略的。用户说“M4 沉头孔”他不会告诉你沉头孔的标准尺寸。这时候有两种补全方式一是在提示词模板里预置标准件库二是让模型自己查表。我推荐预置标准件库的方式。具体做法是维护一个 JSON 文件里面存常用标准件的参数{ M4_flat_head: { hole_diameter: 4.5, head_diameter: 8.0, head_angle: 90, head_height: 2.5 }, M5_socket_head: { hole_diameter: 5.5, head_diameter: 9.5, head_height: 5.0 } }生成代码前先用规则引擎把“M4 沉头孔”替换成具体参数再交给模型生成几何代码。这样既保证了准确性又减少了对模型“记忆力”的依赖。3.3 多轮对话中的参数继承实际使用中用户不会一次把需求说全。常见的情况是“先画个底板” → “厚度改成 8mm” → “再加四个安装孔”。如果每轮都重新生成完整代码很容易丢失之前的上下文。我的处理方式是维护一个参数状态机。每轮对话只更新变化的参数几何代码基于最新参数集重新生成。这样即使用户改了十次尺寸最终模型始终是一致的。实现上可以用一个字典存所有参数每次生成前把字典序列化成提示词的一部分。实操心得参数状态机要记录每个参数的来源用户指定还是默认值这样当用户说“恢复默认”时你知道该恢复什么。我一开始没做这个结果用户改了几轮之后想回退只能全部重来。4. 从代码到文件STEP、URDF、G-code 导出实操4.1 STEP 导出与常见坑CadQuery 导出 STEP 就一行代码cq.exporters.export(result, output.step)但实际用的时候有几个坑。第一单位问题。CadQuery 默认单位是 mm但有些下游软件比如某些老版本 SolidWorks读 STEP 时会按 inch 解析导致模型放大 25.4 倍。解决办法是在导出时显式设置单位或者在文件头里写清楚。第二装配体导出。如果你生成的是多个零件的装配体直接 export 只会导出第一个实体。需要先用cq.Assembly把零件组装起来再导出。装配约束同心、贴合、距离也要在代码里定义好否则导出的 STEP 里零件位置全是乱的。第三精度设置。STEP 导出有线性精度和角度精度两个参数默认值对大多数零件够用但如果你做的是光学件或精密配合件需要调高精度。代价是文件体积会变大。4.2 URDF 导出从 CAD 到仿真URDFUnified Robot Description Format是机器人仿真的标准格式。把 text-to-cad 生成的模型导出成 URDF可以直接导入 CoppeliaSim、Gazebo 等仿真环境。这里的关键是关节定义。CAD 模型本身只有几何信息没有运动学关系。你需要在生成代码时额外定义每个关节的类型旋转、平移、固定、轴向、限位。我的做法是在提示词里加一段关节描述关节定义 - joint1: 旋转关节绕Z轴范围 -180° 到 180° - joint2: 平移关节沿X轴范围 0 到 50mm - 其余连接为固定关节然后生成代码时同时输出几何和 URDF 的 XML 片段。注意 URDF 里的惯性矩阵需要根据几何形状和材料密度计算不能随便填。我一般用 CadQuery 算出体积乘以密度得到质量再用简化公式估算转动惯量。4.3 G-code 生成从模型到加工路径如果你生成模型的目的是 3D 打印或 CNC 加工就需要导出 G-code。这一步通常不在 text-to-cad 的直接链路里而是把生成的 STL 丢给切片软件Cura、PrusaSlicer或 CAM 软件处理。但有些场景下你希望直接生成 G-code比如简单的 2D 轮廓切割或钻孔路径。这时候可以用 Python 的pygcode库或者直接写 G-code 生成器。关键参数包括进给速度、主轴转速、刀具直径、安全高度、切削深度。这些参数如果让大模型直接生成出错率很高建议用模板加参数替换的方式。注意G-code 生成涉及实际加工安全参数错误可能导致断刀或撞机。我的做法是生成的 G-code 先在仿真软件里跑一遍确认路径无误再上机。5. 常见问题与排查技巧实录5.1 模型生成失败的高频原因我把实际遇到过的失败案例整理成了一张速查表现象可能原因排查方法解决方案代码执行报 API 错误模型用了不存在的 API看报错行号查 CadQuery 文档回传错误让模型修复生成的实体为空布尔运算顺序错误打印中间结果体积调整 union/cut 顺序圆角失败圆角半径大于相邻边检查圆角处几何尺寸减小半径或改倒角STEP 导入后尺寸不对单位不一致测量导入后模型尺寸导出时显式设单位装配体零件重叠约束定义错误逐个检查零件位置重新定义装配约束URDF 导入仿真后抖动惯性矩阵不合理检查质量和惯量值按实际材料重算5.2 大模型代码幻觉的应对前面提过 API 幻觉的问题这里展开说。最常见的幻觉有三种一是调用不存在的方法比如Workplane.circle()在 CadQuery 里其实是Workplane.circle()没错但Workplane.cylinder()就不存在应该用Workplane.cylinder()或者Workplane.extrude()。二是参数顺序搞错比如box(length, width, height)和box(width, length, height)在某些版本里含义不同。三是混用不同版本的 API。应对策略是建立 API 白名单。把 CadQuery 常用 API 整理成一个列表生成代码后检查所有调用的方法是否在白名单里。不在的就标记出来让模型重新生成。这个白名单不需要覆盖全部 API覆盖 80% 常用操作就够了。5.3 性能优化批量生成时的资源管理如果你要批量生成几百个模型性能会成为问题。OCCT 内核是单线程的每个模型生成都要几秒到几十秒。我的优化经验是用多进程而不是多线程因为 OCCT 不释放 GIL把模型生成和文件导出分开先生成所有模型对象再统一导出对于相似模型复用几何内核的上下文减少初始化开销设置超时机制单个模型超过 60 秒直接跳过避免卡死整个队列实测下来8 核机器上批量生成 100 个中等复杂度零件优化前要 15 分钟优化后能压到 4 分钟左右。实操心得批量生成时一定要加日志记录每个模型的生成时间、成功失败、错误信息。不然出了问题你根本不知道是哪个环节卡的。我用的是 Python 的 logging 模块输出到文件加控制台双通道。6. 工具链集成把 text-to-cad 接入现有工作流6.1 与 FreeCAD 的集成FreeCAD 本身支持 Python 脚本可以把 text-to-cad 生成的代码直接在里面执行。具体做法是写一个 FreeCAD 宏接收自然语言输入调用大模型生成 CadQuery 代码执行后把结果添加到当前文档。这样你既享受了 AI 生成的便利又能在 FreeCAD 里继续手动编辑。需要注意的是 FreeCAD 内置的 Python 环境可能缺少 CadQuery 依赖需要手动安装。我一般用 FreeCAD 的插件管理器装 CadQuery 插件或者直接在系统 Python 里装好 CadQuery然后让 FreeCAD 用系统 Python。6.2 与 CoppeliaSim 的联动CoppeliaSim原 V-REP支持导入 URDF所以 text-to-cad 生成的 URDF 可以直接拖进去。但导入后经常发现模型比例不对或者关节方向反了。这时候需要检查 URDF 里的origin标签确认每个 link 和 joint 的坐标系定义是否正确。我的经验是在生成 URDF 时把所有 link 的坐标系都定义在几何中心joint 的坐标系定义在旋转轴上。这样导入 CoppeliaSim 后基本不需要调整。如果关节方向反了改axis标签的符号就行。6.3 版本管理与可复现性text-to-cad 的产出物包括提示词、生成的代码、参数集、最终文件。这四样东西必须一起版本管理否则你永远复现不出三个月前生成的那个模型。我的做法是用 Git 管理整个项目目录每次生成创建一个新分支提交信息里写清楚提示词和参数。生成的代码和文件都提交进去。这样任何时候都能 checkout 到历史版本重新执行代码得到相同结果。提示几何内核的版本也要记录。CadQuery 2.2 和 2.3 生成的同一个模型可能有细微差异不记录版本号的话复现时会对不上。7. 实际项目中的经验与建议7.1 从简单零件开始逐步增加复杂度我见过很多人一上来就想让 AI 生成复杂的装配体结果挫败感很强。正确的做法是先从最简单的拉伸体开始确认整条链路跑通再逐步加特征。比如第一阶段生成一个指定尺寸的方块导出 STEP 第二阶段加圆角、倒角 第三阶段加孔、槽 第四阶段多零件装配 第五阶段导出 URDF 做仿真每个阶段都验证通过后再进入下一阶段。这样出问题时容易定位也不会因为一次引入太多变量而崩溃。7.2 建立自己的提示词库和代码模板用得多了你会发现很多提示词和代码片段是重复的。比如“四角安装孔”这个特征几乎每个板类零件都会用到。把这些常用特征做成模板生成时直接引用既提高速度又保证一致性。我的模板库分三层最底层是标准特征孔、圆角、倒角中间层是常用零件板、轴、法兰最上层是完整产品外壳、支架、夹具。每层都可以被上层继承和覆盖参数。7.3 人工审核不可省略不管 AI 生成得多么流畅最终模型一定要人工审核。我审核的重点是关键尺寸是否正确、特征位置是否合理、有没有干涉、能不能加工出来。特别是涉及配合的尺寸差 0.1mm 可能就装不上。审核通过后再导出最终文件。如果直接拿 AI 生成的模型去加工出问题的概率很高。我自己的流程是AI 生成 → 人工审核 → 修改参数 → 重新生成 → 再次审核 → 导出。7.4 关于精度和公差的处理自然语言里很少会提到公差。用户说“直径 10mm 的孔”他不会说“直径 10mm H7 公差”。但实际加工时公差决定了配合性质。我的处理方式是在提示词模板里加一个公差选项默认用中等精度比如孔 H8、轴 h7用户有特殊要求时再指定。导出 STEP 时公差信息不会体现在几何里但可以在文件名或伴随的 JSON 文件里记录。这样下游拿到文件时知道该按什么精度加工。8. 后续扩展方向text-to-cad 这条链路跑通之后可以往几个方向扩展。一是反向工程给一张手绘草图或照片识别出几何特征再生成模型。二是参数优化给定目标和约束让 AI 自动调整参数找到最优解。三是多模态输入结合语音、手势、草图等多种输入方式。我现在正在做的是把 text-to-cad 和 3D 打印切片流程打通生成模型后自动切片、生成 G-code、发送到打印机。整个流程从一句话到开始打印目前能压到 5 分钟以内。当然中间还有人工审核环节完全无人值守还不现实但效率提升已经非常明显了。最后分享一个小技巧如果你用的是 CadQuery在生成代码时让模型加上cq.exporters.export(result, debug.stl)这行每次生成后先导出 STL 快速预览确认形状对了再导出 STEP。STL 导出比 STEP 快很多能节省不少等待时间。
返回列表