
1. 从一段话到三维模型text-to-cad 到底在解决什么问题第一次听到 text-to-cad 这个词很多人脑子里浮现的画面大概是对着电脑敲一句给我画一个法兰盘然后屏幕上就自动长出一个三维模型。这个想象不算离谱但也不完全准确。text-to-cad 的本质是把自然语言描述转换成CAD 可识别的几何数据最终落地成 STEP、GLB、STL 这类标准格式文件。它解决的核心痛点很朴素——传统 CAD 建模需要人手动拉伸、旋转、布尔运算一个中等复杂度的零件可能耗掉半小时到几小时而 text-to-cad 想做的事情是把这个过程压缩到几秒钟。我接触这个方向有一段时间了最初是因为手上有一批参数化零件要反复改尺寸每次改都要重新点一遍特征树烦得不行。后来开始琢磨能不能用脚本大模型的方式把描述直接变成模型。实测下来这条路是通的但坑比想象中多。这篇文章就把我踩过的坑、验证过的方案、以及目前 text-to-cad 真实的能力边界完整地摊开讲一遍。适合谁看如果你是会一点 Python、懂基本三维几何概念、想批量生成模型或者做参数化设计的工程师这篇能直接抄作业。如果你是完全零基础的小白也能看懂原理部分知道这东西能干什么、不能干什么。关键词里出现的 STEP、GLB、STL 是三种最常见的输出格式后面会专门讲它们各自的适用场景和转换时的坑。先说结论text-to-cad 目前不是一句话生成任意复杂模型的魔法它最擅长的是规则明确、参数可枚举的零件比如支架、法兰、齿轮毛坯、简单外壳。对于曲面复杂、拓扑随意的造型它还很吃力。理解这个边界比盲目吹捧或全盘否定都重要。2. 三种输出格式的取舍STEP、GLB、STL 到底该选哪个做 text-to-cad第一个绕不开的问题就是生成的模型存成什么格式很多人随手就存 STL结果后面要做装配、要改尺寸、要导入别的 CAD 软件时发现处处受限。这三种格式的差异直接决定了你后续的工作流能不能跑通。2.1 STEP参数化 CAD 的通用语言STEP.step / .stp是 ISO 10303 标准下的产品数据交换格式它的核心价值在于保留 B-rep边界表示几何。什么意思就是它存的不只是表面一堆三角形而是这是一个圆柱面半径 5mm轴线沿 Z 方向这种带语义的几何信息。所以 STEP 文件导入 SolidWorks、中望 CAD、FreeCAD 之后你还能选中那个圆柱面、改它的半径、在它上面打孔。text-to-cad 如果目标是生成可继续编辑的零件STEP 是首选。我实测下来用 CadQuery 或 build123d 这类基于 OpenCASCADE 内核的库生成模型导出 STEP 几乎是无损的。但要注意一个坑不同 CAD 软件对 STEP 的解析宽容度不一样。同一个 STEP 文件FreeCAD 打开正常某些老版本软件可能报曲面丢失。原因是 STEP 有 AP203、AP214、AP242 等多个应用协议版本导出时最好显式指定 AP242兼容性最广。# CadQuery 导出 STEP 的典型写法 import cadquery as cq result cq.Workplane(XY).circle(10).extrude(5) cq.exporters.export(result, flange.step, exportTypeSTEP)2.2 STL3D 打印的老朋友但别拿它做设计STL.stl只存三角面片没有单位、没有颜色、没有曲面语义就是一堆三角形的顶点坐标。它的优点是几乎所有 3D 打印切片软件、网格处理工具都认缺点是不可参数化编辑。你把 STL 导入 CAD 软件得到的是一个网格体想改个孔径对不起只能重新建模。热搜词里有个sw中stl转stp这其实是个很典型的痛点。SolidWorks 从 2019 版之后有了网格转实体的功能但转换质量取决于 STL 的精度。如果 STL 面片太粗转出来的实体全是碎面根本没法用。我的经验是如果最终目的是 CAD 编辑一开始就别生成 STL直接生成 STEP。STL 只适合最终交付给 3D 打印或渲染。2.3 GLB网页展示和轻量可视化的最优解GLB 是 glTF 的二进制版本专为实时渲染设计。它体积小、加载快、支持材质和动画浏览器里用 Three.js 或 model-viewer 直接就能显示。text-to-cad 如果要做在线预览GLB 是最合适的。热搜词里qopengl 加载 stl和qt5.15.2 读取 stl 模拟六轴机械臂反映的是另一条路——用 OpenGL 直接渲染 STL但这条路工作量大、效果还不如直接用 GLB 现成渲染库。三种格式的对比我整理成表格方便你按场景选格式几何类型可参数化编辑典型用途转换注意点STEPB-rep 实体是CAD 设计、装配、工程图优先 AP242注意单位STL三角网格否3D 打印、网格分析精度靠弦高控制GLB三角网格材质否网页预览、AR/VR面数控制否则卡顿提示如果你的 text-to-cad 流水线要同时服务设计和展示两个环节正确做法是先生成 STEP 作为主数据再从 STEP 派生出 STL 和 GLB而不是反过来。主数据一旦是网格就再也回不去参数化了。3. 把一句话变成几何text-to-cad 的核心技术链路拆解理解了输出格式接下来要搞清楚从文字到模型中间到底发生了什么。这条链路不是单一模型能搞定的它至少包含四个环节意图解析、参数抽取、几何生成、格式导出。每个环节都有各自的坑。3.1 意图解析大模型在这里扮演什么角色自然语言是模糊的。做一个 50 毫米见方的板子四角打 5 毫米的孔——这句话里板子隐含了厚度用户没说四角隐含了孔的位置规则5 毫米是直径还是半径大模型的价值就在于把这些隐含信息补全成结构化参数。我的做法是让大模型输出一段 JSON而不是直接输出代码。比如上面那句话模型应该输出{ shape: plate, length: 50, width: 50, thickness: 5, holes: { count: 4, diameter: 5, position: corners, inset: 5 } }为什么不让模型直接写 CadQuery 代码因为代码一旦出错调试成本极高而 JSON 参数错了你一眼就能看出来。中间加一层结构化参数等于给自己留了一个可校验、可修改的缓冲带。这是我踩过坑之后的血泪教训——早期我让模型直接生成 Python 代码结果它经常把circle和rect搞混或者单位写成米排查半天。3.2 参数抽取的边界处理缺省值怎么定用户不会把所有参数都说完。厚度没说怎么办孔的位置没说清楚怎么办这时候需要一套缺省值策略。我的经验是缺省值不能随便拍脑袋要参考行业惯例。比如钣金件厚度常用 1mm、1.5mm、2mm塑料外壳常用 2mm、3mm机械加工件可以到 5mm 以上。如果用户没说按最保守、最容易加工的值给并在输出时明确告知用户用了什么缺省值。这一步很多人忽略结果生成的模型尺寸离谱用户还得手动改。更好的做法是模型解析出参数后先做一次合理性校验比如孔径不能大于板宽、厚度不能为负、孔间距不能小于孔径。校验不通过就反问用户而不是硬生成一个错误模型。3.3 几何生成CadQuery、build123d 还是 OpenSCAD几何生成这一层工具选型直接决定你的开发效率。我对比过三个主流方案OpenSCAD基于脚本的 CSG构造实体几何语法简单但它是先描述再渲染没有交互式几何内核导出 STEP 需要额外转换且对复杂曲面支持弱。CadQuery基于 OpenCASCADEPython 语法能直接导出 STEP社区活跃文档齐全。缺点是 API 有点绕链式调用写长了容易晕。build123dCadQuery 的精神续作API 更 Pythonic支持上下文管理器写法可读性更好。缺点是相对新资料少一些。我现在的默认选择是build123d因为它的代码可读性明显更好团队协作时别人更容易看懂。但如果你的项目已经用了 CadQuery没必要迁移两者底层都是 OCCT能力相当。# build123d 生成带孔法兰的示例 from build123d import * with BuildPart() as flange: Cylinder(radius40, height10) with Locations((0, 0, 5)): Cylinder(radius15, height10, modeMode.SUBTRACT) with PolarLocations(radius30, count6): Hole(radius3) export_step(flange.part, flange.step)3.4 格式导出与后处理单位、精度、坐标系导出这一步看似简单实则暗藏杀机。最常见的三个坑第一单位问题。OCCT 内核默认单位是毫米但有些库导出时会当成米导致模型放大 1000 倍。导入 CAD 软件一看零件比房子还大。解决办法是导出后立刻用软件检查包围盒尺寸。第二精度问题。导出 STL 时需要指定弦高linear deflection和角度偏差angular deflection。弦高设太大圆柱变成多边形设太小文件巨大。我的经验值是弦高 0.01mm、角度 0.1 弧度兼顾质量和体积。第三坐标系问题。不同 CAD 软件对上方向的定义不一样有的 Z 向上有的 Y 向上。导出 GLB 时尤其要注意因为 glTF 标准是 Y 向上而 CAD 通常是 Z 向上中间需要一次旋转。4. 实战搭一条能跑通的 text-to-cad 流水线理论讲完了这一节直接上可复现的方案。我会给出完整的代码骨架你照着改改就能用。整条流水线分四步环境准备、参数解析、几何生成、导出与校验。4.1 环境准备依赖装不对后面全白费Python 环境建议 3.10 以上因为 build123d 和较新的 OCCT 绑定对版本有要求。核心依赖就三个pip install build123d openai pydanticbuild123d负责几何openai负责调用大模型做意图解析你也可以换成任何兼容接口的模型pydantic负责参数校验。注意OCCT 的二进制包在 Windows 上偶尔会有 DLL 冲突如果导入 build123d 报错先检查是不是装了多个版本的 OCCT。我遇到过装完 CadQuery 再装 build123d 导致冲突的情况解决办法是建一个干净的虚拟环境。注意热搜词里cad安装一直出现c2005错误这类问题本质是运行库缺失。虽然那是桌面 CAD 软件的坑但 Python 这边调用 OCCT 也可能因为 VC 运行库不全而失败。装一个完整的 Visual C Redistributable 能省很多事。4.2 参数解析模块让大模型输出可校验的结构这一步的关键是用 Pydantic 定义 schema强制模型输出符合结构的数据。不要相信模型会自觉输出正确 JSON一定要做校验。from pydantic import BaseModel, Field, field_validator class HoleSpec(BaseModel): count: int Field(ge1, le100) diameter: float Field(gt0) position: str corners inset: float Field(default5, ge0) class PlateSpec(BaseModel): length: float Field(gt0) width: float Field(gt0) thickness: float Field(default3, gt0) holes: HoleSpec | None None field_validator(thickness) classmethod def check_thickness(cls, v): if v 50: raise ValueError(厚度超过 50mm请确认单位是否为毫米) return v校验器里加一条厚度超过 50mm 就报错能拦住大部分单位错误。这个思路来自我一次真实的翻车用户说厚度 0.05模型理解成 0.05 米生成了一块 50mm 厚的板完全不是想要的钣金件。4.3 几何生成模块从参数到实体的映射逻辑拿到校验过的参数后几何生成就是纯机械的映射工作。核心是把语义翻译成操作序列。比如四角打孔翻译成计算四个角点坐标在每个点做布尔减运算。from build123d import * def build_plate(spec: PlateSpec): with BuildPart() as plate: Box(spec.length, spec.width, spec.thickness) if spec.holes: inset spec.holes.inset r spec.holes.diameter / 2 corners [ (inset, inset), (spec.length - inset, inset), (inset, spec.width - inset), (spec.length - inset, spec.width - inset), ] with Locations(*[(x, y, 0) for x, y in corners]): Hole(radiusr) return plate.part这段代码里有个细节值得说Hole操作默认是沿 Z 轴贯穿的所以不需要手动指定深度。但如果你用的是CylinderMode.SUBTRACT就必须保证圆柱高度大于板厚否则打不穿。我早期就犯过这个错圆柱高度设成和板厚一样结果因为浮点误差孔底留了一层薄膜。4.4 导出与自动校验别让错误模型流到下游生成完模型导出之前一定要做自动校验。校验什么至少三项包围盒尺寸是否符合预期、体积是否为正、面数是否在合理范围。def validate_and_export(part, spec, path): bbox part.bounding_box() size bbox.size assert abs(size.X - spec.length) 0.1, 长度不符 assert abs(size.Y - spec.width) 0.1, 宽度不符 assert part.volume 0, 体积异常 export_step(part, path)这个校验步骤看起来多余但它救过我很多次。有一次模型把孔打在了板子外面包围盒尺寸是对的但体积明显偏小校验直接拦下来了。如果没有这一步错误模型流到下游 3D 打印浪费的是时间和材料。5. 那些文档不会告诉你的坑text-to-cad 实操避雷清单前面讲的是怎么做对这一节讲哪里容易做错。这些都是我在实际项目里真金白银踩出来的网上教程基本不会提。5.1 大模型的几何幻觉它以为它懂了大模型对几何的理解是统计性的不是精确的。你让它生成一个渐开线齿轮它可能给你一个看起来像齿轮但齿形完全错误的东西。原因是渐开线涉及复杂的数学公式模型没见过足够多的精确样本只能猜。应对策略对于有严格数学定义的形状不要让模型生成几何而是让模型识别出这是齿轮然后调用你预先写好的齿轮生成函数。把模型的能力限制在意图识别和参数抽取几何计算交给确定性代码。这个分工是我目前认为最稳的架构。5.2 布尔运算失败OCCT 的经典脾气OpenCASCADE 的布尔运算尤其是减运算在某些情况下会失败报BRepAlgoAPI相关错误。常见触发条件两个面恰好共面、切点相切、微小特征。比如你在一个圆柱面上打一个直径极小的孔或者两个实体刚好贴在一起。解决办法有几个一是给操作加一点容差比如孔的位置偏移 0.001mm避免共面二是调整操作顺序先做大的布尔运算再做小的三是用clean()清理几何去掉冗余边和面。我现在的习惯是每次布尔运算后都调一次clean()能减少很多莫名其妙的失败。5.3 单位与坐标系的隐形陷阱前面提过单位问题这里再强调一个坐标系陷阱GLB 导出时的 Y-up 转换。如果你的模型在 CAD 里是 Z 向上直接导出 GLB 后在网页里看会是躺着的。正确做法是导出前绕 X 轴旋转 -90 度。from build123d import Rot glb_ready Rot(-90, 0, 0) * part这个坑我踩了两次才记住。第一次以为是渲染库的问题查了半天 Three.js 文档最后发现是坐标系没转。5.4 面数爆炸GLB 在浏览器里卡成 PPTSTL 和 GLB 都是网格格式面数直接决定文件大小和渲染性能。一个带螺纹的零件如果按高精度导出面数轻松上百万浏览器直接卡死。解决办法是分级导出预览用的 GLB 用低精度弦高 0.1mm交付用的 STL 用高精度弦高 0.01mm。用途弦高角度偏差预估面数网页预览0.1mm0.5 rad1-5 万一般 3D 打印0.02mm0.2 rad10-50 万精细交付0.005mm0.1 rad50 万以上提示热搜词里3dsmax2012修复stl模型的uv反映的是另一个层面的问题——STL 本身不带 UV导入 3ds Max 后需要重新展 UV 才能贴图。如果你的 text-to-cad 流水线最终要进渲染管线建议直接输出 GLB自带 UV 和材质跳过 STL 这一步。6. 从单件到批量text-to-cad 在参数化设计中的真实价值单件生成只是玩具text-to-cad 真正的价值在于批量参数化。热搜词里python批量对cad修改说的就是这个场景。我手上有个项目需要生成 200 多个不同尺寸的支架如果手动建模一个人得干一周。用 text-to-cad 流水线改一个参数表半小时全部生成完毕。6.1 参数表驱动把设计意图变成数据核心思路是把设计和实例分离。设计是一段固定的几何生成代码实例是一张参数表CSV 或 Excel。每一行参数喂给生成函数就产出一个模型。import csv from build123d import export_step with open(brackets.csv) as f: for row in csv.DictReader(f): spec PlateSpec(**{k: float(v) for k, v in row.items() if v}) part build_plate(spec) export_step(part, foutput/bracket_{row[id]}.step)这种模式的好处是可追溯、可复现。参数表就是设计文档谁改了哪个尺寸一目了然。比在 CAD 软件里手动改特征树靠谱得多。6.2 批量生成中的命名与版本管理批量生成最容易乱的是文件命名。我的规范是{项目}_{零件类型}_{关键尺寸}_{版本}.step比如fixture_plate_50x50x5_v2.step。关键尺寸写进文件名不用打开就知道是什么。版本号必须有因为参数改了之后旧模型可能还要留着对比。另外生成日志一定要留。每次批量生成把参数、时间、成功/失败状态写进一个 log 文件。有一次我生成了 300 个模型其中 12 个因为参数越界失败了如果没有日志根本不知道是哪 12 个。6.3 和现有 CAD 工作流的衔接text-to-cad 生成的 STEP 文件最终还是要进 CAD 软件做装配、出工程图。这里有个衔接技巧在生成时就规划好装配基准。比如所有零件都以原点为底面中心导入装配体后直接按坐标放置不用手动对齐。热搜词里cad图纸合并和cad导入layout步骤详解反映的是下游环节的需求。我的建议是text-to-cad 负责零件级生成装配和工程图还是交给专业 CAD 软件。不要试图用脚本搞定一切那样维护成本太高。7. 我对 text-to-cad 现状的一点个人判断折腾了这么久我对 text-to-cad 的定位越来越清晰它现在是一个高效的参数化零件生成器而不是通用的三维建模替代品。它的甜区是那些规则明确、参数可枚举、批量需求大的场景——支架、法兰、垫片、简单外壳、标准件。在这些场景里它的效率是手动建模的几十倍。但如果你要做一个有机曲面造型、一个复杂的自由曲面外壳text-to-cad 目前还帮不上忙。大模型对复杂拓扑的理解还不够精确生成的几何经常需要大量人工修补反而更慢。我个人的做法是混合工作流能用参数化搞定的零件全部走 text-to-cad 流水线搞不定的老老实实打开 CAD 软件手动建模。两条路并行各取所长。工具是拿来用的不是拿来信仰的。最后分享一个我最近发现的小技巧如果你要生成的零件有对称性在参数解析阶段就让模型识别出对称这个属性然后在几何生成时只建一半再镜像。这样不仅代码更简洁生成的模型质量也更高因为对称约束是强制的不会出现左右不对称的尴尬情况。这个思路来自机械设计里的对称原则搬到代码里同样适用。