
在 CAD 建模领域CATIA V5 仍然是汽车、航空等高端制造业的主力工具但它也是出了名的“强而不服管”。传统宏脚本能解决重复性任务却难以适应需求变化用户随口说一句“把底座加长 30 毫米四周再倒个圆角”写死的脚本根本听不懂。最近我在一个原型验证项目中将 AI Agent 接到 CATIA V5 的二次开发接口上尝试用自然语言直接驱动参数化模型完成自动建模、设计改型和特征添加。整个过程不需要手动开草图、拉曲面、改约束Agent 会把用户需求拆解成建模步骤并调用 CATIA 底层 API 执行。这篇文章会围绕这套实测方案展开先讲清楚 AI Agent 与 CATIA V5 自动化之间的原理关系再给出环境准备、架构设计、完整代码示例以及我在实测过程中遇到的问题和规避方法。适合三类读者正在做 CATIA 二次开发的工程师、想用 AI 提升设计效率的产品研发人员以及准备在自己工具链里接入大模型 Agent 的开发者。1. 背景与核心概念1.1 CATIA V5 建模自动化的痛点CATIA V5 的功能强大建模能力覆盖零件设计、曲面设计、装配设计、工程制图等多个模块。但在实际业务中它留给开发者的自动化空间并不算友好很多重复建模工作必须靠人工点击完成效率低且容易疲劳。传统宏脚本只能解决“参数固定、流程固定”的场景遇到需求变化就要改脚本。知识工程模块参数、公式、规则、设计表能力很强但普通设计师很难系统使用。零件模型如果不做参数化后续改型几乎等于重画。换句话说CATIA V5 的底层能力并不缺缺的是一个能“理解需求、自动拆解、按步骤执行”的上层调度者。这正是 AI Agent 能补上的一块短板。1.2 什么是 AI AgentAI Agent 可以理解成一个具备“感知、决策、执行”能力的智能体。它不只是像大模型那样回答你一句话而是能围绕一个目标自动拆解任务、选择工具、调用接口并根据执行结果调整下一步动作。在 CATIA V5 自动化场景中三者分工大致如下角色作用举例大模型理解自然语言输出结构化建模参数“生成一个 120×60×30 的底座” → JSON 参数小模型处理几何识别、特征分类等局部任务识别当前模型中的边、面、孔AI Agent编排任务、调用 CATIA API、处理异常先建草图再拉伸再倒角最后更新模型这和传统宏脚本的本质区别在于宏脚本是“写死步骤”AI Agent 是“根据目标现场生成步骤”所以它能更好地应对改型、添加特征这类需求不固定的场景。1.3 AI 驱动建模的应用场景从实际项目来看以下几类任务最适合优先引入 AI Agent系列化零件生成支架、底座、法兰、接头等结构相近但尺寸不同的零件。标准特征添加批量打孔、倒角、倒圆、阵列。设计改型基于已有模型通过自然语言调整关键尺寸。设计评审辅助快速生成多个参数方案供评审对比。老模型参数化改造AI 辅助识别历史模型中的几何特征并重建参数约束。这些场景的共同点是重复度高、规则明确、数值变化频繁非常适合用 Agent 自动完成。2. 环境准备与版本说明2.1 软件与系统环境本文的实测环境基于 Windows 平台CATIA V5 使用的是常规安装版本。需要特别说明的是CATIA V5 的自动化接口在不同版本之间有差异文中代码是“核心思路 常见写法”实际部署时务必以你本机的版本和对象模型为准。基础环境清单如下操作系统Windows 10/11CATIA V5需安装完整授权并启用宏自动化能力自动化方式CATScript / VBA 宏、pycatia 或 win32com知识工程模块参数、公式、规则、设计表Python 3.8 及以上大模型接口商业 API 或本地部署模型均可2.2 AI 环境准备AI Agent 部分需要准备一个能输出结构化 JSON 的大模型接口用于把中文需求转换成建模参数。Python 的requests或openaiSDK 用于调用模型。如果需要在本地离线运行也可以部署开源模型但推理速度和稳定性需要自行测试。建议准备 JSON Schema 用于校验模型输出避免幻数。什么版本的大模型合适答案是“够用就行”。因为 CATIA 自动化任务对模型的要求集中在意图理解和参数提取上不要求模型会三维建模。模型只要能把“长 120、宽 60、高 30”正确解析成数值任务就成功了一半。2.3 示例项目结构一个最小的原型项目可以这样组织catia-ai-agent/ ├── agent/ │ ├── planner.py # Agent 主调度逻辑 │ ├── tool_registry.py # CATIA 工具注册表 │ └── prompts/ │ └── modeling_system.txt # 建模助手系统提示词 ├── catia_bridge/ │ ├── catia_client.py # CATIA 连接与宏调用封装 │ └── macros/ │ └── CreateBasePlate.CATScript ├── features/ │ ├── parameter_schema.json # 建模参数协议 │ └── feature_templates/ # 特征模板目录 └── tests/ └── test_flow.py # 流程验证脚本项目结构不需要一上来就做得很重关键是让“AI 语义解析”和“CATIA 底层操作”两个部分隔离。语义解析层改动频繁CATIA 操作层相对稳定两者通过 JSON 参数协议交互后续扩展新特征时会方便很多。3. AI Agent 驱动 CATIA 建模的原理拆解3.1 从自然语言到建模参数AI Agent 干活的第一步是把用户的中文描述转换成机器可读的结构化参数。这一步我通常称为“意图到参数的映射”。例如用户输入生成一个底座零件长 120宽 60高 30底部四个角各打一个直径 8 的贯通孔四周倒圆角 5。Agent 的目标是输出这样一份 JSON{ part_name: BasePlate, base_length_mm: 120, base_width_mm: 60, base_height_mm: 30, holes: [ { center_x_mm: 10, center_y_mm: 10, diameter_mm: 8, through: true }, { center_x_mm: 110, center_y_mm: 10, diameter_mm: 8, through: true }, { center_x_mm: 10, center_y_mm: 50, diameter_mm: 8, through: true }, { center_x_mm: 110, center_y_mm: 50, diameter_mm: 8, through: true } ], fillet_radius_mm: 5.0 }为了让模型稳定输出这种格式需要设计一段严格的系统提示词。你是一个 CATIA V5 自动化建模助手。用户会用中文描述一个三维零件需求。 你需要输出一个合法 JSON 对象字段含义如下 - part_name: 零件名称 - base_length_mm: 底座长度毫米 - base_width_mm: 底座宽度毫米 - base_height_mm: 底座高度毫米 - holes: 孔位列表每个孔包含 center_x_mm、center_y_mm、diameter_mm、through - fillet_radius_mm: 圆角半径不需要圆角时填 0 注意 1. 只输出 JSON不要输出多余文字、注释或 Markdown 代码块。 2. 所有数值必须为正数单位统一为毫米。 3. 如果用户没有提供圆角半径默认填 0。 4. 孔位坐标以底座左下角为原点单位毫米。这里的关键点是“用协议约束自由表达”。自然语言是无限的但建模参数是有限的Agent 的核心工作就是把无限表达折叠到有限参数空间里。3.2 特征提取、特征适配与跨层特征复用很多做 AI 建模的开发者会忽略一个事实三维模型不是一张图而是由多级特征组成的树状结构。在 CATIA V5 中一个零件的特征层级大致如下Part ├── Parameters参数 ├── Bodies │ └── PartBody │ ├── Sketch.1草图特征 │ ├── Pad.1拉伸特征 │ ├── Hole.1孔特征 │ └── EdgeFillet.1倒圆特征 └── Formulas公式Agent 要让模型“听得懂话”必须对这几层特征做适配特征提取从用户描述中找出“长宽高、孔径、圆角半径”等关键建模要素。特征适配把 AI 输出的参数与 CATIA 实际参数名对应。例如用户说“长度”模型里参数名可能叫base_length也可能是PartBody\Pad.1\FirstLimit\Length需要建立映射表。跨层特征复用草图特征、实体特征、参数约束是三层信息。例如修改base_length不仅要更新拉伸特征还要同步更新草图里直线的长度约束以及孔位坐标公式。没有复用好这些层级关系改型时就会出现“模型更新失败”或“孔位不跟随”的问题。几何特征估计用户说“四个角打孔”模型需要根据底座尺寸自动推断孔中心坐标这属于典型的几何特征估计。从工程角度看建议把特征适配表单独维护成一个 JSON 或 YAML 文件Agent 每次执行前先加载这张表而不是把映射关系硬编码在代码里。3.3 工具调用与 API 封装AI Agent 的执行层本质上是把 CATIA 自动化能力封装成一个个“工具函数”。Agent 根据任务内容动态选择工具而不是按固定顺序执行。一个最小工具注册表如下# agent/tool_registry.py TOOLS { create_pad: { description: 新建一个参数化拉伸底座, params: [part_name, length, width, height] }, modify_parameter: { description: 修改现有零件的某个参数, params: [part_name, parameter_name, new_value] }, add_hole: { description: 在指定位置添加孔特征, params: [part_name, pos_x, pos_y, diameter, through] }, add_fillet: { description: 在指定边添加圆角, params: [part_name, edge_id, radius] } }Agent 的执行流程可以概括为用户输入任务。大模型理解意图输出结构化参数。Agent 根据参数选择工具。调用 CATIA 桥接层执行宏或 API。获取执行结果判断是否成功。如果失败记录日志并把错误信息反馈给大模型让其重新调整计划。这就是大模型应用里常见的 ReAct 思路先思考Think再行动Act观察结果Observe循环直到任务完成。3.4 为什么参数化是 AI 建模的前提实测下来最深的感受是AI Agent 再聪明也救不了非参数化模型。如果 CATIA 模型里的尺寸是“画死”的没有命名参数、没有公式、没有约束Agent 就没有可操纵的抓手只能通过几何识别去强行编辑精度和稳定性都很差。所以做 AI 全自动建模第一步永远是规范建模习惯关键尺寸必须用参数表管理例如base_length、base_width、base_height。草图约束要完整不要留过约束或欠约束。特征命名要规范方便 Agent 定位。改型频繁的模型建议增加设计表或公式。用一句话总结CATIA 的自动化接口决定了 AI 能不能操作模型知识工程和参数化决定了 AI 能不能稳定地操作模型。4. 实测AI 自动生成参数化底座下面进入实测环节。我们以一个最简单的底座零件为例完整演示一次 AI 全自动建模。4.1 创建参数化零件CATIA V5 支持通过 CATScript/VBA 宏方式创建零件和特征。下面的脚本是核心片段演示如何新建一个零件、创建草图并拉伸成实体。 文件路径catia_bridge/macros/CreateBasePlate.CATScript 说明核心片段实际使用时需要根据 CATIA 版本和零件模板调整。 更稳妥的做法是先打开一个带参数的模板零件然后只修改参数减少特征创建的不确定性。 Option Explicit Sub CATMain() Dim documents1 As Documents Set documents1 CATIA.Documents Dim partDocument1 As PartDocument Set partDocument1 documents1.Add(Part) Dim part1 As Part Set part1 partDocument1.Part Dim bodies1 As Bodies Set bodies1 part1.Bodies Dim body1 As Body Set body1 bodies1.Item(PartBody) Dim sketches1 As Sketches Set sketches1 body1.Sketches Dim originElements1 As OriginElements Set originElements1 part1.OriginElements Dim refXY As Reference Set refXY originElements1.PlaneXY Dim sketch1 As Sketch Set sketch1 sketches1.Add(refXY) Dim factory2D1 As Factory2D Set factory2D1 sketch1.Factory2D 在这里根据外部参数文件读取 L、W然后绘制矩形草图 常见做法先用 Factory2D 创建四条直线再添加 Coincidence 约束 由于不同版本 API 名称有差异这里不写死每一条调用 sketch1.CloseEdition 创建拉伸特征 Dim pad1 As Pad Set pad1 body1.Shapes.AddNewPadFromRef(sketch1, 30#) part1.Update End Sub这个脚本里没有把 30 写成最终高度而是示意性的 30#。实际项目中更推荐的做法是从外部 JSON 参数文件读取数值这样 AI Agent 只需要改 JSON不需要改宏代码。4.2 编写 Agent 调度逻辑Python 侧负责调用大模型并解析 JSON然后传递给 CATIA 执行器。# agent/planner.py import json from pathlib import Path def llm_parse_to_json(user_text: str, llm_fn) - dict: 调用大模型返回结构化建模参数。 llm_fn 可以是 openai SDK、requests 或本地模型封装。 system_prompt Path(agent/prompts/modeling_system.txt).read_text(encodingutf-8) raw_response llm_fn(systemsystem_prompt, useruser_text) return json.loads(raw_response) def validate_params(params: dict) - None: 参数校验防止模型幻觉导致非法数值进入 CATIA。 assert params[base_length_mm] 0, 长度必须为正数 assert params[base_width_mm] 0, 宽度必须为正数 assert params[base_height_mm] 0, 高度必须为正数 for hole in params.get(holes, []): assert hole[diameter_mm] 0, 孔径必须为正数 assert hole[center_x_mm] 0, 孔位坐标不能为负 def run_modeling_task(user_text: str, llm_fn, catia_bridge) - dict: params llm_parse_to_json(user_text, llm_fn) validate_params(params) result catia_bridge.create_pad(params) return result我把参数校验单独抽出来是因为大模型在数值上仍会出现幻觉比如把“孔径 8”解析成 80或者把负值传给 CATIA。这类错误如果在 Python 侧拦截成本最低。4.3 执行与验证实际执行时Agent 调度流程如下用户输入需求文本。大模型返回 JSON 参数。Python 执行参数校验。桥接层调用 CATIA 宏或 COM 接口。CATIA 中生成零件。通过 CATIA 的测量 API 回读长宽高与目标值对比。预期结果是在 CATIA 的特征树中看到PartBody ├── Sketch.1 └── Pad.1如果宏正确执行Pad.1 的长度应为 120mm、宽度 60mm、高度 30mm。验证时可以直接用 CATIA 的测量工具也可以让 Python 通过 COM 接口读取Pad.1的几何尺寸再自动断言。整套流程在我本机测试中大约耗时 3 到 8 秒主要时间花在 CATIA 的宏执行和模型更新上大模型解析基本在 1 秒内完成。5. 实测自然语言驱动一键改型零件建模完成之后改型是更常见的需求。AI Agent 改型的基本思路是先让大模型把“用户改什么”映射成“模型中的哪个参数应该变成多少”再调用 CATIA 参数修改接口完成更新。5.1 改型的本质改型不是“重新画一遍模型”而是修改参数并刷新模型。但在实际项目中最大的难点是参数名定位。比如用户说“把底座加长到 150”模型里可能有两个长度参数PartBody\Sketch.1\Length是草图长度约束。PartBody\Pad.1\FirstLimit\Length是拉伸长度。如果只改其中一个模型可能不更新或者更新后几何关系错乱。这就是前面提到的特征适配问题不同的几何层级之间存在跨层特征依赖必须同步更新。5.2 参数修改的核心代码在 Python 侧可以通过 COM 或 pycatia 方式连接本机 CATIA示例思路如下# catia_bridge/catia_client.py 通过 COM 连接本机 CATIA 的示例。 不同操作系统、不同版本的 pycatia 或 win32com 调用方式会有差异 这里展示的是核心调用思路请结合实际库进行调整。 class CatiaClient: def __init__(self): try: import win32com.client self.app win32com.client.Dispatch(CATIA.Application) except Exception as e: raise RuntimeError(f无法连接 CATIA{e}) def open_document(self, path: str): self.app.Documents.Open(path) def modify_parameter(self, param_name: str, new_value: float): 修改当前零件参数。 实际参数对象查找方式需根据 CATIA 版本调整。 doc self.app.ActiveDocument part doc.Part params part.Parameters param params.Item(param_name) param.Value new_value part.Update()在 CATScript 宏里核心逻辑同样简单 修改参数的宏片段 Dim oPart As Part Set oPart CATIA.ActiveDocument.Part Dim oParams As Parameters Set oParams oPart.Parameters Dim oParam As Parameter Set oParam oParams.Item(base_length) oParam.Value 150 oPart.Update这里需要注意params.Item(base_length)能否直接找到参数取决于参数在知识工程中是否被重命名。如果建模时沿用默认名称参数名通常是PartBody\Pad.1\FirstLimit\Length这种长路径Agent 很难准确匹配。因此我在实测中强烈建议所有关键参数在建模阶段就重命名为业务名称。5.3 改型实测结果我让 Agent 执行了这样一条指令把底座长度从 120 改成 150其他保持不变。Agent 的处理过程是识别目标零件和参数名。在参数映射表中找到base_length。调用modify_parameter修改数值。调用part.Update()刷新模型。读取参数值验证。最终结果符合预期模型长度变为 150mm且四个角孔的位置也跟随底座轮廓同步变化因为孔位坐标是通过公式关联到底座尺寸的。这也说明了“跨层特征复用”的重要性如果孔位坐标是硬编码的绝对位置改型时孔位就会错乱。6. 实测一键添加特征6.1 特征添加的通用流程“一键添加特征”是 AI 全自动建模里最有代表性的场景。它的流程如下用户描述特征需求例如“给四周边倒圆角 5”。大模型输出特征类型、特征参数。Agent 判断该特征需要作用在哪些几何对象上。通过 CATIA API 选中目标边或面。执行特征添加。更新并验证模型。添加特征比改型更复杂的地方在于一定要先解决“目标选边”问题。CATIA 中的边、面对象有内部标识如果直接让 Agent 猜边的编号极容易失败。更稳定的做法是让 CATIA 宏通过几何条件筛选边例如“所有与顶面相邻的竖直边”然后批量添加圆角。6.2 添加圆角特征的示例思路 添加圆角特征的宏片段示例思路 不同 CATIA 版本对 Edge Fillet 的 API 名称有差异这里重点展示流程 1. 获取目标边或面 2. 调用倒圆 API 3. 设置半径 4. Update Dim oBody As Body Set oBody CATIA.ActiveDocument.Part.Bodies.Item(PartBody) 假设已经通过选择或几何筛选拿到了目标边集合 edgeRef Dim oFillet As EdgeFillet Set oFillet oBody.Shapes.AddNewEdgeFilletFromRef(edgeRef, 5.0) CATIA.ActiveDocument.Part.Update在实际项目中我不建议把选边逻辑写死在宏里。更好的做法是先用 Python/COM 遍历模型中的边。根据边的几何特征长度、方向、相邻面法向量筛选出目标边。把选中的边 ID 传给宏。再由宏执行倒圆。这一步可以考虑引入小模型做几何特征识别。大模型负责“用户说倒角→输出半径”小模型负责“识别哪些边符合条件”。这种“大模型 小模型”配合的方式比单一大模型更稳定也更容易在业务中落地。6.3 添加孔特征与特征阵列类似地打孔也可以通过参数化方式实现。CATIA V5 的孔特征支持指定孔位置、直径、深度和底部形状还支持圆型阵列、矩形阵列。Agent 添加孔的流程是解析用户描述得到孔径、孔深、孔位。调用 CATIA 宏创建孔特征。如果是阵列孔再创建阵列并设置数量与间距。我在实测中发现孔位坐标的精度比孔径更值得注意。因为孔径只是一个数值而孔位坐标依赖草图平面参考系坐标一旦不在面上宏执行就会报错。为了提升稳定性可以先把目标面 ID 通过几何识别传入宏然后让宏在面上建立局部坐标系再放置孔。7. 常见问题与排查思路下面整理几个实测中高频出现的问题以及对应的排查和解决思路。问题现象常见原因解决思路大模型返回的不是合法 JSON系统提示词约束不严或模型能力不足增加 JSON Schema 校验改用支持 function calling 的模型CATIA 宏执行失败参数名不匹配、对象引用错误在宏中加入日志输出当前操作对象名模型更新后尺寸没变没调用part.Update()或修改错了参数层级确认修改的是最终驱动几何的参数而不是中间参考参数改型后孔位不跟随孔位坐标是绝对坐标没有关联底座尺寸改用公式或设计表关联孔位添加圆角时选不到边边 ID 在多版本中不稳定改用几何特征筛选边而不是硬编码 ID宏被 CATIA 安全拦截宏安全级别设置过高在测试机调整宏安全级别生产环境走签名的宏数值异常离谱大模型数值幻觉在 Python 侧做范围校验设置最大最小值连接 CATIA 失败COM 未注册、CATIA 未启动先启动 CATIA再检查 COM 组件注册情况排查时建议按“数据链路”从后往前逐步确认先看大模型返回的 JSON 是否正确。再看 Python 侧校验是否通过。再看 CATIA 宏的日志输出到了哪一步。最后确认 CATIA 模型树中的特征是否生成。不要在第一步就怀疑是 CATIA API 的问题多数情况下是前面某个环节的数据没对齐。8. 最佳实践与工程建议8.1 参数化先行AI 后置AI Agent 是“能开车的司机”但前提是“路已经修好”。如果模型本身没有参数化Agent 就只能做自由曲面调整这种高难度操作稳定性会大幅下降。建议团队先制定参数化建模规范明确哪些是关键尺寸、如何命名、是否允许公式引用然后再引入 AI Agent。8.2 参数命名规范强烈建议在知识工程模块中把参数名改成业务语义。示例PROJ_BaseLength PROJ_BaseWidth PROJ_BaseHeight PROJ_HoleDiameter PROJ_FilletRadius这样 Agent 在查找参数时不需要解析长路径名直接通过前缀和业务名匹配即可。对于已有模型可以先做一次“参数名清洗”批量重命名后再接入 Agent。8.3 在测试环境执行先备份再改型涉及自动改动生产模型时一定要遵守安全底线所有 Agent 操作先指向测试环境。改型前自动复制一份 CATPart 备份。关键操作设置人工确认环节例如修改超过 50% 的尺寸或删除特征时Agent 暂停等待确认。宏执行权限使用最小授权不要把管理权限直接暴露给 Agent。这些措施不是为了限制 AI 能力而是为了保证异常发生时可以快速回滚。8.4 日志与审计AI Agent 的每次执行都应该保留完整链路日志用户输入 把底座加长到 150 模型输出 {parameter: base_length, new_value: 150} 参数校验 pass CATIA 宏调用 modify_parameter(base_length, 150) 执行结果 success有了这样的日志即使某个操作出了问题也可以在几分钟内定位责任环节。8.5 渐进式落地路径不要把“全自动建模”作为第一个项目目标。更务实的路径是先做特征添加固定模型、固定特征类型让 Agent 自动打孔、倒角。再做参数改型让 Agent 修改已有模型的参数。最后做全自动建模从空白文档开始让 Agent 一步步创建草图、约束、拉伸和特征。每一步都要积累足够的成功样例和排错经验再往下一步走。9. 总结与学习路线这次实测验证了一个重要判断CATIA V5 自动化接口完全可以将 AI Agent 接入建模链路关键是做好三件事。第一用 JSON 协议约束大模型输出把自然语言映射到建模参数。第二做好参数化建模规范和特征适配表让 Agent 能准确找到修改对象。第三把 CATIA 操作封装成工具函数为大模型提供可靠的执行层并通过日志、参数校验和备份机制保证安全性。如果你准备继续深入可以按下面顺序学习先掌握 CATIA V5 的二次开发基础熟悉 CATScript、VBA、CAA 的对象模型。再学习知识工程模块重点理解参数、公式、规则、设计表以及它们如何驱动特征更新。然后学习 AI Agent 的基本编排方法尝试用大模型把自然语言转换成结构化指令。最后再把两者串联从特征添加做到改型再到全自动建模。这套链路里值得深入研究的方向还有很多例如用几何特征估计提升选边准确率、用目标检测类小模型识别历史模型中的特征区域、通过多模态模型直接理解设计草图。AI 不会取代 CAD 工程师但它会成为工程师手里的“自动建模助手”把重复劳动交给机器把人解放出来做真正的设计决策。如果这篇文章对你有帮助也可以收藏备用等你要真正动手搭建 CATIA AI Agent 时再翻出来对照使用。