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