ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

text-to-cad 实战:从自然语言到 STEP/STL/GLB 模型全流程

text-to-cad 实战:从自然语言到 STEP/STL/GLB 模型全流程 1. 从一句话到三维模型text-to-cad 到底在解决什么问题第一次听到 text-to-cad 这个词我脑子里蹦出来的画面是对着电脑敲一行字屏幕上直接长出一个能加工、能打印、能导入装配体的三维实体。这个方向这两年被讨论得越来越多原因其实很朴素——传统 CAD 建模的门槛太高了。你得先学会草图约束、拉伸旋转、布尔运算、基准面选择一套流程走下来画个带倒角的法兰盘可能就要半小时。而 text-to-cad 想做的事情是把描述需求和生成几何这两件事直接连起来中间那些繁琐的点击操作尽量交给程序去完成。先把概念说清楚。text-to-cad 不是一个具体的软件而是一类技术路线的统称输入一段自然语言描述比如一个外径 80mm、内径 40mm、厚度 10mm 的圆环边缘倒角 2mm系统输出一个可用的三维模型文件。输出的格式通常就是热搜词里反复出现的 STEP、GLB、STL 这几种。这三种格式各有各的脾气后面我会专门拆开讲。它解决的问题很明确让不会 CAD 的人也能拿到模型让会 CAD 的人从重复劳动里解放出来。那这东西适合谁用我梳理了一下大概三类人受益最明显。第一类是产品经理、设计师这类有想法但不会建模的角色他们能清楚描述需求却卡在软件操作上第二类是工程师手里有大量参数化程度很高的零件比如标准件、连接件、支架每次改个尺寸都要重新画一遍非常浪费第三类是做 3D 打印、创客、教育场景的人他们需要的往往不是精密工程图而是一个能直接切片打印的网格模型对建模过程的严谨性要求没那么高。这里必须提前泼一盆冷水text-to-cad 目前还远没到说一句话就出工程级零件的程度。自然语言本身是模糊的一个好看的支架这种描述人和人理解都不一样更别说机器。所以真正能落地的用法是把描述限制在参数明确、结构规整的范围内。你描述得越像一张参数表出来的结果就越靠谱。这一点是我踩了不少坑之后才想明白的后面会反复提到。2. 三种输出格式的门道STEP、GLB、STL 到底怎么选很多人第一次接触 text-to-cad最懵的不是怎么生成而是生成出来该存成什么格式。STEP、GLB、STL 这三个词在热搜里高频出现说明大家确实在这上面卡过。我先把它们的本质区别讲透再告诉你什么场景选哪个。2.1 STEP工程界的通用语言要精度就选它STEP 的全称是 Standard for the Exchange of Product model data中文一般叫产品模型数据交换标准。它的核心特点是基于边界表示BRep也就是说它记录的是精确的数学曲面和实体拓扑关系一个圆柱面在 STEP 里就是一个真正的圆柱面方程而不是一堆小三角片拼出来的近似。这意味着什么意味着你在 STEP 里量一个孔的直径量出来就是精确的 40.000mm不会因为网格离散化产生误差。所以凡是涉及后续要修改、要装配、要出工程图、要送去 CNC 加工的场景STEP 都是首选。主流 CAD 软件比如中望 CAD、SolidWorks、Fusion 360 都能直接读写 STEP互通性非常好。但 STEP 也有它的麻烦。它文件通常比较大而且不同软件对 STEP 的解析实现有差异偶尔会出现导入后曲面破了圆角变成一段段碎面的情况。这不是格式本身的错多半是导出时的精度设置或者版本兼容问题。我的经验是导出 STEP 时尽量选 AP214 或 AP242 版本兼容性比老版本好不少。2.2 STL3D 打印的老朋友只认三角面片STL 是这三者里历史最久的本质极其简单它只描述物体的表面三角网格没有单位、没有颜色、没有材质、没有实体概念就是一坨三角形。正因为简单它成了 3D 打印领域的通用格式切片软件几乎都认它。STL 分二进制和 ASCII 两种。ASCII 版能直接用文本编辑器打开看但体积巨大二进制版体积小得多实际使用中基本都是二进制。这里有个很多人忽略的点STL 没有单位。你导出的时候模型是 80mm导入切片软件时如果对方默认按英寸解析就会变成 80 英寸直接爆盘。所以每次导入 STL第一件事就是确认尺寸。另外 STL 的精度完全取决于三角面片的密度。曲面越复杂需要的三角形越多文件越大。导出时通常有个弦高或偏差参数值越小越精细但文件也越大。做 3D 打印一般设 0.01~0.05mm 就够了设太小纯属浪费。2.3 GLB带材质带颜色的展示利器GLB 是 glTF 格式的二进制版本主打的是轻量、带材质、带颜色、适合实时渲染和网页展示。它记录的是网格加 PBR 材质信息一个模型可以自带金属度、粗糙度、贴图丢进网页或者三维查看器里立刻就能看效果比 STL 好看太多。所以 GLB 的定位很清楚展示、预览、交互而不是精密制造。你要做一个产品配置器让用户在网页上转着看模型换颜色GLB 是最合适的。但你要是拿 GLB 去加工那就不对了因为它同样没有精确的曲面信息精度和 STL 一个级别。我把三者的关键差异整理成一张表方便你对照格式数据本质有无精确曲面典型用途常见坑STEPBRep 实体/曲面有加工、装配、出图、二次编辑版本兼容、曲面破损STL三角网格无3D 打印、快速成型无单位、精度靠面片密度GLB网格材质无网页展示、实时渲染、预览不适合制造、面数控制选型逻辑其实一句话能概括要改要造选 STEP要打印选 STL要展示选 GLB。如果你拿不准就先生成 STEP 存着需要的时候再转成另外两种因为从精确模型往网格模型转是降维信息只会丢不会错反过来从 STL 转 STEP 就麻烦了热搜里那个sw 中 stl 转 stp之所以被反复搜就是因为这个方向很难做好转出来的往往是一堆碎面而不是干净实体。3. 拆解 text-to-cad 的核心技术链路搞清楚输出格式之后我们来看 text-to-cad 内部到底是怎么把一句话变成模型的。这条链路拆开大概分四步语义解析、参数抽取、几何构建、格式导出。每一步都有它的门道我逐个讲。3.1 语义解析把人话翻译成机器能懂的意图第一步是把自然语言理解成结构化的意图。比如一个边长 50 的立方体顶部挖一个直径 20 深 10 的圆孔系统需要识别出主体是立方体尺寸参数是 50操作是在顶面做减材减材形状是圆柱直径 20深度 10。这一步现在主流做法是借助大语言模型做意图识别和参数抽取输出一个结构化的中间表示通常是一段 JSON 或者一段脚本。为什么用 JSON 这种中间层因为它是人话和几何内核之间的缓冲带。语言模型负责理解几何内核负责算两者解耦各自升级互不影响。这个设计思路很关键我后面讲实操时会再展开。这里最大的难点是歧义消解。顶部到底是哪个面如果模型是躺着的顶部可能指 Z 轴正方向也可能指用户视角的上方。成熟的系统会约定一套坐标系规则比如统一以 Z 轴向上为顶并在描述里显式要求用户指明方向。我的建议是写描述时尽量用沿 Z 轴正方向的面这种精确说法别用上面旁边这种相对词。3.2 参数抽取数字和单位的坑最多参数抽取看着简单其实坑很深。第一个坑是单位。你说直径 20是 20 毫米还是 20 厘米系统默认单位是什么如果没约定清楚出来的模型可能差十倍。我的做法是每次描述都带上单位比如直径 20mm绝不省略。第二个坑是隐含参数。你说一个标准 M6 螺栓M6 背后其实有一整套标准尺寸螺距 1mm、头部对边 10mm、头高 4mm 等等。这些参数要么系统内置了标准件库要么就得靠模型自己知道。目前大部分 text-to-cad 工具对标准件的支持还比较有限遇到这类需求最好把关键尺寸都写出来别指望它自动补全。第三个坑是参数之间的约束关系。比如一个壁厚均匀的盒子壁厚均匀意味着内腔尺寸要跟着外腔和壁厚联动。这种约束关系如果描述里没写清楚生成出来的可能就是个壁厚不均的壳。所以描述里凡是涉及均匀对称同心这类词都要格外小心最好用具体数值把关系锁死。3.3 几何构建背后是 CAD 内核在干活参数抽出来之后真正生成几何的是 CAD 内核。市面上常见的开源内核有 OpenCASCADE商业的有 Parasolid、ACIS 等。text-to-cad 系统通常会把上一步的 JSON 翻译成内核能执行的建模脚本比如用 CadQuery 或者 OpenSCAD 这类基于代码的建模工具。这里解释一下为什么很多方案选 CadQuery 而不是直接调内核 API。CadQuery 是 Python 的语法接近自然语言写起来直观而且它底层就是 OpenCASCADE能输出 STEP。用脚本做中间层的好处是可复现、可版本管理、可参数化。你生成的那段脚本本身就是模型的源代码改个参数重新跑一遍就行比在 GUI 里手动改快得多。几何构建阶段最容易出问题的地方是布尔运算失败。两个实体做差集如果面刚好重合或者相切内核可能算不出来直接报错或者产生破面。这是所有 CAD 内核的通病不是 text-to-cad 独有的。规避办法是让参与布尔运算的实体稍微错开一点比如挖孔时让圆柱比实际深度多伸出去 0.1mm保证完全穿透避免共面。3.4 格式导出最后一步别翻车几何算完了最后一步是导出成 STEP、STL 或 GLB。这一步看着简单其实决定了你拿到的文件能不能用。导出 STEP 要注意版本和精度导出 STL 要注意弦高和单位导出 GLB 要注意面数控制和材质。我特别想强调 STL 导出的弦高参数。弦高chord height指的是用三角面片逼近曲面时允许的最大偏差。设 0.1mm意味着曲面和真实形状的误差不超过 0.1mm。对于 3D 打印0.05mm 通常足够对于大尺寸模型0.1mm 也够用。设太小文件会爆炸设太大表面会有明显棱角。这个参数没有万能值得根据模型尺寸和用途调。4. 手把手实操从一句描述到可用的 STEP 文件理论讲够了来点能直接抄作业的。下面这套流程是我自己反复验证过的用 Python 生态里的 CadQuery 配合自然语言解析走通描述→脚本→STEP/STL的完整链路。你不需要装任何商业软件全是开源工具。4.1 环境准备把工具链装齐先装 Python建议 3.9 以上。然后装 CadQuery它是整个流程的几何引擎pip install cadqueryCadQuery 装好之后顺手把导出 STL 需要的依赖也确认一下它自带了对 STL 和 STEP 的支持一般不用额外装。如果你还想导出 GLB可以再装一个 trimeshpip install trimeshtrimesh 的好处是它能读 STL、能转 GLB还能做网格简化后面展示环节用得上。环境这块没什么玄学装完能 import 成功就行。4.2 把描述翻译成建模脚本假设我要做一个外径 80mm、内径 40mm、厚度 10mm 的圆环外边缘倒角 2mm。对应的 CadQuery 脚本是这样import cadquery as cq # 参数区所有尺寸集中管理方便改 outer_d 80.0 # 外径 inner_d 40.0 # 内径 thickness 10.0 # 厚度 chamfer 2.0 # 倒角 # 先做一个外圆柱 result ( cq.Workplane(XY) .circle(outer_d / 2) .extrude(thickness) ) # 再挖内孔注意这里让切除体上下各多伸 1mm避免共面 result ( result .faces(Z).workplane() .circle(inner_d / 2) .extrude(-(thickness 2)) ) # 外边缘倒角 result result.edges(|Z).chamfer(chamfer) # 导出 cq.exporters.export(result, ring.step) cq.exporters.export(result, ring.stl, tolerance0.01)这段脚本有几个细节值得说。第一参数全部提到最上面这是参数化建模的基本素养改尺寸只动这几行。第二挖内孔时我把切除圆柱的深度设成了thickness 2上下各多伸 1mm就是为了避开布尔运算的共面问题这是实战里非常管用的一招。第三倒角选的是|Z方向的边也就是平行于 Z 轴的边正好是外圆柱的侧棱。4.3 参数计算倒角为什么不能随便设倒角这个参数看着不起眼其实有约束。倒角尺寸不能超过相邻面的尺寸。这里外径 80、内径 40壁厚是 (80-40)/2 20mm。倒角 2mm 远小于壁厚没问题。但如果你设成 15mm就会超过壁厚内核直接报错。再比如厚度只有 10mm倒角如果设在上下边缘垂直于 Z 轴的边2mm 也安全但设成 6mm 就会把整个厚度吃掉大半形状会变得很奇怪。所以倒角值一般控制在最小相邻尺寸的 1/3 以内比较稳妥。这个经验值不是硬规定但能帮你避开大部分报错。4.4 导出与验证拿到文件先别急着用脚本跑完你会得到 ring.step 和 ring.stl 两个文件。这时候别急着丢进下游软件先做两件事验证。第一用 CadQuery 重新读回来检查体积。一个外径 80、内径 40、厚 10 的圆环理论体积是 π×(40²-20²)×10 ≈ 37699 mm³。倒角会削掉一点点实际值应该略小于这个数。如果差得离谱说明模型有问题。import cadquery as cq shape cq.importers.importStep(ring.step) print(shape.val().Volume())第二把 STL 丢进切片软件看一眼。不用真的打印就看它能不能正常切片、尺寸对不对。这一步能抓出单位错误、破面、非流形等问题。我见过太多次 STEP 看着好好的转成 STL 之后因为面片法线反了导致切片失败的情况。5. 实战避坑那些文档里不会写的经验上面是标准流程但真实项目里你会遇到一堆标准流程覆盖不到的问题。这一节我把踩过的坑整理出来都是花钱花时间换来的。5.1 描述写得好结果差不了text-to-cad 的输出质量八成取决于你的输入描述。我总结了一个描述三原则给数值、给单位、给关系。给数值就是别用大一点差不多这种词全部换成具体数字。给单位就是每个数字后面都带上 mm 或 cm别让系统猜。给关系就是涉及多个特征时说清楚它们的相对位置和约束比如孔位于顶面正中心两个圆柱同心。反面例子做一个带孔的圆盘。正面例子一个直径 100mm、厚 8mm 的圆盘中心有一个直径 20mm 的通孔孔沿 Z 轴贯穿。5.2 布尔运算失败的三种救法布尔运算失败是最高频的问题没有之一。我遇到过三种典型情况对应三种救法。第一种是共面两个实体的面完全贴合。救法是让切除体多伸出去一点就像前面挖孔那样。第二种是相切圆柱和平面刚好相切。救法是让它们稍微相交或者稍微分离别卡在临界点。第三种是微小特征比如 0.001mm 的缝隙内核精度处理不了。救法是放大特征或者干脆去掉。如果这三种都试了还不行还有个终极办法换个顺序做布尔运算。先做加后做减和先做减后做加结果可能完全不同。这个技巧很反直觉但实测有效。5.3 STL 转 STEP 为什么这么难热搜里sw 中 stl 转 stp被反复搜说明很多人卡在这。我得说句实话STL 转 STEP 本质上是有损的、近似的。STL 只有三角面片没有曲面信息转成 STEP 时软件只能尝试用平面和曲面去拟合这些三角片拟合得好就是一堆小平面拟合得差就是破面。所以正确的思路不是转而是重建。如果你手里只有 STL想要精确的 STEP靠谱的做法是把 STL 导入 CAD 作为参考然后手动或者半自动地重新建模一遍。听起来很笨但这是唯一能保证质量的路。指望一键转换得到干净实体基本不现实。5.4 常见问题速查表我把高频问题和对应处理整理成表遇到问题直接查现象可能原因处理办法导入后尺寸差 10 倍/25.4 倍单位不一致确认导出和导入的单位设置曲面有棱角、不光滑STL 弦高太大减小 tolerance 重新导出布尔运算报错共面/相切/微小特征错开实体、调整顺序STEP 导入后破面版本兼容问题换 AP214/AP242 重新导出切片软件报非流形网格有洞或法线反用 trimesh 修复或重新导出模型体积异常参数抽取错误回查描述和脚本参数6. 这套东西还能怎么扩展跑通基础流程之后你会发现 text-to-cad 的想象空间比想象中大。我自己试过几个扩展方向效果不错分享给你。第一个方向是批量参数化。既然模型是脚本生成的那就可以用循环批量出图。比如做一系列不同直径的法兰写个 for 循环一次生成几十个 STEP 文件。这在做产品系列、标准件库的时候效率极高比手动建模快几十倍。第二个方向是和 3D 打印流程打通。生成的 STL 直接调切片软件的接口自动切片、自动排版甚至自动生成打印任务。创客场景里这套自动化很香。第三个方向是网页端预览。把生成的 GLB 丢到网页三维查看器里用户能实时旋转、缩放、换颜色。做产品配置器、在线定制的时候这个体验比发一张静态图好太多。第四个方向是接入设计规范检查。生成模型之后自动检查壁厚是否达标、孔径是否在标准范围内、倒角是否合理。这一步能把很多低级错误挡在下游之前。我个人在实际操作中的体会是text-to-cad 现阶段最靠谱的定位不是替代 CAD 工程师而是替代重复劳动。它擅长的是那些结构规整、参数明确、批量生成的活儿比如标准件、连接件、简单支架、展示模型。真正复杂的、需要创造性判断的曲面造型还是得人来。把工具用在它擅长的地方效率提升是实打实的用错地方只会浪费时间。最后再分享一个小技巧每次生成完模型把那段描述和对应的脚本一起存下来时间长了你就有了自己的描述-模型语料库下次遇到类似需求改改参数就能复用越用越快。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进