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

Maya中PySide2多关联方法的批量Undo/Redo实现问询

在Maya PySide2中批量实现GUI方法的Undo/Redo

你可以用Python装饰器来封装Undo/Redo的逻辑,不用在每个方法里重复写undoInfo的开闭代码。装饰器能帮你给所有GUI关联的方法统一添加Undo/Redo支持,代码更简洁易维护。

步骤1:定义Undo装饰器

先写一个通用的装饰器,把undoInfo的逻辑封装进去:

import maya.cmds as cmds

def undoable(func):
    def wrapper(*args, **kwargs):
        try:
            # 打开一个undo块,用函数名作为块名方便识别
            cmds.undoInfo(openChunk=True, chunkName=func.__name__)
            # 执行原方法的逻辑
            return func(*args, **kwargs)
        finally:
            # 不管有没有异常,都确保关闭undo块
            cmds.undoInfo(closeChunk=True)
    return wrapper

步骤2:给GUI方法添加装饰器

只需要在每个和按钮绑定的方法前加@undoable装饰器,就自动拥有Undo/Redo功能了:

@undoable
def method1():
    # 你的操作代码,比如创建几何体
    cmds.polyCube(name="myCube")

@undoable
def method2():
    # 比如修改对象属性
    cmds.setAttr("myCube.translateX", 10)

@undoable
def method3():
    # 比如删除对象
    cmds.delete("myCube")

注意事项

  • 你原本想的在函数定义外层套undoInfo的方式是无效的:函数定义时不会执行内部代码,只会在调用时执行,所以那种写法只会在定义阶段创建一个空的undo块,根本不会把方法里的操作包进去。
  • 如果需要把多个方法的操作合并成一个undo块(比如点击一个按钮触发多个操作),可以把这些方法的调用放在一个被装饰的组合方法里:
    @undoable
    def combined_operation():
        method1()
        method2()
        method3()
    
    这样点击按钮调用combined_operation时,三个操作会被合并成一个undo项,一次Undo就能全部撤销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:25:12