ARTICLE DETAIL

资讯详情

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

text-to-cad实战:从文本描述到STEP/URDF/G-code的自动化生成

text-to-cad实战:从文本描述到STEP/URDF/G-code的自动化生成 1. 从一段文字到一张图纸text-to-cad 到底在解决什么问题第一次听到 “text-to-cad” 这个词很多人脑子里蹦出来的画面大概是对着电脑敲一句“画一个长宽高 100×60×30 的带圆角盒子”然后 CAD 软件里就自动出现了一个可以旋转、可以标注、可以导出 STEP 的实体模型。这个画面放在三五年前还像是科幻但现在已经有一批人在真刀真枪地干了。我最早接触这个方向是因为手头有一批标准件需要反复建模——螺栓、垫片、法兰、简单的支架尺寸变来变去结构几乎一样。每次手动拉伸、打孔、倒角一天下来眼睛都花了还容易在某个尺寸上敲错一位数。那时候我就在想能不能用一段结构化的文字描述直接驱动 CAD 内核把模型生成出来顺便把 STEP、URDF、G-code 这些下游格式一并吐出来。text-to-cad 的核心价值说白了就是把“设计意图”从“鼠标点击序列”里解放出来。传统 CAD 建模你的知识藏在操作历史里先画草图、再约束、再拉伸、再倒角。换一个人打开文件得顺着特征树一步步看才能明白当初为什么这么画。而 text-to-cad 要求你把意图写成文字或结构化描述比如“底座 120×80×10四角各一个 M6 通孔孔中心距边缘 15上方居中一个直径 40 高 60 的圆柱圆柱顶部倒角 2”。这段文字本身就是可读、可版本管理、可批量替换参数的。你改一个数字整条生成链路重新跑一遍出来的模型自动更新。对于做参数化系列产品的团队来说这个效率提升不是百分之几十而是几倍到几十倍。那它适合谁呢我观察下来三类人最受益。第一类是做标准件库和参数化零件库的工程师他们本来就在用表格驱动设计text-to-cad 只是把表格换成了更自然的描述层。第二类是机器人方向的开发者他们需要频繁生成 URDF 描述的运动学模型用于仿真和运动规划手工在 CAD 里画连杆再导出 URDF 非常痛苦。第三类是做增材制造和数控加工的人他们关心的是从设计到 G-code 的链路能不能缩短text-to-cad 如果能把几何生成和工艺参数绑定中间省掉的转换环节相当可观。当然如果你只是偶尔画一张二维示意图那这套东西对你来说可能杀鸡用牛刀传统交互式 CAD 更顺手。需要先泼一盆冷水text-to-cad 不是“说人话就能出任意复杂模型”。目前的实践里它最擅长的是规则明确、结构重复、参数可枚举的零件。你让它生成一个汽车覆盖件那种自由曲面它大概率会给你一坨没法用的东西。所以理解它的边界比盲目吹捧更重要。下面我会从整体设计思路、核心细节、实操过程、常见问题几个层面把这条链路拆开讲清楚尽量让你看完能自己搭一套跑起来。2. 整体设计与思路拆解为什么是“文本→中间表示→CAD 内核”三层结构2.1 直接让大模型输出 STEP 文件行不行很多人第一反应是既然大模型能写代码那我让它直接输出 STEP 文件的文本内容不就行了我试过结论是理论上可行工程上灾难。STEP 文件ISO 10303-21是一种基于实体边界表示B-rep的交换格式一个稍微像样的零件其 STEP 文件动辄几千上万行里面充斥着CARTESIAN_POINT、ADVANCED_FACE、EDGE_CURVE这类底层几何实体定义。大模型在生成这种长序列结构化数据时很容易在中间某个实体索引上出错而 STEP 的引用是强耦合的——第 847 号实体引用了第 392 号实体一旦编号错位整个文件直接解析失败。更致命的是你很难让模型保证几何拓扑的一致性比如一个面被两个不同的实体重复引用或者一个闭合壳缺少一条边。所以直接生成 STEP 这条路目前只适合做演示不适合做生产。真正靠谱的做法是分层文本先转成一种中间表示再由中间表示调用成熟的 CAD 内核去生成精确几何最后导出目标格式。这个中间表示可以是 Python 代码调用 CadQuery、build123d 这类库也可以是一种领域特定语言DSL还可以是 JSON 描述的结构树。关键点是几何内核负责精确计算语言模型只负责把意图翻译成内核能听懂的指令。2.2 中间表示选型代码派 vs 描述派中间表示的选择直接决定了整套系统的灵活性和可维护性。我把它分成两大流派。代码派的代表是 CadQuery 和 build123d。你让模型生成一段 Python 代码代码里调用cq.Workplane(XY).box(100, 60, 30).faces(Z).workplane().hole(10)这样的 API然后本地执行这段代码CadQuery 底层调用 OpenCASCADE 内核生成 B-rep 实体再导出 STEP。这种方式的优势非常明显几何运算的精度由 OpenCASCADE 保证你不需要担心模型算错坐标代码本身可读可改工程师可以直接在生成结果上手动微调而且 Python 生态里有大量现成的库可以做后续处理比如用trimesh做网格化、用pybullet做碰撞检测。缺点是模型需要理解 API 的语义如果它把hole的参数顺序搞反了生成的孔可能位置不对但至少不会导致文件损坏。描述派的代表是自定义 JSON Schema 或 YAML 结构。比如你定义一种格式{type: box, size: [100, 60, 30], features: [{type: hole, diameter: 10, position: [20, 20, 0], axis: Z}]}。模型只需要输出符合 Schema 的 JSON你的后端解析器负责把它翻译成内核调用。这种方式的好处是约束强、容错高模型不容易跑偏因为 Schema 限定了它能表达什么。缺点是表达能力有限遇到复杂特征组合时Schema 会变得非常臃肿而且你相当于自己发明了一套 CAD 语言维护成本不低。我个人的选择是混合策略对于简单零件用 JSON Schema 约束保证稳定性对于需要复杂布尔运算和特征操作的零件让模型生成 CadQuery 代码同时在提示词里给出几个示例引导它使用正确的 API 模式。实测下来这种混合方式在标准件场景下的一次通过率能到八成以上剩下的两成通过错误信息反馈给模型做二次修正基本都能救回来。2.3 为什么下游要同时支持 STEP、URDF 和 G-code标题里提到的 STEP、URDF、G-code分别对应三个不同的下游场景这也是 text-to-cad 比单纯“文字生成模型”更有价值的地方。STEP是 CAD 领域的通用交换格式几乎所有主流 CAD 软件都能读写。你生成的模型导出 STEP 后可以在 SolidWorks、Fusion 360、中望 CAD 里打开继续做装配、出工程图、做有限元分析。STEP 保留的是精确 B-rep 几何不是网格所以尺寸标注和后续加工都靠它。URDF是机器人领域描述刚体运动学和动力学模型的标准格式。一个 URDF 文件里定义了连杆link和关节joint每个连杆有视觉几何、碰撞几何、惯性矩阵。做机器人仿真的人经常需要把 CAD 模型转成 URDF传统做法是在 SolidWorks 里装一个 SW2URDF 插件手动指定每个连杆的坐标系和关节轴非常繁琐。如果 text-to-cad 能在生成几何的同时把关节轴、坐标系、质量属性一并算出来直接输出 URDF那对机器人开发者来说是巨大的解放。我见过一个案例用脚本批量生成不同尺寸的机械臂连杆每个连杆的 URDF 自动带上正确的惯性张量省掉了大量手工计算。G-code是数控加工和 3D 打印的指令格式。从几何到 G-code中间通常要经过切片3D 打印或 CAM 工序规划减材加工。text-to-cad 如果能在生成模型时就把工艺参数层高、填充率、刀具直径、进给速度作为输入的一部分理论上可以跳过中间的手动 CAM 步骤直接输出可加工的 G-code。当然这一步目前还比较前沿因为工艺规划本身涉及很多经验判断不是纯几何问题。但对于简单的 2.5 轴铣削和 FDM 打印已经有团队在做端到端的尝试。3. 核心细节解析与实操要点从提示词到几何体的关键环节3.1 提示词工程怎么把“人话”翻译成“机器能懂的话”text-to-cad 的第一道关卡是提示词。你给模型的输入越模糊输出越离谱。我总结了一个四要素模板基本上覆盖了大多数规则零件的描述需求。第一是基准与坐标系。你必须告诉模型零件的原点在哪里哪个方向是 Z 轴。比如“以底面中心为原点Z 轴向上”和“以左下角为原点Z 轴向上”生成出来的模型位置完全不同。很多失败案例就是因为模型默认把原点放在了几何中心而后续装配需要的是底面中心。第二是主体几何。用明确的尺寸和形状词避免“大约”“差不多”这种模糊表达。比如“一个 100×60×30 的长方体”比“一个扁盒子”强一百倍。如果有圆角要给出圆角半径如果有拔模要给出拔模角度。第三是特征列表。孔、槽、凸台、倒角、螺纹这些特征要逐个列出每个特征给出类型、尺寸、位置、方向。位置最好用相对于基准的坐标或者用“距边缘 X”这种相对描述。我习惯让模型输出特征列表时带上序号方便后续核对。第四是输出格式与精度。明确告诉模型你要 STEP 还是 STL单位是毫米还是英寸公差是多少。如果要做 URDF还要指定关节类型旋转还是移动、关节轴方向、质量属性来源。一个实际的提示词例子生成一个铝合金支架。原点在底面中心Z 轴向上单位毫米。主体为 120×80×10 的矩形板四角倒圆角 R5。四角各有一个 M6 通孔孔中心距相邻两边各 15。板的上方居中有一个外径 40、内径 20、高 50 的圆管圆管与板之间用四个加强筋连接筋厚 5沿对角线方向布置。输出 STEP 文件公差 0.01。这段描述里基准、主体、特征、输出格式都齐了。模型拿到这样的输入生成代码的准确率会高很多。3.2 几何内核的选择OpenCASCADE 是绕不开的基石不管你用 CadQuery、build123d 还是自己封装底层大概率都是OpenCASCADE简称 OCCT。这是一个开源的 B-rep 几何内核支持实体建模、布尔运算、倒角、圆角、放样、扫掠等操作。它的精度和稳定性在开源界是独一档的商业软件里也有不少在用。为什么强调内核因为 text-to-cad 的可靠性很大程度上取决于内核能不能正确处理模型生成的指令。如果模型生成了一段合法的 CadQuery 代码但里面有一个布尔减操作会导致零厚度壁OCCT 可能会报错或者生成一个无效实体。这时候你需要捕获异常把错误信息反馈给模型让它调整参数。我见过一些实现直接用网格库比如 trimesh做布尔运算结果在复杂模型上频繁出现非流形边和自交面导出的 STEP 根本没法用。所以在精度要求高的场景必须用 B-rep 内核不能用网格库凑合。OCCT 的另一个好处是它支持特征历史。CadQuery 生成的模型你可以顺着工作平面和操作链回溯知道每个面是怎么来的。这对于后续修改和参数化非常重要。如果你直接操作网格改一个尺寸可能要把整个模型重新生成一遍而 B-rep 可以只更新受影响的特征。3.3 从几何到 URDF坐标系和惯性矩阵的自动计算URDF 的生成比 STEP 多了一层挑战你不仅要几何还要运动学结构。一个 URDF 文件里每个 link 有自己的坐标系每个 joint 定义了父子 link 之间的变换关系。text-to-cad 要做的是在生成几何的同时把坐标系和关节轴也确定下来。我的做法是在提示词里显式定义关节。比如“生成一个两连杆机械臂基座固定第一关节绕 Z 轴旋转第二关节绕 Y 轴旋转连杆长度分别为 200 和 150截面为 40×40 的方管壁厚 5”。模型生成几何后后端根据关节定义自动计算每个 link 的局部坐标系把几何变换到对应位置然后输出 URDF。惯性矩阵的计算是个坑。URDF 里每个 link 需要质量、质心位置、惯性张量。如果你只给几何不给材料密度模型没法算质量。所以提示词里要指定材料比如“铝合金密度 2700 kg/m³”。后端根据几何体积和密度算出质量再根据形状估算惯性张量。对于规则形状长方体、圆柱、圆管有解析公式可以直接用对于复杂形状可以用网格积分近似。我实测下来对于标准件解析公式算出来的惯性张量和有限元软件的结果误差在 5% 以内对于仿真来说够用了。还有一个细节URDF 里的碰撞几何通常比视觉几何简单。比如一个带倒角和螺纹孔的连杆视觉几何用精确 B-rep碰撞几何可以用一个简化的包围盒或圆柱。text-to-cad 可以在生成时同时输出两套几何视觉用 STEP碰撞用简化后的基本体。这样在仿真里既好看又快。3.4 G-code 生成工艺参数必须前置从几何到 G-code中间隔着工艺规划。text-to-cad 如果想把这一步也包进来就必须在输入阶段就拿到工艺参数。对于 FDM 3D 打印你需要知道层高、喷嘴直径、填充率、打印速度、支撑策略。对于 CNC 铣削你需要知道刀具直径、切削深度、进给速度、主轴转速。我的建议是不要让语言模型去猜工艺参数。这些参数应该由用户显式提供或者从预设的工艺库中选取。模型只负责生成几何后端调用切片软件比如 CuraEngine或 CAM 库比如 FreeCAD 的 Path 模块生成 G-code。这样职责清晰也避免了模型在工艺问题上胡说八道。一个实际的流程是text-to-cad 生成 STEP → 后端用 OpenCASCADE 做几何修复和简化 → 导出 STL → 调用切片引擎 → 输出 G-code。对于 3D 打印这条链路已经比较成熟。对于 CNC因为涉及装夹和刀具路径规划自动化程度还比较低目前只适合简单零件。4. 实操过程与核心环节实现搭一套能跑的 text-to-cad 流水线4.1 环境准备与依赖安装先说明一下下面这套方案是基于 Python 的因为 Python 在 CAD 和 AI 两边的生态都最全。你需要准备以下环境Python 3.10 或以上建议用 conda 建一个独立环境避免和系统里的其他库冲突。CadQuerypip install cadquery它会自动带上 OpenCASCADE 的 Python 绑定OCP。安装过程可能需要编译Windows 上建议直接用 conda 安装conda install -c conda-forge cadquery。大模型接口你可以用任何支持代码生成的模型本地部署或 API 调用都行。我测试过几个开源模型对于 CadQuery 这种有明确 API 文档的库生成质量可以接受。辅助库numpy用于数值计算trimesh用于网格处理pybullet或coppeliasim的 Python 接口用于 URDF 验证。安装 CadQuery 时有个坑它依赖的 OCP 版本和 Python 版本有对应关系。如果你用 Python 3.12可能会遇到没有预编译 wheel 的情况需要自己编译非常耗时。所以建议用 Python 3.10 或 3.11这两个版本有现成的二进制包。4.2 提示词模板与模型调用我用的提示词模板分三部分系统提示、用户输入、输出约束。系统提示里我会给模型几个 CadQuery 的示例代码覆盖长方体、圆柱、孔、倒角、布尔运算这些基本操作。示例不用多三到五个就够关键是让模型理解 API 的调用模式。用户输入就是前面说的四要素描述。输出约束里我要求模型只输出 Python 代码不要输出解释文字代码必须包含import cadquery as cq最后必须把结果赋值给result变量。这样后端拿到代码后直接exec执行然后从命名空间里取result对象。调用模型时温度参数建议设低一点比如 0.2减少随机性。如果第一次生成的代码报错把错误信息拼到提示词里让模型重新生成。我一般给三次重试机会三次还不行就放弃转人工处理。4.3 代码执行与几何验证拿到模型生成的代码后不能直接在生产环境执行因为存在安全风险。我的做法是在一个受限的沙箱里执行禁用文件写入和网络访问只允许调用 CadQuery 和数学库。可以用RestrictedPython或者干脆起一个子进程用resource限制内存和 CPU 时间。执行成功后拿到result对象先做几何验证检查result.val().isValid()确保实体是有效的。检查体积是否大于零避免生成空壳。检查包围盒尺寸是否和预期一致比如你要求 100×60×30实际包围盒偏差超过 1% 就要警惕。如果有孔特征检查孔的数量和位置是否正确。验证通过后导出 STEPcq.exporters.export(result, output.step)。如果需要 URDF还要进一步处理。4.4 URDF 生成的具体步骤假设你要生成一个两连杆机械臂的 URDF流程如下第一步分别生成两个连杆的几何。可以用两次 text-to-cad 调用也可以在一次调用里生成两个实体然后按名称区分。第二步定义关节。在提示词里明确关节 1 连接 base 和 link1类型为 revolute轴为 Z 轴原点在 base 顶部中心关节 2 连接 link1 和 link2类型为 revolute轴为 Y 轴原点在 link1 末端中心。第三步计算每个 link 的质量属性。根据几何体积和材料密度算出质量用 CadQuery 的Shape.mass()或者自己用网格积分算惯性张量。对于方管和圆柱可以直接用解析公式。第四步生成 URDF XML。Python 里有urdfpy或yourdfpy这样的库可以帮你构建 URDF 结构也可以直接手写 XML 模板把几何文件路径、关节参数、惯性矩阵填进去。第五步验证。把 URDF 导入 CoppeliaSim 或 PyBullet检查模型是否正常显示关节是否能按预期运动。我遇到过坐标系搞反的情况在 PyBullet 里机械臂直接穿模了后来发现是关节轴方向定义错了。所以验证这一步不能省。4.5 G-code 生成的简化流程对于 FDM 打印最简单的流程是text-to-cad 生成 STL → 用 CuraEngine 命令行切片 → 输出 G-code。CuraEngine 的命令行参数比较多但核心就是指定配置文件、输入 STL、输出 G-code。你可以把常用的打印参数层高 0.2、填充 20%、PLA 材料存成配置文件切片时直接引用。对于 CNC 铣削可以用 FreeCAD 的 Path 模块。FreeCAD 有 Python API你可以用脚本创建一个 Job指定刀具和加工策略然后生成 G-code。不过 FreeCAD 的 Path 模块学习曲线比较陡建议先从简单的 2.5 轴轮廓铣削开始。5. 常见问题与排查技巧实录5.1 模型生成的代码报错怎么办这是最常见的问题。错误类型大致分三类第一类是语法错误比如缩进不对、括号不匹配。这种错误信息很明确直接把错误行和错误信息拼到提示词里让模型重新生成一般一次就能修好。第二类是API 误用比如把hole的参数顺序搞反或者用了不存在的函数。这种错误需要你在系统提示里给出更详细的 API 说明或者在错误反馈里加上正确的用法示例。第三类是几何错误比如布尔运算导致零厚度壁、倒角半径大于边长。这种错误不会抛异常但生成的实体是无效的。你需要在验证阶段捕获把isValid()的结果和包围盒信息反馈给模型让它调整参数。我整理了一个常见错误速查表错误现象可能原因解决方法Standard_Failure异常布尔运算失败通常是零厚度或自交调整尺寸增加壁厚或改用其他建模顺序实体isValid()返回 False几何拓扑有问题用Shape.fix()尝试修复或重新生成包围盒尺寸偏差大模型理解错了尺寸或单位检查提示词中的单位和尺寸描述孔位置不对坐标系定义不清晰在提示词中明确原点位置和孔的相对坐标URDF 导入后穿模关节轴方向或坐标系错误检查 joint 的 axis 和 origin 定义G-code 空跑切片参数错误或模型不在打印平台内检查 STL 的坐标范围调整切片配置5.2 生成速度太慢怎么优化text-to-cad 的耗时主要在两块模型推理和几何运算。模型推理的时间取决于你用的模型大小和硬件这个不太好优化除非换更小的模型或者用更快的推理框架。几何运算的时间主要花在布尔运算和倒角上复杂模型可能几秒到几十秒。我的优化经验是尽量用基本体组合少用复杂扫掠和放样。比如一个带加强筋的支架用长方体加圆柱加布尔并集比用扫掠生成筋板要快得多。另外如果只是预览可以先生成低精度网格确认形状对了再生成精确 B-rep。还有一个技巧缓存中间结果。如果你要批量生成一系列尺寸的零件可以把公共部分的几何缓存起来只重新生成变化的部分。CadQuery 支持把 Shape 对象序列化下次直接加载省掉重复计算。5.3 导出的 STEP 在别的 CAD 软件里打不开这个问题通常是因为 STEP 文件的版本或精度设置不对。CadQuery 默认导出的 STEP 是 AP214 还是 AP203取决于配置。有些老版本的 CAD 软件只认 AP203你需要在导出时指定cq.exporters.export(result, output.step, STEP, {write_pcurves: False})之类的参数。另外如果模型里有非常小的特征比如 0.01mm 的倒角某些 CAD 软件在导入时会因为公差设置而报错。建议在导出前把微小特征清理掉或者把公差设大一点。5.4 怎么保证批量生成的一致性批量生成时最大的风险是模型每次生成的代码风格不一样导致结果有细微差异。比如同样的提示词这次生成的代码先倒角再打孔下次先打孔再倒角虽然理论上结果一样但实际几何可能有微小差别。我的做法是固定随机种子固定提示词模板固定模型版本。如果要做大批量生成先把提示词模板固化下来用同一个模型跑不要中途换模型。另外生成后要做一致性检查比如对比包围盒体积、孔的数量和位置偏差超过阈值就标记出来人工复核。5.5 安全与合规注意事项最后提醒几点实操中的安全事项。第一不要在生产环境直接执行模型生成的代码一定要沙箱隔离防止恶意代码或意外操作。第二不要用 text-to-cad 生成涉及安全关键的零件比如承力结构、压力容器除非你有完整的验证流程。第三注意知识产权如果你用别人的 CAD 模型训练或做少样本提示要确保你有相应的授权。我个人在实际操作中的体会是text-to-cad 目前最适合的场景是标准件库的快速搭建和机器人仿真模型的批量生成。这两个场景的共同点是几何规则明确、参数可枚举、下游格式固定。把这两个场景跑通再逐步扩展到更复杂的零件是比较稳妥的路径。至于完全替代人工建模短期内不现实但作为效率工具它已经能帮你省掉大量重复劳动了。
返回列表