“把一句自然语言变成能编辑、能出工程图、能直接拿去加工的CAD模型”,这就是text-to-cad在做的事。
我第一次看到这类demo时,第一反应不是“好酷”,而是“这东西如果真能用,设计师和结构工程师的日常会变一个样”。过去我们画一个零件,先要在脑子里想清楚结构,再打开CAD软件,建基准面、拉草图、加约束、生成特征。现在有人试图把“脑子里想清楚”这一步也交给模型,让文本直接驱动建模过程。
这篇文章不打算堆论文术语,我会从一个长期和CAD打交道的使用者角度,把这事拆开讲清楚:text-to-cad到底解决了什么问题、目前主流技术路线有几条、以及你怎样才能用最简单的方式亲手跑通一个“从文本到CAD文件”的最小闭环。不管你是做机械结构、工业设计、非标自动化,还是纯粹玩3D打印,这内容都值得看完。
1. text-to-cad到底在解决什么问题
1.1 传统CAD建模的瓶颈不在“画图”,在“翻译”
很多人以为CAD学习难在“画图”,其实不是。软件操作再复杂,练上一个月也就熟了。真正的瓶颈是:从“需求语言”到“建模操作”的翻译过程,每一步都在消耗注意力。
举个最普通的例子。你要设计一个法兰盘,需求用一句话就能讲完:“外径80,内径40,厚度12,外圈均布6个直径8的螺栓孔。”但这句话落到CAD软件里,你要新建零件、选择基准面、绘制草图、标注约束、拉伸凸台、再画一个孔、做圆周阵列、最后加倒角。熟练工做完这一套至少几分钟,不熟练的可能在“草图完全定义”上卡半天。
text-to-cad想砍掉的,就是这个“需求到初稿”的翻译成本。它的目标不是让CAD软件消失,而是让你把精力放在真正该关心的判断上,比如这个结构稳不稳、好不好加工、装配是否合理。初稿交给模型出,人工负责审核和修改。
1.2 它和text-to-3D不是一回事
这里必须强调一个特别容易混淆的边界:text-to-cad和text-to-3D(比如生成OBJ、STL网格)根本不是一回事。
text-to-3D的目标是“看起来像”,通常生成的是三角形网格,好看就行,不关心几何精度,也不关心能不能编辑。而text-to-cad的目标是“能制造、能编辑、能复用”。它要输出的是真正的CAD数据,也就是带参数化特征、带B-rep(边界表示)几何、带特征历史树的模型。
打个比方:text-to-3D像是让一个素描画家快速给你画一张参考图,光影氛围到位;text-to-cad则是让一个结构工程师给你出一张带标注、带尺寸、可以改图纸的工程图。前者看的是感觉,后者看的是约束和逻辑。所以评价text-to-cad模型好不好,不能只看生成结果像不像,还要看它能不能导入CAD软件继续编辑,能不能稳定出工程图和CAM刀路。
2. 主流技术路线拆解:从脚本生成到数据驱动重建
2.1 大语言模型直接生成CAD脚本:门槛最低,也最容易跑通
目前实操性最强的路线,是用大语言模型(LLM)直接生成CAD脚本,比较常见的输出对象是OpenSCAD、CadQuery,或者Fusion 360的Python API。
这个路线的基本逻辑是:把建模过程用代码表达出来,LLM本来就擅长生成代码,于是“文本转CAD”就变成了“文本转代码”。比如你给我一句“直径30的圆柱,高20,顶部倒角2”,模型理论上可以吐出一段OpenSCAD脚本,你在本地一渲染就有模型了。
这条路线的优势非常明显:
- 不需要专门训练,直接用现成的通用大模型就能起步。
- 生成的结果天然是参数化的,尺寸都写在变量里,随时能改。
- 输出的是文本文件,易读、易审查、易版本管理。
缺点是模型不一定真的理解CAD语义。它可能生成一个语法完全正确但物理上很离谱的模型,比如孔比零件还大、倒角吃掉整个壁厚、布尔运算留下悬空碎片。所以用这条路,必须搭配人工检查。
2.2 基于CAD数据集训练专用模型:Text2CAD与CAD-GEN这条线
另一条更“科研”也更接近text-to-cad本质的路线,是在大量CAD数据上训练专用模型。
这个方向的背景是,近几年社区整理了不少CAD序列数据集,比如从Fusion 360里提取的建模操作序列、DeepCAD这类大规模参数化CAD数据,以及一些自动配对的文本描述数据。研究人员会把这些“自然语言描述-建模操作序列”配对起来,训练模型学习从文本到建模步骤的映射关系。
典型工作包括Text2CAD、CAD-GEN等。它们的做法通常是把CAD建模过程表示成一系列离散的操作token,例如“新建草图”“画圆”“拉伸”“切除”“倒角”等,模型根据输入文本,逐个预测下一个操作,最后解码成一个完整的CAD文件。
这条路的优点是更贴近“工程师建模”的思维,生成结果确实是一个带特征历史的参数化模型。缺点是:
- 对数据和算力的要求很高,普通个人很难复现。
- 模型生成的草图约束经常不完整,导入软件后需要大量修复。
- 描述一旦变长,生成误差会累积,最后几个特征经常对不上。
所以目前这些模型更多出现在论文和demo里,离“生产工具”还有距离,但方向是对的。
2.3 先出三维网格再做表面拟合:看着快,实则坑多
还有一种思路比较取巧:先用文本生成三维网格(类似text-to-3D),再做网格到CAD表面的拟合。
比如先用扩散模型生成点云或体素,再用B-rep拟合算法把表面转成NURBS曲面或参数化实体。这个路线的好处是能借用大量成熟的text-to-3D成果,生成效果“视觉上很唬人”。但从我的实际使用经验看,这个路线在工程上其实最不靠谱:
- 拟合出来的曲面经常是非流形或自相交的,实体布尔运算会失败。
- 表面虽然光滑,但没有原始特征,你在CAD里无法修改“孔距”或“壁厚”这种参数。
- 转换成STEP后,文件里经常是一坨没有可编辑历史的“死模型”。
我建议把它当作概念可视化工具,而不是设计工具。你拿它来给客户看一下大致形态没问题,但如果要出图、要加工,直接倒回参数化建模更现实。
2.4 三条路线怎么选
为了让你选型方便,我把三条路线放在一起对比:
| 路线 | 代表方式 | 可编辑性 | CAD软件导入友好度 | 适合场景 | 落地门槛 |
|---|---|---|---|---|---|
| LLM生成脚本 | GPT/Claude + OpenSCAD或CadQuery | 高,参数全在代码里 | 高,导出STEP/STL都可 | 个人快速出初稿、3D打印、简单结构件 | 低,有手就能跑 |
| 专用模型 | Text2CAD、CAD-GEN | 中高,看具体实现 | 中,常需修复草图约束 | 研究、批量生成、数据集扩充 | 高,需要GPU和数据 |
| 网格拟合 | 文本→点云/体素→B-rep拟合 | 低,基本是死模型 | 中低,破面概率高 | 概念展示、视觉效果 | 中,依赖现成3D生成模型 |
我的意见很直接:如果你是自己用、要快速出东西,选第一条;如果你是研究生想要发论文或者探索新方法,第二条值得深入;如果你只是给甲方看个效果图,第三条可以凑合。
3. 亲手跑通一个text-to-cad最小闭环
3.1 准备工具:开源CAD脚本环境
为了不依赖付费软件,我推荐用两个开源工具来实现最小闭环:
一是OpenSCAD,体积小、跨平台、用CSG(构造实体几何)建模。你可以把OpenSCAD理解成“用代码雕刻”,非常适合配合LLM自动生成。它默认尺寸单位是毫米,可以直接导出STL和SVG。
二是CadQuery,这是一个Python库。和OpenSCAD不同,CadQuery更接近传统CAD的“特征建模”思路,可以做到先选面、再建草图、然后拉伸、打孔、倒角,而且可以直接导出STEP格式。STEP格式是B-rep,包含精确几何信息,能被Fusion 360、FreeCAD等主流软件直接打开。
工具链就这么简单:一个文本编辑器,加上一个免费的CAD环境。模型引擎方面,你可以用任何主流大模型API。如果你在意数据隐私,本地部署一个小参数量模型也能完成基本任务,但效果会打折。
3.2 第一个例子:用一句话生成垫片并导出STL
我们从一个机械行业最常见的小零件开始:平垫片。需求描述是这样的:
“外径40mm,内径30mm,高度10mm的圆环垫片。”
拿到这句话,你要做的第一件事,是把自然语言转成明确参数:外径40,半径20;内径30,半径15;高度10。因为OpenSCAD的cylinder函数用的是半径参数,所以必须先把直径换成半径。
我让模型生成的OpenSCAD脚本大概长这样:
$fn = 64; outer_d = 40; inner_d = 30; height = 10; difference() { cylinder(h = height, r = outer_d / 2); cylinder(h = height + 1, r = inner_d / 2); }你可能会问,为什么里面那个圆柱高度是height+1而不是height?这里是个典型细节:两个曲面如果完全等高手动做差集,有可能因为浮点精度问题留下残面或破洞。让内圆柱多出1毫米,保证“切除”特征贯穿整个实体,布尔运算更干净。这个习惯我用了很多年,强烈建议你也养成。
把这段代码保存成gasket.scad,放进OpenSCAD,按F5预览,再按F6渲染,就能看到实体。接着导出STL,这个垫片基本就能丢给3D打印机了。整个流程从文本到拿到可打印文件,不超过5分钟。
3.3 第二个例子:用CadQuery生成带孔底座并导出STEP
如果只是生成一个圆环,用OpenSCAD就够了。但工程上更常见的需求,是“一块底座板上打几个安装孔”。这时CadQuery更合适,因为它的“先建实体、再选面、在面上定位打孔”的方式,非常接近人类工程师的思路。
我们用一个更复杂的描述来测试:“一个60×40×10mm的长方体底座,四条垂直边倒R5圆角,顶面按40×20矩形分布打4个直径4mm的通孔。”
我给出的CadQuery代码是这样:
import cadquery as cq base = ( cq.Workplane("XY") .box(60, 40, 10) .edges("|Z") .fillet(5) ) result = ( base.faces(">Z") .workplane() .rect(40, 20, forConstruction=True) .vertices() .hole(4) ) cq.exporters.export(result, "base.step")一行一行看:先建一个60×40×10的盒子;然后.edges("|Z")选中四条平行于Z轴的边,也就是那四条垂直边;.fillet(5)给它们倒R5圆角。注意我是在倒完角之后才选顶面孔位的,因为倒角可能会影响后续工作平面的选择稳定性。
然后.faces(">Z")选中最顶上的面,.workplane()在这个面上建立新的工作平面。.rect(40, 20, forConstruction=True)画一个40×20的辅助矩形,.vertices()取它的四个角点,最后.hole(4)在每个角点处打直径4的通孔。
这段代码跑完,你会得到一个base.step文件。STEP是CAD领域的中性交换格式,Fusion 360可以直接打开,而且打开之后还是带精确B-rep数据的实体模型,不是一堆三角面片。
3.4 生成结果如何进入主流CAD软件
拿到STEP或STL后,下一步是把模型拉进你熟悉的CAD软件继续处理。
STEP文件用Fusion 360打开时,通常会自动转成底稿,可以直接在原有实体上继续添加特征。但要注意一点:打开STEP后,模型往往是一个不带原始特征历史的“哑实体”。你可以在这基础上新建草图、打孔、加特征,但不能回头修改我代码里那个40×20的孔距参数。所以如果预计要反复调整,最好把CadQuery脚本保留好,改参数后重跑一遍。
STL文件则更简单,它只有三角面,没有面边拓扑,直接导入Fusion或FreeCAD后只能做测量和简单的网格编辑,不能当实体用。所以我的建议是:能导出STEP就别导出STL,除非你最终目标就是3D打印。
4. 我在实操中踩过的坑:从歧义到破面
4.1 自然语言里的“歧义”,比你想的更严重
用text-to-cad最痛苦的经历,不是模型不懂语法,而是它太擅长“一本正经地胡说八道”。
比如你写:“一个长方形的板子,上面有四个孔。”这句话在人类工程师眼里不够,需要追问:板子多厚?四个孔多大?孔间距多少?孔是通孔还是盲孔?但模型不会追问,它会自己猜。猜对了是你运气好,猜错了你还得返工。
我自己试过让模型生成“一个支架”,结果它生成了一个像桌面摆件一样的物体。问题不出在模型,而出在我的描述没有给约束。自然语言是非常稀疏的信息通道,越短的描述越容易产生多个合理答案。
所以,使用text-to-cad的第一铁律是:描述必须数字化。凡是涉及尺寸、位置、数量、角度的,全部写具体数值。不要用“大大”“厚实”“美观”这种形容词,模型对这类词的理解和你完全不一样。
4.2 单位、坐标系和精度,最容易翻车的三件事
单位问题是我踩过最多次的坑。OpenSCAD和CadQuery默认都是毫米,但大语言模型训练数据里混着大量英寸和厘米的语料,所以它生成的代码里极容易出现“直径1.5”这种话,到底是英寸还是毫米,你根本不知道。
我现在的习惯是,生成代码后先看一眼数字量级。如果描述是“一个汽车轮毂”,结果代码里写着r=80,那基本可以确定是毫米;如果写着r=3,大概率是英寸或者模型理解错了。不要相信模型默认的单位,每一步都要检查。
坐标系问题同样隐蔽。CAD世界里“哪个面是顶面”“Z轴朝上还是Y轴朝上”是有约定俗成的,但LLM不一定遵守。CadQuery里默认工作平面是XY,拉伸方向是Z正方向,可有些模型会生成Y轴朝上的建模习惯,导致你导入软件后模型是“躺”着的。Fix起来容易,但如果你在没发现的情况下直接出图,后果很尴尬。
还有一个精度问题:布尔运算失败往往是模型生成的特征与实体有微小间隙或重叠。遇到这种情况,不要硬修网格,回到脚本里去改尺寸,把切除体稍微加长、加大,或者用更明确的相交关系。
4.3 “能看不能改”的本质:是网格还是CAD?
很多刚接触text-to-cad的人会拿STL文件当成果,然后在CAD软件里发现只能看不能改,抱怨“这玩意没用”。其实问题不在工具,而在你拿到的文件类型。
STL本质上是“一堆三角形”,它记录的是表面的采样点,而不是几何方程和特征信息。你可以在STL上量尺寸,但你不能把一个STL的某个孔直径从8改成10,除非重新三角化。而STEP、IGES这些B-rep格式,才真正带有“哪条边、哪个面、怎么连接的”拓扑信息。
所以我在实际使用中,会尽量让生成链路落在“脚本/代码”或“B-rep”上。如果某个工具只给我输出STL,我会下意识降低对它作为CAD工具的评分。先问“能不能输出脚本或STEP”,这个标准能帮你过滤掉一大批华而不实的text-to-cad工具。
4.4 别被评估指标骗了
看很多text-to-cad论文时,你会看到一堆漂亮的指标:Chamfer Distance降低了多少、IoU提升了多少。但作为一个工程使用者,我必须说:这些几何指标和“能不能用”的相关性,没有想象中高。
一个模型可能和参考模型在形状上高度重合,但内部特征树完全乱掉:本该是一个整体零件的,它拆成了几十个悬浮实体;本该有一个通孔的,它用两个半球面拼出一个坑。这些在“体素IoU”上照样得分,但导入CAD后你根本没法编辑。
我的建议是,看一个text-to-cad系统好不好用,就看三件事:第一,输出能不能被当前主流CAD软件顺利打开;第二,打开后是不是实体而不是网格;第三,主要尺寸是不是参数化可调的。这三个问题通过了,比任何论文指标都实在。
5. 常见问题速查与提示词调整技巧
5.1 高频问题与排查方案
我在反复使用text-to-cad过程中,把最常见的问题整理成一个速查表,遇到问题可以先对着查:
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 脚本语法报错 | 模型生成的代码变量名或函数名有误 | 把报错信息贴回模型,让它修复;或人工对照官方文档检查 |
| 模型尺寸明显不对 | 单位理解错误,或数字描述缺失 | 在提示词中明确“单位是毫米”,并补充所有关键尺寸 |
| 布尔运算失败或破面 | 切除体与实体共面/不贯穿 | 把切除体尺寸加大或加长,保证完全贯穿 |
| 模型是侧躺的 | 坐标系选择不一致 | 统一约定Z轴向上,并在提示词里说明“顶面是Z正方向” |
| 生成的是网格,无法编辑 | 工具链选错了,输出STL而非STEP | 改用CadQuery或能输出B-rep的工具链 |
| 孔位偏了或数量不对 | 描述中缺少定位基准 | 用“按XX矩形均布”“中心距XX”这类定位描述 |
| 导入Fusion后没有特征历史 | STEP导入本身是哑实体 | 保留脚本,改参数后重新生成,不硬改STEP |
| 一个零件变成很多碎片 | 模型把多个实体当独立特征导出 | 检查代码里的union/组合操作,确保最后是单一实体 |
5.2 把描述写成“迷你需求文档”
既然自然语言歧义大,那就收敛它。我的做法是:不直接甩一句话给模型,而是按“用途+外形+尺寸+装配+工艺约束”的模板来组织描述。
举个例子,差的描述是:“帮我生成一个电机安装座。”这种话换我我也不知从何下手。好的描述应该是:
“设计一个用于安装NEMA23步进电机的L型安装座,垂直板高80mm、宽60mm、厚8mm;水平板长60mm、宽50mm、厚8mm;垂直板上按NEMA23标准布置4个直径5mm的安装孔,孔距31mm×31mm,水平板边缘留两个直径6mm的通孔用于固定到工作台。所有外露边倒R3圆角。单位是毫米。”
你会发现,把这句话翻译成CAD脚本,模型基本不会跑偏。它需要的信息全部给足了,剩下的就是机械式的代码转换。模板话术还有一个额外好处:你可以把常用结构(法兰、底座、支架、壳体)的模板积累起来,以后复制粘贴改数字就行。
5.3 一个让结果更稳的进阶技巧:代码模板拼接
如果你已经用text-to-cad一段时间,你会发现大多数零件都是“基础形状+孔+倒角+阵列”的组合。既然如此,不如把常用基础形状做成自己的模板库,让模型在模板基础上改参数,而不是从头生成新代码。
比如我个人维护了一套CadQuery模板,里面写好了“平板带孔”“L型支架”“圆环法兰”“盒子带盖”这几类最常见的结构。使用text-to-cad时,我会在提示词里附上对应模板代码,并让模型只修改尺寸参数和不改变整体结构。这样生成结果的成功率会高非常多,因为LLM在“改参数”这件事上比“设计新结构”可靠得多。
这其实也暴露了text-to-cad目前的真实水平:它更像一个“读得懂需求的参数化脚本工”,而不是“凭空设计零件的工程师”。接受这个定位,你就能把它用得很顺手。
最后说一个我自己的习惯。在项目里,我会把text-to-cad生成的内容当作“实习生的一稿”,而不是“最终交付物”。每个模型出来之后,我先在CAD软件里打开,检查一遍单位、孔位、壁厚和圆角,没问题再做工程图或发去加工。这个流程看着多条检查步骤,其实比从零建模还是快很多,尤其适合项目前期的方案比选和快速验证。
如果你想让这个能力继续延伸,可以考虑把它接入公司的标准件库和参数化模板,让它只负责“按规则生成”,再由人负责“按规范审核”。我目前的经验是,这个组合在非标自动化设计里,已经能让单个常规零件的出图时间缩短一半以上。