Доступ и изменение очередей отмены Maya - PullRequest
3 голосов
/ 09 июля 2019

Есть ли какие-нибудь способы, которыми я мог бы получить доступ / редактировать очередь отмены?

Причина, по которой я спросил, заключается в том, что в моем текущем инструменте я создал следующее в одной из моих функций переименования (где вы удваиваетещелкните QListWidgetItem, введите новое имя, и cmds.rename будет использовать новое имя для ввода):

cmds.undoInfo(chunkName='renameChunk', openChunk=True)
# do cmds.rename operations
cmds.undoInfo(chunkName='renameChunk', closeChunk=True)

Однако, если я пытаюсь выполнить функцию отмены (ctrl + z), чтобы вернутьсяЧтобы вернуться к названию, мне нужно пару раз нажать комбинацию клавиш вместо ожидаемого 1 раза.И, распечатывая очередь отмен, я заметил, что есть много «пустых» записей, которые могут быть причиной нескольких отмен.

...
# 39:  # 
# 40:  # 
# 41:  # 
# 42:  # 
# 43: renameChunk # 
# 44:  # 
# 45:  # 
# 46:  # 
# 47:  # 
# 48:  # 
# 49:  #

1 Ответ

1 голос
/ 12 июля 2019

Я собираюсь дать ответ, потому что то, что вы делаете, немного рискованно.Прямо сейчас вы предполагаете, что cmds.undoInfo(chunkName='renameChunk', closeChunk=True) будет работать, хотя, если в промежутке между ошибками произойдет ошибка, строка никогда не будет выполнена, и у вас останется открытый блок отмены отмены.

Более безопасный подход - открытьотменить чанк, затем обернуть ваш код в try finally.Таким образом, независимо от того, что произойдет, вы можете быть уверены, что блок закроется в блоке finally:

cmds.undoInfo(chunkName='renameChunk', openChunk=True)
try:
    raise RuntimeError("Oops!")
finally:
    cmds.undoInfo(closeChunk=True)  # This will still execute.

В качестве альтернативы вы можете быть немного более любопытным и создать свой собственный класс отмены и использовать его __enter__ и __exit__ специальные методы:

class UndoStack(object):

    def __init__(self, name="actionName"):
        self.name = name

    def __enter__(self):
        cmds.undoInfo(openChunk=True, chunkName=self.name, infinity=True)

    def __exit__(self, typ, val, tb):
        cmds.undoInfo(closeChunk=True)

with UndoStack("renameChunk"):  # Opens undo chunk.
    raise RunTimeError("Oops!")  # Fails
# At this point 'with' ends and will auto-close the undo chunk.

Пока вы делаете это таким образом, у вас не должно быть всех этих пустых вызовов отмены (по крайней мере, у меня нет!).Хотя старайтесь держать его компактным, так что откройте отменить кусок, сделайте работу, а затем немедленно закройте его.Избегайте того, чтобы заниматься другими делами, такими как управление графическим интерфейсом или что-то в этом роде.

...