ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

text-to-cad 实战:从自然语言到 CAD 模型的流水线搭建

text-to-cad 实战:从自然语言到 CAD 模型的流水线搭建 1. 从一段文字到一张图纸text-to-cad 到底在解决什么问题第一次听到 “text-to-cad” 这个词是在一个做机械设计自动化的群里。有人丢了一张截图左边是一段自然语言描述——“一个长宽高分别为 80、60、40 毫米的铝合金外壳壁厚 3 毫米顶部开一个直径 20 毫米的圆孔四角做 R5 圆角”右边直接生成了一张可以旋转查看的三维模型还能一键导出 STEP 文件。当时群里就炸了做非标设计的老哥说这玩意儿要是靠谱能省掉他一半的重复建模时间。这就是 text-to-cad 的核心价值把自然语言描述直接转换成 CAD 模型文件。它不是一个具体的软件而是一类工具链的统称背后涉及自然语言理解、参数化建模、几何内核调用、文件格式转换等多个环节。最终产物可能是 STEP、STL、URDF甚至是用于加工的 G-code。它解决的是 CAD 建模门槛高、重复劳动多的问题。传统流程里你要打开 SolidWorks、中望 CAD 或者 FreeCAD手动画草图、拉伸、打孔、倒角一个简单零件也得折腾十几分钟。而 text-to-cad 的思路是你用说话的方式描述需求工具帮你生成几何体。适合谁用三类人最受益——做快速原型的设计师、需要批量生成零件库的工程师、以及做机器人仿真需要大量 URDF 模型的开发者。但我要先把话说在前面目前的 text-to-cad 还远没到“说一句话就出成品”的程度。它更像一个“高级草稿生成器”能帮你把 60% 到 80% 的基础几何搭出来剩下的细节、公差、装配关系还是得人工介入。理解这一点你才不会对它抱有不切实际的期待。2. 核心技术链路拆解从文字到几何体中间发生了什么2.1 自然语言解析把“人话”翻译成“机器能懂的参数”text-to-cad 的第一步是把你的描述拆解成结构化的参数。比如你说“一个直径 50 毫米、高 100 毫米的圆柱体”系统需要识别出形状类型是圆柱cylinder直径参数是 50mm高度参数是 100mm。这一步通常用大语言模型来做。LLM 在这里的角色不是直接画图而是做“信息抽取”。它把非结构化的文本转成 JSON 格式的参数表类似这样{ shape: cylinder, parameters: { diameter: 50, height: 100, unit: mm }, features: [] }如果描述更复杂比如“在圆柱顶面中心挖一个深 20 毫米、直径 10 毫米的孔”那 features 数组里就会多一条{ feature: hole, position: top_center, diameter: 10, depth: 20 }这里的关键难点在于歧义消解。中文描述里“顶部”到底是指 Z 轴正方向还是负方向“中心”是几何中心还是重心这些都需要在 prompt 里做约束或者在后处理阶段做归一化。我实测下来用英文描述比中文描述的解析准确率高出不少因为主流 LLM 的训练语料里英文的工程描述更多。2.2 参数化建模引擎谁来真正“画”出这个模型拿到结构化参数后需要一个几何引擎来执行建模操作。常见的选择有几类OpenCASCADE开源几何内核功能强大支持 B-rep 表示能导出 STEP。FreeCAD 底层用的就是它。缺点是 API 学习曲线陡文档不算友好。CadQuery基于 OpenCASCADE 的 Python 库语法接近自然语言非常适合做 text-to-cad 的后端。比如cq.Workplane(XY).circle(25).extrude(100)就能生成一个直径 50、高 100 的圆柱。OpenSCAD基于脚本的建模工具语法简单但只支持 CSG构造实体几何做复杂曲面比较吃力。商业内核比如 Parasolid、ACIS精度和稳定性更好但授权费用高个人项目基本不会考虑。对于个人开发者和小团队我的建议是CadQuery OpenCASCADE这套组合。CadQuery 的 Python API 对 LLM 生成的代码非常友好因为 LLM 本身就擅长写 Python。你可以让 LLM 直接输出 CadQuery 脚本然后执行脚本生成模型。2.3 文件格式转换STEP、URDF、G-code 各自的应用场景生成的模型需要导出成不同格式才能对接下游工具。这里把几种常见格式的用途和转换要点说清楚格式全称主要用途转换要点STEPStandard for the Exchange of Product Data跨软件交换、CNC 加工保留 B-rep 精度文件较大STLStereolithography3D 打印三角网格化会损失精度URDFUnified Robot Description Format机器人仿真如 CoppeliaSim需要额外定义关节、连杆、惯性矩阵G-code—CNC 机床加工需要切片或 CAM 处理包含刀具路径STEP 是最通用的交换格式中望 CAD、SolidWorks、Fusion 360 都能直接打开。URDF 则是机器人领域的专用格式如果你要把模型导入 CoppeliaSim 做仿真光有几何体还不够还得定义每个连杆的质量、惯性张量、关节类型和运动范围。这部分目前 text-to-cad 工具基本做不到全自动需要人工补全。G-code 的生成更复杂它不只是几何问题还涉及刀具选择、进给速度、切削深度等工艺参数。text-to-cad 到 G-code 之间通常还需要经过 CAM 软件的处理不能一步到位。3. 动手搭建一套可用的 text-to-cad 流水线3.1 环境准备Python 生态是首选我推荐的技术栈是 Python CadQuery OpenAI API或本地部署的 LLM。为什么选 Python因为 CadQuery 是 Python 库LLM 生成 Python 代码的准确率最高而且 Python 的文件处理和格式转换库最丰富。安装步骤不复杂但有几个坑要注意# 创建虚拟环境避免污染系统 Python python -m venv text2cad-env source text2cad-env/bin/activate # Windows 用 text2cad-env\Scripts\activate # 安装 CadQuery pip install cadquery # 安装 OpenAI SDK如果用在线 LLM pip install openai # 安装 trimesh用于 STL 处理和格式转换 pip install trimesh注意CadQuery 依赖 OpenCASCADE在 Windows 上安装时可能会遇到 C 运行库缺失的问题。如果你看到类似“c2005cpi 错误”的提示去微软官网下载 Visual C Redistributable 合集装上就行。这个问题在安装 CAD 类软件时很常见不是 CadQuery 独有的。3.2 提示词设计让 LLM 输出可执行的 CadQuery 代码这是整个流水线里最关键的环节。你不能直接跟 LLM 说“帮我画一个零件”它不知道用什么库、什么坐标系、什么单位。你需要给它一个清晰的系统提示词约束输出格式。我用的系统提示词大概长这样你是一个 CAD 建模助手使用 CadQuery 库生成三维模型。 规则 1. 所有尺寸单位默认为毫米。 2. 坐标系Z 轴向上XY 平面为底面。 3. 输出必须是可直接执行的 Python 代码使用 cadquery 库。 4. 代码最后必须调用 cq.exporters.export() 导出 STEP 文件。 5. 不要输出任何解释文字只输出代码。然后用户的输入可以是“生成一个 80x60x40 的长方体壁厚 3顶部中心打一个直径 20 的通孔四角 R5 圆角。”LLM 输出的代码大概是这样import cadquery as cq # 创建基础长方体 result cq.Workplane(XY).box(80, 60, 40) # 抽壳壁厚 3移除顶面 result result.faces(Z).shell(-3) # 顶部中心打孔 result result.faces(Z).workplane().hole(20) # 四角圆角 result result.edges(|Z).fillet(5) # 导出 STEP cq.exporters.export(result, output.step)这段代码可以直接跑生成的 STEP 文件用中望 CAD 或 FreeCAD 都能打开。但实际测试中LLM 偶尔会把shell的符号搞反或者fillet的边选择不对。所以你需要加一层校验代码执行报错时把错误信息回传给 LLM让它自我修正。这个“生成-执行-报错-修正”的循环通常跑两三轮就能得到可用的结果。3.3 批量生成与参数化变体用循环搞定系列化零件text-to-cad 真正体现效率的地方是批量生成系列化零件。比如你要做一组不同长度的轴传统方式是一个个画而用脚本可以这样import cadquery as cq lengths [50, 80, 100, 120, 150] diameter 20 for length in lengths: result cq.Workplane(XY).circle(diameter/2).extrude(length) # 两端倒角 result result.edges(%CIRCLE).chamfer(1) filename fshaft_L{length}_D{diameter}.step cq.exporters.export(result, filename) print(f已生成{filename})跑一遍脚本五个 STEP 文件就出来了。这种场景在非标设备设计中特别常见——同一类零件尺寸不同结构一样。用 text-to-cad 的思路你只需要描述一次结构逻辑剩下的交给循环。3.4 导出 URDF 并导入 CoppeliaSim 的实操要点如果你做机器人仿真需要把模型导入 CoppeliaSim那 URDF 是绕不开的。CadQuery 本身不直接支持 URDF 导出但你可以用 trimesh 先把模型转成 STL 或 OBJ再手写 URDF 文件引用这些网格。一个最简 URDF 文件结构如下?xml version1.0? robot namesimple_part link namebase_link visual geometry mesh filenamebase.stl scale0.001 0.001 0.001/ /geometry /visual collision geometry mesh filenamebase.stl scale0.001 0.001 0.001/ /geometry /collision inertial mass value1.0/ inertia ixx0.001 ixy0 ixz0 iyy0.001 iyz0 izz0.001/ /inertial /link /robot注意URDF 里的 mesh 文件路径是相对路径导入 CoppeliaSim 时要把 STL 文件和 URDF 放在同一目录下。另外 scale 参数很关键CadQuery 导出的 STL 默认单位是毫米而 URDF 和 CoppeliaSim 默认用米所以 scale 要设成 0.001。这个坑我踩过模型导入后大了 1000 倍找了半天才发现是单位问题。4. 实操中绕不开的坑与排查技巧4.1 LLM 生成的代码跑不通怎么办这是最常见的问题。LLM 不是专门为 CadQuery 训练的它生成的代码经常有 API 调用错误。我的排查流程是这样的先看报错行Python 的 traceback 会告诉你哪一行出错大部分问题是方法名拼错或参数类型不对。检查 CadQuery 版本不同版本的 API 有差异比如Workplane.hole()在旧版本里可能不存在。用pip show cadquery确认版本然后查对应版本的文档。把错误信息回传给 LLM直接跟它说“这段代码报错了错误信息是 XXX请修正”通常它能改对。手动降级如果 LLM 反复改不对就自己把复杂操作拆成简单步骤。比如它搞不定shell加fillet的组合你就先让它生成基础体再手动加特征。4.2 几何体布尔运算失败的原因分析布尔运算是 CAD 建模里最容易出问题的地方。两个实体做差集或并集时如果面与面恰好重合或者有微小间隙内核就可能报错。常见原因和解决办法问题现象可能原因解决办法布尔运算后实体消失两个实体没有实际相交检查坐标和尺寸确保有重叠区域报错“BRep_API: command not done”面重合导致歧义把其中一个实体偏移 0.001mm圆角失败圆角半径大于相邻边长度减小圆角半径或先倒角再圆角抽壳失败壁厚大于最小特征尺寸减小壁厚或分步抽壳这些问题的根源在于几何内核的数值精度。OpenCASCADE 的默认精度是 1e-7 米也就是 0.0001 毫米。如果你的模型尺寸很小或者特征之间距离很近就容易触发精度问题。实操中我习惯在关键尺寸上留 0.01mm 的余量避免“刚好相等”的情况。4.3 格式转换中的精度损失与单位陷阱STEP 转 STL 时需要设置网格精度。精度太高文件巨大精度太低曲面变多边形。CadQuery 的导出函数可以指定公差cq.exporters.export(result, output.stl, tolerance0.01, angularTolerance0.1)tolerance是线性公差单位毫米angularTolerance是角度公差单位弧度。对于大多数 3D 打印场景0.01mm 的线性公差足够了。如果你要做精细的曲面零件可以调到 0.001mm但文件大小会翻好几倍。单位问题更隐蔽。CAD 软件通常用毫米机器人仿真用米3D 打印切片软件有的用毫米有的用米。我的做法是在流水线内部统一用毫米只在导出 URDF 时做单位转换。这样中间环节不会乱。4.4 常见问题速查表问题排查方向快速解决代码执行报 ModuleNotFoundError依赖没装全pip install cadquery trimesh生成的模型是空文件导出路径不对或实体为空打印实体体积确认非零STEP 文件打不开导出时实体有错误先用 FreeCAD 修复再重新导出URDF 导入 CoppeliaSim 后位置偏移坐标系原点不一致在 URDF 里加 origin 偏移圆角后模型出现破面圆角半径过大减小半径或改用倒角批量生成时内存溢出实体未释放每次循环后 del result 并 gc.collect()5. 这套方案能走多远能力边界与扩展方向5.1 目前能做到什么程度经过我自己的实测text-to-cad 流水线在以下场景已经比较可靠基础几何体长方体、圆柱、圆锥、球体参数明确时准确率很高。规则特征通孔、盲孔、圆角、倒角、简单阵列LLM 生成的代码基本能跑通。系列化零件同一结构不同尺寸的批量生成效率提升明显。简单装配体两三个零件的定位和配合可以通过坐标变换实现。但在这些场景下还不够靠谱复杂曲面涡轮叶片、流线型外壳自然语言很难描述清楚。工程图标注尺寸公差、形位公差、表面粗糙度目前基本无法自动生成。装配约束齿轮啮合、轴承配合需要人工定义运动副。工艺特征螺纹、花键、焊接坡口LLM 对这类特征的理解还不够准确。5.2 和传统 CAD 工作流的配合方式我的建议是不要把 text-to-cad 当成替代品而是当成“第一稿生成器”。具体流程可以是用 text-to-cad 生成基础模型导出 STEP。导入中望 CAD 或 SolidWorks人工检查几何是否合理。补充工程图标注、公差、材料属性。如果需要加工再导入 CAM 软件生成 G-code。这样你省掉了从零开始画草图的时间但保留了人工审核和精修环节。对于重复性高的零件库建设这个流程能省 50% 以上的时间。5.3 后续可以扩展的方向如果你想把这套东西做得更完善有几个方向值得尝试接入本地 LLM用 Ollama 跑 CodeLlama 或 DeepSeek Coder避免 API 调用成本数据也不出本地。增加几何校验层生成模型后自动检查体积、包围盒、壁厚不符合预期就重新生成。对接 PDM 系统批量生成的零件自动入库带上参数标签方便检索复用。支持更多输出格式除了 STEP 和 STL还可以加 IGES、DXF、PDF 工程图导出。Web 界面封装用 Gradio 或 Streamlit 做个简单前端输入文字就能下载模型团队里非技术同事也能用。我在实际使用中最大的体会是text-to-cad 的价值不在于全自动而在于把“从想法到第一版模型”的时间从半小时压缩到两分钟。剩下的精修工作虽然还得手动做但心理负担小了很多——因为你已经有一个看得见摸得着的起点而不是面对空白画布发呆。对于经常做重复性建模的人来说这个起点本身就值回票价了。
返回列表