MEAICAD预约演示
技术博客/二次开发
二次开发

CATIA 二次开发:装配体干涉检查自动化,全组件碰撞一键跑完出报告

2026-08-12#CATIA#二次开发

一、痛点引入

你刚把600多个零件的整机装配体改完一版,领导问一句:"这次还有没有干涉?"你点开"碰撞"工具,选"全部产品",等进度条跑完,弹出来一长串列表——几十处干涉混着接触、间距告警,不知道哪处是真实穿模、哪处是0.01mm的间隙误报。

想把结果整理成一份给工艺看的检查报告?CATIA只给你一个对话框,导出要手动逐条复制零件名。更要命的是,每次设计迭代你都得重复这一整套操作。

这不是你检查得不仔细,是碰撞功能的设计就是给人"看"的,不是给人"汇总导出"的。今天教你用Python COM API,一键跑完全组件干涉分析,自动分级、定位坐标、导出报告——从点开工具到拿到清单,30秒。


二、核心思路

CATIA的干涉分析由 SPA(Space Analysis)工作台 承载。在COM API里,根产品通过 GetTechnologicalObject("Clashes") 拿到 Clashes 集合;调用 Add() 创建一个 Clash 对象,先设置计算模式(全部对全部 / 一对一 / 一组对全部),再 Compute(),结果就落在 Clash.Conflicts 里。每个 Conflict 带两个产品、干涉类型、穿透量和坐标点。

Python脚本  COM接口  CATIA产品文档
                        ├─ root.GetTechnologicalObject("Clashes") 取分析集合
                        ├─ Clashes.Add() 新建一次Clash计算
                        ├─ Clash.ComputationType 设计算模式
                        ├─ Clash.Compute() 执行碰撞分析
                        ├─ Clash.Conflicts 读全部干涉结果
                        └─ Conflict.FirstProduct/SecondProduct/Type/Value/Get*PointCoordinates 取明细

你需要准备

  • Python 3.7+、pywin32
  • CATIA V5 已打开目标装配文档(.CATProduct),SPA工作台可用

三、环境搭建(2分钟)

pip install pywin32

验证当前装配能读到根产品、能取到Clashes集合:

import win32com.client

catia = win32com.client.Dispatch("CATIA.Application")
doc = catia.ActiveDocument
root = doc.Product
clashes = root.GetTechnologicalObject("Clashes")
print(f"装配: {root.Name}")
print(f"已有Clash任务数: {clashes.Count}")
print("SPA分析接口可用,连接成功。")

能打印出装配名和任务数,说明空间分析接口已就绪。


四、核心代码

下面分三步:创建并计算全组件干涉 遍历结果分级 导出CSV报告

import win32com.client
import csv

# ========== 第1步:连接CATIA,创建Clash计算任务 ==========
catia = win32com.client.Dispatch("CATIA.Application")
root = catia.ActiveDocument.Product

# 通过技术对象拿到SPA的Clashes集合(这是固定写法)
clashes = root.GetTechnologicalObject("Clashes")
clash = clashes.Add()

# 设置计算模式:全部产品两两互相检测
# catClashComputationTypeBetweenAll = 全对全
clash.ComputationType = 1   # 1=BetweenAll;2=BetweenTwo;3=OneVsAll
clash.Compute()              # 执行碰撞计算,耗时随零件数增长
print(f"计算完成,共检出 {clash.Conflicts.Count} 处干涉/接触")

# ========== 第2步:遍历Conflicts,按类型分级 ==========
# CatConflictType 枚举:1=Clash(穿透) 2=Contact(接触) 3=Clearance(间距不足)
TYPE_MAP = {1: "穿透干涉", 2: "接触", 3: "间距不足"}
rows = []
for i in range(1, clash.Conflicts.Count + 1):
    c = clash.Conflicts.Item(i)
    p1 = c.FirstProduct.Name
    p2 = c.SecondProduct.Name
    ctype = TYPE_MAP.get(int(c.Type), "其他")
    val = c.Value          # 穿透长度(mm) 或 最小间距(mm)
    # 取干涉点坐标(穿透最深/距离最近处)
    pt1 = c.GetFirstPointCoordinates()
    rows.append({
        "序号": i, "类型": ctype,
        "零件A": p1, "零件B": p2,
        "数值(mm)": round(val, 4),
        "X": round(pt1[0], 2), "Y": round(pt1[1], 2), "Z": round(pt1[2], 2),
    })

clash_count = sum(1 for r in rows if r["类型"] == "穿透干涉")
contact_count = sum(1 for r in rows if r["类型"] == "接触")
print(f"穿透干涉: {clash_count} 处 | 接触: {contact_count} 处")

# ========== 第3步:导出CSV报告 ==========
with open("干涉检查报告.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.DictWriter(f, fieldnames=["序号", "类型", "零件A", "零件B", "数值(mm)", "X", "Y", "Z"])
    writer.writeheader()
    writer.writerows(rows)
print("报告已导出: 干涉检查报告.csv")

代码解析

  • root.GetTechnologicalObject("Clashes") 取空间分析集合,字符串参数 "Clashes" 不可写错
  • clashes.Add() 新建一个Clash计算对象,每次运行新建一个,不污染历史结果
  • clash.ComputationType 计算模式;1 为全对全,整机大装配默认用这个
  • clash.Conflicts.Item(i) 单处干涉结果,Type 区分穿透/接触/间距,Value 为穿透量或最小间距
  • c.GetFirstPointCoordinates() 返回SAFEARRAY三元组,是穿透最深或距离最近点,用作定位坐标

五、效果对比

对比项传统方法自动化脚本
600零件全检手动点开+等待+肉眼筛一键运行
结果整理对话框里逐条抄自动分级+坐标CSV
穿透/接触区分混在一起看Type字段自动分类
迭代复查每次重复全流程改完重跑同一脚本
报告交付截图发群里标准CSV给工艺

六、进阶用法

技巧1:只查关键两个组件之间的干涉(一对一模式)

整机碰撞太多时,可以先框选两个可疑组件再算,或指定两个产品名用 BetweenTwo 模式:

clash.ComputationType = 2   # BetweenTwo:第一组 vs 第二组
# 第一组放零件A,第二组放零件B(通过Selection或Group设置)
clash.FirstGroup = group_a
clash.SecondGroup = group_b
clash.Compute()

技巧2:把干涉点标到模型上,便于复查

结果里拿到坐标后,可在对应图形集创建点,下次打开模型直接看到干涉位置:

part = c.FirstProduct.ReferenceProduct.Parent.Part
hb = part.HybridBodies.Item("干涉标记")   # 提前建好该图形集
factory = part.HybridShapeFactory
pt = factory.AddNewPointCoord(pt1[0], pt1[1], pt1[2])
pt.Name = f"干涉_{p1}_vs_{p2}"
hb.AppendHybridShape(pt)
part.Update()

关注回复「干涉检查」获取完整源码 + CSV报告模板

下一篇预告:选项c「CAA C++ 踩坑记录」开坑——从COM脚本进阶到原生C++插件,聊聊环境配置与常见编译坑。


_栏目:开发实战 | 发布日期:2026-08-12 | 字数:约1150字 | 系列:CATIA Python COM API 入门 #8_

本文为基础实战分享。如需完整源码包、配套课程或企业内训,欢迎进一步了解付费体系。

咨询深入资源 →