1. 从一句话到三维模型:text-to-cad 到底在解决什么问题
第一次听到 "text-to-cad" 这个说法,很多人脑子里冒出来的画面是:对着电脑说一句"给我画个支架",屏幕上就自动长出一个带孔位的三维零件。这个想象不算离谱,但真正落地到工程实践里,它要解决的问题比"语音画图"要具体得多,也有意思得多。
text-to-cad 的核心,是把自然语言描述转换成可编辑、可制造的三维 CAD 模型。注意这里的关键词是"可编辑"和"可制造",而不是"生成一张好看的渲染图"。这两者之间的差距,就是玩具和工具之间的差距。一张渲染图只要看着像就行,但一个 CAD 模型必须满足尺寸约束、拓扑正确、能被下游的 CAM 或 3D 打印切片软件正常读取,甚至要能通过参数化修改继续迭代。
我接触这个方向,最初是因为一个很朴素的痛点:做非标零件设计的时候,大量时间花在了"重复建模"上。比如一批法兰盘,区别只是孔径、孔数、外径这几个参数,但每来一个新规格,就得在 CAD 软件里重新拉伸、打孔、倒角。这种活儿技术含量不高,却极其消耗精力。当时我就在想,能不能用一段文字描述直接生成基础模型,然后人工只做微调?text-to-cad 正好切中了这个需求。
它适合谁来关注?三类人最应该了解。第一类是机械设计工程师,尤其是经常做系列化、参数化零件的;第二类是3D 打印爱好者,脑子里有想法但建模软件不熟练的;第三类是做 AI 应用开发的工程师,想把这个能力集成到自己的产品里。不管你是哪一类,理解 text-to-cad 的技术链路和边界,都比单纯会用一个工具重要得多。
需要先泼一盆冷水:目前这个方向远没有到"说一句话就出成品"的程度。它更像是一个高效的起点生成器,帮你把 60% 的重复劳动干掉,剩下的 40% 精细调整仍然需要人来把关。抱着这个预期去用它,体验会好很多。
2. 拆解 text-to-cad 的技术链路:文字是怎么变成实体的
要真正用好一个东西,得先知道它内部在干什么。text-to-cad 不是一个单一模型,而是一条由好几个环节串起来的流水线。理解这条流水线,你才能判断它在哪一步可能出错,以及出错后该怎么补救。
2.1 自然语言理解:把口语翻译成结构化意图
第一步是把人话变成机器能处理的结构化意图。你说"一个长 80 毫米、宽 40 毫米、厚 5 毫米的板子,四角各打一个直径 4 毫米的孔",模型需要从中抽取出:基体是长方体、尺寸是 80×40×5、特征是四个角上的圆孔、孔径 4 毫米、孔位在四角。
这一步通常靠大语言模型来完成,输出的是一个结构化的中间表示,比如 JSON 或者某种领域特定语言。这里有个容易被忽略的细节:自然语言里的模糊性。"四角各打一个孔"——孔心距离边缘多少?是贴着边还是留 5 毫米边距?人会觉得"你懂的",但机器不懂。所以好的 text-to-cad 系统会主动补默认值,或者反过来追问你。
我实测下来,描述里越少用相对词、越多用绝对数值,生成成功率越高。"大一点的孔"这种描述基本等于没说,"直径 6 毫米的孔"才是有效输入。
2.2 中间表示:为什么需要一层"翻译稿"
从语言直接跳到三维几何,跨度太大,容易崩。所以中间会插一层中间表示,常见的有两类:一类是参数化脚本,比如用类似 OpenSCAD 的语法描述几何;另一类是结构化特征树,把模型拆成拉伸、旋转、打孔、倒角这些操作序列。
这层中间表示的价值在于可解释和可修改。如果直接生成网格,你拿到手就是一堆三角面片,想改个孔径得重新生成;但如果中间是"拉伸一个 80×40 的矩形到 5 毫米厚,再在四角打四个孔"这样的操作序列,你改一个数字就能重新出模型。这也是为什么很多 text-to-cad 方案选择输出代码而不是输出网格——代码是可迭代的。
提示:如果你在选型 text-to-cad 工具,优先选那些能输出可编辑脚本或特征树的,而不是只给你一个 STL 网格的。前者能改,后者基本是一次性的。
2.3 几何生成与校验:从脚本到实体
有了中间表示,接下来就是真正生成几何。这一步通常调用成熟的几何内核,把脚本或特征树"执行"成实体模型。生成完之后还有一道校验:模型是不是封闭的(水密性)、有没有自相交、尺寸是不是符合描述。
这一步是最容易出问题的地方。语言模型可能生成语法正确但几何上不合理的脚本,比如孔打到了实体外面,或者两个特征重叠导致布尔运算失败。所以一个成熟的 text-to-cad 系统,校验环节必须扎实,否则你拿到的模型看着像那么回事,一导入切片软件就报错。
2.4 输出格式:STL、STEP 还是别的
最后是输出。不同格式用途不同,这里必须说清楚:
| 格式 | 特点 | 适用场景 |
|---|---|---|
| STL | 只有三角网格,无参数、无单位 | 3D 打印切片 |
| STEP | 保留精确几何和拓扑,可编辑 | 工程交付、二次设计 |
| OBJ | 网格格式,可带材质 | 渲染、可视化 |
| 脚本源码 | 参数化描述,可重新执行 | 迭代修改、版本管理 |
如果你只是打印个东西,STL 够用;但如果你要把模型交给加工厂或者继续在 CAD 里改,一定要 STEP。我见过有人拿 STL 去让工厂报价,结果对方根本没法测量精确尺寸,白折腾一趟。
3. 动手实操:用文字生成一个可打印的零件
光讲原理没意思,我们直接走一遍完整流程。下面这个例子是我自己反复跑过的一个场景:生成一个带安装孔的电子元件外壳底座。这个需求很典型,既有外形尺寸,又有特征孔位,还能直接拿去打印验证。
3.1 环境准备与工具选择思路
先说工具选择。目前实现 text-to-cad 有几条路线,各有取舍:
- 纯代码路线:用大语言模型生成 OpenSCAD 或 CadQuery 脚本,本地执行。优点是可控、免费、可版本管理;缺点是需要你会一点脚本,且模型复杂时容易出错。
- 集成平台路线:用现成的 text-to-cad 服务,输入文字直接出模型。优点是省事;缺点是黑盒,改不动,复杂件效果不稳定。
- 混合路线:让模型生成脚本,你在本地跑,出错就手动改脚本。这是我自己最常用的,兼顾效率和可控性。
我推荐从混合路线入手。环境上,你需要一个能跑 Python 的环境,装上 CadQuery 或者 OpenSCAD。CadQuery 基于 Python,语法相对友好,适合做参数化零件。
pip install cadquery装完之后,验证一下能不能正常导入:
import cadquery as cq result = cq.Workplane("XY").box(10, 10, 10) print(result.val().Volume())能打印出体积数字,说明环境没问题。这一步看着简单,但很多人卡在几何内核的依赖上,尤其是 Windows 环境下某些库的编译问题。如果 pip 装不上,可以试试 conda 渠道。
3.2 把需求写成"机器友好"的描述
现在把需求写成文字。注意,这里的写法直接决定成败。我先给你看一个反面写法:
"做一个差不多巴掌大的盒子,底下开几个孔用来拧螺丝。"
这种描述人看了都得追问,机器更没法处理。正确的写法是把每个尺寸都钉死:
"生成一个长方体底座,长 60 毫米,宽 40 毫米,高 15 毫米。在底面四个角各打一个直径 3.2 毫米的沉头孔,孔心距离相邻两条边各 5 毫米。顶面挖一个深 10 毫米、长 50 毫米、宽 30 毫米的矩形凹槽,凹槽居中。"
这段描述里,每个特征都有明确的类型、位置、尺寸。这就是"机器友好"的描述。我总结了一个模板,你可以直接套:
- 基体:形状 + 长宽高
- 特征:类型(孔/槽/凸台)+ 数量 + 位置 + 尺寸
- 约束:居中、对齐、距离某边多少
3.3 生成脚本并执行
把上面那段描述丢给大语言模型,让它输出 CadQuery 脚本。下面是我实际拿到并微调过的版本:
import cadquery as cq # 基体尺寸 L, W, H = 60.0, 40.0, 15.0 # 凹槽尺寸 slot_L, slot_W, slot_D = 50.0, 30.0, 10.0 # 孔参数 hole_d = 3.2 hole_offset = 5.0 # 建基体 base = cq.Workplane("XY").box(L, W, H) # 顶面挖凹槽 base = ( base.faces(">Z").workplane() .rect(slot_L, slot_W) .cutBlind(-slot_D) ) # 底面四角打孔 base = ( base.faces("<Z").workplane() .rect(L - 2 * hole_offset, W - 2 * hole_offset, forConstruction=True) .vertices() .hole(hole_d) ) cq.exporters.export(base, "base.stl") cq.exporters.export(base, "base.step")跑一遍,如果没报错,当前目录下就会多出base.stl和base.step两个文件。STL 拿去打印,STEP 留着以后改。
3.4 验证模型是否真的能用
生成完别急着打印,先做三件事:
- 看尺寸:用切片软件或者 CAD 打开,量一下关键尺寸对不对。我遇到过模型整体缩放错了 10 倍的情况,原因是单位没对齐。
- 查水密性:STL 必须是封闭的,否则切片会出问题。很多切片软件会提示"模型不是水密的",看到这个提示就得回去查脚本。
- 试切片:直接丢进切片软件跑一遍,看有没有悬空、薄壁这些打印不友好的结构。
这三步走完,模型才算真正可用。跳过验证直接打印,浪费的是时间和耗材。
4. 实测中那些让人抓狂的坑与应对
text-to-cad 用起来爽的时候很爽,但坑也不少。下面这些是我和身边同行踩过的,写出来帮你省点时间。
4.1 尺寸单位混乱:毫米和米打架
最常见也最致命的坑。大语言模型生成脚本时,有时候默认单位是米,有时候是毫米,全看它当时"心情"。结果就是模型要么小得看不见,要么大得离谱。
应对办法很简单:在描述里显式写单位,在脚本里显式定义变量。比如开头就写L = 60.0 # 单位:毫米,所有尺寸都基于这个约定。导出前再检查一遍包围盒尺寸,对不上就说明单位错了。
4.2 布尔运算失败:孔打在了实体外面
当你描述"在边缘打孔"但没给具体边距时,模型可能把孔心算到了实体边界之外,布尔减运算直接失败,或者生成一个破面。这种错误在脚本执行时会报异常,但有时候不报错,只是结果不对。
我的经验是:所有特征的位置都要有明确的参照。"距离左边 5 毫米"比"靠左"靠谱一百倍。如果模型还是算错,就手动改脚本里的坐标值,这比重新生成一遍快。
4.3 复杂特征组合时的"雪崩"
单个特征(一个孔、一个槽)生成成功率很高,但当你要求"打孔 + 倒角 + 挖槽 + 加筋"一起上时,出错概率陡增。因为每一步都依赖前一步的结果,前面稍微偏一点,后面全乱。
应对策略是分步生成、分步验证。先只生成基体,确认没问题;再加孔,确认;再加槽。虽然麻烦,但比一次性生成一个乱七八糟的模型再从头查要快。这也是为什么我推荐输出脚本而不是直接出网格——脚本可以一步步调试。
4.4 参数化改不动:拿到手是个"死"模型
有些工具输出的是纯网格,你想把孔径从 3 毫米改成 4 毫米,只能重新生成一遍,而且重新生成的结果可能和上次不一样。这就是"死"模型。
避免这个坑的唯一办法是坚持用参数化脚本。CadQuery、OpenSCAD 这类工具生成的模型,改一个变量就能重新出图,这才是 text-to-cad 真正的价值所在。如果某个工具只给你 STL,那它顶多算个"文字转网格",离 CAD 还差得远。
5. 让生成成功率翻倍的描述技巧
用了几个月下来,我总结出一套描述方法,能把一次成功率从大概三成提到七成以上。这些技巧不依赖具体工具,通用性很强。
5.1 用"特征清单"代替"整段描述"
与其写一大段话,不如列一个清单。模型对清单式输入的理解准确率明显更高。比如:
- 基体:长方体,80×50×20 毫米
- 特征 1:顶面中心挖圆槽,直径 30 毫米,深 8 毫米
- 特征 2:底面四角打孔,直径 4 毫米,边距 6 毫米
- 特征 3:所有外边缘倒角 1 毫米
这种结构清晰,模型不容易漏掉特征,你检查起来也方便。
5.2 数值优先,形容词靠边
"大孔""小槽""厚一点"这类词,对模型来说信息量几乎为零。全部换成数值。"直径 8 毫米的孔"永远比"一个大孔"强。如果实在不确定具体数值,就给一个范围加默认值,比如"孔径 4 到 6 毫米,取 5 毫米"。
5.3 先给整体,再给局部
描述顺序也有讲究。先说整体外形和尺寸,再说局部特征。因为模型生成脚本时,通常也是先建基体再加工特征。顺序一致,逻辑就顺。反过来先说"打四个孔"再说"这是个 80 毫米的板子",模型容易懵。
5.4 明确坐标系和朝向
三维建模里,朝向很重要。"顶面""底面""前面"这些词,模型需要知道对应哪个坐标轴。稳妥的做法是显式说明,比如"以底面为 XY 平面,Z 轴向上"。这样模型生成的脚本方向不会乱,后续导入其他软件也不会躺倒。
6. 这套方法能用在哪些真实场景
text-to-cad 不是万能锤,但在特定场景下效率提升非常明显。下面几个是我实际用过、觉得值的。
6.1 系列化标准件的快速出图
法兰、支架、垫片这类零件,往往是一组参数变来变去。用 text-to-cad 生成一个参数化脚本模板,之后每来一个新规格,改几个数字就出图。我做过一组支架,原来一个规格建模加检查要 20 分钟,现在改参数加验证 3 分钟搞定。
6.2 3D 打印前的快速原型
脑子里有个想法,想打印出来看看。以前得打开建模软件,从草图开始画,半小时起步。现在描述一下,生成脚本,跑出来直接切片。虽然细节可能不完美,但验证想法足够了。快速迭代的价值就在这里。
6.3 教学和演示场景
给不熟悉建模的人讲"什么是参数化设计",直接现场用文字生成一个模型,改个参数再生成,比讲一堆概念直观得多。这个场景下 text-to-cad 是个很好的教具。
6.4 批量生成变体做对比
做设计选型时,经常要比较几种方案。比如同一个零件,孔径 3 毫米、4 毫米、5 毫米各来一版,看哪个合适。手动建模得画三遍,用脚本就是改个循环的事。这种批量变体生成,是 text-to-cad 相对传统建模的碾压性优势。
7. 我对 text-to-cad 的一点真实看法
用了这么久,我的判断是:它现在是一个优秀的"副驾驶",但还不是"自动驾驶"。它能帮你把重复劳动干掉,把想法快速变成可验证的模型,但最终的工程判断、公差控制、可制造性评估,仍然得靠人。
我踩过最大的坑,是一开始期望太高,以为描述一下就能出成品,结果拿到模型发现一堆问题,反而觉得这工具不行。后来调整心态,把它当成"帮我打草稿的助手",体验就完全不一样了。它生成的脚本我基本都会过一遍,改几个参数,补几个约束,然后才用。这个过程比从零建模快得多,但绝不是"零成本"。
如果你刚开始接触,我的建议是:从最简单的零件练起,先把描述技巧磨出来,再逐步上复杂度。别一上来就让它生成一个带曲面、带装配关系的复杂件,那大概率会让你失望。等你能稳定生成带孔、带槽、带倒角的规则零件了,再往深了走。
另外,一定要养成保留脚本、版本管理的习惯。每次生成的脚本存下来,改过的版本也存下来。时间长了你会发现,这些脚本本身就是一笔资产,下次遇到类似零件,翻出来改改就能用,比重新描述一遍还快。这个习惯,是我觉得比任何工具技巧都值钱的东西。