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

Maya插件命令执行后如何持久化生成的内存数据?

解决方案:Maya插件跨执行会话保留内存数据

1. 全局模块变量(最便捷方案)

直接在插件所属的Python模块里定义全局变量存储数据——Maya加载模块后,模块会常驻内存,除非手动重载或重启Maya,完全满足跨命令执行的内存存储需求。

示例代码:

# 插件模块 my_plugin.py
# 全局变量存储跨执行的数据
_session_data = {}

class MyMayaCommand(MPxCommand):
    def doIt(self, args):
        global _session_data
        # 读取上一次执行的留存数据
        last_result = _session_data.get("last_generated", None)
        if last_result:
            print(f"复用上次数据: {last_result}")
        # 生成新数据
        new_data = {"target_mesh": "pCube1", "param": 1.5}
        # 更新全局变量
        _session_data["last_generated"] = new_data
        self.setResult(new_data)

# 插件注册逻辑...

注意:数据仅在当前Maya会话有效,关闭即丢失;Maya主循环是单线程,多实例共享时无需额外处理线程安全。

2. Maya全局命名空间存储

利用Maya自带的全局存储机制,不管Python还是Mel都能访问,适合需要跨脚本/命令共享数据的场景。

用optionVar存储简单数据

适合字符串、数字、列表这类基础类型:

import maya.cmds as cmds

class MyMayaCommand(MPxCommand):
    def doIt(self, args):
        data_key = "my_plugin_last_data"
        # 读取留存数据
        if cmds.optionVar(exists=data_key):
            last_data = cmds.optionVar(query=data_key)
            print(f"上次执行数据: {last_data}")
        # 生成并存储新数据
        new_data = ["pSphere1", "pCylinder1", 3.0]
        cmds.optionVar(clear=data_key)
        cmds.optionVar(stringValue=(data_key, str(new_data)))

序列化存储复杂数据

用json把字典、嵌套结构转成字符串存储:

import json
import maya.cmds as cmds

class MyMayaCommand(MPxCommand):
    def doIt(self, args):
        data_key = "my_plugin_complex_data"
        # 读取并反序列化
        if cmds.optionVar(exists=data_key):
            serialized_str = cmds.optionVar(query=data_key)
            last_data = json.loads(serialized_str)
            print(f"上次复杂数据: {last_data}")
        # 生成新数据并序列化存储
        new_data = {"selected_objects": cmds.ls(selection=True), "settings": {"offset": 2.5}}
        cmds.optionVar(clear=data_key)
        cmds.optionVar(stringValue=(data_key, json.dumps(new_data)))

额外说明:可以加cmds.optionVar(save=True)让数据在Maya重启后依然保留,但数据不绑定场景文件。

3. 自定义节点(场景绑定场景下使用)

如果需要数据随场景文件保存、或要在场景中可视化编辑数据,才考虑自定义节点。这个方案实现成本高,但能让数据和场景强绑定,重启Maya打开场景后依然可用。

核心思路:

  • 继承MPxNode创建自定义节点,添加对应属性(比如message属性关联场景对象、stringArray存序列化数据)
  • 执行命令时,先检查场景中是否存在该节点,不存在则创建;读取节点属性获取上次数据,更新后再写回属性

但如果只是内存中跨命令执行临时保留数据,前两种方案比自定义节点便捷太多。

方案优先级

  1. 全局模块变量:实现最简单,纯内存临时存储,会话内有效
  2. Maya optionVar:支持跨脚本共享,可选择是否跨Maya会话保留,无需额外节点
  3. 自定义节点:仅适合数据需绑定场景、持久化到文件的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:45:41