搞CAD建模的朋友,多少都有过这样的经历:客户嘴上说"我要一个带法兰盘的连接件",你脑子里已经把它拆解成草图、拉伸、倒角、布尔运算好几道工序了,建模两小时,改图一整天。这两年AI绘图火得一塌糊涂,但CAD这边能用的工具一直不温不火,直到text-to-cad这个概念冒出来。它就是让你用一句自然语言,直接生成可编辑的三维CAD模型——不是那种纯视觉的mesh,而是带特征树、带参数、能进CAM软件直接编程序的B-rep实体。
这个方向解决的核心问题,说白了就是把"脑子里的设计意图"到"软件里的几何实体"这段最费时间的路,用AI压缩成几秒钟。对机械设计、非标自动化、3D打印爱好者来说,这玩意儿一旦跑通,意味着方案阶段可以用文本快速验证多种结构,不用每次都手动草绘。我前前后后跑了几个开源方案,踩了不少坑,这篇就把text-to-cad的核心机制、实操流程和我自己的测试体会完整梳理一遍,想试水的朋友可以直接照着重现。
1. 一句话生成模型,先搞清楚它和普通AI绘画的本质区别
先泼盆冷水。text-to-cad跟text-to-image看起来都是"文字生成几何",但底层逻辑完全不同。画图AI生成的是像素矩阵,而CAD要的是精确到小数点后六位的边界表示(B-rep),每个面、每条边、每个顶点必须拓扑闭合。图片渲染错了还能说是"艺术风格",CAD模型拉伸面歪了一度,后面的模具加工直接报废。
1.1 传统建模流程的痛点到底在哪
拿最常见的机械零件设计来说。手动建模的工作流一般是:先画草图(定尺寸、加约束),然后拉伸或旋转生成实体,再去做倒角、阵列、布尔运算,最后还要保证参数能被后续修改驱动。这个流程有几个天生的问题:第一,草图阶段最耗时,你要把二维的尺寸约束关系理清楚;第二,改参数经常牵一发动全身,一个尺寸变了,下游特征全部要重建;第三,方案探索阶段非常低效,你想对比三种法兰结构,就得把同样的草图、拉伸流程重复三遍。
text-to-cad的思路是反过来:你直接说需求,"直径50mm的圆形法兰,周围均匀分布6个直径8mm的通孔,孔距法兰边缘10mm",AI直接输出一个参数化的CAD实体。省掉的不只是画草图的时间,更重要的是把"人的语言表达"和"几何约束"之间的翻译过程自动化了。
1.2 text-to-cad的能力边界和输出形式
我测试下来,当前开源方案的输出主要有两种格:一种是STEP文件(B-rep实体),这是制造业的标准交换格式,能直接被SolidWorks、Fusion 360、FreeCAD识别和编辑;另一种是参数化特征序列,AI输出的是"先圆柱拉伸30mm,再打孔6个"这样的构造步骤,可以在CAD软件里重建出带特征树的历史记录。后者实现难度更高,但对设计师最友好,因为你能在软件里直接改参数。
需要明确,现阶段text-to-cad还远没到"替设计师干活"的程度。复杂的装配体、曲面造型、钣金展开这类需求,AI基本束手无策。它是用来加速"标准件、简单结构件、概念方案"建模的,定位是辅助工具,不是替代设计。
2. 底层机制拆解:AI怎么把文字变成带精度的实体
理解了定位,再来看它到底怎么实现的。我拆开一个开源的text-to-cad管线(基于Transformer架构的常见方案),核心环节有三块:数据怎么编码、模型怎么生成、生成结果怎么变成一个合法的CAD文件。
2.1 数据层面:CAD模型如何"翻译"成机器能学的语言
这里有个很关键的选择。Mesh网格数据(比如STL)对AI来说很好学,因为就是一堆三角形顶点坐标,但输出的是视觉模型,没有工程意义。文本到CAD要学的是B-rep数据,这才是制造端真正要的东西。
B-rep本身结构复杂,包含:面(Face)、边(Edge)、顶点(Vertex),还带着拓扑关系,以及每个面的曲面类型(平面、圆柱面、NURBS曲面)。直接让Transformer输出这种拓扑结构是不现实的。主流做法是做"几何序列化"——把B-rep实体转换成一系列离散token,类似把一句英文拆成单词。
我跑过的方案用的是近似这样的流程:先把STEP文件解析成B-rep结构,然后按顺序遍历:先输出基础体素(比如圆柱体、长方体),再输出布尔操作(加运算、减运算),接着是特征的参数(位置、方向、尺寸)。每个元素对应一个token,整个模型就变成了一个token序列。这样AI就把它当"文本翻译"任务做:输入描述性文本,输出一串构造指令token。
2.2 模型架构:从CLIP文本编码到自回归token生成
模型结构上,当前主流方案参考了多模态大模型的设计。文本侧,用预训练的CLIP文本编码器(或者直接用T5、BERT之类)把用户输入的自然语言句子编码成语义向量;几何侧,把上面说的序列化token做embedding。
生成的环节通常采用自回归方式:模型逐个预测下一个token,就像自动补全句子。不过这里有个关键差异,CAD token序列里既有离散的指令(比如"创建圆柱"),也有连续的数值(比如半径15.5mm)。离散指令用token分类搞定,连续数值得单独处理,常见做法是做一个数值回归头,或者把数值离散化成"毫米级的桶"(比如0.1mm一个区间),让模型输出桶编号。离散化精度要拿捏好:精度太高,模型学不过来;精度太低,生成的模型尺寸公差直接超标。
整个训练流程大致是:收集大量带文本描述的三维模型数据,比如ABC数据集、Fusion 360 Gallery数据集(从真实用户建模历史整理而来,自带特征序列,非常宝贵),把模型序列化,同时把对应的文本描述也让编码器处理,然后端到端训练。损失函数就是标准的交叉熵,预测token序列的分布。实测下来,数据质量对效果的影响远比模型结构大,Fusion 360 Gallery这类"带构造历史"的数据训练出来的模型,生成结果远好于只有STEP最终形态的模型。
2.3 后处理:把token序列还原成可用的CAD实体
模型推理出来的是一个token序列,这一步要把它变成一个真实的STEP文件。流程就是序列化的逆过程:解析token,逐步执行"创建基体、打孔、倒角、布尔差集"等操作,在几何内核里重建实体。常用的内核是Open CASCADE(开源的,FreeCAD和很多工具都基于它)。
这一步最容易翻车。模型生成的序列经常出现拓扑错误,比如布尔操作遇到不相交的几何体导致失败,或者参数非法(负半径、零厚度)。后处理需要有容错机制:执行每一步操作时都做合法性校验,失败的步骤要么跳过去,要么做降级处理(比如把布尔差集改成不操作),保证最后至少能导出一个实体,哪怕形态有偏差。说句实话,目前能落地的方案里,后处理的质量直接决定了天壤之别——同样的预训练模型,后处理做得好,成功率能高出一大截。
3. 实操全流程:从环境搭建到跑通推理
理论说完了,上实操。下面这套流程基于我测试过的开源text-to-cad方案(环境是Ubuntu 20.04 + RTX 3090),我把关键步骤和参数都写出来,照着做能少走很多弯路。
3.1 环境准备与依赖安装
硬件方面,推理一张图级别的模型至少需要10GB显存,训练的话建议24GB以上(4090或A6000起步)。软件环境用conda管理最省心,Python版本建议3.9,太高或太低都可能遇到依赖冲突。
conda create -n text2cad python=3.9 conda activate text2cad # 安装PyTorch(根据你的CUDA版本调整) pip install torch==2.1.2 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装Open CASCADE几何内核 conda install -c conda-forge ocp=7.6.3 # 安装其他依赖 pip install transformers cadquery-ocp numpy matplotlib trimesh这里有个经验提示:conda安装ocp这个包名是关键,直接用pip是装不上Open CASCADE的Python绑定的。另外,如果你后面要处理STEP文件解析,建议再装一个cadquery库,它对B-rep的解析封装比裸的ocp友好得多,尤其是涉及面类型查询、拓扑遍历的时候。
3.2 数据准备与预处理
数据这块我直接推荐用Fusion 360 Gallery数据集。它不是简单的模型库,而是来自真实用户操作的B-rep建模序列,自带每种特征的参数,这对训练"生成特征序列"的方案太合适了。数据集下载之后,你要按照官方划分好的train/test split来用,不要自己随机分割——同一模型的变体可能出现在多个文件里,胡乱切分会导致数据泄漏,验证集指标虚高。
预处理管线分为三步:第一步,用cadquery把STEP转成B-rep对象,提取面、边、顶点和拓扑关系;第二步,实现序列化器,把每个实体按"基体特征、草图轮廓、拉伸参数、布尔操作、倒角参数"的顺序输出token;第三步,给每个模型匹配文本描述。Fusion 360数据集自带一部分文本标注,但质量参差不齐,我测试时发现很多描述过于笼统,比如只说"bracket"不说尺寸。如果你有精力,可以自己做数据增强:编写规则脚本,根据参数自动生成描述模板,比如"直径{}mm的圆柱体,中心有一个{}mm的孔"。实测这样比单纯依赖原始标注的效果更好。
3.3 训练过程的关键参数与IO策略
如果你使用现成的开源训练脚本,核心超参数建议这样设:batch size 24(显存不够就16,配合梯度累积)、学习率5e-4、warmup步数1000、序列长度上限512。文本编码器用冻结的超参,只训练几何token侧的embedding和Transformer层,这样能大幅减少可训练参数量,训练速度更快,且不容易破坏预训练语言模型对语义的理解。
训练时的数据IO很讲究,因为B-rep序列化后的数据不是纯文本,每个token有不同类型。建议预处理的时候直接把token ID存成numpy的.npz文件,训练时用随机采样器按批次加载,而不是在线做序列化——在线序列化会让训练速度掉到原来的十分之一不到。我自己第一次跑的时候偷懒,图省事把序列化写在Dataset类里头,结果一个epoch跑了6个小时,改成离线预处理之后直接缩短到40分钟。
3.4 推理与后处理:从模型输出到STEP文件
推理阶段的做法是:输入文本描述,beam search(束搜索,宽度设4)生成token序列,然后送入后处理脚本重建实体。这部分的细节往往决定成败:
# 伪代码:后处理核心逻辑 tokens = model.generate(text_prompt, beam_width=4) surface_model = reconstruct_brep(tokens) # 逐步执行构造指令 if not surface_model.is_valid(): # 尝试用启发式修正:移除无效特征,重跑布尔运算 surface_model = repair_geometry(surface_model) export_step(surface_model, output_path)重建后一定要用Open CASCADE做B-rep合法性检查,重点是三个维度:实体闭合性、面法向一致性、边界表示尺寸阈值。很多模型生成的STEP文件在CAD软件里打开会提示"模型已修复",其实就是在后处理这关没做校验。有一次我生成一个带法兰盘的管件,AI把六个孔的位置参数算错了,导致两个孔重叠,Open CASCADE直接判定几何体无效。后来我用了一个聚类修正方案:检测到孔的位置间距小于最小壁厚的两倍时,自动把这两个孔合并成腰型槽——虽说不完全符合原意,但至少能导出一个可用的实体。
3.5 效果评估:不能光看IoU
评估text-to-cad的生成质量,很多人爱用几何IoU(交并比),就是对比生成模型和真实模型的体素重合程度。但这个指标有迷惑性:两个都是直径20mm的圆柱体,但一个高度是10mm另一个是15mm,IoU可能仍然很高,实际上特征完全对不上。
我实际用下来觉得更可靠的评估组合是:第一,特征序列准确率——对比生成的构造指令序列和GT序列的编辑距离,这直接反映"建模思路"对不对;第二,参数误差——对于每个特征,对比尺寸参数数值的偏差,比如孔的直径误差应该在±0.5mm以内;第三,人工目检——抽取20个生成案例,看B-rep实体在CAD软件里的实际表现。前两项可以自动化,第三项虽然费时但最真实。
4. 实测踩坑清单与排查思路
这个方向我翻车太多次了,挑几个典型问题整理出来,你在复现时能省不少排查时间。
4.1 "模型输出乱码"?先查序列化规范
症状:推理生成的token序列无法解析,或者解析出的特征数量不对、参数值严重超出合理范围。这类问题八成不是模型没学好,而是你的序列化规格和反序列化逻辑不一致。比如训练时定义"坐标值一律保留一位小数",推理时用的脚本可能把token解成两位小数,导致数值偏移。排查思路:先拿着训练数据集里的一条数据,手动改文本描述让它能通过序列化和反序列化闭环,再检查一遍数值是否精确还原。
4.2 训练loss不下降,数据平平无奇
这是最常见的挫败场景。loss卡在5.0左右不动,生成的token随机性很强。我遇到的罪魁祸首是:数据里存在大量空模型或异常模型(解析STEP失败、实体为空),这些垃圾样本没有过滤掉,模型在学噪声。解决办法:预处理阶段给每个样本加一道校验,要求满足——实体面数>1、体积>0、序列长度在10到512之间。过滤之后再训练,loss大概率能明显下降。
4.3 生成的STEP打不开,或打开后是"一片空白"
这种问题几乎全出在布尔操作上。AI生成的特征序列里,如果先创建了一个圆柱体,然后又用一个部件去"减"它,但两类几何体实际没有正确相交,布尔差集就会失败。我在后处理里加了一条原则:执行布尔操作之前先做三维包围盒重叠检测,如果两个几何体空间上根本不接触,就直接跳过这一步,并在日志中提示"skipped non-intersecting boolean"。这个改动把出图成功率从61%提到了84%。
4.4 文本描述很准确,但生成结果"张冠李戴"
如果你输入的描述很具体(比如"M8六角法兰螺栓"),但输出的是个形状接近但尺寸完全离谱的零件,说明你的模型对文本语义的利用还不够。大概率是训练时文本编码器和几何解码器之间的跨模态对齐没有充分训练。解决方案之一是增加"描述-模型匹配"的对比学习辅助损失:同一个batch里,让模型区分哪个描述对应哪个模型,强制它学习语义关联。这样训练后,模型对描述中关键词的敏感度会有显著提升。
5. 我的个人体会与扩展方向
跑了一个多月text-to-cad,最大的感受是:AI生成CAD模型的瓶颈从来不是"生成几何"这件事,而是"生成有工程约束的几何"。几何形状好搞,难的是让模型理解什么是"可加工的"——壁厚不能太薄、孔间距要留够、倒角不能大于实体本身。目前的方案基本是让模型通过大量数据"撞"出这些规则,数据的边界就是能力的边界。如果你想让它在某个垂直领域(比如标准紧固件、管接头)真正可用,最有效的策略不是调模型结构,而是收集那个领域的专用数据做微调。
另外,实测下来,把text-to-cad和参数化设计结合是很有潜力的玩法:让AI生成一个基础结构,然后你在CAD软件里打开特征树,手工调整关键尺寸,速度比从零建模快很多。我最近在一个非标零件的方案选型里就是这么用的——先让AI出三四个基础形态的变体,我从中挑一个最接近的,改几个参数就定了初稿,整个方案阶段压缩了大半天的时间。
最后给想上手的朋友一个很实用的建议:先别急着训练自己的模型,去找社区里一个叫"CADformer"或者类似的预训练权重直接跑推理(具体名称我不便直接推荐,你可以在GitHub搜索text-to-cad相关的开源仓库,多关注下载量和issue区的活跃度)。把整个"文本→STEP→CAD软件"的链路跑通,建立一个对生成质量的直观感受,再决定要不要进入微调阶段。这条路踩坑无数,但一旦通了,你再看CAD建模,视角会完全不一样。