从一句话到三维实体:text-to-cad技术解析与实战避坑指南
你对着对话框敲一句“我要一把对边12mm的六角扳手总长150mm头部折弯角度正好匹配六角螺栓”回车几秒钟后屏幕上出现一个可以直接丢进切片软件或者导出STEP模型的实体零件。这个场景听起来很“未来”但最近半年text-to-cad这个方向密集出成果从MIT放出的Text2CAD论文到各家在CAD脚本生成上的跟进它已经从实验室Demo慢慢变成了部分设计师和工程师的真实工作流。text-to-cad简单说就是让大语言模型把自然语言描述翻译成可执行的CAD建模操作最终产出真实可编辑、可制造的三维实体模型。它和“AI生图”有本质区别图可以像模型必须“测得准”一个孔径差0.2毫米这个件就废了。这篇文章不是纯科普也不是纯论文复述而是我基于实际试用、踩坑、重跑生成流程之后的整理。我会把核心原理拆开讲清楚给出能直接跑的示例代码也会把最容易翻车的几个环节毫无保留地列出来。如果你正考虑在自己的设计流程里引入文本生成CAD这篇文章应该能帮你少走不少弯路。1. 一句话需求到三维实体text-to-cad 到底改变了什么先说我理解的传统CAD工作流。你在SolidWorks或者FreeCAD里新建一个零件选基准面画草图标注尺寸拉伸切孔倒角存盘。熟练的设计师做这么一个简单零件从打开软件到拿到STEP文件少说也要二十分钟。要是改一版尺寸再改回去又是半小时。问题出在需求到特征之间有一道翻译工序你脑子里想的是“一个带四个安装孔的底座”但软件听不懂这句话它只认草图线、约束、特征树。这道翻译本身没有技术含量又极其繁琐偏偏特别吃经验——新手容易在草图约束上卡半天老手也只是靠熟练把时间压短。text-to-cad的思路就是把这层翻译直接干掉让模型学会“语言→特征序列→几何实体”的映射。它不是给你画一张效果图而是在背后生成一段参数化建模脚本再用CAD内核执行得到真实可编辑的模型。你后面想改长度改孔径改圆角半径照常能改因为是脚本驱动整个历史还在。这也是我认为它和AI生成图片、AI生成视频最不一样的地方输出物不是像素是带拓扑、带尺寸、可以进CAM软件算刀路的实体。它解决的是“从模糊想法到三维草稿”那一段而不是帮你把草稿变成成品的所有工作。谁最适合关注这个方向我列几类人你可以对号入座机械设计/结构工程师频繁出概念方案、做设计变体想省掉重复建模时间。创客和产品DIY人群想法很多建模功底一般想直接说需求让工具把模型“变”出来。设计师与CMF工程师需要快速验证手头概念是否能加工、装配但不希望被参数化软件的学习成本拖住。教育/培训从业者拿AI生成的参数化脚本当教学案例比传统口述特征步骤直观得多。非专业用户比如想给机箱画个导风罩、给桌面做个理线架又不想专门去学CAD的人群。一句话总结text-to-cad真正改变的不是“建模”这个动作而是把“脑子里的话”和“软件里的特征”之间的翻译成本从按小时计压到了按秒计。2. 两条技术路线让语言模型“学会”画图的前世今生第一次接触这个方向的人很容易把text-to-cad理解成“文生图3D版”以为模型在输出一个网格文件或者点云。实际上目前主流做法分两条完全不同的路搞清楚它们你才知道自己应该关注什么、怎么部署。2.1 路线一生成代码让CAD内核替你渲染这条路线是目前效果最稳、工程上最主流的。思路是大语言模型本来就很擅长写代码而CAD建模的核心——参数化特征——本质上就是一种程序语言。CadQuery、OpenSCAD、FreeCAD的Py宏甚至SolidWorks的API脚本都是代码。于是研究者把文本需求丢给LLM让它生成一段CadQuery代码然后本地用开源内核OCC执行导出STEP/STL。比如Text2CAD这篇工作中研究者从ABC数据集里筛出几十万个真实零件用自动标注管线给每个零件配了一段自然语言描述再拿这些“文本-CAD代码”对去微调Llama-3.1-8B这类模型让它学会从描述生成代码。这条路的优点非常明显输出有完整的建模历史后续可参数化修改脚本次序错了删一行就能重跑。内核保证几何闭合不会出现网格那类破面、裂缝问题。可直接导出STEP、STL、DXF无缝喂给下游CAM、3D打印切片、CAE仿真。缺点也藏在这里模型必须熟悉特定库的APIAPI一升级可能全盘崩溃长特征序列生成时容易在中间某一步语法出错而且受限于训练数据里见过的零件类型太奇怪的造型容易生成出“看似能跑、实际一塌糊涂”的代码。2.2 路线二端到端生成几何数据绕过代码直接出实体另一条路线更“深度学习原教旨”让模型直接输出体素网格、点云、或者B-rep的隐式表示再借助后端重建出实体模型。像SPAFormer这类工作尝试让模型直接预测面、边、顶点的拓扑连接关系最后重建成固体。这条路线理论上天花板更高——能生成任意自由曲面不受代码库表达能力限制比如你要生成一个有机形态的水壶把手代码驱动的方式会非常别扭端到端方式反而可能更合适。但实际工程的坑也很深第一生成B-rep很难保证拓扑一致性经常出现边不对齐、面自交、实体退化第二目前公开数据集里带标注的CAD模型规模还是太小远不如图像、文本数据量大第三输出很难直接改参数你想把孔径从8mm改成9mm得重新生成一遍。这也就是为什么到目前为止能落地的工具几乎都走代码生成路线端到端更多还在论文里打转。我的判断是短期内你在工程里真正能用上的text-to-cad大概率是“LLM脚本化CAD库”的组合端到端的方向适合继续围观等拓扑问题被解决再考虑引入。3. 上手实测用CadQuery把一句话变成可加工零件别光聊原理我直接带你把一条完整流程跑通。我的环境是Windows 11 Python 3.11全程命令行不依赖任何重型CAD软件。这样做的原因很简单生成脚本、执行、反馈全都走代码最容易被自动化。3.1 环境准备CadQuery和推理端点先安装核心依赖用pip就行pip install cadquery pip install ipython pip install numpyCadQuery装完自带OCC内核可以直接导出STEP、STL可以了。模型部分我个人推荐两条路有本地方便用Ollama跑Llama 3.1 8B或Qwen2.5-Coder对中文和代码的理解都能用。不折腾硬件直接调OpenAI或国产大模型API把CadQuery的文档片段塞进system prompt。坦白说本地8B模型在复杂零件上出错率明显更高但胜在免费、无数据外泄风险。我先用API跑通全部流程后面再降级到本地模型这是比较稳妥的推进顺序。3.2 一个完整的文本到实体流程我挑一个既有实际意义、又包含多种建模特征的例子“一个底座零件长80mm、宽50mm、高12mm四角做R5圆角顶面中心一个直径6mm深8mm的盲孔底面四角各有一个直径4mm通孔孔心距底面边缘5mm。”原始需求发给模型前我做了点加工把“圆角R5”和“孔径4mm”这类模糊词全部替换成带单位的明确数字。这是整条链路里最重要的一步别省。模型生成的CadQuery代码核心逻辑是这样的import cadquery as cq # 1. 底部对齐的长方体 base ( cq.Workplane(XY) .box(80, 50, 12, centered(True, True, False)) ) # 2. 四条竖直棱边做R5圆角 base base.edges(|Z).fillet(5.0) # 3. 底面四角打安装通孔孔心距边缘5mm mount ( base.faces(Z) .workplane() .pushPoints([(-35, -35), (35, -35), (-35, 35), (35, 35)]) .hole(4.0) ) # 4. 顶面中心盲孔直径6mm、深8mm result ( mount.faces(Z) .workplane() .hole(6.0, depth8.0) ) cq.exporters.export(result, baseplate.step)这里有个容易被忽略的细节box的centered参数设为(True, True, False)表示X、Y方向居中Z方向以底面为基准这样后续坐标计算会舒服很多。如果用默认的全居中整个零件会沉到Z负半轴后面在底面上开孔时就需要额外偏移特别容易出坐标错误。把代码存成baseplate.py直接执行再写个一行检查python baseplate.py执行完不出意外的话目录里会多出一个baseplate.step。我用FreeCAD打开验证了一下尺寸、圆角、孔位全部正确。整个过程从“说出需求”到“拿到STEP文件”总共不到三分钟建模部分大概只用了十秒。如果你手边没有CadQuery又只想快速体验text-to-cad这个链路OpenSCAD是更轻量的替代品。它的语法更接近传统布尔运算很多LLM训练语料里都有OpenSCAD示例生成成功率其实比CadQuery更高。difference() { // 底座四角倒圆角 minkowski() { cube([70, 40, 12], centerfalse); cylinder(r5, h0.01); } // 四个安装孔 translate([10, 10, -1]) cylinder(d4, h14); translate([70, 10, -1]) cylinder(d4, h14); translate([10, 40, -1]) cylinder(d4, h14); translate([70, 40, -1]) cylinder(d4, h14); // 中心盲孔 translate([40, 25, 0]) cylinder(d6, h8); }这个文件丢给openscad命令行openscad -o baseplate.stl baseplate.scad模型理解得也很准圆角、孔深、孔距都按输入来了。两条路线对比下来我的体感是CadQuery代码更“工业”适合需要后续参数化和进标准CAD流程的场景OpenSCAD更“极客”上手成本低跑通即所见。3.3 输出物如何进入传统CAD流程有人会问生成一个STEP之后接下来怎么办答案是跟正常外购模型一样处理没有任何分别。你可以把STEP导入FreeCAD编辑特征也可以直接拖进Cura切片或者在Fusion 360里做装配约束。如果模型还要继续改尺寸我强烈建议保留生成的脚本而不是在GUI里改。每次需求变动改一行尺寸参数重跑脚本得到新STEP整个循环完全可以自动化。我自己甚至把这段流程包成了一个小函数输入一个字典包含长宽高、孔径、孔距输出一个STEP路径。后续做设计变体跟填表一样简单。4. 实测里最容易翻车的几个环节与应对办法工具能跑通是一回事能稳定复用是另一回事。我实际重跑了二十多个零件需求文本到CAD的平均成功率勉强到七成剩下三成翻车高度集中在几个固定环节。这里把最典型的坑列出来每条都有对应的补救手段。4.1 尺寸与单位的“口胡”这是目前最大的坑。模型特别容易把“厚度5mm”理解成“半径5mm”或者把“长度80”直接当成80米等导出的STEP用测量工具一查零件大得离谱包围盒上万毫米。我后来做了两件事把这类翻车率降了很多。第一需求文本里必须写全“mm”或“厘米”并且全部用数字不要出现“几毫米”“大约”这类模糊词。第二后端加一道尺寸合理性校验脚本跑完立刻读取实体的bounding box如果任何一个方向小于0.1毫米或大于1000毫米直接判定异常报错给模型让它重新生成。from OCC.Core.BRepBndLib import brepbndlib from OCC.Core.Bnd import Bnd_Box # 读取STEP实体包围盒检查尺寸范围这段代码放在生成脚本后面作为一个自动闸门。尺寸不对的零件根本没机会进入下游流程比事后肉眼找问题省事太多。4.2 特征顺序错乱导致的“特征吃掉特征”CAD建模的特征顺序是硬约束先打孔再倒角倒角会把孔口边缘吃掉先拉伸再抽壳壳厚方向搞错会让内部腔体消失。LLM本质上是概率生成文本对顺序敏感度不够很容易给你按加工顺序的正反面组合。我遇到过一个经典案例让模型“生成一个矩形壳体四角R3圆角前表面中心开一个直径20的圆孔”它生成的顺序是“先圆角再抽壳再开孔”。结果圆角把壳体侧壁的厚度吃掉了开孔时又因为前表面已经被抽壳掏空直接在薄壁上打了洞厚度只剩0.2mm。解决办法是两层提示词里明确要求按“毛坯→主体特征→细节特征”的顺序写代码同时在自动校验环节加一步读取特征历史顺序人工抽查关键特征的前后依赖。如果反复出错就把“生成后自检重新描述特征树”塞进prompt让模型自己先审一遍代码。4.3 你以为是生成错误实际是验证闭环缺失模型生成的代码如果语法错误执行时立刻报错这还好办。最诡异的是代码能跑、STEP能导出、肉眼看着也对但模型内部“想象”的尺寸和代码里的尺寸不一致。比如它以为孔在中心实际代码把孔偏移到了角落导出后发现孔位错了。这种问题靠视觉检查根本防不住必须给验证环节加“自动测量”。我在脚本里加了这么一段导出后用OCC读取实体几何把关键孔的圆心坐标、直径、深度全部打印出来跟需求文本里的目标值做一次偏差对比。偏差超过0.1mm就自动标记失败喂回给模型重新修正。# 伪代码示意 expected {hole_diameter: 6.0, position: (0,0,12)} measured measure_stp(baseplate.step, hole1) if abs(measured.diameter - expected[hole_diameter]) 0.05: raise SystemExit(尺寸偏差超限需要重新生成)这样一个“生成→执行→自动测量→反馈修正”的闭环跑起来成功率可以从七成直接拉到九成以上而且你完全不用盯着看全程后台跑。4.4 “可制造性”是比几何更隐蔽的坑几何对了就能加工吗未必。模型不会主动替你考虑壁厚是否小于最小加工厚度不会检查悬垂结构是否适合FDM打印更不会帮你标注公差和表面粗糙度。例如让模型生成一个壁厚0.1mm的薄壁圆筒几何上完全合法STEP也导出了但放任何CNC或者3D打印工艺里都是废品。模型不会“觉得”0.1mm薄因为它学的是文本与代码的统计规律不是材料力学。我的做法是在prompt里预先给定制造约束条款“最小壁厚不低于2mm悬垂角不超过45度所有孔直径不小于2mm”并且要求模型在生成代码前显式检查这些参数是否满足。对于钛合金金属3D打印、CNC车削这类工艺再加更严格的专有约束。只要约束写清楚模型是能遵守的怕的是你不写它默认不存在。5. 当前的落地场景、工具盘点与选型建议经过前面这么多轮的实测和踩坑text-to-cad到底适合用在哪、不适合用在哪我心里基本有数了。我不想给你画“AI马上要取代CAD”的大饼现实情况是它更像一个能加速前端设计的好帮手适合放在流程的某些特定环节。5.1 哪些场景真的适合用text-to-cad首先是概念设计阶段。你还没决定用方案A还是方案B就想快速看一下不同长宽比、不同孔位布局下哪个比例更协调。放以前要建两个模型现在说两句话两个脚本导出两只零件对比起来特别直观一切调整都趁热乎。其次是参数化零件库建设。做过标准件库的人都有体会建库的过程中重复劳动极其密集一个法兰四个型号改尺寸生成四份三维模型。把这个过程交给文本驱动脚本维护一本“描述词典”就够了。第三是教育场景。刚学CAD的人最容易卡在“草图约束到底怎么加”这一关。现在完全可以让学生先看真实需求、再对比AI生成的代码、最后自己改参数重新生成这比让他从零手动画一遍更能理解特征构造逻辑学习阻力小很多。5.2 主流工具速览与选型决策我整理了一个当前比较活跃的工具和框架清单覆盖开源到商业你按自己的需求选工具/项目类型核心特点适合人群Text2CAD研究项目模型数据集基于LLM生成CadQuery/OpenSCAD代码文本-CAD代码对数据集想做实验、研究的人CadQuery开源CAD库Python 参数化建模输出STEP可编程全流程工程师、开发者OpenSCAD开源CAD软件脚本化建模布尔运算成熟社区庞大创客、原型验证FreeCAD开源CAD软件带GUI支持Python宏Part工作台完整需要边看边改的人Fusion 360商业CAD生成式设计/AI辅助云端协作制造业用户、设计师选型逻辑其实看一件事你到底需要“生成完继续修改”还是“生成完直接用”。需要继续改的选CadQuery/FreeCAD因为建模历史都在代码里只是想快速拿个模型去打印验证的OpenSCAD最快最省心想走商业链路、看官方支持的Fusion 360现阶段最成熟但要注意它并不是纯text-to-cad而是把生成式设计作为其中一个模块。5.3 一个务实的工作流建议我自己现在推荐的工作流是“文本→代码→自动校验→STEP→FreeCAD人工确认”一层层往下走每一层都有自动/半自动把关。具体来说需求文本按固定模板写功能描述、外形尺寸、孔径孔距、圆角/倒角、材料与制造约束。模型生成CadQuery代码立刻在隔离环境里执行。自动读取输出实体检查包围盒、关键孔位、壁厚、体积全部在阈值内才放行。放行后的STEP用FreeCAD打开人工看一眼拓扑和特征树确认没有怪异特征。确认后入库脚本路径和STEP文件一起存方便后续回溯和修改。这套流程跑下来一个设计变体从需求到入库大概十五分钟其中人工基本只在第四步花两三分钟看结果。这个效率在传统流程里是难以想象的。最后再聊几句我的实际体会折腾text-to-cad这段时间我最深的感受是它最珍贵的价值不是“替代建模”而是把设计起点的门槛拉低了一大截。过去你有一个想法要变成可讨论的模型至少要过“会用CAD”这一关现在只要你把需求说得清楚一个大致可用的初稿就在眼前剩下的精修工作比从零开始建模要轻快得多。我有一个挺受用的使用技巧分享给你。把确定能成功跑通的生成脚本收集到一个本地零件库里每个零件配一句话描述和一组可调参数。下次遇到类似需求直接把描述复制给模型让它基于旧脚本改尺寸而不是从空白对话重新想象一个新零件。你会发现这时的成功率远远高于冷启动因为模型有了参考模板翻车概率大幅下降。text-to-cad还在快速迭代无论是模型能力、数据集规模还是工具链成熟度几乎每个月都有新变化。现在的它已经足以成为设计流程里一个靠谱的草稿生成器而它的下一步——多模态输入、真实感渲染反馈、物理仿真验证——只会让这个草稿越来越接近成品。如果你还没有试过用一句话生成一个真实零件我建议你现在就装个CadQuery跑一次那种“几秒钟想法变成实体文件”的冲击感比任何论文里的Benchmark数字都更有说服力。