1. 一句话背后的建模痛点:text-to-cad到底在解决什么
我最近把text-to-cad这条技术链路从论文到开源实现、再到商业产品完整趟了一遍,最大的感受是:这个方向被严重低估了,也被严重误读了。大多数人以为text-to-cad就是"AI替设计师画图",喊一嗓子"帮我画个扳手",软件就给你吐出一个扳手模型。实际接触下来你会发现,它真正解决的不是"画图"本身,而是从想法到可编辑CAD文件之间那条又臭又长的流程——尤其是对非专业建模人员来说。
先说一个我自己的例子。以前我想验证一个机械结构的装配方案,脑袋里构思得很清楚:底板、四个支撑柱、顶部法兰,法兰上六个等分孔。但要把这个想法变成能丢进仿真软件里的模型,我得打开CAD工具,画草图、定义约束、拉伸、打孔、倒角,一套流程下来最快也要四十多分钟,中间还得反复调整尺寸。如果我用的是OpenSCAD这类程序化建模工具,情况好一些,但前提是我必须对相关语法足够熟练。而text-to-cad的思路是:把"用鼠标/代码描述几何"这件事,替换成"用自然语言描述意图"。模型负责把意图翻译成合法的建模指令,再由建模内核执行,最后输出一个真正可编辑的CAD文件。
这条思路的价值,只有亲手跑通一遍才能真正理解。它不是替代专业设计师,而是把"能想清楚零件长什么样"和"能把零件建出来"这两件事解耦了。工厂里的工艺工程师、创客、机械专业的学生,甚至做3D打印的普通爱好者,都可以用自然语言跨过建模软件的门槛。这也是我决定写这篇文章的原因,我会从原理、工具选型、实操链路、踩坑记录四个维度,把我实际测试的结果和心得完整摆出来,给想上手的人一条能直接复现的路径。
2. 先拆原理:为什么大语言模型能输出CAD文件
在动手之前,我建议你先理解这套东西背后的逻辑。如果不懂原理,你会在调试提示词的时候一头雾水——为什么有时候一句话就能出模型,有时候同一句话翻来覆去就是报错。
2.1 地基是程序化建模,不是人工智能凭空画几何
很多人误会了text-to-cad的核心。它并不是让AI像人一样在三维空间里"捏"模型,而是让AI去生成一段能描述模型的程序。这段程序运行之后,由建模内核真正执行布尔运算、拉伸、旋转等操作,最终产出几何体。
这里就得提到两个基础概念:CSG(构造实体几何)和程序化建模。
CSG的意思是把复杂几何体看成简单几何体(立方体、圆柱、球体)通过并集、差集、交集组合出来的结果。比如一个带孔的法兰盘,可以理解为一个大圆柱体减去一个小圆柱体,再和几个小圆柱体做并集。这种描述方式非常符合"给人看的指令"。
而程序化建模,就是用代码把CSG操作按顺序写出来。典型代表是OpenSCAD,它的语法类似编程语言,你可以写变量、写循环、写条件判断。另一个更接近工业级的是CadQuery,它基于Python,内置了面向机械设计的建模操作——拉伸、扫掠、倒角、开孔,而且生成的是**边界表示(B-rep)**模型,也就是CAD工业标准的实体模型表达方式,能被FreeCAD、SolidWorks等专业软件直接编辑。
text-to-cad的大致链路是这样的:
- 用户输入自然语言描述,比如"一个直径100mm、厚度20mm的圆形法兰,中心有直径30mm的孔,周围均布6个直径10mm的安装孔"。
- 大语言模型把这句话解析成建模代码——这一步是核心中的核心,考验模型对几何关系、尺寸标注、建模API的掌握程度。
- 建模内核执行代码,生成三维实体。
- 导出为标准CAD格式(STEP、STL、DXF等)。
所以本质上,text-to-cad解决的是"自然语言到建模代码"的翻译问题,而不是直接重塑了一个"AI建模内核"。这个认知非常重要,它决定了你对工具上限的判断:只要你用的底层建模内核支持的功能足够多,AI理论上就能通过代码调用这些功能。反过来,如果目标CAD格式本身不支持某种几何表达,AI写出花来也没用。
2.2 语言模型在中间扮演的角色:翻译官而非建筑师
真正接触大模型API之后,你会发现一个事实:语言模型本身根本不理解"法兰盘""直径""均布孔"这些词的几何意义。它只是在大规模代码和文档数据上训练过,学会了"当用户说XXX时,对应的CadQuery/OpenSCAD代码往往是这样的"这种统计规律。
这意味着两件事。
第一,代码生成的准确性取决于训练数据覆盖度。如果某个建模API在训练语料里出现次数少,模型就很容易生成错误的函数名、错误的参数顺序。这也是为什么在text-to-cad任务上,有些模型表现好、有些模型表现差——差别不是"聪明不聪明",而是有没有见过足够的CAD代码样本。
第二,提示词的结构化程度直接影响成功率。我自己实测过,同样一个需求,用"帮我画个法兰"这种口语化描述,和用"用CadQuery生成一个法兰盘:外径100mm、内径30mm、厚度20mm、6个直径10mm的安装孔均匀分布在直径70mm的螺栓圆上"这种结构化描述,模型的成功率差了一倍不止。原因很简单,大模型擅长做"格式转换",你把需求拆成明确的参数列表,它翻译成代码的时候就有清晰的约束条件。
所以,text-to-cad绝不是"随便说话就能建模"。它更接近一种受限自然语言交互——你需要学会用模型的"语言习惯"去描述几何。这个技巧我后面会在实操部分详细说。
3. 现有工具与选型:两条本质上不同的技术路线
我在调研的时候发现,市面上的text-to-cad相关工具经常被混为一谈,其实它们分属两条完全不同的技术路线。搞清楚它们的区别,你才知道什么场景该用什么。
3.1 路线一:LLM直接生成参数化建模代码
这是目前最成熟、最实用的一条路线。大语言模型直接输出OpenSCAD、CadQuery或FreeCAD宏的代码,然后由本地CAD内核执行。
代表工具有:
| 工具 | 底层建模库 | 特点 | 适合人群 |
|---|---|---|---|
| Zoo Text-to-CAD | CadQuery内核 | 在线服务,专门针对CadQuery微调过模型,可以直接生成可下载的STEP文件,参数化可改 | 想开箱即用的工程师/爱好者 |
| LLM + OpenSCAD | OpenSCAD | 通用大模型就能做,门槛最低,但复杂模型靠语法硬写,调试成本高 | 熟悉编程、愿意折腾的玩家 |
| LLM + CadQuery | CadQuery | 生成的是工业级B-rep实体,后续能在FreeCAD里改参数,可编辑性最好 | 有Python基础、需要真实工程文件的用户 |
这条路线最大的优势是可编辑性。因为最终产物是代码,你随时可以让AI"把厚度改成30mm"或者"把6个孔改成8个孔",本质上是修改参数后重新生成。这在设计迭代阶段简直是降维打击——传统建模改一处设计可能要把相关特征全部重做,代码建模改一个变量就完事。
3.2 路线二:专用生成模型直接输出几何体
这条路线更"AI原教旨",用深度学习模型直接从文本生成三维几何,常见做法是把文字描述编码成条件向量,再通过扩散模型或隐式场生成体素、点云或者网格,最后转换成CAD可用的格式。
代表方向包括一些论文级的项目,比如用CLIP文本编码器做条件的点云生成、基于扩散模型的三维生成等。我实测下来,这条路线目前的成熟度还不太够,原因在于:
- 生成的几何体精度很难达到机械设计的公差要求,毫米级误差在视觉demo里看不出来,放到装配里就是灾难;
- 输出格式多为网格(Mesh/STL),而不是参数化实体,你没法在专业CAD软件里编辑特征树;
- 复杂结构的可控性差,你没法精确指定"这个孔直径必须12.5mm"——生成模型是概率性的,不是参数性的。
我的判断是:短期两三年内,实际能落地的text-to-cad工作流几乎都是路线一。路线二代表未来方向,但现阶段更适合当demo看,不太适合真的用来做产品设计。
3.3 选型结论:我最终跑通的组合
我最终选择的是LLM + CadQuery的组合,配合通用大模型的API来生成代码。选择理由有三:
- CadQuery生成的B-rep模型能被FreeCAD直接打开,打开之后特征树完整,可以用鼠标继续编辑,这是OpenSCAD做不到的——OpenSCAD是CSG网格,进SolidWorks会变成"死"模型;
- CadQuery的API是为机械设计定制的,像
.holes()、.fillet()、.edges()这些方法的语义非常贴近工程师的表达习惯,大模型反而更容易生成正确的调用逻辑; - Python生态方便,我可以写脚本批量处理、参数化生成系列零件,甚至接到自动化流程里。
如果你完全不想写代码,只想快速出一个能看的模型,那Zoo Text-to-CAD这种在线工具体验确实更好,它有专门的提示词优化,对口语化描述容错率更高。但我个人建议,如果你真想靠这个技能吃饭,一定要学会CadQuery这条链路——它能做的事情上限高得多。
4. 手把手复现一条text-to-cad实操链路
下面这部分是我踩了无数坑之后总结出的可复现流程,每一步都经过了实际验证。我用"带法兰的底座支架"作为完整示例,从环境搭建讲到最终导出STEP文件。
4.1 环境准备:两步装好CadQuery
CadQuery的安装比很多人想象中简单,有Python环境就行。我在Ubuntu 22.04和Windows 11上各测了一遍,都能正常跑通。
# 创建一个干净的虚拟环境,避免依赖冲突 python -m venv cadenv source cadenv/bin/activate # Windows下用 cadenv\Scripts\activate # 安装CadQuery pip install cadquery # 验证安装 python -c "import cadquery; print(cadquery.__version__)"装完之后你可以顺手装一个FreeCAD,用来打开生成的STEP做可视化检查。如果你不想装全量FreeCAD,CadQuery也内置了基于CQ-editor的可视化工具,但体验和完整CAD软件还是差一些。
4.2 核心实操:让LLM生成CadQuery代码
环境好了之后,我用GPT-4o调用自然语言生成了一段CadQuery代码,需求描述是:
用CadQuery生成一个底座支架模型。底座是150mm见方、厚10mm的正方形板,四角各有一个直径8mm、沉头直径14mm的安装孔,孔心距板边12mm。底座中心竖直向上伸出一个高80mm、外径40mm、内径30mm的圆柱套筒,套筒外壁与底座之间均匀分布4个三角形加强筋,筋厚6mm,筋从底座顶面延伸到套筒外壁高度60mm处。
模型返回的代码如下(我稍作整理):
import cadquery as cq # 底座 base = cq.Workplane("XY").box(150, 150, 10) # 四角沉头安装孔 for x, y in [(-63, -63), (63, -63), (-63, 63), (63, 63)]: base = ( base.faces(">Z") .workplane() .center(x, y) .hole(8) # 沉头孔无法直接用hole完成,需要额外的沉头倒角 ) # 圆柱套筒(中空) sleeve = cq.Workplane("XY").circle(40/2).extrude(80).faces(">Z").circle(30/2).cutThruAll() # 合并底座和套筒 part = base.union(sleeve) # 加强筋:在四个象限位置用三棱柱近似 import math for angle in [45, 135, 225, 315]: rad = math.radians(angle) # 使用三棱柱作为筋的简化,实际更合理的做法是用loft扫掠 rib = ( cq.Workplane("XY") .polyline([(0, 0), (30, 0), (30, 20)]) .close() .extrude(6) .rotate((0,0,0), (0,0,1), angle) .translate((0, 0, 0)) ) part = part.union(rib) show_object(part)这个初版代码有三个明显问题:沉头孔只是普通通孔、加强筋的几何形状完全不对、加强筋没有和套筒外壁正确相交。这正是text-to-cad目前最真实的状态——AI能给出80分的初稿,剩下的20分需要你具备基本的建模素养去修正。
4.3 修正与迭代:把代码改到能用的过程
我不建议你把AI生成的代码直接当成成品,而是要把这个过程当作交互式迭代。我对上面的初稿做了三处修正。
第一处,沉头孔改.hole()为.cboreHole()。CadQuery专门有.cboreHole(diameter, cboreDiameter, cboreDepth)方法,一步实现沉头孔。
base = base.faces(">Z").workplane().center(x, y).cboreHole(8, 14, 3)第二处,加强筋的建模方式改用"先建一端的截面,再放样到另一端"的Loft思路。更可靠的写法是先建立套筒和底板的轮廓,用Workplane在两个高度上画截面,然后loft()成实体:
rib_profile = ( cq.Workplane("XZ") .moveTo(-20, 0) .lineTo(20, 0) .lineTo(20, 60) .close() .extrude(6) ) rib = ( rib_profile .rotate((0, 0, 0), (0, 0, 1), angle) )第三处,加强筋底部和底座顶面重合区域要做布尔合并之前,最好统一坐标系。CadQuery的Workplane默认在局部坐标系操作,建议把所有特征都union到一个主对象上,避免坐标偏移导致模型错位。
你发现没有,整个过程其实是人机协作:AI负责把模糊意图转成可运行的代码骨架,人负责把几何约束修正到位。所以我才说,小白的门槛确实降低了,但完全不懂CAD基础的人依然做不了复杂零件——你至少得能看懂代码,知道"布尔并集"是什么。
4.4 导出STEP与参数化改造
模型修正完后,导出STEP格式非常直接:
cq.exporters.export(part, "bracket.step")STEP文件的好处是通用性极强,FreeCAD、Fusion 360、Onshape都能直接打开。我实际测试过,导出的STEP在FreeCAD中打开后,可以继续用Part Design工作台做二次编辑——虽然特征树不会像原生文件那样完整,但几何实体是可编辑的,还能继续加特征、改尺寸。
如果你想让模型真正参数化,建议把关键尺寸定义为变量,比如:
BASE_SIZE = 150 BASE_THICKNESS = 10 SLEEVE_OD = 40 SLEEVE_ID = 30 SLEEVE_HEIGHT = 80 RIB_THICKNESS = 6这样以后调整任何尺寸,只需要改变量值,整段代码重新运行就得到新模型。AI生成代码的时候你就可以在提示词里明确"把所有尺寸定义为变量",它对这类要求处理得很好。
5. 实测中的高频翻车点与排查思路
这部分是全文我最想让读者记住的内容。网上教程大多只会给你看成功的截图,但实际跑起来,我大概有六成的交互轮次会出各种问题。我把这些坑整理出来,每个都写清楚现象和解决思路。
5.1 尺寸标注的心智差异:模型对"直径/半径"的混淆
我遇到频率最高的错误,是模型把直径当半径用,或者反之。比如需求写"外径40mm",模型在代码里写circle(40),而CadQuery的circle()接收的是半径。结果模型导出来80mm的圆,直接翻倍。
排查思路:拿到AI生成的代码,第一步先核对每个数字参数的含义,不要想当然。我的习惯是让模型在生成代码时给每个函数调用配一行注释,标明单位与语义:
.circle(20) # 半径为20mm,即直径40mm这个习惯能帮你快速定位尺寸错误。同时,你可以在提示词层面规避:明确说"注意:circle接收半径,直径参数需要除2后传给circle"。把这类提示词固定成你的模板,成功率会明显提升。
5.2 布尔运算报错:几何体不相交或者边界重合
CadQuery的union、cut这类操作偶尔会报错,最典型的是"布尔运算失败"。原因通常是两个几何体只有点或线接触,没有实体相交,某些内核版本对这种退化的边界情况处理不稳定。
比如做加强筋的时候,如果筋的长度刚好等于底板边缘到套筒外壁的距离,两者恰好相切于一条线段,布尔并集就可能失败或产生碎片面。
排查思路:不要精确相切,稍微让筋"伸进去"一点。比如让筋的轮廓超出底板边缘1mm,再整体裁剪到边界。这样布尔运算的输入是"有重叠体积"的状态,成功率要高很多。这个技巧和做焊接时的"融合量"是一个道理——用0间隙去做实体会很脆,留一点过盈才稳定。
5.3 坐标方向错乱:为什么模型是歪的
大模型生成的建模代码,很容易犯坐标系混乱的毛病。CadQuery支持在XY、XZ、YZ三个平面上开工,模型有时候分不清"从正面拉伸"还是"从侧面拉伸",结果零件横七竖八躺在地上。
我自己遇到过最搞笑的一次,是让AI生成一个竖直的圆柱,它把截面放在YZ平面上挤压,出来了就像一个横着的管道。排查这类问题,关键是在提示词里显式指定工作平面和挤出方向:"从XY平面向上(+Z方向)拉伸80mm"。Geek一点的解释是,你要像给施工队交底一样,把基准面和方向都说死,AI才不容易自由发挥。
5.4 沉头孔、螺纹孔这类特征:API要盯紧
CadQuery提供了丰富的专业特征API:cboreHole、cskHole、threadHole等。但通用大模型对它们的参数签名覆盖并不全面,很容易生成不存在的参数名,或者漏掉必填参数。
我的建议是,用之前先把CadQuery的官方文档翻一遍,重点记住这些常用API的签名。你不用背,但要知道"有这么个方法能用"。等模型生成代码报错时,你能从报错信息判断是缺参数还是参数名写错。这样人机协作的效率才会上去。
比如常见的.cskHole(直径, 顶径, 顶角),模型经常把顶角忘了写,导致默认值不符合需求。你提前知道这个方法的存在,一眼就能看出来问题。
6. 提示词结构化:把自然语言变成建模约束
我发现一个扎心的事实:text-to-cad这类工具,与其说考验AI能力,不如说考验你描述需求的能力。同样一个零件,描述方式不同,生成质量天差地别。这节分享一下我自己沉淀的提示词模板。
6.1 模板化描述:五个必填要素
你可以把几何描述拆成五个维度,每次都按这个顺序填充,基本不会漏信息:
| 维度 | 说明 | 示例 |
|---|---|---|
| 整体形态 | 零件是什么,大致像什么 | 一个L型底座支架 |
| 主体尺寸 | 总体长宽高、厚度、直径 | 总长120mm、宽度80mm、高度15mm |
| 特征及位置 | 孔、槽、圆角、倒角,在哪个面上,如何定位 | 底面四角各一个直径6mm通孔,孔心距边缘10mm |
| 特征参数 | 每个特征的精确数值 | 通孔直径6mm,倒角1mm |
| 特殊要求 | 单位、对称性、某个特征与其他特征的关系 | 四个孔沿X轴对称分布;注意Circle接收半径 |
带完整五要素的提示词示例:
用CadQuery建模一个L型支架:主体是一个弯折成90度的L型钣金件,水平面和垂直面各厚5mm。展开尺寸相当于200mm长、100mm宽。水平面上均布4个直径8mm的通孔,孔位在水平面区域四角,孔心距边缘15mm。垂直面上方中间有一个直径20mm的圆孔,圆心距水平面顶面50mm。所有尺寸单位均为毫米,保留特征树。
这种描述方式信息密度高,模型几乎不需要"猜"。我对比过,同模型下结构化描述的成功率约85%,口语化描述只有不到40%。
6.2 少样本示例:给模型一个"榜样"
如果目标零件的建模方式比较特殊,单纯靠描述让模型直接生成往往不够。更稳的做法是:找一段结构相似的CadQuery参考代码,贴进提示词里,让模型照着改写。
比如我想生成一个带中心孔的圆盘,我会先给模型看一段"带矩形槽的方块"的CadQuery代码,然后说"参照这种结构,把方块改成圆盘,矩形槽改成中心通孔"。这种少样本提示实实在在地降低了模型的生成难度,因为建模API的语法风格已经在示例中了,模型只需要做参数和几何形状的替换。
6.3 多轮对话修正:让模型自己完成"设计评审"
我还会利用多轮对话让模型先"自检"。在产出代码后追加一句:"请检查这段CadQuery代码,重点检查尺寸单位、坐标方向、布尔运算和孔特征参数,指出可能的问题并给出修正后的完整代码。"实测中,这一步能让错误率再降低20%左右。原因是推理类大模型在"检查模式"下对细节的注意力比"生成模式"更好,类似于你写代码后自己做review的效果。
这个做法最大的收益不只是修正代码,而是你被迫跟着模型一起思考"这个零件有哪些隐藏的几何关系",对培养建模直觉也有帮助。
7. text-to-cad的边界与可以延伸的玩法
最后聊点我对趋势的判断,以及这个能力还能怎么往深了用。
7.1 别指望它一步到位:当前的边界在哪
经过大量实测,我倾向于把text-to-cad当前的能力定义为"从0到80分的助手":
- 简单机械零件(板类、轴套、支座等)可以直接用,效率极高;
- 中等复杂装配体(超过十几二十个特征、有复杂的曲面过渡)需要大量人工修正,整体效率不一定比传统建模高;
- 曲面造型(涡轮叶片、车身覆盖件这类)目前基本不可用,不要强求。
另外,国内外的CAD厂商正在把这类功能集成到官方软件里,比如在传统CAD中添加AI辅助生成功能。趋势是明确的:自然语言交互会成为CAD软件的标配入口之一,但底层内核的技术门槛依然很高。所以如果你想长期吃这碗饭,不要把宝全押在"AI能自动建模"上,而是把AI当成"更聪明的输入法",它帮你把想法变成代码框架,但设计判断力和几何理解力仍然是你自己的核心竞争力。
7.2 进阶玩法:参数化族库与自动化生成
我自己目前用得最爽的一个场景,是做参数化族库。之前做非标自动化方案时,需要频繁调用不同规格的铝型材支架、电机安装座、传感器固定件。以前的做法是画好一个模板,出图时手动改参数另存。现在我用AI生成CadQuery参数化模型,把所有尺寸变量都暴露出来,再套一层Python脚本做批量生成:
specs = [ {"base": 120, "hole_d": 6, "height": 60}, {"base": 160, "hole_d": 8, "height": 80}, {"base": 200, "hole_d": 10, "height": 100}, ] for spec in specs: model = generate_bracket(spec) cq.exporters.export(model, f"bracket_{spec['base']}.step")只要初始代码是参数化的,后续生成一系列变体完全不需要再动脑子。这种"AI写生成器、生成器再批量出模型"的分层结构,才是text-to-cad最有想象力的用法。
再往后,你还可以把这套参数化代码包装成微服务,接到内部工具链里,让非专业人员通过Web表单填参数就能拿到CAD模型,直接对接CNC加工或3D打印。这一步的思路已经跳出了"对话建模",成了真正的数字化研发基础设施。
7.3 一点实在的建议
如果你现在动心要上手,我的建议非常简单:今天就用你手头的AI工具,配一个几十行的CadQuery环境,挑一个你工作中真实遇到的零件,试着让AI生成出来。不要拿教程里的demo零件练,因为你对其结构没有真实感,练完就忘。只用真实需求去练,你才能感知到AI在哪个环节省了你的时间、在哪个环节反而让你更头疼。
我花了大概两个周末把这条路趟通,前期最痛苦的不是AI代码写得差,而是我自己对CadQuery的API不熟,分不清是AI错了还是我的理解错了。等我把常用API过了一遍,再回头看text-to-cad,感觉就像多了一个随时待命的建模实习生——它出活快,但有的时候不靠谱,你得知道怎么给它派活、怎么验收。
这条路的本质,不是让AI替代会建模的人,而是让"会建模的人"效率变成原来的三四倍。想清楚这一点,你就知道该把精力放在哪里了。