1. 从一句话到三维模型:text-to-cad 到底在解决什么问题
第一次听到 "text-to-cad" 这个词,很多人脑子里浮现的画面大概是:对着电脑敲一行字,屏幕上就自动长出一个三维零件,然后直接导出拿去加工。这个想象不算离谱,但也没那么简单。我接触这个方向有一段时间了,从最早的参数化脚本生成,到后来用大模型驱动几何建模,踩过的坑比想象中多得多。这篇文章就把我理解的 text-to-cad 完整拆开讲一遍——它是什么、底层靠什么跑通、实际落地时会遇到哪些问题、以及怎么把它接进你现有的 CAD 工作流里。
先把概念说清楚。text-to-cad,字面意思就是"文本到 CAD 模型",指的是用自然语言描述一个零件的形状、尺寸、特征,由系统自动生成可编辑或可制造的三维 CAD 数据。这里的 CAD 数据不是随便一个网格模型,而是带有几何语义的实体或曲面,最终往往要落到STEP、STL、GLB这几种格式上。这三种格式恰好代表了三条不同的下游路径:STEP 面向精确制造和后续编辑,STL 面向 3D 打印和网格处理,GLB 面向可视化、渲染和 Web 展示。理解这三者的差异,是理解整个 text-to-cad 价值链的起点。
为什么这件事值得关注?因为传统 CAD 建模的门槛实在不低。一个熟练的工程师建一个中等复杂度的零件,从草图到拉伸、倒角、打孔、阵列,动辄半小时起步;如果需求方只是想要一个"大概长这样"的概念模型,这个投入产出比就很低了。text-to-cad 想解决的,正是"想法到模型"这一段最耗时的翻译过程。它适合的人群也很明确:做概念设计的工业设计师、需要快速出原型的硬件创业者、做仿真前处理的工程师,以及大量需要批量生成标准件的开发者。
但我要先泼一盆冷水:目前没有任何一个 text-to-cad 系统能做到"你说人话,它出完美工程图"。它更像一个能力很强但需要引导的实习生——你描述得越结构化、越接近它训练时见过的表达方式,产出质量越高。所以这篇文章不会给你画大饼,而是把真实的能力边界、技术原理和实操方法讲透,让你知道什么能做、什么暂时别指望。
2. 三种输出格式决定了三条完全不同的技术路线
很多人做 text-to-cad 项目时,第一步就卡在"我到底该输出什么格式"上。这个问题看似是格式选择,实际上决定了你整个技术栈的走向。我见过太多人一开始没想清楚,做到一半发现 STEP 转 STL 丢特征、GLB 拿去做打印尺寸不对,返工成本极高。所以这一节先把三种格式的定位讲明白。
2.1 STEP:精确边界表示,制造与再编辑的基准
STEP(Standard for the Exchange of Product Data)是工业界公认的精确几何交换格式,它基于B-Rep(Boundary Representation,边界表示)来描述实体。简单说,B-Rep 记录的是一个实体由哪些面、哪些边、哪些顶点组成,每个面背后还有精确的数学曲面方程(平面、圆柱面、NURBS 曲面等)。这意味着 STEP 里的一个圆孔,是真的"圆",而不是用很多小三角面拼出来的近似圆。
这个特性决定了 STEP 是 text-to-cad 里最"值钱"的输出。因为只有 STEP 能被重新导入到 SolidWorks、中望 CAD、Fusion 360 这类参数化软件里继续编辑——你可以改孔径、加特征、做装配。如果你的目标是生成可制造的零件,STEP 几乎是唯一选择。代价是生成难度最高:系统必须真正理解几何拓扑关系,而不是生成一堆三角面片糊弄过去。
2.2 STL:三角网格,3D 打印与网格处理的主力
STL 是 3D 打印领域的事实标准,它用大量三角面片逼近物体表面。优点是简单、通用、几乎所有切片软件都认;缺点是没有单位、没有拓扑、没有曲面信息。一个 STEP 里的光滑圆柱,转成 STL 后就变成了一圈多边形棱柱,精度取决于你导出时的弦高公差设置。
在 text-to-cad 场景里,STL 通常不是直接生成的,而是从 STEP 或内部实体模型转换出来的。这里有个高频坑:STL 本身不带单位信息,很多系统默认按毫米导出,但有些按米,导入切片软件后模型要么大得离谱要么小得看不见。我一般会在导出时明确指定单位,并在切片软件里二次确认尺寸。
2.3 GLB:面向渲染与 Web 的轻量格式
GLB 是 glTF 的二进制版本,主打 Web 展示和实时渲染。它支持材质、颜色、贴图,加载快,浏览器原生友好。如果你的 text-to-cad 是要做一个"输入文字、网页里实时预览模型"的产品,GLB 是最佳选择。但它不适合制造——GLB 里的几何精度和单位都不保证,拿去做打印基本会出问题。
下面这张表是我总结的选型对照,实际项目里直接照着选基本不会错:
| 格式 | 几何类型 | 是否可再编辑 | 典型用途 | 生成难度 |
|---|---|---|---|---|
| STEP | B-Rep 精确实体 | 是 | 制造、装配、参数化编辑 | 高 |
| STL | 三角网格 | 否 | 3D 打印、网格仿真 | 中 |
| GLB | 网格+材质 | 否 | Web 预览、渲染展示 | 低 |
提示:如果你的项目既要展示又要制造,正确做法是内部维护一份精确实体模型,展示时转 GLB,制造时转 STEP 或 STL,而不是分别生成三份。
3. 文本如何变成几何:拆解 text-to-cad 的核心链路
搞清楚输出格式之后,下一个问题就是:一句话是怎么变成几何体的?这条链路其实可以拆成几个相对独立的环节,每个环节都有成熟方案,也有各自的坑。我把它拆成"语义解析—参数化表达—几何生成—格式转换"四段来讲。
3.1 语义解析:把自然语言翻译成结构化参数
大模型在这里扮演的是"翻译官"角色。用户说"一个 50 毫米长、20 毫米宽、10 毫米厚,四角带 R3 圆角的底板,中间开一个直径 8 毫米的通孔",模型需要把它解析成结构化数据,比如:
{ "type": "plate", "length": 50, "width": 20, "thickness": 10, "fillets": {"radius": 3, "corners": "all"}, "holes": [{"diameter": 8, "position": "center", "through": true}] }这一步的关键在于约束模型的输出格式。如果你直接让模型输出代码或几何,它很容易胡编;但如果让它输出一个定义良好的 JSON schema,可靠性会高很多。我的经验是:schema 设计得越贴近 CAD 的建模特征树(草图、拉伸、孔、圆角、阵列),后续生成越顺。
3.2 参数化表达:用代码描述几何的几种主流方式
拿到结构化参数后,需要一种"可执行的几何描述"。目前主流有三条路:
- OpenSCAD 风格:用类似编程的语言描述 CSG(构造实体几何),比如
cube([50,20,10])再difference()挖孔。优点是简单直观,缺点是复杂曲面能力弱。 - CadQuery / build123d:基于 Python 的参数化建模库,底层是 OpenCASCADE 几何内核,能生成真正的 B-Rep 实体,直接导出 STEP。这是目前 text-to-cad 项目里最常用的方案。
- 直接调用 CAD 内核 API:比如通过 Parasolid、ACIS 或 OpenCASCADE 的底层接口,灵活但开发成本高。
对绝大多数项目,我推荐CadQuery 或 build123d。原因很直接:它们能输出 STEP,Python 生态成熟,大模型对 Python 代码的生成质量也明显高于其他 DSL。让模型生成 CadQuery 脚本,再执行脚本得到实体,这条链路目前最稳。
3.3 几何生成与校验:为什么必须做"可执行性检查"
大模型生成的代码不一定能跑通。常见错误包括:参数单位混乱、布尔运算顺序错误导致空实体、圆角半径大于边长导致失败。所以生成之后必须有一道执行与校验环节:跑一遍脚本,捕获异常,检查生成的实体体积是否大于零、包围盒尺寸是否符合预期。
我一般会加一个自动重试机制:如果执行失败,把报错信息回传给模型,让它修正后重试,通常两三次就能收敛。这一步是 text-to-cad 从"玩具"变成"能用"的分水岭,很多 demo 好看但一用就崩,就是因为跳过了校验。
3.4 格式转换:STEP 到 STL、GLB 的落地细节
实体生成后,导出 STEP 基本是一行代码的事。转 STL 时要注意弦高公差(linear deflection)和角度公差(angular deflection):公差越小网格越密、文件越大。做 3D 打印一般弦高设 0.01~0.05 毫米足够;做 Web 预览可以放宽到 0.1 毫米以上以减小体积。转 GLB 则通常借助 trimesh 或 assimp 这类库,顺便可以带上材质和颜色。
4. 把 text-to-cad 接进真实工作流的实操步骤
原理讲完,这一节上干货。假设你要从零搭一个能用的 text-to-cad 小系统,下面是我实际跑通过的步骤,按顺序做基本不会翻车。
4.1 环境准备:几何内核与依赖安装
核心依赖是 OpenCASCADE 的 Python 封装。用 CadQuery 的话,推荐直接用 conda 装,能省掉大量编译问题:
conda create -n text2cad python=3.11 conda activate text2cad conda install -c conda-forge cadquery pip install trimesh openai这里有个坑:CadQuery 依赖的 OCP 库对 Python 版本和系统架构比较敏感,Windows 上直接用 pip 装经常失败,conda-forge 的预编译包最省心。如果你要用 build123d,装法类似,它和 CadQuery 共享底层内核。
4.2 设计提示词模板:让模型稳定输出可执行代码
不要指望一句大白话就能出好结果。我通常会给模型一个固定的系统提示,明确要求它输出 CadQuery 代码,并规定好单位、坐标系、导出方式。模板大致长这样:
你是一个 CAD 建模助手。请根据用户描述生成 CadQuery Python 代码。 要求: 1. 所有尺寸单位为毫米。 2. 模型以原点为中心,Z 轴向上。 3. 代码最后将结果赋值给变量 result。 4. 只输出代码,不要解释。实测下来,加了这套约束后,代码一次通过率能从三成提到七成以上。剩下的靠重试机制兜底。
4.3 执行、校验与自动重试的完整闭环
把生成、执行、校验串成一个循环,是整个系统的心脏。伪代码逻辑如下:
for attempt in range(3): code = llm_generate(prompt, error_feedback) try: result = execute_cadquery(code) if result.volume > 0 and bbox_ok(result): break except Exception as e: error_feedback = str(e)bbox_ok是我自己加的包围盒检查,用来防止模型生成一个尺寸离谱的实体。比如用户要 50 毫米的板子,结果生成了 5000 毫米,体积检查通不出问题,但包围盒一量就露馅了。
4.4 导出与下游对接:STEP、STL、GLB 一次生成
校验通过后,一次性导出三种格式,供不同下游使用:
import cadquery as cq cq.exporters.export(result, "part.step") cq.exporters.export(result, "part.stl", tolerance=0.02) # GLB 用 trimesh 从 STL 或网格转换 import trimesh mesh = trimesh.load("part.stl") mesh.export("part.glb")这样一套下来,用户输入一句话,几秒内就能拿到可编辑的 STEP、可打印的 STL 和可预览的 GLB。我实测过一个中等复杂度的支架类零件,从输入到三种格式齐全,大概 10 到 20 秒,取决于模型调用延迟。
5. 实测中最容易翻车的几个地方
前面讲的是"应该怎么做",这一节讲"实际会怎么坏"。这些坑我基本都亲自踩过,写出来帮你省时间。
5.1 单位与坐标系混乱:最常见的低级错误
大模型对单位极不敏感。你说"长 5 厘米",它可能按 5 毫米建模,也可能按 5 米。解决办法只有一个:在提示词里强制统一为毫米,并在校验环节检查包围盒。坐标系同理,有的模型习惯 Z 轴向上,有的习惯 Y 轴向上,导出到下游软件后模型躺倒的情况非常普遍。我一般固定要求 Z 轴向上、模型居中,减少对接摩擦。
5.2 布尔运算顺序错误导致空实体
挖孔、切除这类操作,如果顺序或方向搞反,很容易得到一个体积为零的空壳。比如先挖孔再拉伸,孔就被填回去了。这类错误不会报异常,但结果明显不对。所以体积检查是必须的,result.volume > 0这一条能拦下大部分逻辑错误。
5.3 圆角与薄壁特征:几何内核的经典雷区
圆角半径大于相邻边长、薄壁厚度小于内核容差,都会导致建模失败。OpenCASCADE 在这类情况下经常直接抛异常。我的处理方式是:在提示词里提醒模型"圆角半径不得超过最小边长的三分之一",并在失败重试时把具体报错喂回去,让它自动调小参数。
5.4 复杂曲面的能力天花板
必须承认,当前 text-to-cad 对自由曲面、有机形状的支持很弱。你让它生成一个"流线型外壳",结果往往是几个拉伸体拼出来的方块。这不是提示词的问题,而是参数化建模本身对自由曲面的表达就吃力。如果你的需求以曲面为主,建议走另一条路——用隐式建模或网格生成方案,而不是硬套 CSG。
6. 关于精度、性能与批量生成的进阶思考
如果你只是做 demo,前面几节够了。但如果你要把它做成生产工具,还有几个维度必须考虑。
6.1 精度控制:STEP 与 STL 的精度不是一回事
STEP 的精度由几何内核的容差决定,通常是 1e-6 米级别,足够精确。STL 的精度则由你导出时的公差参数决定,是"可调"的。很多人误以为 STL 精度是固定的,其实同一份 STEP 可以导出不同精度的 STL。做打印件我一般用 0.02 毫米弦高,做展示用 0.1 毫米,文件体积能差好几倍。
6.2 批量生成时的稳定性与并发
批量场景下,最大的敌人是个别请求失败拖垮整批。我的做法是把每个生成任务隔离在独立进程里执行,设置超时,失败就跳过并记录,不让它阻塞队列。另外几何内核不是线程安全的,多线程并发建模容易崩,用多进程更稳。
6.3 缓存与复用:相同描述不必重复生成
如果系统有大量重复或相似的描述(比如标准件),加一层缓存能省下大量算力。我一般对结构化参数做哈希,命中就直接返回已生成的模型文件。对于参数只差一点点的需求,还可以做参数化模板,只改数值不重新生成代码。
7. 我在这条路上攒下的几点实在经验
做 text-to-cad 这段时间,最大的体会是:它不是一个纯 AI 问题,而是一个 AI 加几何工程的复合问题。光会调模型不够,你得懂 B-Rep、懂布尔运算、懂格式转换,否则生成的东西看着像那么回事,一到下游就废。
第二个体会是,约束比自由更重要。给模型越明确的 schema、越严格的提示词、越完善的校验,产出越可靠。放任它自由发挥,结果往往不可控。这跟带新人是一个道理,边界划清楚了,反而效率高。
第三个是别追求一步到位。先从简单的板类、轴类、支架类零件做起,把链路跑通,再逐步加复杂度。我见过太多项目一上来就想生成复杂装配体,结果卡在基础几何上动弹不得。把 STEP、STL、GLB 三条输出路径都打通,把校验和重试做扎实,这套系统就已经能解决相当一部分真实需求了。至于自由曲面和复杂装配,那是下一阶段的事,急不来。