text-to-cad 实战:从自然语言到 STEP 模型的技术链路与工程实践
发布时间:2026/10/26 23:50:40 锦皓数字建站

1. 从一句话到三维模型text-to-cad 到底在解决什么问题第一次听到 text-to-cad 这个词很多做机械设计或者三维建模的朋友第一反应是又来个噱头。毕竟我们习惯了在 CAD 软件里一根线一根线地画一个约束一个约束地加突然说打一行字就能出模型听起来像是把设计师的饭碗往地上摔。但实际用下来你会发现它压根不是来替代谁的它解决的是一个非常具体的痛点——从“脑子里有个大概形状”到“屏幕上有个能看能改的几何体”之间那段最枯燥的重复劳动。举个很常见的场景。客户在电话里说“我想要一个法兰盘外径 120内径 60厚度 15均匀分布 6 个直径 10 的孔孔心圆直径 90。”你听完之后打开 SolidWorks 或者 FreeCAD新建草图画圆标注拉伸再画孔阵列倒角……一套下来熟练工也得五六分钟。但如果有一个工具能让你把上面那句话直接敲进去三秒钟生成一个 STEP 文件你只需要打开检查一下尺寸对不对微调一下倒角是不是省事多了text-to-cad 干的就是这个活。它把自然语言描述翻译成 CAD 内核能理解的几何指令输出标准格式如 STEP、GLB、STL然后你拿着这些文件继续在专业软件里做后续处理。这个方向适合谁呢我总结了三类人最值得关注。第一类是经常需要做概念验证的机械工程师前期方案阶段不需要精确到公差只需要快速把想法可视化拿去和团队讨论。第二类是做 3D 打印的创客脑子里有个小零件想打出来但不想为了一个简单的支架去学半个月的 CAD 操作。第三类是做参数化设计研究的开发者想看看大语言模型在几何推理方面到底能做到什么程度text-to-cad 是一个非常好的试验场。但这里必须先把预期说清楚。text-to-cad 目前的能力边界非常明确它擅长生成规则几何体——圆柱、长方体、孔、阵列、简单的布尔运算组合。你让它生成一个复杂的自由曲面比如汽车车身或者涡轮叶片它基本无能为力。这不是模型不够聪明的问题而是自然语言本身就不适合描述复杂曲面。你试试用文字描述一个 A 级曲面的控制点分布写三千字也说不清楚。所以它的定位是快速原型和简单零件生成不是替代高精度建模。还有一个关键点text-to-cad 输出的 STEP 文件是边界表示B-rep不是网格。这意味着你拿到的是一个有精确数学定义的实体可以在任何主流 CAD 软件里继续做特征操作比如打孔、倒角、抽壳。而 STL 和 GLB 是网格格式适合 3D 打印和可视化展示但不适合做精确的工程修改。理解这个区别你才知道什么时候该用哪种输出格式。2. 拆开看核心text-to-cad 的技术链路与关键选型2.1 从文字到几何中间到底发生了什么很多人以为 text-to-cad 就是一个大模型直接输出一个模型文件其实中间隔了好几层。我把它拆成四个阶段每个阶段都有不同的技术选型和坑。第一阶段是意图解析。你输入的那句“外径 120 内径 60 厚度 15 的圆环”模型需要识别出这是一个圆环体提取出三个关键参数并且理解它们分别对应外径、内径和厚度。这一步用的是大语言模型的自然语言理解能力但光理解还不够它还得把参数映射到正确的几何属性上。我试过一些早期的实现经常把“内径”和“外径”搞反或者把“厚度”理解成“高度”生成出来的东西完全不对。第二阶段是几何表示转换。解析出来的参数需要变成一种中间表示。目前主流有两种路线一种是基于代码的表示比如生成 OpenSCAD 脚本或者 CadQuery 的 Python 代码另一种是基于约束图的表示直接输出一个几何约束网络。基于代码的路线更成熟因为大语言模型本身就很擅长写代码而且 CadQuery 和 OpenSCAD 都有清晰的文档和语法规则模型容易学会。基于约束图的路线更接近 CAD 内核的原生逻辑但训练数据少实现难度大。第三阶段是几何内核执行。中间表示被送入几何内核比如 OpenCASCADE 或者 CGAL执行实际的布尔运算、倒角、抽壳等操作生成精确的 B-rep 实体。这一步的稳定性取决于内核本身跟大模型关系不大。但这里有个隐藏问题大模型生成的代码可能语法正确但几何上不可行比如要求在一个厚度为 2mm 的板上打一个深度 5mm 的盲孔内核会直接报错。第四阶段是格式导出。B-rep 实体可以导出为 STEP网格化之后可以导出为 STL 或 GLB。STEP 适合工程用途STL 适合 3D 打印GLB 适合网页展示。导出参数比如网格精度、法线计算方式会直接影响 STL 文件的质量和大小。2.2 为什么选 CadQuery 而不是 OpenSCAD如果你要自己搭一套 text-to-cad 流程中间表示选什么直接决定了后续的开发难度和生成质量。我两种都试过最后偏向 CadQuery原因有几个。OpenSCAD 的语法更简单本质上是一种声明式的 CSG构造实体几何语言写起来像这样difference() { cylinder(h15, d120, centertrue); cylinder(h16, d60, centertrue); for (i [0:5]) { rotate([0, 0, i*60]) translate([45, 0, 0]) cylinder(h16, d10, centertrue); } }这段代码生成的就是前面说的那个法兰盘。语法很直观大模型学起来也快。但 OpenSCAD 的局限在于它只支持网格操作导出的 STL 是三角面片没有精确的 B-rep 表示。你没法在 SolidWorks 里打开一个 OpenSCAD 生成的模型然后修改孔的直径因为它已经变成了一堆三角形。CadQuery 则不同它基于 OpenCASCADE 内核生成的是真正的 B-rep 实体。同样的法兰盘CadQuery 代码是这样的import cadquery as cq result ( cq.Workplane(XY) .circle(60) .circle(30) .extrude(15) .faces(Z) .workplane() .polarArray(45, 0, 360, 6) .hole(10) )这段代码生成的实体可以导出为 STEP在任意 CAD 软件里打开后你能看到特征树能修改孔的直径能添加新的倒角。这才是工程上可用的东西。代价是 CadQuery 的学习曲线比 OpenSCAD 陡一些而且大模型生成 CadQuery 代码的出错率略高因为它的 API 更复杂。我的建议是如果你只做 3D 打印OpenSCAD 够用如果你要做工程交付必须上 CadQuery 或者直接调 OpenCASCADE 的 API。中间没有太多折中方案。2.3 STEP、GLB、STL 三种格式到底怎么选输出格式的选择经常被忽略但它直接影响你后续的工作流。我整理了一个对比表方便你快速判断。格式类型典型用途优点缺点STEPB-rep工程交付、CAD 修改精确几何、可编辑特征文件较大、需要专业软件打开STL网格3D 打印、快速预览通用性强、几乎所有切片软件都支持无精确几何、修改困难GLB网格网页展示、AR/VR包含材质和颜色、加载快不适合工程用途、精度有限实际使用中我通常会让 text-to-cad 流程同时输出 STEP 和 STL。STEP 用来存档和后续修改STL 直接丢进切片软件看效果。GLB 只在需要做网页演示的时候才导出因为它的材质系统跟工程无关反而会增加文件复杂度。注意STL 导出时的网格精度参数非常关键。精度设得太低圆柱面会变成明显的多边形设得太高文件体积爆炸。一般建议线性偏差控制在 0.01mm 到 0.05mm 之间角度偏差控制在 0.5 弧度以内。具体数值取决于你的零件尺寸和打印精度。3. 动手搭一套可用的 text-to-cad 流程3.1 环境准备与依赖安装如果你想自己跑通一套 text-to-cad 流程最省事的起点是 Python 生态。CadQuery 有完整的 Python 包大模型调用也有成熟的 SDK。我下面以本地运行为例讲一下具体的环境配置。首先创建一个干净的虚拟环境避免跟系统里的其他包冲突python -m venv text2cad-env source text2cad-env/bin/activate # Windows 下用 text2cad-env\Scripts\activate然后安装核心依赖。CadQuery 的安装稍微麻烦一点因为它依赖 OpenCASCADE 的 Python 绑定。推荐用 conda 安装比 pip 省心很多conda install -c conda-forge cadquery如果你坚持用 pip可以试试pip install cadquery但我在 Windows 上遇到过 OpenCASCADE 动态库找不到的问题最后还是换回了 conda。安装完成后跑一句简单的测试确认环境正常import cadquery as cq box cq.Workplane(XY).box(10, 10, 10) cq.exporters.export(box, test.step) print(CadQuery 环境正常)如果当前目录下生成了一个 test.step 文件说明几何内核工作正常。接下来安装大模型调用相关的包具体用哪家看你的偏好这里不展开。3.2 提示词工程怎么让模型生成可执行的几何代码这是整个流程里最需要经验的部分。大模型不是万能的你给它的提示词质量直接决定生成代码的可用性。我踩了无数坑之后总结出一个比较稳的提示词模板结构。第一段是角色设定告诉模型它是一个 CAD 代码生成器只输出 CadQuery 代码不要解释不要多余文字。第二段是可用 API 列表把 CadQuery 里常用的方法列出来比如box、cylinder、hole、fillet、chamfer、polarArray、rectangularArray并给出每个方法的参数含义。第三段是输出格式约束要求代码以import cadquery as cq开头以result ...结尾中间不要有 print 语句。第四段才是用户的实际描述。我实测下来加上 API 列表之后代码一次通过率能从不到 40% 提升到 70% 以上。原因很简单大模型虽然见过 CadQuery 的代码但它的训练数据里 CadQuery 的版本可能比较老API 有变化。你明确告诉它当前版本支持哪些方法它就不会瞎编。还有一个技巧把复杂零件拆成多个简单特征的组合。比如你要生成一个带法兰的轴不要一句话描述完而是分成三步先生成一个圆柱轴再在底部生成一个法兰盘最后在法兰上打孔。每一步单独生成代码最后用布尔运算合并。这样即使某一步出错也容易定位和修复。3.3 完整实操从一句话到 STEP 文件下面我走一遍完整的流程生成一个带安装孔的 L 型支架。这个例子涵盖了拉伸、打孔、倒角和阵列比较有代表性。第一步构造提示词。我实际用的提示词是这样的你是一个 CadQuery 代码生成器。根据用户的描述生成可执行的 CadQuery Python 代码。 可用 API - Workplane(XY) 创建草图平面 - .rect(w, h) 绘制矩形 - .circle(r) 绘制圆 - .extrude(d) 拉伸 - .faces(Z) 选择顶面 - .workplane() 在工作面上创建新草图 - .hole(d) 打孔 - .fillet(r) 倒圆角 - .edges(|Z).fillet(r) 对垂直边倒圆角 - .polarArray(radius, startAngle, angle, count) 极坐标阵列 - .rectangularArray(xSpacing, ySpacing, xCount, yCount) 矩形阵列 输出要求只输出 Python 代码以 import cadquery as cq 开头以 result ... 结尾。 用户描述生成一个 L 型支架。底板长 80宽 60厚度 8。竖板在底板的一条长边上高度 50厚度 8。底板四个角各有一个直径 6 的安装孔孔心距边缘 10。所有外角倒圆角 R3。第二步把提示词发给模型拿到代码。我实际收到的代码大致如下import cadquery as cq # 底板 base ( cq.Workplane(XY) .rect(80, 60) .extrude(8) ) # 竖板 vertical ( cq.Workplane(XZ) .rect(80, 50) .extrude(8) ) # 合并 result base.union(vertical) # 倒圆角 result result.edges(|Z).fillet(3) # 打安装孔 result ( result.faces(Z) .workplane() .rect(60, 40, forConstructionTrue) .vertices() .hole(6) ) cq.exporters.export(result, bracket.step)第三步检查代码。这里有几个地方需要人工确认竖板的位置是否正确Workplane(XZ)创建的平面在 Y0 处拉伸方向是 Y 轴正方向所以竖板会从底板的前边缘向后延伸 8mm这符合“竖板在底板的一条长边上”的要求。安装孔的位置用构造矩形的方式定位矩形尺寸 60x40顶点坐标是 (±30, ±20)对应底板边缘的距离是 40-3010 和 30-2010正好符合“孔心距边缘 10”的要求。第四步运行代码。如果一切正常当前目录下会生成 bracket.step。用 FreeCAD 或者任意在线 STEP 查看器打开确认几何形状无误。第五步导出 STL 用于 3D 打印cq.exporters.export(result, bracket.stl, tolerance0.02, angularTolerance0.3)这里的tolerance是线性偏差angularTolerance是角度偏差。对于这个尺寸的支架0.02mm 的线性偏差已经足够精细STL 文件大概在 200KB 左右切片软件处理起来毫无压力。3.4 参数化调整让生成结果可复用text-to-cad 最大的价值不是生成一次性的模型而是生成可参数化的代码。你拿到 CadQuery 代码之后可以把关键尺寸提取成变量以后改参数就能重新生成不需要再跟大模型对话。比如上面的支架代码我可以改成这样import cadquery as cq BASE_L 80 BASE_W 60 BASE_T 8 VERT_H 50 VERT_T 8 HOLE_D 6 HOLE_EDGE 10 FILLET_R 3 base cq.Workplane(XY).rect(BASE_L, BASE_W).extrude(BASE_T) vertical cq.Workplane(XZ).rect(BASE_L, VERT_H).extrude(VERT_T) result base.union(vertical) result result.edges(|Z).fillet(FILLET_R) hole_x BASE_L - 2 * HOLE_EDGE hole_y BASE_W - 2 * HOLE_EDGE result ( result.faces(Z) .workplane() .rect(hole_x, hole_y, forConstructionTrue) .vertices() .hole(HOLE_D) ) cq.exporters.export(result, bracket.step)这样你只需要改最上面的几个数字就能生成不同尺寸的支架。我通常会把这类参数化脚本存成一个模板库下次遇到类似零件直接改参数就行比重新跟大模型对话快得多而且结果完全可控。4. 踩坑实录text-to-cad 常见问题与排查技巧4.1 模型生成的代码跑不通怎么办这是最常见的问题没有之一。大模型生成的 CadQuery 代码大概有 20% 到 30% 的概率会报错原因五花八门。我整理了一个排查顺序按这个顺序走基本能解决九成以上的问题。先看报错类型。如果是AttributeError说明模型用了不存在的 API 方法比如把polarArray写成了polar_array或者用了旧版本的Workplane方法。这时候你需要把报错信息连同代码一起发回给模型让它修正。如果是ValueError或者Standard_Failure说明几何运算本身有问题比如倒角半径太大导致几何退化或者布尔运算的两个实体没有相交。这时候需要调整参数而不是改代码结构。再看几何合理性。有时候代码能跑通但生成的模型是空的或者只有一个面。这通常是因为草图没有闭合或者拉伸方向反了。我遇到过一次模型生成的代码里extrude的参数是负数结果实体往反方向拉伸跟另一个实体完全没有交集布尔并集之后只剩下一个实体。这种问题不会报错但结果明显不对需要你打开模型看一眼。最后看单位。CadQuery 默认单位是毫米但有些模型会假设单位是米或者英寸。如果你发现生成的模型尺寸差了 1000 倍大概率是单位问题。在提示词里明确写“所有尺寸单位为毫米”能避免大部分单位混乱。4.2 复杂形状生成失败怎么拆解前面说过text-to-cad 不擅长复杂曲面。但即使是规则几何体如果特征太多一次性生成的成功率也会急剧下降。我的经验是超过五个特征就拆成多步。举个例子你要生成一个带散热片的电机外壳。这个零件包含圆柱主体、中心轴孔、六个散热片、四个安装耳、每个安装耳上有一个孔。总共十几个特征。一次性让模型生成基本必挂。但如果你拆成三步第一步生成圆柱主体和轴孔第二步生成散热片并阵列第三步生成安装耳和孔每一步单独生成代码最后用布尔运算合并成功率会高很多。拆解的时候要注意基准统一。每一步生成的实体最好都以原点为中心或者以同一个基准面为参考。否则合并的时候位置对不上你还得手动调整坐标。我通常会在提示词里明确要求“所有实体以原点为中心Z 轴为拉伸方向”这样合并的时候直接做并集就行。4.3 导出的 STL 文件太大或太粗糙STL 文件的质量完全由导出参数决定。CadQuery 的export函数有两个关键参数tolerance和angularTolerance。tolerance控制线性偏差单位是毫米angularTolerance控制角度偏差单位是弧度。我做过一组对比测试同一个法兰盘模型不同参数下的 STL 文件大小和三角面片数量如下tolerance (mm)angularTolerance (rad)文件大小三角面片数视觉效果0.10.545 KB约 800圆柱面有明显棱角0.050.3120 KB约 2200圆柱面较平滑0.010.1680 KB约 12000肉眼几乎看不出棱角0.0050.052.4 MB约 48000过度精细打印用不上对于大多数 3D 打印场景tolerance0.02到0.05、angularTolerance0.2到0.3是比较平衡的选择。如果你要做高精度的装配验证可以降到tolerance0.01但文件会大很多。我的建议是先用粗参数导出一版看形状确认无误后再用细参数导出最终版本。注意STL 文件只包含三角面片信息不包含颜色、材质、单位。如果你把 STL 发给别人对方不知道你的单位是毫米还是英寸。所以最好在文件名里标注单位比如bracket_mm.stl避免沟通成本。4.4 常见问题速查表问题现象可能原因排查方法解决方式代码报 AttributeErrorAPI 名称错误或版本不匹配检查报错行的方法名把报错信息发回模型修正或手动替换为正确 API模型为空或只有一个面草图未闭合、拉伸方向错误打开模型查看几何检查草图是否闭合确认拉伸方向尺寸差 1000 倍单位混淆测量模型实际尺寸提示词中明确单位导出前检查倒角失败倒角半径大于相邻边长度检查倒角位置的几何尺寸减小倒角半径或先倒角再打孔布尔运算失败实体没有相交或完全重合检查两个实体的位置关系调整位置使它们有明确的重叠区域STL 文件过大网格精度参数太细查看文件大小和面片数增大 tolerance 和 angularToleranceSTL 表面粗糙网格精度参数太粗观察圆柱面是否有多边形棱角减小 tolerance 和 angularTolerance5. 进阶玩法把 text-to-cad 接入你的日常工作流5.1 批量生成与自动化如果你经常需要生成一系列相似但尺寸不同的零件text-to-cad 可以跟脚本结合实现批量生成。思路很简单把参数写成一个列表循环调用生成函数每次输出不同的 STEP 和 STL 文件。比如你要生成一系列不同长度的轴直径固定 20mm长度从 50mm 到 200mm步长 10mm。用 CadQuery 写一个循环就行import cadquery as cq for length in range(50, 210, 10): shaft ( cq.Workplane(XY) .circle(10) .extrude(length) .edges(|Z) .fillet(1) ) cq.exporters.export(shaft, fshaft_L{length}.step) cq.exporters.export(shaft, fshaft_L{length}.stl, tolerance0.02)这段代码会生成 17 个 STEP 文件和 17 个 STL 文件每个文件的长度不同。如果你用 text-to-cad 生成基础代码然后手动改成参数化循环效率比一个个跟模型对话高得多。5.2 与现有 CAD 软件的配合text-to-cad 生成的 STEP 文件可以直接导入 SolidWorks、Fusion 360、FreeCAD、中望 CAD 等主流软件。导入之后你看到的是一个无特征历史的实体也就是说你不能直接修改某个孔的直径因为软件不知道那个孔是怎么来的。但这不影响你在此基础上添加新的特征比如倒角、抽壳、打新的孔。如果你需要修改 text-to-cad 生成的原始特征有两个办法。一是回到 CadQuery 代码改参数重新生成。二是用 CAD 软件的直接建模功能比如 SolidWorks 的 Move Face 或者 Fusion 360 的 Push/Pull直接拖动面来修改尺寸。前者更精确后者更灵活看你的具体需求。我个人的习惯是概念阶段用 text-to-cad 快速生成确认方案后用 CAD 软件重新建模。因为 text-to-cad 生成的模型虽然几何正确但特征树是扁平的不利于后续的工程管理和版本控制。正式交付的模型还是要在专业软件里从头建一遍确保每一步特征都清晰可追溯。5.3 精度与公差的现实边界必须说清楚一点text-to-cad 目前不适合生成有严格公差要求的零件。它生成的几何是名义尺寸没有公差标注没有配合关系没有表面粗糙度。你拿它做一个概念模型没问题但如果你要拿去加工必须导入 CAD 软件重新标注公差。我试过让模型生成一个“直径 10 毫米的轴公差 h7”它生成的还是一个直径 10 的圆柱没有任何公差信息。因为 STEP 格式本身可以携带公差信息但 CadQuery 的 API 不直接支持公差标注大模型也没有能力理解公差配合的工程含义。所以我的建议是text-to-cad 负责几何形状的快速生成公差和工程标注交给专业 CAD 软件。两者是互补关系不是替代关系。你省下的是画草图的时间不是做工程决策的时间。6. 我个人的一些实操体会用了大半年 text-to-cad 之后我最大的感受是它改变的不是建模的方式而是思考的方式。以前我打开 CAD 软件第一件事是选基准面然后开始画草图。现在我会先想清楚这个零件的关键特征是什么用一句话能不能说清楚。如果说不清楚说明我自己还没想明白那就先想明白再动手。另一个体会是提示词的质量比模型的能力更重要。同一个模型我用不同的提示词生成代码的成功率能差三倍。我现在的习惯是每次生成之前先花两分钟写提示词把关键尺寸、特征顺序、输出格式都写清楚。这两分钟能省下后面二十分钟的调试时间。还有一个坑我踩过好几次不要完全信任模型生成的尺寸。有一次我让模型生成一个“内径 50 外径 80 的垫圈”它生成的代码里内径和外径的数值是对的但单位搞成了厘米结果模型大了十倍。从那以后我每次生成完都会用卡尺量一下关键尺寸确认无误再往下走。最后说一个我觉得最有价值的用法用 text-to-cad 做设计探索。以前我做一个新零件要在 CAD 里试好几种方案每次都要重新画。现在我可以快速生成三四个不同方案的 STEP 文件导入软件里对比选中最合适的那个再细化。这种快速迭代的感觉是传统建模方式给不了的。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。