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
相关产品推荐
相关产品推荐

