ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

自然语言到CAD模型:text-to-cad与CadQuery实战解析

自然语言到CAD模型:text-to-cad与CadQuery实战解析 第一次看到 text-to-cad 这个词时我第一反应是这不就是把 AI 画图的思路搬到 CAD 建模上吗真正上手跑通之后才发现这个判断只对了一小半。text-to-cad文本到 CAD 模型生成要解决的是你输入一句正常的人类描述比如直径40毫米、高度25毫米、带4个均布通孔的圆柱法兰系统直接返回一份可编辑的 CAD 模型文件而不是一张渲染图。渲染图只负责好看模型却要能进下游的尺寸标注、装配、仿真、加工。这篇文章我从技术原理、实操链路、踩坑记录三个角度把 text-to-cad 这摊事完整聊一遍目标是让你看完之后能自己动手跑通一个最小示例。1. text-to-cad是什么一句文本背后的完整拼图1.1 从AI生成图像到AI生成模型的范式迁移先说一个很多人忽略的关键差异图像生成和模型生成对错误的容忍度完全不在一个量级。图像是一个像素矩阵哪怕结构歪了、颜色糊了只要整体看起来对观感上勉强能接受。CAD 模型是另一种东西——它是基于边界表示B-Rep的实体几何必须有封闭的拓扑、精确的尺寸、自洽的曲面连接关系。一个直径应该是 20mm 的圆孔你生成成 20.5mm在屏幕上肉眼几乎看不出来但放到机床上一加工零件直接报废。所以 text-to-cad 从来没打算像文生图那样生成一个大概像的东西它追求的是文本里的每个定量信息都要落在最终的模型上每个特征都要以可编辑、可参数化的形式存在。这意味着从文本到模型的每一步本质上都是在做信息无损转换而不是形似转换。这个范式迁移决定了技术路线、评价标准、落地方式后面所有内容都围绕这个核心展开。1.2 它真正解决的痛点是什么我在工程师圈子里观察到的第一个痛点是有想法的人不会建模。很多机械工程师、结构工程师、甚至产品经理脑子里很清楚一个零件长什么样但打开 CAD 软件就发怵草图画不溜约束加不对拉伸切除互相打架。text-to-cad 至少能帮他们跨过从零开始这一关先拿到一个能够继续修改的初版模型。第二个痛点是重复劳动。我见过太多人把大量时间花在画标准件、外购件、通用支架这些查手册就能搞定的零件上。这些件往往结构简单、规律明确和装配套图中的位置关系才是真正的难点。如果能把描述性文本直接变成模型这部分重复建模时间能省下大半。第三个痛点藏在协作链条里。销售拿到客户需求转化给工程师时往往只剩一句口头描述加几张照片。工程师对着这句描述猜结构、猜尺寸来回沟通半天。text-to-cad 在这里的角色不是取代工程师而是把模糊文本快速翻译成一个可讨论的几何雏形让双方在同一个三维语境里对齐需求。这是它在真实工作流中最有价值的位置。1.3 text-to-cad不等于text-to-3D别混淆现在市面上有很多文本生成3D模型的工具你用一句话生成一个游戏角色或者一个摆件输出通常是一个 STL 网格文件。这种工具解决的是视觉展示和快速概念问题模型往往不可参数化也没有特征树更谈不上符合机械制图的公差习惯。text-to-cad 的产物目标是工程语义层的模型不仅有外形还有特征顺序、草图约束、尺寸变量。一个生成的法兰盘改一个厚度参数能立刻更新整个模型而不是回炉重造。所以我在下文的实操里会用 CadQuery 这类代码即建模的库来做载体而不是用那些纯生成网格的方案。理解了这条边界你才不会被市面上各种看起来很像的demo误导。2. 核心技术拆解文本描述的语义如何映射成CAD操作2.1 两条技术路线直接生成几何还是生成建模程序当前学术界和工业界做 text-to-cad大体分两条路线。一条是生成离散几何路线用扩散模型或自回归模型直接输出体素、点云、三角网格。这个路线在做 text-to-3D 的团队里很常见。它的优点是视觉效果好连续性好能生成一些非常复杂的不规则曲面缺点是输出结果没有参数化特征没法回到 CAD 软件里改一个圆角半径也没法做精确的布尔运算和尺寸驱动。在工程场景下这东西大概是给老板看效果的级别离给机床加工还差很远。另一条是生成建模程序路线让模型输出一系列 CAD 操作指令比如画一个草图、拉伸、打孔、倒角甚至直接生成 CadQuery、OpenSCAD 这样的建模脚本。这条路线在工程上明显更务实因为结果是参数化的是可编辑的也是可以逐行审查的。当前比较有代表性的研究如 Text2CAD 这类工作本质上是构建了 文本描述到 CAD 命令序列 的映射数据集再去训练或者微调模型而更轻量的做法是直接用大语言模型生成 CadQuery 代码。我自己的实操经验是直接调用大模型生成脚本是现阶段性价比最高的入门方式下面会展开讲。两条路线我做了一个对比对比维度离散几何生成建模程序生成输出形式体素/点云/网格特征树/CAD脚本/命令序列可编辑性差改一个尺寸约等于重新生成好改参数即可更新精确度受限于分辨率难做毫米级公差取决于代码逻辑理论上无限精确下游兼容多数要转网格不适合CAM直接生成STEP/STL流程兼容工程落地成熟度偏早期已具备实用条件我做项目选型时会坚定地站在第二条路线。不是说离散几何没用而是对一个要落进制造流程的 CAD 模型来说不可编辑就是硬伤。2.2 语言里的尺寸和拓扑关系是怎么变成建模指令的一个自然语言句子要变成 CAD 操作序列涉及三层转换。第一层是尺寸抽取。你听到的一句话里可能混着直径半径厚度间距均布贯穿这些词每个词都对应着具体的几何参数。比如直径40毫米在 CadQuery 里写 circle(20)因为 circle 的参数是半径而不是直径——这个坑后面细说。模型必须先把这个词的语义和数值解耦否则后面全是错。第二层是空间关系理解。类似中心一个孔四个角各一个倒角在顶面上挖一个槽这种描述隐含了坐标系、工作平面、特征朝向。CAD 的本质是在正确的面上、正确的参考系下执行正确的操作语言里的方位词必须被映射成 CAD 里的面选择器和位置点。第三层是领域知识补全。如果有人跟你说生成一个带沉头孔的支架你不会指望模型知道沉头孔的标准尺寸和加工余量但一个训练充分的模型应该知道沉头孔是先钻大孔再钻小孔的结构而不是一个直通孔。这层知识很难靠规则穷举往往要靠大模型本身的先验知识或者在提示词里注入行业规范。我在实操中体会很深的点是不要指望模型凭空懂行标你不给足上下文它就在通用常识里胡猜。2.3 为什么代码即建模是当前最可靠的落地姿势我之所以强烈推荐用大模型生成 CadQuery 代码而不是直接生成网格有一个很重要的原因代码是可验证、可追踪的。LLM 生成一坨代码哪怕第一次运行报错报错信息是指向明确的哪怕尺寸不对你可以一行一行看是哪一步写错了。相比之下一个黑盒模型生成一个网格错了你都不知道往哪个方向改。打个比方这就像让你的实习生直接给你交一份画图步骤说明书而不是替你画好一张不能改的成品图。说明书写错了你可以圈出哪一行有问题让他改成品图画错了你只能推倒重来。而且 CAD 脚本天然是一条可复现路径同一个脚本跑一百遍结果一致这在生产环境里价值巨大。所以后面实操都以大模型写 CadQuery 代码为主。它不完美但它给了你一个逐级排查的抓手这对工程师来说是最重要的安全网。3. 实操一把用自然语言驱动CadQuery生成零件3.1 环境准备最小可复现的安装步骤先说一下版本问题。CadQuery 2.x 是目前的主流版本它的安装包很大因为底层要绑定 OpenCascade 建模内核OCP。我建议你用虚拟环境隔离避免和系统里的其他 Python 包冲突。conda create -n cadq python3.10 conda activate cadq pip install cadquery如果你不想装 conda直接用 venv 也可以python -m venv cadq source cadq/bin/activate # Windows 下是 cadq\Scripts\activate pip install cadquery安装完成后先跑一个最小代码验证内核是否正常import cadquery as cq sphere cq.Workplane(XY).sphere(10) print(sphere.val().Volume())如果能看到输出约 4188.79说明建模内核已经能工作了。接下来准备一个能调用大模型的 API 客户端。我用的是最常见的 OpenAI 兼容接口你手头有什么可用的模型都可以关键是要能生成 Python 代码。3.2 提示词设计让大模型输出能直接跑的建模代码大模型写代码这件事下限可以很低上限也可以很高。如果直接丢一句给我建一个法兰盘模型它可能给你一堆不知所云的不完整代码。我的做法是给出一套结构化的提示词模板把角色、约束、输出格式全部钉死。模板如下你是一名 CadQuery 建模专家。请根据下面的需求生成 Python 代码使用 CadQuery 2.x API。 需求{用户文本} 硬性约束 1. 单位一律使用毫米 2. 默认在 XY 平面开始建模拉伸方向为 Z 轴 3. 代码必须能直接运行不要包含解释性文字 4. 所有需要钻孔的操作优先使用 hole() 方法 5. 生成后用 cq.exporters.export() 导出为 STEP 文件你可能会问为什么要把建模专家只输出代码这种约束写进去因为我实测发现如果你不强制约束输出格式大模型会在代码里夹杂大段解释导致你没法直接把输出喂给 Python 执行。还要注意一个技巧我先让模型在思维上列一个建模步骤再生成代码。对于复杂零件可以加一句先按顺序给出建模步骤每步一行然后再给出完整代码。模型先规划特征顺序代码质量会明显提升。3.3 完整示例带孔法兰盘从文本到STEP文件咱们用前面提过的例子输入需求是生成一个直径40毫米、厚度10毫米的圆形法兰中心有一个直径8毫米的通孔在半径15毫米的圆周上均匀分布6个直径5毫米的通孔。我先给你看一份我认为结构清晰的 CadQuery 代码import cadquery as cq result ( cq.Workplane(XY) .circle(20) # 半径20mm外径40mm .extrude(10) # 厚度10mm .faces(Z) # 选中顶面 .workplane() .hole(8) # 中心通孔直径8mm .polarArray(15, 0, 360, 6) # 在半径15mm圆周上均布6个点 .hole(5) # 6个直径5mm安装孔 ) cq.exporters.export(result, flange.step)解释几个关键点。首先是.circle(20)CadQuery 的 circle 接收的是半径所以直径40要写成 20这是最容易翻车的地方。然后是.faces(Z)它的意思是选中实体上法线指向 Z 正方向的面也就是顶面再在这个面上建立工作平面。如果你漏了这一步后续的 hole() 很可能打在实体内部或者方向完全不对。最后是.polarArray(15, 0, 360, 6)它在当前工作平面上创建 6 个均布点紧接着的.hole(5)会在每个点上打一个直径 5mm 的通孔。代码跑完后我用一个快速验证脚本检查体积是否合理。法兰盘理论体积等于外圆柱体积减去中心孔和 6 个安装孔的体积m result.val().Volume() print(f实体体积: {m:.2f} mm^3) # 粗略验证外圆柱 400π*10中心孔 16π*10安装孔 6*6.25π*10 expected 3.141592653589793 * (400 - 16 - 37.5) * 10 print(f理论体积: {expected:.2f} mm^3)如果你跑出来体积对不上大概率是某个孔的直径或者数量写错了。这一步是我在实操中最依赖的快速体检手段比拿肉眼盯着屏幕看渲染图可靠得多。3.4 导出格式怎么选STEP、STL还是DXF模型建好之后导出格式决定了它能被谁用。我的选择逻辑是这样STEP 是首选它是工业级 B-Rep 交换格式能保留精确曲面和拓扑关系能进 SolidWorks、Fusion 360、FreeCAD 做后续编辑和装配。STL 是三角网格适合 3D 打印和部分仿真场景但精度受容差参数影响不能直接做 CAM 精加工。DXF 是 2D 轮廓格式适合激光切割、线切割这种只需要平面轮廓的工艺。CadQuery 导出代码很简单cq.exporters.export(result, flange.step) # 工业交换 cq.exporters.export(result, flange.stl, tolerance0.1) # 3D打印 cq.exporters.export(result, flange.dxf, unitmm) # 2D轮廓这里有个容易忽略的点STEP 文件里可以带单位元数据但不同软件导入时的单位解析逻辑不一定一致。我遇到过导出后导入 SolidWorks 被整体放大 25.4 倍的情况就是因为 STEP 头信息里的单位约定和软件默认设置冲突。所以每次换工具链第一件事是导出一个尺寸已知的测试件确认单位后再大量投产别等画了一堆零件才发现问题。4. 实测中踩过的坑与排查思路4.1 直径和半径的语义陷阱前文提过 circle 接收半径但我实际让模型生成直径40毫米时它确实输出过.circle(40)导致模型直径变成80毫米。这个错的离谱但极常见。后来我在所有提示词里加了一句注意circle 参数是半径hole 参数是直径。加完这一句出错率立刻下降很多。排查这种问题有个小技巧不要信眼睛直接打印模型的包围盒。CadQuery 里有bb result.val().BoundingBox() print(bb.xlen, bb.ylen, bb.zlen)如果输出显示外圆直径接近80那基本就是半径直径搞反了。打印包围盒是成本最低、最快暴露几何尺寸错误的操作我每次生成完必做。4.2 布尔运算失败导致模型不闭合有一种情况特别隐蔽代码跑通了模型体积也算出来了但导入 FreeCAD 后零件内部是破的或者布尔运算后拓扑错误。这通常不是大模型写错而是建模操作本身在几何上产生了非流形边。我的经验是尽量不要让模型一上来就写复杂布尔操作。比如想做带切槽的圆盘先用一个拉伸特征做整体外形再用 hole() 或 cutBlind() 做减法。如果你让模型用多个单独实体做布尔运算比如一个圆柱体减一个长方体再减一个圆柱体出错的概率会指数级上升。如果确实需要复杂特征请把每个特征的代码拆开分步导出中间结果来做检查。还有一种情况是选择器写法不对例如漏掉faces(Z)直接调 hole()导致切割平面选错切割特征落在实体外面实物完全没有孔。这种问题肉眼看不出来必须靠检查孔的数量和体积来兜底。4.3 提示词含糊导致的多义性问题大模型不是人它不会像工程师一样在图纸上标注未注公差你给的描述越含糊它越容易发挥想象力。比如你只说两个洞它不知道这两个洞是多大的、在哪个面上、要不要打通你只说一个小支架它不知道支架的工作姿态是什么。我的处理方法是在提示词里明确要求当需求缺少关键尺寸时先自行设定并在代码注释中标注同时输出你设定的尺寸清单。这样至少模型不会因为缺参数直接在代码里摆烂而且你能看到它自作主张了哪些参数。我最近的项目里就是这么干的否则要反复追问好几轮效率太低。4.4 常见报错速查表直接给你一张排查速查表都是我在实际跑生成代码时遇过的症状可能原因排查思路体积为0或异常小特征被切穿或边界未闭合先去掉所有切割特征检查基体模型直径为预期值的两倍circle() 用了直径语义核对半径/直径打印包围盒hole() 没有产生孔工作平面选在实体内部或外侧检查 faces() 选择器改为Z等导入CAD后整体放大25.4倍STEP单位元数据冲突生成测试件检查导入单位设置报错 No edges found选择的面上没有可用边/草图改用 faces() 明确选顶面/侧面报错 Cannot convert to solid草图轮廓未闭合检查 lineTo/moveTo 路径是否闭合布尔运算后网格破碎非流形几何避免多实体布尔改为单实体顺序特征这里还要特别提一句CadQuery 的报错信息往往比较底层英文术语多新手容易被吓住。但实际上绝大多数报错都指向同一个问题——你选择的参考面或参考边不对。所以排查时的第一反应不应该是我代码写错了而是我有没有在正确的面上做这个操作。5. 能力边界与落地建议5.1 当前做得好与做不好的几何类别我跑了大量零件样例之后给 text-to-cad 的能力边界画了一条比较清晰的线做得好的回转体类零件法兰、轴段、圆盘、垫片、板类零件带孔方板、支架、底板、规则壳体、对称的机加件。这类零件几何规整特征顺序简单提示词里把尺寸说清楚生成成功率非常高。做不好的螺纹件牙型细节难控、钣金展开件需要折弯系数和工艺参数、自由曲面消费电子产品外壳、标准紧固件装配螺栓螺母配合的间隙规则。这些不是大模型不理解语言而是 CAD 建模本身需要大量工艺经验和参数不是一句描述就能覆盖的。你非要用 text-to-cad 生成一个完整的螺纹规格大概率会得到看起来像螺纹但完全不符合规范的模型。5.2 在团队工作流里怎么落地我的建议是别把 text-to-cad 定位成替代建模工程师而是定位成需求转换器和初稿生成器。在一个典型的机械设计团队里可以这样安排客户或销售写一段部件需求文本由 junior 工程师用提示词模板生成 CadQuery 代码跑通并导出 STEP 后再由资深工程师做尺寸复核和特征合理性审查。这个流程里AI 负责把文本变成可讨论的几何人负责判断对错。资深工程师不需要每一版都从头建模Junior 也不需要被从零画草图卡住。最后任何正式发布模型一定要有人工批准这一点在制造领域怎么强调都不过分。5.3 未来方向从听懂一句话到理解完整需求我对 text-to-cad 接下来的演进有几个判断。第一是多模态输入会成为标配文本加草图加照片一起作为描述能大幅消解空间关系歧义。第二是专用数据集和微调模型会逐步替代通用大模型加提示词的临时方案因为工业场景需要稳定可复现的行为。第三是会往需求参数化的方向走也就是系统不只输出一个模型还能输出一组被命名好的设计变量你后续调整尺寸时直接改参数而不是重新生成。这个方向如果走通text-to-cad 就不再是简单的新奇工具而会变成参数化设计流程里的一个前端入口。到那一天工程师花在建立初始几何上的时间会进一步压缩更多精力放到设计权衡和工艺验证上。我现在实际项目里的用法是把它当成一个建模提纲生成器先让它生成一个结构完整的版本再手工微调关键尺寸和特征顺序效率比从零画高出不少。如果你准备入手我特别建议从法兰盘、圆盘、支架这类回转对称零件开始练手这类零件容错率高也最容易建立起对这个工具能力的直觉。等你摸清了它的脾气再逐步挑战带螺纹、带倒角、带复杂布尔特征的模型那时候你心里就会有一条清晰的判断线什么描述它能接住什么描述你还得自己来。
返回列表