☰
text-to-cad实战:自然语言生成可编辑CAD模型的原理与落地
2026/10/8 7:45:14 网站建设 项目流程

1. 开篇:从一句话到三维模型,这事终于不再只存在于demo里

我第一次看到 text-to-cad 这个词的时候,第一反应是“这不就是文字生成模型的又一个变体吗”。真上手试了一圈之后,发现完全不是这么回事。文本生成图片,哪怕生成得再离谱,至少肉眼能看个热闹。但 text-to-cad 面对的是 CAD 模型,尺寸错了 0.1 毫米,一个零件就装不进去;几何特征搞错一个,整个装配体就废了。所以这个方向从一开始就没打算走“看起来像就行”的路线,它要的是“能加工、能装配、能编程修改”的实体模型。

简单说,text-to-cad 就是通过自然语言描述,让系统直接生成可编辑的 CAD 模型文件。你输入“一个带四个安装孔和加强筋的L形支架,材料厚度3毫米,安装孔为M5通孔”,得到的不再是一张渲染图,而是一段参数化建模脚本,或者一个可以直接打开的 STEP 文件。这个能力对于机械设计、创客项目、3D 打印、非标自动化方案的快速验证来说,价值是实打实的。

这篇文章的内容主要面向三类人:一类是画图画到怀疑人生的机械设计师,一类是想快速验证想法但不想从零建模的硬件工程师和创客,还有一类是纯粹对 AI 生成三维几何感兴趣的技术爱好者。我会从我自己的踩坑经历出发,把背后的原理、工具选型、完整实操流程和排查技巧都摊开讲清楚,尽量让你看完之后自己也能跑通一个完整的 text-to-cad 流程。

2. 核心思路拆解:为什么“能用的生成”核心是生成代码,而不是生成网格

2.1 直接输出网格模型的致命伤

很多人第一次听到 text-to-cad,脑子里浮现的是“AI 直接吐一个 STL 网格文件,像图片生成那样”。这个思路听起来自然,但实际上在工程场景里属于死路。原因不复杂。

网格模型(Mesh)本质上是三角面的集合,它只有“长得像”这个属性,没有“可计算”这个属性。比如你想在一个网格模型上改一下孔的直径,传统网格工具里你得重新布尔运算、重新修面、重新处理破面,一步搞不定。更麻烦的是,大部分网格模型根本不是一个封闭的实体,缝隙、重面、非流形边一大堆,拿去切片软件或者 CAM 软件里跑一遍,十有八九要出问题。

说白了,网格模型对于渲染和 3D 打印的单次输出也许够用,但离“CAD”这个词的标准还差得远。CAD 的核心是参数化、可约束、可修改、可关联,而这些全是网格模型给不了的。

2.2 参数化脚本才是 text-to-cad 的正确答案

我做过的几次实测里,效果最稳的方案几乎都是同一个套路:让模型输出一段程序化建模脚本,而不是直接输出几何数据。这种脚本常见的形式有 CadQuery 代码、OpenSCAD 代码、FreeCAD 的 Python API 代码,本质上都是“用代码描述建模过程”。

为什么这个思路能成立?因为代码天然就有“参数”这个概念。脚本里定义一个plate_length = 80,后面所有关联的拉伸、打孔、倒角都会自动跟随这个参数变化。你让 AI 生成一个“宽度可调”的支架,它不需要生成一百个不同宽度的模型,只需要生成一段带变量的脚本,你改一个数字,整个模型自动更新。这就是参数化的威力。

另一个好处是代码是可审查的。AI 生成的网格模型,你只能通过肉眼去检查它像不像,但生成的代码你可以一行一行去看逻辑,哪里多了一步布尔运算,哪个特征顺序不对,一眼就能定位。对于我这种强迫症工程师来说,这种“可解释性”比什么都重要。

2.3 CSG 和 B-rep 这两个词,你得大概懂

聊 text-to-cad 的原理,CSG(Constructive Solid Geometry,构造实体几何)和 B-rep(Boundary Representation,边界表示)是绕不开的两个概念。

CSG 比较好理解,它就是“用基本几何体做加减法”。一个零件可以看成是一个长方体拉伸,加上一个圆柱凸台,再减掉几个孔。建模过程就像搭积木,每一步操作都是可逆的、可参数化的。CadQuery 和 OpenSCAD 这类工具的核心操作逻辑就是 CSG。

B-rep 则是另一种表达方式,它通过记录实体的边界(面、边、顶点)以及它们之间的拓扑关系来表达立体。工业级 CAD 软件里,STEP 文件用的就是 B-rep 表达。B-rep 的好处是对复杂曲面和精确边界的表达能力更强,但计算量也更大。

现在的 text-to-cad 模型很少直接生成 B-rep,因为 B-rep 的数据结构太复杂,语言模型难以稳定输出。但业界有个折中方案:模型生成 CSG 风格的脚本,脚本执行后由内核(比如 OpenCASCADE)自动计算出 B-rep 实体,再导出成 STEP 文件。这样一来,用户拿到的是一个真正符合工业标准的模型,而不是只能在某个私有软件里看的“玩具模型”。

3. 主流方案与模型选型:这波浪潮里到底有谁在干活

3.1 从公开 API 到开源模型,选择比你想象中多

text-to-cad 不是某一个公司的专属产品,而是整个 AI 4 Engineering 赛道里最活跃的方向之一。目前能实际跑通的方案大致可以分三类。

第一类是现成的商业或半商业 API。这类服务已经把模型、推理、后处理都包装好了,你只需要把文字描述扔进去,拿回一段建模脚本或者一个模型文件。对大部分想快速验证流程的人来说,这是最省事的入口。这类服务的典型特征是页面上有一个输入框,支持几段示例提示词,背后跑的是专门微调过的代码生成模型。

第二类是学术界的开源方案。这个方向最近发表了很多相关工作,核心思路是用合成数据构造大量“文字描述-CAD脚本”配对,再微调一个代码生成大模型。训练数据来自参数化建模脚本库的自动注释。开源方案的优点是可控性强、能自己部署,但缺点是模型体积和工程化程度都还比较初级,需要你有点折腾精神。

第三类是通用大模型配上 CAD 专用提示词。这个方案是我自己用得最多的。ChatGPT、Claude、国产的几个大模型都能写 CadQuery 和 OpenSCAD,你只要把需求描述清楚,让模型生成脚本,然后你在本地跑一遍脚本验证几何。这个方案没有专门针对 CAD 做微调,但胜在模型本身推理能力强,复杂逻辑不太容易崩,配合一定的人工纠错,出活率实际上很高。

3.2 选型的核心指标:不是“跑分”,是“出活率”

选哪一个方案,我的判断标准很简单:把同一句提示词扔进去,看它生成脚本之后,能在本地直接跑通、跑完不出几何错误、渲染出来符合需求的比例有多高,这就是“出活率”。

我在测试中发现,通用大模型加 CadQuery 的组合,对于中等复杂度的零件(比如带孔、带槽、带倒角的钣金件),一次出活的概率大概在 60% 到 80% 之间。剩下的 20% 里,一半是脚本语法错误,一半是几何逻辑错误,比如特征顺序不对导致材料残留。而专门的 text-to-cad 模型在某些特定类型的零件上出活率可能更高,但一旦超出它训练数据的分布,表现就掉得飞快。

所以我的建议是,不要迷信“专用模型一定更强”。实际工作流里最高的效率来自“专用模型先跑,通用模型纠错,人做最终检查”的组合拳。这也是为什么我说要理解背后的原理而不是单纯喊“AI 真厉害”,因为你只有懂了原理,才知道什么时候该换工具。

3.3 离线部署的账要算清楚

如果你有保密需求,不能把设计数据传到云端,那就得考虑本地部署方案。开源代码生成模型现在大体上跑得动,一张 24GB 显存的卡就能跑 7B 到 13B 规模的量化模型,配合推理框架,单条提示词响应时间在几十秒到几分钟之间,尚可接受。

但要注意,本地部署的模型精度通常比云端大模型差一截,尤其是在复杂装配体和特殊型材的生成上,很容易出现“代码能跑,但几何完全不对”的情况。我的经验是,本地模型适合用来做标准化零件库的批量生成,比如各种规格的安装支架、连接板、导轨座,因为这些零件结构高度相似,模型翻车的概率低。真正复杂的非标设计,我还是倾向于走云端或者通用大模型。

4. 实操拆解:跑通一个完整的 text-to-cad 流程

4.1 环境准备:把地基打牢再谈生成

不管用哪种方案,你都至少需要一套能执行建模脚本的本地环境。我个人最推荐的是 CadQuery,理由有三个:第一,它基于 Python,生态好,写起来顺手;第二,它底层直接封装了 OpenCASCADE,生成的模型是真正的 B-rep 实体,能导出 STEP 和 STL;第三,它的社区积累了不少现成代码,AI 训练语料里 CadQuery 的代码量也不小,模型生成的成功率相对高。

安装没什么玄学,用 pip 就能装:

pip install cadquery

如果想在 Jupyter Notebook 里直接预览模型,可以安装 cadquery 的 notebook 扩展:

pip install jupyter-cadquery

装完之后先跑一个最基础的例子验证环境:

import cadquery as cq result = ( cq.Workplane("XY") .box(10, 10, 5) .faces(">Z") .hole(2) ) show_object(result)

如果这段代码能跑出一个带孔的长方体,环境就没问题。注意我这里用的是 Jupyter 的极简写法,实际生成脚本里你最好显式导出文件,后面检查参数会更方便。

OpenSCAD 也是一个备选项。它的语法更接近“描述几何”,对 AI 来说可能更容易生成,但参数化能力和工业级导出格式都不如 CadQuery 灵活。我的建议是在 CadQuery 为主、OpenSCAD 为辅。

4.2 用现成 API 快速体验完整链路

如果你不想从零搭环境,也可以先用现成的 text-to-cad API 体验一下完整链路。这类 API 的交互逻辑基本一致:你提交一个描述,服务端返回一段建模脚本,脚本可以在线渲染,也可以下载后本地执行。

以我用的比较多的 Zoo 系的 text-to-cad API 为例,它的核心套路是:先输入零件描述,服务端返回一段 CadQuery 代码。你可以直接在浏览器里看它渲染出来的三维预览,如果符合预期,就复制代码到本地 CadQuery 环境里继续加工。

这种 API 对新手非常友好,原因在于你不用去管模型怎么部署、推理怎么加速,只需要关注提示词本身。等到你对 text-to-cad 的“脾气”摸熟了,再决定要不要自己部署和微调。

4.3 设计你的第一个提示词:从“能跑”到“能看”

提示词设计是 text-to-cad 里最反直觉的一个环节。很多人一开始会写得像在跟人说话,比如“帮我做一个好看的外壳”,这种描述在文字生成图片里也许能产出点东西,但在 text-to-cad 里基本等于什么都没说。

CAD 描述的核心是“几何语言”:形状、尺寸、位置、关系、加工特征。这些要素缺一个,模型就只能猜。下面是我总结的第一个完整提示词示例,这个例子在多数方案里都能生成出正确模型:

生成一个 L 形安装支架,长边 80mm,短边 40mm,材料厚度 3mm。长边上有两个 M5 通孔,孔间距 50mm,孔中心距长边边缘 15mm。短边末端向下弯折 10mm,弯折处内倒角 2mm。

这句话看起来很长,但每一个信息都是有目的的。长度、宽度、厚度定义了拉伸体的尺寸;M5 通孔定义了特征类型和孔径(M5 通孔直径通常取 5.2mm 或 5.5mm,看具体标准);孔间距和边距定义了特征位置分布;最后的弯折和倒角定义了两个附加特征的形态和量级。

把这句提示词扔进能生成 CadQuery 的模型里,我拿到的代码大致长这样:

import cadquery as cq result = ( cq.Workplane("XY") .hLine(80) .vLine(40) .hLine(-80) .vLine(-40) .close() .extrude(3) .faces(">Z") .workplane() .center(0, 10) .circle(5.5 / 2) .cutThruAll() .faces("<Y") .workplane() .center(15, 0) .circle(5.5 / 2) .cutThruAll() .edges("|Y") .fillet(2) )

这段代码的执行逻辑是:先画一个 L 形截面,拉伸 3mm 形成实体,在顶面打两个通孔,在弯折内边做倒角。如果一切顺利,你得到的模型就是满足需求的零件。

执行到这一步,你会发现一个核心事实:text-to-cad 的输出是代码,而代码意味着你可以随时手动改。AI 生成的孔位偏了,你不用重新生成,直接改坐标参数再跑一次就行。这比传统的“生成图片”工作流强了不止一个量级。

4.4 导出 STEP 和 STL:图纸不只是一个文件

模型生成验证没问题之后,接下来就是导出。CadQuery 支持多种格式,最常用的两种是 STEP 和 STL。

STEP 是工业交换格式,大多数 CAD 软件都能直接打开,适合后续做结构仿真、CAM 编程或者发给供应商。导出代码如下:

cq.exporters.export(result, "bracket.step")

STL 是网格格式,主要用于 3D 打印。导出代码如下:

cq.exporters.export(result, "bracket.stl")

如果模型是给 3D 打印用的,STL 导出之前可以设置导出精度:

cq.exporters.export(result, "bracket.stl", tolerance=0.01, angularTolerance=0.1)

tolerance 控制曲面的最大偏差,值越小网格越精细,文件也越大。对于通常的 FDM 打印,0.01mm 的偏差已经足够细腻,继续调小只是白白增加文件体积。

4.5 从单零件到小装配体:流程如何扩展

单零件跑通之后,你自然会把目光转向装配体。text-to-cad 能不能直接生成一个完整的装配体?目前看,一次生成完整装配体的成功率还比较低,因为装配体涉及多个零件之间的位置关系、约束和相对运动,语言模型很难一次把所有关系都算对。

我的做法是把装配体拆开。比如要生成一个“带盖板的传感器盒子”,我会分三次生成:第一次生成盒子底座,第二次生成盖板,第三次生成固定螺钉。每次生成的提示词里,我都会把前一个零件的关键尺寸显式写进去,比如“盖板长度 = 底座内腔长度 + 2 * 壁厚”。这样即使单个模型没有“装配意识”,最终拼起来也能完美契合。

这个过程进一步印证了我前面说的:text-to-cad 的价值不在于“一次生成一个总成”,而在于它把建模门槛从“画图”降低到了“描述和组装描述”。

5. 提示词工程进阶:怎么让模型听懂你的几何意图

5.1 黄金法则:先整体后细节,先形状后特征

我试过不下几十种提示词的写法,最后沉淀出来的套路就八个字:整体形状,细节特征。

开头第一句永远先定整体形态。是板状?块状?轴类?壳体?还是型材拼接?模型只有先确定了基础形态,后面的特征才有附着的地方。如果开头就说“一个法兰”,模型可能默认成圆盘;但如果说“一个矩形法兰底座,中心带凸台”,模型就知道要先拉伸矩形板再加圆柱。

整体定完之后,再一步步加特征。每个特征描述尽量包含“类型、尺寸、位置”三个要素。比如“圆角”和“倒角”是两种截然不同的特征,不要混着说。再比如“通孔”和“盲孔”也必须写清楚,尤其当孔底部还连着某个内部腔体的时候,语义不清极容易生成出不符合加工逻辑的隐藏孔。

5.2 尺寸和单位:这是最容易翻车的环节

在 text-to-cad 的实测里,尺寸翻车的概率高到离谱。有一次我描述一个“直径 20mm 的圆盘”,生成出来的模型直径是 20 英寸的视觉比例,相当于放大了 25.4 倍。问题就出在模型默认单位没有对齐。

大多数 CAD 脚本都以毫米(mm)为单位,但语言模型在预训练时见过英制和公制混合的语料。你说“一个 2 英寸的孔”,模型可能真的生成 2 英寸,也可能理解成 2 毫米,非常不确定。

我的经验是,每次都在提示词开头显式声明单位:比如“以下所有尺寸单位均为毫米”。这句话看起来没什么技术含量,但它能大幅降低模型在尺寸理解上的随机性。另外,重要尺寸尽量给出“从哪到哪”的距离关系。比如“孔的圆心距板件左边缘 15mm”比“孔的 X 坐标为 15”要稳得多,因为后者隐含了坐标系假设,一旦坐标系理解错就全乱。

5.3 不存在的特征不要硬编:给模型留余量

另一个易错点是“用文字描述复杂曲面”。比如样条曲面、渐开线齿轮的齿形、复杂的过渡曲面,这些几何特征用自然语言很难讲清楚。你硬要在提示词里描述,模型大概率生成出一堆自相交的废几何。

我踩过几次坑之后学乖了:遇到这类需求,先让模型生成一个能跑通的基础毛坯模型,再在 CadQuery 里手动加复杂特征,或者把齿轮库、轴承库这类现成零件直接导入装配。不要让 AI 去做它不擅长的事,这是 text-to-cad 使用者的第一课。

5.4 善用示例代码,少用纯文字描述

如果你用的是通用大模型(比如 Claude、ChatGPT),有一个很好用的小技巧:把一段 CadQuery 示例代码和你的文字描述一起发给模型,让它参考示例代码的风格来生成。模型对代码的模仿能力远强于对纯文字描述的三维理解能力。

我常用的提示词模板是这样的:

参考这个例子生成类似的零件:给出一段 CadQuery 代码,生成一个带安装孔的矩形板。现在请生成另一个零件:矩形板长度 100mm,宽度 60mm,厚度 4mm,长边两端各有一个腰形安装槽,槽长 20mm,宽 6mm。

这种“示例代码 + 新需求描述”的组合,出活率比我只扔一句文字描述高出一大截。原理不难理解:代码给了模型一个“语法模板”,文字描述则提供了“几何语义”,两者结合,模型犯错的空间被大幅压缩。

6. 常见问题与排查技巧实录

6.1 脚本能跑但模型是空的:多半是截面没闭合

这是我遇到频率最高的一个问题。CadQuery 的建模流程里,最基础的操作是画一个闭合截面然后拉伸。如果截面没有闭合,拉伸结果为空。典型的表现是代码没有报错,但最后输出的实体是空的。

排查思路:检查截面绘制代码里有没有.moveTo和.close()。在 CadQuery 里,使用hLine、vLine等命令画完轮廓后,必须手动close()闭合,否则拉伸出来是个开放的薄片或直接为空。

我第一次遇到这个问题时卡了足足半天,后来才意识到是截面没闭合。这个坑几乎每个玩 CadQuery 的新手都会踩,好在定位之后改起来很快。

6.2 孔的位置对不上:坐标系原点理解分歧

有一次生成一个对称支架,我描述“两个孔对称分布在中心线两侧,间距 30mm”,生成结果是两个孔都在中心线同一侧。原因是模型把“对称分布”理解成了“从中心开始朝一个方向偏移 30mm”,而不是“各偏移 15mm”。

这类问题的本质是自然语言的歧义。对称、居中、对齐这类相对位置词,不同的人有不同的理解,模型更是一头雾水。

解决办法就是量化。把“对称分布”改成“两个孔的中心点分别位于中心线两侧各 15mm 处”,模型就绝对不会搞错。总的原则:描述位置关系时,永远给绝对尺寸,不要依赖模糊的相对词。

6.3 导出的 STEP 文件在 SolidWorks / Fusion 360 里打不开

这种问题一般不是文件损坏,而是生成实体的过程中留下了退化几何。所谓退化几何,指的是实体中出现了理论上不存在但实际存在的零厚度、零长度的边或面。OpenCASCADE 对这类几何容忍度较高,但其他 CAD 内核(比如 Parasolid)不见得买账。

解决办法是尽量避免重叠操作。比如你在拉伸一个 3mm 厚的板子之后,又在这个位置拉伸一个同样 3mm 高的凸台,两个实体完全共面,就会产生退化特征。正确做法是把两步合并成一个截面拉伸。我写提示词时也会刻意注意这一点,要求模型“合并共面的拉伸特征”。

6.4 中文表述和英文 CAD 术语的差异

text-to-cad 模型大多以英文语料训练为主,中文描述的效果通常会打一个折扣。这不是说不能用中文,而是要注意术语选择。比如“倒角”在英文里是 chamfer(切角)或 fillet(圆角),你如果只说“倒角”,模型可能随机选一个,结果十次里有五次是错的特征。

我的经验是,关键术语尽量中英并列。比如“倒角(chamfer)2mm”,“圆角(fillet)3mm”。这样模型不会产生歧义。还有“通孔(through hole)”、“盲孔(blind hole)”、“腰形槽(slot)”这类词,也建议中英文都带上,出活率会明显提升。

6.5 常见问题速查表

问题现象可能原因快速解决
脚本执行后实体为空截面未闭合检查close()是否调用
尺寸整体偏大或偏小单位理解错误在提示词开头声明单位均为毫米
孔的位置偏移相对位置词引发歧义改为给出绝对坐标或绝对间距
圆角和倒角混淆中英文术语歧义关键特征同时写中文和英文
导出 STEP 无法打开存在退化几何检查是否共用面重叠拉伸
装配体零件互相干涉缺少装配间隙描述提示词中显式给出间隙数值
复杂曲面完全变形强行用文字描述曲面改用基础实体加阵列特征完成

7. 写在最后:把 text-to-cad 当成你的“首稿生成器”

跑了大半年的 text-to-cad 之后,我对这个工具的态度经历了从怀疑到真香的转变,但同时也更清楚地看到了它的边界。

它现在还做不到的事很多:复杂的自由曲面、精密配合的公差标注、完整装配体的约束关系、符合国标的工程图出图,这些领域它都还撑不住。但如果你把它定位成“创意转三维草稿的加速器”,它的价值立刻变得非常实在。过去一个新零件的概念设计,我至少要在 CAD 软件里折腾一两个小时;现在先让模型生成一个可用的 70% 版本,我再用十分钟在 CadQuery 里修修改改,效率提升不是一点点。

我个人踩过最深的坑,是早期希望模型能一步到位生成完美模型,然后陷入反复调整提示词的泥潭。后来我调整了工作方式:先接受一个“能用但不够好”的初版,然后在本地脚本里直接改代码,把 AI 当成同事而不是神。这个心态转变之后,text-to-cad 才真正开始在我的一线工作中发挥作用。

最后分享一个小技巧:如果你生成的结果偶尔不对劲,不要急着重新生成一整套,而是把问题描述直接追加在后面的对话里,比如“把孔的位置从 15mm 改成 18mm”,模型往往只修改相关部分,保住之前正确的地方。我实测下来,这种迭代式修改的成功率比从头生成高得多,省下的时间和算力都很可观。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询