1. 从一段文字到三维模型text-to-cad 到底在解决什么问题第一次听到 “text-to-cad” 这个词我脑子里蹦出来的画面是对着电脑敲一句“给我画一个 80×60×10 的法兰盘中心开一个直径 30 的通孔四角各一个 M6 沉头孔”然后软件自己把三维模型建好、导出 STEP 文件直接丢进加工流程。这个画面放在五年前还属于科幻现在已经有了一批能跑通的原型工具和开源方案。所谓 text-to-cad本质上是把自然语言描述转换成 CAD 可识别的几何模型数据最终输出 STEP、GLB、STL 这类通用格式让模型能进入后续的渲染、3D 打印、CNC 加工或者装配仿真环节。它解决的问题很具体。传统 CAD 建模不管是 SolidWorks、中望 CAD 还是 FreeCAD都需要人手动拉伸、切除、打孔、倒角一个中等复杂度的零件熟练工程师也要花上几十分钟到几个小时。而大量重复性结构件——支架、法兰、垫块、外壳、连接板——它们的几何逻辑高度模式化完全可以用文字参数化描述。text-to-cad 要做的就是把这部分“翻译”工作交给程序人只负责说清楚需求。适合关注这个方向的人其实比想象中多。做机械设计的工程师可以用它快速生成初版方案省掉大量重复建模时间做 3D 打印的玩家可以用它把脑子里的想法直接变成 STL 文件不用先学一遍建模软件做自动化、机器人仿真的开发者可以用它批量生成标准件模型喂给仿真环境甚至做电商、做产品原型的人也能用它快速产出可预览的 GLB 模型放到网页里给客户看。关键词里出现的 STEP、GLB、STL正好对应了三条主要的下游路径STEP 走工程制造GLB 走网页渲染和 AR 展示STL 走 3D 打印。理解这三者的差异是理解 text-to-cad 输出环节的关键。我自己的判断是text-to-cad 短期内不会取代 CAD 工程师但它会改变建模工作的分配方式。人负责定义意图、约束和关键尺寸机器负责生成基础几何、批量变体和格式转换。这个分工一旦跑顺效率提升不是百分之几十而是几倍到十几倍。下面我就按实际落地时会遇到的顺序把这个方向拆开讲清楚。2. 核心思路拆解文字怎么变成几何体2.1 三种主流技术路线与选型逻辑把文字变成 CAD 模型目前能跑通的路子大致分三类每类的适用场景和坑都不一样。第一类是基于模板的参数化生成。做法是先准备好一批参数化模板比如“法兰盘”“L 型支架”“矩形外壳”每个模板暴露若干参数长、宽、高、孔径、孔位。用户输入的文字先经过解析提取出参数值再填入模板最后由 CAD 内核如 OpenCASCADE生成实体并导出。这条路最稳生成结果可控尺寸精确适合工程用途。缺点是模板覆盖范围有限遇到模板外的形状就无能为力。我实测下来对于标准件和常见结构件这条路成功率最高STEP 导出后直接能进 CAM 流程。第二类是基于代码生成的建模。典型代表是 CadQuery、OpenSCAD 这类“代码即模型”的工具。用户输入的文字被转换成一段建模脚本脚本执行后生成几何体。比如“一个边长 50 的立方体顶部倒角 3mm”会被翻译成对应的 CadQuery 代码。这条路灵活度高理论上能表达任意可用代码描述的几何但对自然语言到代码的翻译质量要求很高一旦翻译错一个参数模型就废了。它适合有一定编程基础、需要批量生成变体的场景。第三类是基于深度学习直接生成几何表示。这类方案把文字编码成向量再解码成点云、体素或者网格最后拟合成 CAD 曲面。学术上很热但工程落地还早生成的模型精度和拓扑质量往往达不到制造要求STL 打印勉强能用STEP 导出经常出问题。我的建议是如果你要做的是实际生产或精确装配优先考虑前两类如果只是做概念预览、网页展示第三类可以观望。选型时我一般看三个指标尺寸精度要求、批量规模、下游格式。精度要求高、要出 STEP 的走模板或代码路线批量大、变体多的走代码路线只要 GLB 做展示的可以容忍一定误差选择面更宽。2.2 为什么 STEP、GLB、STL 的生成逻辑完全不同很多人以为模型建好了导出什么格式都一样这是个常见误解。STEP、GLB、STL 三种格式背后的几何表示方式根本不同生成策略也必须区别对待。STEP是边界表示B-rep格式它用精确的数学曲面平面、圆柱面、NURBS 曲面来描述几何体保留完整的拓扑关系。这意味着生成 STEP 时必须用真正的 CAD 内核来建模孔就是圆柱面倒角就是圆角面尺寸是精确值。好处是模型可以继续被 CAD 软件编辑、可以被 CAM 软件识别特征、可以标注公差。坏处是生成过程重依赖 OpenCASCADE 这类内核计算量大。STL是三角网格格式它把模型表面离散成大量三角形。生成 STL 时需要先有实体模型再做网格化tessellation用弦高和角度公差控制精度。STL 没有单位、没有拓扑、没有曲面信息就是一个三角形集合。它适合 3D 打印和快速预览但不适合精确编辑。关键词里有人问“sw 中 stl 转 stp”这其实是个逆向过程需要把网格重新拟合成曲面难度大且容易丢精度所以能直接生成 STEP 就尽量别绕 STL。GLB是 glTF 的二进制版本面向实时渲染和网页展示。它同样基于网格但支持材质、纹理、动画、层级结构。生成 GLB 时除了几何还要考虑法线、UV、材质贴图。关键词里“3dsmax2012 修复 stl 模型的 uv”就说明网格模型如果没有 UV贴图会乱GLB 展示效果会大打折扣。所以 text-to-cad 如果目标是 GLB生成流程里必须包含 UV 展开和法线计算。我的实操经验是一套输入三条输出管线。文字解析和参数提取可以共用但几何生成阶段就要分叉。要 STEP 的走 B-rep 内核要 STL 的走网格化要 GLB 的走网格加材质。不要试图用一种几何表示通吃否则要么精度不够要么性能太差。2.3 自然语言解析的难点与应对策略文字转 CAD最难的不是建模而是理解人话。用户说“一个厚一点的板子”这个“厚一点”到底是多厚说“四个角打孔”孔位是贴边还是留边距说“倒个圆角”半径多少这些模糊表达在自然语言里很常见但 CAD 需要精确数值。应对策略我总结了几条。第一建立默认值体系。对于未指定的参数给一套合理的工程默认值。比如板厚默认 5mm孔径默认 M6 对应 6.6mm 通孔倒角默认 2mm孔边距默认 1.5 倍孔径。这样即使输入模糊也能生成一个可用的初版用户再微调。第二做参数追问机制。当关键尺寸缺失且无法用默认值覆盖时系统应该反问用户而不是瞎猜。比如“请提供法兰盘外径和螺栓孔中心圆直径”。这比生成一个错误模型再让用户改要高效。第三支持单位识别和换算。用户可能说“5 厘米”“2 英寸”“M8 螺纹”系统要能统一换算成毫米。关键词里“cad 制图初学入门”说明很多用户对单位不敏感这一步做不好模型尺寸会差出数量级。第四用结构化提示词引导输入。与其让用户自由发挥不如给一个输入模板比如“形状外形尺寸长__宽__高特征孔__个直径_位置__倒角___”。这样解析准确率会大幅提升。我在实际项目里试过结构化输入比自由文本的解析成功率高出至少一倍。3. 实操落地从环境搭建到模型导出3.1 工具链选型与依赖安装要跑通一个 text-to-cad 流程工具链的选择直接决定后续难度。我推荐一套经过实测的组合Python 作为主语言CadQuery 或 build123d 做 B-rep 建模OpenCASCADE 做几何内核trimesh 做网格处理gltf 库做 GLB 导出大语言模型做文字解析。CadQuery 的优势是 API 清晰基于 OpenCASCADE能直接导出 STEP 和 STL。安装用 pip 即可pip install cadquery pip install trimesh pip install pygltflib如果要做 GLB 导出还需要处理材质和 UVtrimesh 配合 pygltflib 基本够用。文字解析部分可以调用大语言模型的 API把自然语言转成结构化的 JSON 参数再喂给建模脚本。这里要注意模型 API 的调用要设置好超时和重试网络不稳定时要有降级方案。环境搭建的坑主要集中在 OpenCASCADE 的依赖上。Windows 下 CadQuery 的安装相对省心Linux 下可能需要手动装一些系统库。我踩过的坑是 Python 版本不匹配CadQuery 对 Python 版本有要求建议用 3.9 到 3.11 之间的版本太新或太旧都可能出问题。另外如果要做批量生成建议把建模逻辑封装成独立进程避免内存泄漏累积。3.2 文字解析到参数 JSON 的完整实现这一步是整个流程的入口做不好后面全白搭。我的做法是定义一个严格的 JSON Schema让大语言模型按格式输出。Schema 大致长这样{ shape_type: flange, outer_diameter: 80, inner_diameter: 30, thickness: 10, bolt_holes: { count: 4, diameter: 6.6, circle_diameter: 60 }, fillets: { radius: 2, edges: outer }, unit: mm }提示词里要明确告诉模型所有尺寸单位统一为毫米未指定的参数填 null不要编造数值。然后写一个校验函数检查必填字段是否齐全数值是否在合理范围内。比如外径不能小于内径板厚不能为负孔数必须是整数。实测下来解析成功率跟输入质量强相关。用户如果按模板输入成功率能到 90% 以上如果是一句随意的口语成功率可能只有一半。所以我在产品设计上会优先引导用户用结构化输入自由文本作为补充。还有一个细节数值提取要处理中文数字和单位混写。比如“直径三十毫米”“4 个孔”“M6 的螺丝”这些都要能正确解析。我一般会在提示词里给几个示例让模型学会处理这类表达。3.3 用 CadQuery 生成 STEP 模型的关键代码参数拿到后建模就是按部就班的事。以法兰盘为例核心代码如下import cadquery as cq def build_flange(params): od params[outer_diameter] id_ params[inner_diameter] t params[thickness] bolt params[bolt_holes] # 创建外圆柱 result cq.Workplane(XY).circle(od / 2).extrude(t) # 挖中心孔 result result.faces(Z).workplane().hole(id_) # 打螺栓孔 result ( result.faces(Z).workplane() .polarArray(bolt[circle_diameter] / 2, 0, 360, bolt[count]) .hole(bolt[diameter]) ) # 倒角 if params.get(fillets): r params[fillets][radius] result result.edges(|Z).fillet(r) return result # 导出 STEP model build_flange(params) cq.exporters.export(model, flange.step)这段代码里几个关键点值得说明。polarArray用来做圆周阵列参数分别是阵列半径、起始角度、总角度、数量打螺栓孔非常方便。hole方法直接挖通孔比先画圆再切除简洁。倒角用edges(|Z)选择竖直边再fillet如果选错边倒角会失败或者形状不对。导出 STEP 时CadQuery 会调用 OpenCASCADE 的写入器生成的 STEP 文件保留精确曲面可以直接导入 SolidWorks、中望 CAD 等软件。我实测过导出的法兰盘在 SolidWorks 里打开尺寸完全对得上孔位和倒角都正常。3.4 STL 与 GLB 的导出差异与参数设置STL 导出相对简单但精度参数很关键。CadQuery 导出 STL 时可以指定公差cq.exporters.export( model, flange.stl, tolerance0.01, angularTolerance0.1 )tolerance是弦高公差单位毫米越小网格越密angularTolerance是角度公差单位弧度。对于 3D 打印0.01mm 的弦高通常够用如果模型很大可以适当放宽到 0.05mm否则文件会巨大。我踩过的坑是公差设太小一个简单零件导出几百 MB 的 STL切片软件直接卡死。GLB 导出要复杂一些因为涉及材质和 UV。用 trimesh 可以先把 CadQuery 模型转成网格再导出 GLBimport trimesh mesh model.val().tessellate(0.01) tm trimesh.Trimesh( verticesmesh[0], facesmesh[1] ) tm.export(flange.glb)如果要加材质可以给 trimesh 设置visual属性。UV 展开 trimesh 支持有限复杂模型可能需要用 Blender 或专门的 UV 工具处理。关键词里“3dsmax2012 修复 stl 模型的 uv”说明这个问题在实际工作中很常见我的建议是如果 GLB 只是做展示用纯色材质加环境光遮蔽也能有不错的效果不必强求复杂贴图。4. 常见问题与排查技巧实录4.1 模型生成失败的典型原因与解决text-to-cad 流程里模型生成失败是最让人头疼的。我整理了几类高频问题。第一类参数缺失或矛盾。比如用户说“打个孔”但没说孔径或者外径 50 内径 60。解决方法是加强参数校验必填项缺失时追问矛盾时给出提示。我在代码里加了一个validate_params函数检查数值范围和逻辑关系提前拦截。第二类几何操作失败。倒角半径大于板厚的一半或者孔位超出外形边界都会导致建模失败。CadQuery 会抛异常需要捕获并给出可读的错误信息。我的做法是在关键操作前后加日志记录当前参数和操作类型方便定位。第三类导出格式不支持。比如模型不是实体是曲面或线框导出 STEP 会失败。CadQuery 里可以用model.val().isValid()检查实体有效性。如果无效通常是布尔运算出了问题需要检查操作顺序。第四类内存或性能问题。批量生成大量模型时内存会持续增长。解决方法是每个模型生成后显式释放或者用多进程隔离。我试过用multiprocessing.Pool并行生成效率提升明显但要注意每个进程独立初始化 CAD 内核。4.2 格式转换中的精度丢失与修复STL 转 STEP 是关键词里的高频问题也是精度丢失的重灾区。STL 是网格STEP 是精确曲面从网格反推曲面需要拟合这个过程必然有误差。如果原始 STL 精度高、网格密拟合效果会好一些如果网格粗糙拟合出来的曲面会扭曲。我的建议是能直接生成 STEP 就不要绕 STL。如果手上只有 STL需要转 STEP可以用 FreeCAD 的“Part 工作台”做形状拟合或者用专门的逆向工程软件。但要有心理准备转换后的模型可能无法直接用于精密加工需要人工修复。GLB 转 STL 相对简单因为都是网格直接提取几何数据即可。但要注意 GLB 可能包含多个网格节点和变换矩阵导出时要应用变换否则模型位置和缩放会错。trimesh 加载 GLB 后用scene.dump(concatenateTrue)可以合并所有网格。4.3 批量生成与自动化流程的避坑经验批量生成是 text-to-cad 最有价值的场景之一但坑也最多。我总结了几条经验。参数表要严格校验。批量输入通常来自 Excel 或 CSV里面可能有空值、单位不统一、格式错误。我一般先用 pandas 读入做一轮清洗和校验再逐行生成。遇到错误行记录行号和原因跳过继续不要整个流程中断。文件命名要规范。批量生成几百个文件命名混乱会让人崩溃。我用的规则是“类型_关键尺寸_序号”比如flange_D80_d30_t10_001.step一眼能看出模型内容。日志要详细。每个模型的生成时间、参数、输出路径、成功与否都要记录。出问题时能快速定位是哪个环节、哪组参数出的错。资源要控制。批量生成时 CPU 和内存占用高建议限制并发数留出余量。我一般设并发数为 CPU 核心数的 70% 左右避免系统卡死。输出目录要分格式。STEP、STL、GLB 分开放不要混在一起。后续使用时会方便很多。4.4 常见问题速查表问题现象可能原因排查方法解决方案模型生成报错参数缺失或矛盾检查 JSON 参数完整性补全参数或追问用户倒角失败半径过大或边选择错误检查倒角半径与板厚关系减小半径或重新选边STEP 导出为空模型非实体用 isValid 检查修复布尔运算顺序STL 文件过大公差设置过小查看文件尺寸放宽 tolerance 到 0.05GLB 贴图错乱缺少 UV检查网格 UV 属性用 Blender 展开 UV批量生成中断某行参数异常查看日志行号跳过错误行继续内存持续增长对象未释放监控内存曲线多进程隔离或显式释放单位错误未统一换算检查输入单位强制统一为毫米5. 下游应用与扩展方向5.1 从模型到制造STEP 在 CAM 流程中的衔接生成的 STEP 模型最终要进入制造环节。如果是 CNC 加工STEP 导入 CAM 软件后需要识别特征、生成刀路。这里的关键是模型质量孔必须是真正的圆柱面倒角必须是圆角面否则 CAM 软件识别不到特征刀路会出错。这也是为什么我一直强调要 STEP 就走 B-rep 内核不要用网格凑合。我实测过CadQuery 生成的 STEP 法兰盘导入 Fusion 360 的 CAM 模块孔和倒角都能正确识别直接生成钻孔和铣削刀路。如果换成 STL 导入CAM 软件只能做 3D 曲面加工效率低很多。所以对于制造用途STEP 是首选。5.2 GLB 在网页展示与 AR 中的应用GLB 的优势是体积小、加载快、支持材质非常适合网页展示和 AR。生成的 GLB 模型可以嵌入网页用 three.js 或 model-viewer 渲染客户在浏览器里就能旋转查看。如果做 ARGLB 也是主流格式手机扫描后可以直接把模型叠加到现实场景。这里要注意的是模型面数和材质。网页展示的模型面数不宜过高一般控制在几万面以内否则加载慢。材质用 PBR 材质配合环境光效果会比较真实。如果模型复杂可以在导出前做减面处理trimesh 支持简化网格。5.3 STL 在 3D 打印中的参数调优STL 用于 3D 打印关键是网格质量和尺寸精度。打印前要用切片软件检查模型是否封闭、是否有法线翻转、是否有细小特征。我一般会在导出 STL 后用 trimesh 做一轮检查mesh trimesh.load(flange.stl) print(是否封闭:, mesh.is_watertight) print(体积:, mesh.volume) print(面数:, len(mesh.faces))如果is_watertight为 False说明模型有破面打印会出问题。常见原因是布尔运算产生的微小缝隙解决方法是做一次网格修复trimesh 有fill_holes方法。尺寸方面STL 没有单位切片软件里要手动设置缩放所以导出时最好在文件名里标注单位避免搞错。6. 我在这条路上踩过的坑和几点实在建议做 text-to-cad 这段时间最大的体会是文字解析的准确率决定了整个流程的天花板。建模代码写得再好参数错了全白搭。所以我现在会把大量精力放在输入引导和参数校验上宁可多问用户一句也不要生成一个错误模型。另一个体会是不要追求一步到位。text-to-cad 生成的是初版模型后续还需要人工微调。把它定位成“快速起稿工具”而不是“全自动建模机”心态会好很多产品设计也会更务实。我见过一些方案试图完全替代人工结果生成的模型没法用反而浪费时间。还有一点格式选择要跟着用途走。要加工就 STEP要展示就 GLB要打印就 STL不要混。我早期试过用 STL 转 STEP 去做加工精度丢得一塌糊涂后来老老实实直接生成 STEP问题就没了。最后分享一个小技巧如果你要批量生成标准件先把参数表整理好用 pandas 做校验再用多进程跑输出目录按格式分好。这套流程跑顺之后几百个模型十几分钟就能出完比手动建模快太多了。后续如果要扩展可以加入更多模板类型比如支架、外壳、齿轮覆盖更多常见结构。
阅读完成 · 觉得有帮助?