При разработке аддонов для Blender может понадобиться программно переключать режимы работы 3D вьюпорта – например, включать режим отображения сетки WIREFRAME.
Для того чтобы переключить 3D вьюпорт в нужный режим отображения, требуется изменить свойство “shading.type” у рабочей области вьюпорта, установив для каждого режима свое значение
Список режимов и значений для его включения:
- Режим сетки – значение “WIREFRAME”
- Основной режим работы с мешами – значение “SOLID”
- Отображение текстур и материалов – значение “MATERIAL”
- Отображение такое же, как на финальном рендере – значение “RENDERED”
Например, чтобы включить в 3D вьюпорте режим отображения сетки, нужно установить следующее значение shading.type равное “WIREFRAME”.
1 |
bpy.context.space_data.shading.type = 'WIREFRAME' |
Не забудьте про необходимость переопределения контекста, если выполняете этот код в другой рабочей области, например в Text Editor.
1 2 3 4 |
area = [area for area in bpy.context.screen.areas if area.type == "VIEW_3D"][0] with bpy.context.temp_override(area=area): bpy.context.space_data.shading.type = 'WIREFRAME' |
Определить, какой режим отображения в 3D вьюпорте включен сейчас, можно обратившись к этому же свойству:
1 2 3 4 |
with bpy.context.temp_override(area=area): print(bpy.context.space_data.shading.type) # SOLID |
Кнопки переключения режимов отображения 3D вьюпорта можно вынести на пользовательскую панель.
Для этого сначала определим тестовый оператор, который будет включать, например, режим сетки.
1 2 3 4 5 6 7 8 |
class TEST_OT_op(bpy.types.Operator): bl_idname = 'test.op' bl_label = 'TEST OPERATOR' bl_options = {'REGISTER'} def execute(self, context): context.space_data.shading.type = 'WIREFRAME' return {'FINISHED'} |
Здесь переопределение контекста не требуется, так как оператор будет выполняться в контексте самого 3D вьюпорта.
Теперь определим тестовую панель, на которой разместим кнопку вызова нашего оператора.
1 2 3 4 5 6 7 8 9 10 11 12 |
class TEST_PT_panel(bpy.types.Panel): bl_idname = 'TEST_PT_panel' bl_label = 'TEST PANEL' bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_category = 'TEST' def draw(self, context): self.layout.operator( operator='test.op', text='WIREFRAME MODE' ) |
И не забудем зарегистрировать оба наших класса в Blender Python API.
1 2 |
bpy.utils.register_class(TEST_OT_op) bpy.utils.register_class(TEST_PT_panel) |
После выполнения этого кода в N-панели будет создана пользовательская панель с единственной кнопкой “WIREFRAME MODE” по нажатию на которой режим вьюпорта будет переключен в режим отображения сетки.