
1. 从一句话到三维模型text-to-cad 到底在解决什么问题第一次听到 text-to-cad 这个词我脑子里蹦出来的画面是对着电脑敲一句“给我画一个 80x60x10 的带四个 M4 沉头孔的安装板”然后 CAD 软件里就自动生成好了三维模型和工程图。这个画面放在五年前还属于科幻但现在已经有一批工具和方案能把它落地到七八成。所谓 text-to-cad本质上是把自然语言描述转成 CAD 能识别的几何数据最终输出 STEP、URDF、G-code 这类格式文件。它要解决的核心痛点很直接传统 CAD 建模是纯手工活画一个标准件、改一次尺寸、出一版图纸都得靠人点鼠标而大量重复性、参数化的建模需求其实完全可以用文字描述清楚交给程序去生成。我接触这个方向是从一个很具体的场景开始的。当时团队要做一批机械臂的仿真验证需要几十个不同规格的连杆和底座模型每个模型都要导出 URDF 给仿真环境用。如果一个个手工建模再导出光是重复劳动就能把人耗死。后来我们尝试用脚本加参数化模板的方式把“描述”和“模型”之间的映射关系固定下来效率直接翻了好几倍。这就是 text-to-cad 思路的雏形——不是让 AI 凭空画图而是把人的意图用结构化或半结构化的文字表达出来再由程序翻译成几何。它适合谁来用我总结下来有三类人最受益。第一类是机械、结构工程师手里有大量参数化零件要反复出图第二类是机器人方向的开发者需要批量生成 URDF 模型做仿真第三类是做数控加工的朋友想把设计意图快速转成 G-code 去试切。哪怕你只是 CAD 初学者理解这套逻辑也能帮你少走很多弯路因为你会开始用“参数”和“约束”的视角去看待建模而不是单纯记命令。需要先泼一盆冷水text-to-cad 不是万能许愿机。你输入“画一个好看的椅子”它大概率给你一堆没法加工的东西。但如果你输入“座面 450x450高 450四腿直径 30腿间距 400”它就能给你一个规规矩矩、可以直接出图的模型。所以这个方向的核心能力在于把模糊需求翻译成精确参数再用几何内核去执行。下面我就把这套东西拆开从整体设计思路一直讲到实操踩坑。2. 整体方案怎么搭三种技术路线的取舍2.1 路线一参数化模板加文本解析这是最稳、最可控的一条路也是我目前主力推荐给工程团队的方案。核心思路是先用 CAD 软件或几何内核把模型做成参数化模板把关键尺寸暴露成变量然后写一个文本解析层把自然语言里的尺寸、数量、位置信息提取出来映射到这些变量上最后调用建模接口重新生成模型并导出。为什么这条路线稳因为几何质量完全由模板保证文本层只负责“填参数”不会把模型搞崩。比如一个法兰盘模板你只需要解析出外径、内径、螺栓孔数量和分布圆直径这几个参数剩下的圆角、倒角、基准面都是模板里定死的。实测下来这种方案的模型成功率接近百分之百前提是你的解析规则覆盖了用户可能说的表达方式。它的短板也很明显模板得提前做覆盖的场景有限。用户说一个模板里没有的零件系统就抓瞎了。所以这条路适合产品线相对固定、零件族谱清晰的团队。我们当时做机械臂连杆就是这么干的一共做了十二个基础模板覆盖了八成以上的需求剩下的两成再手工补。2.2 路线二代码化建模加 LLM 生成脚本这条路线更激进也更接近大家想象中的“AI 建模”。代表工具是 CadQuery、OpenSCAD 这类代码化建模库你用 Python 或类似语言描述几何然后由大语言模型根据自然语言生成这段代码执行后得到模型。我试过让模型生成 CadQuery 脚本来画一些简单零件效果时好时坏。画个方块、圆柱、简单孔位基本一次过一旦涉及复杂曲面、阵列、布尔运算嵌套生成的代码就容易报错或者几何不对。原因不难理解LLM 对几何拓扑的理解还是偏弱它更像是在“背代码模式”而不是真的在脑子里构建三维形状。但这条路线的潜力在于灵活性。模板方案覆盖不了的异形件代码化建模理论上都能描述。我的建议是把它当成“辅助生成器”而不是“全自动流水线”让模型先出一版脚本人工检查修改后再执行。这样既享受了生成速度又守住了几何正确性的底线。另外代码化建模天然适合版本管理脚本进 Git改了什么一目了然这点比二进制 CAD 文件强太多。2.3 路线三端到端模型直接输出几何还有一类方案是训练专门的模型直接输出网格或边界表示数据。这类方案听起来最酷但落地最难。几何数据的表示本身就复杂网格顶点顺序、面片法向、拓扑连通性任何一处出错都会导致模型破面或者无法加工。而且这类模型通常需要大量配对数据来训练数据获取成本极高。我个人的判断是端到端方案在短期内更适合做概念草图或者快速预览真要出工程图、下车间还是得回到前两条路线。所以下面我的实操讲解会以参数化模板和代码化建模为主端到端方案作为补充提一下。2.4 三种路线对比对比维度参数化模板加文本解析代码化建模加 LLM端到端模型输出几何可靠性高中低到中场景覆盖度低到中高中前期投入中低高适合团队产品线固定探索型团队研究型团队输出格式支持STEP/URDF/G-code 都稳STEP 稳URDF 需转换多为网格我的推荐度首选辅助观望这张表是我踩了不少坑之后总结的。选路线之前先问自己一个问题你要的是“稳定出图”还是“什么都能画”前者选模板后者选代码化别指望一个方案全占。3. 核心细节拆解文本怎么变成几何3.1 文本解析层把口语变成结构化参数这一步是整个流程的入口也是最容易被低估的环节。用户不会规规矩矩地说“外径 100 毫米”他可能说“直径十个厘米”“一百的圆”“φ100”。你的解析层得把这些都归一化。我的做法是分两步走。第一步做实体和意图识别判断这句话是在描述一个圆柱、一个板、还是一个孔阵列。第二步做参数抽取把数字和单位抓出来统一换算成毫米。这里有个经验单位一定要在解析层就统一不要留到几何层再换算否则后面全是坑。我们当时吃过亏有人输入英寸有人输入毫米模型尺寸差了二十五倍差点把样件加工废了。具体实现上正则表达式能覆盖大部分规整表达剩下的边角情况可以用小模型做兜底。比如下面这段伪代码就是抽取“长宽高”三个参数的简化逻辑import re def parse_box(text): # 匹配 长100 宽50 高20 这类表达 patterns { length: r(?:长|长度)[度为]?\s*(\d(?:\.\d)?), width: r(?:宽|宽度)[度为]?\s*(\d(?:\.\d)?), height: r(?:高|高度)[度为]?\s*(\d(?:\.\d)?), } result {} for key, pat in patterns.items(): m re.search(pat, text) if m: result[key] float(m.group(1)) return result print(parse_box(做一个长100宽50高20的方块)) # {length: 100.0, width: 50.0, height: 20.0}这段代码很粗糙但能说明思路先把关键字段抓出来再交给下游。实际项目里我会加上单位识别、同义词映射、缺省值填充。缺省值很重要用户没说的地方你得有个合理默认不然几何层没法执行。注意解析层一定要保留原始输入和解析结果的对应关系方便出问题时回溯。我们后来加了一个日志表每次解析都记下来排查效率高了很多。3.2 几何生成层参数怎么驱动模型解析出来的参数最终要喂给几何内核。如果你用的是商业 CAD 的二次开发接口那就是调用它的 API 改参数、重建、导出。如果你用的是开源几何内核比如 OpenCASCADE那就是直接构造几何体。这里的关键概念是“特征树”和“重建”。参数化模型不是一堆死几何而是一棵有顺序的特征树先拉伸再打孔再倒角。改一个参数整棵树按顺序重算。所以你在设计模板的时候特征的顺序和依赖关系必须理清楚。我见过有人把倒角放在打孔前面结果孔的位置一变倒角就穿帮了。以法兰盘为例特征树大概是这样基准圆盘拉伸中心通孔切除螺栓孔阵列切除外圆倒角端面倒角。每个特征绑定一到两个参数。文本解析出“外径 120内径 608 个 M8 孔分布圆 90”几何层就按这个顺序重建。重建完再导出 STEP整个流程就闭环了。3.3 格式导出层STEP、URDF、G-code 各管什么这三种格式经常被混为一谈其实用途完全不同导出时的注意事项也不一样。STEP 是通用三维交换格式保留完整的边界表示信息适合给别的 CAD 软件打开、给加工厂看。导出 STEP 时要注意单位设置和坐标系朝向不同软件默认值不一样我一般显式指定毫米和 Z 轴向上。URDF 是机器人描述格式它不只是几何还包含关节、连杆、惯性、碰撞体这些信息。从 CAD 转 URDF几何只是第一步更麻烦的是把装配关系翻译成关节树。我的经验是在 CAD 里就把每个连杆单独存成零件装配体里用配合关系表达关节导出时再按配合关系生成 URDF 的 joint 节点。惯性参数如果 CAD 里没算可以用简化公式估或者用网格体积乘密度。G-code 是数控加工指令它描述的是刀具路径不是几何本身。从模型到 G-code 中间还隔着 CAM 工序选刀具、定切削参数、生成刀路。text-to-cad 能帮你把模型快速准备好但 CAM 这一步目前还是得靠专业软件或者有经验的师傅。我试过用脚本自动生成简单零件的 G-code只适合形状极规整、公差要求不高的场景复杂件千万别这么干。格式主要用途导出关键点常见坑STEP跨软件交换、出图单位、坐标系、版本高版本对方打不开URDF机器人仿真关节树、惯性、碰撞体几何原点不对导致关节错位G-code数控加工刀具、切削参数、坐标系直接转几何会丢加工信息4. 实操过程从零搭一个 text-to-cad 小流程4.1 环境准备与工具选型我建议先用 Python 生态起步因为库全、上手快。几何内核用 CadQuery 或者直接调 FreeCAD 的 Python 接口文本解析用正则加简单的规则引擎导出 STEP 这两个库都支持。如果你要 URDF可以配合 urdfpy 或者自己写 XML 生成逻辑。安装这块CadQuery 用 conda 装最省心pip 装有时候会缺依赖。FreeCAD 的 Python 接口需要先装 FreeCAD 本体再把它的库路径加到环境变量里。我实测下来CadQuery 在纯脚本建模场景更顺手FreeCAD 在需要复杂特征和装配时更全面。提示别一上来就追求全自动。先把“解析-建模-导出”这条链路用最笨的方式跑通哪怕只支持一个零件也比搭了一堆框架跑不起来强。4.2 第一个可运行示例文字生成一块安装板我们拿一块带孔的安装板练手。需求描述是“长 120宽 80厚 8四角各一个直径 6 的通孔孔中心距边 10”。解析层抓出长宽厚和孔参数几何层用 CadQuery 建模import cadquery as cq def make_plate(length, width, thickness, hole_d, edge_offset): # 创建基础板 plate cq.Workplane(XY).box(length, width, thickness) # 计算四角孔位 x length / 2 - edge_offset y width / 2 - edge_offset points [(x, y), (-x, y), (-x, -y), (x, -y)] # 打孔 plate ( plate.faces(Z).workplane() .pushPoints(points) .hole(hole_d) ) return plate result make_plate(120, 80, 8, 6, 10) cq.exporters.export(result, mounting_plate.step)跑完这段当前目录下就会生成一个 STEP 文件用任意 CAD 软件都能打开。这就是最小可用的 text-to-cad 闭环。你可以把参数换成从文本解析出来的值整条链路就通了。4.3 参数计算孔位和边距怎么定才合理上面例子里孔中心距边 10 毫米这个值不是随便定的。它取决于孔径和板材强度。工程上有个经验规则孔中心到边的距离至少是孔径的 1.5 到 2 倍否则孔边容易开裂。直径 6 的孔边距至少 9 到 12取 10 是合理的。再比如螺栓分布圆如果孔数多、分布圆小孔与孔之间会干涉。判断公式是相邻孔中心距要大于孔径加两倍最小壁厚。8 个 M8 孔分布在直径 90 的圆上相邻孔中心距约等于 90 乘以 sin(22.5 度) 再乘 2算下来约 34.4 毫米远大于 8 加壁厚没问题。这些计算如果能在解析层自动做校验就能在建模前拦住不合理需求。我在模板里加了一层“参数合理性检查”比如长宽厚必须为正、孔径不能大于板宽、孔位不能超出边界。检查不通过就返回提示让用户改描述。这一步看着多余实际能省掉大量返工。4.4 导出 URDF 的关键步骤如果你做的是机器人模型导出 URDF 时要注意几件事。第一每个连杆的几何原点要和关节轴对齐否则仿真里关节会绕着奇怪的点转。第二质量惯性参数要么从 CAD 算要么用简化几何估不能留空很多仿真器会报错。第三碰撞体可以用简化几何代替显示几何提高仿真速度。我的做法是在 CAD 里给每个连杆建一个局部坐标系原点放在关节轴线上导出网格后在 URDF 里用 origin 标签把网格偏移回去。惯性参数用连杆的包围盒近似算虽然不精确但对运动学验证够用。等设计定型了再换成精确值。4.5 导出 G-code 的边界与限制前面说过G-code 不是几何格式是加工指令。如果你只是想把模型送去加工导出 STEP 就够了让加工方自己出刀路。如果你确实想自动生成 G-code那得先明确加工方式三轴铣、车削、还是激光切割不同方式刀路逻辑完全不同。我试过用脚本给简单板件生成激光切割 G-code思路是把轮廓线提取出来按切割顺序排列加上进给和功率参数。这个场景相对简单因为激光切割就是二维轮廓。但三轴铣削就复杂多了要处理刀具半径补偿、分层切削、残料清除脚本很难覆盖全。所以我的建议是text-to-cad 负责把模型准备好CAM 交给专业工具别硬扛。5. 常见问题与排查技巧实录5.1 模型生成失败或几何异常最常见的问题是布尔运算失败比如打孔时孔位刚好落在边线上或者两个特征重叠导致内核算不出来。排查思路是先把参数打印出来看看有没有越界或者退化的情况。我遇到过一次用户说“孔距边 5”但孔径是 10孔直接切到板外了内核直接报错。后来加了边界检查就再没出过。另一个高频问题是单位混乱。CAD 内核默认单位可能是米你输入的是毫米模型就小了一千倍。解决办法是在流程入口统一单位所有参数进几何层之前都换算成同一单位并且在内核初始化时显式设置单位。5.2 文本解析漏抓或误抓用户表达千奇百怪正则总有覆盖不到的时候。我的经验是建一个“未识别语料”收集机制把解析失败的输入存下来定期分析补充规则。另外数字和单位的组合要特别小心比如“M8”里的 8 不是尺寸“4 个孔”里的 4 是数量不是孔径。这些歧义要靠上下文和关键词来消解。5.3 导出文件在目标软件里打不开STEP 版本兼容是个老问题。高版本导出的 STEP老软件可能读不了。我一般导出时选 AP214 或者 AP203兼容性最好。URDF 打不开通常是 XML 格式错误或者引用的网格路径不对用文本编辑器打开检查一下标签闭合和文件路径。G-code 在机床里跑飞多半是坐标系原点没设对或者进给速度单位搞错了。5.4 常见问题速查表现象可能原因排查动作解决方式建模报错参数越界或退化打印参数检查范围加边界校验模型尺寸差千倍单位不统一检查内核单位设置入口统一换算解析结果为空表达超出规则查看原始输入补规则或加兜底STEP 打不开版本过高换低版本导出用 AP214URDF 关节错位原点未对齐检查 origin 标签对齐关节轴线G-code 跑飞坐标系或单位错核对机床设置显式指定单位和原点5.5 几条踩坑换来的经验第一条模板不要贪多。一开始做三五个最常用的跑顺了再扩。我见过有人一口气做几十个模板结果每个都有小毛病维护成本爆炸。第二条日志一定要全。每次解析、每次建模、每次导出都记下来出问题能快速定位。这个投入在项目初期看不出价值后期能救命。第三条人工兜底通道要留着。再智能的系统也有搞不定的输入留一个“转人工”的入口比硬撑着自动处理强。第四条几何正确性永远优先于生成速度。一个跑得快但模型是错的系统还不如手工建模。每次改完流程拿几个标准件回归测试一下确保没退化。6. 这套东西后续还能怎么扩展跑通基础流程之后我建议往两个方向延伸。一个是往上游走接入更自然的交互方式比如语音输入或者图纸识别让“描述”这件事更省力。另一个是往下游走把生成的模型直接接到仿真或者加工流程里形成设计到验证的闭环。还有一个我觉得很有价值的方向是建一个“参数知识库”。把常用零件的标准参数、材料密度、加工余量都存进去解析层抓到零件类型后自动补全缺省参数。这样用户描述可以更简略系统反而更聪明。我们当时做机械臂连杆就是把常用长度和截面尺寸存成推荐值用户只说“来个 300 的连杆”系统自动补齐其他参数。最后分享一个小技巧如果你要批量生成模型别一个个串行跑用多进程或者任务队列并行处理速度能快好几倍。几何重建是计算密集型任务多核利用起来很划算。但要注意导出文件命名别冲突我一般用参数哈希做文件名保证唯一。这套 text-to-cad 的思路说到底就是把人的设计意图用文字表达用程序翻译成几何。它不会取代工程师但能把工程师从重复劳动里解放出来去做真正需要判断和创造的部分。我在实际项目里用下来最直观的感受是以前改一版尺寸要半小时现在改一句话重新生成几十秒的事。这种效率提升才是它真正的价值所在。