☰
text-to-cad 实战:从文本描述到 STEP、URDF 与 G-code 的自动化建模链路
2026/10/27 22:17:10 网站建设 项目流程

1. 从一句话到三维模型:text-to-cad 到底在解决什么问题

第一次听到 “text-to-cad” 这个词,很多人脑子里蹦出来的画面可能是:对着电脑说一句“给我画个法兰盘”,屏幕上就自动生成一张能直接加工的图纸。这个想象不算离谱,但也不完全准确。更贴近现实的理解是——用自然语言或结构化文本描述,驱动一套自动化流程,最终产出 CAD 可识别的几何文件,比如 STEP、URDF、G-code 这些格式。它解决的核心痛点很朴素:传统 CAD 建模是“手工艺”,每一个倒角、每一段拉伸都要人点鼠标;而 text-to-cad 想把它变成“流水线”,让描述本身成为建模的输入。

我最早接触这个方向,是因为手里有一批参数化零件需要反复改尺寸。每次客户改一个孔径,我就得打开 SolidWorks 重新编辑草图、重建特征、再导出 STEP。几十个零件改下来,一天就没了。后来我试着用脚本把“孔径、板厚、长宽”这些参数抽出来,用文本描述驱动建模,效率直接翻了几倍。这就是 text-to-cad 的雏形——不是取代 CAD,而是把 CAD 里重复性最高的那部分工作自动化。

它适合谁?三类人最应该关注:一是机械设计工程师,手里有大量系列化零件;二是机器人方向的开发者,需要频繁生成 URDF 模型做仿真;三是做增材制造或 CNC 加工的从业者,想把设计到 G-code 的链路缩短。哪怕你只是刚学 CAD 制图入门,理解这套逻辑也能帮你少走很多弯路,因为你会知道哪些操作是可以被“描述”替代的。

提示:text-to-cad 不是“语音控制 CAD 软件”,它的本质是文本到几何的编译过程,中间往往要经过参数化脚本或中间格式转换。

2. 核心思路拆解:为什么是 STEP、URDF 和 G-code

2.1 三种输出格式分别对应什么场景

text-to-cad 的输出格式选择,直接决定了它能用在哪个环节。我把常见的三种格式和它们的适用场景整理成表,方便你对照自己的需求。

输出格式核心用途典型工具链是否保留特征树
STEP通用三维模型交换FreeCAD、CadQuery、SolidWorks部分保留
URDF机器人仿真与运动学ROS、CoppeliaSim、PyBullet不保留,只保留关节与连杆
G-code数控加工与3D打印PrusaSlicer、Cura、CNC 控制器不保留,只保留路径

STEP 是 text-to-cad 最常用的中间格式。它像三维模型界的 PDF——几乎所有 CAD 软件都能打开,而且能保留 B-rep 几何信息。你用文本生成一个 STEP 文件后,可以导入中望 CAD、SolidWorks 或者 FreeCAD 继续编辑。URDF 则完全不同,它是给机器人用的,描述的是连杆、关节、坐标系之间的关系。如果你要把模型导入 CoppeliaSim 做仿真,URDF 就是必经之路。G-code 更底层,直接控制机床或打印机,文本描述在这里变成了刀路或挤出路径。

2.2 为什么不用直接生成 CAD 原生格式

有人会问:为什么不直接生成 .sldprt 或 .dwg?原因有两个。第一,原生格式是闭源的,你很难用脚本稳定写入。第二,原生格式绑定了特定软件,换一个环境就打不开。STEP 是 ISO 标准,URDF 是 XML 文本,G-code 是纯文本,这三者都可以用代码生成、用代码解析,天然适合自动化流程。我试过用 Python 直接写 .dwg,折腾了一周就放弃了,后来换成先生成 STEP 再转换,半天就跑通了。

注意:STEP 有 AP203、AP214、AP242 等多个版本,做 text-to-cad 时建议统一用 AP214 或 AP242,兼容性最好。

2.3 文本描述的结构化程度决定成败

“一个长 100 宽 50 厚 10 的板,四个角各有一个直径 8 的孔”——这句话人看得懂,但机器不一定。text-to-cad 的关键在于把自然语言转成结构化参数。我的做法是定义一套简单的 JSON schema,比如:

{ "type": "plate", "length": 100, "width": 50, "thickness": 10, "holes": [ {"x": 10, "y": 10, "diameter": 8}, {"x": 90, "y": 10, "diameter": 8}, {"x": 10, "y": 40, "diameter": 8}, {"x": 90, "y": 40, "diameter": 8} ] }

有了这个结构,后面无论是生成 STEP 还是 URDF,都只是写一个转换器的事。自然语言解析可以交给大模型做,但最终一定要落到结构化参数上,否则后续步骤没法稳定复现。

3. 实操环境搭建:从零把链路跑通

3.1 工具选型与安装避坑

我推荐的主力工具是CadQuery,它是一个基于 Python 的参数化建模库,底层用 OpenCASCADE,能直接导出 STEP。安装很简单:

pip install cadquery

但这里有个坑:CadQuery 依赖的 OCP 库在部分 Windows 环境下会报 C++ 运行时错误,类似你装 CAD 时遇到的 “c++2005 cpi 错误”。解决办法是提前安装 Visual C++ Redistributable 合集,或者直接用 Conda 安装:

conda install -c conda-forge cadquery

Conda 会把依赖一并处理好,省心很多。如果你只是想做 URDF,可以装urdfpy或yourdfpy;做 G-code 可视化可以用gcode-parser。另外,FreeCAD 自带 Python 控制台,也可以作为备选方案,它的 Part 模块能直接生成 STEP。

3.2 一个最小可运行示例

先别急着搞复杂零件,从一个带孔的板开始。下面这段代码生成一个 100x50x10 的板,四角各一个直径 8 的孔,导出 STEP:

import cadquery as cq result = ( cq.Workplane("XY") .box(100, 50, 10) .faces(">Z") .workplane() .rect(80, 30, forConstruction=True) .vertices() .hole(8) ) cq.exporters.export(result, "plate.step")

跑完之后你会得到一个 plate.step 文件,用 FreeCAD 或中望 CAD 都能打开。这就是 text-to-cad 的最小闭环:文本参数 -> CadQuery 脚本 -> STEP 文件。你可以把参数抽成变量,从 JSON 读入,就实现了“文本驱动”。

3.3 环境验证与常见报错处理

第一次跑通之前,大概率会遇到几个问题。我整理了一个速查表:

报错信息原因解决办法
ModuleNotFoundError: No module named 'cadquery'没装或装错环境确认 pip 和 python 版本对应
OCP 初始化失败C++ 运行时缺失安装 VC++ Redistributable
导出 STEP 为空几何体没有闭合检查 box 和 hole 的顺序
中文路径报错OpenCASCADE 不支持改用全英文路径

实操心得:CadQuery 的链式调用顺序很关键,先做布尔运算再做倒角,否则容易失败。我踩过好几次坑,后来养成习惯——每加一个特征就导出一次看结果。

4. 从文本到 URDF:机器人模型生成的关键细节

4.1 URDF 的结构与 text-to-cad 的映射关系

URDF 本质是一个 XML 文件,描述机器人由哪些 link 和 joint 组成。text-to-cad 在这里的任务,是把“一个两轮差速小车,轮距 200,轮径 80”这样的描述,转成 URDF 里的 link 几何和 joint 位置。核心映射关系是:

  • 文本里的“底盘” -> URDF 的 base_link
  • 文本里的“左轮” -> URDF 的 left_wheel_link
  • 文本里的“轮距” -> joint 的 origin xyz
  • 文本里的“轮径” -> cylinder 的 radius

我通常先用 CadQuery 生成各个零件的 STEP,再用脚本转成 URDF 的 mesh 引用。这样几何精度有保证,URDF 只负责运动学关系。

4.2 导入 CoppeliaSim 的实操步骤

URDF 生成后,导入 CoppeliaSim 是常见需求。步骤不复杂,但细节容易出错:

  1. 确保 URDF 里所有 mesh 路径是相对路径,且文件确实存在。
  2. CoppeliaSim 的 URDF 导入插件对 inertial 标签很敏感,质量不能为 0。
  3. 关节类型要写对,continuous 和 revolute 的区别会影响仿真行为。
  4. 导入后检查 base_link 是否悬空,必要时手动调整位置。

我遇到过最头疼的问题是 mesh 单位不一致。CAD 里是毫米,URDF 默认是米,导入后模型要么巨大要么极小。解决办法是在 URDF 的 mesh 标签里加 scale 参数,或者在生成 STEP 时就按米为单位建模。

4.3 参数计算:轮距与转弯半径的关系

text-to-cad 不只是生成几何,有时还要算参数。比如差速小车的转弯半径 R 和轮距 L、左右轮速度 v_l、v_r 的关系是:

R = L/2 * (v_l + v_r) / (v_r - v_l)

这个公式在生成 URDF 时可以用来校验 joint 位置是否合理。如果文本描述里给了转弯半径和轮距,就能反推速度比,进而设置仿真参数。这种计算在纯手工建模时很容易被忽略,但自动化流程里必须显式处理。

提示:URDF 里的 inertial 矩阵如果随便填,仿真时会出现抖动或穿透。建议用 CadQuery 计算体积后乘以密度,得到真实质量。

5. 常见问题与排查技巧实录

5.1 几何生成失败的典型原因

text-to-cad 最常挂的地方不是代码,而是几何本身。比如你描述“一个内孔和外圆同心的圆环”,如果内孔直径大于外圆,CadQuery 会直接报错。再比如倒角半径大于板厚,也会失败。我的经验是:在生成前加一层参数校验,检查直径、厚度、倒角半径之间的约束关系。下面是一个简单的校验函数:

def validate_plate(length, width, thickness, hole_diameter, hole_margin): if hole_diameter >= min(length, width): raise ValueError("孔径不能大于板的最小边") if hole_margin < hole_diameter / 2: raise ValueError("孔边距不足,会导致破边") if thickness <= 0: raise ValueError("厚度必须为正")

这层校验能挡掉八成低级错误,省去反复调试的时间。

5.2 格式转换中的精度丢失

STEP 转 URDF 时,如果中间经过 STL,精度会丢失。STL 是三角网格,圆弧会变成多边形。解决办法是尽量直接从 B-rep 转 URDF 的 mesh,或者提高 STL 的细分精度。我在做机器人仿真时,轮子用 STL 后明显不圆,后来改成用 URDF 的 cylinder 原生几何,问题就消失了。

5.3 批量生成时的性能优化

如果你要生成几百个零件,逐个跑 CadQuery 会很慢。我的做法是用多进程池:

from multiprocessing import Pool def generate_one(params): # 生成并导出 pass with Pool(8) as p: p.map(generate_one, param_list)

另外,CadQuery 的 Workplane 对象不要跨进程传递,每个进程独立创建。实测下来,8 核并行能把批量生成时间从 20 分钟压到 3 分钟。

5.4 与现有 CAD 工作流的衔接

生成的 STEP 导入中望 CAD 或 SolidWorks 后,有时会出现特征树丢失的情况。这是正常的,因为 STEP 只保留几何,不保留建模历史。如果你需要后续编辑,建议同时保留生成脚本,改参数重新生成,而不是在 CAD 里手动改。这也是 text-to-cad 的核心价值——让修改回到文本层,而不是几何层。

6. 进阶方向:从单零件到装配体与 G-code

6.1 装配体的文本描述策略

单零件跑通后,下一步是装配体。文本描述装配体时,关键是定义配合关系。比如“轴插入孔,端面贴合”,对应到代码里就是两个零件的坐标系对齐。CadQuery 可以用Assembly类做这件事:

assy = ( cq.Assembly() .add(plate, name="plate") .add(shaft, name="shaft", loc=cq.Location(cq.Vector(0, 0, 10))) ) assy.save("assembly.step")

装配体的难点在于约束求解,目前 text-to-cad 在这方面还不如手动装配灵活。我的建议是:能参数化的零件用脚本生成,复杂配合关系还是手动处理,不要强行全自动。

6.2 生成 G-code 的基本链路

从文本到 G-code,中间要经过切片或刀路规划。3D 打印场景下,可以用 CadQuery 生成 STL,再调 PrusaSlicer 的命令行接口:

prusa-slicer --export-gcode --output part.gcode part.stl

CNC 场景更复杂,需要根据材料、刀具、进给速度生成刀路。这部分我还在摸索,目前的做法是用 FreeCAD 的 Path 模块,先手动配置一次刀路模板,再用脚本替换参数。text-to-cad 在这里的价值是批量生成不同尺寸零件的 G-code,而不是完全替代 CAM 工程师。

6.3 与 Python 批量修改 CAD 的结合

热词里有个“python 批量对 cad 修改”,这其实是 text-to-cad 的近亲。如果你手里有一批 DWG 图纸需要改图层、改文字、改块属性,可以用ezdxf库批量处理。我做过一个项目,把 200 张电气 CAD 图纸的标题栏统一替换,用 ezdxf 半小时搞定,手动改至少要两天。思路是一样的:把图纸当数据,用代码操作,而不是用鼠标操作。

实操心得:ezdxf 对中文支持需要设置编码,建议统一用 UTF-8,并在读取时指定 encoding 参数。

7. 我在这条路上踩过的坑与最终建议

text-to-cad 听起来很美好,但实际落地时,最大的障碍不是技术,而是描述本身的模糊性。人说“一个差不多大的板”,机器没法理解“差不多”。所以我的第一条建议是:先定义好参数 schema,再写生成逻辑。schema 是人和机器之间的合同,合同越清晰,返工越少。

第二条建议是:不要追求一步到位。我见过有人想直接从自然语言生成完整装配体,结果卡在几何约束上几个月。正确的做法是从单零件开始,跑通 STEP 导出,再加 URDF,再加 G-code。每一步都验证,每一步都保留回退方案。

第三条建议是:保留中间产物。生成的 STEP、URDF、G-code 都要存档,方便追溯。我习惯用时间戳命名,比如plate_20250101_1430.step,配合一个 JSON 记录参数。这样半年后回来改,还能知道当时用了什么参数。

最后分享一个小技巧:如果你用 CadQuery 生成的模型在 CAD 软件里显示异常,先检查法线方向。OpenCASCADE 有时会生成反向法线,导致模型看起来“里外翻转”。解决办法是在导出前调用result.val().fix(),或者用 FreeCAD 的 Part 模块做一次修复。这个坑我踩了三次才记住,希望你能一次绕过。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询