ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

text-to-cad实战:从自然语言到可编辑CAD模型的技术路线与工具链

text-to-cad实战:从自然语言到可编辑CAD模型的技术路线与工具链 “把一句自然语言变成能编辑、能出工程图、能直接拿去加工的CAD模型”这就是text-to-cad在做的事。我第一次看到这类demo时第一反应不是“好酷”而是“这东西如果真能用设计师和结构工程师的日常会变一个样”。过去我们画一个零件先要在脑子里想清楚结构再打开CAD软件建基准面、拉草图、加约束、生成特征。现在有人试图把“脑子里想清楚”这一步也交给模型让文本直接驱动建模过程。这篇文章不打算堆论文术语我会从一个长期和CAD打交道的使用者角度把这事拆开讲清楚text-to-cad到底解决了什么问题、目前主流技术路线有几条、以及你怎样才能用最简单的方式亲手跑通一个“从文本到CAD文件”的最小闭环。不管你是做机械结构、工业设计、非标自动化还是纯粹玩3D打印这内容都值得看完。1. text-to-cad到底在解决什么问题1.1 传统CAD建模的瓶颈不在“画图”在“翻译”很多人以为CAD学习难在“画图”其实不是。软件操作再复杂练上一个月也就熟了。真正的瓶颈是从“需求语言”到“建模操作”的翻译过程每一步都在消耗注意力。举个最普通的例子。你要设计一个法兰盘需求用一句话就能讲完“外径80内径40厚度12外圈均布6个直径8的螺栓孔。”但这句话落到CAD软件里你要新建零件、选择基准面、绘制草图、标注约束、拉伸凸台、再画一个孔、做圆周阵列、最后加倒角。熟练工做完这一套至少几分钟不熟练的可能在“草图完全定义”上卡半天。text-to-cad想砍掉的就是这个“需求到初稿”的翻译成本。它的目标不是让CAD软件消失而是让你把精力放在真正该关心的判断上比如这个结构稳不稳、好不好加工、装配是否合理。初稿交给模型出人工负责审核和修改。1.2 它和text-to-3D不是一回事这里必须强调一个特别容易混淆的边界text-to-cad和text-to-3D比如生成OBJ、STL网格根本不是一回事。text-to-3D的目标是“看起来像”通常生成的是三角形网格好看就行不关心几何精度也不关心能不能编辑。而text-to-cad的目标是“能制造、能编辑、能复用”。它要输出的是真正的CAD数据也就是带参数化特征、带B-rep边界表示几何、带特征历史树的模型。打个比方text-to-3D像是让一个素描画家快速给你画一张参考图光影氛围到位text-to-cad则是让一个结构工程师给你出一张带标注、带尺寸、可以改图纸的工程图。前者看的是感觉后者看的是约束和逻辑。所以评价text-to-cad模型好不好不能只看生成结果像不像还要看它能不能导入CAD软件继续编辑能不能稳定出工程图和CAM刀路。2. 主流技术路线拆解从脚本生成到数据驱动重建2.1 大语言模型直接生成CAD脚本门槛最低也最容易跑通目前实操性最强的路线是用大语言模型LLM直接生成CAD脚本比较常见的输出对象是OpenSCAD、CadQuery或者Fusion 360的Python API。这个路线的基本逻辑是把建模过程用代码表达出来LLM本来就擅长生成代码于是“文本转CAD”就变成了“文本转代码”。比如你给我一句“直径30的圆柱高20顶部倒角2”模型理论上可以吐出一段OpenSCAD脚本你在本地一渲染就有模型了。这条路线的优势非常明显不需要专门训练直接用现成的通用大模型就能起步。生成的结果天然是参数化的尺寸都写在变量里随时能改。输出的是文本文件易读、易审查、易版本管理。缺点是模型不一定真的理解CAD语义。它可能生成一个语法完全正确但物理上很离谱的模型比如孔比零件还大、倒角吃掉整个壁厚、布尔运算留下悬空碎片。所以用这条路必须搭配人工检查。2.2 基于CAD数据集训练专用模型Text2CAD与CAD-GEN这条线另一条更“科研”也更接近text-to-cad本质的路线是在大量CAD数据上训练专用模型。这个方向的背景是近几年社区整理了不少CAD序列数据集比如从Fusion 360里提取的建模操作序列、DeepCAD这类大规模参数化CAD数据以及一些自动配对的文本描述数据。研究人员会把这些“自然语言描述-建模操作序列”配对起来训练模型学习从文本到建模步骤的映射关系。典型工作包括Text2CAD、CAD-GEN等。它们的做法通常是把CAD建模过程表示成一系列离散的操作token例如“新建草图”“画圆”“拉伸”“切除”“倒角”等模型根据输入文本逐个预测下一个操作最后解码成一个完整的CAD文件。这条路的优点是更贴近“工程师建模”的思维生成结果确实是一个带特征历史的参数化模型。缺点是对数据和算力的要求很高普通个人很难复现。模型生成的草图约束经常不完整导入软件后需要大量修复。描述一旦变长生成误差会累积最后几个特征经常对不上。所以目前这些模型更多出现在论文和demo里离“生产工具”还有距离但方向是对的。2.3 先出三维网格再做表面拟合看着快实则坑多还有一种思路比较取巧先用文本生成三维网格类似text-to-3D再做网格到CAD表面的拟合。比如先用扩散模型生成点云或体素再用B-rep拟合算法把表面转成NURBS曲面或参数化实体。这个路线的好处是能借用大量成熟的text-to-3D成果生成效果“视觉上很唬人”。但从我的实际使用经验看这个路线在工程上其实最不靠谱拟合出来的曲面经常是非流形或自相交的实体布尔运算会失败。表面虽然光滑但没有原始特征你在CAD里无法修改“孔距”或“壁厚”这种参数。转换成STEP后文件里经常是一坨没有可编辑历史的“死模型”。我建议把它当作概念可视化工具而不是设计工具。你拿它来给客户看一下大致形态没问题但如果要出图、要加工直接倒回参数化建模更现实。2.4 三条路线怎么选为了让你选型方便我把三条路线放在一起对比路线代表方式可编辑性CAD软件导入友好度适合场景落地门槛LLM生成脚本GPT/Claude OpenSCAD或CadQuery高参数全在代码里高导出STEP/STL都可个人快速出初稿、3D打印、简单结构件低有手就能跑专用模型Text2CAD、CAD-GEN中高看具体实现中常需修复草图约束研究、批量生成、数据集扩充高需要GPU和数据网格拟合文本→点云/体素→B-rep拟合低基本是死模型中低破面概率高概念展示、视觉效果中依赖现成3D生成模型我的意见很直接如果你是自己用、要快速出东西选第一条如果你是研究生想要发论文或者探索新方法第二条值得深入如果你只是给甲方看个效果图第三条可以凑合。3. 亲手跑通一个text-to-cad最小闭环3.1 准备工具开源CAD脚本环境为了不依赖付费软件我推荐用两个开源工具来实现最小闭环一是OpenSCAD体积小、跨平台、用CSG构造实体几何建模。你可以把OpenSCAD理解成“用代码雕刻”非常适合配合LLM自动生成。它默认尺寸单位是毫米可以直接导出STL和SVG。二是CadQuery这是一个Python库。和OpenSCAD不同CadQuery更接近传统CAD的“特征建模”思路可以做到先选面、再建草图、然后拉伸、打孔、倒角而且可以直接导出STEP格式。STEP格式是B-rep包含精确几何信息能被Fusion 360、FreeCAD等主流软件直接打开。工具链就这么简单一个文本编辑器加上一个免费的CAD环境。模型引擎方面你可以用任何主流大模型API。如果你在意数据隐私本地部署一个小参数量模型也能完成基本任务但效果会打折。3.2 第一个例子用一句话生成垫片并导出STL我们从一个机械行业最常见的小零件开始平垫片。需求描述是这样的“外径40mm内径30mm高度10mm的圆环垫片。”拿到这句话你要做的第一件事是把自然语言转成明确参数外径40半径20内径30半径15高度10。因为OpenSCAD的cylinder函数用的是半径参数所以必须先把直径换成半径。我让模型生成的OpenSCAD脚本大概长这样$fn 64; outer_d 40; inner_d 30; height 10; difference() { cylinder(h height, r outer_d / 2); cylinder(h height 1, r inner_d / 2); }你可能会问为什么里面那个圆柱高度是height1而不是height这里是个典型细节两个曲面如果完全等高手动做差集有可能因为浮点精度问题留下残面或破洞。让内圆柱多出1毫米保证“切除”特征贯穿整个实体布尔运算更干净。这个习惯我用了很多年强烈建议你也养成。把这段代码保存成gasket.scad放进OpenSCAD按F5预览再按F6渲染就能看到实体。接着导出STL这个垫片基本就能丢给3D打印机了。整个流程从文本到拿到可打印文件不超过5分钟。3.3 第二个例子用CadQuery生成带孔底座并导出STEP如果只是生成一个圆环用OpenSCAD就够了。但工程上更常见的需求是“一块底座板上打几个安装孔”。这时CadQuery更合适因为它的“先建实体、再选面、在面上定位打孔”的方式非常接近人类工程师的思路。我们用一个更复杂的描述来测试“一个60×40×10mm的长方体底座四条垂直边倒R5圆角顶面按40×20矩形分布打4个直径4mm的通孔。”我给出的CadQuery代码是这样import cadquery as cq base ( cq.Workplane(XY) .box(60, 40, 10) .edges(|Z) .fillet(5) ) result ( base.faces(Z) .workplane() .rect(40, 20, forConstructionTrue) .vertices() .hole(4) ) cq.exporters.export(result, base.step)一行一行看先建一个60×40×10的盒子然后.edges(|Z)选中四条平行于Z轴的边也就是那四条垂直边.fillet(5)给它们倒R5圆角。注意我是在倒完角之后才选顶面孔位的因为倒角可能会影响后续工作平面的选择稳定性。然后.faces(Z)选中最顶上的面.workplane()在这个面上建立新的工作平面。.rect(40, 20, forConstructionTrue)画一个40×20的辅助矩形.vertices()取它的四个角点最后.hole(4)在每个角点处打直径4的通孔。这段代码跑完你会得到一个base.step文件。STEP是CAD领域的中性交换格式Fusion 360可以直接打开而且打开之后还是带精确B-rep数据的实体模型不是一堆三角面片。3.4 生成结果如何进入主流CAD软件拿到STEP或STL后下一步是把模型拉进你熟悉的CAD软件继续处理。STEP文件用Fusion 360打开时通常会自动转成底稿可以直接在原有实体上继续添加特征。但要注意一点打开STEP后模型往往是一个不带原始特征历史的“哑实体”。你可以在这基础上新建草图、打孔、加特征但不能回头修改我代码里那个40×20的孔距参数。所以如果预计要反复调整最好把CadQuery脚本保留好改参数后重跑一遍。STL文件则更简单它只有三角面没有面边拓扑直接导入Fusion或FreeCAD后只能做测量和简单的网格编辑不能当实体用。所以我的建议是能导出STEP就别导出STL除非你最终目标就是3D打印。4. 我在实操中踩过的坑从歧义到破面4.1 自然语言里的“歧义”比你想的更严重用text-to-cad最痛苦的经历不是模型不懂语法而是它太擅长“一本正经地胡说八道”。比如你写“一个长方形的板子上面有四个孔。”这句话在人类工程师眼里不够需要追问板子多厚四个孔多大孔间距多少孔是通孔还是盲孔但模型不会追问它会自己猜。猜对了是你运气好猜错了你还得返工。我自己试过让模型生成“一个支架”结果它生成了一个像桌面摆件一样的物体。问题不出在模型而出在我的描述没有给约束。自然语言是非常稀疏的信息通道越短的描述越容易产生多个合理答案。所以使用text-to-cad的第一铁律是描述必须数字化。凡是涉及尺寸、位置、数量、角度的全部写具体数值。不要用“大大”“厚实”“美观”这种形容词模型对这类词的理解和你完全不一样。4.2 单位、坐标系和精度最容易翻车的三件事单位问题是我踩过最多次的坑。OpenSCAD和CadQuery默认都是毫米但大语言模型训练数据里混着大量英寸和厘米的语料所以它生成的代码里极容易出现“直径1.5”这种话到底是英寸还是毫米你根本不知道。我现在的习惯是生成代码后先看一眼数字量级。如果描述是“一个汽车轮毂”结果代码里写着r80那基本可以确定是毫米如果写着r3大概率是英寸或者模型理解错了。不要相信模型默认的单位每一步都要检查。坐标系问题同样隐蔽。CAD世界里“哪个面是顶面”“Z轴朝上还是Y轴朝上”是有约定俗成的但LLM不一定遵守。CadQuery里默认工作平面是XY拉伸方向是Z正方向可有些模型会生成Y轴朝上的建模习惯导致你导入软件后模型是“躺”着的。Fix起来容易但如果你在没发现的情况下直接出图后果很尴尬。还有一个精度问题布尔运算失败往往是模型生成的特征与实体有微小间隙或重叠。遇到这种情况不要硬修网格回到脚本里去改尺寸把切除体稍微加长、加大或者用更明确的相交关系。4.3 “能看不能改”的本质是网格还是CAD很多刚接触text-to-cad的人会拿STL文件当成果然后在CAD软件里发现只能看不能改抱怨“这玩意没用”。其实问题不在工具而在你拿到的文件类型。STL本质上是“一堆三角形”它记录的是表面的采样点而不是几何方程和特征信息。你可以在STL上量尺寸但你不能把一个STL的某个孔直径从8改成10除非重新三角化。而STEP、IGES这些B-rep格式才真正带有“哪条边、哪个面、怎么连接的”拓扑信息。所以我在实际使用中会尽量让生成链路落在“脚本/代码”或“B-rep”上。如果某个工具只给我输出STL我会下意识降低对它作为CAD工具的评分。先问“能不能输出脚本或STEP”这个标准能帮你过滤掉一大批华而不实的text-to-cad工具。4.4 别被评估指标骗了看很多text-to-cad论文时你会看到一堆漂亮的指标Chamfer Distance降低了多少、IoU提升了多少。但作为一个工程使用者我必须说这些几何指标和“能不能用”的相关性没有想象中高。一个模型可能和参考模型在形状上高度重合但内部特征树完全乱掉本该是一个整体零件的它拆成了几十个悬浮实体本该有一个通孔的它用两个半球面拼出一个坑。这些在“体素IoU”上照样得分但导入CAD后你根本没法编辑。我的建议是看一个text-to-cad系统好不好用就看三件事第一输出能不能被当前主流CAD软件顺利打开第二打开后是不是实体而不是网格第三主要尺寸是不是参数化可调的。这三个问题通过了比任何论文指标都实在。5. 常见问题速查与提示词调整技巧5.1 高频问题与排查方案我在反复使用text-to-cad过程中把最常见的问题整理成一个速查表遇到问题可以先对着查现象可能原因处理办法脚本语法报错模型生成的代码变量名或函数名有误把报错信息贴回模型让它修复或人工对照官方文档检查模型尺寸明显不对单位理解错误或数字描述缺失在提示词中明确“单位是毫米”并补充所有关键尺寸布尔运算失败或破面切除体与实体共面/不贯穿把切除体尺寸加大或加长保证完全贯穿模型是侧躺的坐标系选择不一致统一约定Z轴向上并在提示词里说明“顶面是Z正方向”生成的是网格无法编辑工具链选错了输出STL而非STEP改用CadQuery或能输出B-rep的工具链孔位偏了或数量不对描述中缺少定位基准用“按XX矩形均布”“中心距XX”这类定位描述导入Fusion后没有特征历史STEP导入本身是哑实体保留脚本改参数后重新生成不硬改STEP一个零件变成很多碎片模型把多个实体当独立特征导出检查代码里的union/组合操作确保最后是单一实体5.2 把描述写成“迷你需求文档”既然自然语言歧义大那就收敛它。我的做法是不直接甩一句话给模型而是按“用途外形尺寸装配工艺约束”的模板来组织描述。举个例子差的描述是“帮我生成一个电机安装座。”这种话换我我也不知从何下手。好的描述应该是“设计一个用于安装NEMA23步进电机的L型安装座垂直板高80mm、宽60mm、厚8mm水平板长60mm、宽50mm、厚8mm垂直板上按NEMA23标准布置4个直径5mm的安装孔孔距31mm×31mm水平板边缘留两个直径6mm的通孔用于固定到工作台。所有外露边倒R3圆角。单位是毫米。”你会发现把这句话翻译成CAD脚本模型基本不会跑偏。它需要的信息全部给足了剩下的就是机械式的代码转换。模板话术还有一个额外好处你可以把常用结构法兰、底座、支架、壳体的模板积累起来以后复制粘贴改数字就行。5.3 一个让结果更稳的进阶技巧代码模板拼接如果你已经用text-to-cad一段时间你会发现大多数零件都是“基础形状孔倒角阵列”的组合。既然如此不如把常用基础形状做成自己的模板库让模型在模板基础上改参数而不是从头生成新代码。比如我个人维护了一套CadQuery模板里面写好了“平板带孔”“L型支架”“圆环法兰”“盒子带盖”这几类最常见的结构。使用text-to-cad时我会在提示词里附上对应模板代码并让模型只修改尺寸参数和不改变整体结构。这样生成结果的成功率会高非常多因为LLM在“改参数”这件事上比“设计新结构”可靠得多。这其实也暴露了text-to-cad目前的真实水平它更像一个“读得懂需求的参数化脚本工”而不是“凭空设计零件的工程师”。接受这个定位你就能把它用得很顺手。最后说一个我自己的习惯。在项目里我会把text-to-cad生成的内容当作“实习生的一稿”而不是“最终交付物”。每个模型出来之后我先在CAD软件里打开检查一遍单位、孔位、壁厚和圆角没问题再做工程图或发去加工。这个流程看着多条检查步骤其实比从零建模还是快很多尤其适合项目前期的方案比选和快速验证。如果你想让这个能力继续延伸可以考虑把它接入公司的标准件库和参数化模板让它只负责“按规则生成”再由人负责“按规范审核”。我目前的经验是这个组合在非标自动化设计里已经能让单个常规零件的出图时间缩短一半以上。
返回列表