前阵子有个朋友拿着一个零件照片和一段文字描述找到我,说“帮我做个带四个安装孔的矩形连接板,长80、宽50、厚10,孔距70乘40,孔径8”。我把这段描述直接喂给一套text-to-cad工具,没动手画任何草图,它就返回了一个可编辑的CAD模型。这个体验让我有点兴奋,因为它正在把“设计意图”和“建模操作”之间的那堵墙打通。text-to-cad,简单说就是文本生成CAD模型:用自然语言描述你想做的零件,AI理解后生成对应的三维模型,甚至带参数化特征树。这篇东西不给你堆论文,我只讲自己实际跑下来的理解、可复现的流程、以及踩过的坑,希望能帮正在观望或刚开始试水的人省点时间。
1. 先把概念讲透:Text-to-CAD 到底在解决什么问题
1.1 传统CAD建模的瓶颈到底卡在哪
用过SolidWorks、FreeCAD或者任何一款参数化建模软件的人都知道,建模本身并不难,难的是“把脑子里的想法变成软件里的约束和特征”。你画一个法兰,先建草图、标尺寸、加几何约束,然后拉伸,再选面打孔,还要设置阵列参数。这套流程对熟练工可能只要几分钟,但对新人和不会CAD的机械、产品、结构岗位来说,学习成本是肉眼可见的陡峭。更重要的是,很多设计讨论发生在模型存在之前,大家靠手绘、口头描述和PPT沟通,等终于打开CAD开始建模时,真正的问题往往已经从“这东西能不能做”变成了“软件怎么操作”。
传统CAD的另一个痛点是重复劳动。标准件、连接板、支架、外壳这类零件,结构相似、尺寸不同,但每次都要从头画一遍。老工程师会把常用零件做成模板或参数化族,但这本身需要额外的时间和经验。我见过不少团队,大量时间不是花在创造性设计上,而是花在把一张草图变成三维实体,再根据下游反馈改尺寸、改孔位、重新导出。这个过程效率低,还特别容易出错。
1.2 文本驱动设计:把自然语言变成建模输入
text-to-cad的出现,本质上是把“设计输入”从鼠标键盘切换成了自然语言。你不需要记工具栏在哪,不需要知道拉伸和切除的命令顺序,只需要说清楚“要什么、多大、几个孔、孔在哪里”。AI背后的语言模型负责把这句话拆解成对象、尺寸、特征、位置关系,再交给生成模块去构建几何体。对于专业工程师来说,它的价值不是替代设计,而是把最无聊的草图步骤压缩成几句话。
这类工具对非专业用户的意义更直接。比如做3D打印的爱好者,脑子里有个手机支架的形状,但不会CAD,现在可以描述出来,先生成一个模型再微调。又比如产品经理想要一个概念模型和结构团队对齐,不用等建模师排期,先让AI出一个差不多的形状讨论空间关系。它没有消灭CAD,而是把CAD的入口变宽了,让“不会建模”和“没时间建模”的人也能参与三维设计的前置环节。
1.3 别把“生成一个模型”和“生成CAD”混为一谈
这里我必须说一个容易混淆的点。很多普通人第一次接触文本生成3D,可能是通过生成图片式工具的“文生3D模型”,比如输入“一只红色的椅子”,得到一个网格模型或点云。这类模型看起来是三维的,但它只是“视觉上的三维”,导进CAD软件后往往是一个不可编辑的三角网格,没有特征树,没有参数,没法改尺寸。真正的text-to-cad,目标不是生成一坨漂亮的模型,而是生成“可以被设计软件继续编辑”的CAD模型,最好带草图、拉伸、打孔这些历史特征,甚至保留参数化约束。这个区别,直接决定了你在后续工作流里是“在模型上做修改”还是“重新再生成一次”。
2. 核心原理拆解:从一句话到可用模型的完整链路
2.1 文本怎么变成结构化的设计意图
整个流程的第一步,是让大语言模型理解你的自然语言描述。这件事看起来简单,实际上比想象中复杂。模型需要从一句话里提取出几个关键维度:主体是什么(法兰、支架、外壳)、主体尺寸(长宽高、直径、厚度)、特征类型(圆孔、腰形槽、倒角、螺纹孔)、特征位置(均布、中心距、阵列方式)、以及隐含的设计要求(比如“能安装M6螺丝”意味着孔径要留间隙)。这一层本质上是“实体识别 + 关系抽取 + 参数抽取”。
实际操作中,我强烈建议不要让语言模型“自由发挥”地输出一段描述,而是让它输出结构化的中间结果。最常用的方式是JSON格式:对象名、主尺寸、特征列表、约束关系。这样后面的建模模块才能稳定读取,不会出现“模型生成了但孔的位置是猜的”这种问题。提示词里可以约定输出格式,比如“请返回JSON,包含objects、dimensions、features、constraints四个字段”。这一步是整条链路里最值得花时间调优的地方,因为文本理解错了,后面生成出来的几何基本就是废的。
2.2 生成目标怎么选:网格、点云、B-rep还是隐式场
这是text-to-cad技术路线里最核心的分歧点。先简单说一下几种3D数据表示方式。
点云和体素是早期文本生成3D的主流输出,直接用神经网络预测空间里的点或占据格。优点是实现相对简单,视觉上能看个大概,缺点是几何精度差,无法作为CAD模型使用。
网格(Mesh)比点云前进了一步,有面片结构,可以渲染、可以3D打印,也能导入Blender或CAD做网格编辑。但它仍然不满足“CAD可编辑”的要求,因为网格只是一堆三角形的集合,没有说明“这个面是拉伸出来的”还是“这是扫掠出来的”。
B-rep,也就是边界表示,是CAD软件内部真正认的格式。它记录实体的面、边、顶点拓扑,以及每个面的几何方程。生成B-rep比生成网格难得多,因为不仅要预测形状,还要保证拓扑闭合、面与面之间精确连接。
隐式神经场(比如SDF)是最近几年很火的表示方式,用神经网络逼近一个空间函数,哪个位置在实体内部、哪个位置在外部,然后通过算法提取等值面变成网格。它能表示复杂拓扑,但提取出的网格同样存在转成CAD难的问题。
如果你想要“可编辑的CAD”,就要关注那些直接生成B-rep或生成“建模操作序列”的方案。比如有些论文把建模过程拆成“草图 + 拉伸 + 打孔”这样的操作序列,然后用模型一个接一个地预测,最终在CAD内核里重建出带特征历史的实体。这一步才是真正的text-to-CAD,而不是text-to-mesh。
2.3 两种生成策略:一次到位还是分步构建
目前主流的方案大致分成两类。一类是“一步到位”:文本输入进模型,直接输出完整的三维几何体,不管它内部是怎么生成的。另一类是“分步构建”:模型先理解文本并生成二维草图,再决定用哪些建模操作把它变成三维实体,例如拉伸、旋转、切除。分步构建之所以更有前途,是因为它更符合工程师的思考方式。设计师脑子里其实也不是直接浮现一个完整实体,而是想象“先画个底板,再凸起一块,再打几个洞”。更重要的是,分步生成的中间产物——草图——是可以在CAD软件里直接修改的。哪怕最终结果不完全符合预期,你也能像改普通模型一样去改它,而不是重新生成。
我实际测试下来,分步生成方案在标准机械零件上的成功率要高不少,尤其是法兰、连接板、支架这一类特征规则、边界清楚的零件。对于自由曲面类的造型,比如“一把符合人体工学的鼠标外壳”,分步生成就会非常吃力,这时候一步到位的生成反而更合适。所以工具选型不是看谁更先进,而是看你要什么类型的零件。
3. 实操准备:跑通一条最小可行的Text-to-CAD流程
3.1 环境与工具怎么选,硬件要求到什么程度
如果你是想快速体验,第一选择是直接用哪些已经封装好的在线工具或者开源Demo,能省掉一大半环境搭建时间。但我更建议自己本地跑一遍开源模型,这样你能看清每个环节的输入输出,后面做二次开发心里有底。常见的开源模型包括Text2CAD、CAD-Editor这类面向CAD序列生成的项目,以及一些通用的文生3D模型可以作为前置视觉生成参考。
本地环境方面,我的建议是准备一张至少8GB显存的NVIDIA显卡,显存太小跑不动稍大一点的模型。CPU模式不是不能跑,但一个中等复杂零件可能要几分钟甚至更久,调试时特别影响心态。软件依赖主要是PyTorch、transformers、open3d、trimesh,以及一个CAD内核用于重建,比如OpenCascade或者FreeCAD的Python接口。
这里给一个示例环境准备命令,具体包名和版本以项目仓库最新说明为准:
conda create -n text2cad python=3.10 -y conda activate text2cad pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install transformers open3d trimesh numpy matplotlib pip install cadquery # 可选,用于参数化CAD重建和导出STEP装完后建议先用仓库自带的数据集或样例跑一次推理,确认模型权重下载和CUDA调用都没问题,再开始改自己的文本描述。不要一上来就指望直接生成复杂装配体,十个里有九个会在第一步报错。
3.2 提示词怎么设计:机器需要的是规格,不是散文
关于text-to-cad,提示词的重要性被很多人低估了。文本生成图片时,你可以写“傍晚的湖边,暖色调”,模型能画出氛围。文本生成CAD时,这种模糊描述基本没用,因为CAD模型需要的是确定性的几何参数。模型哪怕再聪明,也没法替你决定“一个漂亮的支架”到底是多长多宽。
我根据自己的测试总结了一套提示词模板,分成四个部分:对象、主体尺寸、特征、约束。举个例子:
A rectangular mounting plate. Overall dimensions: length 80 mm, width 50 mm, thickness 10 mm. Features: four through holes, each diameter 8 mm. Hole pattern: evenly spaced in a rectangular array, center distance 70 mm in length direction, 40 mm in width direction. Constraint: holes are centered on the plate surface.如果你用的是支持中文的模型,也不是非要写英文,但工程术语建议用英文更稳,因为很多模型训练数据里英文CAD语料的占比更高。关键参数要写成“精确数字 + 单位”的格式,不要用“大约”“稍微”“几个”这种模糊词。“几个孔”让模型自己猜,大概率给你三个或者五个,而不是你想要的四个。
3.3 生成完之后,怎么从结果变成能继续编辑的CAD文件
生成本身只是第一步。无论模型输出的是网格、B-rep还是CAD操作序列,你最终都需要落到一个通用格式上,方便在主流CAD软件里继续处理。我推荐的目标格式是STEP,这是产品设计流程里最通用的中间格式,FreeCAD、SolidWorks、Fusion 360都能打开。
如果模型直接输出CAD操作序列,那么流程很简单:安装CadQuery或pyOCCT环境,把模型输出的操作序列转成脚本,执行脚本后导出STEP文件。如果模型输出的是网格,也不是说不能用,你可以先检查网格质量,再用FreeCAD的网格转形状功能或者OpenCascade的网格重建算法,把它近似转换成可编辑实体。但注意,这个转换会带来精度损失,复杂的自由曲面转出来可能会破面。所以如果项目对后续修改要求高,从一开始就优先选能输出CAD序列或B-rep的模型,别图省事用网格方案。
4. 实战复盘:让AI做一个“带法兰孔的连接板”
4.1 设定目标与提示词
用一个最简单也最典型的零件来做完整测试:一块矩形连接板,长度80毫米,宽度50毫米,厚度10毫米,四角各有一个直径8毫米的通孔,孔的中心位置分别在长边方向距离两端各5毫米、短边方向距离两端各5毫米。这个零件看起来简单,但已经涉及主体建模、切除和阵列三个基本操作。
我用的提示词大概是这样的:
Create a rectangular plate with length 80 mm, width 50 mm, thickness 10 mm. Add four through holes with diameter 8 mm. Hole centers are located at the four corners with offset 5 mm from each edge.这里我故意把“四个角”和“偏移5毫米”都说清楚,不给模型任何自由发挥空间。如果你只写“四个角各一个孔”,模型可能把孔打在正中心点,或者打在角落边缘一半的位置,后期根本没法用。
4.2 生成结果与几何校验
生成完之后,必须做校验,不要肉眼看一眼觉得“像那么回事”就完事。我在跑完第一步生成后,会用Python脚本读取STEP文件,检查几个关键数据:实体的整体包围盒是否约等于80×50×10毫米;面上是否有四个孔;孔的直径是否接近8毫米;孔中心与边缘的距离是否接近5毫米。
检查包围盒的脚本示例:
import cadquery as cq result = cq.importers.importStep("output.step") bbox = result.val().BoundingBox() print("length:", bbox.xlen) print("width:", bbox.ylen) print("height:", bbox.zlen) # 检查实体数量,正常应该只有一个实体 solids = result.solids() print("solid count:", len(solids.val()))实测下来,生成结果的尺寸偏差往往在10%以内就算不错了。但要注意,如果你的零件是要装配的,10%的误差完全不可接受。所以后续一定要在CAD软件里重新标注约束,或者用参数化脚本重建一遍。
4.3 后处理:把AI结果变成你真正能用的零件模型
生成结果里最常见的问题是孔的间距和位置有问题。比如模型确实生成了四个孔,但孔间距不是70×40,而是偏差了一点点;或者孔的形状看着像圆,但实际是个椭圆。这种问题靠后处理工具很难完美修复,我目前的处理策略是:不直接修改AI生成的几何,而是把AI输出的参数提取出来,作为参考,然后在CadQuery里用明确的尺寸重新画一个。
比如根据识别出的参数,写一段确定的建模代码:
import cadquery as cq plate = ( cq.Workplane("XY") .box(80, 50, 10, centered=(True, True, False)) ) result = ( plate.faces(">Z") .workplane() .pushPoints([(-35, 20), (35, 20), (-35, -20), (35, -20)]) .hole(8) ) cq.exporters.export(result, "plate_final.step")这种方式虽然牺牲了“完全自动化”,但能保证结果百分之百可控。我个人的工作习惯是让AI做“参数提取和方案生成”,真正落到尺寸约束时,我用人眼确认一遍,再用脚本重建。现在这批工具的定位是“辅助设计”,不是“自动驾驶”,你越早接受这一点,用起来越顺手。
5. 坑都踩过:常见问题与排查思路
5.1 生成的几何体存在破面和法线错误
如果你选择的是网格输出方案,大概率会遇到破面、非流形边、法线方向不一致这些问题。三维模型要能被CAD软件和切片软件正确处理,必须是一个封闭流形:没有裂缝、没有重叠面、每条边恰好被两个三角形共享。我遇到过一种情况,模型生成出来渲染效果很好,但一导进FreeCAD就报错说实体无效,检查后发现是底部有几个三角形法线反了,导致整个实体看起来像个“反过来的碗”。
排查思路其实不复杂。先用trimesh检查网格是否水密:
import trimesh mesh = trimesh.load("output_mesh.stl") print("is watertight:", mesh.is_watertight) print("is volume positive:", mesh.is_volume)如果结果显示不是水密的,可以对网格做修复,比如用trimesh的fill_holes、remove_duplicate_faces等方法。但我要提醒一句,自动修复对轻微破损有效,对大面积拓扑错误基本无能为力。更实用的方法是回到生成阶段,调整提示词让模型减少悬垂或复杂倒角结构,从源头降低几何复杂度。
5.2 尺寸比例失控,尤其是不止一个零件的时候
单个零件通常还好,一旦文本描述里出现“底板旁边有个圆柱凸台,圆柱上方有个小安装座”这类多组关系,模型经常会在尺寸比例上翻车。典型症状是底板明明写了100毫米长,结果生成的圆柱凸台直径比底板还大。原因是语言模型对数值关系不够敏感,它抓到了“有底板、有凸台”,但没有严谨执行“凸台直径是底板宽度的三分之一”这种比例约束。
针对这个问题,我的经验是不要把比例关系交给模型推断,直接用绝对尺寸写清楚。比如“底板长100毫米、宽60毫米;中央圆柱凸台直径20毫米、高15毫米;凸台中心位于底板中心”。句子里不要出现“稍大”“较厚”“差不多”这类相对词。你给的约束越具体,比例失控的概率越低。
5.3 可编辑性丢失,生成完才发现改不了尺寸
这个坑我踩得最痛。早期我试过一个看起来很厉害的文本生成3D工具,输入“一把办公椅”,它生成了一把视觉上完整的椅子模型,但导出是OBJ网格。我以为能像普通CAD文件一样拉个尺寸,结果发现网格没有任何草图和约束,只能整体缩放,根本没法单独把椅背改高一点。这种文件除了当展示图,在生产环节几乎没用。
所以你在选方案前,先确认自己到底要“视觉模型”还是“CAD模型”。如果只是做效果图、做动画、做展示,网格完全够了。如果你要出工程图、做CNC加工、3D打印并反复改尺寸,那就必须走CAD序列生成或B-rep生成的路线,哪怕它目前对复杂造型支持不好,但至少给你留了编辑的后门。
5.4 常见问题速查
| 症状 | 可能原因 | 处理建议 |
|---|---|---|
| 生成结果是网格而不是实体 | 模型输出格式就是网格 | 用FreeCAD或OpenCascade做网格转形状,或换支持B-rep的模型 |
| 孔位偏了,偏差0.5毫米 | 文本中缺少孔中心相对位置约束 | 在提示词里用绝对坐标或相对距离明确写出来 |
| 多个特征之间比例失调 | 模型对相对尺度不敏感 | 每个特征都用绝对数字+单位说明 |
| 模型可编辑性差 | 输出缺少特征树和参数化历史 | 选择分步生成方案,或后续用CadQuery重建 |
| 推理速度太慢 | 显存不足或未使用GPU推理 | 检查CUDA环境,降低模型分辨率设置 |
| 中文描述生成效果不稳定 | 训练语料中英文CAD数据占比高 | 关键工程词用英文,中文只做语境描述 |
6. 用了一段时间后,我给新手的几个实在建议
6.1 先接受“它是助手,不是设计师”
如果你平时不接触CAD,text-to-cad确实能帮你生成一些简单的零件模型。但如果你以为它能替代真正的结构设计,那一定会失望。当前这批工具对标准零件、规则特征、简单装配关系处理得还可以,但面对复杂曲面、公差分析、材料选择、制造工艺约束,它们基本帮不上忙。AI可以几秒钟给你一个法兰毛坯,但它不知道这个法兰在实际工况下要多厚、螺栓要用多大扭矩、要不要倒角避免应力集中。所以我的心态是:让AI做前50%的效率提升,剩下50%的判断留给我自己。
6.2 掌握“参数化重建”这个兜底能力
我现在的固定流程是:AI先生成模型,我查看整体形状是否符合预期,然后不管它的结果多好,我都会重新做一个参数化版本。所谓参数化重建,就是我用CadQuery或FreeCAD脚本,把AI识别出来的关键参数写进代码,生成一个确定性的CAD模型。这样做有两个好处:一是所有尺寸都由我控制的变量决定,后续改尺寸只需要改变量,不需要重新画;二是规避了AI在局部细节上的随机错误。你可以把AI模型当“设计意图解码器”,把参数化脚本当“精确执行器”,两个配合起来,效率和可靠性兼顾。
6.3 从小零件练起,把提示词模板沉淀下来
最后给一个可落地的小技巧。不要一上来就用“设计一套自动化设备外壳”这种宏大描述,从单件小零件开始,比如一个带孔连接板、一个L型支架、一个圆形法兰。每次生成后记录两件事:一是提示词里哪些措辞导致结果偏差,二是这个模型在生成哪种特征时最稳定。跑过十几个零件之后,你会形成自己的提示词模板库。以后再遇到类似零件,几分钟就能出一个可用模型。text-to-cad这个方向我还会继续跟进,但就目前而言,先把这些基本功练扎实,比追着新模型跑更有价值。