ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

大模型生成建模代码:实现可编辑零件分解与参数化3D建模

大模型生成建模代码:实现可编辑零件分解与参数化3D建模 在 3D 建模领域过去两年最热闹的方向是“文本生成 3D 模型”“图片生成 3D 模型”。你输入一句描述模型自动吐出 OBJ 或者 GLB 文件看起来确实很酷。但真正做过设计、做过工程的人拿到这样的模型往往会皱眉头这些 Mesh 模型是一个整体所有顶点、三角面糊在一起没有特征树、没有参数、没有装配关系你根本没办法在 CAD 软件里改一个圆角、移动一个孔位、把某个零件单独拿出来重新设计。换句话说传统 AI 生成 3D 模型解决的只是“能不能出图”的问题没有解决“能不能改”的问题。而工程设计的起点恰恰是修改。最近一批新方案把思路彻底调转了过来不让大模型直接生成几何数据而是让大模型生成建模代码。模型不再是一个不可拆分的 Mesh 文件而是一段可执行、可参数化、可再加再改的程序。本文要讨论的正是这条技术路线——用大模型写代码做高精度 3D 建模并且利用代码结构天然实现“可编辑零件分解”。它会避开传统 AI 生成模型的哪些坑适合哪些场景又怎么在本地环境跑起来下文会逐个讲清楚。1. 这篇文章真正要解决的问题先说一个容易被忽略的事实大模型在 3D 建模这件事上真正擅长的是生成有逻辑结构的内容而不是直接生成几何数据。直接生成 3D 模型为什么难因为 3D 数据本质上不是“像素网格”而是包含了拓扑关系、曲面方程、装配约束的复杂结构。一个简单的机械零件在 CAD 软件里可能对应几十个特征操作拉伸、切除、倒角、打孔、阵列。这些操作之间还有先后依赖。指望大模型通过概率分布直接预测出所有顶点坐标和面片索引然后还要求这些结果符合工业级精度这在当前算力下几乎不可能。所以新的思路是“绕过几何直接走代码”。把建模过程拆成一条代码流水线大模型负责根据你的自然语言描述生成一段程序化建模代码。运行这段代码3D 模型就自动构建出来。因为代码本身就是结构化描述每个零件、每个特征都可以对应到代码里的一个函数、一个类、一个参数。这就带来了传统生成模型不具备的核心能力可编辑性。这篇文章想解决三类读者的具体痛点结构设计师和机械工程师想用 AI 辅助生成零件草图、快速验证设计方案但接受不了不可编辑的黑盒模型。3D 建模初学者想通过自然语言快速搭出模型雏形又希望最终能完全掌控模型结构。图形学/软件开发从业者想搞清楚“大模型 代码生成 3D 程序化建模”这条技术路线的原理、边界和落地方式。读完这篇文章你能理解大模型生成建模代码的完整流程能在本地跑通一个带零件装配和分解导出的最小示例还能避开最常见的几个坑。2. 核心概念程序化建模与可编辑零件分解2.1 什么是程序化建模程序化建模Procedural Modeling是一种通过代码和规则来构建 3D 模型的建模方式。它不直接拖拽操作几何体而是定义一组参数、约束和操作步骤让程序自动计算出最终模型。传统 CAD 软件里类似的操作方式叫“参数化建模”你画一个矩形标注尺寸 50 × 30再执行拉伸命令生成一个高度为 10 的方块然后修改其中一个尺寸模型会自动更新。程序化建模把这一套流程完全代码化所以模型的可复现性、可修改性和可追溯性都非常强。常见的程序化建模工具包括工具/库语言特点典型用途OpenSCAD类 C 语言纯脚本建模语法简单适合逻辑推导机械零件、参数化原型CadQueryPython基于构建顺序叠加操作链可导出 STEP 等 CAD 格式机械设计、工程零件、3D 打印Blender Python API (bpy)Python与 Blender 界面深度集成支持网格、材质、动画影视资产、可视化、游戏模型FreeCAD Python APIPython开源参数化 CAD支持完整特征树工业级参数化建模2.2 什么是“可编辑零件分解”“可编辑零件分解”拆开看是两层含义。第一层是零件级的代码分离。一个由多个零件组成的装配体在代码层面不是一个大文件而是每一个零件都有自己独立的函数或类。比如一个轴座模型底座是一个类轴承套是一个类加强筋是一个类。每个类有自己的参数接口改底座厚度不会影响轴承套。第二层是空间级的装配与爆炸。所有零件通过装配操作组合在一起但随时可以按零件名拆开导出生成爆炸视图或独立零件文件。改动任何一个零件后重新执行装配代码其他零件的位置和配合关系自动更新。这种能力在传统 AI 生成模型中完全不存在。Traditional 文本转 3D 生成模型输出的 Mesh 数据是一个整体要拆零件必须手工在 Blender 里套索选中、分离、重新拓扑几十分钟起步而且拆完基本没法继续参数化修改。2.3 大模型在此处的角色大模型在整个流程里扮演的是“自然语言转建模代码的编译器”。你输入“生成一个底板长 80 毫米宽 50 毫米厚度 8 毫米四角有安装孔”大模型负责把这段话翻译成 CadQuery 代码。人类工程师负责审核、调整参数、补充约束。大模型不直接建模它写代码代码才是建模的唯一事实来源。这种做法还有一个额外收益因为代码通常不错误运行失败会直接报错你不需要“目测”模型对不对。从工程可靠性来看这比直接生成一个看起来像模像样、但内部拓扑可能已经崩坏的 Mesh 文件要靠谱得多。3. 技术路线对比为什么代码生成比端到端生成更适合工程对比维度端到端生成 3D文本/图片 → Mesh大模型生成建模代码文本 → 程序化建模代码输出形式三角网格 OBJ/GLBPython 代码 STEP/STL 几何体可编辑性差Mesh 是整体拆零件靠手动强零件对应函数/类改参数即改模型精确度几何精度不稳定容易有拓扑错误受限于程序化建模库的精度理论上可达工业 CAD 精度修改成本修改后需重新生成原模型作废直接改代码参数重跑一遍即可可追溯性很难知道模型怎么来的每一次生成对应明确的构建逻辑适合场景概念展示、游戏场景、视觉预览机械设计、3D 打印、工程验证、可复用零件库当然端到端生成也不是完全没有优势它天然适合“说不出具体参数、只想要个氛围”的场景比如生成一棵风格化树木、一只怪兽、一片地形。这类模型本身没有严格几何约束Mesh 输出完全够用。但工程场景是另一套标准。CAD 图纸要求孔位公差、壁厚均匀、装配间隙合理这些都是可以用数字描述、可以用代码表达的信息。如果大模型能产出精确可控的代码建模流程那么“比传统生成方法效果更好”就不是营销话术而是事实。4. 环境准备与前置条件下面的示例以 Python 为主因为 Python 生态最完整CadQuery 的 API 也最适合解释“零件分解”的思路。4.1 环境清单依赖项说明Python 3.9CadQuery 对 Python 版本有要求建议用版本较新的稳定版CadQuery程序化建模核心库支持导出 STEP、STL、SVG 等格式大模型服务可以使用主流大模型的 API也可以本地部署开源模型本文示例直接把提示词发给模型即可不要求特定厂商3D 查看器推荐用 CadQuery 内置的 CQ-editor 或把 STEP 文件导入 FreeCAD 查看具体版本号建议以官方文档为准这里不写死。核心思路是先用 pip 安装 CadQuery然后准备一个能跑大模型代码的环境。4.2 安装 CadQuerypip install cadquery安装完成后验证python -c import cadquery; print(cadquery.__version__)如果输出正常环境就基本可用了。4.3 准备大模型调用方式本篇文章重点不在某个具体模型的使用上因此这里不绑定具体平台。你可以用自己的 API Key 调用云端大模型也可以用本地部署的开源模型。关键是让模型理解一个稳定的“任务模板”我们在第 5 节里会给出完整提示词。5. 核心流程拆解从自然语言到可编辑零件把“用大模型写代码做 3D 建模”这件事拆开典型流程包含以下五个步骤。5.1 定义模型需求和参数最容易被忽略也最决定最终质量的步骤。生成几何之前必须想清楚以下信息整体轮廓这是一个板、一个轴、还是一个壳体关键尺寸长宽高、直径、厚度、孔距。特征操作有哪些孔、倒角、阵列、加强筋。零件边界哪几个部分将来要独立修改这决定代码里的类或函数怎么划分。假设我们要做的是一个“带安装孔的定位底板”完整需求可以写成生成一个 CadQuery 代码创建一个定位底板。底板长 80宽 50高 8。底板中心有一个直径 20 的通孔。四角各有 4 个直径 9 的安装孔孔心距底板边缘 10 毫米。所有棱边倒角 1 毫米。导出为 STEP 文件。5.2 把需求转换为提示词把上面这段需求整理成结构化的提示词明确要求大模型输出 CadQuery 代码。提示词里应包含建模库、单位毫米名称关键尺寸特征操作描述输出格式示例提示词请用 CadQuery 库生成 Python 代码创建以下零件 1. 底板长 80mm宽 50mm高 8mm 2. 中心通孔直径 20mm贯穿整块底板 3. 四个安装孔直径 9mm孔心距边缘 10mm对称分布 4. 棱边倒角所有顶面和底面的棱边倒角 1mm 要求 - 代码使用 build 的顺序写法每个特征步骤有注释 - 参数用变量定义在文件开头 - 导出为 STEP 文件文件名为 base_plate.step5.3 大模型生成建模代码这一步没什么魔法把提示词发给大模型拿到 Python 代码。需要注意的是大模型生成的代码不一定一次通过可能需要根据报错信息多次迭代。这也是这种方式的优势报错信息非常具体能指导你精确定位问题。5.4 本地运行代码生成 3D 模型把模型返回的代码保存为base_plate_gen.py在本地执行。如果语法或 API 调用有误会直接看到 Traceback根据报错修复即可。5.5 验证、修改与零件分解生成 STEP 文件后用 CAD 软件打开确认尺寸和特征符合预期。如果孔位偏了直接改代码里的hole_spacing参数重跑文件不需要重新向大模型发起请求。下面两节用完整示例把整个流程串起来。6. 完整示例与代码实现6.1 最小示例参数化带孔底板文件路径demo_plate.pyimport cadquery as cq # 参数区所有可调尺寸集中在这里 length 80.0 width 50.0 thickness 8.0 center_hole_diameter 20.0 mount_hole_diameter 9.0 hole_margin 10.0 chamfer_size 1.0 # 构建底板 result ( cq.Workplane(XY) .box(length, width, thickness) .faces(Z) .workplane() .hole(center_hole_diameter) ) # 在四角添加安装孔 result ( result.faces(Z) .workplane() .rect( length - 2 * hole_margin, width - 2 * hole_margin, forConstructionTrue ) .vertices() .hole(mount_hole_diameter) ) # 棱边倒角 result result.edges(%CIRCLE).chamfer(chamfer_size) # 导出 STEP 文件 cq.exporters.export(result, base_plate.step) print(生成成功base_plate.step)代码逻辑解释.box(...)创建长方体长宽高都来自参数区。.faces(Z)选中顶面在顶面上执行特征操作。.hole(center_hole_diameter)生成中心通孔。forConstructionTrue表示在矩形四个顶点处定位安装孔。%CIRCLE是一个标签选择器表示“圆边”用于倒角操作。修改参数区的数值再运行模型会直接更新这就是“可编辑”在代码层面的意思。6.2 大模型生成多个零件轴支座装配示例场景升级我们需要一个轴支座包含底座和立柱两个零件并且要保留独立的零件结构。文件路径demo_assembly.pyimport cadquery as cq # ---------- 零件 1底座 ---------- def make_base(): base ( cq.Workplane(XY) .box(60.0, 40.0, 10.0) .faces(Z) .workplane() .hole(12.0) ) base ( base.faces(Z) .workplane() .rect(40.0, 20.0, forConstructionTrue) .vertices() .hole(5.0) ) return base # ---------- 零件 2立柱 ---------- def make_column(): column ( cq.Workplane(XY) .circle(10.0) .extrude(45.0) ) return column # ---------- 装配 ---------- base_part make_base() column_part make_column() assembly cq.Assembly() assembly.add(base_part, namebase, colorcq.Color(gray)) assembly.add(column_part, namecolumn, loccq.Location((0, 0, 5)), colorcq.Color(blue)) # 导出完整装配体 assembly.save(demo_assembly.step) print(装配体导出成功demo_assembly.step) # ---------- 零件分解导出 ---------- cq.exporters.export(make_base(), exploded_base.step) cq.exporters.export(make_column().translate((20, 20, 0)), exploded_column.step) print(分解视图导出成功)这段代码的关键是“每个零件一个函数”修改零件时只要改对应的make_base()或make_column()不会影响其他零件。装配关系单独定义在assembly.add()中通过loc指定每个零件的位置偏移。需要特别说明的是CadQuery 的Assembly在保存 STEP 时会把所有零件以装配层级写入同一个文件在 FreeCAD 等软件里打开时可以看到零件树。导出分解视图时我们给立柱人为加了一个平移偏移这只是为了视觉上展示分解效果实际工程中一般不会给几何体本身加偏移而是通过装配坐标控制。6.3 大模型提示词模板让模型生成多零件代码上面的代码是我手动写的示例。用大模型做同样的事提示词可以这样写请用 CadQuery 生成 Python 代码创建一个轴支座装配体包含两个零件 零件 1底座 - 底面贴合 XY 平面 - 长 60mm宽 40mm高 10mm - 中心孔径 12mm通孔 - 四角对称分布 4 个孔径 5mm 的安装孔 零件 2立柱 - 在底座中心上表面向上拉伸高度 45mm - 截面为直径 20mm 的圆 要求 - 每个零件用独立的函数封装 - 函数放在文件开头 - 使用 cq.Assembly 完成装配 - 立柱底面位于底座上表面即 Z10 位置 - 导出完整装配体 STEP 和分解视图 STEP把这段提示词直接发给模型大概率能拿到可运行的代码。如果报错把报错信息原样贴给模型让它修正。6.4 让大模型修改模型可编辑性的真正体现假设你拿到一个生成的轴支座现在希望把立柱改成方形截面。传统做法是回到 CAD 软件里重新建模或者重新向 AI 生成请求一次。有了代码生成式建模你可以直接对代码说把 make_column 函数的截面从圆形改为边长 18mm 的正方形 其他零件和装配关系保持不变。大模型返回修改后的make_column函数def make_column(): column ( cq.Workplane(XY) .rect(18.0, 18.0) .extrude(45.0) ) return column这种“局部修改、全局保持”的能力是 Mesh 生成模型无法做到的。7. 运行结果与效果验证运行上面任意一个脚本都会在当前目录生成 STEP 文件。用 FreeCAD 或任意 CAD 浏览器打开打开demo_assembly.step左侧模型树里能看到base和column两个子装配节点。打开exploded_base.step、exploded_column.step能看到独立零件。如果需要在 3D 打印场景使用把 STEP 转成 STL 即可python -c import cadquery as cq result cq.importers.importStep(base_plate.step) cq.exporters.export(result, base_plate.stl) 验证成功的标准有三个代码无报错运行完毕。STEP 文件能正常打开没有破面。所有尺寸符合预期装配位置正确。如果失败优先检查 Python Traceback 的最后几行大多数问题出在 API 调用名称或参数类型上。8. 常见问题与排查思路问题现象可能原因排查方式解决方案运行时报错AttributeError: Workplane object has no attribute holeCadQuery 版本过低或 API 拼写错误查看当前 CadQuery 版本和官方文档升级到最新版确认方法名正确生成的 STEP 文件导入软件后尺寸不对单位混淆CadQuery 默认单位是毫米对比实际测量值在代码中显式统一所有尺寸单位多个零件装配时位置偏移异常loc参数理解有误坐标系没对齐检查基础平面和坐标原点定义在装配前单独导出零件确认每个零件的基准坐标倒角/圆角操作影响了其他特征特征操作顺序不对先倒角后打孔导致边界变化重新排列代码顺序把倒角放在最后一步大模型生成的代码运行报错模型使用了旧版 API 或不存在的函数把报错信息喂回给模型让模型根据错误信息修正同时要求它标注依赖版本导出 STL 时精度不够圆柱变成多边形STL 导出分辨率参数太低检查导出配置在 CadQuery 中使用更高精度的弦高设置排查的通用原则是不要把“模型生成结果异常”当作黑盒问题要把代码执行过程拆成“语法错误、API 错误、几何逻辑错误、导出配置错误”四类按顺序排查。9. 最佳实践与工程建议9.1 把参数写进文件开头的“参数区”所有尺寸都应在代码开头集中定义并给每个参数加注释。这看起来很简单但在实际项目中价值巨大。客户改一次孔径你只需要改一个数字不用搜遍整个文件找硬编码。这也方便大模型理解代码结构只要告诉它“参数区第一行的 length 改成 100”它就能精准定位。9.2 每个零件一个函数每个装配体一个文件建议文件结构如下models/ ├── base_plate.py # 单零件 ├── bearing_assembly.py # 多零件装配体 ├── params.py # 公共参数配置 └── output/ ├── step/ # STEP 文件输出目录 └── stl/ # 3D 打印文件输出目录当零件数量变多时每个零件应该独立成.py文件由装配脚本统一导入# 装配脚本示例 from parts import make_base, make_column, make_bracket assembly.add(make_base(), namebase) assembly.add(make_column(), namecolumn) assembly.add(make_bracket(), namebracket)这样既保留了代码的可读性也为后面做参数联动、自动装配留了空间。9.3 提示词要写清楚“可修改的需求”向大模型提问时不要把需求写成一锤子买卖。有效方式是给出参数列表让模型生成的代码天然支持后续修改以下尺寸都是变量请在代码开头定义 底板长度 length默认 80 安装孔直径 hole_diameter默认 9 孔边距 margin默认 10这样即使你对 AI 生成的结果不满意也不需要从头再来。9.4 用版本管理工具管理建模代码STEP 文件是二进制Git diff 基本没法看。但.py代码文件是文本Git 能清楚显示每次改动。建议把生成的代码纳入 Git 管理重点记录每次“几何修改”和“参数变更”的提交信息。对于工程团队来说这种工作方式还有一个隐藏收益模型设计不再是某个人的“操作记忆”而是团队都能审阅的代码资产设计评审可以直接 review 代码。9.5 风险提示生成式建模代码仍需人工审核大模型生成代码时可能出现“看起来合理但实际违反工程常识”的情况。比如某个孔位与另一零件的螺栓干涉、壁厚过薄导致强度不足这类物理层面的判断大模型目前很难独立完成。建议所有 AI 生成的模型在进入加工或 3D 打印前必须由有经验的工程师做一遍结构审核。10. 总结与后续学习方向代码生成式 3D 建模真正改变的不是“建模速度”这一个指标而是改变了模型的表示形态。从不可拆分的 Mesh 变成可读可改的代码这意味着设计过程不再是一个不可逆的黑盒。大模型负责把自然语言翻译成建模脚本工程师负责审核、修改和判断这种协作方式比“让 AI 直接吐出最终模型”更符合实际工程流程。如果你准备自己动手尝试建议按这个顺序学习先把 CadQuery 基础 API 过一遍理解Workplane、box、extrude、hole、chamfer这几个核心操作。用大模型生成一个单零件模型完全跑通“提示词 → 代码 → STEP → 3D 预览”链路。再尝试多零件装配体给每个零件单独写函数体验“零件分解 参数联动”的协作方式。最后把建模代码纳入版本管理形成自己的参数化零件库。下一步值得深入的方向包括用 CadQuery 配合约束求解器做自动装配、把生成的代码接入 Web 端实时预览、以及结合本地大模型实现私有化部署。技术路线已经打开剩下的就是动手把第一个示例跑起来。建议先从一个最简单的底板开始你会在生成代码的那一刻直观理解“为什么可编辑性比一次性渲染更重要”。
返回列表