恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

text-to-cad 实战:从自然语言到 STEP 模型的自动化链路搭建

  • 首页
  • 资讯中心
  • /
  • text-to-cad 实战:从自然语言到 STEP 模型的自动化链路搭建

相关资讯

caveman:用Conventional Commits自动生成规范的Git提交信息 2026/10/8 21:32:31
Java Web博客系统源码实战:从Servlet到RSS的完整技术解析 2026/10/8 21:32:31
VS Code效率革命:Superpowers扩展包安装配置全攻略 2026/10/8 21:32:31

最新资讯

AI Agent工程实战:从七要素到七个决策点的系统设计指南
PHP htmlentities()函数用法讲解
大模型Agent开发入门:从工具调用循环到落地避坑指南
多模态大模型全栈能力拆解:从数据对齐到弹性推理
AI编程智能体实战:从写代码到指挥代码的架构与落地
1Panel v2.1.2:智能体增强与应用商店升级,重塑服务器运维体验

今日推荐

AI编程智能体实战:从写代码到指挥代码的架构与落地
多模态大模型全栈能力拆解:从数据对齐到弹性推理
大模型Agent开发入门:从工具调用循环到落地避坑指南

本周热门

MR25H40CDF + PIC18F65K40:工业记录仪高可靠存储实战
基于STM32的数控恒压恒流电源设计:从硬件到PID调参全解析
LT9211 MIPI重定时器原理与双路扇出实战指南

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

text-to-cad 实战:从自然语言到 STEP 模型的自动化链路搭建

发布时间:2026/10/8 21:37:32
text-to-cad 实战:从自然语言到 STEP 模型的自动化链路搭建 1. 从一句话到三维模型text-to-cad 到底在解决什么问题第一次听到 “text-to-cad” 这个词很多人脑子里蹦出来的画面大概是对着电脑说一句“给我画个法兰盘”屏幕上就自动出现一个带螺栓孔的 STEP 模型。这个想象方向没错但真正落地的时候它解决的问题比“省几下鼠标”要深得多。text-to-cad 本质上是一条从自然语言描述到 CAD 几何文件的自动化链路。你输入一段文字比如“一个 80mm × 60mm × 5mm 的矩形底板四角各有一个直径 6mm 的通孔孔中心距边缘 10mm”系统输出一个可以被 CAD 软件打开的模型文件常见格式包括STEP、GLB、STL。这三个格式分别对应不同的下游用途STEP 用于精确的工程制造和后续参数化编辑GLB 用于可视化展示和 Web 端渲染STL 用于 3D 打印和网格处理。这件事的价值在哪里我举个实际场景。做非标设备的朋友应该都有体会项目前期经常要出几十个简单的安装板、连接件、支架的方案。这些零件结构不复杂但一个个在 CAD 里拉伸、打孔、倒角重复劳动量极大。如果能把“描述”直接变成“模型”哪怕只是初版也能把大量时间从画图转移到真正的结构设计上。另一个场景是 3D 打印爱好者很多人并不熟练 CAD 操作但脑子里有明确的想法text-to-cad 就是他们和制造之间的翻译器。适合看这篇内容的人有三类一是想了解 AI 辅助设计到底能做到什么程度的工程师二是想自己搭一套 text-to-cad 流程的开发者三是做机械、建筑、工业设计相关工作的从业者想判断这个方向值不值得投入时间。我不会只讲概念重点会放在这条链路怎么搭、每一步为什么这么选、实际跑起来会遇到什么坑。需要先说明一点text-to-cad 目前不是一个开箱即用的成熟软件它更像是一种技术组合思路。核心环节包括语言理解、几何参数提取、CAD 脚本生成、格式转换四个部分。下面我按实际搭建的顺序把每个环节拆开讲。2. 整体方案怎么搭四种主流路线的取舍分析2.1 路线一大模型直接生成 CAD 脚本这是目前最直观的思路。让大语言模型读取你的文字描述直接输出一段 CAD 软件的脚本代码比如 FreeCAD 的 Python 脚本、OpenSCAD 的代码或者 AutoCAD 的 AutoLISP。脚本执行后生成三维模型再导出成 STEP 或 STL。这条路线最大的优势是灵活。只要模型能写出脚本理论上就能生成。OpenSCAD 尤其适合这种玩法因为它本身就是“代码即模型”的范式一个立方体就是cube([80,60,5])一个圆柱孔就是cylinder(d6,h5)大模型对这类结构化代码的生成能力相当不错。但问题也很明显。大模型生成脚本的几何正确性无法保证。它可能把孔的位置算错可能把布尔运算的顺序写反也可能生成语法正确但几何上自相交的模型。我实测下来简单零件十个特征以内的一次成功率大概在六成左右复杂零件基本都要人工修正。所以这条路线适合快速出草稿不适合直接用于生产。2.2 路线二自然语言转参数表再驱动模板这条路线更工程化。先让模型把文字描述解析成一张结构化的参数表比如 JSON 格式包含长宽高、孔位坐标、孔径、圆角半径等字段。然后用这张参数表去填充一个预先写好的 CAD 模板脚本。{ type: plate, length: 80, width: 60, thickness: 5, holes: [ {x: 10, y: 10, d: 6}, {x: 70, y: 10, d: 6}, {x: 10, y: 50, d: 6}, {x: 70, y: 50, d: 6} ] }这样做的好处是可控性极强。模板是你自己写的几何逻辑经过验证模型只负责填参数出错概率大幅降低。缺点是覆盖面有限模板没覆盖的零件类型就处理不了。适合产品线相对固定的场景比如专门做钣金件、专门做型材连接件。2.3 路线三调用专业 CAD 的 APIFreeCAD、Fusion 360、SolidWorks 都提供了 API 接口。你可以让大模型生成 API 调用代码直接操作 CAD 内核建模。FreeCAD 的 Python API 是开源方案里最成熟的选择Part.makeBox、Part.makeCylinder、Part.cut这些方法可以完成大部分基础建模操作。这条路线生成的是真正的 B-rep 实体导出 STEP 后精度和原生 CAD 建模一致可以直接用于加工。代价是 API 学习曲线陡而且大模型对 FreeCAD API 的熟悉程度不如对 OpenSCAD 那么高生成的代码经常需要查文档修正。2.4 路线四文本到图像再到三维重建还有一条偏视觉的路线先用文生图模型生成零件的多视角渲染图再用三维重建算法如多视图立体视觉或神经辐射场还原出网格模型最后导出 STL 或 GLB。这条路线的优点是不依赖 CAD 脚本能力理论上任何形状都能处理。但缺点致命重建出来的模型是网格不是参数化实体没有精确的尺寸孔可能不圆平面可能不平。用于 3D 打印的视觉展示还行用于工程制造基本不可用。所以我不推荐把它作为 text-to-cad 的主路线最多作为辅助手段。路线核心方式输出精度实现难度适用场景大模型直接生成脚本LLM 输出 OpenSCAD/FreeCAD 代码中低快速草稿、简单零件参数表驱动模板LLM 解析参数 预写模板高中产品线固定的批量零件调用 CAD APILLM 生成 API 调用代码高高需要精确 STEP 的工程件文本到图像到三维文生图 三维重建低中视觉展示、概念预览我个人的建议是以路线二为主路线一为辅。日常用参数表驱动模板保证稳定性遇到模板覆盖不了的形状时退回路线一让模型直接写脚本人工检查后再用。这样兼顾了效率和可靠性。3. 核心环节拆解从文字到 STEP 的每一步3.1 语言理解与几何参数提取这一步的目标是把一段人话变成机器能处理的参数。听起来简单实际是整个链路里最容易出问题的环节。原因在于工程描述里充满了隐含信息。比如“四角各有一个通孔孔中心距边缘 10mm”人一看就懂但机器需要明确四个角的坐标分别是多少如果板子是 80×60那四个孔的中心坐标就是 (10,10)、(70,10)、(10,50)、(70,50)。这个换算需要模型理解“距边缘”的含义并且知道坐标系原点在左下角。再比如“孔要打通”这意味着孔的深度等于板厚而不是一个固定值。如果描述里说“沉头孔”那还需要额外的沉头直径和深度参数。这些工程语义是参数提取的难点。我的做法是在提示词里给模型一个参数 schema明确告诉它需要输出哪些字段每个字段的含义和单位。比如请将以下描述解析为 JSON字段包括 - length, width, thickness单位 mm - holes数组每个元素包含 x, y, d孔径可选 counterbore_d沉头直径 - fillets圆角半径数组 - material材料名称可选给了 schema 之后模型输出的结构化程度会大幅提升。但即便如此单位换算仍然要小心。有些人说“8 厘米”有些人说“80mm”模型有时候会混。我通常会在提示词里强制要求“所有尺寸统一转换为毫米”。注意参数提取完成后一定要做一次范围校验。比如孔径不能大于板宽孔位不能超出边界厚度不能为负数。这些校验用几行 Python 就能写但能挡掉大部分低级错误。3.2 CAD 脚本生成与几何构建参数拿到之后就要生成几何了。以 FreeCAD 为例一个带孔底板的构建逻辑是这样的import FreeCAD as App import Part doc App.newDocument() plate Part.makeBox(80, 60, 5) for hole in holes: cylinder Part.makeCylinder( hole[d] / 2, 5, App.Vector(hole[x], hole[y], 0) ) plate plate.cut(cylinder) Part.show(plate) doc.saveAs(/path/to/output.FCStd)这段代码的逻辑很清晰先建一个长方体然后对每个孔建一个圆柱用布尔减运算把圆柱从长方体里挖掉。注意圆柱的起始位置要放在板子的底面高度要等于板厚这样才能保证打通。这里有个容易踩的坑布尔运算的顺序。如果先挖孔再倒角倒角可能会把孔的边缘也倒掉导致孔口变形。正确的顺序通常是先做主体形状再做倒角最后挖孔。如果孔需要倒角那要单独处理。另一个坑是坐标系。FreeCAD 的默认坐标系原点在 (0,0,0)makeBox生成的长方体是从原点向正方向延伸的。如果你的描述里孔位是相对于板子中心定义的那就要做坐标平移。我一般会在参数提取阶段就统一约定“原点在板子左下角Z 轴向上”避免后续混乱。3.3 格式导出STEP、GLB、STL 怎么选模型建好之后导出格式的选择取决于下游用途。这三个格式的差异很大选错了会直接影响后续工作。STEP是精确的 B-rep 实体格式保留了完整的几何拓扑信息可以被 SolidWorks、UG、CATIA 等主流 CAD 软件打开并继续编辑。如果你生成的模型要用于加工制造STEP 是唯一正确的选择。FreeCAD 导出 STEP 的命令是plate.exportStep(/path/to/output.step)STL是三角网格格式只保留表面几何没有参数化信息。它的优点是通用性极强几乎所有 3D 打印切片软件都支持。缺点是精度受网格密度影响曲面会被离散成小三角面。导出 STL 时需要设置网格偏差参数偏差越小精度越高但文件也越大。FreeCAD 里可以这样控制import Mesh mesh Mesh.Mesh(plate.tessellate(0.1)) mesh.write(/path/to/output.stl)这里的0.1是线性偏差单位是 mm。对于大多数 3D 打印场景0.1mm 已经足够。如果零件有精细曲面可以调到 0.05mm。GLB是 glTF 的二进制版本主要用于 Web 端和实时渲染。它支持材质、颜色、光照信息文件体积小加载快。如果你要把模型展示在网页上或者做 AR 预览GLB 是最佳选择。FreeCAD 本身不直接支持 GLB 导出通常的做法是先导出 STL 或 OBJ再用 Blender 或 trimesh 库转换成 GLB。import trimesh mesh trimesh.load(/path/to/output.stl) mesh.export(/path/to/output.glb)格式类型精度可编辑性典型用途STEPB-rep 实体精确高工程制造、CAD 编辑STL三角网格受网格密度影响低3D 打印、快速原型GLB三角网格 材质受网格密度影响低Web 展示、AR/VR提示如果同一个模型要同时用于展示和制造建议导出两份STEP 给工程GLB 给展示。不要试图用一个格式通吃。3.4 自动化流水线的串联把上面几步串起来一条完整的 text-to-cad 流水线大概是这样的接收自然语言输入调用大模型提取参数输出 JSON校验参数范围和单位用参数填充 CAD 脚本模板执行脚本生成模型导出 STEP / STL / GLB返回文件路径或下载链接这条流水线可以用 Python 写成一个命令行工具也可以包成 Web 服务。如果做成 Web 服务前端收文字后端跑流水线用户点一下就能下载模型。我实测下来一个简单零件的全流程耗时在 10 到 30 秒之间主要时间花在大模型推理上几何构建和导出基本是秒级。4. 实操过程手把手搭一个最小可用版本4.1 环境准备与依赖安装先说明一下这套流程对硬件要求不高普通笔记本就能跑。核心依赖是 Python 和 FreeCAD。FreeCAD 的安装是个老生常谈的问题Windows 上直接下安装包就行Linux 上可以用包管理器或者 AppImage。# Ubuntu 下安装 FreeCAD sudo apt install freecad # 安装 Python 依赖 pip install openai trimesh numpy这里有个坑FreeCAD 的 Python 模块和系统 Python 有时候不兼容。如果你在系统 Python 里import FreeCAD报错大概率是路径问题。解决办法是用 FreeCAD 自带的 Python 解释器或者在脚本里手动把 FreeCAD 的 lib 路径加到sys.path。import sys sys.path.append(/usr/lib/freecad/lib) import FreeCADWindows 下的路径类似通常是C:\Program Files\FreeCAD 0.21\lib。具体版本号根据你装的版本调整。4.2 参数提取的提示词设计提示词的质量直接决定参数提取的准确率。我试过很多版本最后稳定下来的结构是这样的你是一个 CAD 参数提取助手。请将用户的自然语言描述转换为 JSON 格式的几何参数。 规则 1. 所有尺寸单位统一为毫米mm 2. 坐标系原点位于零件底面左下角Z 轴向上 3. 孔位坐标 (x, y) 指孔中心在底面上的投影 4. 如果描述中缺少必要参数使用合理默认值并在 warnings 字段中说明 5. 输出必须是合法的 JSON不要包含任何其他文字 输出格式 { type: plate | box | cylinder | bracket, length: number, width: number, thickness: number, holes: [{x: number, y: number, d: number}], fillets: [number], warnings: [string] } 用户描述 {user_input} 这个提示词的关键点在于明确坐标系、强制单位、要求 warnings 字段。warnings 字段特别有用当用户描述模糊时模型会在这里说明它做了什么假设方便人工复核。4.3 模板脚本的编写要点模板脚本是整个流程的骨架。我建议把模板写成函数接收参数字典返回生成的模型对象。这样不同的零件类型对应不同的函数调用时根据type字段分发。def build_plate(params): length params[length] width params[width] thickness params[thickness] plate Part.makeBox(length, width, thickness) for hole in params.get(holes, []): cylinder Part.makeCylinder( hole[d] / 2, thickness, App.Vector(hole[x], hole[y], 0) ) plate plate.cut(cylinder) return plate写模板时有几个细节要注意。第一孔的圆柱高度要等于板厚不能多也不能少多了会切到其他零件少了打不通。第二布尔运算要用 cut 而不是 fusecut 是减法fuse 是加法。第三每次布尔运算后要检查结果是否有效FreeCAD 偶尔会生成空形状或无效形状可以用plate.isValid()检查。4.4 完整流程的串联与测试把参数提取和模板构建串起来主流程大概是这样import json from openai import OpenAI client OpenAI() def text_to_cad(user_input): # 第一步提取参数 response client.chat.completions.create( modelgpt-4, messages[ {role: system, content: SYSTEM_PROMPT}, {role: user, content: user_input} ] ) params json.loads(response.choices[0].message.content) # 第二步校验参数 validate_params(params) # 第三步构建模型 if params[type] plate: model build_plate(params) else: raise ValueError(f不支持的零件类型: {params[type]}) # 第四步导出 model.exportStep(/tmp/output.step) mesh Mesh.Mesh(model.tessellate(0.1)) mesh.write(/tmp/output.stl) return /tmp/output.step, /tmp/output.stl测试的时候我建议从最简单的描述开始比如“一个 50×50×5 的方块”确认流程能跑通再逐步增加复杂度。每增加一个特征孔、圆角、倒角都要单独测试确保模板能正确处理。4.5 参数校验的实操细节参数校验这一步很多人会跳过但它是保证输出质量的关键。我一般会检查以下几项尺寸为正数长宽厚都不能是负数或零孔位在边界内孔的边缘不能超出板子边缘即x - d/2 0且x d/2 length孔径合理孔径不能大于板子最小边的一半孔不重叠两个孔的中心距要大于两孔半径之和这些校验用简单的 Python 条件判断就能实现。如果校验失败不要直接报错退出而是把问题反馈给大模型让它重新提取参数。我实测下来加上一轮重试之后参数准确率能从七成提升到九成以上。def validate_params(params): errors [] if params[length] 0 or params[width] 0: errors.append(尺寸必须为正数) for hole in params.get(holes, []): if hole[x] - hole[d]/2 0: errors.append(f孔 {hole} 超出左边界) if hole[x] hole[d]/2 params[length]: errors.append(f孔 {hole} 超出右边界) if errors: raise ValueError(; .join(errors))5. 常见问题与排查技巧实录5.1 模型生成失败或形状为空这是最常见的问题。表现是脚本执行没报错但导出的文件是空的或者模型只有一个点。原因通常有三种一是布尔运算把整个形状切没了比如孔的直径比板子还大二是坐标系搞错了圆柱建在了板子外面三是 FreeCAD 的形状有效性检查没通过。排查方法在每次布尔运算后打印形状的体积如果体积变成 0 或者负数说明运算出了问题。另外可以用Part.show()把中间结果显示出来肉眼确认形状是否正确。实操心得我习惯在模板里加一个assert plate.Volume 0的检查一旦体积异常就立即报错避免生成一堆无效文件。5.2 导出的 STEP 在 CAD 软件里打不开STEP 文件打不开通常是导出时模型本身有问题。FreeCAD 导出的 STEP 对形状有效性有要求如果模型有自相交、零厚度面、重复顶点等问题导出的文件可能损坏。解决办法是在导出前做一次形状修复。FreeCAD 提供了shape.fix()方法可以修复大部分常见问题。另外导出时可以用Part.export([plate], path)代替plate.exportStep(path)前者对形状的容错性更好。5.3 STL 文件太大或太小STL 的文件大小和网格密度直接相关。偏差设得太小文件可能几百 MB切片软件打开都费劲偏差设得太大曲面变成多边形打印出来有明显的棱角。我的经验值是普通零件用 0.1mm 偏差精细零件用 0.05mm概念预览用 0.2mm。如果零件尺寸特别大超过 200mm偏差可以适当放大到 0.15mm因为大尺寸下的绝对误差容忍度更高。5.4 大模型输出的 JSON 格式错误大模型有时候会在 JSON 外面包一层 markdown 代码块或者加一些解释性文字导致json.loads失败。解决办法是在解析前先做一次清洗把代码块标记去掉。import re def clean_json(text): text re.sub(rjson\s*, , text) text re.sub(r\s*, , text) return text.strip()另外可以在提示词里明确要求“只输出 JSON不要包含任何其他文字”这样能减少大部分格式问题。5.5 孔位计算错误的排查孔位算错是最隐蔽的问题因为模型看起来是对的但尺寸不对。常见原因是坐标系约定不一致。比如用户说“孔在板子中心”模型可能理解成 (length/2, width/2)也可能理解成 (0, 0)。排查方法是在参数提取后打印孔位坐标和预期值对比。如果发现偏差检查提示词里的坐标系定义是否清晰。我通常会在提示词里加一个示例明确说明“80×60 的板子中心孔坐标是 (40, 30)”这样模型就不容易搞错。问题现象可能原因排查方法解决方案模型为空布尔运算切没了打印体积检查孔径和板厚STEP 打不开形状无效用 FreeCAD 打开检查导出前 fix 形状STL 太大网格偏差太小查看文件大小调大偏差值JSON 解析失败格式不纯打印原始输出清洗代码块标记孔位错误坐标系不一致打印坐标对比提示词加示例5.6 性能优化的几个技巧当零件特征数量增加时布尔运算会变慢。我试过 50 个孔的板子FreeCAD 的 cut 操作要跑十几秒。优化方法有两个一是批量布尔运算把所有圆柱合并成一个复合形状再一次性 cut二是用多线程但 FreeCAD 的 Python API 对多线程支持不好容易崩溃所以还是推荐第一种。# 批量布尔运算 cylinders [] for hole in holes: cylinders.append(Part.makeCylinder(...)) compound Part.makeCompound(cylinders) plate plate.cut(compound)这样比逐个 cut 快三到五倍。另外如果只是预览用途可以先用低精度网格导出 STL确认形状无误后再生成高精度版本。6. 这条链路还能怎么扩展text-to-cad 目前能做到的是规则形状的快速生成但工程实际中的零件往往更复杂。下一步可以扩展的方向有几个。一是装配体支持。现在的流程只能生成单个零件如果能让模型理解“一个底板加四个立柱立柱安装在底板四角”就能生成装配体。这需要参数 schema 支持零件之间的位置约束关系。二是工程图输出。生成三维模型之后自动投影出三视图和尺寸标注导出 PDF 或 DXF。FreeCAD 的 TechDraw 模块可以做这件事但自动化程度还需要打磨。三是与制造工艺结合。比如识别出零件是钣金件后自动展开成平面图加上折弯线和折弯角度。这对钣金加工场景非常实用。四是多轮对话修改。用户看到生成的模型后说“把孔改成 M6 螺纹孔”系统能理解这是对上一个模型的修改而不是重新生成。这需要维护一个对话状态和模型版本。我自己在实际使用中体会最深的一点是text-to-cad 的价值不在于完全替代 CAD 操作而在于把重复性的建模工作自动化。它最适合的场景是那些结构相似、参数不同的零件族。对于全新的、复杂的结构设计人工建模仍然不可替代。把 text-to-cad 当成一个高效的草稿工具和批量生成工具而不是万能的设计师心态就对了。最后分享一个小技巧如果你经常生成同一类零件可以把常用的模板和提示词存下来做成一个配置文件。下次直接调用连提示词都不用重新写。我自己的配置里存了十几种常用零件模板从简单的垫片到带加强筋的支架都有日常使用基本够用。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号