前阵子我接手了一个传感器安装座改型的小任务,客户那边没有图纸,只有一段话:"在原底座上加一个凸台,上面开两个M4螺纹孔,凸台位置不要太妨碍走线。"按照以前的流程,我得先自己脑补出几种布局方案,再打开CAD一笔一笔画,改完还要给同事评审装配干涉。那次我试着把这段需求喂给一个文本生成CAD的实验工具,十几分钟后就拿到了一版能打开的三维模型,虽然细节还要改,但设计起点确实被大大压缩了。text-to-cad这类工具解决的核心问题很简单:把一段自然语言需求,变成可以落地的初始CAD模型。这篇文章我会把这类工具的选型思路、提示词设计、参数调节、问题排查和工程化边界一次讲清楚,适合机械设计、结构工程师、创客以及刚接触三维建模的同学参考。
1. text-to-cad到底在解决什么问题:从口头需求到第一版模型
1.1 设计链条里最花时间的不是建模,而是"把话变成图"
机械结构改型、非标设备设计、创客打样,这类工作每天都会收到大量"口头需求"。最麻烦的不是软件操作,而是信息不对称:你说"一个支架",对方脑补的却是另一种形状。传统流程里,设计师要先把含糊的话翻译成工程约束,再建模,再拿给需求方确认。中间任何一次理解偏差,都要回到CAD里重画。text-to-cad的定位是在最前端做翻译:让模型先出来,让双方对着模型校准需求。
当然,这里的"翻译"不等于"设计"。它只能把你描述得足够清楚的部分变成模型,描述不清楚的部分它就会猜,这也是后面要反复强调的边界问题。所以用好这个工具的前提是,你必须先知道它背后是怎么工作的。不少人第一次用text-to-cad觉得"不靠谱",多半是期望摆得太高,以为扔一句话过去就能拿到可以直接送去加工的图纸。实际上它解决的是"从0到0.1"的问题,把空白画布变成一张有形状的草稿,剩余的设计判断和工艺调整,仍然需要人来完成。
1.2 主流实现路线对比:脚本生成与端到端生成
目前我接触到的text-to-cad实现大致分成两类。
第一类是脚本生成路线。模型根据你的描述输出一段程序,程序再通过几何内核构建实体。常见的脚本载体包括CadQuery(基于Python)、OpenSCAD、SolidPython等。这类路线的特点是:可参数化、可修改、精度高,生成的是真正的边界表示实体(B-Rep),后续可以直接导入主流CAD平台继续编辑。对工程场景来说,这条路的优势非常明显,因为你拿到的不只是一个死形状,而是一套可以被改尺寸、改特征的逻辑。
第二类是端到端生成路线。模型直接输出三维网格或体素,类似AI图像生成那样"画"出一个形状。优点是速度快、造型自由度大,特别适合生成有机曲面这类传统参数化建模很费劲的东西。但输出的是三角形网格,不是工程意义上的实体,孔、螺纹、公差这类特征基本都不带,导入CAD后很难直接基于它做装配和加工。
两类路线对比看下来,我个人的倾向性非常明显:但凡要进生产流程,就走脚本生成路线;如果只是做概念验证、快速看形态,端到端路线也能接受。下面的表格可以看得更清楚:
| 对比维度 | 脚本生成路线 | 端到端生成路线 |
|---|---|---|
| 输出格式 | STEP/IGES/STL | STL/OBJ |
| 特征精度 | 高,孔、螺纹、倒角可定义 | 低,多为外形近似 |
| 可编辑性 | 强,参数可回改 | 弱,需重新建模 |
| 生成速度 | 较慢,需执行脚本 | 较快 |
| 适合场景 | 加工件、装配结构 | 概念展示、手办、造型探索 |
另外,有些工具会尝试混合路线:先用端到端生成一个参考形状,再用脚本路径重新参数化。这个方向现阶段还不成熟,但逻辑上是打通"自由造型"和"精确建模"的正确思路。如果你看到这类工具,可以保持关注,但不要把它当主力。
2. 从一句话到能造出来的零件:提示词设计与参数解读
2.1 提示词的本质:把口语翻译成带约束的几何语言
同样一句"生成一个带孔的长方体底座",新手和老师傅写出来的提示词,得到的结果完全不同。原因在于,几何描述里的每个词都可能对应多种解释。"长方体底座"默认长宽高多少?"带孔"是通孔还是盲孔?"孔"在顶面中心还是偏心?孔径多少?这些不确定项,模型只能靠概率猜。
我的做法是给提示词定义一个固定结构,按顺序写:
- 整体任务:生成什么、最终导出什么格式
- 全局单位:强制声明毫米或英寸
- 主体尺寸:长、宽、高、外径、壁厚
- 特征清单:每个特征的类型、位置、尺寸、贯穿关系
- 拓扑关系:垂直、平行、同轴、偏移要求
- 外观处理:倒角、圆角、拔模
一个反面例子是:"做一个带孔的底座,边长约为100,孔在中间,尽量圆润一点。"模型大概率会输出一个尺寸含糊的方块,孔的位置近似居中,倒角大小全看运气。
改成下面这样,成功率会高非常多:
使用CadQuery生成一个铝制底座,单位为毫米。底座整体为长方体,长120,宽80,高15。在顶面中心位置打一个直径10毫米的贯穿圆孔,孔轴与顶面垂直。四条竖直边做2x45度倒角。导出STEP文件。
注意,这里我把"圆润"翻译成了"2x45度倒角",把"中间"翻译成了"顶面中心、孔轴垂直"。模型不需要理解美学,它需要的是确定性的几何指令。你在提示词上多花的每一分钟,都会在后续排查里省回来。
2.2 推理参数怎么调:温度、Top-P、最大长度
很多人拿到text-to-cad工具,第一步就是把temperature调高,觉得这样能激发创造力。对文本生成效果可能成立,对CAD生成却是灾难。temperature偏高时,模型会倾向于在一些尺寸数字上"自由发挥",比如把120写成115,把10写成9.5。这些偏差在视觉上一眼看不出来,落到加工图上却很麻烦。
我实践下来的推荐初始参数是:temperature设置在0.2以下,top_p设置在0.9左右,最大生成token尽量给足,不要让它把脚本写到一半截断。脚本被截断是这类工具最常见的失败原因,一个完整的CadQuery脚本通常有几十行,加上注释可能上百行,如果你把输出长度卡在500 token,模型只能草草收尾,特征丢失几乎是必然的。
另外可以尝试"分层输出"策略:先让模型输出几何规划,再让模型输出脚本代码。分两步生成的稳定性明显优于一次直接出代码。原理也不复杂:先把约束以稳定的文本形式固定下来,再翻译成代码,出错的空间就小了很多。这个技巧尤其适合结构稍微复杂一点的零件。
2.3 执行链路与格式验证:生成脚本之后还有一半工作
模型生成脚本只是第一步,后面还有执行和验证。以CadQuery为例,生成的Python脚本要在本地或云端执行,系统会用OpenCASCADE几何内核做布尔运算,最后导出STEP或STL。这个环节最常见的坑有三个:
- 环境缺依赖,比如OCC库没装好,脚本一执行就报错
- 布尔运算失败,比如两个实体刚好相切,几何内核求交失败
- 单位不一致,模型给出的数值和默认环境不一致,导致零件忽大忽小
验证阶段一定要看三个指标:模型是否水密(watertight)、包络尺寸是否符合预期、体积是否合理。很多工具提供网格分析和破面检查,如果模型存在开放边、非流形边,那生成的结果基本不能进加工流程。这一步强烈建议在导出前做,不要等导入CAD后再发现,那时候返工成本就高了。
3. 实操示例:从自然语言到能打开并导出的底座模型
3.1 环境准备与依赖安装的潜规则
如果你的目标是走脚本生成路线,环境准备并不复杂,但有几个细节非常影响体验。
我之前在本地试的时候踩过一个坑:在Windows环境下,直接pip install cadquery经常会遇到编译问题。不是CadQuery本身难装,而是它依赖的OCP(OpenCASCADE的Python绑定)体积很大,而且对Python版本敏感。建议用官方推荐的方式,要么用conda环境,要么用官方Docker镜像。我后来是直接用conda建的独立环境,装完一次到位,没有再碰过版本地狱。
OpenSCAD作为备选方案更轻量,它的DSL语法更适合小零件描述,而且没有编译依赖,下载即用。如果你只画一些简单结构件,OpenSCAD路线可能比CadQuery更顺手。
给一个最简环境清单:
- Python 3.11+环境,conda或venv都行
- cadquery库及依赖
- 一个能预览STEP的CAD软件,标准CAD软件都能打开STEP
- 可选:OpenSCAD,用于跨平台快速验证
3.2 第一个实例:生成带孔底座并导出STEP
假设我们要生成一个120x80x15mm的带孔底座,提示词直接沿用上一节的版本。模型输出脚本后,结构通常会类似下面这样。我根据CadQuery常见写法整理了一份等价代码,用来展示执行链路:
import cadquery as cq base = cq.Workplane("XY").box(120, 80, 15) # 在顶面中心打贯穿孔 hole = ( cq.Workplane("XY") .workplane(offset=15) .circle(5) # 半径5mm,对应直径10mm .extrude(10) # 向下贯穿 ) result = base.cut(hole) result = result.edges("|Z").chamfer(2) cq.exporters.export(result, "base.step")类似的脚本执行后,可以在本地预览到带倒角的底座。这里有个关键点:circle(10)里的10是半径还是直径,在不同库里语义不一样。CadQuery里circle接受的是半径,所以直径10mm的孔应该写circle(5)。看到没,模型生成代码时也经常在这个语义上栽跟头。如果你的提示词写"直径10毫米",模型按半径来处理,出来的就是20mm的孔。建议在提示词里主动标明语义:"直径10毫米,如果库默认入参为半径,则使用半径5毫米。"啰嗦一点,但能省去很多返工。
3.3 复杂零件:拆句子比拆模型更重要
等你能用一句话生成简单底座,下一个自然问题是:能不能用一句话生成一个装配体?我也试过直接描述"一个电机支架,包含底板、侧板、四颗螺丝",输出结果基本不能直接用。原因在于,装配体涉及零件间的配合关系,比如同轴、面贴合、间隙,这些关系用自然语言表达时太长,模型很容易做到前两句、丢后几句。
可行的做法是拆层次。第一步,先把装配体拆成零件清单,每个零件单独用text-to-cad生成。第二步,再用一个参数化装配脚本把它们装起来。第三步,把装配体导出STEP,在CAD软件里做干涉检查。
举个例子,电机支架可以拆成:底板、左立板、右立板、加强筋、四组螺栓。底板描述里只写底板的尺寸和孔位,立板描述里只写立板的尺寸和孔位,最后在装配脚本里声明"左立板底面与底板上表面前端贴合,两个安装孔与底板孔同轴"。这个过程本质上就是在教模型"一次只说一件事",等于把人类的系统设计能力前置到了提示词阶段。
4. 输出不对,先别急着改代码:一套完整的排查链路
4.1 先按现象归类,再决定改哪里
text-to-cad生成出问题不可怕,可怕的是无头绪地反复试。我总结了一套按现象分类的排查思路,先把问题归类,再动手改。
| 现象 | 最可能原因 | 优先处理方向 |
|---|---|---|
| 尺寸整体偏大或偏小 | 单位理解错、temperature过高 | 检查提示词单位声明,把temp降到0.2以下 |
| 孔或槽的位置明显偏移 | 定位描述不完整 | 补充"与哪个面、哪条边、哪个点对齐" |
| 某个特征完全缺失 | 特征顺序太靠后,token截断 | 加大max tokens,或拆成两步生成 |
| 生成结果呈网格状,没有工程特征 | 走了端到端路线 | 换脚本生成路线,重新约束输出格式 |
| 布尔运算报错 | 几何相切或重叠 | 检查尺寸临界相切,增加0.5mm间隙 |
| 模型方向与预期相反 | 参考系没讲清楚 | 在提示词里指定顶面、底面、正面 |
4.2 提示词排查的顺序:从粒度到顺序
如果现象指向提示词问题,我一般按下面的顺序检查:
- 单位是否明确到"毫米/英寸"
- 每个尺寸数字是否有归属,也就是它属于哪个方向、哪个特征
- 特征之间是否有定位关系,比如孔相对哪条边的偏移
- 特征顺序是否与几何构造顺序一致
这里我想特别强调第4点。很多模型输出的CAD脚本是先建立一个实体,然后不断减料、加特征。如果提示词把"打孔"放在"倒角"前面,代码逻辑和几何结果都可能不一样。我在实践里习惯在提示词里写明特征的生成顺序:"先生成主体,再切孔,最后倒角。"这个顺序声明对最终生成立竿见影,尤其是涉及多个布尔减运算的时候。
4.3 代码层排查:让模型解释它自己的输出
如果说提示词排查看不出问题,下一步就是在脚本层面debug。我最近实践里有一个很有效的技巧,不是直接改提示词重跑,而是把生成出来的脚本回喂给模型,要求它"逐行解释这段代码在几何上做了什么"。
比如脚本里有一行chamfer(2),模型解释的可能是"对所有边倒角2mm",但实际上chamfer可能只作用于特定边。让模型解释代码,比对代码和原始意图,能定位到具体是哪一行和提示词不一致。这个"解释-比对"步骤,通常能把问题缩小到一两个几何操作上。
还有一种情况是模型生成的代码语法本身没问题,但几何上无效,比如两个布尔操作对象没有任何交集。此时CAD预览里会看到模型消失或只有一个残片。这种问题靠调整提示词效率很低,更实际的做法是直接在代码里加一个明确的重叠量,比如让"贯穿"操作多延伸0.1mm,保证几何内核能正确求交。这类修修补补的改动,比重新生成一轮要省事得多。
5. 从试验台到生产:text-to-cad的边界与工程化建议
5.1 和现有CAD工作流衔接:STEP是中转站,不是终点
很多工程师担心的一个问题是:text-to-cad生成的模型,能不能进现有的CAD平台继续改?答案是可以,但有一个思路要先转变:不要把生成结果当最终交付物,而是把它当"起点草稿"。
我在本地的工作流是:text-to-cad生成脚本,导出STEP,再把STEP导入主流CAD软件,在CAD里检查配合尺寸、公差、表面粗糙度,然后出工程图。STEP是实体格式,特征树虽然简化了,但几何是完整的,孔、倒角、平面这些在CAD里都能识别到。这意味着你省掉的只是从零建模的时间,后面该做的设计校核一步都不能少。
以前面那个底座为例,导入CAD后我会重点检查三件事:孔径和公差标注是否满足配合要求、倒角尺寸是否影响安装、底面平面度是否合格。这些事情text-to-cad不会替你判断,它只是把几何形状给你搭好了,真正决定零件能不能用的,永远是你对场景的理解。
5.2 哪些任务适合用,哪些不适合用
我用了几个月以后,对这类工具的适用范围有了自己的判断。
适合的任务大概有这几类:
- 标准件改型:底座、支架、法兰、盖板这类形状规整的零件
- 钣金件初步展开:如果有对应钣金脚本模板,生成外形再展开很方便
- 创客快速原型:验证装配空间时,不需要精细公差
- 概念结构的多种方案对比:快速生成三四个形状,放在一起比选
不适合的任务也很明确:
- 复杂曲面造型:比如汽车覆盖件、消费电子壳体
- 多零件精密配合:需要严格的GD&T标注,文本描述很难承载
- 大尺寸装配体:一次性描述几十个零件必然丢信息
- 安全关键件:承重结构、压力容器、涉及人身安全的部件,建议只用它出初稿,不能直接作为制造依据
如果你发现任务落在"不适合"列表里,不要硬顶着上。更务实的做法是,把大任务拆成适合的小任务,用text-to-cad完成其中形状规整的部分,再回到传统CAD完成剩余部分。
5.3 个人沉淀下来的习惯与注意事项
最后分享几个我在反复试错后沉淀下来的习惯。
第一,把提示词模板化。我电脑里有一个"需求模板.txt",每次新任务先按模板填,而不是每次从头写。模板开头固定写单位、导出格式、坐标系方向,中间写主体和特征,最后写顺序要求。这样即使换了模型,我的描述口径也不会飘,排错的时候也有一个稳定的基线。
第二,做好数据隔离。在线text-to-cad服务会把你输入的描述发送到远端处理。如果是公司内部图纸、未公开的产品参数,建议先在本地脱敏,或者使用本地部署的模型。我自己的做法是:把真实零件名称改成"零件A""零件B",尺寸数字做偏移归一化,等模型跑通后再把真实数值映射回来。听起来麻烦,但能省掉不少合规上的隐患。
第三,机器生成的一定要有人检查。我见过一些人把text-to-cad生成的模型直接发给加工厂,结果加工出来的件和需求完全是两回事。模型觉得自己画对了,人也觉得提示词写清楚了,但"2mm倒角"和"2x45度倒角"在加工语境里就是两个意思。这类工具的输出永远是待校核的草案,签字栏里应该永远有人类工程师的名字。
第四,学会使用"解释代码"功能。不要只依赖生成结果,多让模型解释自己生成的每一步,这一步能提前暴露大部分问题,尤其是尺寸语义和倒角作用范围这两类高频坑。
我对这类工具的态度一直是:它像一位动作很快但经验不足的绘图员。你交代清楚,它出图就是你的初稿;你含糊,它就替你拍板。把精力花在把需求说清楚上,自然能拿到可用的初始模型。现在我做新的结构件改型,已经习惯先给text-to-cad一句话,然后用传统CAD做校核和优化。这个配合节奏,让我有更多时间放在真正需要判断力的配合设计和工艺方案上。