
最近这段时间我密集测了一轮 text-to-cad 相关的工具和开源项目。先说个最直观的感受这个词虽然只比 text-to-3d 多了三个字母但两者完全不是一个物种。text-to-3d 给你的是三角网格做渲染摆件绰绰有余但要拿去 CNC 加工、3D 打印出实物、或者丢进 CAE 里做仿真网格基本等于废纸。text-to-cad 的目标是输出真正的 CAD 模型——带特征树、带草图约束、能改参数、能重新计算导出的 STEP 文件能直接进 CAM 切刀路。这篇文章就是我把这段实测过程整理出来的结果。内容包括text-to-cad 到底在解决什么问题、当前几条主流技术路线各自的脾气、从一句自然语言到可编辑 CAD 文件的完整操作流程、决定生成质量的隐藏细节、落地时最常见的翻车场景和排查顺序以及如果你们团队想自己训一套私有模型最小可行方案应该怎么搭。适合正在评估这个方向能不能进研发流程的工程师也适合做 AIGC 但对参数化建模不太熟的研究者。1. 先搞明白一个前提text-to-cad 的产物为什么不是模型而是特征树1.1 从网格到 B-rep差了一个可编辑等级做 AI 生成的人对 3D 的认知通常停留在 mesh——一堆三角形拼出来的表面。text-to-3d 的生成器本质上是去预测这个形状长什么样最后抽一个网格出来。但 CAD 行业的内部表示方式完全不是这样主流是 B-repBoundary Representation边界表示。B-rep 用精确的拓扑关系来描述实体面、边、顶点以及它们之间怎么连接而且这些曲面是解析曲面——平面、圆柱面、圆锥面、B 样条曲面。半径为 50 的圆柱面算出来就是 50.000不是 49.97。这个差别决定了 text-to-cad 不能像 text-to-3d 那样画一幅很像的图就行。它必须生成拓扑正确、面与边完全闭合、能求出体积和质量属性的实体。CAD 内核OpenCASCADE、Parasolid、ACIS 这类在导入模型时非常严格一旦检测到一条非流形边、一个自相交面、一片翻转法向的薄壳随时会拒收这个文件。网格可以看起来像蒙混过关B-rep 没有这个缓冲带。1.2 设计意图CAD 的灵魂不在形状在参数关系不少第一次接触参数化建模的人会把建模理解成造型。但我在实际工程里待久了越来越觉得参数化 CAD 更像写程序草图是代码尺寸是变量特征操作是函数特征树就是执行顺序。你改一个变量——比如法兰外径从 100 改成 120——理想情况下整个模型应该自动重新计算所有关联的孔位、倒角、厚度跟着变。这个能力在 CAD 行话里叫设计意图design intent也是一个模型真正的价值所在。所以 text-to-cad 要生成的不只是一个看起来像 X 的静止形状而是一整套可以被编辑的规则孔位是阵列还是逐一草绘、倒角加在哪个特征后面、厚度由哪个尺寸驱动。如果生成的结果打开特征树一看里面是一堆失去关联的绝对坐标草图那跟拿 b-rep 网格又有什么区别生成一个看起来对的模型只是及格线生成一个工程师能持续修改的模型才是目标。这也是这个方向比 text-to-3d 难那么多的根源——它需要几何生成能力和程序特征序列生成能力同时在线。1.3 为什么通用大模型不能直接画出 CAD很多人会问既然大模型什么都会直接让它输出 CAD 文件不就行了问题是 CAD 文件不是一张图而是一串操作历史。你要从一块毛坯圆柱开始拉伸、挖孔、倒角、布尔差集每一步都有依赖关系。大模型本质上是个 token 预测器它擅长的是语言序列、代码序列但它没法直接幻想出一个拓扑闭合的实体。它必须借助 CAD 内核把描述转成一步一步的建模指令让内核去执行、去计算、去检验。所以 text-to-cad 的所有技术路线本质都在解决同一件事如何让模型生成可执行且可编辑的建模指令序列而不是生成好看的表皮。2. 当前主流的三条技术路线代码生成、扩散模型、检索装配2.1 路线一让大模型写参数化代码这条路是门槛最低、迭代最快的。思路特别朴素CAD 的二次开发 APICadQuery、build123d、OpenSCAD、Fusion 360 Python、Onshape FeatureScript本质上是用代码描述建模过程而大模型最擅长的就是写代码。你让 LLM 直接输出一段 CadQuery 代码扔进 Python 执行跑通了就得到一个带特征树的模型。我实测下来这条路线对常见机械零件的命中率相当高。比如一个带 6 孔法兰外径 100内径 50厚度 20均布 6 个直径 8 的孔让现成的代码大模型直接写一次跑通的概率不低。因为 CadQuery 社区有大量现成写法模型在训练数据里见过类似代码。但一旦涉及复杂曲面放样、多实体布尔运算、扫掠路径之类的操作代码就开始胡说编造不存在的 API、参数名对不上函数签名跑起来全是红色报错。这条路的优点非常明确输出天然可参数化改尺寸就是改代码里的变量建模过程完全透明每一步干了什么都能审计。缺点也明显模型的幻觉集中在 API 调用上而且它经常为了凑你 prompt 里的某个词硬加一堆无意义的操作整个特征树冗余得没法看。2.2 路线二把建模操作序列当语言用生成模型直接吐这是现在学术界和工业界押注最多的方向。核心思路是把 CAD 建模过程表示成一个操作序列画草图圆、圆心在原点、半径 r→ 拉伸深度 d→ 倒角半径 f→ 阵列孔6 个。这些操作可以离散化成 token然后训练一个自回归模型或者扩散模型去生成 token 序列最后在 CAD 内核里把这段操作重新播放一遍得到实体。公开工作里 DeepCAD、Text2CAD、以及 Zoo 推出的 Text2CAD、Google DeepMind 的 Grace本质都是这个思路只是工程化程度不一样。这种模型的好处是它学的是真实建模习惯——什么操作先做、什么后做、草图怎么约束——而不是像路线一那样赌代码库里恰好有这个写法。坏处也直接训练数据非常贵需要把大量真实 CAD 模型反解成特征树和参数光数据清洗就能干哭一个团队而且生成能力被训练集里的操作类型锁死遇到没见过的特殊特征基本只能摆烂。2.3 路线三检索 模板参数化这条路线往往被人忽略但我觉得在工业落地里它是最稳的。思路是建一个零件库或者模板库text-to-cad 先做语义检索找到最匹配的模板再用 LLM 或规则引擎把文本里的关键参数尺寸、孔距、倒角值映射到模板参数上。这相当于做标准件派生标准法兰、电机安装座、外壳类零件的变型设计。它的上限不高只能覆盖预先建好的零件族但它几乎不会失败。参数从文本里抽错的比例比从头生成低得多。制造业里大量需求本质上就一句话我要一个孔径 X、底座边长 Y、带 Z 个安装孔的电机座。这种需求不叫生成模型但叫参数化变型能直接干活。很多时候比一个看起来像但没法改的生成模型有用得多。2.4 三条路线怎么选我自己的取舍原则是先用路线一跑通整个流程把路线二作为研究上的重点用路线三保底。路线可编辑性泛化能力数据需求落地难度最适配场景LLM 写参数化代码高代码即模型较好依赖底座模型低用现成 LLM低概念设计、快速原型、非标方案初稿扩散/自回归生成特征序列中特征树可改但受训练集限制低被操作类型锁死很高需要大量真实 CAD 特征序列高复杂零件的自动化生成研究检索 模板参数化高模板内自由改低仅覆盖模板族中模板库建设成本低标准件、系列件变型设计如果一个团队只有两三个工程师又要快速出效果我建议先做路线一 路线三的组合常见件走模板派生非常规件让 LLM 写代码生成完再用统一脚本做几何检查和修模。路线二值得投入但它是长线工程别指望两个月内能替换掉你们现有的设计流程。3. 实测流程从一句自然语言到可编辑 CAD 文件3.1 环境准备和工具选型想上手实测我建议从开源项目开始不要一上来就买商业 API否则你根本不知道生成的模型是怎么来的后面排错也没法下手。以 Zoo Text2CAD 这个开源实现为例它的通用流程大致是准备一台至少 24GB 显存的 GPU生成质量跟显存关系很大显存太小得降分辨率而 CAD 这行降分辨率基本等于废。用 conda 或者 uv 建 Python 虚拟环境装 PyTorch、CAD kernel 相关的绑定库。下载模型权重 checkpoint现在公开权重一般是经过 CAD 操作序列预训练后再用文本-模型对微调的。跑一句命令行输入 prompt指定输出路径生成一个 STEP 文件python generate.py \ --prompt a mounting bracket with two 6mm holes spaced 40mm apart, 10mm thick, with a 2mm fillet on all edges \ --output bracket.step生成完成后用 FreeCAD 打开 STEP 文件或者直接打开项目导出的原生格式你就能在左侧看到特征树了。这一步非常关键如果打开后只有一个哑实体没有特征历史说明工具生成的是 B-rep 快照而不是参数化特征可编辑性要打折扣。3.2 写 prompt 的几条铁律附示例prompt 写得好不好直接决定生成结果是能用的初稿还是要删掉重来。这段时间我总结了六条铁律先说单位。所有尺寸后面都带 mm、inch 或 cm。不带单位是大模型的默认死穴它只会随机猜一个。给绝对尺寸和坐标。不要用大一点厚一点这种相对词要用外径 100厚度 20这种绝对数值。模型做的是 token 预测相对词它没法换算。明确基准平面和拉伸方向。比如草图在 XY 平面沿 Z 方向拉伸 10mm。不说清楚它可能默认 Y 轴向上出来的模型整个翻面。一次只描述一类核心特征。不要在一个 prompt 里同时要放样、扫掠、布尔、阵列操作越多出错概率指数上升。删掉装饰性词汇。漂亮的光滑的看起来很现代这些词对大模型生成代码没有帮助反而可能把它引向非 CAD 的语义空间生成一堆不存在的 API。用数字范围做约束。如果你对某个尺寸不敏感可以写between 20 and 30mm这比差不多就行有效得多模型会在数值分布里采样一个合理值。举一个对比示例。好 promptCreate a rectangular mounting plate, 80 x 50 x 10 mm, in the XY plane, extruded along Z. Add four 6 mm through-holes at the corners, centers 10 mm from each edge. Units: mm.坏 promptmake a nice bracket with some holes, not too big, smooth edges后者我跑出来的结果经常是尺寸完全靠猜、孔位随机撒、还多出一堆莫名其妙的圆角特征。做 text-to-cadprompt 的质量比在文生图里重要得多因为几何是精确系统差一毫米就是废件。3.3 拿到输出后怎么验收很多人跑通一次就开心地以为结束了恰恰是这时候坑才开始。我有一个固定的验收清单每次生成后必须过一遍检查项方法通过标准形状视觉 关键尺寸测量与 prompt 描述的偏差在可接受范围单位看 FreeCAD 单位设置和 STEP 头文件mm / inch 确认无误实体性用几何检查功能检测单一 solid无开放壳、无非流形边可重算修改一个主尺寸触发重新计算特征树无红叉、无报错可导出导出 STEP 后再重新导入无报警、几何保持完整这里特别提醒可重算这一项。生成模型可能给你一个看着很对的实体但一旦你改动父尺寸整个特征树直接崩掉。我在实测里见过不少案例模型生成时用的是写死的绝对坐标没有约束关系改一个孔距其他孔全留在原地这种模型在工程上等于一次性筷子。验收的时候一定要亲手改一个参数看看模型的表现再下结论。4. 决定生成质量的隐藏细节坐标系、单位、约束与特征顺序4.1 坐标系与草图平面一个方向念错整个模型翻面CAD 江湖里一直有Z 轴向上和Y 轴向上两派。机械设计里常用 Z 上某些 DCC 工具和部分仿真软件习惯 Y 上。生成的模型如果坐标系基准选错轻则视图里看着歪重则装配时所有约束全部失效。你验证方式很简单生成后立刻检查基准平面和第一个草图的方向看拉伸方向是不是和你要的一致。如果模型整体镜像了大概率是草图平面的法向定义反了如果模型转了 90 度大概率是坐标轴向的约定问题。要治这个病prompt 里就得把在哪个平面画草图、往哪个方向拉伸写死这是我在 3.2 里反复强调的原因。另外生成后用对齐工具把基准坐标对齐到装配原点花不了半分钟但能避免后续一整套装配崩掉。4.2 单位模型眼里的毫米和英寸这是我踩过最深的坑没有之一。大模型训练数据里毫米和英寸混着来你写5mm它可能理解成5但底层单位默认成了 inch最后实际尺寸是 127mm。更阴险的是有时候 STEP 文件里根本没写单位元数据CAD 软件只能靠模型整体大小去猜——小模型被自动当 inch大模型被当 mm一旦猜错导出 STEP 再导入尺寸全变了。所以验收清单里我专门放了一行单位确认。拿到文件第一件事在 FreeCAD 的单位设置里看当前文档单位量一个关键尺寸和 prompt 里的数字对比。不要只看百分比要实际量。另外如果你准备做自动化流程批处理生成完一定要用脚本检查 STEP 头文件里的单位字段有问题直接标记不要流到下游。4.3 约束优先于坐标能参数化才算 CAD这里多说一句约束和坐标的区别。假设法兰上有 6 个孔你可以用 6 个绝对坐标画 6 个圆这就是坐标驱动你也可以画一个圆标注直径然后做阵列用一个角度参数控制分布这就是约束驱动。从外形上看两者一模一样但从设计意图上看一个改参数就崩一个改参数全会跟着变。text-to-cad 生成的模型我见过太多全是坐标驱动——因为它就是这么被训练的写死坐标比推理约束关系简单得多。你自己做 prompt 的时候可以明确要求use pattern/array for holes、define hole centers relative to plate center这能大幅提高生成结果的约束质量。万一生成出来没有约束导入 FreeCAD 后手动加几个约束也不难关键是要有这个意识拿到模型先检查约束关系而不是先看形状像不像。4.4 特征顺序为什么圆角不能乱加参数化建模里特征顺序太重要了。标准流程一般是拉伸主体 → 打孔 → 阵列 → 圆角/倒角。顺序错一步结果可能天差地别。比如你先在棱边上加了 2mm 圆角再打孔孔口边缘的圆角会被布尔差集吃掉边界就乱了反过来你先打孔再加圆角圆角会沿着孔口边缘走形态更干净。但很多 LLM 生成的代码完全不管这些最后一个圆角命令经常因为找不到边而直接报错。还有一个经典翻车圆角半径大于壁厚。你要求壁厚 3mm圆角 4mm几何内核里根本算不出来——材料都不够圆角吃不是报错就是生成一个扭曲的自相交面。遇到这种情况我一般是让 prompt 里圆角值跟壁厚挂钩或者生成后看到报错就知道是特征顺序的问题先删掉圆角做完全部主体特征再加回去。5. 落地时的翻车现场常见失败模式与排查链路5.1 非流形与自相交几何内核的无声拒收CAD 内核是最不讲情面的一层。网格模型流行一个三角形嵌进去渲染出来没人发现B-rep 只要有一个自相交面很多下游操作直接罢工。我跑 text-to-cad 时遇到最多的一类报错就是profile is self-intersecting草图轮廓自相交或者cannot create solid: shell is not closed。根因很简单生成模型在预测草图时把两条本该分开的线段交错到一起了。比如拉伸截面是个 L 形两条线段本该在拐角相接模型却给画岔了。这种错误没有任何肉眼预兆靠的就是内核检测。所以批处理跑生成任务时一定要第一时间做几何健康检查过滤掉所有 non-manifold、open shell、self-intersect 的结果。这一步不做后面全是在垃圾上盖楼。5.2 单位漂移看起来对量起来错前面 4.2 讲了单位问题的原理这里说一个我真实遇到的例子。我用 prompt 生成一个直径 5mm 的定位销出来的 STEP 文件在 FreeCAD 里显示尺寸是 5但实际质量属性一算体积对应的直径是 127mm——模型内部用的是 inch 单位数值 5 英寸等于 127mm。单个零件看不出问题一旦拿去装配或者加工直接报废。我的处理办法是生成脚本里统一做一步单位归一化——用 OCPOpenCASCADE 的 Python 绑定打开模型读文档单位跟预设单位比较不一致就缩放 25.4 倍并重写单位字段。这条逻辑写死在预处理流程里不要靠人肉盯。5.3 特征树重建失败改一个尺寸全线飘红这是所有看起来能用的模型里最坑的一种。你把生成的文件拖进 FreeCAD形状完美孔位分布均匀倒角似乎在。但你随手把板厚从 10 改成 15点了重新计算整个特征树瞬间红叉一片。原因是生成时用的是绝对坐标草图父特征一变依赖它的所有子特征全部失去参考。遇到这种情况别再傻傻地手修特征树。正确的做法是回到源头给 prompt 加约束要求或者换一种生成方式比如改走检索模板路线让模型生成时就用相对约束、用参考边、用标注尺寸。我花了很长时间才意识到这类问题在你改第一个参数之前是永远发现不了的——所以验收清单里的改一个主尺寸步骤一定不能省。5.4 我的排查顺序生成结果出问题的时候别慌按这个链路从前往后排查多数问题十分钟内能定位看日志。哪个操作报的错拉伸还是布尔还是倒角把报错卡点记住。单独重放草图。把报错特征之前的草图单独拿出来检查轮廓是否闭合、有无自相交。这一步能干掉一半问题。检查布尔对象。布尔差集之后是不是残留了多余的实体、破面或者退化边用布尔检查功能看是否可以重新合并成一个 solid。按顺序消减特征。把所有倒角、圆角、装饰特征全删掉只保留基础拉伸看能不能重建。可以了再一个个加回。通常很快就能发现是哪个特征触发的失败。用修模工具清洗。有些非流形问题可以通过内核自带的 healing 功能修复但不能指望修复完还得再过一遍健康检查。果断重新生成。如果模型结构已经烂到没法救了直接改 prompt 重跑。生成模型重新跑一次的边际成本很低比你在破模型上手工修两个小时值多了。6. 想自己训一套私有 text-to-cad最小方案长什么样6.1 先锁死零件族数据集的正确打开方式很多人一上来就想训一个什么都能生成的通用模型我劝你放弃这个念想。CAD 零件种类太庞大特征组合是天文数字通用模型的训练成本和数据需求根本不是普通团队扛得住的。正确的做法是先锁死一个零件族只做钣金支架、只做电机安装法兰、只做外壳类零件。零件族定死了特征模式有限数据才攒得起来效果才出得来。数据来源我建议用模板批量生产而不是到处爬。你在 CadQuery 或者 build123d 里写一个参数化模板随机化尺寸参数批量跑出几千个模型同时导出 STEP 文件和对应的建模代码。这种数据的质量比从网上七拼八凑高一个量级因为它自带 ground truth 特征树而且干净——没有破面、没有没人要的冗余特征。如果你需要文本-模型对可以用模板化的文本生成器拼写出描述比如a bracket with ${width}mm width, ${hole_count} holes along the long edge。6.2 两条自训路线的性价比对比方案技术栈代价效果适合团队A开源代码模型 LoRA 微调Qwen2.5-Coder / CodeLlama LoRA低几千条高质量代码-文本对就能看到效果能生成 CadQuery 代码间接得到 CAD 模型1-2 个 ML 工程师想快速落地B自建操作序列生成模型参考 DeepCAD / Text2CAD 思路自己实现 tokenizer transformer/diffusion高要自己做 CAD 数据反解、序列化、训练、解码、内核重放生成更接近真实建模习惯但开发周期长有 CAD 数据团队和算法研究能力的团队我在 6.1 里说锁死零件族目的就是为了让方案 A 也能出效果。一个零件族内的 CadQuery 代码模式相对固定LoRA 微调几百步就能学会这种风格。方案 B 是更本质的方向但它每一步都是硬骨头CAD 操作序列的反解工具链就够忙活大半年。如果团队预算和工期允许我的建议是A 保交付、B 做预研。6.3 评估指标别只看相似度要看能不能改自训模型必须建一套自己的评估指标。别抄文生图那套什么 FID、CLIP score在 CAD 领域参考价值有限。我推荐三层评估几何相似度在生成模型和真模型的表面上均匀采样点云算 Chamfer Distance。这一层只能说明像不像通过门槛即可不必过分追求。结构正确性模型必须是单一 solid、流形、无自相交特征树能完整重新计算导出 STEP 再导入无报警。这一层不通过直接标记失败不用进入下一层。可编辑性随机修改一个主参数看特征树重算成功率、平均手动修复时间。这才是能不能进研发流程的核心指标。另外非常推荐维护一个金标准评测集50 个典型零件每个配 3 句话的描述固定不变。每次模型迭代后都跑一遍既防退化又方便对比。不要今天换一组测试样本明天换一组那样你根本分不清是模型进步了还是题目变简单了。6.4 踩完一圈后的几个实在建议最后说几个我实操之后才明白的道理。第一prompt 模板库的收益比模型参数量大得多。我给同一个模型做了三套不同的 prompt 模板生成成功率能从 40% 拉到 70% 以上。先把常用的几十种零件描述固化下来再回头调模型性价比完全不一样。第二把验收脚本自动化。生成完立刻跑几何健康检查非流形、确定不了单位的直接打回重生成。我在团队里把这一步做成了流水线的一部分效果立竿见影——下游工程师拿到的文件平均返工次数降了一半。第三允许模型说不知道。我自己体验下来最难受的不是模型生成得烂是它明明烂还硬编一个尺寸充数。你可以让模型的输出先是一个置信度判断如果它觉得 prompt 超出了它的能力范围直接返回无法生成并建议改描述比生成一个废件然后浪费一次排错周期要强。第四现在就开始攒数据。text-to-cad 这个方向瓶颈不在模型结构而在高质量的文本-CAD 操作序列数据。哪怕你暂时不训模型把你团队历史项目的图纸、特征树、参数关系整理成结构化数据半年后你想上这个方向的时候数据就是你最大的护城河。我见过太多团队模型跑了三个月最后发现卡死他们的不是算力是数据集太脏。早一天开始整理你落地就早一天。