☰
text-to-cad 实战:从自然语言到 STEP/GLB/STL 三维模型生成
2026/10/8 7:11:16 网站建设 项目流程

1. 从一段文字到三维模型:text-to-cad 到底在解决什么问题

第一次听到 "text-to-cad" 这个词,很多人脑子里浮现的画面可能是:对着电脑敲一句"给我画一个法兰盘",然后屏幕上就自动出现一个带螺栓孔的三维模型。这个想象不算离谱,但真正落地的时候,它解决的问题比"自动画图"要具体得多,也有意思得多。

text-to-cad 的核心链路,是把自然语言描述转换成参数化的三维几何数据,再导出成下游能直接用的格式,比如 STEP、GLB、STL。它瞄准的不是替代资深结构工程师去做复杂装配体设计,而是解决那些"重复、琐碎、有规律、但手工建模很烦"的场景。举个最典型的例子:你需要一批不同尺寸的垫片、支架、盒子、齿轮毛坯,每个都要改几个参数重新建模。传统做法是打开 CAD 软件,改草图、改拉伸、重新导出,一个下午就没了。而 text-to-cad 的思路是,你用一句话描述尺寸和形状,程序直接生成几何体并导出文件。

这套东西适合谁?我观察下来主要是三类人。第一类是做批量零件或标准件的工程师,他们需要快速产出大量变体模型。第二类是做仿真、渲染、3D 打印的开发者,他们需要程序化地拿到 STL 或 GLB 文件,而不是手动建模。第三类是做 AI 应用的产品和技术人员,想把"文字生成三维"这个能力接进自己的工具链里。这三类人的共同点是:他们要的不是精美的曲面造型,而是能用的、参数正确的、格式标准的几何数据。

关键词里出现的 STEP、GLB、STL 三个格式,其实就对应了三条不同的下游路线。STEP 是 CAD 领域的通用交换格式,精度高、带 B-rep 实体信息,适合回流到专业 CAD 软件里继续编辑。GLB 是 glTF 的二进制打包格式,轻量、带材质和层级,适合网页 3D 展示和游戏引擎。STL 是三角网格格式,只有表面几何、没有拓扑,但它是 3D 打印和很多仿真软件的事实标准。理解这三个格式的差异,是理解 text-to-cad 整个价值链条的钥匙,后面我会专门拆开讲。

需要先说明一点:text-to-cad 不是一个现成的、开箱即用的商业软件名字,它更像是一类技术方案的统称。市面上有开源项目、有 API 服务、也有自己攒的工具链。所以这篇文章不会只讲某一个工具,而是把这类方案的通用原理、选型逻辑、实操步骤和踩坑经验讲透,你拿到任何一套具体实现都能对号入座。

2. 拆解 text-to-cad 的技术链路:文字是怎么变成几何体的

2.1 自然语言到结构化参数的转换层

整条链路的第一环,是把人话变成机器能算的参数。这一步看起来简单,实际上是最容易翻车的地方。用户说"一个长 50 宽 30 高 20 的盒子,壁厚 2 毫米",人一听就懂,但程序要从中抽出长度、宽度、高度、壁厚四个数值,还要知道它们分别对应哪个几何维度。

常见的做法有两种。一种是基于大语言模型做信息抽取,让模型输出一段结构化的 JSON,比如{"type": "box", "length": 50, "width": 30, "height": 20, "wall": 2}。另一种是基于规则模板匹配,用正则或者语法解析去抓关键词和数字。两种方式各有取舍:大模型灵活、能处理各种口语化表达,但可能不稳定、偶尔抽错;规则匹配稳定可控,但用户稍微换个说法就识别不了。

我自己的经验是,生产环境里最好两者结合。先用大模型做一轮抽取,再用规则做校验和兜底。比如模型抽出来的长度是负数或者大得离谱,规则层就该拦下来报错,而不是傻乎乎地拿去建模。这一步的稳定性直接决定了整个系统的可用性,因为几何建模本身是确定性的,输入错了,后面全错。

2.2 参数化几何的生成:从 JSON 到实体

拿到结构化参数之后,就进入真正的几何生成环节。这里主流的工具有几个方向。一个是基于 OpenCASCADE 这类几何内核,用代码直接构造 B-rep 实体,这种方式生成的模型精度高、能导出 STEP。另一个是基于网格建模库,比如用 trimesh、numpy-stl 这类库直接拼三角面片,适合快速产出 STL。还有一种是调用 CAD 软件的脚本接口,比如用 Python 驱动 FreeCAD 或者用脚本控制专业 CAD,让它按参数建模再导出。

选哪条路,取决于你的下游要什么。如果最终要 STEP,那基本绕不开几何内核,因为 STEP 需要精确的边界表示,网格数据转过去会丢精度。如果只要 STL 做打印,那网格库就够了,还更轻量。如果团队本来就在用某个 CAD 软件,那用它的脚本接口最省事,生成的模型天然兼容。

这里有个很多人忽略的点:几何内核的布尔运算(比如挖孔、开槽、求交)是有失败率的。参数稍微极端一点,比如壁厚小于某个阈值、孔的位置刚好在边缘,布尔运算就可能报错或者生成破面。所以生成环节必须做结果校验,检查实体是否有效、体积是否合理、有没有自相交。这一步不做,导出的文件到了下游软件里打开就是一堆烂面,排查起来非常痛苦。

2.3 格式导出:STEP、GLB、STL 各自的门道

导出这一步,看着只是调个 API,其实坑不少。STEP 导出要注意单位,很多内核默认是毫米,但有些场景要米,单位错了模型尺寸就差一千倍。GLB 导出要注意坐标系,glTF 用的是 Y 轴向上,而很多 CAD 用 Z 轴向上,不做转换的话模型在网页里就是躺着的。STL 导出要注意是二进制还是 ASCII,二进制体积小、加载快,ASCII 可读但文件巨大,3D 打印一般用二进制。

还有一个隐蔽的坑:STL 没有单位信息。STL 文件里只有一堆三角面片的坐标,它不知道自己是毫米还是英寸。所以导出 STL 的时候,尺寸必须在下游软件里手动指定单位,否则打印出来的东西可能大得离谱或者小得看不见。这个坑我踩过不止一次,后面会详细讲。

3. 格式选型实战:STEP、GLB、STL 到底该用哪个

3.1 三种格式的本质差异对照

很多人选格式是凭感觉,或者"别人用啥我用啥"。其实这三种格式的差异是结构性的,选错了后面全是麻烦。我用一张表把关键差异列清楚。

维度STEPGLBSTL
几何表示B-rep 精确实体三角网格 + 材质三角网格
是否带拓扑带,能识别面/边/体部分带层级不带,只有面片
单位信息带带(米)不带
文件体积中等小二进制小 / ASCII 大
可否再编辑可以,回流 CAD有限,适合展示基本不能
典型用途CAD 交换、加工网页/引擎展示3D 打印、仿真
精度高中取决于网格密度

看懂这张表,选型就清楚了一大半。要回流到 CAD 继续设计,选 STEP。要在网页或者游戏里展示,选 GLB。要送去 3D 打印或者做有限元网格,选 STL。

3.2 什么时候必须用 STEP

STEP 的核心价值是精确和可编辑。它保存的是数学意义上的曲面和实体,不是近似的三角面片。所以当你需要把模型交给加工中心、需要做精确的装配干涉检查、或者需要在下游 CAD 里继续改特征的时候,STEP 是唯一选择。

但 STEP 也有代价。它的生成依赖几何内核,内核的布尔运算可能失败,导出可能报错。而且 STEP 文件在不同 CAD 软件之间传递时,偶尔会出现"破面"或者"实体变曲面"的情况,这通常是因为内核版本或者精度设置不一致。我的建议是,导出 STEP 之后,一定要用目标 CAD 软件实际打开验证一遍,别假设它能用。

3.3 GLB 在展示场景里的优势与陷阱

GLB 最大的优势是轻和通用。它是为实时渲染设计的,文件小、加载快、浏览器原生支持。如果你要做的是一个"输入文字、网页上立刻看到 3D 模型"的产品,GLB 几乎是默认答案。

但 GLB 的陷阱在于坐标系和缩放。glTF 规范规定 Y 轴向上、单位是米,而绝大多数 CAD 数据是 Z 轴向上、单位是毫米。直接导出的话,模型要么躺着,要么小一千倍。正确做法是在导出时做一次坐标变换和单位换算,把 Z-up 转成 Y-up,把毫米转成米。这个转换不难,但忘了就会得到一个"看起来啥都没有"的网页。

3.4 STL 用于 3D 打印时的单位与精度控制

STL 是三个格式里最"糙"的,但它在 3D 打印领域是绝对主流。用 STL 有两个关键参数要控制:网格密度和单位。

网格密度决定了模型的精细程度。太粗,曲面变成多边形,打印出来有明显的棱角;太细,文件巨大,切片软件卡死。一般经验是,对于直径 50 毫米左右的圆柱,圆周方向 64 到 128 个分段比较合适。这个值可以通过弦高公差来控制,公差越小网格越密。

单位问题前面提过,STL 不带单位,所以导出时你心里要清楚这个模型是"毫米数值",到了切片软件里要选毫米。我见过有人导出的模型在切片软件里显示成 0.05 毫米高,就是因为单位没对上。

4. 手把手搭一条最小可用的 text-to-cad 流水线

4.1 环境准备与依赖选择

要自己搭一条流水线,先得把工具选好。我推荐一套对新手比较友好的组合:用 Python 做胶水语言,用大模型 API 做文字解析,用 CadQuery 或者 build123d 做参数化建模,用 trimesh 做网格处理和 STL 导出。

CadQuery 是基于 OpenCASCADE 的 Python 建模库,语法接近自然描述,适合做参数化零件。build123d 是它的新一代替代,API 更现代。trimesh 则是网格处理的多面手,读 STL、转格式、算体积都很方便。这套组合的好处是全部开源、文档齐全、社区活跃。

安装上,CadQuery 建议用 conda 装,因为它的几何内核依赖比较重,pip 装容易出问题。trimesh 用 pip 就行。大模型 API 看你用哪家,按官方文档配好 key 即可。

conda create -n text2cad python=3.11 conda activate text2cad conda install -c conda-forge cadquery pip install trimesh openai

4.2 用大模型把一句话解析成参数字典

假设用户输入"生成一个外径 40、内径 20、厚度 5 的圆环"。我们要把它变成{"type": "ring", "outer_d": 40, "inner_d": 20, "thickness": 5}。用大模型做这件事,关键是把输出格式约束死,让它只吐 JSON,不要废话。

import json from openai import OpenAI client = OpenAI() PROMPT = """你是一个参数抽取器。把用户的几何描述转成 JSON。 只输出 JSON,不要任何解释。字段包括 type 和尺寸参数。 支持的 type: box, cylinder, ring, plate。 """ def parse_text(user_input): resp = client.chat.completions.create( model="gpt-4o-mini", messages=[ {"role": "system", "content": PROMPT}, {"role": "user", "content": user_input}, ], response_format={"type": "json_object"}, ) return json.loads(resp.choices[0].message.content)

这里用response_format强制 JSON 输出,能大幅降低解析失败率。但即便如此,仍然要做字段校验,因为模型可能给出不存在的 type 或者缺失参数。校验层是保命的,别省。

4.3 用 CadQuery 生成实体并导出 STEP

拿到参数字典后,就可以建模了。以圆环为例,CadQuery 的写法很直观。

import cadquery as cq def build_ring(outer_d, inner_d, thickness): return ( cq.Workplane("XY") .circle(outer_d / 2) .circle(inner_d / 2) .extrude(thickness) ) def export_step(model, path): cq.exporters.export(model, path)

生成之后,务必做一次有效性检查。CadQuery 的实体有isValid()方法,返回 False 就说明几何有问题,这时候要么调整参数,要么报错给用户,千万别硬导出。

4.4 转成 STL 和 GLB 的完整代码

从同一个实体出发,导出 STL 和 GLB 也不难。STL 可以直接用 CadQuery 导出,GLB 则建议先转成网格再用 trimesh 处理。

import trimesh def export_stl(model, path, tolerance=0.01): cq.exporters.export(model, path, tolerance=tolerance) def export_glb(model, path): # 先导出临时 STL,再转 GLB cq.exporters.export(model, "/tmp/tmp.stl") mesh = trimesh.load("/tmp/tmp.stl") # Z-up 转 Y-up mesh.apply_transform(trimesh.transformations.rotation_matrix( -3.14159 / 2, [1, 0, 0])) mesh.export(path, file_type="glb")

这段代码里那个旋转矩阵就是解决坐标系问题的关键。少了它,GLB 在网页里就是躺着的。

5. 那些文档里不会写的坑:我在实操中踩过的雷

5.1 布尔运算失败:最常见的"玄学"报错

布尔运算失败是几何建模里最让人抓狂的问题。你参数明明没问题,代码也没错,但内核就是告诉你"运算失败"。原因通常有几个:面重合(两个实体刚好贴在一起,内核分不清内外)、精度冲突(不同来源的几何精度不一致)、退化几何(某个面小到接近零)。

解决办法我总结了几条。第一,给布尔运算留余量,比如挖孔的时候让孔的深度比板厚多一点点,避免刚好穿透。第二,统一精度,所有几何用同一套公差设置。第三,失败时重试,有时候微调一下参数(比如把 20.0 改成 20.001)就能过。第四,实在不行就换内核或者换建模顺序。

5.2 STL 单位丢失导致的打印灾难

这个坑我印象太深了。有一次导出一个 100 毫米的零件,切片软件里显示成 0.1 毫米,我以为是软件 bug,折腾半天才发现是单位问题。STL 本身不带单位,切片软件默认按毫米读,但如果你的建模环境用的是米,导出的数值就是 0.1,切片软件读成 0.1 毫米。

规避方法很简单:建模阶段统一用毫米,导出前确认数值范围合理。一个 100 毫米的零件,STL 里的坐标应该在 -50 到 50 之间,如果看到 -0.05 到 0.05,那就是单位错了。

5.3 GLB 坐标系翻转引发的"模型躺平"

前面提过,glTF 是 Y-up,CAD 是 Z-up。忘了转换,模型在网页里就是躺着的。更麻烦的是,有些转换工具会自动帮你转,有些不会,导致你搞不清到底转没转。我的做法是在导出 GLB 的代码里显式写死转换,不依赖任何工具的默认行为,这样行为可预测。

5.4 大模型解析不稳定时的兜底策略

大模型偶尔会抽风,把"外径 40"理解成"半径 40",或者漏掉一个参数。这时候如果直接拿去建模,出来的就是错的东西。兜底策略有三层:格式校验(字段齐不齐、类型对不对)、范围校验(数值在不在合理区间)、语义复核(把解析结果回显给用户确认)。第三层最有效,让用户看一眼"我理解的是外径 40、内径 20、厚 5,对吗",确认了再建模,能挡掉绝大多数错误。

6. 把 text-to-cad 接进真实工作流的几种姿势

6.1 批量生成标准件变体

这是 text-to-cad 最实用的场景。比如你要生成 50 个不同尺寸的法兰,与其手工建模 50 次,不如写个循环,把尺寸列表喂进去,批量生成 STEP 和 STL。这种场景下,文字输入其实可以简化成参数表,大模型那一层甚至可以省掉,直接用模板加参数就行。text-to-cad 的价值在于把"描述"和"几何"解耦,描述可以是自然语言,也可以是结构化数据。

6.2 和现有 CAD 工具链的衔接

很多团队已经有自己的 CAD 工作流,text-to-cad 不是要替代它,而是补上"快速产出初版模型"这一环。生成的 STEP 可以直接导入现有 CAD 继续细化,生成的 STL 可以直接进切片软件。关键是格式要标准、单位要统一、命名要规范,否则接进去还得手工修,就失去意义了。

6.3 面向 3D 打印的自动化出图

3D 打印用户最需要的是"描述即打印"。你说要一个手机支架,程序生成 STL,直接丢进切片软件。这条链路里,text-to-cad 省掉的是建模这一步,但打印前的检查不能省:模型是否封闭、壁厚是否够、有没有悬空结构。这些检查可以程序化做,比如用 trimesh 检查水密性,用切片软件的 CLI 做预切片。

7. 关于精度、性能与扩展性的几点个人体会

做了一段时间 text-to-cad,我最大的体会是:这东西的难点不在"生成",而在"保证生成的东西是对的"。几何建模本身是确定性的,代码写对了就一定能出结果,但"对的结果"需要一整套校验和兜底机制来保障。参数校验、几何有效性检查、格式转换验证,这三道关卡一个都不能少。

性能上,单次生成的耗时主要花在几何内核的布尔运算上,简单零件几百毫秒,复杂零件可能几秒。如果要批量生成,建议做并行处理,因为每个零件是独立的,天然适合多进程。但要注意几何内核不一定线程安全,用多进程比多线程稳妥。

扩展性方面,我建议把整个链路设计成插件式的:解析层、建模层、导出层各自独立,换大模型不影响建模,换几何内核不影响导出。这样以后想支持新的输入方式(比如语音、草图)或者新的输出格式(比如 3MF、OBJ),只需要加一个插件,不用动核心逻辑。

最后分享一个小技巧:给每个生成的模型算一个哈希,基于输入参数和输出格式。这样同样的请求可以直接命中缓存,省掉重复计算。批量场景下这个优化能省掉大量时间,尤其是那些反复生成相同标准件的情况。

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

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

立即咨询