text-to-cad 实战:从自然语言到可编辑三维模型的完整链路
发布时间:2026/10/8 19:43:57 作者:尧图编辑部 阅读量:1,286

1. 从一段文字到三维实体text-to-cad 到底在解决什么问题第一次听到 text-to-cad 这个词很多人会下意识觉得它是个噱头——输入一句话就能生成 CAD 模型这听起来像是把设计师十几年的经验压缩成一次回车键。但真正上手跑过几个案例之后我的判断是它现在还不是替代设计师的工具而是一个把自然语言意图快速转成可编辑几何体的前置加速器。它的价值不在于生成的东西有多完美而在于帮你跳过从零画草图、拉特征、倒角这一整套重复劳动直接拿到一个能改的毛坯。这个方向之所以最近被频繁讨论和几个现实痛点直接相关。传统 CAD 工作流里一个简单的支架、法兰、外壳从需求描述到第一版三维模型熟练工程师也要花二三十分钟新手可能一两个小时。而大量早期概念验证、方案比选、教学演示场景其实并不需要工业级精度只需要一个拓扑正确、尺寸大致合理、能导出 STEP/GLB/STL 的几何体。text-to-cad 瞄准的正是这段从想法到第一版模型的空白。它适合谁我梳理了三类人。第一类是做概念设计的产品经理和工业设计学生需要快速把脑子里的形状可视化不追求加工精度第二类是做仿真、渲染、3D 打印的工程师需要批量生成测试用的几何体比如一堆不同尺寸的支架去跑有限元第三类是做 AI 应用开发的程序员想在自己的工具链里嵌入文字生成模型的能力需要理解背后的数据格式和调用逻辑。关键词里出现的 STEP、GLB、STL 不是随便列的它们恰好对应了 text-to-cad 输出环节最核心的三个格式选择。STEP 是精确边界表示B-rep带完整的曲面和拓扑信息能进任何主流 CAD 软件继续编辑GLB 是 glTF 的二进制版本主打轻量和渲染友好适合网页展示和游戏引擎STL 是三角网格只有表面没有实体信息是 3D 打印和很多仿真软件的老朋友。理解这三者的差异基本就理解了 text-to-cad 从生成到落地的整条链路。我下面会按真实项目推进的顺序来讲先搞清楚这类系统内部到底怎么把文字变成几何再讲格式选择和转换里的坑然后是实际跑通一个流程的完整步骤最后聊聊精度、可编辑性和批量生成这些进阶话题。全程按我自己踩过的坑和验证过的做法来说不绕弯子。2. 文字是怎么变成几何体的text-to-cad 的底层链路拆解2.1 从自然语言到结构化参数意图解析这一层text-to-cad 的第一步不是画图是把一句话拆成机器能理解的参数。比如你输入一个长 80mm、宽 40mm、高 20mm 的带圆角长方体四个角半径 5mm系统要做的第一件事是识别出这是一个长方体primitive 类型三个主尺寸是 80/40/20有一个圆角特征fillet作用在四条竖直边上半径 5。这一层现在主流做法是大语言模型做语义解析输出结构化的 JSON 或 DSL。为什么不用传统的正则匹配因为自然语言的表达太发散帮我搞个 8 厘米长的方块和生成一个长度 80 的立方体要映射到同一个参数正则根本覆盖不过来。LLM 在这里的角色是翻译官把模糊的人类语言翻译成精确的参数字典。我实测下来这一层最容易出问题的地方是单位歧义和隐含约束。你说一个厚 5 的板模型可能默认 5mm也可能默认 5cm还可能理解成厚度是 5 个单位而单位系统没定义。所以靠谱的做法是在 prompt 里强制带单位或者在系统层面设定默认单位并在输出里显式回填。另一个坑是相对尺寸比如比刚才那个大一圈这种依赖上下文的描述单轮解析基本会翻车需要维护一个会话状态。从工程角度看这一层的输出最好是一个中间表示IR而不是直接生成几何。中间表示可以是类似 OpenSCAD 的脚本也可以是自定义的 JSON schema。好处是解析错了你能看到错在哪一步而不是拿到一个莫名其妙的模型干瞪眼。我在自己的流程里就坚持让模型先输出一段可读的参数描述人工确认后再进几何生成这一步多花十秒能省掉后面半小时的返工。2.2 参数化建模引擎几何到底是怎么被算出来的拿到参数之后真正把几何造出来的是参数化建模内核。这里绕不开一个名字OpenCASCADE简称 OCCT。它是开源世界里最成熟的 B-rep 建模内核FreeCAD、KiCad 的 3D 查看器等都在用它。text-to-cad 系统如果要做可编辑的精确模型底层大概率就是 OCCT 或者它的封装。为什么强调 B-rep因为 B-rep 记录的是面和边的数学定义一个圆柱面就是一段解析曲面方程而不是一堆三角形。这意味着你拿到模型后可以继续在上面做布尔运算、抽壳、倒角就像在 SolidWorks 里手动画的一样。而如果底层用的是网格表示mesh那生成的就是一堆三角面片改起来极其痛苦基本只能整体缩放。具体到文字生成几何这一步常见有两条技术路线。第一条是程序化合成LLM 输出一段建模脚本比如 CadQuery 的 Python 代码或 OpenSCAD 的脚本然后由脚本驱动内核生成几何。这条路可控性最强因为脚本是确定性的同样的脚本永远生成同样的模型方便版本管理和批量复现。第二条是直接生成 B-rep 序列模型直接输出建模操作的序列拉伸、旋转、布尔跳过脚本层。这条路更端到端但调试困难出错时很难定位是哪一步操作崩了。我个人更推荐程序化合成这条路原因很实际脚本是可读、可改、可版本控制的。生成的 CadQuery 代码你扫一眼就知道它干了什么哪条边倒角不对直接改那一行就行。而端到端生成的模型你只能看到结果看不到过程出了问题只能重新生成效率反而低。2.3 三种输出格式的定位STEP、GLB、STL 各管一段生成完几何接下来是导出。STEP、GLB、STL 这三个格式不是随便选的它们对应了完全不同的下游用途选错了会直接卡住后续流程。STEP.step/.stp是精确的 B-rep 交换格式ISO 10303 标准。它的核心价值是跨软件可编辑。你把 STEP 丢进 SolidWorks、中望 CAD、Fusion 360都能识别成实体继续做特征。缺点是文件大、解析慢而且不同软件对同一份 STEP 的缝合处理可能有细微差异偶尔会出现面丢失。做机械设计、要出工程图的场景STEP 是唯一正确选择。GLB.glb是 glTF 2.0 的二进制打包格式本质是三角网格加材质、贴图、节点层级。它的主场是渲染和展示网页 3D 预览、Three.js 加载、游戏引擎导入GLB 都是首选。它轻、加载快、浏览器原生支持好。但要注意GLB 里的几何是网格没有精确的曲面信息你不能拿它去标注尺寸或者做参数化修改。STL.stl是最古老的三角网格格式之一只有一堆三角形法向量和顶点没有单位、没有颜色、没有材质。它的地位来自3D 打印和仿真几乎所有切片软件、大部分有限元前处理都吃 STL。但 STL 的坑也最多——它不记录单位导出时是 mm 还是 inch 全靠约定它是面片汤不保证水密watertight有破面的话打印或仿真直接报错。格式几何类型可编辑性典型用途主要坑点STEPB-rep 精确曲面高可继续特征建模机械设计、工程图文件大、跨软件缝合差异GLB三角网格材质低仅整体变换网页渲染、游戏、展示无精确尺寸、面数可能过高STL纯三角网格极低3D 打印、有限元无单位、易破面、无材质我的建议是如果下游还要改一律先出 STEP如果只是看和打印再按需转 GLB 或 STL。很多人图省事直接生成 STL结果发现要改一个孔的位置只能回炉重造这就是没理解格式定位吃的亏。3. 格式转换与网格处理那些文档不会告诉你的坑3.1 STEP 转 STL为什么你的模型一打印就破面从 STEP 转 STL 是最常见的操作也是最容易出问题的环节。STEP 是精确曲面STL 是三角网格转换的本质是曲面离散化tessellation也就是用一堆小三角形去逼近光滑曲面。这里有个关键参数叫弦高偏差linear deflection和角度偏差angular deflection它们决定了三角形有多密。弦高偏差设得太大圆柱面会变成明显的多边形打印出来一圈棱设得太小三角形数量爆炸文件几百兆切片软件直接卡死。我一般的经验值是弦高偏差取模型最小特征尺寸的 1/100 到 1/50。比如你要打印的零件最小孔是 3mm那弦高偏差设 0.03 到 0.06mm 比较合适。角度偏差一般 0.5 到 1 度控制曲面转折处的细分。破面的根源往往不在转换本身而在原始 STEP 的拓扑质量。如果生成模型时布尔运算没做干净存在重合面、微小缝隙、自相交转成 STL 后这些地方就会变成破洞或非流形边。切片软件遇到非流形边轻则自动修复重则直接拒绝。所以我的习惯是转 STL 之前先在 CAD 里跑一遍几何检查geometry check确认是有效实体valid solid再转。这一步在 FreeCAD 里叫检查几何体在 OCCT 里可以用BRepCheck_Analyzer。还有一个隐蔽的坑单位。STEP 文件内部带单位信息但 STL 不带。有些转换工具默认按 mm 输出有些按原始单位输出。如果你从 STEP 转 STL 后发现模型大了 25.4 倍别慌那是 inch 和 mm 的换算问题在切片软件里缩放一下就行但最好在转换时就统一到 mm避免后面混乱。3.2 STL 转 STEP为什么这条路基本走不通热词里有个sw中stl转stp说明很多人想反向操作。我必须直说STL 转 STEP 在严格意义上是不可能的因为 STL 丢失了曲面信息你无法从一堆三角形猜回原始的解析曲面。市面上所谓的 STL 转 STEP 工具做的其实是逆向重建把三角网格拟合成一堆小平面或 NURBS 曲面片生成一个看起来像的 B-rep。这种重建出来的 STEP质量参差不齐。简单规则形状比如一个方块重建效果还行但曲面多的模型重建后会出现大量碎面每个面都是独立的根本没法做后续的圆角、抽壳。所以如果你的目标是拿到可编辑的精确模型正确做法是回到源头重新生成而不是从 STL 逆向。这也是 text-to-cad 的一个隐藏优势它本来就能直接输出 STEP你根本不需要走 STL 逆向这条死路。如果实在只有 STL 又必须转我的建议是用网格修复 平面拟合的思路先用 MeshLab 或 Blender 清理网格去重顶点、补洞、平滑再用 FreeCAD 的从网格创建形状功能转成 B-rep最后手动重建关键特征。这个过程对复杂模型来说工作量可能比重新画还大要有心理准备。3.3 网格修复的实操顺序先诊断再动手拿到一个有问题的 STL很多人上来就点自动修复结果越修越乱。我踩过几次坑之后总结出一套顺序分享给你。第一步是诊断别急着改。用 MeshLab 打开看三个指标是不是水密closed、有没有非流形边non-manifold edges、有没有自相交self-intersection。MeshLab 的Select Non-Manifold Edges和Select Self Intersecting Faces能直接高亮问题区域。先看清楚问题在哪再决定怎么修。第二步是去重和合并顶点。很多 STL 的破面其实是顶点没合并导致的两个本该重合的顶点差了 0.001mm就变成了一条缝。MeshLab 的Remove Duplicate Vertices能解决大部分这类问题阈值一般设 0.001 到 0.01mm。第三步才是补洞。MeshLab 的Close Holes可以自动补但要注意补出来的面可能法向反了补完要检查一下。对于大洞自动补可能补出一堆乱七八糟的三角形这时候手动用Fill Hole逐个补更靠谱。第四步是重新网格化remeshing。如果原始网格三角形大小极不均匀可以用Uniform Mesh Resampling重采样让三角形大小一致这对后续仿真特别重要。但重采样会损失细节精度要求高的场景慎用。提示网格修复没有一键完美的方案任何自动修复都可能引入新问题。修完一定要重新诊断一遍确认水密性和流形性都过了再往下走。4. 跑通一条 text-to-cad 流程从输入文字到拿到可打印文件4.1 环境准备选对工具链能省一半时间要自己跑通一条 text-to-cad 流程工具链的选择很关键。我按解析—建模—导出—验证四段来说。解析层你需要一个能输出结构化结果的大语言模型接口。这里不展开具体平台重点是要求它输出 JSON 或脚本而不是自由文本。我一般会在 prompt 里给一个 schema 示例让它照着填这样解析成功率能到九成以上。建模层核心是参数化建模内核。最省事的方案是用 CadQuery它是基于 OCCT 的 Python 库写几行代码就能生成带圆角、孔、阵列的实体而且直接支持导出 STEP 和 STL。另一个选择是 OpenSCAD语法更简单但它的几何是 CSG构造实体几何风格曲面精度和布尔运算的鲁棒性不如 OCCT。如果你要的是可编辑的精确模型CadQuery 是更稳的选择。导出层CadQuery 自带exporters.export()一行代码出 STEP一行出 STL。GLB 稍微麻烦点需要先转成网格再用 trimesh 或 pygltflib 打包。我一般用 trimesh 做中转它读 STL、写 GLB 都很顺。验证层别跳过。至少要有一个几何有效性检查是不是有效实体和一个尺寸抽查包围盒尺寸对不对。我见过太多案例模型看着没问题一量包围盒发现大了十倍就是单位没对齐。4.2 一个完整案例用文字生成一个带安装孔的支架我拿一个真实跑过的例子来讲。需求描述是生成一个 L 形支架底板 60x40x5mm立板高 40mm、厚 5mm底板四角各有一个直径 4mm 的安装孔孔中心距边缘 8mm所有外角倒 R3 圆角。第一步解析成参数。我让模型输出这样的结构{ type: L_bracket, base: {length: 60, width: 40, thickness: 5}, upright: {height: 40, thickness: 5}, holes: {diameter: 4, count: 4, edge_offset: 8, position: base_corners}, fillets: {radius: 3, target: outer_edges}, unit: mm }第二步把参数翻译成 CadQuery 脚本。核心逻辑是先画底板草图拉伸再画立板拉伸两者做并集然后在底板上打四个孔最后对指定边倒圆角。这里有个细节倒圆角的边要精确选取不能笼统地说所有边否则立板和底板的交线也会被倒角形状就变了。CadQuery 里用选择器selector按方向、位置筛选边比如选所有 Z 方向的外边。第三步导出。STEP 直接出STL 用 0.05mm 弦高偏差出。导出后我用 trimesh 读回来检查is_watertight是不是 True包围盒是不是 60x40x45底板 40 宽 立板高 40总高是 54045。第四步验证。把 STL 丢进切片软件看第一层切片轮廓对不对孔的位置对不对。这一步能抓出很多看着对其实错的问题比如孔打穿了立板、圆角把孔吃掉了。整个流程跑下来从输入文字到拿到可打印 STL熟练之后五分钟以内。对比手动画省的时间主要在两块一是草图约束不用自己标二是倒角和打孔这些重复操作自动完成。4.3 批量生成参数化模板才是效率放大器单次生成只是入门text-to-cad 真正的威力在批量。热词里有python批量对cad修改说明这个需求很普遍。我的做法是把上面那个支架脚本改造成参数化函数尺寸、孔位、圆角半径都做成变量然后用一个循环批量生成不同规格。比如我要生成 20 个不同长度的支架去跑仿真就写一个循环每次改base.length的值重新生成 STEP 和 STL按尺寸命名存盘。整个过程无人值守跑完直接进仿真批处理。这种场景下text-to-cad 的价值不是生成一个模型而是生成一套参数化模型族。这里有个经验批量生成一定要做异常捕获和日志。某个尺寸组合可能导致布尔运算失败比如孔太大把壁打穿了如果不捕获整个批次会中断。我一般用 try-except 包住单个生成失败的记录到日志里成功的继续最后统一看哪些失败了、为什么失败。5. 精度、可编辑性与常见故障的排查思路5.1 生成模型看着对但尺寸不对单位与坐标系排查这是最高频的问题。模型形状没问题但一量尺寸差了一个数量级或者位置偏了。九成情况是单位或坐标系原点的问题。单位问题前面提过STEP 带单位、STL 不带。但还有一个更隐蔽的建模内核的默认单位。OCCT 内部用的是单位无关的数值但很多封装库默认按 mm 处理。如果你从某个库拿到的是 inch 数值直接喂给按 mm 处理的库就会差 25.4 倍。排查方法很简单生成一个已知尺寸的方块比如 10x10x10量一下包围盒看是不是 10。不是的话先解决单位再往下做。坐标系问题也很常见。有些生成逻辑默认把模型放在第一象限有些放在原点中心。如果你后续要做装配或者按位置打孔原点不一致会导致整体偏移。我的习惯是在生成脚本里显式声明原点位置比如底板左下角在原点这样每次生成的位置都可预期。5.2 布尔运算失败几何内核的脾气与规避方法布尔运算并集、差集、交集是参数化建模的核心操作也是最容易失败的地方。OCCT 的布尔运算在遇到面重合边重合微小间隙时经常直接抛异常或者产生无效结果。我总结了几条规避经验。第一避免完全共面。两个实体如果有一个面完全贴合布尔运算容易出问题。解决办法是让它们稍微重叠一点比如立板底部往下延伸 0.1mm 插进底板而不是刚好贴着。第二避免微小特征。小于 0.01mm 的边、面、间隙内核处理起来很吃力能合并就合并。第三运算顺序有讲究。先做大的布尔再做小的先并集后差集通常比反过来稳。如果布尔还是失败可以试试降级处理把精确 B-rep 转成网格做布尔虽然精度损失但鲁棒性高很多。或者用模糊布尔fuzzy boolean给一个容差让内核忽略微小误差。OCCT 的BRepAlgoAPI系列支持设置 fuzzy 值一般设 1e-5 到 1e-4 能救回不少失败案例。5.3 从 STEP 到 GLB 的面数爆炸渲染优化怎么做STEP 转 GLB 时如果弦高偏差设得太小三角形数量会爆炸GLB 文件几十兆网页加载卡死。这时候需要网格简化decimation。我的做法是分两步先用适中的偏差比如 0.1mm转出网格再用 trimesh 或 MeshLab 做二次简化把面数压到目标值。简化算法推荐二次误差度量QEM它在减少面数的同时能较好地保持形状。目标面数看用途网页预览一般 5 万到 20 万面够用游戏引擎可能要求更低。但要注意简化会破坏水密性如果这个 GLB 还要用于打印或仿真就不能简化。所以我的原则是渲染用的 GLB 和打印用的 STL 分开生成各用各的参数不要指望一个文件通吃。故障现象最可能原因排查动作解决方向尺寸差 25.4 倍单位 inch/mm 混淆量已知尺寸方块统一到 mm模型整体偏移坐标系原点不一致检查包围盒最小值显式声明原点布尔运算报错共面/微小间隙检查重合面加重叠量或模糊布尔STL 打印破面非水密/非流形MeshLab 诊断去重顶点补洞GLB 加载卡顿面数过多统计三角形数网格简化6. 我对 text-to-cad 落地的一些真实判断跑了一段时间之后我对这个方向的判断比一开始冷静了很多。它确实能加速但加速的前提是你把参数化模板搭好了。如果每次都靠自然语言从零解析遇到复杂形状照样翻车因为 LLM 对空间关系的理解还是弱你说在斜面上打一个垂直于斜面的孔它很可能给你打成竖直的。所以我的实际用法是把 text-to-cad 当成参数填充器而不是从零创造器。我先手写好一个参数化模板比如支架、法兰、外壳把可变尺寸暴露成参数然后用自然语言去填这些参数。这样既享受了文字输入的便捷又保证了几何的可靠性。纯靠文字生成复杂模型目前还不到能放心用的程度。另一个体会是格式选择要前置。别等模型生成完了才想我要导出成什么而是在设计流程时就想清楚下游是谁。要改就 STEP要打印就 STL要展示就 GLB三条路从生成参数开始就该有区别比如打印用的模型要保证水密展示用的可以适当简化。把这些想在前头能省掉大量返工。最后说个容易被忽略的点版本管理。text-to-cad 生成的模型最好连同生成它的参数和脚本一起存。因为三个月后你想改一个尺寸如果只有 STL基本等于重做如果有参数和脚本改一个数字重新生成就行。我现在每个项目都建一个文件夹里面放params.json、generate.py和导出的模型三者版本对齐回头改起来非常顺。这个习惯看起来麻烦但用过一次就知道值。