Обычно, когда мы отменяем последнее действие в Blender, нажимая комбинацию клавиш Ctrl + z, всё действие отменяется целиком, даже если это действие сложное. Например, выполнение скрипта отменяется полностью, нельзя отменить только половину от выполненного в скрипте кода. Или все-таки можно?
В Blender Python API предусмотрена возможность специально устанавливать точки, до которых будет выполняться операция отмены последнего действия.
Такая точка создается при вызове оператора
|
1 |
bpy.ops.ed.undo_push() |
Каждый раз, когда вызывается этот оператор, текущее состояние сцены в Blender фиксируется в стеке отмены “global undo”. И теперь, при нажатии клавиш Ctrl + z откат сцены будет выполнен именно к этому зафиксированному состоянию.
Рассмотрим, как это работает на примере простейшего скрипта.
Пусть наш скрипт добавляет в сцену три объекта: Сюзанну, куб и сферу.
Для этого нам нужно вызвать подряд три оператора для создания этих объектов в сцене:
|
1 2 3 4 5 6 7 8 9 10 11 |
bpy.ops.mesh.primitive_monkey_add( location=(0, 0, 0) ) bpy.ops.mesh.primitive_cube_add( location=(3, 0, 0) ) bpy.ops.mesh.primitive_uv_sphere_add( location=(-3, 0, 0) ) |
Выполним наш скрипт, нажав на стрелочку “Run Script” в текстовом редакторе Blender. Как мы видим, нужные нам меши появились в сцене.
Теперь нажмем комбинацию клавиш для отмены действия – Ctrl + z. Все три добавленных в сцену объекта исчезли. Так происходит потому, что действие “выполнить скрипт” было полностью отменено и сцена в Blender откатилась к состоянию, которое было зафиксировано в Blender автоматически, до начала выполнения нашего скрипта.
А теперь добавим в скрипт операторы создания точек отмены между уже имеющимися операторами создания объектов.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
bpy.ops.mesh.primitive_monkey_add( location=(0, 0, 0) ) bpy.ops.ed.undo_push() bpy.ops.mesh.primitive_cube_add( location=(3, 0, 0) ) bpy.ops.ed.undo_push() bpy.ops.mesh.primitive_uv_sphere_add( location=(-3, 0, 0) ) |
Выполним модифицированный скрипт. И снова попробуем отменить последнее действие.
Как мы видим, при однократном нажатии Ctrl + z из сцены исчез только последний добавленный в нее объект – сфера. Т.е. сцена откатилась не к начальной точке выполнения скрипта, как это было раньше, а к последней созданной нами вручную точке отмены, которую мы создали, вызвав оператор undo_push() перед оператором создания сферы primitive_uv_sphere_add().
Нажмем Ctrl + z еще раз. Теперь исчез куб. Сцена откатилась к предыдущей точке отмены, которую мы создали перед вызовом оператора добавления куба в сцену.
И, наконец, третье нажатие Ctrl + z полностью очищает нашу сцену, т.е. откатывает ее к точке отмены которая была создана автоматически перед началом выполнения нашего скрипта.
Таким образом вызывая оператор undo_push() в нужных нам местах, мы можем гибко управлять процессом отмены действий в Blender.

.blend file on Patreon