Через Blender Python API можно работать не только с объектами сцены, но также и с пользовательским интерфейсом UI. Например, можно сохранять и восстанавливать обратно положение вьюпорта в сцене.
Автор кода Andrej
Положение вьюпорта в Blender Python API описывается рядом параметров, которые можно сохранить в список для удобства работы с ними.
1 2 3 4 5 |
VIEWPORT_ATTRIBUTES = [ 'view_matrix', 'view_distance', 'view_perspective', 'use_box_clip', 'use_clip_planes', 'is_perspective', 'show_sync_view', 'clip_planes' ] |
Получить рабочую область 3D вьюпорта можно при помощи функции:
1 2 3 4 |
def get_r3d(): area = next(area for area in bpy.context.screen.areas if area.type == "VIEW_3D") r3d = area.spaces[0].region_3d return r3d |
Функция save_viewport_position сохраняет копию текущего значения для каждого из перечисленных ранее параметров вьюпорта.
1 2 3 4 5 |
def save_viewport_position(): r3d = get_r3d() copy_if_possible = lambda x: x.copy() if hasattr(x, 'copy') else x data = {attr: copy_if_possible(getattr(r3d, attr)) for attr in VIEWPORT_ATTRIBUTES} return data |
Функция возвращает блок сохраненных данных.
Для того чтобы восстановить сохраненные параметры вьюпорта, используется функция apply_viewport_position, в параметре которой передаются сохраненные ранее данные.
1 2 3 4 |
def apply_viewport_position(data): r3d = get_r3d() for attr in VIEWPORT_ATTRIBUTES: setattr(r3d, attr, data[attr]) |
Принцип использования: сохраняем данные по текущему положению вьюпорта в переменную, изменяем его, если это необходимо, и вызываем функцию восстановления для возврата к сохраненному положению вьюпорта.
1 2 3 4 5 6 7 |
# save viewport current_viewport = save_viewport_position() # rotate viewport to test it # restore viewport apply_viewport_position(current_viewport) |
Полный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import bpy VIEWPORT_ATTRIBUTES = [ 'view_matrix', 'view_distance', 'view_perspective', 'use_box_clip', 'use_clip_planes', 'is_perspective', 'show_sync_view', 'clip_planes' ] def get_r3d(): area = next(area for area in bpy.context.screen.areas if area.type == "VIEW_3D") r3d = area.spaces[0].region_3d return r3d def save_viewport_position(): r3d = get_r3d() copy_if_possible = lambda x: x.copy() if hasattr(x, 'copy') else x data = {attr: copy_if_possible(getattr(r3d, attr)) for attr in VIEWPORT_ATTRIBUTES} return data def apply_viewport_position(data): r3d = get_r3d() for attr in VIEWPORT_ATTRIBUTES: setattr(r3d, attr, data[attr]) # save viewport current_viewport = save_viewport_position() # rotate viewport to test it # restore viewport apply_viewport_position(current_viewport) |