资讯详情

资讯详情

Text-to-CAD实战:从自然语言到参数化实体模型的工程落地

上个月帮朋友赶一套夹具方案他在建模软件里对着图片一点点拉草图花了两个多小时才画出一块带安装孔的底板。我问他为什么不试试text-to-cad这类工具把需求直接打进去让模型生成初始数模再进软件微调。他一脸懵文本还能生成CAD——那一瞬间我意识到这个方向的进展虽然热闹但真正用过、能说清楚原理和边界的人还不多。Text-to-CAD简单说就是通过自然语言描述直接生成CAD模型。学术上常称为text-to-CAD、text-driven CAD generation目前社区里也有不少项目叫Text2CAD。它解决的不是画图这一步而是把设计意图从语言直接映射成几何实体的全过程。这篇文章不打算堆论文只讲我实际把这套流程用起来之后的体会有哪些技术路线、怎么搭一条能用的流水线、生成质量如何评估、踩过哪些坑、哪些场景真的值得用。1. Text-to-CAD到底解决了什么问题从口头需求到实体建模的鸿沟1.1 传统流程里的转述损耗做过结构件或非标设备的人应该都有同感需求方在电话里说给我一块板上面打几个孔装到设备上到了工程师手里要变成120x80x8的6061铝合金板四角M5沉头孔中间两个定位销孔单边留1.5mm翻边。这一步翻译靠的是工程师对加工工艺的理解和对标准件库的熟悉。这中间的损耗非常大。我听过的真实需求经常缺尺寸、缺公差、缺表面处理要求更别提孔位、避让、拔模斜度这些细节。传统CAD软件的交互方式——鼠标点选、约束定义、特征树操作——本质上是在跟几何体对话而不是跟人对话。设计师脑子里想的是一句话手上做的却是几十次点击。Text-to-CAD堵住的正是这道沟让语言成为建模入口让设计意图直接变成特征步骤。1.2 为什么这几年突然能走通了其实从文字到模型的尝试很早就有早先的专家系统、参数化模板库都做过类似的事但效果一直很别扭。核心卡在两个地方一是自然语言理解不到位一个带导角的矩形板这种话机器根本不知道导角该落在哪条边二是几何生成没有泛化能力只能套固定模板。近几年LLM把第一关打通了模型能理解空间关系、常见零件语义和隐含的工程习惯。第二关则被两条路线分别解决一条走三维生成用多模态模型直接产出点云、体素或隐式曲面另一条走代码生成让模型输出参数化建模脚本再交给内核重建出可编辑实体。后一条路线在CAD圈子里尤其被看重因为工业界要的不是一张好看的渲染图而是一个带特征树、能改参数、能出工程图的真实数模。在这部分我想强调一个我的判断做实际项目优先走代码生成路线而不是端到端生成路线。原因后面详细展开。2. 文本转CAD的两条主流技术路线端到端生成与参数化代码生成2.1 多模态大模型点云/隐式场像雕刻一样从无到有这条路的基本思路是把CAD模型当成一种三维数据模态来处理。输入文本描述经过类似扩散模型的生成器输出体素占用、点云或者SDF有向距离场再通过表面提取、网格化、参数化重构转成B-rep实体。听起来很顺实际用起来问题不少。首先生成结果大多是网格或点云不是原生实体。网格数据进不了主流CAM和CAE流程拿去做仿真还要重新逆向成实体而逆向本身就是一个大坑。其次这种路线生成的物体从拓扑上看往往很自由像雕塑自由度管不住。你说一个带六个螺纹孔的法兰盘它可能给出一个整体形状大致对、但螺纹孔位置歪了2mm的结果。因为扩散模型的本质是概率生成它不太理解孔位必须落在螺栓分度圆上这种硬约束。当然这条路也不是没有用。在概念设计、前期造型发散、玩具手办这类对精度不敏感的场景里它的速度和人机交互体验确实香。我也见过团队把它跟3D打印结合用来做快速原型和展览模型效果不错。但放在结构设计、模具设计这些正经制造业场景里我目前不会选它作为主路线。2.2 LLM参数化脚本生成让模型写出可编辑的实体特征另一条路是我更看好的文本先进LLMLLM生成一段CAD建模脚本——比如CadQuery、OpenSCAD、PythonOCC代码——然后在本地内核里执行得到真正的B-rep实体文件STEP或IGES。这么做的好处非常明显输出天然是参数化模型。脚本里写着box(120, 80, 8)、hole(diameter5.2)改一个参数全模型跟着变工程上可维护性极强。特征树是完整的。在FreeCAD或SolidWorks里打开能看到每一步是拉伸、切除、倒角而不是一坨三角面片。硬约束可以埋进去。LLM生成的代码可以追加后处理脚本自动检查孔间距、壁厚、公差符号违反就报错。说白了这条路是把LLM当成一个会写代码、懂点机械常识的建模师而不是一个试图直接捏泥巴的雕刻机。它输出的不是最终几何而是生成几何的操作序列。CAD软件最擅长的恰恰是重放操作序列所以这条路跟现有工业软件体系天然兼容。2.3 两条路线的对比选型我自己做过一次小规模的对比用一个提示词带四个安装孔的钣金支架长100宽60高25材料Q235折弯半径3mm分别跑两条路线对比维度端到端生成参数化代码生成输出格式网格/点云/SDFSTEP/IGES/原生实体可编辑性弱需逆向重构强特征树完整尺寸精度厘米级都费劲理论可达毫米以内工程约束支持极弱可通过脚本注入适合阶段概念造型、视觉预览结构设计、加工前验证工具举例各类3D扩散模型CadQueryLLM、OpenSCADLLM结论很清晰如果你只是想快速看看效果、做个渲染演示端到端生成够了如果你要做能进工艺链的数模别犹豫选参数化代码生成。下面我重点讲的就是这条路线。3. 数据与语义对齐决定天花板的关键环节3.1 训练数据从哪来算法再强也绕不开的数据准备所有text-to-cad模型的源动力都是数据。公开可用的CAD模型数据集主要有ABC、Fusion 360 Gallery、ShapeNet等。ABC数据集大概有一百万个CAD模型的BREP表示Fusion 360 Gallery里有大量带设计历史的参数化模型这对代码生成路线特别有用——因为模型不只给了几何还给了完整的设计步骤和约束关系。但有一个很现实的问题这些数据集都是只有图没有话。它们没有配套的自然语言描述或者说描述都是后来生成的。想要训练一个text-to-cad模型必须先做图文对。业界常见的做法是先让多模态模型看渲染图写描述再由人审核形成一批干净数据。我有段时间也在做类似的事给一批机械零件写结构化描述后来发现直接用GPT-4V生成的文本加上人工随机抽检效率远高于从头纯手工标注。3.2 CAD领域的提示词工程和常规GPT完全不同在通用场景里提示词写一只戴帽子的狗就能出图自由度很高。但CAD场景里提示词必须结构化。我常用的写法是这样主语零件名称支架、法兰、壳体、导轨座几何参数长、宽、高、直径、厚度特征列表孔、沉头、倒角、槽、凸台每个特征带参数位置关系居中、均布、对称、对齐、偏置工艺信息材料、表面处理、公差能写就写举个例子generate a mounting bracket, overall 120x80x8 mm, four M5 counterbored holes at corners R5mm from edges, two 6mm dowel pin holes on the centerline, chamfer 1x45° on top edges, aluminum 6061对比一下随手写的make me a mounting plate with holes同一个模型前面这种描述生成出来的东西基本能直接用后面那种大概率生成一个形状对但细节乱飞的数模。这不是模型傻而是CAD本来就讲究精确提示词就是设计需求文档的压缩版。另外方位词的使用要谨慎。CAD模型是三维的左边、上面这类词取决于查看角度很容易歧义。我建议把提示词写成绝对坐标系视角的语句比如沿X轴方向单边偏移10mm、位于长边中心F.S.并且在生成后立刻用视图检查。这不是给模型纠错是给自己减少沟通成本。4. 实战复现基于HuggingFace的Text-to-CAD流水线搭建4.1 环境准备最容易被忽略的细节说干就干。我当前用的是一条基本全开源的流水线用HuggingFace上的text-to-cad模型现在社区里已经有几个可用的权重把自然语言转成CadQuery代码再在本机用CadQuery执行生成STEP文件最后扔进FreeCAD检查特征。整套流程跑在Windows WSL2上显卡用一块消费级N卡够了显存8G就能跑不需要多卡。环境搭建命令大概是这样conda create -n text2cad python3.10 conda activate text2cad pip install transformers torch cadquery jupyter git clone https://github.com/your/text2cad-repo # 这里换成实际项目仓库 cd text2cad pip install -r requirements.txt有一个坑必须提醒CadQuery最新版本依赖OCPOpen Cascade Python绑定这个包很容易装失败。如果你用conda优先加conda-forge源再装别直接用pip硬装。我第一台机器上就因为版本冲突耗了一下午最后是conda install -c conda-forge cadquery解决的。4.2 一个完整的生成例子从提示词到STEP文件我用上面那段安装板的提示词跑了一次。加载模型之后调用方式类似这样from transformers import pipeline import cadquery as cq generator pipeline(text-generation, modelyour-model-path) prompt (Generate CadQuery code: mounting bracket, overall 120x80x8 mm, four M5 counterbored holes at corners R5mm from edges, two 6mm dowel pin holes on centerline, chamfer 1x45 on top edges, aluminum 6061) result generator(prompt, max_new_tokens800) code extract_code(result[0][generated_text]) exec(code) cq.exporters.export(result_assembly, bracket.step)第一次跑出来的代码成功执行了但孔位明显不对——四个角的沉头孔全跑到同一侧去了。原因不在模型而是我的提示词里没写分布均匀和距离角点10mm这样的几何约束。把提示词改成holes equally spaced, centers at R10 from adjacent edges之后第二次输出就正常了导出STEP文件放进FreeCAD里看特征树拉伸、到角、打孔、阵列清清楚楚。整个过程从输入一句话到拿到STEP大概花了不到两分钟其中模型生成代码占了大头。我后来直接把这个调用包成了一个小服务用Flask接口暴露出来内部其他同事通过网页表单提交需求后台自动出数模省掉了手动建模环节起码缩短了一半前期时间。4.3 生成质量的检验不能只看渲染图很多人拿到生成的模型习惯性渲染一下看着像就认为成了。这是大忌。我的检验流程是四步几何尺寸检查用Python脚本自动遍历STEP里所有实体测量关键尺寸是否在容差内。特征完整性核对人工看特征树确认沉头孔、倒角、凸台这些该有的特征都在。可制造性扫雷壁厚是否小于最小加工厚度、有没有无法出模的负角、孔间距是否小于标准值。干涉检查如果零件有装配关系先把相邻零件也生成出来做一次布尔运算和干涉检测。第四步尤其重要。text-to-cad目前对单个零件的掌控远远好于装配体。多个生成零件装在一起孔对不上、轴线歪掉的情况我遇过很多次。所以我现在养成一个习惯单件可以直接用涉及装配的一定要在FreeCAD或CAD软件里做配合验证。这不是模型质量差是目前这类工具的通用能力边界提前心里有数比较好。5. 工程落地中的那些坑从DEMO到产线的经验5.1 AI不知道公差两个字意味着什么这是目前最伤脑筋的问题。你让LLM生成一个直径8mm的轴它给你一个8.0的实体但不会告诉你这个轴配合孔的时候该选h7还是g6也不会标注尺寸后面的0.015/-0.010。对设计阶段来说问题不大但对制造来说没有公差配合的数模只能算半成品。我自己试过在提示词里明确写公差shaft diameter 8mm with tolerance h7, surface roughness Ra1.6模型确实会在注释里写# tolerance: h7但生成的几何体依然是8.0整因为CadQuery里做几何实体本来就不需要携带公差符号。真正能落地的办法是生成完STEP之后再用程序往里面追加尺寸公差标注或者直接对接PLM系统的时候人工补公差。指望AI一步到位暂时不现实。5.2 单位制混乱毫米和英寸的战争这个坑是我踩得最狠的一次。有一次生成一个外壳所有数字看起来都很正常尺寸显示为100x60x5我以为是毫米结果导进车间数控系统机床读出来是3.94x2.36x0.2英寸工人差点按英寸装刀。原因是模型在生成代码时写的是inch而我认为默认是mm。解决的办法很笨但有效每次生成代码后强制在代码片段前面注入一条units cq.Units.MILLIMETER类似的全局常量并且在导出STEP后用脚本解析文件头部确认单位和实际尺寸量级。如果生成的是一个长度值小于10的物体先警惕是不是英寸。我也把这个写进了团队内部的生成服务里作为强制校验步骤从此再没出过这类事故。5.3 给AI加护栏后处理与规则校验单纯让LLM自由发挥结果是不稳定的。我在流水线里加了两个护栏第一个是规则校验层。生成脚本执行前先静态识别代码里的关键参数比如所有hole()调用的直径所有box()的长宽高然后跑一遍预定义的制造规则。规则包括最小壁厚不小于0.8mm按加工工艺孔中心距不小于板厚的2倍所有外部锐边默认倒角0.5mm。不满足直接拦截把错误信息反馈给用户让用户去改提示词。第二个是特征锁定。在CadQuery里固定用一套自己封装的标准件库M3/M5/M6螺纹孔、标准沉头孔、腰型槽全部预生成好。LLM遇到装M5螺丝这种需求不直接生成几何而是调用标准库里的现成特征。这样一来孔口倒角、压铆螺母的底孔直径这些细节就不会让AI自由发挥模型只需负责位置和尺寸质量立刻稳定一大截。这两个护栏加完之后我从50%情况下要手工修变成了80%情况下直接可用生产效率的提升是肉眼可见的。6. 把Text-to-CAD用起来适合的场景与不适合的场景6.1 真正值得用的四个场景先说判断结论Text-to-CAD最成熟的应用场景不是我原本以为的从零设计一台机器而是下面这四类前期方案快速推敲客户提需求先用文字生成5个不同形态的方案数模渲染出来一起看。不需要精细结构但能快速对齐方向。标准件库和零件检索你有一大堆历史数模让员工用一句话描述来搜自动匹配到最接近的模型哪怕不是100%符合也能快速改参数。这比翻文件夹高效一个量级。图纸注释与逆向描述已有实体模型但缺文档用text-to-cad反向生成结构化的文字描述填充物料清单和BOM备注里的特征栏。教学和新人培训新人想理解一个带法兰的旋转体长什么样直接生成一个给他看比看十条说明书都直观。我近期给团队搭的内网工具核心就是做零件检索。库里几百个结构件以前靠命名规范找人脑记忆现在输入带四个腰型槽的L型固定架就能直接定位。这也是我目前用下来ROI最高的一个场景。6.2 别急着在精密和装配场景里用它反过来有几类情况我强烈建议不要现在上线至少我自己踩过之后收敛了很多精密配合件轴孔配合、轴承座、齿轮箱这类对公差、形位公差要求极高的东西AI生成的几何能看但离加工可用还有距离。装配体和运动机构生成单件都问题不大但它不管配合关系。铰链、滑轨、凸轮这些让AI一次生成整组十次里有九次干涉。大曲面A级曲面车身覆盖件、家电外观这类需要高光顺的曲面AI生成的自由曲面基本没法用跟专业曲面设计工具差距太大老老实实用老路。任何图纸直接下发产线之前目前我不管提示词写得多完整生成后都会强制经过一次人工审查。这是流程红线不是模型能力问题是一种工程责任。6.3 我预判的下一步形态这个方向还很年轻眼下每两三个月就有新东西出来。我比较看好的下一步是LLM不再是直接生成命令脚本而是去驱动一个带约束求解器的原生CAD内核。也就是说模型输出的是意图图——包含特征之间的位置约束、尺寸约束、配合关系由CAD内核去求解出满足约束的几何。这样一来AI生成的就不是一个碰巧长这样的东西而是真正符合约束条件的数模。到那时候Text-to-CAD才真正有资格叫设计助手而不只是建模加速器。眼下这个阶段我的建议很务实把它当成一个效率工具来用用它来生成起始模型、检索历史零件、快速对齐设计方向然后老老实实把专业判断留在自己手里。只要提示词写得够规整后处理护栏做得够扎实它省下来的时间是真金白银而不是Demo视频里的表演。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →