
1. 从一段文字到三维模型text-to-cad 到底在解决什么问题第一次听到 text-to-cad 这个词很多人会下意识觉得它离自己很远——毕竟 CAD 在大多数人的印象里是工程师坐在电脑前用鼠标一个点一个点画出来的。但如果你最近关注过三维建模圈子就会发现一个明显的变化越来越多的工具开始支持“用一句话生成模型”。你输入“一个边长 50 毫米、带四个 M6 沉头孔的方形法兰盘”它就能吐出一个可以继续编辑的实体模型。这就是 text-to-cad 最朴素的定义把自然语言描述转换成计算机辅助设计模型。它解决的核心痛点其实很具体。传统 CAD 建模流程里从需求到模型中间隔着一层“翻译”——设计师脑子里想的是功能需求手上做的是草图约束、拉伸、倒角、阵列。这个翻译过程既耗时又容易出错尤其是做系列化零件、标准件、参数化结构的时候大量时间花在重复的点击上。text-to-cad 想做的就是把这层翻译自动化让“描述”直接变成“几何”。适合关注这个方向的人有三类。第一类是机械、建筑、工业设计领域的从业者手头有大量参数化建模需求想找提效手段第二类是软件开发者想把 CAD 生成能力集成到自己的产品里比如做定制化零件电商、做工程报价系统第三类是三维打印和创客玩家手里有 STL、GLB 这类格式的处理需求希望从文字直接得到可打印的模型。不管你属于哪一类理解 text-to-cad 的完整链路——从文本解析到几何生成再到 STEP、GLB、STL 这些格式的导出——都是绕不开的基本功。需要先说明一点text-to-cad 目前并不是“万能画图机”。它对描述的结构化程度要求很高模糊的、带审美判断的需求比如“好看一点的椅子”它处理不了但参数明确、拓扑清晰的结构件它已经能做得相当靠谱。下面我会把整条链路拆开讲清楚每一步在干什么、为什么这么干、实际落地时会遇到什么。2. 文本进、几何出text-to-cad 的完整技术链路拆解2.1 自然语言到结构化参数的转换层text-to-cad 的第一步是把人话变成机器能算的参数。这一步听起来简单实际上是最容易翻车的地方。比如你说“一个 100x60x10 的板子四角打直径 8 的孔”人一听就懂但机器需要把它拆成基体是一个长方体尺寸参数是长 100、宽 60、高 10特征是四个圆柱形孔直径 8位置在四个角通常还要推断出孔心距边缘的距离。这一层通常靠大语言模型或者专门的语义解析器来完成。它的输出不是几何而是一份结构化的中间表示常见的形式是 JSON 或者类似 OpenSCAD 的脚本。我实测下来描述里只要包含明确的数值和方位词长宽高、直径、间距、阵列数量解析准确率就很高一旦出现“差不多”“稍微大一点”这种模糊词结果就不可控了。所以如果你要自己搭这套流程第一件事是定义一套描述规范把可接受的词汇和参数格式固定下来。这里有个经验数值一定要带单位。我见过太多因为“10”到底是 10 毫米还是 10 厘米而生成错误尺寸的案例。在解析层做单位归一化把所有长度统一到毫米是最稳妥的做法。2.2 参数化几何内核的生成逻辑拿到结构化参数之后就需要一个几何内核来真正“造”出模型。这一步是整个 text-to-cad 的技术核心。常见的做法有两类一类是基于 OpenSCAD 这类脚本化建模工具用代码描述布尔运算并集、差集、交集来组合基本体另一类是基于 OpenCASCADE 这类专业几何内核直接构造 B-rep边界表示实体。为什么这个选择很关键因为它直接决定了你最终能导出什么格式。OpenSCAD 走的是网格路线导出 STL 很自然但要做精确的 STEP 就比较勉强OpenCASCADE 走的是精确实体路线STEP 是它的原生输出转成 STL 或 GLB 只是做一次网格化tessellation。如果你做的场景需要后续在专业 CAD 软件里继续编辑那必须走精确实体路线如果只是三维打印网格路线就够用。我个人的建议是只要你的目标里出现了 STEP 这个词就老老实实上 OpenCASCADE 或者它的 Python 绑定。用网格工具硬转 STEP得到的往往是一堆碎面后续根本没法做圆角、抽壳这些操作。2.3 从实体到 STEP、GLB、STL 的格式导出差异模型生成出来只是半成品真正交付要看格式。这三种格式的定位完全不同搞混了会吃大亏。格式本质典型用途是否可继续编辑STEP精确边界表示实体专业 CAD 交换、后续加工可以保留完整特征GLB三角网格 材质网页展示、AR/VR不可仅几何外观STL纯三角网格三维打印、切片不可无材质无单位STEP 是工业界的通用交换格式它记录的是数学曲面不是三角形。GLB 是 glTF 的二进制版本适合在浏览器里用 WebGL 渲染带材质和颜色。STL 最古老也最简单只有三角形面片连单位都没有很多切片软件默认按毫米处理但如果你导出的模型单位是米打出来就会小得看不见。实操中我一般这样处理生成实体后先存一份 STEP 作为“母版”然后根据用途分别导出 GLB 和 STL。导出 STL 时一定要控制网格精度精度太高文件巨大精度太低曲面变成多边形。通常弦高公差设成 0.05 到 0.1 毫米角度公差设成 15 度左右是个比较平衡的值。3. 自己动手搭一条最小可用的 text-to-cad 流水线3.1 环境准备与依赖选择要复现一条能跑的流水线你需要三样东西一个能解析文本的模型接口、一个几何内核、一个格式转换工具。我推荐的技术栈是 Python CadQuery它底层就是 OpenCASCADE 一个通用的大语言模型接口。CadQuery 的好处是它本身就是“代码即模型”和 text-to-cad 的思路天然契合而且原生支持 STEP 和 STL 导出。安装上CadQuery 用 conda 装最省心pip 装有时候会因为 OpenCASCADE 的二进制依赖出问题。如果你在 Windows 上遇到 C 运行库报错多半是缺了对应的可再发行组件包装上就好。这一点和很多人装 CAD 软件时遇到的运行库问题是一个道理。3.2 把一句描述变成可执行脚本假设用户输入“生成一个外径 80、内径 40、厚度 12 的圆环沿圆周均匀分布 6 个直径 6 的通孔孔心圆直径 60。”解析层要输出的是这样一份结构{ base: {type: ring, outer_d: 80, inner_d: 40, thickness: 12}, features: [ {type: hole, diameter: 6, count: 6, pattern: circular, pcd: 60} ] }然后一个模板引擎把它翻译成 CadQuery 代码import cadquery as cq result ( cq.Workplane(XY) .circle(40) .circle(20) .extrude(12) .faces(Z) .workplane() .polarArray(30, 0, 360, 6) .hole(6) )注意这里 circle(40) 是外半径circle(20) 是内半径因为 CadQuery 的 circle 接收的是半径。这种细节如果解析层没处理好生成的就是错模型。所以模板里的参数映射必须反复验证。3.3 导出与验证别跳过这一步生成完实体导出代码很简单cq.exporters.export(result, part.step) cq.exporters.export(result, part.stl, tolerance0.05, angularTolerance0.1)但导出之后一定要验证。我的习惯是STEP 用 FreeCAD 打开看一眼特征树是否干净STL 丢进切片软件看尺寸对不对。曾经有一次我导出的模型在切片软件里显示尺寸只有实际的十分之一排查半天发现是单位在某一层被当成了厘米。这种坑不验证根本发现不了。提示每次改动解析规则或模板后都拿一组固定的测试描述跑一遍回归对比导出模型的包围盒尺寸。这是保证流水线稳定的最低成本手段。4. 落地时最容易踩的五个坑与排查思路4.1 单位混乱导致的尺寸灾难这是出现频率最高的问题。文本里的“10”没有单位解析层默认按毫米几何内核按毫米但导出 STL 时某个环节按了厘米最后模型尺寸差十倍。排查方法很直接在流水线的每个环节打印模型的包围盒尺寸看哪一步开始数值变了。定位到之后统一在入口处做单位归一化后续所有环节只认毫米。4.2 布尔运算失败与几何自交当特征之间发生重叠或者孔的位置刚好落在边缘上布尔差集可能失败生成空实体或者报错。这类问题的根源往往是参数本身不合理比如孔心圆直径 60、孔径 6、外径 80孔的外缘到了 63离外径 80 还有余量没问题但如果外径改成 65孔就会切穿外壁。我的处理方式是在生成前加一层几何合理性校验检查特征是否超出基体边界提前拦截而不是等内核报错。4.3 网格精度与文件体积的平衡导出 STL 时精度设太高一个简单零件能到几十兆网页加载卡死设太低圆柱变成六边形。前面提到的弦高 0.05、角度 15 度是个起点具体还要看零件尺寸。大零件可以适当放宽小零件要收紧。GLB 导出时还要注意是否压缩Draco 压缩能显著减小体积但需要加载端支持解码。4.4 复杂曲面的描述能力边界text-to-cad 目前对规则几何体很擅长但遇到自由曲面、有机形状就力不从心。你没法用一句话描述一个汽车覆盖件的曲面。这不是解析层的问题而是几何生成本身的难度。实际项目中我的做法是把 text-to-cad 定位在“规则结构件快速生成”上复杂曲面还是交给传统建模两者配合使用。4.5 导出格式与下游软件的兼容性STEP 有 AP203、AP214、AP242 等不同协议版本老版本 CAD 软件可能读不了新协议。STL 有二进制和 ASCII 两种ASCII 可读但体积大。GLB 的材质在不同渲染器里表现可能不一致。这些兼容性问题没有万能解只能针对你的目标下游软件做定向测试。我一般会准备一份“格式兼容性清单”记录每种导出格式在常用软件里的实测表现。5. 这套能力真正能用在哪些场景5.1 参数化标准件的批量生成这是最成熟的应用。螺栓、法兰、轴承座、型材连接件这些零件的拓扑结构固定只是尺寸变化。用 text-to-cad 批量生成比人工一个个画快得多。我做过一个测试生成 200 个不同规格的法兰从描述到导出 STEP全程自动化几分钟就跑完了人工画的话至少一整天。5.2 定制化产品的快速报价与预览做定制零件电商的场景里客户输入尺寸需求系统实时生成 GLB 在网页上展示同时给出基于体积和材料的报价。GLB 在这里的作用是可视化STEP 则留给后续生产。这条链路打通之后客户体验和转化率都会有明显提升。5.3 三维打印前的模型准备很多人手里只有文字描述的需求或者从别处拿到的模型需要修改。text-to-cad 可以快速生成可打印的 STL省去建模步骤。配合切片软件从一句话到可打印文件整个流程能压缩到几分钟。5.4 与现有 CAD 工作流的衔接text-to-cad 不是要取代 CAD 软件而是做前置。生成的 STEP 导入到专业软件里继续做装配、出工程图、做仿真这才是完整的工业流程。把 text-to-cad 当成一个“智能草图生成器”定位就对了。6. 关于格式转换和工具链的一些实操心得STEP 转 STL 这件事很多人以为随便找个在线工具就行但实际做工程的时候在线工具往往不可靠要么精度不可控要么有文件大小限制。本地用 CadQuery 或者 FreeCAD 的命令行模式做转换参数可控还能批量处理。FreeCAD 的 Python 接口做 STEP 到 STL 的转换很稳适合集成到自动化脚本里。GLB 的生成要注意坐标系。glTF 用的是 Y 轴向上而大多数 CAD 用的是 Z 轴向上。导出 GLB 时如果不做坐标变换模型在网页里就是躺着的。这个坑我踩过排查了半天才发现是坐标系约定不同。解决办法是在导出前对模型做一次旋转或者在前端渲染时调整相机。STL 文件的修复也是个常见需求。有时候拿到的 STL 有破面、法线反向直接打印会出问题。这类修复可以用 MeshLab 或者 trimesh 这类库来做自动补洞、统一法线方向。如果你的流水线里包含“接收外部 STL 再处理”的环节这一步不能省。最后说一个关于批量处理的技巧。当你需要生成大量模型时不要一个一个串行跑几何内核的初始化开销不小。用多进程并行每个进程独立初始化内核能显著提升吞吐。但要注意内存占用OpenCASCADE 的实体比较吃内存并行数别开太大一般按 CPU 核心数的一半来设比较稳妥。这套东西我前后折腾了大半年从最开始只能生成简单方块到现在能稳定输出带孔、带阵列、带倒角的结构件中间踩的坑基本都写在上面了。text-to-cad 这个方向还在快速演进但底层的几何逻辑和格式转换这些基本功是不会变的。把这条链路吃透不管上层工具怎么换你都能快速接上。