首页 / 资讯中心 / 文章详情

Text-to-CAD 实战:从自然语言到三维模型的生成路线与避坑指南

Text-to-CAD 实战:从自然语言到三维模型的生成路线与避坑指南 ★ FEATURED ARTICLE
1. 从一段文字到三维模型text-to-cad 到底在解决什么问题第一次听到 “text-to-cad” 这个词很多人脑子里蹦出来的画面可能是对着电脑敲一句“给我画一个法兰盘”然后屏幕上就自动出现一个带孔、带倒角、尺寸标注齐全的三维模型。这个想象不算离谱但也不完全准确。更贴近现实的理解是text-to-cad 是一类把自然语言描述转换成 CAD 可识别几何数据的技术方案统称它的输出通常不是某个私有格式的工程图而是 STEP、GLB、STL 这类通用中间格式然后再由 SolidWorks、Fusion 360、FreeCAD、Blender 等工具接手做后续处理。我最早接触这个方向是因为手头有一批非标零件的建模需求每个零件结构不复杂但数量多、重复性高手动在 CAD 里拉伸、打孔、倒角一天下来眼睛都花了。当时就想能不能用一段结构化描述直接生成模型文件哪怕只是初稿也能省掉大量重复劳动。后来陆续试了几条路线踩了不少坑也总结出一些相对稳定的做法。这篇文章就把我对 text-to-cad 的理解、实操路径、格式选型和避坑经验完整梳理一遍。它适合谁看如果你是机械设计、工业设计、3D 打印爱好者、机器人仿真开发者或者只是想把一段文字快速变成可用的三维模型那这篇内容应该能帮到你。不需要你精通 CAD 二次开发但至少要能看懂基本的几何概念比如拉伸、旋转、布尔运算、网格与实体的区别。下面我会从整体思路开始一步步拆到具体实现。2. 整体方案设计与技术路线选型2.1 为什么 text-to-cad 不是“一句话出图”那么简单很多人对 text-to-cad 的误解来自于把“文本生成图片”的经验直接搬过来。文本生成图片输出的是像素像素差一点人眼可能看不出来但 CAD 输出的是几何尺寸差 0.1 毫米装配就可能装不进去。这是本质区别。所以 text-to-cad 的核心难点不在“生成”而在“约束”。一段自然语言里“一个直径 50 毫米、厚 10 毫米的圆盘中心有一个直径 20 毫米的通孔”这句话对人来说很清晰但对程序来说它需要被解析成圆柱体特征、直径参数、厚度参数、同轴孔特征、布尔减运算。每一步都要求参数明确、拓扑关系明确。我试过直接让大语言模型输出 STEP 文件的文本内容结果几乎不可用因为 STEP 是 ISO 10303 标准下的严格语法任何一行实体定义出错整个文件就打不开。后来调整思路让语言模型负责“理解意图并输出结构化参数”让几何内核负责“根据参数生成精确几何”。这个分工是目前最靠谱的路线。2.2 三条主流技术路线对比在实际操作中我归纳出三条可行路线各有适用场景路线核心思路输出格式优点缺点参数化脚本路线语言模型输出 Python/OpenSCAD 代码由脚本生成模型STL、STEP可控性强参数精确需要几何内核环境结构化 JSON 路线语言模型输出 JSON 描述自研解析器转几何STEP、GLB流程清晰易调试解析器开发量大直接网格生成路线语言模型输出顶点/面片数据或调用网格生成接口STL、GLB上手快适合展示精度低不适合工程如果你只是想做视觉展示、3D 打印摆件直接网格生成路线够用但如果你要做装配、出工程图、做仿真那必须走参数化脚本或结构化 JSON 路线因为只有实体模型才能保证尺寸和拓扑的正确性。我个人的选择是OpenSCAD Python 混合路线用语言模型把自然语言转成 OpenSCAD 脚本或 CadQuery 脚本再通过命令行调用生成 STL 或 STEP。CadQuery 基于 OCCT 几何内核输出 STEP 的质量很好适合工程用途OpenSCAD 更轻量适合快速验证。2.3 格式选型STEP、GLB、STL 到底该用哪个热搜词里反复出现 STEP、GLB、STL说明很多人卡在格式选择上。我用一张表说清楚格式类型精度适用场景注意事项STEP实体/B-Rep精确工程装配、CNC、出图文件较大需要内核支持GLB网格材质近似网页展示、AR/VR不含精确尺寸STL三角网格近似3D 打印、快速预览无单位需约定毫米提示如果你后续要把模型导入 SolidWorks 或中望 CAD 做进一步编辑优先选 STEP如果只是放到网页里旋转查看GLB 更合适如果直接丢给 3D 打印机STL 最省事。这里有个容易被忽略的点STL 文件本身不记录单位。很多切片软件默认按毫米处理但如果你从某个来源拿到的 STL 是按英寸生成的尺寸就会差 25.4 倍。我踩过这个坑一个本应 50 毫米的零件打印出来只有 2 毫米不到后来在导出时强制指定单位才解决。3. 核心细节解析与实操要点3.1 自然语言到结构化参数的转换逻辑text-to-cad 的第一步是把一段话拆成机器能理解的参数。我通常要求语言模型输出类似下面的结构{ shape: cylinder, params: { diameter: 50, height: 10, unit: mm }, features: [ { type: hole, position: center, diameter: 20, through: true } ] }这个 JSON 就是“意图”和“几何”之间的桥梁。为什么不用自然语言直接驱动几何内核因为几何内核的 API 是严格的参数类型、顺序、单位都不能错而 JSON 可以做校验和默认值填充。在实际操作中我会在提示词里明确要求模型所有尺寸必须带单位所有特征必须说明位置关系布尔运算必须说明是并集还是差集。这样生成的 JSON 才能稳定被解析器消费。3.2 几何内核的选择与调用方式几何内核是 text-to-cad 的“发动机”。目前常用的有 OCCT、CGAL、Manifold 等。OCCT 功能最全支持 B-Rep 实体和 STEP 输出但学习曲线陡Manifold 轻量适合网格布尔运算但不输出 STEP。我推荐用CadQuery作为主要工具它封装了 OCCT用 Python 写起来很顺手。比如生成一个带孔圆盘import cadquery as cq result ( cq.Workplane(XY) .circle(25) .extrude(10) .faces(Z) .workplane() .hole(20) ) cq.exporters.export(result, disk.step) cq.exporters.export(result, disk.stl)这段代码里circle(25)是半径 25 毫米对应直径 50extrude(10)是拉伸 10 毫米hole(20)是直径 20 的通孔。每一步都对应自然语言里的一个描述片段。如果你用 OpenSCAD写法更接近声明式difference() { cylinder(h10, d50, centertrue); cylinder(h12, d20, centertrue); }OpenSCAD 的优点是语法简单缺点是复杂曲面能力弱且不支持 STEP 输出。所以我的做法是简单零件用 OpenSCAD 快速验证复杂零件用 CadQuery 出 STEP。3.3 单位、坐标系与公差的前置约定这是最容易被忽视、也最容易出问题的地方。text-to-cad 生成的模型如果单位不统一后续所有环节都会崩。我的经验是在项目最开始就约定“毫米、右手坐标系、Z 轴向上、原点在零件底面中心”然后把这个约定写进提示词和解析器。公差方面自然语言里很少会提到公差但工程用途必须考虑。比如“直径 20 的通孔”实际加工可能是 20 正公差 0.05。text-to-cad 阶段可以先按名义尺寸生成后续在 CAD 里再标注公差。但如果你要做装配仿真最好在 JSON 里预留tolerance字段哪怕暂时填 0。注意STL 导出时弦高偏差chordal tolerance和角度偏差angular tolerance会直接影响网格密度。默认值往往偏粗曲面会显得有棱角。我通常把弦高设为 0.01 毫米角度设为 0.1 弧度文件会大一些但曲面质量明显更好。4. 实操过程与核心环节实现4.1 环境搭建从零准备可复现的工具链我用的环境是 Python 3.10 CadQuery 2.4 OpenSCAD 2021.01。安装 CadQuery 最省事的方式是 condaconda create -n text2cad python3.10 conda activate text2cad conda install -c conda-forge cadqueryOpenSCAD 直接去官网下载安装包安装后把可执行文件路径加入环境变量方便命令行调用openscad -o output.stl input.scad如果你需要 GLB 输出可以装trimesh和pygltflib把 STL 转成 GLBimport trimesh mesh trimesh.load(disk.stl) mesh.export(disk.glb)这套工具链的好处是全部可以在命令行里跑方便批量处理和自动化。我试过用纯图形界面工具做 text-to-cad效率低很多因为每次都要手动点选和导出。4.2 从一句话到 STEP 文件的完整流程假设输入是“生成一个 80 毫米长、40 毫米宽、5 毫米厚的平板四角各有一个直径 6 毫米的孔孔中心距边缘 8 毫米。”第一步语言模型输出结构化 JSON{ shape: box, params: {length: 80, width: 40, height: 5, unit: mm}, features: [ {type: hole, diameter: 6, positions: [[8,8],[72,8],[8,32],[72,32]], through: true} ] }第二步解析器把 JSON 转成 CadQuery 脚本import cadquery as cq plate cq.Workplane(XY).box(80, 40, 5) hole_positions [(8-40, 8-20), (72-40, 8-20), (8-40, 32-20), (72-40, 32-20)] for x, y in hole_positions: plate plate.faces(Z).workplane().center(x, y).hole(6) cq.exporters.export(plate, plate.step) cq.exporters.export(plate, plate.stl)这里有个细节CadQuery 的box默认以原点为中心所以孔位坐标要减去半长半宽。这个偏移量如果算错孔就会偏。我一般会在解析器里统一做坐标转换避免每次手算。第三步运行脚本检查输出。用 FreeCAD 或在线 STEP 查看器打开确认尺寸和孔位。如果没问题这个 STEP 文件就可以导入 SolidWorks 或中望 CAD 继续做工程图。4.3 批量生成与参数化变体text-to-cad 真正体现价值的地方是批量生成。比如你有 20 个法兰盘只是直径和孔数不同手动建模要重复 20 次用脚本就是改参数的事。我的做法是写一个模板函数def make_flange(outer_d, inner_d, thickness, bolt_count, bolt_circle_d, bolt_d): flange cq.Workplane(XY).circle(outer_d/2).extrude(thickness) flange flange.faces(Z).workplane().hole(inner_d) for i in range(bolt_count): angle 2 * 3.14159 * i / bolt_count x (bolt_circle_d/2) * math.cos(angle) y (bolt_circle_d/2) * math.sin(angle) flange flange.faces(Z).workplane().center(x, y).hole(bolt_d) return flange然后从 CSV 或 JSON 里读参数循环调用批量导出 STEP 和 STL。实测下来20 个零件从参数到文件不到 10 秒比手动快太多了。实操心得批量导出时文件名一定要带参数标识比如flange_d100_h20.step否则后期根本分不清哪个是哪个。我一开始用序号命名结果对不上号返工了一次。5. 常见问题与排查技巧实录5.1 模型打不开或显示破面这是最常见的问题。STEP 文件打不开通常是几何内核在布尔运算时产生了无效拓扑。排查顺序检查是否有零厚度特征比如两个面完全重合。检查孔是否完全穿透如果孔深等于板厚可能产生共面问题。尝试用clean()方法修复result result.clean()STL 显示破面通常是网格法线方向不一致。用trimesh修复mesh trimesh.load(broken.stl) mesh.fix_normals() mesh.export(fixed.stl)5.2 尺寸不对或单位错乱如果模型尺寸差了一个数量级先检查单位。STL 无单位STEP 有单位但不同软件默认不同。我的做法是在 CadQuery 里全部用毫米导出 STEP 时确认单位是毫米导出 STL 时在切片软件里再确认一次。另一个常见原因是坐标偏移。比如box以中心为原点而你以为以角为原点。解决办法是在脚本里显式指定centered(False, False, False)或者统一做坐标转换。5.3 复杂曲面生成失败自然语言描述曲面本来就模糊比如“一个流线型的外壳”这种描述无法直接转成参数。我的处理方式是把曲面需求拆成截面轮廓 放样路径用sweep或loft实现。如果还是不行就退回到网格生成路线用 Blender 或 Meshy 这类工具先出网格再转 STL。注意网格转实体STL 转 STEP在热搜里出现频率很高但我要泼冷水STL 转 STEP 本质是逆向工程精度损失很大曲面会变成大量小平面。如果原始需求是工程用途最好从参数化路线重新生成而不是转格式。5.4 常见问题速查表问题现象可能原因排查方法解决手段STEP 打不开布尔运算产生无效拓扑用 FreeCAD 检查几何有效性clean() 修复或调整运算顺序尺寸差 25.4 倍单位混淆检查导出设置统一用毫米孔位偏移坐标系原点不一致打印关键点坐标显式指定 centered 参数STL 曲面有棱角网格精度太低查看网格面数提高弦高和角度精度批量文件混淆命名无规律检查文件名用参数命名6. 工具链扩展与进阶玩法6.1 和现有 CAD 软件配合使用text-to-cad 生成的 STEP 文件可以直接导入 SolidWorks、中望 CAD、Fusion 360。导入后你可以继续加工程图、标注公差、做装配约束。我通常把 text-to-cad 当作“初稿生成器”把重复性建模交给脚本把创造性设计留给自己。如果你用中望 CAD注意它的 STEP 导入模块对 OCCT 版本有要求太新的 STEP 可能不兼容。解决办法是在 CadQuery 导出时指定STEPControl_Writer的版本或者先导出 IGES 再转。6.2 结合 3D 打印的注意事项STL 导出后直接切片打印有几个参数要调弦高0.01 毫米曲面更光滑角度0.1 弧度圆孔更圆法线确保朝外如果打印出来孔偏小可能是切片软件的“孔补偿”没开。我一般会在设计时把孔放大 0.1 到 0.2 毫米抵消打印收缩。6.3 后续可以扩展的方向这套流程跑通后可以往几个方向扩展一是接入语音输入说话就能生成模型二是和参数化库结合比如标准件库自动调用三是做网页端用户输入文字后台生成 GLB 直接预览。我目前在做的是第二个方向把常用法兰、齿轮、轴承座的参数模板整理成 JSON 库语言模型只需要识别类型和关键尺寸生成稳定性会高很多。最后分享一个小技巧如果你不确定一段描述能不能生成先让语言模型把它拆成“形状 尺寸 特征 位置”四要素缺哪个补哪个。这个习惯能帮你避开大部分“生成失败”的情况。
阅读完成 · 觉得有帮助?
咨询建站