先聊点实在的。过去做CAD建模,不管是机械零件、消费电子壳体还是建筑构件,基本逃不开“软件操作”这道门槛——要么啃SolidWorks、Fusion 360这类参数化软件,要么用Rhino、Blender硬啃曲面。你脑子里想得清清楚楚的一个结构,落到软件里就是拉伸、切除、倒角、阵列这一连串操作,新手光是把草图约束搞明白就得耗掉几个周末。而text-to-cad这个方向,说白了就是想把这层操作彻底掀掉:你输入一段自然语言描述,模型直接给你生成可编辑的CAD模型文件,拿过来就能继续改参数、做装配、出工程图。
这篇文章我会把text-to-cad当前的主流技术路线、几个代表性方案的原理拆开讲清楚,然后给你一条可以直接上手的实操路径,包括环境配置、参数选择和踩坑记录。适合正在做AI辅助设计、想要评估这类工具能否嵌入现有工作流的工程师,也适合对生成式建模感兴趣但不知道从哪下手的初学者。
1. 内容整体设计与思路拆解
1.1 text-to-cad到底在解决什么问题
CAD设计流程里最耗时、最不产生“智力价值”的部分,其实就是把脑子里已经成型的几何结构,用软件命令一步步“翻译”出来。这个翻译动作本身没多少创造性,但它对手部熟练度和软件熟悉度要求极高。一个工作五年的工程师画一个支架,可能只要十分钟,但一个刚入行的新人可能要折腾一小时,画出来的东西还未必符合加工工艺。
text-to-cad要消灭的正是这个“翻译鸿沟”。它把设计意图的表达方式,从“操作手势”换成“自然语言”。你说“我要一个L形支架,底板上有四个沉头孔,侧板顶部带一个R5的圆角”,模型直接给你生成对应的实体模型。这听起来很美好,但真要做到“能用的程度”,里面牵扯到的问题远比文生图、文生视频复杂得多。
最核心的难点在于:CAD模型不是像素矩阵,也不是三角网格,它是带拓扑关系、带参数约束、带特征历史的“结构化数据”。一张图片生成错了,肉眼看不出来就算了;一个CAD模型如果圆角顺序不对、草图约束缺失或特征树乱成一团,后续修改就等于推倒重来。所以text-to-cad的技术路线,本质上都在回答同一个问题:如何让模型生成“有脑子”的CAD数据,而不是“看着像”的一张图。
1.2 当前几条主流技术路线之争
我接触到的text-to-cad方案大致分三类,各有各的取舍逻辑。
第一类是端到端生成参数化特征序列,代表工作是Text2CAD系列。这类方法把CAD建模过程看成“画草图-加特征-做布尔运算”的序列决策,用Transformer或扩散模型直接输出特征命令序列,类似于让AI“替你在CAD软件里操作了一遍”。好处是生成结果天然带特征历史,可编辑性最好;难点在于序列空间巨大,一个中等复杂的零件可能有上百条特征命令,模型很容易在长序列上崩溃,生成到一半特征树就乱了。
第二类是程序化生成加约束求解,代表是清华大学和Autodesk合作的CADcoder。这类方法走的是“先识别设计意图,再映射到程序模板”的路线——模型学习的是“这种描述通常对应哪类程序结构”,生成结果不是一堆命令,而是一段可执行的Python代码,代码里封装了完整的三维建模逻辑。这套方案对常见零件类型稳定性极高,而且生成结果天然支持参数修改,我实测下来在标准机械零件上的成功率比纯端到端方案高一大截。
第三类是直接生成网格或点云再转B-rep,现在很多“AI建模工具”走的其实是这个路线。这类方法视觉效果最唬人,但转换出来的所谓CAD模型,内部往往没有参数约束,转成STEP文件后就是一个“死模型”,改不了参数,也没法做装配约束。我认为这类工具更适合做前期概念探索、给客户看效果图,真要进工程流程还得重画。
三种路线没有绝对优劣,核心取决于你的使用场景到底是“要个形”还是“要个能改的模型”。我自己在机械零件和工装夹具设计上,更倾向第二类方案,稳定性好,容错率高,后续还能自己改代码微调。
2. 核心方案原理拆解:Text2CAD与CADcoder的技术细节
2.1 Text2CAD:把建模当成“写代码”来训练
Text2CAD这个工作最有意思的地方,是它把CAD建模从视觉任务“翻译”成了自然语言处理任务。你给模型一句描述,它输出的是一个“特征命令序列”——类似于你在CAD软件里录制的一段宏,里面包含草图绘制、拉伸深度、倒角半径、布尔运算类型等所有操作参数。
为了做到这点,作者在CAD数据集上做了大量预处理工作。他们先把原始CAD文件里的B-rep数据,逆向解析成特征历史序列(feature history),再把特征序列映射成token序列。这个映射方式参考了机器翻译里的词表设计:拉伸、旋转、扫掠、倒角这类操作是“动词”,草图几何参数是“宾语”,布尔运算类型是“连词”。模型要学的东西,本质上就是“自然语言到建模操作序列”的翻译规律。
训练时用了标准的Transformer架构,输入是文本描述,输出是命令序列。推理阶段还加了约束优化——每个时间步生成token时,会强制检查前面的特征命令是否符合CAD建模的基本规则,比如“草图必须在平面上”“圆角半径不能大于实体厚度”这类硬约束。这个设计非常关键,少了它就是纯概率生成,多了它才能保证几何有效性。
我看过他们论文里的消融实验,去掉约束优化后,生成结果的几何有效性直接从90%以上掉到70%左右,可见处理CAD数据不是靠模型“聪明”,而是靠规则兜底。
2.2 CADcoder:程序生成路线的代表性工作
CADcoder的核心思路可以概括为一句话:让模型写建模代码,而不是建模数据。这个思路的前提是发现了很多CAD模型在构造逻辑上高度相似——同样是法兰盘,不管尺寸怎么变,建模流程基本是“画圆草图-拉伸-打孔-阵列”。把这类共性抽成模板,模型只需要学会“从描述中判断用哪个模板,以及填什么参数”,难度比直接生成几何数据低了一个量级。
具体实现上,CADcoder的数据库里预存了大量从公开数据集清洗出的建模程序(用CadQuery这类程序化建模库编写),每个程序附带对应的自然语言描述。训练时模型学习的是“描述-程序检索”的匹配关系,推理时先检索最相似的建模程序,然后通过一个大语言模型把用户的自由描述转换成程序里的参数值。检索和参数填充两步走,各自分工,可靠性高很多。
我实测下来,CADcoder在“标准机械零件”这个细分场景下的表现非常稳。你给它“一个方形法兰,中心圆孔直径20,四个安装孔直径6,中心距80”这种描述,它生成的程序几乎可用,出个STEP文件直接丢到SolidWorks里,特征树还整整齐齐。但一旦超过它的模板覆盖范围,比如描述里带曲面、带复杂过渡、带空间弯折,它就会强行套最接近的模板,生成出来的东西形似神不似。所以它的适用边界需要心里有数。
2.3 为什么说“可编辑性”是CAD生成的生命线
我见过很多第一次接触text-to-cad的人,第一反应是“这生成的东西能不能直接用”。这个问题的答案,取决于生成结果是否保留了完整的约束和特征历史。
一个只有三角网格或者纯B-rep壳体的模型文件,哪怕形状一模一样,在传统CAD软件里也是个“死”的:你没法拖动一个尺寸去改设计,没法在某个面上继续加特征,没法做装配约束,因为软件不知道这个面“是怎么来的”。而带特征历史的模型,每一步操作都记录在特征树里,拉伸20毫米就是拉伸20毫米,想改成25毫米,双击改一下数字就完事。
所以如果你打算把text-to-cad工具嵌入到实际工作流,一定要优先选“带特征历史”的输出格式。当前能做到这个的,基本就是序列生成路线和程序生成路线,纯网格转B-rep的工具则基本都做不到。这是一个方向性的判断,选错了后期返工成本极高。
3. 实操过程与核心环节实现:从零跑通一个text-to-cad流程
3.1 环境配置与依赖选型
我目前最常用的组合是CADcoder + CadQuery,这套组合完全开源,pip安装就能跑。先说环境要求:Python版本建议3.10以上,CadQuery对OpenCascade的绑定比较讲究,老版本Python容易遇到编译问题。显卡方面,如果只是跑推理,8G显存的卡够用;如果想微调模型,建议至少上24G。
安装过程我建议按下面顺序执行:
# 创建独立的Python环境,避免污染系统环境 conda create -n text2cad python=3.10 -y conda activate text2cad # 安装CadQuery,这是程序化建模的核心库 pip install cadquery # 安装CADcoder依赖 git clone https://github.com/yilin-wu/cadcoder.git cd cadcoder pip install -r requirements.txt这里有个容易踩的坑:CadQuery和某些版本的numpy存在兼容性问题,安装后先跑一下官方示例验证环境。我遇到过pip自动装了numpy 2.x导致CadQuery报段错误的情况,解决方式是手动降到1.26.4。
然后加载模型权重。CADcoder的官方权重托管在HuggingFace上,首次运行会自动下载,大约2-3GB。如果网络环境不稳定,可以先用huggingface-cli单独把权重下下来,再放到本地缓存目录,避免运行时中断。
3.2 核心推理步骤与参数调优
跑通一个最简单的推理流程大概是这样的:
from cadcoder import CadCoderPipeline pipeline = CadCoderPipeline.from_pretrained("yilin-wu/cadcoder") prompt = "A rectangular flange with a central circular hole of diameter 20mm and four bolt holes of diameter 6mm arranged in a square pattern with center distance 80mm" cad_model = pipeline.generate(prompt) # 导出STEP格式,后续可丢进SolidWorks/Fusion 360 cad_model.export("flange.step") # 预览渲染 cad_model.render("flange.png")这段代码看起来简单,但里面有几个参数值得细调。Temperature控制生成随机性,默认值一般是0.2,对于标准零件我建议降得更低,调到0.1以下,减少输出波动;但如果描述比较模糊、希望模型多尝试几种方案,可以临时调到0.4。Top-p采样建议固定在0.9左右,既能保持多样性,又不会让结果发散。
真正影响生成质量的往往是prompt本身。我测试了大量描述,总结出一个比较可靠的prompt公式:
零件类型 + 整体轮廓特征 + 关键尺寸(带单位)+ 孔位/圆角/倒角等局部特征 + 对称性或阵列要求
对比一下两种写法:
差:一个带孔的板 好:A square plate with a central counterbore hole (through-hole diameter 10mm, counterbore diameter 16mm, counterbore depth 5mm) and rounded corners with radius 3mm第二种写法把“板”定位为square plate,把中心孔定位为counterbore并给了三个关键尺寸,把角落定位为rounded corners,模型生成的精确度完全不一样。模型跟人一样,你描述得越具体,它越不容易自由发挥。
3.3 生成结果的验证与后处理
拿到生成结果之后,千万别直接下结论说“能用”。你需要做至少三个层面的验证。
第一步是几何有效性验证。用CadQuery的validate方法检查实体是否有自相交、零厚度、开壳等问题。这一步不用等,运行秒级完成。
from cadquery import exporters # 检查几何有效性 result = cad_model.validate() print(result)如果validation报错误,最简单的处理方式是把描述拆得更碎、去掉嵌套特征,重新生成。我刚才试过“盲板带中心孔带四角的安装孔”这类嵌套描述时,十次里至少有两次会出现特征冲突,拆成“先中心孔,再加四角安装孔”两步描述,成功率几乎翻倍。
第二步是尺寸核验。在CAD软件里打开生成的STEP文件,用测量工具抽查关键尺寸,或者直接看特征树里的数值。做过机械设计的都知道,尺寸差一毫米就是废品,所以这步慢一点也值得。实测CADcoder生成的模型,特征树参数和输入描述数值高度一致,但偶尔会出现圆柱面偏移之类的低级错误,目测发现不了,必须靠尺寸测量抽查。
第三步是后续修改可行性验证。随便改一个特征的数值(比如把板厚从10改成12),看软件能否正常重新生成。这一步能检验模型是否保留了正确的参数约束。如果一改就报错、几何就崩,说明特征间的依赖关系是错的,这个生成结果基本可以扔掉重来。
3.4 常用工具链对比与选型参考
前面对比了三类技术路线,这里把它落到实际工具层面,方便你针对自己的场景做选型。
| 方案 | 输出形式 | 可编辑性 | 稳定性 | 上手门槛 | 适用场景 |
|---|---|---|---|---|---|
| Text2CAD(序列生成) | 特征命令序列 | 高 | 中等 | 中 | 生成结构简单的通用零件 |
| CADcoder(程序生成) | CadQuery程序 | 高 | 较高 | 低 | 标准机械零件、法兰/支架类 |
| 扩散模型直接出网格 | 网格文件 | 低 | 中等 | 低 | 概念展示、快速出效果图 |
| 传统参数化模板(人工) | 参数化模板 | 高 | 最高 | 高 | 企业级标准件库 |
补充一个体验上的感受:Text2CAD生成的模型特征树“逻辑感”整体不如CADcoder干净,因为端到端训练出来的序列经常出现不必要的特征重复或冗余操作,比如先画一个大草图再切掉一部分,而不是直接用正确的草图形状。这类模型后续虽然能改,但改起来很别扭。CADcoder的程序化模板就清爽得多,代码本身就是人写的逻辑,读起来像同事写的注释良好的代码。
4. 常见问题与排查技巧实录
4.1 生成结果崩溃或几何无效的排查流程
最常遇到的情况是模型生成到一半特征树崩溃,报错信息五花八门,最常见的是“Failed to compute B-rep”或者干脆无响应。我踩过几次坑后总结出一个排查顺序:
先看描述里有没有嵌套特征,比如“带沉孔的中心孔”这种描述,模型需要同时处理两个特征的空间关系,容易崩。解法是拆成两步,先生成带通孔的板子,再在已有模型上追加沉孔特征。
再看尺寸是否合理。AI模型对尺寸的常识理解跟工程经验有差距,你说“板厚0.5mm”,它可能生成一个厚度为零的退化实体。这种情形下人工介入限制一下尺寸下限,比如“厚度不小于2mm”,崩的概率大幅下降。
最后看单位混淆。有一部分训练数据用的是英寸,模型会在英制和公制之间随机切换,导致生成结果突然大25.4倍。实测CADcoder对明确带mm的描述识别得比较好,所以描述里一定要动态标注单位,而不是只在开头写一次“所有尺寸均为毫米”。
当这些手段都无效、模型直接出不了有效几何,我的兜底方案是放宽温度参数重新采样几次,每次生成的结果都不同,取重复率最高的那个结果再验证,成功率显著提升。
4.2 描述清晰但生成结果不对的问题
这个问题的坑位比较隐蔽。模型生成结果是“对的错”——每种特征都符合描述,但组合起来的整体结构不对。比如你说“L形支架,竖板上有两个腰型槽”,它生成出来的是一个平板加两个腰型槽,完全没有L形弯折。
我分析下来,根因出在“零件类型”这个token上。模型对L形支架的理解依赖于模板库里的程序结构,如果它检索到的是“平板加孔”的模板,那不管你把描述写得再精致,它仍然只会往模板上套。解决办法是在描述里补充结构性的强约束,比如“vertical plate and horizontal plate are perpendicular to each other”,提醒模型注意两个面之间的空间关系,实测效果立竿见影。
4.3 运行环境的性能问题与避坑
批量生成场景下,我遇到过两个比较明显的性能问题。
第一个是CPU推理太慢。在纯CPU环境下生成一个中等复杂度零件,耗时可能要一两分钟,但如果复用同一个模型连续多次推理,中间有一个客户端并发请求的场景,性能瓶颈尤其明显。我的做法是先用GPU跑一次预热,再切换成批量推理模式。不同方案的推理延迟差异很大,CADcoder因为走程序检索路线,推理开销比端到端序列生成低不少,这也是它在实际应用里更受欢迎的原因之一。
第二个是显存碎片化。连续生成大量模型后显存会被碎块占满,导致后续推理失败。解决方式是定期调用torch.cuda.empty_cache(),或者每隔几十次生成重启一次推理进程。这个问题不致命但特别烦人,建议一开始就写进批处理脚本里,别等崩了再想办法。
4.4 与现有CAD工作流的集成方案
text-to-cad真正要发挥价值,不能一直孤立运行在Python脚本里,得想办法嵌入到现有设计流程中。我目前的集成方式是做一层轻量级的中间服务,后端部署推理脚本,前端对接公司内部的PLM系统。工程师在PLM界面里输入需求描述,后端调模型生成STEP文件,再自动回传到PLM的物料管理模块,整个过程不用切换任何工具。
这层中间服务技术含量不算高,就是FastAPI包一层接口,但要考虑几个细节。第一是输入描述的规范化,建议让工程师填写固定模板的表单而不是自由输入大段文字,模型效果会稳定非常多;第二是权限管控,生成结果在入库前必须经过设计主管审核,因为AI生成的东西不能直接当成“设计输出”来用,责任归属要提前定义清楚;第三是版本管理,AI方案和人工修改版本要做好关联,方便追溯。
这种集成方案一旦跑顺,设计效率的提升非常直观。之前设计一个非标法兰,从需求到出图可能要半天,现在十分钟就能拿到可用模型,剩下时间全留给工程师做验证和修改。要说debate,就是团队需要对AI生成模型的准确性有足够的信任机制,这需要时间和标准流程来建立。
5. 当前限制与未来方向:冷静看待这项技术
5.1 为什么说当前text-to-cad还替代不了设计师
虽然上面聊了很多实用技巧,但我必须泼一盆冷水:目前text-to-cad还远没到“替代设计师”的阶段,它解决的是“快速出型”的问题,而设计工作里真正值钱的部分——需求理解、可行性权衡、工艺约束、成本控制——它基本帮不上忙。
一个典型表现是它对“显式描述”极度依赖。你说“直径20的孔”,它能做得很准;但你说“一个受力合理的支架”,它就完全无能为力。好在工程场景的设计输入绝大多数都是显式参数,真正需要“凭空设计”的场景比例不高,所以这个限制在工程落地场景还能接受,但如果指望它做创新设计,目前还很勉强。
另一个限制是对复杂曲面的处理。我拿常见的叶轮、壳体类零件测试过,生成结果基本不可用,要么拓扑残缺,要么曲率分布离谱。这类零件的设计逻辑牵涉到流体力学、应力分析等更高层的约束,单靠自然语言描述根本传不达意。将来如果有工具能接受仿真分析结果、工艺约束等多模态输入,情况可能会好很多。
所以我的判断是:text-to-cad最适合的落地场景是“标准化程度高、参数变化多、设计逻辑清晰”的零件族群,比如法兰、支架、底座、防护罩。这类零件占机械设计工作量的很大比例,用AI加速价值显著。
5.2 后续演进的方向与个人预期
接下来一年我认为最值得关注的方向不是模型结构的大创新,而是数据的规模化。当前限制这类模型能力的最大瓶颈,其实是高质量CAD数据集的稀缺。图像数据互联网上几十亿张随便抓,但带特征历史的CAD模型数据少得可怜,而且绝大多数属于商业软件格式,提取和清洗成本高到离谱。
再一个方向是“文本-草图-模型”的多阶段生成。设计者先用自然语言描述需求,AI生成一个手绘风格的草图作为可视化中间状态,设计者确认后再进入参数化建模阶段。这样可以大幅减少“最后一刻发现设计方向错了”的返工成本,体验上也更符合设计师原有的工作习惯。
还有一条主线是多模态输入的融合。把语音、草图、参考图片、CAD模板库全接到同一个系统里,用户怎么方便怎么来。短期来看技术上都已具备,缺的是产品整合和用户体验层面的打磨。
我个人觉得这个赛道还处在很早期的阶段,但工程落地的窗口已经开了。现在愿意花时间把工具链跑通、把工作流理顺的团队,未来两年会积累起不小的先发优势。这跟当年参数化建模软件普及的路径很相似——早期用的人踩了大量坑,但也正是这些坑,让他们把工具用成了肌肉记忆,后入场的人反而不容易弯道超车。
6. 实操心得与避坑建议:我的几点真实体会
写到这里,分享几个我在实际操作中的真实体会。
第一个体会是不要追求一次生成完美结果。我见过太多人花很长时间抠prompt,试图让AI一步到位生成可直接用的模型。这个方向本身就错了。最靠谱的用法是快速生成多个候选方案,然后人眼筛选出最接近需求的1-2个,再在CAD软件里手动修正。AI不擅长“一步到位”,但非常擅长“批量出题”,扬长避短才是正确姿势。
第二个体会是描述里的每个词都是有代价的。模型对描述里的特征词特别敏感,你加一个“chamfer”,它就会在某个边角强行倒角,哪怕这个位置倒角后会影响装配干涉。所以描述要克制,只给必要信息。可加可不加的特征词,默认不加。生成完发现少了什么,用后续描述补加比一开始堆一大堆要好。
第三个体会是一定要保住原始生成脚本。CADcoder这类的程序化生成方案,生成的脚本就是纯Python代码,这个代码是比STEP文件更宝贵的资产。STEP文件只能改参数,但改不了建模逻辑;代码可以调整建模顺序、换约束方式、加新特征。我在实际项目里,模型被否定返工后,靠改代码重新生成往往比重画快得多。所以每次生成完,我第一时间保存的是.py文件,而不是STEP文件。
最后一个体会是尽量让AI做脏活累活,别让它做决策。孔位怎么排、倒角多大、厚度取多少,这类“有标准答案”的参数,AI又准又快;设计基准怎么定、公差分配倾向性、加工工艺适应性,这类“靠经验判断”的决策,目前还是交给有经验的工程师最稳妥。把两者画好边界,text-to-cad会是一个很好用的助理,而不是一个需要严防死守的“替代者”。