2024年12月初,我第一次在Zoo Text-to-CAD的公测页面里敲下这样一句话:“一个带法兰的圆管底座,外径80毫米,内径60毫米,法兰厚度8毫米,法兰上有四个均匀分布的5毫米安装孔。”十几秒后,预览区转起来一个实体,旁边附着一份CadQuery代码——不是普通的文生3D工具给出的网格“泡泡”,而是一段可以导进Fusion 360、继续改尺寸、改孔位、改法兰厚度的参数化脚本。
做机械设计和工程自动化的朋友应该明白这意味着什么:text-to-cad 这个词过去两年频繁出现在论文标题里,但真正能进入工作流的形态,其实不是“文本生成一个好看的形状”,而是“把自然语言编译成一段可编辑的建模过程”。这篇文章我准备把这股新进展彻底拆开讲:当前有几条技术路线在互相竞争、普通人怎么从零跑通第一个生成项目、实测中哪些地方最容易翻车,以及它在真实设计制造流程里到底适合干什么、不适合干什么。
1. 从“概念图”到“可编辑图纸”:text-to-cad 解决的真正问题
先说一个最常见的误解。很多人第一次听到 text-to-cad,会把它和 text-to-3D 混在一起。文生3D模型,例如那些用扩散模型从文字生成网格的工具,解决的是“视觉表现”问题——输出STL或OBJ,给游戏、动画、可视化展示用,模型本身没有特征树,没有参数,甚至没有严格的实体几何。而 CAD 模型完全不是一回事:一个合格的参数化CAD模型,背后是“先拉伸底板,再在顶面建凸台,然后切四个孔”这样的操作历史,每个尺寸都是一个可改写的参数,改完孔距,后面的孔位、圆角、倒角会自动重新计算。
我习惯用一个类比:文生图给你一张照片,text-to-cad 给你一份菜谱。照片可以看,但不告诉你食材比例和火候;菜谱可以照着复刻,可以调整分量,也能批量做出一模一样的菜。这个“过程语义”才是 CAD 的核心资产,也是 text-to-cad 和普通文生3D 的分水岭。
为什么这条路现在才真正走得通?我认为有两点撞在了一起:
一是大模型写代码的能力已经足够可靠,能够生成 OpenSCAD、CadQuery 这类“程序化CAD脚本”。程序化建模的本质,就是把建模动作变成可执行的文本。既然模型擅长写代码,那它等于天然会描述建模过程。
二是工具链补齐了“代码→实体”的最后一环。用户拿到一段 CadQuery 脚本,可以直接在本地跑出 B-Rep 实体,导出 STEP,然后进入 Fusion 360、FreeCAD、SolidWorks 继续编辑。生成不是终点,而是参数化编辑的起点。
所以 text-to-cad 的核心不是“从文字生成模型”,而是“从文字生成可编辑、可复用、可制造的模型”。这才是它对工程师和设计师真正的价值。后面所有技术路线、所有踩坑技巧,都是围绕这个核心展开的。
2. 主流实现路线的分野:代码生成、模板检索、语义场与反向建模
这个领域目前不是一条路线通吃,而是几条思路在互相补充。我把业界和学术界最主流的四类拆出来讲清楚,因为理解路线差异能直接帮助你选工具、判结果。
2.1 大模型直接生成程序化CAD代码
这是目前产品化最成熟的一类,代表就是 Zoo Text-to-CAD。它的底层是一套经过微调的大模型,通过工具调用(tool use)方式输出结构化结果,允许你选择 OpenSCAD 或 CadQuery 两种“方言”。
为什么选代码而不是直接生成网格?因为代码自带了完整的建模过程和尺寸约束。模型的回答不是一堆三角面,而是一段可以执行、可以修改、可以版本管理的脚本。这个性质非常关键:你把代码存进 Git,每次改动都有记录;你改了某个参数,整个模型会按你的意图重新生成。
以 OpenSCAD 为例,生成逻辑非常直观。比如一个“带凸台的底板”,生成的代码大致长这样:
// 底板 100x60x10 module baseplate() { difference() { union() { cube([100, 60, 10], center=false); // 底板实体 translate([50, 30, 10]) cylinder(h=15, r=15); // 顶面凸台 } // 四个安装孔,孔心距边8mm for (x = [8, 92], y = [8, 52]) { translate([x, y, -1]) cylinder(h=14, r=3); } // 凸台中心孔 translate([50, 30, 10]) cylinder(h=17, r=8); } } baseplate();这种声明式建模语言的好处是“看得懂”:union是合并实体,difference是挖掉孔洞,每个尺寸都写在代码里。大模型对这种 DSL 的掌握度非常高,因为它训练时见过大量类似代码。
再看 CadQuery。它更接近传统CAD的思维——先选面,再画草图,再拉伸或切孔。同一个底板,CadQuery 版本大概是:
import cadquery as cq # 底板 result = cq.Workplane("XY").box(100, 60, 10) # 在顶面中心建凸台 result = ( result.faces(">Z") .workplane() .circle(15) .extrude(15) ) # 四角打通孔 result = ( result.faces(">Z") .workplane() .rect(100 - 16, 60 - 16, forConstruction=True) .vertices() .circle(3) .cutThroughAll() ) # 导出 STEP,可以直接进入主流 CAD cq.exporters.export(result, "base_with_boss.step")这两类脚本各有应用场景。我做过一个实际对比,结论很清晰:
| 对比维度 | OpenSCAD | CadQuery |
|---|---|---|
| 建模思维 | CSG布尔与几何变换,面向最终形状 | 面向特征的操作流,面向历史 |
| 语言形态 | 类C的专用语言 | Python |
| 输出几何 | 网格/B-Rep,适合快速导出预览 | B-Rep实体,适合STEP/IGES交换 |
| 工程集成 | 入门友好,适合3D打印 | 适合导入Fusion/SolidWorks继续编辑 |
| LLM生成难度 | 代码短、结构简单,成功率高 | 更结构化,偶尔会漏操作步骤 |
我的建议是:如果你只是快速验证形状、输出3D打印文件,选 OpenSCAD;如果你要进入专业CAD流程,选 CadQuery。目前公开服务对前者的生成稳定性更好,对后者则需要多检查几步。
2.2 程序化模板检索与再组合
第二条路线不是“从零生成”,而是“从库里找最接近的模板,再做参数填充”。
这背后依赖大规模数据集工程。Meta 的 ML-CAD 项目组发布过 Text2CAD 数据集,把自然语言描述与对应的程序化CAD脚本成对组织,让模型学会“这句话大概对应哪类零件结构”。推理时,模型不是凭空想象几何,而是理解语义后从已有的参数化模板里选型,再调整尺寸、孔位、特征组合。
这条路线最大的好处是几何合法性天然有保证。因为所有输出都来源于已经验证过的模板,不太会出现自相交、负体积、布尔失败这类问题。缺点是覆盖范围受限于模板库大小——如果库里没有“非标扭曲叶片”这种结构,它就只能投降或者硬拼出一个错误的组合。
对企业的启示是:如果你有一套成熟的产品族模型库,完全可以自建这条路。把公司所有历史零件改写成可参数化的程序化脚本,再挂上自然语言索引,内部工程师就能用“找一款类似XX支架,孔距改到60mm”这种方式快速派生新零件。这比让模型瞎猜要靠谱太多。
2.3 语义场与“绘图步骤”预测:两条非直接代码生成路线
还有一类纯研究向的路子,没有直接生成可执行代码,但非常有启发性。其中一支是把文本和CAD形状映射到同一个语义空间(semantic field),用神经网络预测空间中每个点是否属于实体内部,最后提取等值面得到网格。这种方法的优势是能表达非常自由复杂的曲面,但致命伤是产出的仍是网格或隐式场,想回到参数化CAD,还得做一轮曲面反求,工程链路太长。
另一支很有意思,NVIDIA 的 TextCraft 走的是“绘图步骤预测”路线。它不直接幻想几何,而是让多模态大模型像老师傅一样工作:先读一张带尺寸标注的草图,预测草图的依赖图(也就是明确“先画哪条线、再标哪个尺寸”的顺序),然后循环预测每一步绘图指令和长度约束,最终输出可以直接运行的 OpenSCAD 或 FreeCAD 宏。
TextCraft 的聪明之处在于,它把“生成形状”变成了“生成过程”。CAD 建模的本质就是一系列有依赖关系的操作,只要操作序列对了,模型一定合法。这个思路和代码生成殊途同归,而且对三维空间推理的依赖更低。目前这类方法更适合零件级草图,对复杂装配体还力不从心,但它让我看到了未来“建模过程自动生成”的可能。
2.4 从已有B-Rep模型反向生成建模流程
还有一条被低估但实际价值极高的路线:反向建模。你没看错,如今不少工具已经支持“上传一个现有的几何文件,让模型告诉你它大概是怎么建模出来的,并输出可编辑代码”。
传统逆向工程是扫描实物获得点云,再拟合成曲面,得到的大多是不可编辑的“死模型”。而 text-to-cad 的反向建模是另一个方向:拿到一个 B-Rep 实体(比如客户发来的 STEP 老图纸),分析它的面、边、孔、凸台结构,反推出一个可能的特征历史,然后输出一段程序化代码。这段代码可以改尺寸、改孔位,等于把一张“死图”变成了“活模型”。
我在实际项目里用过这个功能来改造老零件——客户发来一个十几年前的法兰,没有原始三维,只有一个STEP。过去我只能在原模型上补特征,每一步都心惊胆战;现在我可以先让模型生成一段可编辑代码,把孔距、法兰厚度变成参数,再批量派生几个变体。这个过程节省的时间不是一点点。
3. 端到端实操:从一句中文到能改尺寸的CAD模型
理论说再多,不如跑通一次。下面是我反复验证过的实操路径。
3.1 环境准备:在线公测还是本地API
最快速的方式是直接用 Zoo Text-to-CAD 的公开测试页面。注册后,左侧文本框输入自然语言描述,右侧选择输出 OpenSCAD 或 CadQuery,点击生成,通常几十秒内出结果。生成后可以直接复制脚本。
如果想把这套能力接进自己的应用或自动化流水线,用 API 方式更合适。它提供 OpenAI 兼容的调用接口,你可以把自然语言描述发过去,拿回结构化代码,再在本地自动执行生成模型。这在企业内部特别有用——把 text-to-cad 嵌入PLM或工装设计系统,就能做成“工程师说一句话,系统自动出一版可编辑3D草图”的自动化链路。
本地验证环境按需安装即可:
pip install cadqueryOpenSCAD 则去官网下载安装包,Windows、macOS、Linux 都有。强烈建议装一个,因为很多生成结果可以直接在 OpenSCAD 里预览、切片、导出STL,比 Python 环境更省事。
3.2 真实案例:一个“带凸台的底板”是怎么生成的
我在实测中最常用的案例是“带凸台的底板”,因为它覆盖了拉伸、凸台、阵列孔、布尔减切这四类最基础也最典型的特征。完整提示词如下:
“一块底板,长100mm、宽60mm、厚10mm,在顶面中心有一个直径30mm、高15mm的圆柱凸台,底板四角各有一个半径3mm的通孔,孔中心距边8mm。”
这份描述其实暗藏了很多模型需要“翻译”的信息:底板是长方体、凸台在顶面中心、孔是通孔、孔距离边缘等距。CadQuery 输出基本可以对照上面的代码理解:
Workplane("XY").box(...)创建底板,坐标系XY面作为底面;faces(">Z")是选中顶面,然后画直径30的圆,向上拉伸15,凸台和底板自动合并;- 四角打孔用了一个技巧:在工作平面上画一个矩形辅助线(
forConstruction=True),然后取矩形四个顶点,在每个顶点处画半径3的圆,最后cutThroughAll()贯穿切割。
这里最关键也是实际模型经常会翻车的地方,就是最后那步cutThroughAll()。如果模型生成的是cutBlind(-10),也就是只从顶面往下切10mm,那孔根本不会穿透整个模型,后续导入装配体时螺栓没法穿过,整个设计就是废的。所以我在拿到生成代码后,第一件事永远是检查所有切割操作是否“贯穿”。
OpenSCAD 版本同样能跑通,结构就是先合并底板和凸台,再用difference挖掉孔洞。相对而言,OpenSCAD 对“打孔必须穿透”这个逻辑更直观,因为cylinder的高度只要比底板厚度大,再配合difference就天然是通孔。
生成 STEP 后,直接导入 FreeCAD 或 Fusion 360。你会看到它保留了操作历史——底板的拉伸、凸台的拉伸、四个孔的切割都在。这就真正实现了“模型可编辑”。
3.3 让模型“说工程话”的提示词方法
跑通一次不难,难的是稳定复现。我的实测体感是:text-to-cad 对提示词的要求比文生图苛刻得多。文生图写“一个酷炫的机器人”就能出图,但CAD生成写“L型支架带孔”往往会得到结构完全不对的东西。
对比一下:
- 差的提示词:“L型支架带孔”
- 好的提示词:“L型支架,总尺寸80x50x40mm,板厚5mm;水平面上有两个直径4mm的沉头螺钉孔,孔中心距右边缘10mm,前后居中;垂直面上开一个25mm x 15mm的腰形槽,槽口倒R3圆角”
差别在哪?好提示词不仅写清了“长宽高”,更写清了“特征类型”。尺寸决定了模型的比例,而“沉头孔”“腰形槽”“倒圆角”这些词——注意不是“圆孔”“长孔”“导角”——决定了模型会去调用哪些CAD特征。大模型训练时见过大量带工程语义的文本,你用词越接近工程图纸语言,它生成的特征越准确。
我总结了一套相对好用的提示词模板,你可以直接套用:
[零件名称],[整体外形尺寸],[材料类型]。 先[第一步特征],再[第二步特征],最后[第三步特征]。 [孔类特征]必须写清类型(通孔/沉头孔/螺纹孔)、直径、位置; [边缘特征]写清倒角/圆角半径; 所有尺寸单位默认mm。还有个非常实用的经验:分两轮生成。第一轮先描述“粗特征”,比如“一个矩形底座,长100宽60厚10,顶面有圆柱凸台”;拿到模型后再追加第二轮精修,“在刚才的模型上,四角加半径3mm的通孔,凸台顶面倒R5圆角”。分步对话比一次给全要稳得多,因为模型不容易在上下文里丢失约束。
4. 参数化才是分水岭:从“能看”到“能改、能加工”
一个形状可以被显示出来,只是起点;能被修改、被加工、被复用,才是 CAD 的价值。
4.1 为什么参数化历史比形状本身值钱
想象一个简单的轴承座。如果只有一个网格文件,你想把安装孔距从50改成60mm,唯一的办法是重新建模。但如果有一份特征树——先拉伸底座、再挖轴承孔、再打四个安装孔——你只需要改一个参数,所有后续特征自动跟随更新。这就是参数化的力量。
text-to-cad 生成代码,等于你在拿到几何模型的同时,也拿到了它背后的“设计逻辑”。它可以驱动产品系列化:一个支架族只要改“宽度、板厚、孔距”三个参数,就能派生几十个不同规格。这在非标自动化行业极其常见,也是我认为 text-to-cad 最先产生直接经济价值的场景。过去这条参数化路径要求工程师手动整理可变量,现在至少在“初步生成可参数化草稿”这一步,AI 可以帮上大忙。
4.2 从代码到工程图、CAM与装配的潜台词
程序化代码的另一个隐藏价值是它不是“孤立模型”。输出 STEP 实体后,下游可以做:
- 工程图标注:自动生成三视图,标注关键尺寸;
- CAE 分析:直接划分网格做强度校核;
- CAM 编程:基于实体生成刀路和加工策略;
- 装配验证:把生成零件放进总装,做干涉检查。
这件事的想象空间很大。流程高度自动化之后,自然语言描述可以成为产品数据管理的入口:工程师写需求,系统生成参数化模型,自动跑仿真和干涉检查,再发布到物料系统。这个链路里 text-to-cad 充当的是“需求翻译器”,把人类语言翻译成机器可执行的建模指令。它不替代任何专业技能,但把大量重复劳动压缩掉了。
4.3 当前在复杂曲面面前的短板
当然,别指望它能解决所有问题。我实测下来,当前模型对以下类型的生成质量还很有限:
- freeform 曲面,比如鼠标外壳、手柄曲面、涡轮叶片;
- 复杂圆角顺序,比如先倒角后开孔还是先开孔后倒角,导致结果完全不同;
- 多实体装配层级,比如同时生成两个相互配合的零件并保留装配约束;
- 高级扫掠、放样、边界混合这类需要多截面控制的操作。
在这些场景里,text-to-cad 更适合做“方案速写师”——先把一个70%正确的结构草稿搭出来,再由人类工程师接手处理高级曲面和工艺细节。认清这个边界,能避免你对它产生不切实际的期待,也能让它在合适的场景里发挥最大价值。
5. 实测中最容易翻车的三件事
工具很好用,但坑也真实存在。我把自己踩过的坑整理成了一份问题排查表,建议你遇到问题时对照着查。
| 典型问题 | 症状表现 | 排查方向 | 预防对策 |
|---|---|---|---|
| B-Rep合法性/布尔失败 | 生成报错、特征丢失、模型裂缝 | 检查特征顺序,是否先打孔后建凸台 | 提示词中写明“先凸台,再打孔,最后倒角” |
| 尺寸单位混乱 | 模型整体放大10倍或缩小10倍 | 检查代码中数字常量和模型单位模板 | 第一句就声明“所有尺寸单位默认mm”,生成后跑包围盒校验 |
| 制造信息缺失 | 只有几何,没有材料和公差 | 检查是否补充了材料、表面处理、螺纹规格 | 把公司工艺标准做成提示词前缀,生成后统一关联属性 |
5.1 B-Rep合法性与布尔运算失败
这类问题最常见。具体症状很气人:代码看起来完全合理,但执行到某一步就报错,或者生成的STL上有大片裂缝。
根因通常是特征顺序出错。一个真实翻车案例:我在生成一个带凸台的罩壳时,模型自动生成的步骤是“先创建壳体,再切安装孔,最后创建凸台”。结果凸台的extrude把一部分孔给填死了——因为凸台创建在孔之后,系统把孔当成了凹陷特征,然后被后续实体覆盖。修复方法很简单,把顺序改成“先凸台后切孔”,或者把孔的切割方式从cutBlind(-10)改成cutThroughAll()。
还有一种翻车是“零厚度”问题。比如壁厚2mm的壳体,模型给开了一个直径等于外径的孔,内外边界共面,布尔运算直接失败。这种事在传统建模里也会发生,但 AI 生成时不会像人一样有“空间直觉”,更容易踩雷。所以拿到代码后先检查是否出现“孔直径接近实体宽度”这种明显违背制造常识的数值。
5.2 尺寸单位与尺度失控
第二个高频坑是单位。大模型的训练数据里有大量英文社区代码,其中不少以厘米或英寸为单位。如果你在提示词里只写“30x20x5”而不写单位,模型很可能按训练分布给出一个它认为“常见”的解释,而不一定是你默认的毫米。
解决办法是双保险。第一,提示词第一句强制声明单位:“所有尺寸单位默认mm”。第二,生成后跑一次包围盒校验,用代码自动检查关键尺寸。
bb = result.val().BoundingBox() x_len = bb.xmax - bb.xmin y_len = bb.ymax - bb.ymin z_len = bb.zmax - bb.zmin # 如果用户目标尺寸接近100mm,检查偏差是否在0.1mm以内 if abs(x_len - 100) > 0.1: raise ValueError(f"X方向尺寸异常: {x_len:.2f}mm")这段逻辑里BoundingBox()返回模型的包围盒,取最大最小坐标之差就是实际尺寸。在自动化流水线里,这种校验脚本非常值得写,能挡住大部分因单位问题产生的“十倍炸弹”。
5.3 材料、公差与工艺信息的“最后一公里”
第三个问题不是几何层面的,而是信息层面的。text-to-cad 生成的只是几何数据,它不知道这个零件是铝合金还是钢、表面要不要阳极氧化、孔的公差是H7还是H8、螺纹是M6还是1/4-20。如果直接把生成结果送去加工,大概率会得到一堆“形状完全正确但无法装配”的废品。
我的应对方式是把工艺知识前置。公司内部所有的生成提示词都加一段固定前缀:
材料:6061铝合金,表面本色阳极氧化; 公差:安装孔按H8加工,外形尺寸按ISO 2768-m; 螺纹:所有螺纹孔为M6,深度10mm。生成后的代码再挂一个本地属性字典,自动把材料、公差、热处理、表面处理写入模型属性。这一步不是技术问题,而是流程设计问题。没有它,text-to-cad 只能在“概念设计”里打转;加上它,才能进入真正的制造流程。
6. 落地场景:我在实际项目中怎么用这类工具
聊完踩坑,说说我在真实项目里已经用上 text-to-cad 的几个场景。
概念设计发散。接需求时客户经常只说“大概是个L型的底座,下面要装两根导轨”。以前我要么从头画,要么翻历史库。现在我会先让 text-to-cad 快速生成三、四个外形方案,虽然结构细节不能直接用,但能帮我和客户快速对齐方向,比空谈高效太多。
非标工装快速设计。非标行业的特点是一个项目一个样,重复劳动多。我把常用工装写成提示词模板:“底板尺寸X,中心立柱直径Y,四个腰形安装槽,槽宽Z”。每次来新项目只改参数,AI生成的代码作为初稿,我再做约束校验和工艺审查。过去半天的工作量现在一小时能完成。
旧图改造。前文说的反向建模场景,是我最看重的应用。拿到老的 STEP 文件,先让模型恢复建模流程,再调整参数派生变体。这比传统手工重新建模省了至少一半时间,而且因为保留了参数化历史,后续维护也轻松很多。
新人培训。让新工程师用 text-to-cad 生成零件的程序化代码,再对照代码讲解“为什么这里要cutThroughAll”“为什么凸台要在打孔之前”。代码本身就是最好的教材,比干讲拉伸、切除、阵列直观得多。
我最终形成的工作流是:需求自然语言 → 模型生成程序化代码草稿 → 自动校验包围盒和布尔合法性 → 人工接手做约束、公差、工艺细化 → 发布到企业零件库。在这个流程里,text-to-cad 不是“生成器”,而是一个“需求编译器”——它把一句人话编译成参数化草稿,剩下的事情仍由工程师掌控。
最后再分享一个我非常坚持的习惯:把自己的建模顺序写进提示词。AI生成的代码偶尔会和你平时习惯的特征顺序不一样,但只要你把“先凸台,再打孔,最后倒角”这类顺序约束明确写进去,生成的模型不仅合法,还和你后续的修改习惯完全兼容。花十秒钟写清顺序,能省下后面几小时的返工。如果你正准备开始尝试,我的建议是别贪多求大,先找一个你最熟悉的、特征不超过五步的小零件,把单位、材料、加工方式写进提示词,然后认真观察它生成的操作顺序——你会在那几十秒里重新理解自己平时建模时那些“理所当然”的步骤。