- Published on
用提示词生成 3D CAD 这件事 —— 网格与 B-rep 之别,以及约束条件这个瓶颈
- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 引言 —— Show GN 上的 CAID,以及一句"别拿去制造"的自白
- 网格和 B-rep 是两码事
- "参数化"这个词真正的含义 —— 特征树与几何约束求解器
- 现在的工具实际上都在做什么
- 基准测试说明的局限
- 今天真正有用的地方
- 工程师依然不可或缺的地方 —— 公差、DFM、可加工性
- 结语 —— 做出一个网格和做出一个零件之间的距离
引言 —— Show GN 上的 CAID,以及一句"别拿去制造"的自白
GeekNews 的 Show GN 板块上出现了 一个用提示词生成 3D CAD 模型的工具 CAID。作者的问题意识很明确 —— 要把脑子里的形状和机构表达出来,得先学会一整套 CAD 工具的功能,再点上几百次鼠标,这正是硬件设计的瓶颈所在。
运作方式也很简单。用自然语言输入想要的形状,LLM 生成代码,渲染出 3D 模型,参数还可以调整。可以导出 STEP 和 STL。法兰、L 形支架、散热片这三类是预先验证好的模板,不经过 LLM;只有自由提示词才会走 AI 这条路径。
有意思的是作者自己坦承的局限。没法自动校验尺寸,判断不了可制造性 —— 公差、DFM 约束、从 CNC 和铣削角度看的可加工性 —— 而且明确说这只是一个已验证的原型,输出物不能直接拿去制造。
这份自白,精准地概括了整个领域的现状。而为什么会这样,只要看一眼 CAD 到底是什么样的数据结构,答案立刻就清楚了。
网格和 B-rep 是两码事
"生成了一个 3D 模型"这句话,可能指向两种完全不同的结果。
网格(mesh)是一份三角形列表。顶点坐标加三角形索引,仅此而已。曲面并不真实存在,而是用多边形来近似的。直径 20 毫米的圆柱体,实际上是三十来个平面拼出来的,并不是一个真正的圆柱。从文本生成网格,现在做得已经相当不错 —— 扩散模型和 3D 生成模型几十秒就能出一个。
B-rep(边界表示)是一个拓扑图。有面,面架在解析曲面(平面、圆柱面、圆环面、NURBS 曲面)之上,面与面以边相交,边与边以顶点相交。直径 20 毫米的圆柱体,就是一个带有半径参数 10 的圆柱面。STEP 文件装的就是这个,机械 CAD 处理的也是这个。
来看看这个区别在实务中是怎么体现出来的。
# 同一个支架,用两种方式表示
网格(STL):
vertex 12.000 0.000 5.000
vertex 11.951 1.111 5.000
... (一个孔被近似成了 64 个三角形)
-> "这个孔的直径是多少?" 答不上来,得从点集里反推。
-> "把直径从 8 改成 10" 需要整体重新生成。
-> 没法生成钻孔加工指令,因为压根没有"孔"这个概念。
B-rep(STEP):
CYLINDRICAL_SURFACE('', axis_placement, 4.0)
-> "这个孔的直径是多少?" 8.0 毫米。
-> CAM 软件能识别出这个圆柱面,生成钻孔循环。
-> 但 STEP 只保存了最终的几何结果,并不记录它是怎么做出来的。
最后一行很关键。STEP 装的是 B-rep,装不下特征树。 所以"导出成 STEP,任何 CAD 都能编辑"这句话只对了一半。直接编辑 —— 推拉曲面 —— 是可以的。但"把这个支架的厚度参数从 5 改成 8,让其余部分自动跟着调整"做不到,因为这层关系压根没有存在文件里。
"参数化"这个词真正的含义 —— 特征树与几何约束求解器
机械 CAD 所说的"参数化",指的是两层东西。
第一层是草图内部的约束。 在 2D 草图里画上线和圆之后,再施加平行、垂直、相切、同心、对称这类几何条件,加上尺寸标注。这些条件会变成一组联立方程,由几何约束求解器来求解。用户改动一个尺寸,求解器就会重新运行,重新计算其余元素的位置。
第二层是特征树。 草图被拉伸、在结果上打孔、在边缘加倒角,这一整套操作的顺序会被记录下来。参数一旦变化,这个顺序就要从头重放(replay)一遍。
在这里,基于 LLM 的生成会撞上三堵墙。
约束求解器是一个可满足性问题。 条件加得太少,形状就会带着多余的自由度飘着(欠约束);加得太多,条件之间就会互相矛盾、无解(过约束)。人类在这里也常常卡住。让模型从自然语言里提炼出一组恰到好处的约束集合,和单纯画一个形状,完全是不同性质的工作。而且失败往往是安静的 —— 求解器确实能解出结果,但经常不是原本想要的那个解。
特征重放很脆弱。 倒角引用的是某条特定的边,一旦前面步骤的参数发生变化,导致那条边消失或者被拆分,倒角就会失败。这是 CAD 行业里一个由来已久的问题,甚至有专门的名字。LLM 生成的特征树不会考虑到这种脆弱性,所以哪怕只是稍微改一下参数,模型在重放时崩掉的情况很常见。
空间推理能力偏弱。 Hacker News 上的一场关于 Text-to-CAD 的讨论里,这个批评被反复提及。有人指出,在一个 L 形支架的基准测试里,加强筋盖住了本该留着的孔,质疑位置计算到底做对没有。也有人指出,要精确描述出想要的形状所花的力气,几乎和直接手绘 CAD 一样多,效率上的论据因此站不住脚。而那个帖子里大家的共同结论是:参数化特征树内部的约束求解复杂度,实际上几乎没有被真正触及。
现在的工具实际上都在做什么
把目前这个领域里的做法梳理一下,如下所示。
| 工具 · 路线 | 输入 | 输出 | 可编辑性 | 已公开的局限 |
|---|---|---|---|---|
| CAID(Show GN) | 自然语言提示词 | STEP、STL。LLM 生成代码后渲染 | 参数可调 | 无自动尺寸校验,无法判断公差、DFM、可加工性,禁止直接用于制造 |
| text-to-cad(开源框架) | 编码智能体的提示词 | 从 build123d 代码生成 STEP、STL | 代码本身就是特征定义,可做版本管理 | 空间推理错误(加强筋与孔重叠),复杂装配体上 token 成本过高 |
| Zoo Text-to-CAD | 自然语言提示词 | B-rep 曲面、STEP 等多种格式 | 导入 STEP 后可在现有 CAD 中编辑 | 官方提示:描述特征而不是名词,结果会更好 |
| SGS-1(Spectral Labs) | 图像或网格 | 可编辑的 B-rep STEP | 面向参数化编辑 | 在复杂曲面、有机结构、极薄形状、完整装配体生成上表现脆弱 |
| 通用网格生成模型 | 文本或图像 | 三角网格 | 事实上不可编辑 | 不适合机械 CAD 用途,适合可视化和 3D 打印初稿 |
有几点值得指出。
把代码用作中间表示,是目前最稳健的路线。 text-to-cad 这套框架用的是 build123d,其下层是 OpenCascade 内核。它不让 LLM 直接生成几何体,而是写一段用来构建参数化模型的 Python 代码。这种结构的优势很明确 —— 代码本身就是特征树,用 git 做版本管理,参数就是变量,出错时会给出堆栈跟踪。可观测性得到了保留。
# "CAD 即代码"之所以稳健:意图以文本形式留存了下来
from build123d import *
THICKNESS = 5.0
HOLE_D = 8.0
EDGE_MARGIN = HOLE_D * 0.75 # 用一条关系式把孔边缘的最小壁厚固定下来
with BuildPart() as bracket:
with BuildSketch() as base:
Rectangle(60, 40)
extrude(amount=THICKNESS)
with Locations((20, 0)):
Hole(radius=HOLE_D / 2)
fillet(bracket.edges().filter_by(Axis.Z), radius=3)
# 这里把 HOLE_D 改成 12,EDGE_MARGIN 会跟着联动变化。
# 这层关系不会保存在 STEP 文件里,只存在于代码中。
这个例子同时也暴露了问题。fillet 引用的那组边是靠过滤器筛选出来的,一旦前面步骤的形状发生变化、导致目标边消失,程序要么悄悄地套用到另一条边上,要么直接失败。就算写成代码,特征重放的脆弱性依然原样存在。
SGS-1 走的是另一个方向。 Spectral Labs 在 2025 年 9 月发布的这个模型,标榜自己是 首个面向结构化 CAD(B-rep)生成的生成式模型。它接收图像或网格作为输入,输出可编辑的 STEP,因此主要用途是自动化逆向工程,以及在既有装配体的上下文里生成新零件。团队称在 75 张复杂 CAD 图像上,成功率相对 GPT-5 和 HoLa BRep 有优势。开发团队自己承认的局限是复杂曲面、有机结构、极薄形状、完整装配体。Hacker News 上的反应相当怀疑 —— 真正用过的 CAD 用户反馈了尺寸错误、失败的孔、错位的特征,并对"易于编辑"这种说法提出了质疑。
基准测试说明的局限
2026 年 5 月发布的 Text2CAD-Bench 用数字把这个现状梳理了出来。它精选了 600 个样例,按四个复杂度等级(L1 到 L4)分类,每个样例配了两种风格的提示词 —— 一种是非专业用户会用的描述性写法,一种是专业人士会用的过程化写法。这种双提示词的设计很聪明,因为它能把"用户的 CAD 熟练度本身对结果的影响"单独剥离出来看。
结论在意料之中,但很有用。无论是通用 LLM 还是领域专用模型,在基础形状上表现都还算合理,但一到复杂拓扑和高级特征,性能就会急剧下滑。 也就是说,性能曲线不是平缓下降,而是在某个节点上直接崩塌。
这也符合直觉。在一个方块上打个孔,只是从提示词里提取几个参数的问题。但如果多个特征相互引用、曲面以切线连续的方式相接、薄壁不能塌陷 —— 这就变成了一个约束满足问题,和语言建模完全是两种不同性质的计算。
今天真正有用的地方
没必要只从悲观的角度去读这件事。眼下确实有一些用法能带来实实在在的价值。
做初稿。 不必从空白画面开始,先拿到一个说得过去的形状再去改,这确实能省时间。尤其是标准零件 —— 法兰、支架、散热片、外壳 —— 形状变化范围窄,生成质量也就更好。CAID 把这三类预先做成验证好的模板,看起来也是基于同样的判断。
零件库检索。 用自然语言输入"一个能装下 4 颗 M8 螺栓的 90 度角支架",去现有库里找,比重新生成要容易得多、也安全得多,因为用的是已经验证过的零件。生成式模型真正的价值,或许不在于创造几何体,而在于对几何体做索引和检索。
CAD 即代码,以及智能体工作流。 让编码智能体写参数化 CAD 代码,看渲染出来的图像,自己在循环里修正,这一套实际上是行得通的。text-to-cad 讨论帖里的用户反馈,在简单形状上这种迭代改进效果不错。有一个实现细节挺有意思 —— 这套框架会为 STEP 文件生成一份拓扑"边车"文件,让模型不用加载整个文件就能读取 B-rep 信息,这是在有限的上下文预算内处理几何体的一种尝试。
逆向工程。 把网格或扫描数据转换成 B-rep,这项工作本来就是半自动化、而且相当枯燥的活儿。这正是 SGS-1 瞄准的地方。在结果由人来审核这个前提下,这条路线的验证负担比从零开始做要小。
可以看出一个共同点。验证成本低、人眼能立刻确认、失败了也容易撤回的地方,才是价值真正体现出来的地方。
工程师依然不可或缺的地方 —— 公差、DFM、可加工性
CAID 开发者诚实列出的这三点,恰好正是尚未被自动化的领域。
公差与配合。 "孔径 8 毫米"这个数字本身毫无意义。是 8H7 还是 8H11,是间隙配合还是过盈配合,直接决定了零件装不装得上。而且公差不是从几何形状里推导出来的,它来自功能意图。这根轴需不需要转动、需不需要固定、需不需要吸收热膨胀,模型如果提示词里没写,就无从知晓。跨多个零件的公差累积分析,则是更进一步的问题。
DFM(面向制造的设计)。 注塑成型需要拔模角度和均匀壁厚;三轴铣削会在工具够不到的内角和倒扣处遇到麻烦;钣金件受弯曲半径和最小折边长度的约束。同一个形状,换个工艺可能就从能造变成不能造。哪怕提示词里明确写了工艺要求,也没法保证模型在生成几何体的过程中真的满足了那个约束。
可加工性验证。 刀具能不能够到、需要几次装夹、怎么固定 —— 这些光看形状判断不出来,得知道车间的设备清单才行。
还有一点,虽然不太被提及,但很重要。意图的记录。 一个做得好的 CAD 模型,承载的不只是几何形状本身,还有"为什么是这个形状"。哪些尺寸在功能上是关键的(因此公差卡得紧),哪些只是随意定下来的。有了这份信息,六个月后别人才能安全地去修改它。生成出来的模型有一个特点,就是所有尺寸看起来都同样"随意",而这最终会变成维护成本反噬回来。
结语 —— 做出一个网格和做出一个零件之间的距离
如果只能给这个领域留下一个最有用的问题,那就是:这个工具的输出,带的是可编辑的特征,还是仅仅是结果形状?
- 如果只出网格,那就是拿来做可视化和打印初稿用的,进不了机械设计流水线。
- 如果出的是 B-rep(STEP),拿到 CAD 里可以直接编辑。但因为没有特征树,改一个参数重新生成这件事做不到。
- 如果出的是参数化代码,那才是真正意义上的参数化。不过代码里可能藏着脆弱的引用关系,这份脆弱性需要人去把关。
而以上这些,没有一个能替代公差、DFM、可加工性。Show GN 上那个工具的开发者写下"别直接拿去制造",这不是谦虚,而是一句准确的技术描述。做出一个形状和做出一个零件之间的距离,比这个领域迄今为止缩短的部分,还要远得多。