
直接说结论text-to-cad 这名字看起来像个玩具实际上是把“三维建模”这件事从软件操作里彻底抽出来变成一句自然语言描述。以前你想让一个没学过SolidWorks的人画个零件基本不可能现在你把一句话丢给模型它能还给你一个带参数化特征的CAD文件放进Fusion 360或者FreeCAD里还能继续改尺寸、改圆角、继续编辑。这个技术解决的不是“生成一张好看的图”而是“生成一个能用的工程模型”。它适合三类人一是机械设计、产品设计里天天要做标准件或者相似零件的工程师想省掉重复建模时间二是没系统学过建模软件但需要做3D打印原型的人三是做AI应用开发的开发者想把这个能力集成到自己的工具链里。这篇文章我从原理、主流实现路线到一套能实际跑通的流程都拆一遍最后附上我踩过的坑和排查思路尽量让不同基础的人都能拿走直接用。1. text-to-cad到底在解决什么问题它的核心价值是什么先说个背景。CADComputer-Aided Design发展了这么多年核心逻辑一直没有变化人操作软件用草图、拉伸、旋转、倒角这些命令把几何造出来。这个过程的本质是“人和机器的交互”而且是高门槛的交互。一个工程师要想熟练建模得知道各种命令在哪、特征怎么排序、约束怎么加、草图怎么完全定义这些全是经验活。text-to-cad想做的是把这个交互层替换掉。你告诉模型“我要一个矩形法兰盘四角各有一个直径5mm的通孔中心有个直径20mm的凸台高度10mm”它直接给你生成对应的CAD文件。人在这个流程里从“操作者”变成了“提需求的人”这就把建模的门槛打下来一大截。1.1 真正的难点不是“生成形状”而是“生成特征历史”很多人一听到text-to-cad第一反应是“这不就是AI生图换个赛道吗”。我一开始也这么想深入做了几次实验之后才发现两者有本质区别。AI生图生成的是一张像素网格是“死”的。你怎么改它重新生成一张。而CAD文件是“活”的。一个工程模型内部记录着完整的特征历史feature history一个圆柱体不是“一组三角形的集合”而是“一条草图直线绕着中心轴旋转360度得到的体”。下游工程师拿到这个文件可以双击这个圆柱特征把直径从20改成25整个模型会自动更新。这是CAD的灵魂也是text-to-cad最难的地方。所以衡量text-to-cad做得好不好不是看渲染图像不像而是看三点模型是不是参数化的、特征树是不是清晰、能不能回到传统CAD软件里无缝继续编辑。如果一个工具只吐给你一个STL网格文件那它只能叫“文本生成3D打印模型”离真正的text-to-cad还差得远。1.2 工程制造约束是绕不过去的坎还有一个经常被忽略的点工程模型是有物理意义的。你要生成一个零件不是“长得像”就行。孔位要和螺丝匹配壁厚要考虑能不能加工法兰盘的螺栓间距要符合标准件规格这些约束如果不写清楚AI生成的模型就是废的。我见过很多人刚开始用这类工具描述写得很“设计感”“一个未来感的流线型支架”。结果生成出来的模型确实好看但完全不可制造——壁厚0.8mm注塑根本打不出来。问题不在于AI能力不行而在于prompt里缺了工程信息。用一句话概括text-to-cad的核心价值它不是帮你“画图”而是帮你“把需求翻译成工程约束”然后把满足这些约束的CAD文件交付给你。你描述得越接近工程语言它返回的结果就越接近能用的零件。这一点在后面写prompt的部分我会展开讲。2. 当前主流的实现路线拆解我在选型时怎么对比的我研究这个方向的时候发现市面上所谓text-to-cad的工具底层实现方式完全不同。有些是“套壳”有些是“真家伙”。选型之前必须搞清楚它们的技术路线不然很容易被演示视频骗了。2.1 路线一LLM生成程序化建模代码最容易被低估这条路线逻辑是让大语言模型直接输出OpenSCAD、CadQuery或者SolidPython的代码然后在本地执行代码生成CAD模型。OpenSCAD是什么它是用编程语言写3D模型的工具做机械零件非常顺手而且代码文件是纯文本的天然适合让LLM生成。举个例子对LLM说“生成一个长40mm、宽20mm、高10mm的长方体四角倒圆角半径3mm”OpenSCAD代码是这样的$fn 50; difference() { linear_extrude(height 10) { offset(r 3, $fn 50) { square([40 - 2*3, 20 - 2*3], center true); } } }这段代码生成一个带四角倒圆角的板逻辑非常清晰。LLM对这种文本到代码的转换已经是强项所以这条路线的实现难度最低、效果也相当稳定。这条路线有个额外好处代码本身是可解释、可修改的。你觉得圆角大了让模型改一个数字就行或者自己手动改3改成5重新编译一下就好。2.2 路线二用神经网络生成2D草图再拉伸成3D特征这条路子模拟人类建模时的动作先画一个封闭的2D轮廓然后拉伸成体、加特征。Zoo.dev旗下的Text-to-CAD API大体就是这个方向——模型先从文本里理解出“轮廓是什么形状”生成一个可编辑的2D草图然后再拉伸、加圆角、打孔最终输出STEP格式的B-rep模型。这种路线的优势是生成结果非常接近CAD原生工作流拿到文件后能看到完整的草图、特征和参数编辑性极强。缺点是需要专门的模型训练数据不好搞目前能做到的产品不多。2.3 路线三直接回归生成B-rep几何目前偏研究还有一类思路是让模型直接输出B-rep边界表示数据也就是直接从文本回归出模型的拓扑和几何信息。像Autodesk之前放出来的Project Bernini就是类似方向它生成的CAD模型直接带了特征语义而不是简单的网格。这个方向很诱人但因为技术难度大目前公开能用的产品还不多多数停留在研究原型阶段。普通用户如果现在就想用不太推荐走这条路线等产品成熟了再说。2.4 三条路线怎么选我推荐的组合是哪个为了直观对比我列一张表路线原理优势劣势代表工具LLM生成程序化建模代码文本→OpenSCAD/CadQuery代码→本地编译实现简单、可控性强、代码可编辑复杂曲面表达受限OpenSCADLLM、CadQueryLLM生成2D草图再拉伸特征文本→2D轮廓→拉伸成3D特征生成结果接近原生CAD特征编辑性极好模型训练门槛高公开产品少Zoo Text-to-CAD API直接回归B-rep几何文本→神经网络→最终几何理论上上限最高可处理复杂拓扑技术不成熟难落地Autodesk Project Bernini研究阶段我在实际工作中更倾向于“两条腿走路”先跑通路线一。因为它的门槛最低你不需要申请什么内测资格只要有OpenSCAD和任意LLM API就能开始实验。如果你想把它做成分发给别人用的工具再去接路线二的API生成结果的CAD质量明显更高。至于路线三先保持关注暂时不把它作为主力方案。3. 从零开始跑通一条text-to-cad流程我用的方法和完整步骤我不喜欢空谈原理直接上一套我反复跑过的流程。这套流程用的是“LLM生成OpenSCAD代码→本地编译”的方案不需要特殊硬件、不需要排队等内测唯一需要的就是一个LLM API和一个OpenSCAD程序。3.1 环境准备总共需要三样东西第一安装OpenSCAD。去官网下载对应你操作系统的版本Windows、macOS、Linux都有。装完之后命令行里能直接敲openscad --version就算成功。第二准备一个LLM API。OpenAI、Anthropic或国内大模型API都行只要能稳定输出代码就行。我实验时常用GPT-4o系列但不是必须的很多开源模型比如Qwen系列在这个任务上表现也不错。第三装一个Python环境用来串联“调API→拿代码→调OpenSCAD”。这一步不是必须但能大幅提升效率。如果你只想手动复制粘贴跳过Python也完全没关系。3.2 给LLM写“建模prompt”的3个核心原则OpenSCAD的建模逻辑和传统CAD不同它是程序化建模所有几何都由代码计算出来。这意味着你的描述越“可计算化”结果越可控。我总结了三条原则。原则一显式写出所有尺寸和单位。不要写“一个中等大小的法兰盘”要写“外径60mm内径25mm厚度8mm四个孔径5.2mm均匀分布在直径40mm的分度圆上”。模型不会猜你的默认单位不写清楚就是随机发挥。原则二明确功能意图。告诉模型“这个法兰盘要用来连接两根直径25mm的圆管”它就能推断出你需要的是内孔带台阶还是直通孔壁厚至少多少。纯几何描述往往忽略了功能需求导致生成的模型不实用。原则三把复杂零件拆解为简单操作的组合。不要指望一句话生成整个减速器。我习惯把零件拆成主体特征、功能特征、修饰特征三层来写。比如主体特征底板是一个80x60x5mm的矩形板功能特征四角各有一个直径5.5mm的通孔孔中心距边缘8mm修饰特征底板上表面正中间有一个直径30mm、高度15mm的圆柱凸台这样分层描述LLM生成的代码结构清晰编译成功率高后期修改也容易。3.3 完整示例生成一个带凸台和螺丝孔的安装底座我用具体例子走一遍。假设我要做的零件是一个用于固定小型电机的安装底座需求是这样的底板80x60x5mm中心有一个直径30mm高15mm的凸台凸台中心有一个直径10mm的贯穿孔用于穿轴底板的四角各有一个直径5.5mm的螺丝安装孔孔中心距离相邻边缘8mm。第一步把这段需求整理成prompt发给LLM请用OpenSCAD编写一个参数化模型实现以下功能 1. 底板长80mm宽60mm高5mm四角倒圆角半径3mm。 2. 底板四角各有一个通孔直径5.5mm孔中心距相邻边缘均为8mm。 3. 底板上表面中心有一个圆柱凸台直径30mm高度15mm。 4. 凸台中心有一个直径10mm的贯穿孔。 5. 所有尺寸用变量定义方便后期修改。 只输出OpenSCAD代码不要解释。第二步LLM返回了类似这样的OpenSCAD代码各家模型输出会有差异但核心结构差不多$fn 50; // 参数定义 plate_length 80; plate_width 60; plate_height 5; corner_radius 3; hole_diameter 5.5; hole_offset 8; boss_diameter 30; boss_height 15; shaft_hole_diameter 10; module base_plate() { linear_extrude(height plate_height) { offset(r corner_radius, $fn 50) { square([plate_length - 2*corner_radius, plate_width - 2*corner_radius], center true); } } } module screw_holes() { for (x [-1, 1], y [-1, 1]) { translate([x * (plate_length/2 - hole_offset), y * (plate_width/2 - hole_offset), -1]) cylinder(d hole_diameter, h plate_height 2); } } module central_boss() { translate([0, 0, plate_height]) cylinder(d boss_diameter, h boss_height); } module shaft_hole() { translate([0, 0, -1]) cylinder(d shaft_hole_diameter, h plate_height boss_height 2); } difference() { union() { base_plate(); central_boss(); } screw_holes(); shaft_hole(); }这段代码用了union()把底板和凸台合并再用difference()把螺丝孔和中心轴孔减掉。逻辑上完全正确而且所有尺寸都用变量定义了后面想改板厚直接改plate_height就行。第三步把这段代码保存为motor_mount.scad在命令行里运行编译openscad -o motor_mount.stl motor_mount.scad如果你需要STEP格式用于传统CAD软件可以安装OpenSCAD的import相关工具链或者把STL导入FreeCAD后再转成STEP但要注意转换后可能会丢失参数化特征。想保留特征就直接保留.scad源码在OpenSCAD里改参数重新编译。3.4 生成结果到可用的CAD文件中间还有一道关键步骤拿到OpenSCAD生成的STL还不能高兴太早。STL是网格文件没有特征历史导入SolidWorks之后只能当一个“哑物体”看不能编辑。真正可用的CAD交付物应该是STEP文件或者至少是带参数的.scad源文件。处理STL到STEP的转换我建议分两步走第一步用openscad直接把源码编译成3MF或STL用于3D打印没问题第二步如果一定要STEP把.scad导入FreeCAD再用FreeCAD的Part工作台把它转成实体导出STEP。这样做拓扑基本能保住复杂曲面可能会有瑕疵但大多数机械零件没问题。实操下来我习惯把所有.scad文件当成“源码”来管理和代码一样存在git仓库里每次修改参数提交一次。这样比管理STL文件要科学得多——你的“CAD源文件”变成了可diff的文本这在团队协作时特别好用。4. 踩坑记录与问题排查真实使用中我遇到的那些破事这个领域太新了网上能找到的现成经验不多几乎每个问题都要自己踩一遍才知道怎么绕。我把踩过的坑按频率从高到低排一遍希望能帮你省点时间。4.1 描述越“艺术”结果越“离谱”要按工程语言描述我一开始写prompt用了很多形容词“优雅的流线型外壳”“现代感的散热孔”。结果模型给我生成了一堆曲面拼接体编译出来全是自相交几何根本没法用。后来我把描述改成“顶部为R30圆弧过渡侧面均布12个直径6mm圆形散热孔孔间距8mm”生成的模型立刻实用多了。原因很简单LLM擅长处理精确的语义不擅长脑补审美。程序化建模尤其如此——你对“优雅”的理解和模型对“优雅”的训练数据分布完全不重合。想让模型稳定输出就得把审美语言翻译成几何语言。4.2 单位不写清楚模型默认按“1个单位1毫米”处理但也可能随机发挥OpenSCAD本身是没有单位概念的一个数值谁是毫米谁是英寸全靠人自己约定。我问过几次模型发现它的判断标准是“看起来像什么”。如果你说“一个直径5的孔”它可能理解为5毫米也可能理解为5厘米。特别是涉及螺丝孔、孔径这种尺寸时差一个量级就是废件。我的做法是所有prompt里强制写“单位均为毫米”并且在关键尺寸上给出具体数值不要用“直径5”这种省略句要用“直径5mm”。如果生成的代码里没有单位信息也没关系我只要看到尺寸变量的值是合理的就行。4.3 生成的几何体自相交或者无法编译先检查这3件事OpenSCAD是一个正经的CSG构造实体几何渲染器代码如果写得不对分分钟报错或者渲染出奇怪的结果。我遇到过最多的三类问题第一difference()操作的“被减”体和“减去的体”没有完全穿透。比如我给板子开孔孔的h高度设成和板厚一样结果底面正好平齐OpenSCAD会偶尔渲染出薄如蝉翼的残留面。解决办法是孔的h要比板厚多出至少0.1像上面示例里我加了2就是为了保证完全贯穿。第二倒圆角用offset(r负数)搞错了方向。OpenSCAD里要给一个矩形外侧倒凸圆角常规做法是先对尺寸缩小后的矩形做offset(r圆角半径)再把结果用linear_extrude拉伸。如果你直接对原尺寸做负值offset会得到内凹形状。这里我每次都贴着“先缩小再偏移”的方式写避免方向搞反。第三多个特征叠加时顺序不对。OpenSCAD代码是严格按顺序执行的你必须在union()之后再difference()如果反过来打孔位置会算错。这个问题在生成复杂零件时特别容易出我的习惯是把union()和difference()写成两个独立module在顶层组装。4.4 生成的模型“看着对”但尺寸全飘是prompt里的相对关系没说清有一次我让模型“生成一个外壳内部能放下一块56x42x8mm的电路板四周留2mm间隙”。模型生成了但内部空间是55x41x7.9mm板子根本放不进去。问题出在哪里模型只理解了“间隙2mm”但没理解间隙应该加在板子的两边——所以内部尺寸应该是板子尺寸2×间隙即60x46x12mm每一侧各加2mm。从那之后我的prompt里凡是涉及配合关系的都会直接给最终数字而不是给规则“内部空间需要60x46x12mm用于容纳56x42x8mm的电路板加上四周2mm间隙。”模型看到具体数字生成结果的命中率明显提升。如果你发现自己生成的模型每次都“差一点”大概率是相对关系没有在prompt里展开成绝对尺寸。4.5 快速排错清单一个prompt不行从哪里入手改我把自己反复用的一张检查清单分享出来每次生成失败就从第一项开始过检查项具体操作单位是否明确全文标注“单位均为毫米”关键尺寸带mm后缀尺寸是否完整主要长宽高、孔径、壁厚全部给出具体数值相对关系是否转换成绝对尺寸板厚外沿到内腔的单边距离不要只给“留2mm缝隙”是否拆分为特征层级按主体、功能、修饰分层描述不要一股脑全写一段是否说明了功能意图告诉模型这个件是做什么的它才能补全必要的制造细节是否让代码可参数化提示“所有尺寸用变量定义”方便后续调整这张表往下走一遍80%的问题都能找到原因。5. 进阶玩法与后续还能怎么做我的几点展望基本的text-to-cad流程跑通之后能玩的方向其实非常多。这里分享几个我觉得特别有价值的扩展路径。5.1 批量参数化生成标准件实现“一分钟一个零件”既然代码是参数化的我们可以写一个循环脚本让同一个底座的孔位直径、凸台高度等参数按列表批量变化。比如要生成5种不同孔径的安装座不用重复生成5次prompt只要在OpenSCAD里用循环遍历孔径数组一次编译就能输出5个STL。这个思路特别适合做标准件库、波纹管法兰、线缆接头这类规格多但形态固定的零件。用Python包装一下甚至可以通过CadQuery直接输出STEP格式效果比STL更好。我做过一个小工具输入一组参数表格自动调CadQuery生成零件、导出STEP、生成预览图整个流程跑下来也就几十行代码。5.2 把text-to-cad和3D扫描、拓扑优化接起来这个方向可能有点超前但我觉得很值得关注。3D扫描得到的点云数据可以先通过AI识别出“这是哪类零件、大体尺寸多少”再生成一个初始CAD模型接着用拓扑优化工具做轻量化最后输出到CAE软件做仿真。这样一整条“实物→数字模型→优化设计”的链路如果能打通对逆向工程是个巨大提升。5.3 结合RAG让模型理解企业内部建模规范很多企业有自己的建模规范比如倒角必须R2以上、最小壁厚不能低于1.8mm、螺丝孔间隙必须0.2mm。这些规范很难靠prompt一次性说清楚但可以做成一个规范文档库用RAG在生成前自动检索相关条款拼进prompt里。这样即使是新来的工程师用text-to-cad生成结果也能自动符合企业内部标准。我自己试过把公司的一份12页的建模规范做成检索库在生成prompt前自动附加相关规则模型生成的零件合规率从六成不到提升到了九成以上。这个方法门槛不高但效果非常显著。最后聊聊我对这个工具的真实感受用了几周text-to-cad之后我的感受是它不是要取代CAD工程师而是把“重复劳动”从工程师手里拿走。以前画一个电机底座从草图到出工程图熟练工也要半小时现在用text-to-cad从描述到拿到可编辑的.scad文件五分钟内搞定。工程师省下来的时间可以去做更值得做的事情比如方案评审、装配分析和工艺优化。但它也不是万能的——复杂的装配体、包含大量曲面造型的消费电子产品目前还远远做不到生成结果仍然需要人眼检查、手动调整。我的建议是把它当成一个“超级快速的原型工具”来用先快速验证想法再决定要不要投入精力做精细化建模。如果你也是那种被重复建模烦到崩溃的人我强烈建议花一个下午把这套流程跑一遍大概率会对这个方向改观。