
1. 从一段文字到三维模型text-to-cad 到底在解决什么问题第一次听到 “text-to-cad” 这个说法很多人脑子里浮现的画面大概是对着电脑敲一句“给我画一个法兰盘”然后屏幕上就自动出现一个带螺栓孔的三维实体。这个想象不算离谱但也不完全准确。更贴近现实的理解是——用自然语言描述替代传统的手工建模操作由程序自动生成可用的 CAD 几何数据最终输出成 STEP、GLB、STL 这类通用格式。我在机械设计和三维建模这条线上摸爬滚打了不少年头从最早的 AutoCAD 二维图板到后来 SolidWorks、Fusion 360 参数化建模再到这两年开始接触程序化生成几何的思路最大的感受是建模这件事重复劳动的比例高得惊人。一个标准件库里的六角螺栓你可能这辈子画过几百次每次都是拉伸、倒角、切螺纹那一套。text-to-cad 的价值就在于把这些“有固定套路、有明确参数”的建模过程从手工操作变成一句话描述加一次生成。它适合谁三类人最应该关注。第一类是经常需要批量出图的结构工程师比如做非标设备的朋友一个项目里几十个支架、连接板尺寸不同但拓扑结构一样手工画到怀疑人生。第二类是做仿真和 3D 打印的开发者需要程序化地生成大量 STL 或 GLB 模型做测试数据。第三类是想把自己从重复建模里解放出来的设计师哪怕你只会一点 Python也能搭出一套自己的“文字转模型”流水线。需要先泼一盆冷水text-to-cad 不是“说人话就能出工程图”的魔法。它擅长的是参数明确、结构规整、有标准可循的零件比如法兰、齿轮毛坯、支架、外壳、管道接头。你让它生成一个造型复杂的汽车曲面目前还差得远。但如果你要的是“外径 80、内径 40、厚 10、带 6 个直径 8 的均布孔”这种描述它完全可以胜任。下面我会从整体设计思路、核心技术点、实操流程、踩坑经验四个维度把 text-to-cad 这套东西拆开讲透。不管你是想自己搭一套还是想理解市面上的工具在干什么都能找到能直接抄作业的内容。2. 整体设计思路为什么是“文本解析 参数化建模 多格式导出”2.1 核心架构的选型逻辑一套 text-to-cad 系统拆到最底层无非是三段式流水线自然语言输入 → 结构化参数 → 几何实体 → 目标格式文件。听起来简单但每一段的实现方式选择直接决定了这套东西好不好用、能不能落地。先说第一段文本到参数。这里有两种主流路线。一种是基于规则的正则/模板匹配另一种是基于大模型的语义解析。我实际用下来纯规则的方式在固定场景下非常稳比如你定义好“法兰盘”这个模板用户输入“DN50 法兰 16 公斤压力”正则一把就能把公称直径和压力等级抠出来。但一旦用户换个说法“我要一个能承受 16 公斤压力的 50 管径法兰”规则就抓瞎了。所以现在比较务实的做法是用大模型做语义理解和参数抽取用规则做校验和兜底。大模型负责把“人话”翻译成 JSON规则负责检查这个 JSON 里的参数是否在合理范围内。第二段参数到几何。这是整个系统里技术含量最高的部分。可选方案有三类直接调用 CAD 软件的 API比如 SolidWorks API、FreeCAD 的 Python 接口、使用几何内核库比如 OpenCASCADE、CGAL、用网格生成库比如 trimesh、numpy-stl。我的建议是如果你要输出 STEP 这种精确 B-rep 格式必须走 OpenCASCADE 或者 CAD 软件 API 这条路如果只需要 STL 或 GLB 这种网格格式trimesh 这类库就够用开发速度快很多。第三段几何到文件。STEP 是精确边界表示适合后续在 CAD 软件里继续编辑STL 是三角网格适合 3D 打印和快速预览GLB 是 glTF 的二进制版本适合网页端展示和 AR/VR 场景。同一个几何体导出成不同格式背后的数据结构和精度损失是完全不同的这一点后面会详细讲。2.2 为什么参数化建模是唯一可行的路径有人可能会想能不能直接用 AI 生成一个三维模型文件比如用某种三维扩散模型直接吐出一个 STL。这条路我试过结论是生成出来的东西看着像那么回事但尺寸全是错的孔位对不上平面不平根本没法用于工程。原因很简单三维模型和二维图片不一样。图片生成错一个像素肉眼看不出来三维模型错 0.1 毫米装配就装不进去。工程领域对精度的要求是刚性的而当前生成式模型在数值精度上完全不可控。所以 text-to-cad 的正确姿势是AI 只负责理解意图和抽取参数几何生成交给确定性的参数化建模代码。你告诉系统“外径 80、内径 40、厚 10”系统就精确地生成外径 80.000、内径 40.000、厚度 10.000 的圆柱体一个微米都不差。这才是工程上能用的东西。2.3 格式选择背后的工程考量STEP、GLB、STL 这三个格式热词里都出现了说明大家在实际工作中确实经常和它们打交道。我把它们的核心差异整理成一张表方便你根据场景选型。格式数据本质精度可编辑性典型用途文件体积STEPB-rep 精确边界表示精确数学曲面高可参数化编辑工程交付、CNC 加工中等STL三角网格近似有弦高误差低只能整体缩放3D 打印、快速预览较大GLB三角网格 材质近似可调精度低适合展示网页展示、AR/VR较小压缩后我踩过的一个坑是用 STL 转 STEP。热词里有个“sw中stl转stp”说明很多人有这个需求。但你要知道STL 转 STEP 本质上是从网格反推曲面这个过程叫“逆向工程”需要拟合平面、圆柱面、锥面精度损失很大而且复杂曲面基本没法完美还原。所以如果你的目标是得到可编辑的 STEP一开始就应该走精确建模的路线而不是先生成 STL 再转。3. 核心技术点拆解从一句话到三维实体的关键环节3.1 文本解析怎么让机器听懂“人话”文本解析这一步目标是把“一个外径 80 内径 40 厚 10 的法兰带 6 个直径 8 的孔”这样的句子变成下面这样的结构化数据{ part_type: flange, outer_diameter: 80.0, inner_diameter: 40.0, thickness: 10.0, holes: { count: 6, diameter: 8.0, pattern: circular, pcd: 60.0 }, unit: mm }用大模型做这件事提示词的设计非常关键。我的经验是不要指望模型一次就输出完美 JSON而是分两步走第一步让模型输出它理解到的参数列表第二步用代码校验并补全缺失项。比如用户没说孔所在的分度圆直径PCD系统应该根据外径和内径自动推算一个合理值或者明确提示用户补充。还有一个细节单位。工程上毫米和英寸混用是家常便饭如果用户说“3 寸法兰”你得知道这是 DN80 还是 3 英寸。我的做法是在解析阶段就强制统一到毫米并且在输出时明确标注单位避免后续装配时出现 25.4 倍的灾难性错误。3.2 几何生成参数化建模的代码实现几何生成这块我用 Python 加 CadQuery 比较多。CadQuery 是基于 OpenCASCADE 的 Python 库写起来很直观而且直接支持 STEP 和 STL 导出。下面是一个法兰生成的简化示例import cadquery as cq def make_flange(outer_d, inner_d, thickness, hole_count, hole_d, pcd): # 创建基础圆环体 flange ( cq.Workplane(XY) .circle(outer_d / 2) .circle(inner_d / 2) .extrude(thickness) ) # 在分度圆上打孔 if hole_count 0: flange ( flange.faces(Z) .workplane() .polarArray(pcd / 2, 0, 360, hole_count) .hole(hole_d) ) return flange # 生成并导出 result make_flange(80, 40, 10, 6, 8, 60) cq.exporters.export(result, flange.step) cq.exporters.export(result, flange.stl)这段代码里polarArray是环形阵列hole是打孔。CadQuery 的好处是几何操作是确定性的参数一变模型跟着变不会出现“这次生成对了下次又错了”的情况。如果你不想引入 CadQuery 这么重的依赖用 trimesh 也能做但 trimesh 生成的是网格没有精确的圆柱面导出 STEP 就不行了。所以选型时要先想清楚你到底需不需要 STEP。3.3 格式导出STEP、GLB、STL 的生成细节导出这一步坑比想象中多。我逐个说。STEP 导出CadQuery 和 OpenCASCADE 都支持。需要注意的是STEP 有 AP203 和 AP214 两个常用协议AP214 支持颜色和图层AP203 更通用。如果你生成的模型要给别人用建议导出 AP214兼容性更好。STL 导出STL 是三角网格导出时有一个关键参数叫弦高公差linear deflection和角度公差angular deflection。这两个参数决定了圆柱面被离散成多少个三角形。公差越小模型越精细文件越大。我一般用弦高 0.01mm、角度 0.1 弧度对于大多数 3D 打印场景足够了。如果设得太粗圆柱面会变成明显的多边形打印出来手感很差。GLB 导出GLB 适合网页展示导出时要注意坐标系。CAD 软件通常用 Z 轴向上而 glTF 标准是 Y 轴向上。如果不做坐标转换模型在网页里会是躺着的。这个坑我踩过调了半天才发现是坐标系的问题。3.4 参数校验防止生成“物理上不可能”的模型这是很多自建系统容易忽略的一环。用户可能输入“外径 40、内径 80”这种明显矛盾的数据或者“厚度 -5”这种负数。如果不做校验几何内核可能直接崩溃或者生成一个空模型。我的做法是在参数解析之后、几何生成之前加一层规则校验外径必须大于内径所有尺寸必须为正数孔的分度圆直径必须在外径和内径之间孔的数量如果是 0就不执行打孔操作这些规则看起来简单但能挡掉 80% 的无效输入。校验不通过时系统应该返回明确的错误信息告诉用户哪个参数有问题而不是抛一个看不懂的内核异常。4. 完整实操流程搭一套自己的 text-to-cad 流水线4.1 环境准备与依赖安装我假设你用的是 Python 环境这是目前做 text-to-cad 最顺手的语言。基础依赖如下pip install cadquery trimesh numpy pip install openai # 如果要用大模型做文本解析CadQuery 的安装稍微麻烦一点它依赖 OpenCASCADE 的 Python 绑定。在 Windows 上直接用 pip 安装预编译包通常没问题在 Linux 上可能需要先装一些系统库。如果遇到OCP相关的报错去 CadQuery 的官方文档查一下对应平台的安装说明一般都能解决。trimesh 用来做网格处理和 GLB 导出numpy 用来做数值计算。如果你不需要 GLBtrimesh 可以省掉。4.2 文本解析模块的实现文本解析我建议单独写一个模块输入是自然语言字符串输出是结构化的参数字典。用大模型的话提示词可以这样设计import json from openai import OpenAI client OpenAI() SYSTEM_PROMPT 你是一个 CAD 参数解析器。用户会用自然语言描述一个零件 你需要提取出以下参数并以 JSON 格式返回 - part_type: 零件类型如 flange, bracket, plate, cylinder - dimensions: 尺寸字典包含所有提到的尺寸单位统一为毫米 - features: 特征列表如孔、槽、倒角 - unit: 原始单位 如果某个参数用户没有明确给出不要猜测设为 null。 只返回 JSON不要返回其他内容。 def parse_text(user_input): response client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: SYSTEM_PROMPT}, {role: user, content: user_input} ], temperature0 ) return json.loads(response.choices[0].message.content)这里temperature0很重要保证同样的输入每次输出一致。解析出来的 JSON 再经过校验模块补全默认值就可以传给几何生成模块了。4.3 几何生成与导出的一体化脚本把解析和生成串起来就是一个完整的流水线def text_to_cad(user_input, output_formatstep): # 第一步解析文本 params parse_text(user_input) # 第二步校验参数 validate_params(params) # 第三步生成几何 if params[part_type] flange: model make_flange( outer_dparams[dimensions][outer_diameter], inner_dparams[dimensions][inner_diameter], thicknessparams[dimensions][thickness], hole_countparams[features].get(hole_count, 0), hole_dparams[features].get(hole_diameter, 0), pcdparams[features].get(pcd, 0) ) else: raise ValueError(f不支持的零件类型: {params[part_type]}) # 第四步导出 if output_format step: cq.exporters.export(model, output.step) elif output_format stl: cq.exporters.export(model, output.stl, tolerance0.01) elif output_format glb: # 先导出 STL再用 trimesh 转 GLB cq.exporters.export(model, temp.stl, tolerance0.01) mesh trimesh.load(temp.stl) mesh.export(output.glb) return output. output_format这个脚本跑通之后你输入“外径 80 内径 40 厚 10 的法兰6 个直径 8 的孔分度圆 60”它就能直接生成对应的 STEP 文件。整个过程不到 10 秒。4.4 批量生成与自动化集成单次生成只是玩具真正有价值的是批量生成。比如你有一张 Excel 表里面是 50 个法兰的尺寸你可以写一个循环读一行生成一个模型自动命名保存。这在做产品配置器或者标准件库的时候特别有用。import pandas as pd df pd.read_excel(flanges.xlsx) for index, row in df.iterrows(): text f外径 {row[外径]} 内径 {row[内径]} 厚 {row[厚度]} 的法兰{row[孔数]} 个直径 {row[孔径]} 的孔分度圆 {row[PCD]} text_to_cad(text, output_formatstep) # 重命名输出文件 import os os.rename(output.step, fflange_{row[型号]}.step)这段代码我实际用过50 个法兰模型从读表到全部生成大概两分钟。如果手工画一个法兰就算 5 分钟50 个就是 4 个多小时。效率提升是数量级的。5. 常见问题与排查技巧实录5.1 生成失败或模型为空这是最常见的问题。表现是脚本跑完了但输出的 STEP 文件打开是空的或者 STL 文件大小为 0。排查思路按顺序来先看参数校验有没有通过如果外径小于内径几何内核会生成一个空实体。再看几何操作有没有报错比如在不存在面上打孔CadQuery 会抛异常。最后看导出路径有没有写权限有时候是文件被占用导致写入失败。我的习惯是在每个关键步骤后面加日志输出比如打印解析出的参数字典、打印几何体的体积、打印导出文件的大小。这样出问题时一眼就能定位到是哪一步挂了。5.2 尺寸偏差与单位混乱热词里有“cad切地形”“cad图纸合并”这些说明大家在实际工作中经常处理各种来源的图纸单位混乱是常态。text-to-cad 系统里单位问题必须在解析阶段就解决。我遇到过用户输入“3 寸管法兰”系统理解成 3 英寸生成了外径 76.2mm 的法兰但实际上用户想要的是 DN80外径约 200mm。这种错误在装配时是致命的。解决办法是在提示词里明确要求模型输出原始单位然后在后处理阶段做单位换算。同时在生成的模型文件里建议在文件名或元数据中标注单位比如flange_DN80_mm.step避免后续混淆。5.3 STL 精度不够导致打印失败3D 打印对 STL 的精度很敏感。如果弦高公差设得太大圆柱面会变成明显的多边形打印出来的孔可能装不进螺栓。我的经验值是普通 FDM 打印弦高 0.05mm 够用光固化或 CNC弦高 0.01mm 起步。角度公差一般设 0.1 到 0.5 弧度太小了文件会爆炸太大了曲面会有棱角感。还有一个隐藏问题STL 的法线方向。如果法线朝内切片软件会认为模型是空心的。CadQuery 导出的 STL 一般没问题但如果你用 trimesh 做二次处理要注意检查法线一致性。5.4 大模型解析不稳定用大模型做文本解析最大的问题是同样的输入不同时间可能输出不同的结果。虽然设了 temperature0但模型版本更新、API 变动都可能导致行为变化。我的应对策略是关键参数用规则兜底。比如“外径”“内径”“厚度”这些关键词用正则先抓一遍抓到了就用规则的结果抓不到再用大模型的。这样即使模型抽风核心尺寸也不会错。另外解析结果一定要做范围校验。比如外径超过 10000mm 或者小于 0.1mm大概率是解析错了应该直接拒绝并提示用户重新输入。5.5 常见问题速查表问题现象可能原因排查方法解决方案输出文件为空参数矛盾或几何操作失败检查参数校验日志修正参数增加异常捕获尺寸偏差 25.4 倍单位混淆检查解析出的单位字段统一换算为毫米STL 圆柱面有棱角弦高公差过大查看 STL 三角形数量减小 tolerance 参数GLB 模型方向不对坐标系不一致在网页里查看模型姿态导出时做 Z 转 Y 轴变换大模型解析结果漂移模型行为变化对比多次解析结果关键参数用规则兜底批量生成时文件覆盖输出路径未区分检查文件名生成逻辑用型号或序号命名6. 工具选型与扩展思路6.1 几何内核选型对比如果你要自己搭 text-to-cad几何内核的选择决定了整个系统的能力边界。我把几个主流方案列出来对比。方案语言支持 STEP支持 STL学习曲线适用场景CadQueryPython是是中等快速开发参数化零件FreeCAD APIPython是是较陡复杂装配需要 GUIOpenCASCADEC/Python是是陡峭底层定制高性能trimeshPython否是平缓纯网格处理快速原型Blender APIPython有限是中等艺术造型渲染展示我的建议是如果你主要做工程零件CadQuery 是性价比最高的选择。它封装了 OpenCASCADE 的复杂性用 Python 写起来很快而且社区活跃遇到问题容易找到答案。如果你需要和现有 CAD 软件深度集成那就走对应软件的 API 路线。6.2 从单零件到装配体单零件生成只是第一步。实际工程中你往往需要生成一个装配体比如一个法兰加一个垫片加一组螺栓。text-to-cad 系统可以扩展成支持装配描述比如“生成一个 DN80 法兰装配包含法兰、垫片和 6 个 M8 螺栓”。实现思路是先分别生成各个零件再用几何变换把它们放到正确的位置。CadQuery 支持union、translate、rotate等操作可以完成装配。但要注意装配体的 STEP 导出和单零件略有不同需要保留各个零件的名称和颜色信息。6.3 与现有工作流的集成text-to-cad 生成的文件最终要进入现有的工作流。比如导入 SolidWorks 继续编辑STEP 格式可以直接导入但参数化特征会丢失变成哑实体。如果需要保留特征得用 SolidWorks API 直接生成。导入切片软件打印STL 格式直接拖进去就行注意检查尺寸和摆放方向。导入网页做展示GLB 格式配合 three.js 或 model-viewer效果很好。导入仿真软件做分析STEP 格式导入 ANSYS 或 COMSOL注意检查几何是否干净有没有微小面或裂缝。我个人的习惯是text-to-cad 负责生成基础几何后续的倒角、圆角、细节特征还是在 CAD 软件里手工完成。这样既享受了自动化的效率又保留了工程判断的灵活性。7. 一些实操心得与避坑建议先说一个我踩过的坑不要试图用 text-to-cad 生成复杂曲面。我曾经想用它生成一个涡轮叶片结果发现自然语言根本描述不清楚那种自由曲面参数化建模也表达不了。后来老老实实回到 CAD 软件里用曲面建模功能做。text-to-cad 的边界很清晰规整的、有参数的、可以用尺寸描述的零件它很擅长自由的、有机的、靠感觉的造型它不行。第二个心得参数命名要统一。我早期写的脚本里有时候用outer_d有时候用outer_diameter有时候用od结果调试的时候自己都搞混了。后来定了一套命名规范所有地方统一用outer_diameter、inner_diameter、thickness代码可读性好了很多。第三个建议给生成的模型加元数据。STEP 文件支持自定义属性你可以在生成时写入零件名称、版本号、生成时间、参数列表。这样后续追溯的时候一看文件就知道是哪个版本、什么参数生成的。这个习惯在批量生成的时候特别有用。最后分享一个小技巧用 Jupyter Notebook 做开发和调试。CadQuery 支持在 Jupyter 里直接显示三维模型你改一行代码模型立刻更新所见即所得。这比每次导出文件再用 CAD 软件打开看效率高太多了。调试通了再封装成脚本批量跑。这个方向后续还可以往参数化模板库的方向扩展。把常用的零件类型法兰、齿轮、支架、外壳都做成模板用户只需要填参数系统自动选择模板生成。再配合一个简单的 Web 界面就变成了一个内部用的“文字转零件”工具团队里谁都能用。