一、痛点引入
下周三装配评审。会上要看的是"结构":框、长桁、接头按系统分色,标准件全部收起来,外壳半透明能看见里面——也就是把眼前这片花花绿绿、几百个零件混在一起的画面,规整成一张讲得清楚的图。
你的操作是:树上选中零件 右键 属性 图形 改颜色 确定,再找下一个。一个零件五次点击,200 个零件改到半夜;第二天评审组说"接头那组换个颜色",又得从头再来一遍。
手动着色真正的坑不是慢,是规则只存在你脑子里:今天用这个蓝,明天顺手换一个蓝,同事接着改又是另一种蓝,三周后没人说得清哪个颜色代表哪个系统。这不是手速问题,是"逐个手点"这个动作本身就不该存在。
今天用 Python COM API 把着色规则写成代码:按 PartNumber 关键词批量着色、标准件一键隐藏、外壳一键透明——200 个零件 2 秒规整完。
二、核心思路
CATIA 的图形属性(颜色/透明/隐藏)不挂在参数表上,而是通过选择集生效:把对象加进 Selection,用 VisProperties 统一设置。你在界面上"右键属性改颜色",走的就是这条路;脚本只是把"选中谁"和"设成什么"全部交给规则表决定。
Python脚本(pywin32) COM接口 CATIA.Application
├─ ActiveDocument 当前装配体(.CATProduct)
├─ Product.Products 遍历一级零部件
│ └─ PartNumber 匹配规则表
├─ Selection.Clear/Add 组装选择集
└─ VisProperties
├─ SetRealColor 着色(继承:0本节点/1连子级)
├─ SetRealOpacity 透明(0全透 ~ 255不透)
└─ SetShowMode 隐藏(1)/显示(0)
doc.Save() 颜色随产品文件一起保存你需要准备:
- Python 3.7+、
pywin32 - 本机已装 CATIA V5,并打开目标 .CATProduct
- 一张"谁是什么颜色"的规则表(脚本里就是一个 dict)
三、环境搭建(2分钟)
pip install pywin32验证 COM 通道和选择集是否可用:
import win32com.client
catia = win32com.client.Dispatch("CATIA.Application")
catia.Visible = True
doc = catia.ActiveDocument
print(f"当前文档: {doc.Name}")
print(f"Selection 可用: {hasattr(doc, 'Selection')}")
print("图形属性接口就绪。")能打出文档名和 True,说明通道正常,可以直接写规则了。
四、核心代码
# -*- coding: utf-8 -*-
"""CATIA 装配体颜色批量管理:按 PartNumber 规则着色/隐藏/透明"""
import win32com.client
# ========== 第1步:连接CATIA,锁定当前装配文档 ==========
catia = win32com.client.Dispatch("CATIA.Application")
catia.Visible = True
doc = catia.ActiveDocument
if not doc.Name.upper().endswith(".CATPRODUCT"):
raise RuntimeError("请先在CATIA中打开目标 .CATProduct 装配体")
sel = doc.Selection # 选择集:批量改图形属性的"抓手"
root = doc.Product # 装配体根节点
# ========== 第2步:把着色规则写成配置表(核心!) ==========
# 规则:PartNumber 包含关键词 -> (R, G, B)
COLOR_RULES = {
"框": (66, 133, 244), # 框类零件 -> 蓝
"长桁": (52, 168, 83), # 长桁类 -> 绿
"接头": (232, 119, 34), # 接头类 -> 橙
"M6": (166, 166, 166), # 标准件 -> 灰
"M8": (166, 166, 166),
}
HIDE_KEYWORDS = ("M6", "M8") # 命中即隐藏:标准件先收起来
# ========== 第3步:遍历零部件,按规则批量执行 ==========
colored = hidden = 0
for inst in root.Products: # 遍历一级组件;子装配整体变色用继承参数
part_no = inst.PartNumber or ""
sel.Clear()
sel.Add(inst) # 实例加入选择集
for kw, rgb in COLOR_RULES.items():
if kw in part_no:
sel.VisProperties.SetRealColor(rgb[0], rgb[1], rgb[2], 0)
colored += 1
break # 命中第一条规则即止,避免重复着色
if any(kw in part_no for kw in HIDE_KEYWORDS):
sel.VisProperties.SetShowMode(1) # 1=隐藏,0=显示
hidden += 1
total = root.Products.Count
print(f"着色 {colored} 个,隐藏 {hidden} 个,共 {total} 个一级组件")
# doc.Save() # 预览满意后取消注释:颜色随 .CATProduct 一起保存代码解析:
doc.Selection+VisProperties:改图形属性的标准编程入口,等价于手点的"右键属性"。SetRealColor(r, g, b, i)末位参数是继承开关:0 只改所选节点,1 连同子级一起改——子装配要整体变色就传 1。- 选"实例"还是"参考"结果不同:对
root.Products里的实例着色,颜色记在装配体文件里,同一零件在不同装配位可以是不同颜色;若对ReferenceProduct着色,则写进零件本身,所有引用处一起变。 SetShowMode(1):等价于树上的"隐藏/显示"空格键。隐藏的零件仍在产品结构里,重量、约束、干涉计算完全不受影响,只是视图不显示。- 颜色和隐藏状态都是文档属性:不保存,关掉就丢。所以把
doc.Save()放在注释里,确认效果满意后再落盘。
五、效果对比
| 对比项 | 传统方法(手动右键改属性) | 自动化脚本 |
|---|---|---|
| 200个零件着色+隐藏标准件 | 约1小时、500+次点击 | 2秒、1次运行 |
| 颜色一致性 | 靠肉眼对色卡,常有色差 | RGB写死规则表,绝对一致 |
| 评审临时改规则 | 全部重来一遍 | 改规则表重跑一次 |
| 标准件收纳 | 逐个翻树逐个隐藏 | 关键词命中自动隐藏 |
| 出错率 | 高(漏改/重复改/忘保存) | 极低(规则由代码执行) |
六、进阶用法
技巧1:外壳玻璃化,内部结构直接看
# 命中关键词的外壳类零件设为半透明
SHELL_KEYWORDS = ("壳", "罩", "口盖", "整流罩")
for inst in root.Products:
if any(k in (inst.PartNumber or "") for k in SHELL_KEYWORDS):
sel.Clear()
sel.Add(inst)
sel.VisProperties.SetRealOpacity(120, 0) # 0~255,越小越透机加壳体调到 120 左右,内部管路、支架、走线一目了然,评审时不用再"隐藏外壳讲完恢复"来回折腾。
技巧2:一键恢复显示
sel.Clear()
for inst in root.Products:
sel.Add(inst) # 全部装进同一个选择集
if sel.Count:
sel.VisProperties.SetShowMode(0) # 一次调用批量恢复
sel.Clear()先把所有一级组件塞进同一个选择集,再对选择集整体 SetShowMode(0),一条命令恢复全部显示。深层子装配里被单独隐藏的零件,把遍历改成递归即可(模板见第2篇递归遍历装配体)。
关注回复「着色」获取完整源码 + 着色规则表模板
下期预告:第13篇——参数与公式批量审计:参数被谁改过?公式断链没?一行代码拉出全树清单。或切换选项c「CAA C++ 踩坑记录」第6篇——Undo/Redo 事务回滚。
_栏目:开发实战 | 发布日期:2026-09-13 | 字数:约 1100 字 | 系列:CATIA Python COM API 入门 #12_