1. 从一句话到三维实体:Text2CAD到底在解决什么问题
第一次听到“Text2CAD”这个词,我脑子里蹦出来的画面是:对着电脑说一句“给我画一个带四个安装孔的方形法兰盘”,屏幕上就自动长出一个可以旋转、可以标注、可以直接导出加工的三维模型。这个画面放在五年前还属于科幻范畴,但这两年随着大模型能力的快速迭代,它已经变成了一个真真切切有人在做的工程方向。Text2CAD,拆开来看就是Text(文本)到CAD(计算机辅助设计)的转换,核心目标是把人类用自然语言描述的设计意图,自动翻译成参数化、可编辑、可制造的CAD模型。
这件事为什么值得单独拿出来聊?因为传统CAD建模的门槛实在不低。一个刚入行的机械设计新人,光是搞清楚草图约束、基准面选择、特征顺序这些概念,就得花上几个月。而大量有设计需求的人——比如做非标自动化的工程师、搞创客项目的爱好者、甚至只是想把一个想法快速可视化的产品经理——他们脑子里有清晰的几何形状,但手上没有熟练的建模技能。Text2CAD要填的就是这道鸿沟:让描述直接变成模型,把“会建模”这件事从技能问题降维成表达问题。
我个人的判断是,Text2CAD短期内不会取代专业CAD工程师,但它会极大改变建模的起点。以前是从空白草图开始一笔一笔画,以后可能是从一句描述生成一个粗糙的初始模型,工程师再在这个基础上做精修和参数调整。这个转变的意义在于,它把重复性的、模式化的建模劳动压缩掉,让人把精力集中在真正需要判断力的地方——结构合理性、工艺可行性、装配关系这些机器暂时还搞不定的东西。
这篇文章适合谁看?如果你是CAD老手,想了解AI到底能帮上什么忙、边界在哪里,我会把技术路线和实际能力讲清楚;如果你是刚接触CAD的新人,想看看有没有捷径能跳过枯燥的入门阶段,我也会给出目前可用的工具和实操思路;如果你是对AI+工程感兴趣的技术人,我会拆解背后的核心原理和实现路径。不吹不黑,只讲我实际验证过和深入研究过的东西。
2. 拆解Text2CAD的技术骨架:它凭什么能把文字变成模型
2.1 核心思路:文本理解加几何生成的组合拳
Text2CAD本质上是一个跨模态生成任务,输入是自然语言,输出是三维几何。这个过程中间要跨越好几道鸿沟:语言是离散的符号序列,几何是连续的空间坐标;语言描述往往是模糊的、有歧义的,而CAD模型要求精确的尺寸和约束关系。所以整个系统必须同时具备两种能力——准确理解文本意图,以及把意图翻译成合法的几何表示。
目前主流的技术路线可以分成两大派。一派是“参数化序列生成”路线,代表思路是把CAD建模过程看作一个操作序列,比如“画矩形→拉伸→打孔→倒角”,模型学习的是从文本到操作序列的映射。另一派是“直接几何生成”路线,用扩散模型或者隐式表示直接生成三维形状,再后处理成CAD格式。两派各有优劣,我后面会详细对比。
先说说为什么参数化序列生成这条路更受工程界青睐。原因很简单:CAD的灵魂在于可编辑。一个不能改尺寸、不能调整特征顺序的模型,在工程上价值有限。参数化序列生成的模型天然带有建模历史,你可以回头把“拉伸高度50mm”改成“80mm”,整个模型自动更新。而直接生成的三维网格或者点云,改起来就麻烦得多。所以如果你问我Text2CAD的未来主流方向,我押注在参数化序列生成上。
2.2 文本编码:让机器听懂“带四个孔的方形板”
文本理解这一环,现在基本是大模型的天下。早期做法是用BERT这类编码器把文本转成向量,但这种方式对复杂描述的理解能力有限。比如“一个边长100毫米、厚度10毫米的方形板,四个角各有一个直径8毫米的安装孔,孔中心距边缘15毫米”——这句话里有尺寸、有数量、有位置关系,传统编码器很难完整捕捉。
现在更靠谱的做法是用大语言模型做语义解析,把自然语言拆解成结构化的设计参数。具体来说,模型需要输出一个类似JSON的结构:形状类型是“板”,长宽是100×100,厚度10,特征列表包含四个孔,孔径8,位置约束是距边缘15。这个过程叫“语义槽填充”,本质上是一个信息抽取任务。大模型在这里的优势是泛化能力强,你没见过的描述方式它也能理解个八九不离十。
但这里有个坑:大模型对数字的精确处理能力并不稳定。你让它生成一个“直径8毫米”的孔,它可能给你输出“直径约8毫米”或者干脆算错位置。所以实际系统里通常会在LLM后面加一层规则校验,把关键尺寸做数值约束,确保生成的参数在工程上合理。这个细节很多论文里不写,但真正做落地的人都知道,没有这层校验,生成结果根本没法用。
2.3 几何生成:从操作序列到三维实体
文本解析完之后,下一步是把结构化参数变成实际的几何操作序列。这里涉及到一个关键问题:CAD建模的操作顺序是有讲究的。先拉伸再打孔和先打孔再拉伸,结果可能完全不同。所以模型不仅要预测“做什么操作”,还要预测“按什么顺序做”。
目前效果比较好的方案是采用类似代码生成的思路,把CAD操作定义成一套领域特定语言(DSL)。比如用类似Python的语法描述建模过程:
sketch = create_sketch(plane="XY") rect = draw_rectangle(sketch, width=100, height=100) extrude(rect, distance=10) for pos in [(15,15), (85,15), (15,85), (85,85)]: hole = create_circle(sketch, center=pos, radius=4) cut_extrude(hole, through=True)模型学习的就是从文本到这段代码的映射。这种表示方式的好处是可解释、可编辑、可验证。生成的代码可以直接在FreeCAD、OpenSCAD这类开源CAD里执行,也可以转换成商业CAD软件能识别的格式。
训练数据的来源是个大问题。要训练一个靠谱的Text2CAD模型,需要大量“文本-模型”配对数据。目前公开的数据集规模都不算大,而且质量参差不齐。有些研究团队的做法是用程序化生成的方式造数据:随机生成参数化模型,然后用模板生成对应的文本描述。这种方式能快速扩充数据量,但缺点是文本描述比较机械,和真实用户的表达方式有差距。更理想的做法是从CAD社区收集真实的建模脚本和对应的设计说明,但这种数据获取成本很高。
2.4 三种技术路线的对比与选型建议
我把目前主流的三种技术路线整理成了一张表,方便你根据自己需求做判断:
| 技术路线 | 核心原理 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| 参数化序列生成 | 文本→操作序列→CAD脚本 | 可编辑、可解释、支持参数修改 | 依赖高质量序列数据,训练难度大 | 工程设计、需要后续修改的场景 |
| 直接几何生成 | 文本→隐式表示→网格/点云 | 生成速度快,形状多样性强 | 不可参数化编辑,精度有限 | 概念可视化、快速原型 |
| 检索式生成 | 文本→匹配已有模型库 | 实现简单,结果可靠 | 只能生成库内已有的形状 | 标准件选用、模板化设计 |
如果你是想做实际工程应用,我建议从参数化序列生成入手,虽然训练难度大,但产出物的可用性最高。如果只是想做概念展示或者快速验证想法,直接几何生成路线见效更快。检索式方案适合特定垂直场景,比如标准件库的智能选用,但通用性差。
3. 动手实操:搭建一个简易Text2CAD流程的完整步骤
3.1 环境准备与工具选型
要自己跑通一个Text2CAD的流程,你不需要从头训练一个大模型。更务实的做法是用现成的大语言模型做文本解析,然后接一个开源的参数化CAD引擎做几何生成。我实测下来比较顺手的组合是:用大模型API做语义理解,用CadQuery或者FreeCAD的Python接口做几何构建。
CadQuery是我比较推荐的一个库,它是一个基于Python的参数化CAD脚本工具,语法简洁,文档也还算友好。安装很简单:
pip install cadquery如果你更习惯FreeCAD的生态,也可以用它自带的Python控制台,FreeCAD的脚本能力更强,但学习曲线稍微陡一点。选哪个取决于你后续要不要做GUI交互——CadQuery更适合纯脚本自动化,FreeCAD适合需要可视化操作的场景。
大模型这一端,你可以用任何支持结构化输出的模型。关键是要让它按照你定义的JSON格式返回解析结果。我一般会在提示词里把输出格式写死,并且给几个示例,这样模型输出的稳定性会高很多。
3.2 文本解析环节的提示词设计
提示词的质量直接决定了解析结果的可用性。我踩过的坑是:一开始提示词写得太随意,模型返回的JSON格式五花八门,有时候字段名对不上,有时候数值带单位有时候不带,后处理写得我头大。后来我固定了一套模板,效果稳定很多。
核心思路是让模型扮演一个“CAD参数提取器”的角色,明确告诉它需要提取哪些字段,每个字段的类型和单位是什么。比如:
你是一个CAD参数提取助手。请将用户的设计描述转换为以下JSON格式: { "shape_type": "box|cylinder|plate|flange", "dimensions": {"length": 数值, "width": 数值, "height": 数值}, "features": [ {"type": "hole", "diameter": 数值, "positions": [[x,y],...]}, {"type": "fillet", "radius": 数值, "edges": "all|top|bottom"} ], "units": "mm" } 所有尺寸单位为毫米,位置坐标以模型中心为原点。这个提示词的关键点在于:限定了形状类型的枚举值,避免模型自由发挥;明确了单位,避免后续换算混乱;给出了位置坐标的参考系,避免孔位算错。实测下来,加了这几条约束之后,解析准确率能从六七成提升到九成以上。
3.3 从JSON到CAD模型的代码实现
拿到结构化参数之后,下一步就是用CadQuery把它变成实际的几何体。我写了一个简化的示例,展示从JSON到模型的完整过程:
import cadquery as cq import json def build_model(params): p = json.loads(params) dims = p["dimensions"] # 创建基础形状 if p["shape_type"] == "plate": model = cq.Workplane("XY").box( dims["length"], dims["width"], dims["height"] ) # 添加特征 for feat in p.get("features", []): if feat["type"] == "hole": for pos in feat["positions"]: model = (model.faces(">Z").workplane() .center(pos[0], pos[1]) .hole(feat["diameter"])) elif feat["type"] == "fillet": model = model.edges().fillet(feat["radius"]) return model # 示例调用 params = ''' { "shape_type": "plate", "dimensions": {"length": 100, "width": 100, "height": 10}, "features": [ {"type": "hole", "diameter": 8, "positions": [[-35,-35],[35,-35],[-35,35],[35,35]]} ], "units": "mm" } ''' result = build_model(params) cq.exporters.export(result, "output.step")这段代码跑通之后,你会得到一个STEP格式的三维模型文件,可以直接用任何CAD软件打开。注意孔位坐标那里我用了相对于中心的偏移量,因为CadQuery的workplane默认以面中心为原点。如果你用绝对坐标,需要先做一次坐标变换,这个细节很容易搞错。
3.4 参数校验与容错处理
上面那段代码是理想情况下的流程,实际跑起来你会遇到各种边界情况。比如模型返回的孔径大于板厚,或者孔位跑到板子外面去了,或者特征顺序导致布尔运算失败。这些问题不处理的话,程序直接报错退出,体验很差。
我的做法是在生成几何之前加一层参数校验。校验规则包括:所有尺寸必须为正数;孔径不能超过板厚的合理比例(一般不超过板厚的3倍);孔位必须在板子轮廓内且留有余量;倒角半径不能超过相邻边的最小长度。这些规则用简单的if-else就能实现,但能挡掉大部分低级错误。
如果校验不通过,不要让程序直接崩溃,而是返回一个友好的错误提示,告诉用户哪个参数有问题、应该怎么改。这个体验上的细节,决定了你的工具是“能用”还是“好用”。
4. 实际效果与边界:Text2CAD目前能做什么、不能做什么
4.1 简单规则形状:基本可用,但需要人工复核
我拿十来个不同类型的描述做了测试,涵盖方形板、圆柱体、法兰盘、支架这类常见零件。结果是:对于结构简单、描述清晰的模型,Text2CAD生成的准确率相当高。比如“100×100×10的板,四角各一个直径8的孔,孔中心距边缘15”,这种描述生成出来的模型基本一次到位,尺寸和位置都对得上。
但一旦描述里出现模糊表述,比如“适当大小的孔”“靠近边缘的位置”,模型就开始自由发挥了。它可能会给你一个直径10的孔,也可能给直径6的,位置也是随机的。所以我的经验是:用Text2CAD的时候,描述必须尽可能精确,把所有关键尺寸都写清楚。你省掉的每一个数字,都会变成后面修改的工作量。
另一个问题是特征顺序。有些描述里没有明确说先做什么后做什么,模型自己排的顺序可能不是最优的。比如先倒角再打孔,可能导致孔的位置落在倒角面上,加工时不好处理。这种问题在简单模型上不明显,但零件一复杂就暴露出来了。
4.2 复杂曲面和自由形状:目前基本搞不定
Text2CAD目前的能力边界非常清晰:它擅长处理规则几何,对自由曲面基本无能为力。你让它生成一个“流线型的汽车外壳”或者“有机形态的椅子”,它要么给你一个粗糙的近似形状,要么直接摆烂输出一个方块。
原因在于参数化序列生成这条路本身就依赖预定义的操作原语。拉伸、旋转、打孔、倒角这些操作能覆盖大部分机械零件,但覆盖不了雕塑类的自由形态。自由曲面建模需要的是NURBS控制点调整、放样、扫掠这些高级操作,而这些操作的参数空间太大,模型很难从文本直接预测。
所以如果你做的是工业设计、消费品外观这类需要自由曲面的工作,Text2CAD暂时帮不上大忙。但如果你做的是机械结构件、钣金件、标准零件,那它的可用性就高很多。
4.3 尺寸精度:别指望一次到位
大模型对数字的处理能力是个硬伤。我测试中发现,即使提示词里明确要求“所有尺寸精确到毫米”,模型偶尔还是会输出“约50mm”或者“50.0mm左右”这种表述。更麻烦的是,当描述里涉及尺寸链计算时,比如“孔中心距边缘的距离是板宽的四分之一”,模型算出来的结果有时候对有时候错。
所以我的建议是:把Text2CAD生成的模型当作初稿,不要直接用于生产。所有关键尺寸必须人工复核一遍,该改的改,该约束的约束。这个复核过程比从零建模快得多,但绝对不能省。
4.4 与现有CAD工作流的衔接
Text2CAD生成的模型要真正用起来,必须能导入到你日常使用的CAD软件里。目前CadQuery和FreeCAD都支持导出STEP和STL格式,这两种格式主流CAD软件都能识别。STEP保留了几何信息但丢失了建模历史,STL只有网格没有精确几何。如果你需要后续在SolidWorks或者中望CAD里继续编辑,STEP是更好的选择。
但这里有个现实问题:不同CAD软件对STEP的解析质量参差不齐。我遇到过CadQuery导出的STEP在某个软件里打开后圆角变形成多边形的情况。所以导出之后一定要在目标软件里检查一遍,确认几何没有丢失或变形。
5. 踩坑记录与常见问题排查
5.1 模型输出格式不稳定的排查思路
这是最常见的问题:同样的提示词,模型有时候返回标准JSON,有时候夹带解释文字,有时候字段名拼错。排查思路分三步走。第一步,检查提示词里有没有明确说“只返回JSON,不要任何其他文字”。第二步,在代码里加一层JSON提取逻辑,用正则把花括号内容抠出来再解析。第三步,如果还是不稳定,换用支持结构化输出(Structured Output)的API接口,强制模型按schema返回。
我自己的做法是在提示词末尾加一句“如果无法解析,返回空JSON对象”,这样至少不会因为格式错误导致程序崩溃。
5.2 几何生成失败的典型原因
CadQuery报错最常见的原因是布尔运算失败。比如在已经打了孔的位置再打一个孔,或者倒角半径太大导致几何自相交。排查方法是把操作序列打印出来,一步一步执行,看在哪一步报错。如果是布尔运算失败,尝试调整操作顺序,或者把大特征拆成小特征分步执行。
另一个坑是坐标系混乱。CadQuery的workplane会改变当前坐标系,如果你在多个面上操作,很容易搞混方向。我的经验是每步操作后都打印一下当前workplane的原点和方向,确认符合预期再继续。
5.3 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 模型返回非JSON格式 | 提示词约束不够强 | 检查返回文本开头 | 加“只返回JSON”约束,或换结构化输出接口 |
| 孔位偏移 | 坐标系原点不一致 | 打印workplane原点 | 统一使用相对坐标或绝对坐标 |
| 布尔运算失败 | 特征重叠或自相交 | 逐步执行操作序列 | 调整操作顺序,拆分复杂特征 |
| 导出STEP后变形 | 格式兼容性问题 | 在目标软件中检查 | 尝试导出为IGES或直接使用STL |
| 尺寸偏差大 | 模型数值计算错误 | 对比输入输出数值 | 加数值校验层,关键尺寸人工复核 |
5.4 几个容易被忽略的实操细节
第一个细节:单位统一。大模型有时候会把毫米和厘米搞混,尤其是当描述里没有明确写单位的时候。我的做法是在提示词里强制要求所有尺寸转换为毫米,并且在代码里再做一次单位校验。
第二个细节:特征命名。如果你生成的模型要给别人用,给每个特征起个有意义的名字很重要。比如“安装孔1”比“孔1”清楚得多。CadQuery支持给特征打标签,这个功能在复杂模型里特别有用。
第三个细节:版本兼容。CadQuery和FreeCAD都在持续更新,不同版本的API可能有变化。如果你把代码分享给别人,最好注明测试通过的版本号,避免别人跑不起来。
6. 我对Text2CAD后续发展的一些判断
从实际使用体验来看,Text2CAD目前还处于“能用但不够好用”的阶段。它在简单规则零件上的表现已经可以接受,但离“描述即所得”的理想状态还有距离。最大的瓶颈不在文本理解,而在几何生成的可靠性和精度控制。大模型可以很好地理解你要什么,但把它精确地做出来,还需要很多工程上的打磨。
我比较看好的一个方向是“交互式修正”。与其追求一次生成完美模型,不如让用户可以在生成结果上做增量修改。比如生成之后说“把四个孔改成六个孔,均匀分布”,系统在已有模型基础上做局部调整,而不是从头重新生成。这种方式更符合实际设计流程,也更容易保证结果的可控性。
另一个值得关注的点是多模态输入。纯文本描述有时候说不清楚空间关系,如果能结合草图或者参考图片,生成准确率会高很多。已经有研究在做文本加草图的联合输入,效果比纯文本好不少。
如果你现在就想用Text2CAD做点实际的东西,我的建议是从最简单的场景开始:标准件生成、模板化零件、参数化族库的快速创建。这些场景对精度要求相对宽松,容错空间大,而且确实能省时间。等流程跑顺了,再逐步尝试更复杂的零件。别一上来就挑战自由曲面,那是给自己找不痛快。
最后分享一个我在实际项目中总结的小技巧:把常用的零件描述做成模板,只留几个关键尺寸作为变量。比如“法兰盘模板:外径{OD},内径{ID},厚度{T},螺栓孔数量{N},孔径{D}”。这样每次生成的时候只需要填几个数字,比每次写完整描述靠谱得多,也快得多。这个思路本质上是用工程化的方法弥补AI的不稳定性,实测下来很管用。