2026/10/8 23:14:19

text-to-cad 实战:从自然语言到 STEP/STL/GLB 三维模型生成全链路拆解

text-to-cad 实战:从自然语言到 STEP/STL/GLB 三维模型生成全链路拆解 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精确边界表示制造与再编辑的基准STEPStandard for the Exchange of Product Data是工业界公认的精确几何交换格式它基于B-RepBoundary 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 里的几何精度和单位都不保证拿去做打印基本会出问题。下面这张表是我总结的选型对照实际项目里直接照着选基本不会错格式几何类型是否可再编辑典型用途生成难度STEPB-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。原因很直接它们能输出 STEPPython 生态成熟大模型对 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 python3.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, tolerance0.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 三条输出路径都打通把校验和重试做扎实这套系统就已经能解决相当一部分真实需求了。至于自由曲面和复杂装配那是下一阶段的事急不来。