
我们都经历过这种场景脑子里有一个零件的形状手边却没有建模软件或者有时间打开CAD但调参调得心烦。最近“text-to-cad”这个方向火了起来核心思路很直接——用一段自然语言描述零件让大模型帮你生成可编辑的CAD模型文件。听起来像是把“想法”直接变成“图纸”但真正跑通整个流程之后你会发现这里面的技术取舍、工具链选择和坑远比一句“AI生成模型”复杂得多。这篇文章我把自己实际折腾过的完整路线、可复用的提示词模板、代码示例以及排查经验都整理出来给正在关注这个方向的机械工程师、3D打印玩家和AI应用开发者做个参考。先说清楚一个认知问题text-to-cad生成出来的东西不是一张图片也不是一个只能在屏幕里转的网格模型而是一个能继续编辑、能出工程图、能送进CAM程序加工的真实三维实体。这个“可编辑”和“可制造”的定位决定了它在技术路线上跟常见的文生图模型有本质区别。下面我从思路拆解开始一步一步聊。1. 项目整体设计与技术思路拆解1.1 从生成像素到生成几何难在哪文生图模型的工作对象是像素网格它生成一张“看起来对”的图评估标准是视觉合理性。但text-to-cad要解决的问题完全不同一个法兰盘的直径必须是精确的100.00mm四个安装孔的圆心必须分布在直径80mm的圆周上两个装配面上的公差要控制在0.05mm以内。这相当于从“看图讲故事”跨越到“按图纸施工”大模型需要理解的不只是“法兰盘长什么样”还包括尺寸约束、几何关系、加工可行性。像素世界里的“差不多”在CAD世界里就是废品。这个本质区别直接决定了后续所有技术方案的选择我们不能让模型直接“画”出一个形状而是要让它在结构化的数据格式里做精确推理。我最初测试这类工具时第一反应是让大模型直接输出一个STEP文件或者B-Rep几何体后来发现目前的模型还做不到这一步成功率和精度都不稳定。社区里真正能落地的方案大多是“曲线救国”让大模型生成参数化建模的代码再通过代码执行生成三维实体。1.2 三条主流技术路线怎么选目前我把市面上的方案归纳成三条主线这也是社区里讨论最多、实践最多的路线。路线A是文本到代码再到实体核心思路是让大语言模型生成OpenSCAD、CadQuery这类程序化建模工具的脚本然后利用这些工具自身的几何引擎去构建模型。这条路线的优势非常明显大模型最擅长的事情就是写代码而且生成的脚本天然带有参数后期修改只需要改几个变量不需要重新生成整个模型。OpenSCAD这类工具本身免费开源几何引擎轻量执行速度快跑一次只花几秒钟。缺点是不擅长处理复杂自由曲面遇到不规则外壳、雕塑类造型就捉襟见肘。路线B是文本到中间几何表示再到网格模型通常是利用大模型预测点云、隐式场或者有符号距离场再通过重建算法生成STL网格文件。这种方案的优势是能生成更自由的曲面造型但得到的STL网格本质上是三角形的离散逼近机器读到的是成千上万个三角形面片不是方程意义上的精确圆柱或圆孔。后续做CAM加工、有限元分析或者参数化修改都非常困难而且拓扑修复一直是痛点。路线C是端到端直接生成CAD原语序类似学术界做的那些基于Transformer的CAD生成模型不经过代码直接输出B-Rep面、拉伸、旋转等CAD操作序列。这是最接近“用文本直接生成CAD文件”的梦想路径但目前还停留在研究和特定数据集实验阶段工程可用性一般。三条路线的对比我整理成了一张表路线代表实现可编辑性精度成熟度适用场景文本→代码→实体LLM OpenSCAD/CadQuery高参数随改随用高代码决定精度目前最稳机械件、规则件、标准件文本→隐式场→网格扩散模型SDF重建低网格难以参数化中等受网格密度限制研究偏多自由曲面、概念造型文本→CAD原语序TransformerB-Rep中特征可辨识中等实验阶段数据集内的简单零件从我实测结果看工程落地首选路线A。还有一个很现实的原因路线A的输出形式是代码文本这意味着如果模型第一次生成的模型有问题你可以直接把报错信息反馈给它让它自己修正甚至手动改代码的几个数字。这种“人在回路里”的纠错能力对工程场景太宝贵了。1.3 可编辑性比生成能力更重要很多人第一次用text-to-cad的时候会被“生成成功”的瞬间吸引但真正在项目里用上之后你会发现可编辑性才是生死线。一个只能看不能改的STL网格价值约等于一张效果图一个带完整参数、能从特征树里修改尺寸的B-Rep模型才是能进入工程流程的东西。这也就是为什么STEP格式的地位如此关键。STEP是一种中立的CAD数据交换标准记录了精确的边界表示几何行业里的主流CAD软件都能识别它。当你通过CadQuery把脚本结果导出成STEP文件时保留的不只是“长得像一个法兰盘”的网格而是“这是一个直径100mm、厚度10mm、有4个直径8mm均布孔的法兰盘”这种语义级别的完整描述。后者才能真正进入装配设计、工程出图和CAM编程流程。反过来看如果生成的结果是网格模型哪怕画得再好看导入到SolidWorks或者FreeCAD里需要做的修复工作有时候比重建一个模型还要烦人。所以我的核心建议从一开始就很明确一切以生成可编辑的参数化模型为目标宁可生成的模型简单一点也不要让流程终结在“看上去还行”的阶段。2. 最小可行方案的完整实现路径2.1 工具链选型OpenSCAD与CadQuery的分工选工具这件事我不是没走过弯路。一开始我尝试过直接让大模型生成FreeCAD的Python宏代码结果经常是API调用错了、对象命名方式过时了、某个模块在新版本里被重命名了修起来很累。后来我改变思路在工具链里做了一次明确分工整体稳定性提升了一个量级。链条是这样的让大模型生成OpenSCAD代码先用OpenSCAD做快速预览确认几何形状符合预期再换成CadQuery重写关键零件导出STEP文件进入正式工程流程。OpenSCAD的特点是学习成本极低语法简单到像写数学公式大部分大模型已经见过海量OpenSCAD代码生成质量很稳定。而且它是基于CSG的思维模型一个零件就是几个基本体的布尔运算组合这对大模型来说是非常友好的输出形式。CadQuery则是一个Python库它采用了自底向上的B-Rep构建方式本质上是一个参数化的实体建模内核直接支持导出STEP。为什么最终阶段要落到CadQuery而不是直接用OpenSCAD导出因为OpenSCAD导出STEP的能力很弱通常只能导出STL网格而CadQuery的原生输出就是STEP这样的精确实体。这套组合拳下来生成、验证、交付三个阶段各有专职工具配合起来很顺畅。2.2 提示词设计先拆参数表再写代码在text-to-cad的实操里我发现提示词写得越复杂生成效果反而越差。最有效的方式是把自然语言需求先拆解成结构化的参数表再让模型基于这张表生成建模代码。下面这个模板是我反复调整后觉得最好用的用OpenSCAD生成一个参数化零件模型 - 零件类型法兰盘 - 主体尺寸外径100mm内径40mm厚度10mm - 特征中心凸台外径20mm高度3mm凸台中心有一个直径10mm的盲孔深度2mm - 安装孔4个通孔直径8mm孔心所在圆周直径80mm角度均匀分布 - 圆角外圈上下边缘倒角1mm - 单位全部使用毫米mm - 变量说明所有尺寸用变量定义变量名用英文小写加下划线仔细观察这个模板有几个关键点。第一它显式声明了单位避免大模型在mm和inch之间犯糊涂这个问题我踩过很多次。第二它明确要求“所有尺寸用变量定义”这个细节直接决定了生成结果是不是一个“真正能改参数”的模型。第三它把装配和孔位明确列出避免大模型凭想象加一些不存在的特征。我先让模型根据这段话输出它理解的参数表确认无误后再让它生成代码这个“先参数后代码”的流程可以显著减少“生成一时爽、改错火葬场”的情况。参数确认这一步看起来多花了一轮交互时间实际上帮你节省了后面反复重新生成的精力。2.3 一段能跑通的OpenSCAD脚本长什么样根据前面的参数表大模型通常会给出类似这样的脚本我稍微整理过可以直接复制运行$fn 64; flange_od 100; flange_id 40; flange_thickness 10; boss_od 20; boss_height 3; blind_hole_d 10; blind_hole_depth 2; bolt_hole_d 8; bolt_circle_d 80; bolt_count 4; chamfer 1; module flange() { difference() { union() { // 主体 cylinder(h flange_thickness, d flange_od); // 中心凸台 translate([0, 0, flange_thickness]) cylinder(h boss_height, d boss_od); } // 内孔 cylinder(h flange_thickness boss_height 1, d flange_id); // 凸台盲孔 translate([0, 0, flange_thickness boss_height - blind_hole_depth]) cylinder(h blind_hole_depth 0.1, d blind_hole_d); // 四个安装孔 for (i [0 : bolt_count - 1]) { rotate([0, 0, i * 360 / bolt_count]) translate([bolt_circle_d / 2, 0, -0.5]) cylinder(h flange_thickness 1, d bolt_hole_d); } } } flange();这里有几个新手特别容易踩的坑我必须解释一下。$fn 64控制圆柱的曲面细分精度如果这个数值太小比如默认的20生成出来的圆柱会变成明显的多边形柱体3D打印出来表面全是棱线如果太大布尔运算计算量会大增模型文件变大也没必要。64到100在绝大多数零件上够用了。另一个关键点是布尔运算里的“贯穿高度”。内孔圆柱的高度我写成了flange_thickness boss_height 1安装孔的高度写成了flange_thickness 1都刻意比被裁剪的主体多出一截。这是因为如果两个面恰好完全共面CSG布尔运算经常会出现破面、计算错误或者差集失败。多给一点贯穿深度也就是行业里常说的“干涉量”就能极大降低这类问题发生的概率这个技巧在OpenSCAD里几乎是居家旅行必备。预览的时候按下F5看快速渲染F6生成完整几何体确认形状无误后再进入下一环节。3. 从验证模型到工程交付STEP转换实操3.1 为什么不让STL成为流程终点当OpenSCAD预览没问题之后很多人会直接export成STL拿去切片打印或者发给别人。如果只是做一个视觉原型这条路勉强能走但我强烈建议在正式项目里再走一步把模型转换成STEP实体文件。我见过太多人拿着STL模型往SolidWorks或者Fusion 360里硬塞结果零件显示得歪歪扭扭想改一个孔直径却发现无从下手只能在网格重新建模的边缘疯狂试探。STL本质是“用大量小三角形去逼近曲面”它丢掉了所有几何语义。你无法从STL文件里读出“这是一个直径8mm的孔”你只看到一堆三角形的顶点坐标。任何需要精确几何信息的场景——CAM加工、有限元分析、装配体配合、出工程图——STL都不够用。STEP文件保存的是精确的边界表示包含曲面方程、边线关系、拓扑信息这才是真正的“实体模型”。如果你希望你的text-to-cad产物能用到真实的制造和装配环节从STL中转这条路必须绕开。3.2 CadQuery生成STEP的正确姿势既然要绕开STL就需要一个“几何引擎”来从代码直接构建实体模型。CadQuery是我目前认为跟LLM配合得最好的工具因为它本身是Python库大模型写Python代码的能力远比写STEP原生语法可靠。下面是一段跟我前面法兰盘参数对应的CadQuery脚本import cadquery as cq from cadquery import exporters flange_od 100.0 flange_id 40.0 flange_thickness 10.0 boss_od 20.0 boss_height 3.0 blind_hole_d 10.0 blind_hole_depth 2.0 bolt_hole_d 8.0 bolt_circle_d 80.0 bolt_count 4 # 从XY平面上的外圆开始拉伸主体 result ( cq.Workplane(XY) .circle(flange_od / 2.0) .extrude(flange_thickness) .faces(Z) .workplane() .circle(boss_od / 2.0) .extrude(boss_height) # 挖中心通孔 .faces(Z) .workplane() .hole(flange_id) ) # 在凸台顶面挖盲孔 result ( result.faces(Z) .workplane() .hole(blind_hole_d, blind_hole_depth) ) # 安装孔使用极坐标定位 for i in range(bolt_count): angle i * 360.0 / bolt_count x (bolt_circle_d / 2.0) * math.cos(math.radians(angle)) y (bolt_circle_d / 2.0) * math.sin(math.radians(angle)) result ( result.faces(Z) .workplane() .center(x, y) .hole(bolt_hole_d) ) exporters.export(result, flange.step)注意这个脚本里的工作平面切换逻辑。CadQuery的.faces(Z)是选取当前Z轴正方向最顶上的那个面然后在这个面上开新工作平面继续建模这就是“特征树”的概念。很多人第一次用CadQuery不习惯这种“选面、建平面、画草图、拉伸”的顺序但这恰恰是CAD建模的标准思路跟SolidWorks里“选面画草图再拉伸”一模一样。如果在执行过程中遇到API版本不匹配的报错不要慌直接把报错信息发给大模型让它根据报错修正代码通常一两轮就能跑通。这就是“文本→代码→实体”路线相比其他路线的最大优势整个流程是透明可调试的不是黑盒。3.3 FreeCAD里的几何检查和修复流程拿到STEP文件之后我习惯先在FreeCAD里做一次几何体检而不是直接拿去加工或装配。FreeCAD是免费开源的它的Part工作台自带CheckGeometry功能。导入STEP文件后选中模型运行Part菜单里的CheckGeometry它会检查模型是否存在无效拓扑、自交面、非流形边等问题。我常用的检查项主要是这几个体素数量是否异常、体积是否跟设计值吻合、边/面数量是否少得可疑。比如那个法兰盘设计体积可以手算——大圆盘体积加凸台体积去掉内部孔洞体积跟FreeCAD显示的数值对上了说明几何体基本没跑偏。如果显示体积和理论计算值差了几个数量级那就要小心多半是某个特征被布尔运算吃掉了或者根本没生成。FreeCAD的环境还会暴露一个STEP中最常见的问题单位不统一。有些step文件内部描述的单位是inch但大多数CAD软件默认按mm打开结果零件的实际大小直接变了2.54倍。我吃过这个亏之后每次在FreeCAD里打开STEP都会先看属性面板里的单位再用测量工具量一个已知尺寸的边做核对。如果单位不对FreeCAD里有“Unit”设置可以转换或者重新设定文档的默认单位。建议在使用任何text-to-cad产物前养成三个习惯第一检查单位第二检查体积和关键尺寸第三运行一次几何完整性检查。这三步花不了两分钟但能避免后面所有下游环节翻车。4. 生成模型时的高频问题与排查实战4.1 代码能运行但生成的模型跟预期完全对不上这个现象在text-to-cad里太常见了OpenSCAD代码没有报错预览窗口里的模型也“是个东西”但跟你脑子里的零件完全两回事。最有代表性的案例就是孔的位置不对或者角度反了。我遇到过一次要生成一个六孔法兰结果是六个孔全挤在一侧原因是旋转角度的单位问题OpenSCAD里rotate默认角度有人习惯性写圆周率π导致计算混乱。遇到这类问题第一步不是重新让模型生成代码而是检查参数表。把需求里的尺寸、数量、分布方式重新跟生成代码里的变量逐一核对。我通常的做法是把模型回复的参数表复制进一个markdown表格然后拿着这个表格逐项看生成的代码找到哪个变量跟表格数值对不上。这样一来问题基本上都能定位到某一个具体参数修复成本很低。4.2 布尔运算静默失败布尔运算失败是最隐蔽的坑因为程序不会报错但结果就是少了东西。例如difference()操作里裁剪体与主体存在共面、完全重合、或者法线方向反了某些几何内核会直接忽略这次裁剪操作或者计算出一个拓扑错误的怪东西。这里有一条经验所有用于修形的圆柱或者其他裁剪体高度方向都留出余量。我一直坚持“贯穿件要比被剪体更长”的建模习惯比如一个10mm厚的盘打孔用的圆柱高度写成11mm甚至12mm保证两端都穿出去。用这样的思维去检查模型凡是发现“该挖的没挖掉”首先排查共面和贯穿深度90%以上都能解决。4.3 STEP文件导入其他CAD软件后错乱了如果你严格按照我前面说的CadQuery方案生成STEP导入其他软件报错的概率已经低了很多但还没有完全归零。比较常见的是导入到某个比较挑食的CAD软件后部分曲面显示不出来或者装配体里某个零件的坐标系跑偏了。我排查这类问题一般从两个角度下手。第一是STEP的协议版本导出时优先使用AP214格式这个版本对颜色和几何支持更全面绝大多数主流CAD软件兼容性最好CadQuery的export函数支持指定协议。第二是导出精度设置如果公差设置太严格文件体积会暴涨一些软件处理也会有性能问题我用默认设置即可。如果导入后还是错乱还有一个笨办法但很有效用FreeCAD重新打开STEP再原样导出一次相当于做了一次中立格式的“洗文件”操作。很多时候文件重新过一遍FreeCAD的拓扑修复就能把细小的几何瑕疵修掉。4.4 提高生成成功率的几条实战经验我把这段时间积累下来最有效率的操作习惯整理了一下。第一一次只生成一个零件。让大模型直接生成整个装配体的脚本大概率会因为在部件之间的配合关系上栽跟头最好的策略是一个零件一个零件地生成最后在CAD里装配。第二参数表先行并坚持让它确认。你多花的那一轮交互换来的是对几何约束理解的校准这笔账非常划算。第三修改时只改变量不要重新生成整个脚本。如果模型已经在OpenSCAD里用变量定义了所有尺寸那加一个孔、改一个直径就是改数字不需要让大模型重新推理一遍整个模型。第四准备一个小的测试集。我自己常备三个验证用例一个带均布孔的圆盘、一个带倒角和螺纹孔的支架、一个带T型槽的滑块。每次换新提示词模板或者新模型版本先拿这三个用例测一下输出质量比直接拿真实项目去试错高效得多。5. 应用场景与扩展方向5.1 当前最适合落地的几个场景结合我自己的测试和企业里的反馈text-to-cad目前最适合的领域是那些“结构明确、参数成体系”的机械零部件。3D打印玩家的需求是最直接的比如要做一个相机支架、线缆固定座、传感器安装板用自然语言描述尺寸和孔位生成的脚本直接能切片打印整个链路非常顺滑。机械设计前期的概念验证也很值得关注。设计师在设计评审阶段需要快速拿出几个结构方案对比以前要在建模软件里手动做现在让text-to-cad出一版参数化的基础模型再在CAD里改关键尺寸效率提升非常明显。标准件和重复性高的零件库生成也是好方向。企业中大量使用的法兰、垫片、导轨安装座、电控箱底板等标准件其实都有明确的行业尺寸规范把这些规范喂给大模型配合成熟的参数化脚本模板批量生成带标准尺寸的模型完全可行。当然投产前还是要经过专业审核大模型的输出只能当草图不能当最终图纸。5.2 暂时不要碰的硬骨头有三类场景我劝你先别期待过高。第一类是复杂自由曲面产品设计比如消费电子外壳、汽车覆盖件这些需要的是A级曲面质量目前基于CSG代码的方案无法胜任。第二类是大型装配体的整体生成零件一多配合约束成倍增长以现在的模型能力维持生成一致性的难度很大老老实实分零件生成再装配。第三类是对安全性有严格要求的承力结构件AI生成的几何体哪怕通过了软件检查也一定要经过专业强度分析和人工复核。理解边界不是泼冷水而是帮你把期望值放在正确的区间。技术趋势上随着专门化的CAD生成模型逐步成熟text-to-cad能覆盖的几何形态范围肯定会越来越大。但就当下而言把这条链路当作“设计助理”而不是“自动设计系统”预期和实际收益之间就能达成很好的平衡。6. 我最后想多说几句这套工具链我测试过好几轮之后最大的体会是text-to-cad的用法应当定位为“会写代码的实习生”而不是“不用下厂的老师傅”。它擅长的是把明确的几何需求翻译成参数化脚本帮你把重复的、机械化的建模工作省下来让你把精力集中在真正需要工程判断的环节。如果你刚开始接触这个方向我的建议是从最简单的零件入手按文章里的步骤把OpenSCAD预览、CadQuery导出STEP、FreeCAD几何检查这套闭环跑通。遇到生成的模型不合心意先别急着换工具链试着把需求描述得更“可计算”一点——把“厚一点”改成“厚度10mm”把“几个孔”改成“4个直径8mm、均匀分布在直径80mm圆上的孔”。你会发现模型生成质量提升最快的时刻往往不是换了一个更强的模型而是你学会了用结构化的方式描述几何需求。这个能力本身恐怕比工具本身更值钱。