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

CATIA 二次开发:装配体批量着色,200 个零件 2 秒规整评审画面

2026-09-13#CATIA#二次开发

一、痛点引入

下周三装配评审。会上要看的是"结构":框、长桁、接头按系统分色,标准件全部收起来,外壳半透明能看见里面——也就是把眼前这片花花绿绿、几百个零件混在一起的画面,规整成一张讲得清楚的图。

你的操作是:树上选中零件 右键 属性 图形 改颜色 确定,再找下一个。一个零件五次点击,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_

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

咨询深入资源 →