一、痛点引入
你刚把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_