前阵子帮客户补一张法兰盖的图,对方在电话里说得挺清楚:直径80的圆盘,厚12,中心孔25,四个螺栓孔8,分度圆直径60。我挂了电话在CAD里老老实实建模,拉伸、打孔、阵列,再检查一遍尺寸,十分钟过去了。后来我试了一下最近一直在研究的text-to-cad工具,把电话里那段话原封不动敲进去,几秒钟就返回了一个带完整特征树的三维模型。虽然部分圆角细节还要手动补,但主体结构一次成型——这个反差让我觉得,CAD建模这件事正在被重新定义。
这篇文章主要整理我踩过的一条完整路径:text-to-cad 背后到底是什么技术、它有哪些可上手的开源实现、我在本地是怎么跑通的,以及它目前能做什么、不能做什么。如果你平时跟三维模型打交道,无论是机械结构、产品外壳还是3D打印模型,只要你想"动嘴"而不是"动手"去建模,这篇文章应该对你有点用。
1. 项目概述:text-to-cad 到底在解决什么问题
1.1 从一句话到三维模型:设计意图翻译的自动化
传统CAD建模这件事,本质上不是"画画"而是"翻译":把脑子里对一件东西的描述,翻译成一连串带几何参数的操作——先建哪张草图、拉伸多少、在哪个面上打孔、孔与孔的间距是多少。这个翻译过程极其依赖经验。同样是"四个螺栓孔",老师傅会直接给出分度圆直径和孔径,新手可能还要想一下到底怎么标注才能让下游加工的人不困惑。
text-to-cad 解决的问题,就是把这个"翻译"环节自动化。它接收一段自然语言描述,比如"直径80mm的圆盘,厚度12mm,中心孔直径25mm,四个直径8mm的螺栓孔均布在直径60mm的节圆上",然后输出一个符合这些约束的三维模型。关键点在于,这个输出不是一张渲染图,而是真正可以被CAD软件继续编辑的模型文件,带参数化特征树。
这个需求在真实工作流里非常普遍。设计评审阶段,需求方经常说不清自己要什么;工程师听完之后要先建一个粗模型用于确认方向,往往改两三版。等全部沟通完,时间也花了不少。text-to-cad 把"快速出一版草模"的成本降到了几乎为零,适合用来做设计意图对齐,也适合没有CAD基础的人直接描述需求拿到初始模型。
1.2 它和AI画画、传统参数化脚本有什么本质不同
第一次看到text-to-cad,很多人会觉得这就是"AI画图换了个赛道"。实际上两者有本质区别。AI画图输出的是像素矩阵,模型本身不可编辑,也没法转成生产用的工程文件;而text-to-cad输出的是几何内核能识别的建模指令,可能是CSG布尔运算,也可能是BREP边界表示,通常还可以导出为STEP这类工业交换格式。
再对比传统参数化脚本,比如OpenSCAD。OpenSCAD确实可以用几行代码生成参数化模型,"改参数重建模型"这个思路非常高效,但它要求使用者先学会写代码,而且写代码本身也是设计意图的另一种翻译,门槛不低。text-to-cad 把门槛从"会写代码"降低到"会说话"。你可以理解为:OpenSCAD 是给模型写程序,text-to-cad 是让AI替你写程序,你只要描述需求就行。
还有一点值得强调:text-to-cad 保留的是"建模过程"而不是"建模结果"。这也是它跟AI画画最关键的分水岭。生成结果里那颗特征树,记录了"先拉伸后打孔"这样的操作序列,用户拿到手可以改其中一个孔的位置、重新调整凸台高度,下游修改是可行的。这也是工程场景最看重的一点。
2. 底层技术逻辑:文本是怎么变成CAD模型的
2.1 数据底座:DeepCAD 与"建模序列即语言"
要让AI学会"从文本到CAD",前提是得有一个大规模、结构化的CAD建模数据作为教材。这里必须提到DeepCAD数据集。它从大量真实CAD设计文件中,把每个零件的建模过程提取成指令序列,格式类似于"草图-拉伸-打孔-圆角"。你可以把一条建模序列理解成一句话:每个CAD命令是单词,命令参数是语法结构。一个零件模型就是由这样一句话生成的。
有了这种序列化的数据,自然语言处理的很多现成技术就能平移过来。Transformer、自回归生成这类在文本生成上验证过的方法,天然适合处理"序列到序列"的问题。模型训练的目标也很直观:给定一段自然语言描述,预测整条CAD指令序列;然后再用CAD内核执行这些指令,得到最终模型。DeepCAD 的另一个贡献是数据规模到了十几万个真实设计文件,让模型有了足够的样本去学习"圆孔""凸台""法兰"这些常见特征的出现规律。
2.2 两条技术路线:生成式建模与编译式解析
目前text-to-cad的实现大致分两条路。第一条是生成式路线,代表像DeepCAD、Text2CAD这类工作:模型直接自回归地输出CAD命令序列。这种方式的好处是能创造训练数据里没出现过的新结构组合,自由度大。缺点是生成的序列偶尔不合法,比如"打一个不存在的面"或者"倒角半径比特征尺寸还大",需要后处理修复。
第二条是编译式路线,代表像Zebra这类开源项目:先用大语言模型把用户描述解析成结构化的操作步骤,再交给CAD内核(比如OpenCascade)逐条执行,最终生成模型。这条路更接近"编译器"的思路——LLM负责理解自然语言,CAD内核负责保证几何合法性。优点是稳定、结果可预期、生成的模型很少出现不闭合的壳;缺点是能力上限受解析规则限制,用户如果描述得太放飞,LLM可能解析不出来。
除此之外还有一些方法走"文本到点云/隐式场,再拟合成BREP"的路线,但我个人不太推荐作为入门研究。点云到BREP的拟合本身是一个非常难的老问题,拟合出来的曲面通常不够光顺,后续再编辑也麻烦,工程价值有限。
2.3 为什么输出必须选CSG/BREP,而不是点云和网格
如果你用AI画图工具生成一张产品渲染图,图片里再好看,也没法直接给CNC加工。CAD领域真正有价值的是边界表示(BREP)和构造实体几何(CSG),因为它们保证了"几何怎么来的、边界怎么定义"是清晰的。BREP 用面、边、顶点来精确描述实体表面,STEP文件就是基于这一套标准;CSG则记录基本体元和布尔运算过程,天然带有操作语义。
网格(比如STL文件)的问题在于它只是一堆三角形的集合。你可以把它理解为用石膏翻模出来的模型,看形状能看出来,但没法改其中一个圆角的半径,也没法直接生成工程图。工业软件虽然能对网格做逆向转换,但转换质量不稳定,稍微复杂一点的曲面就会产生破洞或者误差。text-to-cad 选择在CSG/BREP层面生成,等于直接交付"设计图纸+工艺流程",而不是一张"照片"。这不是技术洁癖,是工程刚需。
3. 实操:在本地跑通一个text-to-cad最小示例
3.1 开源工具选型:先想清楚你要研究还是要干活
我建议先分清楚自己的目的。想研究原理、复现论文,可以重点看DeepCAD一系,数据集公开,训练代码也在GitHub上能找到,但需要自己准备GPU环境,体验重点是理解模型怎么工作。想快速在真实工作流里用起来,建议直接看Zebra这类带Web界面的实现,输入一句描述,它生成STEP文件,下载后就能导入主流CAD软件。两者不矛盾,先用好用的工具跑通流程,再回头看论文里的细节,理解会扎实很多。
部署环境上,我的经验是:先找官方demo跑一遍,确认能满足你的场景再谈本地部署。因为这类项目更新很快,依赖经常变化。真要在本地部署,一台带NVIDIA显卡的Linux机器最省心,显存8GB以上比较稳,纯CPU推理速度会慢到让你怀疑人生。没有GPU条件的,直接用在线demo先玩起来,不必一上来就啃源码。
3.2 最小示例:用一段话生成一个带孔转接板
我用一段真实需求做例子:需要一块矩形转接板,用于把两个传感器固定在一起。我说清楚尺寸和孔位:长度120mm、宽度80mm、厚度10mm;四个角各有一个直径6mm的通孔,孔心距相邻边10mm;板面上还有一个直径30mm、高度15mm的圆柱凸台,位于板面中心。
实际操作的流程如下:打开工具界面,在输入框里写入提示词,调整生成参数,点击生成。大约几秒到几十秒后,界面会返回一个三维预览,同时展示这个模型用了哪些建模步骤。确认没有问题以后,点导出,选择STEP格式,存盘。接下来我把它导入FreeCAD检查特征树,或者直接发给同事做进一步修改。整个过程里我唯一要做的就是描述清楚需求,剩下的是模型生成和格式转换。
这里我贴一个简化版的调用示意,方便理解核心流程。不同开源项目的接口差异很大,具体以官方仓库为准。
# text-to-cad 调用流程示意(伪代码,以实际项目接口为准) from text2cad import TextToCAD engine = TextToCAD(backend="zebra") # 也可替换为 deepcad prompt = ( "创建一块矩形板:长120mm,宽80mm,厚10mm。" "四个角各有1个直径6mm的通孔,孔心距相邻边10mm。" "板面中心有一个直径30mm、高15mm的圆柱凸台。" ) result = engine.generate( prompt, unit="mm", output_format="step" ) result.export("sensor_plate.step") print(result.feature_tree) # 期望输出大致为: # Sketch1(矩形120x80) -> Extrude1(10mm) # -> Hole1(半径3mm, 4处均布) -> Sketch2(圆r=15) # -> Extrude2(15mm) -> Fuse3.3 提示词怎么写才不容易翻车
text-to-cad能不能出好结果,一半取决于模型,一半取决于提问方式。我总结了几条很实用的原则。第一,必须写单位。同样的"厚度10",10mm和10inch差了25倍,模型再强也猜不出你默认什么。第二,几何基准要说透。与其说"中间有一个孔",不如说"圆心位于板面几何中心,直径25mm,通孔"。第三,专业特征词直接用。"通孔""盲孔""凸台""均布""节圆"这些词模型见得最多,识别最稳;用"四个圆洞"这种口语,效果反而不稳定。
另外建议一个句子只描述一个特征,特征之间用顺序词衔接。先描述主体轮廓,再描述主要切割,最后描述次要细节。比如"先创建一个矩形底座…然后在四个角上添加通孔…最后在中心添加凸台"。模型理解顺序符合人类建模习惯,生成的特征树也会干净很多。尽量避免一段话里堆五六个特征还没有先后层次,那样出错的概率会急剧上升。
提示词的负面教材我也见过很多:"做个带孔方块"——模型不会追问,它只会按自己理解赌一个结果。这类表述缺少尺寸、缺少孔的贯穿方式、缺少孔的位置约束,生成结果基本就只能碰运气。我建议把需求方在微信里说的原话,先自己翻译成带尺寸、带基准、带特征类型的规范描述,再输入,成功率会好很多。
4. 能力边界、典型失败模式与工程落地排查
4.1 现在能做什么、不能做什么
跑了几个星期text-to-cad,我的判断是:它最适合的是机械设计里以拉伸、旋转、打孔、阵列为主的2.5D零件。比如法兰盘、孔板、支架、壳体、简单的轴类零件、卡扣座这类结构。这些零件特征类型少、约束关系清楚、几何关系规则,对模型来说难度最低,生成质量也最好。也可以用于3D打印的前期概念验证,先确认外形趋势,再手动细化。
但真要拿去出加工图,现在还差得远。自由曲面、螺旋扫掠、放样曲面这类高级特征,生成质量很不稳定,经常出现特征不闭合、曲面自交。装配体更是别想,当前工具基本一次只能生成单个零件,多个零件之间的配合关系、公差标注和约束,都没有被纳入模型的可控范围。螺纹这类标准件细节,很多工具会用装饰螺纹线替代,但不会给出完整的牙型和螺距参数。工程图标注更不用说,那一步目前仍然依赖人。
另外要注意精度级别。text-to-cad生成的模型,几何精度大体能到概念设计阶段的要求,也就是"看个大概、验证思路"。你让它生成一个对称件,它的对称性大概率是好的;但你要是拿卡尺量,某些非关键特征可能会出现微小偏差。所以在我这里,它目前定位是"设计沟通助手",不是"自动加工图发生器"。
4.2 典型失败模式与排查方向
我把实际操作中遇到的失败情况整理成了表格,方便大家按症状排查。
| 症状 | 可能原因 | 排查方向 | 解决参考 |
|---|---|---|---|
| 孔没有贯穿板厚,成了盲孔 | 提示词里只写了"孔",没说通孔 | 检查特征树,看生成了Cut还是Blind | 改提示词为"直径X的通孔,贯穿板厚" |
| 尺寸整体不对,比如厚度变100 | 缺少单位,模型按默认单位理解 | 检查提示词里mm/inch是否写清 | 补单位;或导入CAD后统一缩放 |
| 生成结果每次都不一样,且多次失败 | 采样温度过高,模型探索过度 | 调低temperature、收紧top-p | 固定随机种子,把温度降到0.7以下 |
| 特征树里有"悬空"操作,比如拉伸没有依附面 | 布尔运算被模型生成为无参考操作 | 查阅日志中的内核报错信息 | 简化特征数量;重新表述特征顺序 |
| 导出STEP失败或导入CAD后破面 | 生成过程产生了不闭合实体 | 检查预览时是否显示水密 | 改用STL先看形状,或用修复工具 |
这些失败里,最常见的是单位缺失和通孔表述不清。我自己第一次用的时候,提示词里漏了单位,生成一块板厚度变成了100,当时还以为是模型不行,后来发现是我描述有问题。模型不是你肚子里的蛔虫,它只能按字面意思执行。
4.3 工程落地避坑指南
简单总结几条落地的经验。第一,生成结果不能跳过审查直接发给加工。至少要在CAD里打开特征树检查一遍,确认特征顺序合理、尺寸无误。这个习惯跟我用传统建模时检查图纸一样,只是现在要检查的对象变成了模型。第二,尽量在本地部署或使用私有化服务处理敏感图纸数据。很多在线工具需要上传模型甚至文本描述,公司内部有保密要求的图纸,直接传云端风险不小。第三,建立团队内部的提示词规范。
第三点展开说一下。我会要求团队在写text-to-cad提示词时,尽量用统一的模板:先整体描述,再依次列特征清单,每个特征包含类型、几何参数、位置基准。这样不光是模型识别率高,生成结果交给另一个工程师看的时候,大家也能快速明白设计意图。毕竟text-to-cad生成的不仅是一个模型,还是一段可以追溯的"设计对话"。把这段对话管理好,比管理最终文件更有价值。
5. 我的实操体会与后续玩法
5.1 几个真实心得
用了一段时间后,我最大的感受是:text-to-cad 真正解决的其实不是"建模"这一步,而是"沟通"这一步。它迫使你把自己的模糊想法变成精确尺寸,再把这个精确描述交给模型。很多人说提示词难写,但换个角度看,这个过程跟给工程师下设计任务书没什么区别——你本来就应该把需求写清楚。模型只是把"没人愿意反复听你改需求"这件事变成了"随时可以重新生成"。
还有一点体会是:参数化特征树比最终几何模型还要值钱。传统协作里,拿到一个STEP文件往往看不到建模过程,不知道哪里是主特征哪里是依附特征。text-to-cad直接把建模过程摊开给你,这让下游修改、参数调整变得异常透明。我甚至会在评审时直接把特征树截图贴出来,大家对着特征清单讨论"要不要加一个筋位""这个孔能不能再大0.5",效率比对着实体模型比划高很多。
最后想说的是,这个工具目前更适合放在需求评审和概念设计阶段,顶到生产环节还为时过早。把它当成一个"会建模的实习生"来用,你给它清楚的任务,它给你快速的初稿,你再改、再细化,比较符合实际情况。
5.2 还可以往哪几个方向玩
顺着text-to-cad的思路往下,我比较看好几个扩展方向。第一个是text-to-assembly,从单个零件走向装配体,比如描述"一个底座上装两个圆柱,轴心距离50mm",模型能一次生成多个零件并摆好相对位置。这个方向现在已经有研究在推进,短期内应该能看到可玩的开源成果。第二个是文本和草图结合,用户画一条轮廓线,再配一句"拉伸20mm加孔",比纯文本描述直观得多,也更贴近工程师实际思考方式。
第三个是工程数据微调。通用模型对标准件、企业自定义特征理解得不够深,如果你手上有一批历史模型,可以整理成自家数据微调一个私有版本,生成结果会明显更贴合业务。这个工作量和门槛都不低,但对特定行业来说收益非常值得。第四个,如果你想自己动手,我建议从DeepCAD数据集入手,先写代码统计一下其中"拉伸-打孔"这类组合出现的频率,你会发现很多生成失败,本质上是因为训练数据里某个特征组合太少,而不是模型笨。
我最近还在尝试把text-to-cad跟参数化校验脚本串在一起:生成模型后用脚本批量检查壁厚、最小孔径、拔模角这些基本规则,不满足就打回重新生成。这个组合对3D打印件的前期设计验证特别有用,属于把生成式工具真正接进工程流水线的方向。如果你也在这个方向上玩出了一些东西,欢迎一起来交流。