Для того, чтобы скрыть объект в окне 3D Viewport только для текущей сцены мы все пользуемся оператором object.hide_view_set, вызов которого равносилен нажатию на иконку с глазом в аутлайнере. Однако для того, чтобы скрыть объект во вьюпорте сразу для всех сцен проекта – нажатие на иконку с изображением монитора, специального оператора не предусмотрено. Сделаем его сами.
Свойство объекта, отвечающее за его показ или скрытие во вьюпорте глобально для всех сцен проекта:
1 2 |
object.hide_viewport # False |
Создадим класс оператора для изменения этого свойства у объекта:
1 2 3 4 5 6 7 8 9 10 11 |
from bpy.types import Operator class OBJECT_hide_viewport(Operator): bl_idname = 'object.hide_viewport' bl_label = 'Hide viewport' bl_description = 'Globally disable in viewport' bl_options = {'REGISTER', 'UNDO'} def execute(self, context): context.object.hide_viewport = True return {'FINISHED'} |
И зарегистрируем его в Blender Python API:
1 2 3 4 5 6 7 |
from bpy.utils import register_class, unregister_class def register(): register_class(OBJECT_hide_viewport) if __name__ == '__main__': register() |
При выполнении этого оператора текущий активный объект будет скрываться во вьюпорте для всех сцен проекта.
Для его вызова достаточно набрать в Python-консоли:
1 |
bpy.ops.object.hide_viewport() |
Для удобства работы мы можем настроить комбинацию клавиш для его вызова. Для этого перейдите в окно Preferences на вкладку KeyMap. В выпадающем меню откройте раздел 3D View – Object Mode – Object Mode (Global) и нажатием на клавишу “New” создайте новый keymap.
В поле оператора впишите object.hide_viewport, и назначьте удобное сочетание клавиш для его вызова, например, клавишу “Y”.
Теперь при нажатии на клавишу “Y” в окне 3D Viewport активный объект будет скрыт для всех сцен проекта.
Для того, чтобы наш оператор скрывал не активный объект сцены, а все выделенные объекты, что гораздо удобнее в работе, нужно немного изменить его код.
Вместо изменения свойства hide_viewport только для активного объекта context.object, сделаем цикл по всем выделенным объектам и изменим это свойство у них всех.
Для этого строчку
1 |
context.object.hide_viewport = True |
заменим на:
1 2 |
for obj in context.selected_objects: obj.hide_viewport = True |
Создадим еще один оператор, который будет выполнять обратную функцию – отображать все скрытые для всех сцен объекты.
Назовем его hide_viewport_clear
1 2 3 4 5 6 7 8 9 10 11 |
class OBJECT_hide_viewport_clear(Operator): bl_idname = 'object.hide_viewport_clear' bl_label = 'Clear viewport hide' bl_description = 'Globally cler hiding in viewport' bl_options = {'REGISTER', 'UNDO'} def execute(self, context): for obj in context.blend_data.objects: if obj.hide_viewport: obj.hide_viewport = False return {'FINISHED'} |
Его тоже нужно зарегистрировать в API через register_class.
Так же настроим для него вызов через сочетание клавиш, например “alt + Y”:
Полный код:
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 32 33 34 35 36 37 38 39 40 |
import bpy from bpy.types import Operator from bpy.utils import register_class, unregister_class class OBJECT_hide_viewport(Operator): bl_idname = 'object.hide_viewport' bl_label = 'Hide viewport' bl_description = 'Globally disable in viewport' bl_options = {'REGISTER', 'UNDO'} def execute(self, context): for obj in context.selected_objects: obj.hide_viewport = True return {'FINISHED'} class OBJECT_hide_viewport_clear(Operator): bl_idname = 'object.hide_viewport_clear' bl_label = 'Clear viewport hide' bl_description = 'Globally cler hiding in viewport' bl_options = {'REGISTER', 'UNDO'} def execute(self, context): for obj in context.blend_data.objects: if obj.hide_viewport: obj.hide_viewport = False return {'FINISHED'} def register(): register_class(OBJECT_hide_viewport) register_class(OBJECT_hide_viewport_clear) def unregister(): unregister_class(OBJECT_hide_viewport_clear) unregister_class(OBJECT_hide_viewport) if __name__ == '__main__': register() |
*.blend файл с примером и *.py файл с кодом для моих подписчиков на Patreon