news 2026/10/10 4:30:38

Text-to-CAD实战:用自然语言生成可编辑的STEP模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Text-to-CAD实战:用自然语言生成可编辑的STEP模型

Text-to-CAD,字面意思是用自然语言直接生成CAD模型。我第一次把“一块长80、宽60、厚6的矩形铝板,四角各带一个直径5的通孔”这样一句描述丢进工作流,几分钟后拿到可编辑的STEP文件时,第一反应不是“AI真厉害”,而是“我以前为什么在类似的活上耗了那么多时间”。传统CAD里画这种零件,开新文件、建草图、约束、拉伸、打孔、倒角,一套命令走下来少说十几分钟,改一版尺寸又得从头点一遍。Text-to-CAD这个方向,本质是把“设计意图 → 参数特征 → 几何实体”这条链路压缩到一句话的距离。

这篇文章不聊概念,我从实际工程视角拆一拆:它下面雷打不动的几条技术路径是什么,哪些能真正落到加工和生产,以及怎么在本地搭一条最快跑通、还能反复用的可复现流程。无论你是机械工程师想提效,还是3D打印玩家想快速出模型,这篇文章都值得看完后照抄一遍。

1. text-to-cad 是在解决哪段“费力不讨好”的路

先把问题摆正:很多人以为3D建模的痛点是“不会用软件”,但实际工作里更痛的是“想法已经很清楚,却还要一笔一笔画出来”。做过机械设计的朋友都有体会,最耗时间的往往不是结构方案本身,而是把结构方案翻译成软件能认的特征序列:这一步该选哪个基准面,这个凸台该从哪个草绘拉伸,孔到底是通孔还是盲孔。

1.1 设计意图到可制造模型之间的三个断层

  • 第一个断层是语言到参数:人对几何的描述是语义化的——“这里有个加强筋,和底板对齐,厚度3毫米”,CAD软件不接受语义,它要的是草图、尺寸、约束、特征树。语义到参数的转译,过去只能靠熟练工程师手搓。
  • 第二个断层是参数到几何:即使有了尺寸参数,建模顺序错了、父特征选错了,轻则模型报错重则整个装配体干涉。这个环节考验的是“建模经验”,不是每个有想法的人都有。
  • 第三个断层是几何到工程交付:图纸要标注、格式要STEP或IGES、零件要检查流形性和干涉,这层工艺经验又是另一道门槛。

Text-to-CAD瞄准的,恰恰是第一个断层的自动化:让模型替你完成从自然语言到参数特征的转译。这也是为什么它比单纯的“AI生成图片”更让工程界兴奋——因为它直接缩短了从概念到加工的距离。

1.2 为什么入口偏偏是“文字”而不是鼠标

这里有个反直觉的点:图形建模软件已经有三四十年历史,操作方式从命令行进化到图标,再到现在的参数化和直接建模,为什么绕了一圈,入口又回到了“打字”?

因为文本是当前最稳定的指令接口。现阶段的生成模型本质上都是“下一个词预测”,最擅长处理的就是离散符号序列。代码是符号序列,文字是符号序列,几何操作如果被写成代码,也可以看成符号序列。反过来,鼠标点选、拖拽、草绘这一串连续动作,生成模型反而很难驱动。

另一个原因是文本信息密度高。完整描述一个中等复杂零件,几百字足够;“教”一个新手画出来,可能要半小时。文字能把约束、尺寸、材料、加工方式压缩在一个提示词里,这对LLM来说是天然的输入形态。

2. 分清技术路线:text-to-CAD 与 text-to-3D 的差别比想象中大

现在网上一搜“text to cad”,会冒出两类完全不同的东西。一类是从自然语言直接生成三维网格或神经场,视觉效果花哨,常用于游戏、影视、概念展示;另一类是生成参数化实体模型,也就是真正进入CAD生态的数据。这两类差别极大,如果没分清就选错方向,项目大概率胎死腹中。

2.1 CAD模型的三条硬指标:流形实体、特征树、标准交换格式

工业界愿意支付的CAD模型,必须同时满足三条硬指标:

  1. 几何合法性:模型必须是流形实体,简单说就是“内部是实心、表面是封闭”的结构。不能有自相交面,不能有零厚度薄片,不能有悬空的孤立面。这样的模型才做得了布尔运算、切得出手印、算得出体积。
  2. 参数化特征树:下游工程师要改尺寸、改位置、改特征,靠的是建模历史里的约束和特征。一个“实心死数据”的三角网格,在工程链条里基本不可用。
  3. 可交换格式:CAD软件之间互通靠STEP、IGES这类B-rep标准。STL虽然常见,但它只是三角面片,没有法线连续性、没有单位语义、没有特征信息,只能拿去打印和预览。

如果你生成的模型满足不了这三条,那它再有“美感”也过不了工程验收。所以真正意义上的Text-to-CAD,落点通常是参数化实体模型,而不只是“一个好看的三维形状”。

2.2 四条主流转译路线的取舍

把自然语言变成满足上述硬指标的模型,目前主要有四条路子:

  • 路线A:大模型直接生成参数化脚本(最成熟)。让LLM写出CadQuery、OpenSCAD这类脚本CAD库代码,再本地执行脚本生成实体。脚本天然带特征树,导出STEP就是B-rep,工程属性完全保留。
  • 路线B:专用端到端模型直接输出B-rep参数。学术界已经有直接用Transformer生成几何拓扑序列的工作,不经过代码,直接吐出点、边、面的连接关系和方程系数。精度上限高,但公开可用的成熟产品还不多,工程复现成本高。
  • 路线C:文本生成网格/点云,再用软件逆向拟合。优点是出图快、造型自由;缺点是网格转实体往往要重新拓补,误差大,且结果通常不再参数化。
  • 路线D:从已有零件库检索再改参数。给大模型挂一个零件库检索器,先找相似件,再通过脚本改尺寸。胜在稳定,败在依赖库的覆盖范围。

四条路线里,我实际项目里选最多的是A:可解释、可迭代、可拿到工程用的STEP文件。接下来就沿着路线A把全套流程走一遍。

3. 从零跑通一条“描述→脚本→STEP”的最小工作流

如果你也想快速验证Text-to-CAD,不必等什么IDE插件或商业产品,自己搭一条最小可用链路,核心组件就三个:一个脚本化CAD内核、一个大模型API(或本地部署模型)、一个跑迭代的Python胶水脚本。

3.1 环境准备:装好验证极快的脚本CAD库

我选CadQuery而不是OpenSCAD,原因很直接:OpenSCAD是CSG构型,描述复杂倒角、抽壳、圆角这类工程特征非常别扭;CadQuery用“工作平面+特征链”的方式建模,思路和SolidWorks相似,生成的特征树也更容易让人理解。

建议新建独立环境安装:

conda create -n cadq python=3.11 -y conda activate cadq conda install -c conda-forge cadquery -y

如果坚持用pip环境,直接pip install cadquery也不是不行,但CadQuery底层依赖OCCT的Python绑定,pip在某些平台容易拉源码现场编译,时间久且容易失败。Conda-forge有预编译包,省心得多。

装好先跑一个冒烟测试,确认能导出一个STEP文件:

import cadquery as cq result = ( cq.Workplane("XY") .box(40, 30, 10, centered=False) .faces(">Z") .workplane() .hole(5) ) val = result.val() print("体积:", val.Volume()) print("包围盒:", val.BoundingBox().xlen, val.BoundingBox().ylen, val.BoundingBox().zlen) print("合法:", val.isValid()) cq.exporters.export(result, "smoke_test.step")

这段代码的意思是:在XY平面生成一个40×30×10的方块,再在顶面打一个直径5的孔。如果“体积”“包围盒”“合法”三行都正常输出,库就算跑通了,后面所有内容都建立在这个验证链路上。

3.2 系统提示词:这是生成质量的“第一道闸门”

很多人的Text-to-CAD失败,不是模型能力不够,而是提示词太“聊天”。给大模型一套工程约束明确的系统提示词,生成质量会有质的提升。我长期使用下面这版模板:

你是参数化CAD脚本工程师。请根据用户描述输出CadQuery脚本。 规则: 1. 单位一律是毫米。 2. 坐标系约定:Z轴向上,默认建基准面在XY。 3. 凡是规则排列的孔、凸台,优先用线性阵列或极坐标阵列,不要逐个写。 4. 所有尺寸必须是具体数值,禁止用占位变量,禁止让用户后续填写。 5. 每写一个特征,必须在代码上方用中文注释说明这个特征对应描述里的哪句话。 6. 只生成单个实体零件,不要生成装配体。 7. 脚本最后必须包含 cq.exporters.export(result, "output.step")。 8. 如果描述里有相互矛盾的尺寸,优先按较小者执行。

第3条和第5条看起来不起眼,其实是最关键的。第5条让模型的推理路径和用户描述对齐,减少“听成了另一个零件”的幻觉;第3条则逼着模型用参数化阵列,模型的可修改性一下子上去,因为你改一个数,所有阵列孔都跟着变。

3.3 一个能跑的生成结果长什么样

假设输入是“做一个安装支架:底板长120、宽80、厚8,底板四角开直径6的安装孔,在顶面居中升起一个高30的圆柱凸台,直径40,凸台中心打通孔直径20”。

模型按上面模板输出的合理脚本大致长这样:

import cadquery as cq # 底板:长120、宽80、厚8 result = ( cq.Workplane("XY") .box(120, 80, 8, centered=False) ) # 底板四角开直径6的安装孔,距边10 result = ( result.faces(">Z") .workplane() .rect(100, 60, forConstruction=True) .vertices() .hole(6) ) # 顶面居中凸台:高30,直径40 result = ( result.faces(">Z") .workplane() .circle(40 / 2) .extrude(30) ) # 凸台中心打通孔直径20 result = ( result.faces(">Z") .workplane() .circle(20 / 2) .cutBlind(-30) ) cq.exporters.export(result, "output.step") cq.exporters.export(result, "output.stl")

这个脚本涉及了“用构造矩形定位孔位”“先拉伸再切孔”两个常见套路。如果模型一次生成不完美,你也不用手工改,直接把报错信息丢回去让它重写,后面会讲闭环迭代。

3.4 生成后校验:体积、包围盒、流形性

脚本跑通不等于模型能交付。我建议每次生成后自动跑一段校验:

v = result.val() bbox = v.BoundingBox() assert v.isValid(), "模型不是合法流形实体" assert v.Volume() > 0, "体积为零,请检查特征是否被完全切穿" assert bbox.xlen > 0 and bbox.ylen > 0 and bbox.zlen > 0, "包围盒非法" print(f"体积: {v.Volume():.2f} mm^3") print(f"包围盒: {bbox.xlen:.1f} x {bbox.ylen:.1f} x {bbox.zlen:.1f} mm")

这一层是流水线的安全网。体积可以验证“是不是被切穿了”,包围盒可以验证“大模型是不是把120听成了12”。后面我会专门讲一圈调试时最容易遇到的实际问题。

4. 把生成质量从“能看”拉到“能用”的六个工程技巧

跑通一条最小链路不难,难的是让生成结果稳定地进入“可加工”状态。以下六个技巧是我在实际使用中反复踩坑总结出来的,直接照搬能省很多调试时间。

4.1 让模型先写建模计划,再写脚本

不要一上来就要求“直接给代码”。让模型先花一小段输出“建模计划”,比如:

建模计划: 1. 用box创建底板,长120宽80高8。 2. 在顶面建直径6的安装孔,四角均匀分布。 3. 在顶面中心拉伸圆柱凸台。

先写计划的好处有两个:一是模型在推理中途“复述”需求,一旦理解偏了,你在计划阶段就能发现,而不必等代码跑完;二是计划会自动约束后面的代码结构,让代码顺序和人类建模习惯一致,出Bug概率明显下降。

4.2 编译反馈循环:把报错变成下一轮的上下文

这是整个流程里最有价值的一个机制。脚本执行报错不可怕,可怕的是你手动去改。正确的做法是写一个自动迭代器:

import traceback prompt = USER_DESCRIPTION + SYSTEM_TEMPLATE for turn in range(4): script = llm_generate(prompt) # 调大模型生成脚本 try: exec(script, ns) break except Exception as e: err_msg = f"{type(e).__name__}: {e}\n" err_msg += traceback.format_exc() prompt += f"\n\n上次脚本执行报错如下:\n{err_msg}\n请分析原因,重写完整脚本,不要省略无关代码。"

实测下来,大部分语法错误、API拼写错误、特征引用错误,三轮之内就能清完。这个闭环之所以有效,是因为LLM能把“报错信息——错误原因——修正代码”串成一条推理链。它等于让你的工作流拥有了一个会自动Debug的虚拟助手。

4.3 强制单位与坐标系规范

工程领域的单位错误是灾难级的。一个“直径5”的孔,如果模型按英寸解释,孔径直接变127毫米。所以系统提示词里要反复强调毫米,校验脚本里也建议比对包围盒与预期尺寸,偏差超过5%直接拒绝下一轮。

坐标系同理。CadQuery默认Z轴向上,但生成模型有时会为了所谓“直观”把零件炸到别的方向。规定基准面统一为XY、主视图方向为Z正方向,后续不管是出工程图还是接CAM,都不用来回转坐标系。

4.4 超过8步特征务必拆分

大模型生成单个脚本的准确率随特征步数增加急剧下降。一个零件如果包含底板、翻边、凸台、四类孔、倒角,脚本很容易“做到后面忘记前面”。我的经验是:单体脚本控制在8个特征以内,零件一旦复杂,就拆成子件分别生成再导出装配。语言再好、模型再强,上下文长度也是有限的,别让一个脚本承载太多逻辑。

4.5 加一个几何与语义双层校验器

编译通过只是第一步,几何还要过关。我在前面提到的校验基础上再加一层语义校验:把用户描述里的关键参数提取成“约束字典”(比如长=120、宽=80、孔=6),生成后用包围盒、孔数量、孔距去比对。

expected = {"xlen": 120, "ylen": 80, "zlen": 8} bbox = val.BoundingBox() for k, v in expected.items(): actual = getattr(bbox, k) if abs(actual - v) > 1: print(f"警告: 期望{k}={v}, 实际{k}={actual:.1f}")

这一步能拦住绝大多数“听错尺寸”的幻觉,成本却极低。

4.6 把高频约束做成固定提示词片段

“同心”“平行”“居中”“等间距”这类工程约束,每次让模型现场理解很容易出错。更稳的做法是把它做成模板片段:

常见工程约束定义: - 同心:两个圆形特征共享同一圆心,建模时应先点选圆心参考再操作。 - 居中:特征平面中心对齐父特征平面中心。 - 阵列孔:四角均布孔先做构造矩形再取顶点打孔。

把这段固定塞进系统提示词,模型输出就会稳定很多。这一步属于“提示词工程里的封装”,把工程师的经验固化成可复用的词表。

5. 调试自动生成的CAD代码:踩坑实录与排查链路

即便有了上面这套流程,生成模型仍然会犯一些让你哭笑不得的错。下面几个坑我全踩过,列出来帮你省时间。

5.1 尺寸幻觉:直径写成半径

最典型的:用户描述“直径10的孔”,模型在CadQuery里生成circle(10)。CadQuery的circle参数是半径,不是直径。最后模型直径20,安装螺柱直接穿不进去。

排查链路并不复杂:看到孔位相关的体积/包围盒对不上,先不要怀疑整个模型,优先检查涉及circle、radius、diameter的地方。建议在系统提示词里加一条“CadQuery的circle()和hole()都使用直径值,不要使用半径”,或者反过来统一用circle(直径/2)。我实测加这一条后,孔径类错误下降非常明显。

5.2 零厚度与自相交:几何合法性失效

第二条高频异常是isValid()返回False。常见诱因是抽壳操作配合圆角顺序不对:先抽壳后圆角,或者对过薄壁抽壳再倒角,容易产生退化面。另一个诱因是叠加特征时选了错误的参考面,导致几何体出现自相交。

碰到这类问题,我的排查链路是:先用val.isValid()定位是在生成后立即失效,还是导出前失效;如果立即失效,就把脚本里的特征序列逐一注释掉,二分定位到坏特征,再让LLM只重写那一段。不要试图让LLM“看着整个坏模型自己修”——信息越多,它越容易改坏。

5.3 交付格式的坑:STL与STEP的用途界定

很多初学者只导出STL就发给供应商,结果加工端一脸茫然。STL是三角网格预览格式,没有单位语义、没有特征树、没有精度信息。真要进CAM、做模流、搞装配干涉检查,必须交付STEP。

实操中我两步都导:STL用来快速进切片软件看长什么样,STEP用来进专业CAD做尺寸标注和加工评估。校验阶段也建议优先跑STEP的导入导出验证,而不是只盯着STL看渲染好看。

5.4 一条建议的排错路径

当自动生成的模型不合格时,不要从头重跑,按下面的路径排查效率最高:

  1. 先看编译日志:语法错误还是接口错误?让LLM根据报错重写脚本。
  2. 再看合法性:isValid()是否为True?不是则二分定位坏特征。
  3. 再看尺寸一致性:包围盒和体积是否和描述吻合?不吻合检查单位与直径/半径。
  4. 最后看装配环境:把STEP放进总装配里检查干涉,这一步往往能发现“单独看很完美,装上去打架”的问题。

6. 按场景选路线,而不是按热度选路线

最后聊一个方向性问题。现在一提Text-to-CAD,好像什么都能生成,但实际工程里没有银弹。不同场景对“稳定性、可编辑性、美观度”的权重不同,选型组合也应该不同。

6.1 四条路线横向对比

路线工程可用性可编辑性生成速度适合场景
LLM+参数化脚本高高中机械零件、外壳、支架、模具初稿
专用模型直接输出B-rep高中中学术界探索、特定领域深度优化
文本生成网格再逆向拟合低低快概念展示、3D打印摆件、视觉原型
零件库检索+参数修改高高很快标准件变体、既有产品系列衍生

6.2 我实际会采用的选型组合

如果是做消费级3D打印摆件、手办原型,我会直接选“文本转网格”路线,图个出图快,反正打印前也要修边修面;如果是做五金件、外壳、装配件的结构设计,我只会用“LLM+参数化脚本”路线,并且坚持生成后做合法性校验;如果是企业里的标准件库管理,我会优先检索和参数修改,因为零件的家族体系往往比凭空生成更重要。

我没有把“专用B-rep生成模型”放进日常工作流,主要是这类模型的公开可用性和接口生态还不够成熟,偶尔试验可以,依赖它还太早。这个判断可能过半年会变,但就目前而言,脚本生成路线是投入产出比最高的。

我在实际项目里已经形成了一套固定的半自动流程:产品经理给出口头需求后,先转成一页“结构化需求单”,写明功能、安装关系、关键尺寸、加工方式,然后交给模型生成第一版CAD脚本,跑编译反馈循环,再导STEP切片看截面。常规钣金件、塑料外壳类的设计初稿,基本控制在半小时内就能拿到一个能评审的模型。

最后再分享一个小技巧:把“同心”“平行”“阵列孔距”这类高频约束写成固定提示词片段,比每次让模型临场理解要稳定得多。整体说一句,Text-to-CAD真正的价值不是让你彻底不建模,而是把“建模体力活”交给机器,把设计师的时间还给真正需要经验的判断。模型输出变稳了,你才有余力去处理装配、工艺和成本——那部分,才是工程师不可替代的地方。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 4:30:38

智能体安全实践:15%决策权下的四道防线与量化评估

1. 15%的决策权是怎么一步步交出去的先说个我亲历的场景。去年有个客户找到我,他们的业务系统已经接了三年AI,从最初的智能客服、文档摘要,到后来的代码审查辅助、排班建议,AI介入的环节越来越多。到我接手的时候,他们…

作者头像 李华
网站建设 2026/10/10 4:30:31

扣子视频工作流:三步搭建读书视频自动化生成链路

简介:这套扣子视频生产工作流主要面向自媒体创作者、读书类短视频运营者,以及对自动化剪辑流程感兴趣的扣子平台使用者。它把选题策划、书单整理、脚本生成、视频渲染发布等内容串联为可复用的自动化流程,帮助用户从繁琐的重复操作中解放出来…

作者头像 李华
网站建设 2026/10/10 4:30:25

基于Java+SSM+Flask的学生就业管理系统设计与实践

这套“基于JavaSSMFlask的学生就业管理系统”,是我前阵子帮某高校信息中心落地的项目。整个系统核心围绕学生就业信息管理平台展开,学生端可以完善简历、浏览岗位、在线投递、查看就业进度,企业端能发布职位、筛选简历、反馈面试结果&#xf…

作者头像 李华
网站建设 2026/10/10 4:30:20

Redis集群哈希槽全解析:从CRC16映射到迁移重定向

聊到Redis集群,面试官几乎必问哈希槽。这个点看起来就是一个名词解释,但真到二面三面追问起来,能完整讲清楚分布逻辑、重定向机制和迁移原理的人并不多。很多候选人知道“哈希槽一共16384个,key用CRC16取模”,再往后问…

作者头像 李华
网站建设 2026/10/10 4:28:51

自用Agent功能测试方法论:覆盖失效路径的实战指南

1. 项目概述:这不是跑个Demo,而是给自己的Agent做一次外科手术式体检“自用 Agent 的全面功能测试”——看到这个标题,别急着点开就抄代码。我干这行十多年,亲手搭过上百个Agent系统,从给小团队做内部知识助手&#xf…

作者头像 李华
网站建设 2026/10/10 4:28:49

DLL丢失怎么办?6种安全修复方案与预防策略

1. DLL丢失不是“蓝屏前兆”,而是系统在向你发求救信号很多人看到“找不到xxx.dll”弹窗的第一反应是:完了,系统要崩了。我刚接手某高校实验室一批老旧教学机时,也以为是Windows核心文件损坏——结果花了三天时间重装系统、更新驱…

作者头像 李华