这两年,AI生成领域有一个方向特别热闹:输入一句自然语言,直接得到CAD模型。很多刚接触的朋友以为它能把“做一个M8螺栓连接座”这种话变成一张带公差标注的工程图,实际上远不是这么回事。我帮A同学调试过几个开源的 text-to-cad 方案,也自己搭过完整流程,想把这些真实经验摊开讲清楚:它能干什么、不能干什么、怎么用才顺手、最容易踩哪些坑。
这篇内容适合三类人:想评估 text-to-cad 能不能接入现有工作流的设计师;做3D打印、创客项目,想快速把想法变成模型的动手派;以及刚入门生成式设计、想理解底层原理的学生。我知道很多教程喜欢先铺一堆背景,我直接跳过去,从能力边界开始聊。
1. text-to-cad 到底在生成什么:能力边界先对齐
1.1 它生成的是“几何形状”,不是“工程语义”
所有叫 text-to-cad 的工具,归根结底干的事只有一件:把语言描述映射成一套几何数据。这套几何数据通常以网格(mesh)、点云(point cloud)或隐式场(implicit field)的形式存在。问题在于,CAD 文件里除了几何,还藏着大量非几何信息——公差、材质、表面粗糙度、装配约束、标准件编号。当前绝大多数 text-to-cad 实现根本不产出这些,它们只认“形状长什么样”,不认“这个形状怎么加工”。
A同学第一次测试时输入“做一个带四个安装孔的法兰盘”,生成结果乍一看确实是个盘子,孔位也大致均匀分布。但把模型导入某主流参数化建模软件一量,四个孔的直径彼此差了0.3毫米,孔间距也不对称——这种模型拿去加工就是废品。这不是工具抽风,而是它的表征方式决定的:网格模型天生没有参数化尺寸树,几何上“看着像”和制造上“精确到0.01毫米”是两码事。
所以使用 text-to-cad 的第一原则是:把它当成概念草图的加速器,而不是工程出图替代品。它帮你把脑中的形态快速可视化、确认大方向,真正的精调还得回到参数化建模环境里进行。
1.2 当前实用的三种输出形态
不同实现输出的东西不一样,这直接决定了后续要不要做格式转换。我按实用程度排个序:
| 输出形态 | 数据结构 | 优点 | 缺点 | 典型下游流程 |
|---|---|---|---|---|
| 多边形网格 | STL/OBJ/GLTF | 兼容3D打印,渲染友好 | 无法参数化编辑,曲面精度有限 | 3D打印、视觉验证 |
| 隐式场提取的等值面 | 高精度网格(可转NURBS) | 曲面连续性好,适合有机形态 | 转换参数化实体时有信息损耗 | 逆向工程、曲面重建 |
| 程序化参数模型 | 代码/CSG操作序列 | 完全可编辑,尺寸参数可改 | 受限于预设几何原语,复杂自由曲面难表达 | 传统CAD二次编辑 |
其中最值得关注的是第三种。它不直接生成网格,而是让大模型输出一段构造几何的代码——比如一序列的拉伸、旋转、布尔运算指令。这类结果在“可编辑性”上远超前两种。我后面在第三部分详细展开它的实操链路。
1.3 “可编辑”不等于“能直接改参数”
还有一个高频误解是“既然叫CAD,生成出来应该能像原生文件那样拖拽特征”。事实是:即便输出的是程序化参数模型,改参数也不是双击尺寸那么简单。因为大模型生成的代码往往没有组织结构,全部过程都堆在一个函数里,没有特征树、没有草图约束,改一处尺寸可能导致整个布尔运算链崩掉。
我之前测试过一个生成“通风机外壳”的方案,生成结果确实是一段带参数的代码,外形也过得去。但我想把进风口直径改小一点,结果布尔减运算因为新直径和侧壁干涉直接报错,整个模型消失。这种事多碰几次,你就会明白:text-to-cad 的意义在于提高“从零到一”的启动速度,而不在于给你一个完美的原生工程文件。
2. 从文本到几何:三种主流技术路线的拆解
2.1 端到端隐式建模:用扩散模型“猜”出体素场
第一种路线的典型做法是用扩散模型(Diffusion Model)直接在三维体素空间或隐式场(如 occupancy field、signed distance field)里做生成。给定文本描述,模型通过多次去噪过程逐渐“勾勒”出一个完整的几何体。逻辑上很像文生图:先有噪声,再逐步让形状浮现。
这套方案的优势是能表达非常复杂的自由曲面和有机形态,比如“一个像树叶的托盘”“一个扭曲的花瓶”,这类形状用传统特征建模能把你逼疯,但它可以一次生成。缺点同样明显:生成的是稠密网格数据,文件动辄几十上百MB,没有特征历史,也不能参数化编辑,只能当“数字黏土”用。
实际项目中,这类方案更适合做工业设计前期的形态探索——迅速生成十个形态版本给客户挑,选中之后再由建模师重新用曲面工具重建。直接拿生成网格去生产基本不现实。
2.2 程序化参数生成:让大模型写代码
第二种路线是眼下工程实用性最强、也是我最推荐初学者入门的方案:让语言模型直接输出构造步骤代码。模型不做三维推理,而是把文本描述翻译成参数化建模工具的API调用序列,或者一套CSG(Constructive Solid Geometry,构造实体几何)操作指令。
比如“一个外径60毫米、内径30毫米、厚5毫米的垫片”,模型会生成这样的伪代码逻辑:先画圆1,再画圆2,然后用圆1拉伸5毫米、用圆2做布尔减运算。整个过程完全是参数化的,你随时可以把60改成70重新生成一遍。
这里的关键设计是“以几何原语为中间语言”。大模型非常擅长生成结构化的代码序列,而不擅长直接想象三维坐标。把三维问题降维成二维操作序列之后,成功率会有质的提升。这也是为什么这类方案能在当前硬件条件下就落地——它本质上复用的是大模型的代码能力,而不是三维推理能力。
这个方案最需要打磨的是“约束求解”环节。因为是从不同角度描述同一个实体,模型生成的尺寸可能彼此矛盾。比如既说“厚5毫米”又说“高8毫米”,最后生成的代码里这两个参数会同时存在,导致几何体自相交或拉伸异常。我在实操中通常会在提示词里强制指定“只能用h表示厚度,所有高度参数必须引用h”,用这种方式把冲突风险压到最低。
2.3 检索与组装式生成:把旧模型库用起来
第三种路线相对冷门但对特定场景极其实用:输入文本后,先从已有模型库中检索匹配度最高的零部件,再通过放置、缩放、布尔操作把它们组装成一个整体。这很像“乐高式”建模——模型本身不是从零生成的,而是对已有资产的重组。
这个方案的亮点在于工程可靠性。检索到的模型来自真实设计库,本身就包含合理的设计意图和可制造性,不会出现自相交面、非流形边这类新手生成模型常见的拓扑错误。缺点是依赖库的规模和质量。如果你要的零件比较冷门,库中根本没有接近的部件,模型就只能靠缩放硬凑,尺寸和比例很容易失控。
实际操作中,很多团队会把第二种和第三种结合起来:组件级别的部件用检索,连接结构、外壳这类定制件用程序化生成。这种“先检后生”的组合策略,在效率和可靠性之间取得了一个比较好的平衡。
3. 把一句话变成可编辑模型:提示词与参数化设计的实操链路
3.1 写提示词的核心:几何描述、尺寸约束、拓扑意图
很多人第一次用 text-to-cad 生成的模型惨不忍睹,90%的问题出在提示词写得像在跟人类聊天,而不是在跟程序对话。机器需要的是结构化的几何指令,不是文学修辞。我把靠谱的提示词拆成三个层次:
第一层:几何原语。明确指定形状的基础构成,比如“先把一个40×40×10的长方体作为主体”,而不是“一个方形的座子”。“方形”太模糊,机器不知道是正方体还是长方体、圆角要不要、边倒角多大。
第二层:尺寸与空间关系。必须使用确定的数值和位置词,例如“在顶面中心位置挖一个直径8毫米的圆孔,圆孔圆心距顶面左边缘20毫米”。这里要注意,“中心”“左边缘”这类词在程序化生成中对应的是坐标计算,必须说清楚参考系。
第三层:拓扑意图。明确特征之间的布尔关系:哪个是主体、哪个是减料、哪个是加料。我常用的句式是“先做A作为底座,再在A的上表面添加B,然后在B的中心位置减去一个C”。这等于直接告诉模型你的CSG操作顺序,能大幅减少几何自相交的问题。
下面是一个我自己调好的范例模板:
生成一个[产品名] 的三维模型,按照以下步骤严格构造: 1. 基础主体:一个[长]×[宽]×[高]毫米的长方体,圆角半径[XX]毫米。 2. 安装孔:在主体顶面[位置描述]处,挖一个直径[XX]毫米的通孔。 3. 加强筋:在主体底部外侧,添加一个[长×宽×高]毫米的矩形加强筋,与主体做并集。 4. 所有孔均用圆柱体与主体做差集实现。 5. 最终输出为参数化代码,所有尺寸使用变量定义,变量命名与上述说明一致。3.2 一个完整示例:从“开孔矩形板”到可修改模型
我拿一个最常见的场景做完整演示:生成一块带四个安装孔的矩形安装板。提示词如下:
生成一块矩形安装板,步骤如下: 1. 创建一个长80毫米、宽60毫米、厚6毫米的矩形块,作为主板。 2. 在矩形块的四个角落分别挖一个直径5毫米的通孔。 3. 四个孔的圆心位置:距离板左边缘和右边缘各8毫米,距离板上边缘和下边缘各8毫米。 4. 板体四边做半径3毫米的圆角。 5. 所有尺寸定义为变量,输出构造代码。以程序化参数生成方案为例,模型会输出一段代码,逻辑大概长这样:
length = 80 # 板长 width = 60 # 板宽 thick = 6 # 板厚 hole_r = 2.5 # 孔半径 margin = 8 # 孔边距 # 1. 主体矩形块 plate = box(length, width, thick) # 2. 计算四角孔心坐标 holes = [ cylinder(hole_r, thick).translate(margin, margin, 0), cylinder(hole_r, thick).translate(length - margin, margin, 0), cylinder(hole_r, thick).translate(margin, width - margin, 0), cylinder(hole_r, thick).translate(length - margin, width - margin, 0), ] # 3. 布尔减 result = plate for h in holes: result = result - h # 4. 圆角 result = result.fillet(3)这段代码拿到手的价值在于:我随时可以改length = 120重新执行一次,得到一块加长板,而不用重新描述需求。这才是 text-to-cad 作为“设计助手”的真正用法——不是一次生成定稿,而是快速生成多个参数版本迭代筛选。
3.3 生成后的人类介入:参数调整与特征修复
代码生成之后,大概率需要人工介入几个环节。最常见的问题是尺寸约束缺失:模型生成的孔位是基于“边距8毫米”口语化描述计算出来的,但实际坐标可能与你预期不符。这时候要检查代码里有没有硬编码坐标,有的话手动改回变量引用。
第二个高频问题是“过定义”:同一尺寸在多个位置被重复定义,且相互冲突。比如前面既定义了hole_r,又在每个圆孔生成处直接写了r=2.5,改一处另一处就不会跟着变。我的习惯是生成后先全局搜索有没有重复的数值字面量,统一替换成对应的变量名。
还有一个问题很少有人提:布尔操作的顺序敏感。同样的减料操作,先减孔再倒角和先倒角再减孔,得到的边缘质量完全不同。如果生成结果在某处出现了破面或异常尖角,第一个排查方向就是调整布尔运算和圆角操作的顺序。
4. 从生成结果到生产可用:格式转换、拓扑修复与工程化落地
4.1 常见格式链路:STL、OBJ、STEP 怎么选
text-to-cad 生成完的结果要进入下游流程,格式选不对一切白搭。我按使用场景把格式分成三档:
STL/OBJ:3D打印和渲染首选。这种网格格式被所有切片软件和渲染器支持,兼容性最好。但它只有表面几何,没有任何拓扑关系和单位信息。我用之前一定会检查单位:有的工具默认1单位=1毫米,有的=1厘米,直接打印会导致模型缩放10倍。
STEP/IGES:工程交换最稳。这是实体模型的通用交换格式,能被主流CAD软件原生打开,保留实体语义。如果生成结果是网格,需要先做“网格转实体”操作才能导出STEP。这一步质量取决于原始网格质量,烂网格转出来的实体也烂。
原生参数化格式:可编辑性最强。这是程序化生成路线独有优势,代码直接生成目标CAD软件能识别的脚本,跳过一切转换损耗。但绑定平台,换软件就废。
我的建议是日常使用建立一条“双轨制”链路:一个支路输出STL用来快速3D打印验证手感,另一支路输出STEP/原生格式用来做工程出图。两条轨不要混用,否则会在单位换算和拓扑转换上反复折腾。
4.2 网格转实体的坑:拓扑清理与缝合
如果你拿到的是网格模型,想把它变成可编辑的实体,中间隔着几步绕不开的工序。网格转实体最核心的操作是“曲面拟合”——用NURBS曲面去逼近网格表面。网格越密、曲面越光顺,拟合效果越好;网格有破损、非流形边、自相交,拟合直接失败。
我分享一个踩过的坑:生成一个壳体零件时,网格内表面和外表面靠得很近(壁厚只有1.2毫米),拟合算法把内外两个曲面识别成了一个波动的整体,导致实体内部出现了异常的空腔。后来我在拟合前先做了“抽壳检测”,把内外表面拆分成两个独立点集分别拟合,问题才解决。
拓扑修复的命令在各软件里叫法不一(有叫修复、有叫愈合、有叫闭合),但逻辑相同:检查非流形边、删除重复面、填补孔洞。这套流程极其依赖网格质量,不要指望神级算法能“无中生有”把烂网格救活。如果源网格差到一定程度,我的止损策略是直接重新生成一次,把前一步的提示词中相关描述改得更明确,而不是在修复上耗费数小时。
4.3 接入现有CAD环境的三个习惯
第一,先锁定原点再导入。生成模型的坐标系原点和你的装配基准通常不重合,导入后第一步永远是把模型原点对齐到主装配原点。省掉这一步,后面每次装配都会埋雷。
第二,统一单位和中途不要切单位。打印行业习惯毫米,CAE分析习惯米或毫米,不同环节之间切换时极易出错。我的做法是约定所有生成输出都按毫米导出,并在文件名里带_MM后缀,这样任何时候打开文件都知道单位前提。
第三,保持特征树精简。程序化生成代码如果没用函数封装,导入CAD后特征树可能膨胀到几百个节点,后续编辑卡到怀疑人生。我导入后会立刻做一次“特征清理”,把连续的小特征合并成组,把重复的草图约束删掉。这个操作能让文件体积下降一半以上,操作流畅度提升也非常明显。
5. 边界之外的坑:尺寸漂移、对称性丢失与装配逻辑
5.1 为什么读到的尺寸和生成出来的尺寸总对不上
这是最让人困惑的一个坑:提示词里明确写了“直径8毫米”,生成结果一量变成了8.7毫米。问题通常出在两个环节:
一是单位解释歧义。许多模型的训练数据来自混合单位的网络社区,模型一会儿遇到毫米、一会儿遇到英寸、一会儿遇到“一个大概拳头这么大”的模糊描述,它对“8”这个数字应该对应多大实体没有稳定锚点。解决方式是我在上面提到的“锁定参照系”:不只给数字,还给对照物,比如“相当于一支标准铅笔的直径(约7-8毫米)”,模型能更好对齐物理尺度。
二是离散化误差。隐式建模方案的网格分辨率有限,例如在128³的体素网格上,直径8毫米的孔映射到网格上可能实际占7~9毫米的体素。这个误差在低分辨率下根本无法消除,属于方案本身的天花板。如果你做的是精密配合件,建议直接用程序化参数方案,数值由代码精确控制,不存在离散化问题。
5.2 对称性丢失的根因
另一个高频问题是“左右不对称”。要求生成一个左右对称的支架,结果左边加强筋尺寸正常,右边明显多出一块。根因有两层:
第一,大模型生成几何时是逐步推断的,不是整体规划的。它先画左半,再画右半,两个过程之间没有物理上的镜像约束,对称性只能靠模型潜在的先验知识维持,天然不可靠。
第二,程序化生成方案里,对称操作需要显式写出“镜像”指令。模型如果没有在代码中使用镜像函数,而是把两侧特征分别硬写一遍,那么只要某一侧坐标计算有半点偏差,对称就破了。
我的规避手段很简单:生成后立刻做一次对称检查脚本,找出模型的最大包围盒中心面,逐点对比两侧的偏差值。偏差超过0.1毫米就直接在提示词里追加“使用镜像操作生成右侧特征”,强制模型调用镜像API,而不是手动复制坐标。
5.3 装配体生成:单零件模型与装配逻辑之间的鸿沟
很多人兴奋地输入“生成一个减速器装配体”,得到的往往是一个把所有零件融成一坨的几何怪兽——所有零件之间没有间隙、没有约束关系、没有命名。这是因为装配本质上是“零件之间的关系描述”,而当前 text-to-cad 模型更擅长处理“单个物体的绝对形状”。
如果你确实需要多零件场景,我的做法是拆分生成:先给每个关键零件单独生成独立的模型文件,再在CAD环境里手动装配。每个零件生成时,我都会在提示词中指定“与相邻零件配合处的尺寸为XX,预留0.2毫米间隙”。这样虽然花的时间多,但每个零件都是干净的、可替换的,装配逻辑也不会乱。
还有个小技巧:生成零件时同时生成一个“配合标记”命名前缀,比如SHAFT_01、BEARING_SEAT_01,导入装配环境后能快速识别部件角色。别小看这一步,装配体超过十个零件之后,命名混乱会让人彻底抓狂。
6. 一个更务实的用法:text-to-cad 应该嵌在流程的哪个位置
6.1 概念草图阶段的“数字便利贴”
现在我习惯把 text-to-cad 当成会议中的“数字便利贴”。设计讨论时说到“这里加个卡扣结构”,当场生成一个粗模投到屏幕上,大家对着实物讨论,比白板画圈高效得多。等到方案思路定下来,再由专门的建模师按正式流程做干净模型。这个“先看后做”的模式几乎不增加成本,但能极大减少方向性返工。
在这个场景里,模型精度完全不重要,重要的是“能让人看见”。我通常会要求生成结果输出成低分辨率网格,文件小、加载快,演示时不会卡顿。
6.2 生成中间体再交给分析工具
另一个我低频但稳定的用法是生成“拓扑优化前体”。传统拓扑优化需要一个初始设计空间——一个大方块或一个粗略外形体。以前我要手动建这个方块,现在直接输入“生成一个长200毫米、宽100毫米、高80毫米的实心长方体,作为拓扑优化设计空间”,5秒钟拿到文件,省掉重复劳动。
还有一种用法是把生成模型直接导入流体分析工具做定性判断。比如一个弯管接头的生成结果,流体仿真跑一遍看压力分布趋势,虽然数据绝对精度不足,但能快速对比三种形态方案的优劣排序。这个“相对比较”思路在早期选型时比追求绝对精度更实用。
6.3 生成模型库的整理与组织
使用 text-to-cad 一段时间后,你会积累大量生成模型。如果不整理,几周后就变成一堆output_v3_final_final2.stl这样的烂摊子。我现在建了一个目录结构,按“项目编号/用途/版本”三层管理,同时把每次使用的提示词原文存成同名.txt文件,与模型文件放一起。
这个习惯的作用在复盘时体现得最充分:两个月后翻回来看,一眼就能明白当初这个模型要解决什么问题、用了什么参数。继续迭代时直接复制提示词改几个参数再生成,不用从零描述。我觉得这是让 text-to-cad 真正沉淀成“团队资产”而不是“一次性玩具”的关键一步。
我自己的经验是,把 text-to-cad 放在“从想法到可视形态”这一段是最舒服的定位:前端的语义理解交给大模型,后端的工程精度交给人。和所有生成式工具一样,它的价值不在于替代设计师,而在于把设计师从重复的描述性劳动里解放出来,让人把精力留给真正需要判断力的那些问题。如果你准备开始折腾,先从第二部分的程序化参数路线入手,成功感和可控性都会好很多。