You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Maya场景中用Python实现LRU缓存,存储对象名与类型并封装查询函数

在Maya中实现LRU缓存存储对象名称与类型的Python方案

实现思路

利用Python标准库的functools.lru_cache实现LRU缓存,缓存Maya场景中对象名称与类型的映射关系,再通过两个函数分别提取对象名称和类型数据。同时提供缓存刷新方法,应对场景变化后的缓存更新需求。

完整代码实现

import maya.cmds as cmds
from functools import lru_cache

@lru_cache(maxsize=None)  # maxsize设为None表示无限制缓存,可根据需求调整为具体数值
def _get_scene_objects_cache():
    """内部缓存函数,获取场景对象名称与类型的映射"""
    # 获取场景中所有对象的完整路径名称
    all_objects = cmds.ls(long=True)
    # 构建名称到类型的字典
    obj_type_map = {obj: cmds.objectType(obj) for obj in all_objects}
    return obj_type_map

def get_all_object_names():
    """返回场景中所有对象的完整名称列表"""
    return list(_get_scene_objects_cache().keys())

def get_all_object_types():
    """返回与对象名称列表顺序对应的类型列表"""
    obj_map = _get_scene_objects_cache()
    return [obj_map[obj] for obj in obj_map.keys()]

def get_object_type_mapping():
    """返回对象名称到类型的映射字典(返回副本避免修改缓存)"""
    return _get_scene_objects_cache().copy()

def refresh_scene_cache():
    """手动清除缓存,下次调用时重新获取最新场景数据"""
    _get_scene_objects_cache.cache_clear()

使用说明

  1. 获取对象名称:调用get_all_object_names()会返回场景中所有对象的完整路径列表,首次调用会触发缓存加载,后续调用直接读取缓存。
  2. 获取对象类型:
    • get_all_object_types()返回与名称列表一一对应的类型列表;
    • get_object_type_mapping()返回完整的名称-类型映射字典,方便按名称查询类型。
  3. 更新缓存:当场景中对象增删、类型变更时,调用refresh_scene_cache()清除旧缓存,后续函数调用会重新获取最新场景数据。

注意事项

  • 使用cmds.ls(long=True)确保获取对象的完整路径,避免重名对象导致的混淆;
  • lru_cache默认基于函数参数缓存,这里函数无参数,所以缓存唯一对应当前场景状态;
  • 如果需要限制缓存大小,可修改maxsize参数为具体数值(如maxsize=128),超出时自动淘汰最久未使用的缓存条目。

内容的提问来源于stack exchange,提问作者Kartikey Sinha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:15:50