From bc04aad9b3d3819672e6995f61fe1edffc4a237b Mon Sep 17 00:00:00 2001 From: Demeter Dzadik Date: Sat, 17 Aug 2024 23:36:36 +0100 Subject: [PATCH 1/6] Rework View Pie --- source/__init__.py | 2 +- source/pie_view_menu.py | 127 +++++++++++++++++++++++++++++++ source/pie_views_numpad_menu.py | 131 -------------------------------- 3 files changed, 128 insertions(+), 132 deletions(-) create mode 100644 source/pie_view_menu.py delete mode 100644 source/pie_views_numpad_menu.py diff --git a/source/__init__.py b/source/__init__.py index 5c01c86..67845cc 100644 --- a/source/__init__.py +++ b/source/__init__.py @@ -23,7 +23,7 @@ module_names = ( "prefs", "hotkeys", "pie_modes_menu", - "pie_views_numpad_menu", + "pie_view_menu", "pie_sculpt_menu", "pie_origin", "pie_manipulator_menu", diff --git a/source/pie_view_menu.py b/source/pie_view_menu.py new file mode 100644 index 0000000..98a25e3 --- /dev/null +++ b/source/pie_view_menu.py @@ -0,0 +1,127 @@ +# SPDX-FileCopyrightText: 2016-2022 Blender Foundation +# +# SPDX-License-Identifier: GPL-2.0-or-later + + +from bpy.types import Menu, Operator +from .hotkeys import register_hotkey + + +class PIE_MT_view_pie(Menu): + bl_idname = "PIE_MT_view_pie" + bl_label = "View Pie" + + def draw(self, context): + pie = self.layout.menu_pie() + + # 4 - LEFT + pie.operator("view3d.camera_to_view", text="Snap Camera to View", icon='CON_CAMERASOLVER') + # 6 - RIGHT + pie.operator('view3d.view_camera', text="View Camera", icon='VIEW_CAMERA') + # 2 - BOTTOM + space = context.area.spaces.active + if space.local_view: + pie.operator("view3d.localview", text="Leave Local View", icon='SOLO_OFF').frame_selected=False + else: + pie.operator("view3d.localview", text="Enter Local View", icon='SOLO_ON').frame_selected=False + # 8 - TOP + pie.operator("screen.region_quadview", text="Toggle Quad View", icon='SNAP_VERTEX') + # 7 - TOP - LEFT + camera = get_current_camera(context) + word = "Lock" + icon = 'UNLOCKED' + if all(camera.lock_rotation) and all(camera.lock_location): + word = "Unlock" + icon = 'LOCKED' + pie.operator('object.lock_current_camera', icon=icon, text=f"{word} Camera Transforms") + # 9 - TOP - RIGHT + pie.operator('view3d.navigate', text="Fly", icon='TRACKER') + # 1 - BOTTOM - LEFT + icon = 'LOCKED' if context.space_data.lock_camera else 'UNLOCKED' + pie.prop(context.space_data, 'lock_camera', icon=icon) + # 3 - BOTTOM - RIGHT + pie.operator('view3d.object_as_camera', icon='VIEW_CAMERA_UNSELECTED') + + +class PIE_MT_window_pie(Menu): + bl_idname = "PIE_MT_window_pie" + bl_label = "Window Pie" + + def draw(self, context): + pie = self.layout.menu_pie() + + # 4 - LEFT + pie.separator() + # 6 - RIGHT + pie.operator("screen.screen_full_area", text="Solo Area", icon='PIVOT_BOUNDBOX') + # 2 - BOTTOM + pie.separator() + # 8 - TOP + pie.operator("wm.window_fullscreen_toggle", text="Window Fullscreen", icon='FULLSCREEN_ENTER') + # 7 - TOP - LEFT + pie.separator() + # 9 - TOP - RIGHT + pie.operator("screen.screen_full_area", text="Maximize Area", icon='PIVOT_BOUNDBOX').use_hide_panels=True + # 1 - BOTTOM - LEFT + pie.separator() + # 3 - BOTTOM - RIGHT + pie.separator() + + +class OBJECT_OT_lock_current_camera(Operator): + bl_idname = "object.lock_current_camera" + bl_label = "Lock Camera Transforms" + bl_description = "Toggle whether the current camera can be transformed" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + if not get_current_camera(context): + cls.poll_message_set("No active camera in this viewport.") + return False + return True + + def execute(self, context): + camera = get_current_camera(context) + + lock = False + if not (all(camera.lock_rotation) and all(camera.lock_location)): + lock = True + + camera.lock_rotation = [lock, lock, lock] + camera.lock_rotation_w = lock + camera.lock_location = [lock, lock, lock] + + word = "Locked" if lock else "Unlocked" + self.report({'INFO'}, f"{word} {camera.name}.") + + return {'FINISHED'} + + +def get_current_camera(context): + space = context.area.spaces.active + if space.type == 'VIEW_3D' and space.use_local_camera: + return space.camera + return context.scene.camera + + +registry = ( + PIE_MT_view_pie, + PIE_MT_window_pie, + OBJECT_OT_lock_current_camera +) + + +def register(): + register_hotkey( + 'wm.call_menu_pie', + op_kwargs={'name': 'PIE_MT_view_pie'}, + hotkey_kwargs={'type': "Q", 'value': "PRESS", 'alt': True}, + key_cat="3D View", + ) + register_hotkey( + 'wm.call_menu_pie', + op_kwargs={'name': 'PIE_MT_window_pie'}, + hotkey_kwargs={'type': "Q", 'value': "PRESS", 'alt': True, 'ctrl': True}, + key_cat="3D View", + ) diff --git a/source/pie_views_numpad_menu.py b/source/pie_views_numpad_menu.py deleted file mode 100644 index b586488..0000000 --- a/source/pie_views_numpad_menu.py +++ /dev/null @@ -1,131 +0,0 @@ -# SPDX-FileCopyrightText: 2016-2022 Blender Foundation -# -# SPDX-License-Identifier: GPL-2.0-or-later - - -import bpy -from bpy.types import ( - Menu, - Operator, -) -from .hotkeys import register_hotkey - - -# Lock Camera Transforms -class PIE_OT_LockTransforms(Operator): - bl_idname = "object.locktransforms" - bl_label = "Lock Object Transforms" - bl_description = ( - "Enable or disable the editing of objects transforms in the 3D View\n" - "Needs an existing Active Object" - ) - bl_options = {'REGISTER', 'UNDO'} - - @classmethod - def poll(cls, context): - return context.active_object is not None - - def execute(self, context): - obj = context.active_object - if obj.lock_rotation[0] is False: - obj.lock_rotation[0] = True - obj.lock_rotation[1] = True - obj.lock_rotation[2] = True - obj.lock_scale[0] = True - obj.lock_scale[1] = True - obj.lock_scale[2] = True - - elif context.object.lock_rotation[0] is True: - obj.lock_rotation[0] = False - obj.lock_rotation[1] = False - obj.lock_rotation[2] = False - obj.lock_scale[0] = False - obj.lock_scale[1] = False - obj.lock_scale[2] = False - - return {'FINISHED'} - - -# Pie views numpad - Q -class PIE_MT_ViewNumpad(Menu): - bl_idname = "PIE_MT_viewnumpad" - bl_label = "Views Pie" - - def draw(self, context): - layout = self.layout - ob = context.active_object - pie = layout.menu_pie() - scene = context.scene - rd = scene.render - - # 4 - LEFT - pie.operator("view3d.view_axis", text="Left", icon='TRIA_LEFT').type = 'LEFT' - # 6 - RIGHT - pie.operator("view3d.view_axis", text="Right", icon='TRIA_RIGHT').type = 'RIGHT' - # 2 - BOTTOM - pie.operator("view3d.view_axis", text="Bottom", icon='TRIA_DOWN').type = ( - 'BOTTOM' - ) - # 8 - TOP - pie.operator("view3d.view_axis", text="Top", icon='TRIA_UP').type = 'TOP' - # 7 - TOP - LEFT - pie.operator("view3d.view_axis", text="Back").type = 'BACK' - # 9 - TOP - RIGHT - pie.operator("view3d.view_axis", text="Front").type = 'FRONT' - # 1 - BOTTOM - LEFT - box = pie.split().column() - - row = box.row(align=True) - row.operator("view3d.view_camera", text="View Cam", icon='HIDE_OFF') - row.operator("view3d.camera_to_view", text="Cam To View", icon='NONE') - - row = box.row(align=True) - if context.space_data.lock_camera is False: - row.operator( - "wm.context_toggle", text="Lock Cam To View", icon='UNLOCKED' - ).data_path = "space_data.lock_camera" - elif context.space_data.lock_camera is True: - row.operator( - "wm.context_toggle", text="Lock Cam to View", icon='LOCKED' - ).data_path = "space_data.lock_camera" - - icon_locked = ( - 'LOCKED' - if ob and ob.lock_rotation[0] is False - else 'UNLOCKED' if ob and ob.lock_rotation[0] is True else 'LOCKED' - ) - - row = box.row(align=True) - row.operator("object.locktransforms", text="Lock Transforms", icon=icon_locked) - - row = box.row(align=True) - row.prop(rd, "use_border", text="Border") - # 3 - BOTTOM - RIGHT - box = pie.split().column() - - row = box.row(align=True) - row.operator("view3d.view_all").center = True - row.operator("view3d.view_selected", text="Selected") - - row = box.row(align=True) - row.operator("view3d.view_persportho", text="Persp/Ortho") - row.operator("view3d.localview", text="Local/Global") - - row = box.row(align=True) - row.operator("screen.region_quadview", text="Toggle Quad") - row.operator("screen.screen_full_area", text="Toggle Full") - - -registry = ( - PIE_MT_ViewNumpad, - PIE_OT_LockTransforms, -) - - -def register(): - register_hotkey( - 'wm.call_menu_pie', - op_kwargs={'name': 'PIE_MT_viewnumpad'}, - hotkey_kwargs={'type': "Q", 'value': "PRESS", 'alt': True}, - key_cat="3D View", - ) -- 2.30.2 From 2a212c7ab162aba8903c3a1f02800e4a6fc0f574 Mon Sep 17 00:00:00 2001 From: Demeter Dzadik Date: Sun, 18 Aug 2024 00:57:38 +0100 Subject: [PATCH 2/6] Split it up to 3 pies: Camera, View, Window --- source/pie_view_menu.py | 144 +++++++++++++++++++++++++++------------- 1 file changed, 98 insertions(+), 46 deletions(-) diff --git a/source/pie_view_menu.py b/source/pie_view_menu.py index 98a25e3..55187a7 100644 --- a/source/pie_view_menu.py +++ b/source/pie_view_menu.py @@ -5,67 +5,57 @@ from bpy.types import Menu, Operator from .hotkeys import register_hotkey +from sys import platform - -class PIE_MT_view_pie(Menu): - bl_idname = "PIE_MT_view_pie" - bl_label = "View Pie" +class PIE_MT_camera_pie(Menu): + bl_idname = "PIE_MT_camera_pie" + bl_label = "Camera Pie" def draw(self, context): pie = self.layout.menu_pie() + scene = context.scene + space = context.area.spaces.active + camera = get_current_camera(context) # 4 - LEFT pie.operator("view3d.camera_to_view", text="Snap Camera to View", icon='CON_CAMERASOLVER') # 6 - RIGHT - pie.operator('view3d.view_camera', text="View Camera", icon='VIEW_CAMERA') + pie.operator('view3d.view_camera', text="View Camera", icon='VIEW_CAMERA_UNSELECTED') # 2 - BOTTOM - space = context.area.spaces.active - if space.local_view: - pie.operator("view3d.localview", text="Leave Local View", icon='SOLO_OFF').frame_selected=False + box = pie.box().column(align=True) + row = box.row() + if space.type == 'VIEW_3D' and space.use_local_camera: + row.prop(space, 'camera') else: - pie.operator("view3d.localview", text="Enter Local View", icon='SOLO_ON').frame_selected=False + row.prop(scene, 'camera') + if camera: + box.prop(camera.data, 'lens') + box.prop(camera.data, 'sensor_width') + row = box.row(align=True) + row.prop(camera.data, 'show_passepartout', text="") + row.prop(camera.data, 'passepartout_alpha') + row = box.row(align=True) + row.prop(camera.data, 'show_composition_thirds') + row.prop(camera.data, 'show_composition_center') + row.prop(camera.data, 'show_composition_center_diagonal', text="Diagonal") + # 8 - TOP - pie.operator("screen.region_quadview", text="Toggle Quad View", icon='SNAP_VERTEX') - # 7 - TOP - LEFT - camera = get_current_camera(context) - word = "Lock" - icon = 'UNLOCKED' - if all(camera.lock_rotation) and all(camera.lock_location): - word = "Unlock" - icon = 'LOCKED' - pie.operator('object.lock_current_camera', icon=icon, text=f"{word} Camera Transforms") - # 9 - TOP - RIGHT - pie.operator('view3d.navigate', text="Fly", icon='TRACKER') - # 1 - BOTTOM - LEFT icon = 'LOCKED' if context.space_data.lock_camera else 'UNLOCKED' pie.prop(context.space_data, 'lock_camera', icon=icon) - # 3 - BOTTOM - RIGHT - pie.operator('view3d.object_as_camera', icon='VIEW_CAMERA_UNSELECTED') - - -class PIE_MT_window_pie(Menu): - bl_idname = "PIE_MT_window_pie" - bl_label = "Window Pie" - - def draw(self, context): - pie = self.layout.menu_pie() - - # 4 - LEFT - pie.separator() - # 6 - RIGHT - pie.operator("screen.screen_full_area", text="Solo Area", icon='PIVOT_BOUNDBOX') - # 2 - BOTTOM - pie.separator() - # 8 - TOP - pie.operator("wm.window_fullscreen_toggle", text="Window Fullscreen", icon='FULLSCREEN_ENTER') # 7 - TOP - LEFT - pie.separator() + if camera: + word = "Lock" + icon = 'UNLOCKED' + if all(camera.lock_rotation) and all(camera.lock_location): + word = "Unlock" + icon = 'LOCKED' + pie.operator('object.lock_current_camera', icon=icon, text=f"{word} Camera Transforms") + else: + pie.separator() # 9 - TOP - RIGHT - pie.operator("screen.screen_full_area", text="Maximize Area", icon='PIVOT_BOUNDBOX').use_hide_panels=True + pie.operator('view3d.object_as_camera', icon='VIEW_CAMERA') # 1 - BOTTOM - LEFT - pie.separator() # 3 - BOTTOM - RIGHT - pie.separator() class OBJECT_OT_lock_current_camera(Operator): @@ -98,6 +88,61 @@ class OBJECT_OT_lock_current_camera(Operator): return {'FINISHED'} +class PIE_MT_view_pie(Menu): + bl_idname = "PIE_MT_view_pie" + bl_label = "View Pie" + + def draw(self, context): + pie = self.layout.menu_pie() + # 4 - LEFT + pie.operator('view3d.render_border', text="Set Render Border", icon='OBJECT_HIDDEN') + # 6 - RIGHT + pie.operator('view3d.view_selected', text="Frame Selected", icon='ZOOM_SELECTED') + # 2 - BOTTOM + pie.operator('view3d.navigate', text="Fly", icon='TRACKER') + # 8 - TOP + pie.operator("screen.region_quadview", text="Toggle Quad View", icon='SNAP_VERTEX') + # 7 - TOP - LEFT + pie.operator('view3d.clip_border', text="Toggle Clipping Border", icon='MOD_BEVEL') + # 9 - TOP - RIGHT + pie.operator('view3d.view_all', text="Frame All", icon='VIEWZOOM').center=False + # 1 - BOTTOM - LEFT + pie.operator('view3d.clear_render_border', text="Clear Render Border", icon='X') + # 3 - BOTTOM - RIGHT + space = context.area.spaces.active + if space.local_view: + pie.operator("view3d.localview", text="Leave Local View", icon='SOLO_OFF').frame_selected=False + else: + pie.operator("view3d.localview", text="Enter Local View", icon='SOLO_ON').frame_selected=False + + +class PIE_MT_window_pie(Menu): + bl_idname = "PIE_MT_window_pie" + bl_label = "Window Pie" + + def draw(self, context): + pie = self.layout.menu_pie() + + # 4 - LEFT + pie.operator('screen.userpref_show', text="Preferences", icon='PREFERENCES') + # 6 - RIGHT + pie.operator("screen.screen_full_area", text="Solo Area", icon='PIVOT_BOUNDBOX') + # 2 - BOTTOM + if platform == 'win32': + pie.operator("wm.console_toggle", icon='CONSOLE') + else: + pie.separator() + # 8 - TOP + pie.operator("wm.window_fullscreen_toggle", text="Window Fullscreen", icon='FULLSCREEN_ENTER') + # 7 - TOP - LEFT + pie.separator() + # 9 - TOP - RIGHT + pie.operator("screen.screen_full_area", text="Maximize Area", icon='PIVOT_BOUNDBOX').use_hide_panels=True + # 1 - BOTTOM - LEFT + # 3 - BOTTOM - RIGHT + + + def get_current_camera(context): space = context.area.spaces.active if space.type == 'VIEW_3D' and space.use_local_camera: @@ -106,6 +151,7 @@ def get_current_camera(context): registry = ( + PIE_MT_camera_pie, PIE_MT_view_pie, PIE_MT_window_pie, OBJECT_OT_lock_current_camera @@ -115,13 +161,19 @@ registry = ( def register(): register_hotkey( 'wm.call_menu_pie', - op_kwargs={'name': 'PIE_MT_view_pie'}, + op_kwargs={'name': 'PIE_MT_camera_pie'}, hotkey_kwargs={'type': "Q", 'value': "PRESS", 'alt': True}, key_cat="3D View", ) register_hotkey( 'wm.call_menu_pie', - op_kwargs={'name': 'PIE_MT_window_pie'}, + op_kwargs={'name': 'PIE_MT_view_pie'}, hotkey_kwargs={'type': "Q", 'value': "PRESS", 'alt': True, 'ctrl': True}, key_cat="3D View", ) + register_hotkey( + 'wm.call_menu_pie', + op_kwargs={'name': 'PIE_MT_window_pie'}, + hotkey_kwargs={'type': "SPACE", 'value': "PRESS", 'ctrl': True}, + key_cat="3D View", + ) -- 2.30.2 From 7340d95e6f203668756b71bae0cf72f918f6be83 Mon Sep 17 00:00:00 2001 From: Demeter Dzadik Date: Sun, 18 Aug 2024 01:11:13 +0100 Subject: [PATCH 3/6] Window pie was not in Window keymap --- source/pie_view_menu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/pie_view_menu.py b/source/pie_view_menu.py index 55187a7..923ef12 100644 --- a/source/pie_view_menu.py +++ b/source/pie_view_menu.py @@ -175,5 +175,5 @@ def register(): 'wm.call_menu_pie', op_kwargs={'name': 'PIE_MT_window_pie'}, hotkey_kwargs={'type': "SPACE", 'value': "PRESS", 'ctrl': True}, - key_cat="3D View", + key_cat="Window", ) -- 2.30.2 From 6d6feab6d83a3066ae4673361f0bdc1280d13769 Mon Sep 17 00:00:00 2001 From: Demeter Dzadik Date: Sat, 17 Aug 2024 23:36:36 +0100 Subject: [PATCH 4/6] Rework View Pie --- source/__init__.py | 3 +- source/pie_view_menu.py | 127 +++++++++++++++++++++++++++++++ source/pie_views_numpad_menu.py | 131 -------------------------------- 3 files changed, 129 insertions(+), 132 deletions(-) create mode 100644 source/pie_view_menu.py delete mode 100644 source/pie_views_numpad_menu.py diff --git a/source/__init__.py b/source/__init__.py index 5b178f0..16f2696 100644 --- a/source/__init__.py +++ b/source/__init__.py @@ -22,7 +22,8 @@ import importlib module_names = ( "prefs", "hotkeys", - "pie_views_numpad_menu", + "pie_modes_menu", + "pie_view_menu", "pie_sculpt_menu", "pie_origin", "pie_manipulator_menu", diff --git a/source/pie_view_menu.py b/source/pie_view_menu.py new file mode 100644 index 0000000..98a25e3 --- /dev/null +++ b/source/pie_view_menu.py @@ -0,0 +1,127 @@ +# SPDX-FileCopyrightText: 2016-2022 Blender Foundation +# +# SPDX-License-Identifier: GPL-2.0-or-later + + +from bpy.types import Menu, Operator +from .hotkeys import register_hotkey + + +class PIE_MT_view_pie(Menu): + bl_idname = "PIE_MT_view_pie" + bl_label = "View Pie" + + def draw(self, context): + pie = self.layout.menu_pie() + + # 4 - LEFT + pie.operator("view3d.camera_to_view", text="Snap Camera to View", icon='CON_CAMERASOLVER') + # 6 - RIGHT + pie.operator('view3d.view_camera', text="View Camera", icon='VIEW_CAMERA') + # 2 - BOTTOM + space = context.area.spaces.active + if space.local_view: + pie.operator("view3d.localview", text="Leave Local View", icon='SOLO_OFF').frame_selected=False + else: + pie.operator("view3d.localview", text="Enter Local View", icon='SOLO_ON').frame_selected=False + # 8 - TOP + pie.operator("screen.region_quadview", text="Toggle Quad View", icon='SNAP_VERTEX') + # 7 - TOP - LEFT + camera = get_current_camera(context) + word = "Lock" + icon = 'UNLOCKED' + if all(camera.lock_rotation) and all(camera.lock_location): + word = "Unlock" + icon = 'LOCKED' + pie.operator('object.lock_current_camera', icon=icon, text=f"{word} Camera Transforms") + # 9 - TOP - RIGHT + pie.operator('view3d.navigate', text="Fly", icon='TRACKER') + # 1 - BOTTOM - LEFT + icon = 'LOCKED' if context.space_data.lock_camera else 'UNLOCKED' + pie.prop(context.space_data, 'lock_camera', icon=icon) + # 3 - BOTTOM - RIGHT + pie.operator('view3d.object_as_camera', icon='VIEW_CAMERA_UNSELECTED') + + +class PIE_MT_window_pie(Menu): + bl_idname = "PIE_MT_window_pie" + bl_label = "Window Pie" + + def draw(self, context): + pie = self.layout.menu_pie() + + # 4 - LEFT + pie.separator() + # 6 - RIGHT + pie.operator("screen.screen_full_area", text="Solo Area", icon='PIVOT_BOUNDBOX') + # 2 - BOTTOM + pie.separator() + # 8 - TOP + pie.operator("wm.window_fullscreen_toggle", text="Window Fullscreen", icon='FULLSCREEN_ENTER') + # 7 - TOP - LEFT + pie.separator() + # 9 - TOP - RIGHT + pie.operator("screen.screen_full_area", text="Maximize Area", icon='PIVOT_BOUNDBOX').use_hide_panels=True + # 1 - BOTTOM - LEFT + pie.separator() + # 3 - BOTTOM - RIGHT + pie.separator() + + +class OBJECT_OT_lock_current_camera(Operator): + bl_idname = "object.lock_current_camera" + bl_label = "Lock Camera Transforms" + bl_description = "Toggle whether the current camera can be transformed" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + if not get_current_camera(context): + cls.poll_message_set("No active camera in this viewport.") + return False + return True + + def execute(self, context): + camera = get_current_camera(context) + + lock = False + if not (all(camera.lock_rotation) and all(camera.lock_location)): + lock = True + + camera.lock_rotation = [lock, lock, lock] + camera.lock_rotation_w = lock + camera.lock_location = [lock, lock, lock] + + word = "Locked" if lock else "Unlocked" + self.report({'INFO'}, f"{word} {camera.name}.") + + return {'FINISHED'} + + +def get_current_camera(context): + space = context.area.spaces.active + if space.type == 'VIEW_3D' and space.use_local_camera: + return space.camera + return context.scene.camera + + +registry = ( + PIE_MT_view_pie, + PIE_MT_window_pie, + OBJECT_OT_lock_current_camera +) + + +def register(): + register_hotkey( + 'wm.call_menu_pie', + op_kwargs={'name': 'PIE_MT_view_pie'}, + hotkey_kwargs={'type': "Q", 'value': "PRESS", 'alt': True}, + key_cat="3D View", + ) + register_hotkey( + 'wm.call_menu_pie', + op_kwargs={'name': 'PIE_MT_window_pie'}, + hotkey_kwargs={'type': "Q", 'value': "PRESS", 'alt': True, 'ctrl': True}, + key_cat="3D View", + ) diff --git a/source/pie_views_numpad_menu.py b/source/pie_views_numpad_menu.py deleted file mode 100644 index b586488..0000000 --- a/source/pie_views_numpad_menu.py +++ /dev/null @@ -1,131 +0,0 @@ -# SPDX-FileCopyrightText: 2016-2022 Blender Foundation -# -# SPDX-License-Identifier: GPL-2.0-or-later - - -import bpy -from bpy.types import ( - Menu, - Operator, -) -from .hotkeys import register_hotkey - - -# Lock Camera Transforms -class PIE_OT_LockTransforms(Operator): - bl_idname = "object.locktransforms" - bl_label = "Lock Object Transforms" - bl_description = ( - "Enable or disable the editing of objects transforms in the 3D View\n" - "Needs an existing Active Object" - ) - bl_options = {'REGISTER', 'UNDO'} - - @classmethod - def poll(cls, context): - return context.active_object is not None - - def execute(self, context): - obj = context.active_object - if obj.lock_rotation[0] is False: - obj.lock_rotation[0] = True - obj.lock_rotation[1] = True - obj.lock_rotation[2] = True - obj.lock_scale[0] = True - obj.lock_scale[1] = True - obj.lock_scale[2] = True - - elif context.object.lock_rotation[0] is True: - obj.lock_rotation[0] = False - obj.lock_rotation[1] = False - obj.lock_rotation[2] = False - obj.lock_scale[0] = False - obj.lock_scale[1] = False - obj.lock_scale[2] = False - - return {'FINISHED'} - - -# Pie views numpad - Q -class PIE_MT_ViewNumpad(Menu): - bl_idname = "PIE_MT_viewnumpad" - bl_label = "Views Pie" - - def draw(self, context): - layout = self.layout - ob = context.active_object - pie = layout.menu_pie() - scene = context.scene - rd = scene.render - - # 4 - LEFT - pie.operator("view3d.view_axis", text="Left", icon='TRIA_LEFT').type = 'LEFT' - # 6 - RIGHT - pie.operator("view3d.view_axis", text="Right", icon='TRIA_RIGHT').type = 'RIGHT' - # 2 - BOTTOM - pie.operator("view3d.view_axis", text="Bottom", icon='TRIA_DOWN').type = ( - 'BOTTOM' - ) - # 8 - TOP - pie.operator("view3d.view_axis", text="Top", icon='TRIA_UP').type = 'TOP' - # 7 - TOP - LEFT - pie.operator("view3d.view_axis", text="Back").type = 'BACK' - # 9 - TOP - RIGHT - pie.operator("view3d.view_axis", text="Front").type = 'FRONT' - # 1 - BOTTOM - LEFT - box = pie.split().column() - - row = box.row(align=True) - row.operator("view3d.view_camera", text="View Cam", icon='HIDE_OFF') - row.operator("view3d.camera_to_view", text="Cam To View", icon='NONE') - - row = box.row(align=True) - if context.space_data.lock_camera is False: - row.operator( - "wm.context_toggle", text="Lock Cam To View", icon='UNLOCKED' - ).data_path = "space_data.lock_camera" - elif context.space_data.lock_camera is True: - row.operator( - "wm.context_toggle", text="Lock Cam to View", icon='LOCKED' - ).data_path = "space_data.lock_camera" - - icon_locked = ( - 'LOCKED' - if ob and ob.lock_rotation[0] is False - else 'UNLOCKED' if ob and ob.lock_rotation[0] is True else 'LOCKED' - ) - - row = box.row(align=True) - row.operator("object.locktransforms", text="Lock Transforms", icon=icon_locked) - - row = box.row(align=True) - row.prop(rd, "use_border", text="Border") - # 3 - BOTTOM - RIGHT - box = pie.split().column() - - row = box.row(align=True) - row.operator("view3d.view_all").center = True - row.operator("view3d.view_selected", text="Selected") - - row = box.row(align=True) - row.operator("view3d.view_persportho", text="Persp/Ortho") - row.operator("view3d.localview", text="Local/Global") - - row = box.row(align=True) - row.operator("screen.region_quadview", text="Toggle Quad") - row.operator("screen.screen_full_area", text="Toggle Full") - - -registry = ( - PIE_MT_ViewNumpad, - PIE_OT_LockTransforms, -) - - -def register(): - register_hotkey( - 'wm.call_menu_pie', - op_kwargs={'name': 'PIE_MT_viewnumpad'}, - hotkey_kwargs={'type': "Q", 'value': "PRESS", 'alt': True}, - key_cat="3D View", - ) -- 2.30.2 From 66cc922af2187bbce5023ca8dcd07c102e32e5d6 Mon Sep 17 00:00:00 2001 From: Demeter Dzadik Date: Sun, 18 Aug 2024 00:57:38 +0100 Subject: [PATCH 5/6] Split it up to 3 pies: Camera, View, Window --- source/pie_view_menu.py | 144 +++++++++++++++++++++++++++------------- 1 file changed, 98 insertions(+), 46 deletions(-) diff --git a/source/pie_view_menu.py b/source/pie_view_menu.py index 98a25e3..55187a7 100644 --- a/source/pie_view_menu.py +++ b/source/pie_view_menu.py @@ -5,67 +5,57 @@ from bpy.types import Menu, Operator from .hotkeys import register_hotkey +from sys import platform - -class PIE_MT_view_pie(Menu): - bl_idname = "PIE_MT_view_pie" - bl_label = "View Pie" +class PIE_MT_camera_pie(Menu): + bl_idname = "PIE_MT_camera_pie" + bl_label = "Camera Pie" def draw(self, context): pie = self.layout.menu_pie() + scene = context.scene + space = context.area.spaces.active + camera = get_current_camera(context) # 4 - LEFT pie.operator("view3d.camera_to_view", text="Snap Camera to View", icon='CON_CAMERASOLVER') # 6 - RIGHT - pie.operator('view3d.view_camera', text="View Camera", icon='VIEW_CAMERA') + pie.operator('view3d.view_camera', text="View Camera", icon='VIEW_CAMERA_UNSELECTED') # 2 - BOTTOM - space = context.area.spaces.active - if space.local_view: - pie.operator("view3d.localview", text="Leave Local View", icon='SOLO_OFF').frame_selected=False + box = pie.box().column(align=True) + row = box.row() + if space.type == 'VIEW_3D' and space.use_local_camera: + row.prop(space, 'camera') else: - pie.operator("view3d.localview", text="Enter Local View", icon='SOLO_ON').frame_selected=False + row.prop(scene, 'camera') + if camera: + box.prop(camera.data, 'lens') + box.prop(camera.data, 'sensor_width') + row = box.row(align=True) + row.prop(camera.data, 'show_passepartout', text="") + row.prop(camera.data, 'passepartout_alpha') + row = box.row(align=True) + row.prop(camera.data, 'show_composition_thirds') + row.prop(camera.data, 'show_composition_center') + row.prop(camera.data, 'show_composition_center_diagonal', text="Diagonal") + # 8 - TOP - pie.operator("screen.region_quadview", text="Toggle Quad View", icon='SNAP_VERTEX') - # 7 - TOP - LEFT - camera = get_current_camera(context) - word = "Lock" - icon = 'UNLOCKED' - if all(camera.lock_rotation) and all(camera.lock_location): - word = "Unlock" - icon = 'LOCKED' - pie.operator('object.lock_current_camera', icon=icon, text=f"{word} Camera Transforms") - # 9 - TOP - RIGHT - pie.operator('view3d.navigate', text="Fly", icon='TRACKER') - # 1 - BOTTOM - LEFT icon = 'LOCKED' if context.space_data.lock_camera else 'UNLOCKED' pie.prop(context.space_data, 'lock_camera', icon=icon) - # 3 - BOTTOM - RIGHT - pie.operator('view3d.object_as_camera', icon='VIEW_CAMERA_UNSELECTED') - - -class PIE_MT_window_pie(Menu): - bl_idname = "PIE_MT_window_pie" - bl_label = "Window Pie" - - def draw(self, context): - pie = self.layout.menu_pie() - - # 4 - LEFT - pie.separator() - # 6 - RIGHT - pie.operator("screen.screen_full_area", text="Solo Area", icon='PIVOT_BOUNDBOX') - # 2 - BOTTOM - pie.separator() - # 8 - TOP - pie.operator("wm.window_fullscreen_toggle", text="Window Fullscreen", icon='FULLSCREEN_ENTER') # 7 - TOP - LEFT - pie.separator() + if camera: + word = "Lock" + icon = 'UNLOCKED' + if all(camera.lock_rotation) and all(camera.lock_location): + word = "Unlock" + icon = 'LOCKED' + pie.operator('object.lock_current_camera', icon=icon, text=f"{word} Camera Transforms") + else: + pie.separator() # 9 - TOP - RIGHT - pie.operator("screen.screen_full_area", text="Maximize Area", icon='PIVOT_BOUNDBOX').use_hide_panels=True + pie.operator('view3d.object_as_camera', icon='VIEW_CAMERA') # 1 - BOTTOM - LEFT - pie.separator() # 3 - BOTTOM - RIGHT - pie.separator() class OBJECT_OT_lock_current_camera(Operator): @@ -98,6 +88,61 @@ class OBJECT_OT_lock_current_camera(Operator): return {'FINISHED'} +class PIE_MT_view_pie(Menu): + bl_idname = "PIE_MT_view_pie" + bl_label = "View Pie" + + def draw(self, context): + pie = self.layout.menu_pie() + # 4 - LEFT + pie.operator('view3d.render_border', text="Set Render Border", icon='OBJECT_HIDDEN') + # 6 - RIGHT + pie.operator('view3d.view_selected', text="Frame Selected", icon='ZOOM_SELECTED') + # 2 - BOTTOM + pie.operator('view3d.navigate', text="Fly", icon='TRACKER') + # 8 - TOP + pie.operator("screen.region_quadview", text="Toggle Quad View", icon='SNAP_VERTEX') + # 7 - TOP - LEFT + pie.operator('view3d.clip_border', text="Toggle Clipping Border", icon='MOD_BEVEL') + # 9 - TOP - RIGHT + pie.operator('view3d.view_all', text="Frame All", icon='VIEWZOOM').center=False + # 1 - BOTTOM - LEFT + pie.operator('view3d.clear_render_border', text="Clear Render Border", icon='X') + # 3 - BOTTOM - RIGHT + space = context.area.spaces.active + if space.local_view: + pie.operator("view3d.localview", text="Leave Local View", icon='SOLO_OFF').frame_selected=False + else: + pie.operator("view3d.localview", text="Enter Local View", icon='SOLO_ON').frame_selected=False + + +class PIE_MT_window_pie(Menu): + bl_idname = "PIE_MT_window_pie" + bl_label = "Window Pie" + + def draw(self, context): + pie = self.layout.menu_pie() + + # 4 - LEFT + pie.operator('screen.userpref_show', text="Preferences", icon='PREFERENCES') + # 6 - RIGHT + pie.operator("screen.screen_full_area", text="Solo Area", icon='PIVOT_BOUNDBOX') + # 2 - BOTTOM + if platform == 'win32': + pie.operator("wm.console_toggle", icon='CONSOLE') + else: + pie.separator() + # 8 - TOP + pie.operator("wm.window_fullscreen_toggle", text="Window Fullscreen", icon='FULLSCREEN_ENTER') + # 7 - TOP - LEFT + pie.separator() + # 9 - TOP - RIGHT + pie.operator("screen.screen_full_area", text="Maximize Area", icon='PIVOT_BOUNDBOX').use_hide_panels=True + # 1 - BOTTOM - LEFT + # 3 - BOTTOM - RIGHT + + + def get_current_camera(context): space = context.area.spaces.active if space.type == 'VIEW_3D' and space.use_local_camera: @@ -106,6 +151,7 @@ def get_current_camera(context): registry = ( + PIE_MT_camera_pie, PIE_MT_view_pie, PIE_MT_window_pie, OBJECT_OT_lock_current_camera @@ -115,13 +161,19 @@ registry = ( def register(): register_hotkey( 'wm.call_menu_pie', - op_kwargs={'name': 'PIE_MT_view_pie'}, + op_kwargs={'name': 'PIE_MT_camera_pie'}, hotkey_kwargs={'type': "Q", 'value': "PRESS", 'alt': True}, key_cat="3D View", ) register_hotkey( 'wm.call_menu_pie', - op_kwargs={'name': 'PIE_MT_window_pie'}, + op_kwargs={'name': 'PIE_MT_view_pie'}, hotkey_kwargs={'type': "Q", 'value': "PRESS", 'alt': True, 'ctrl': True}, key_cat="3D View", ) + register_hotkey( + 'wm.call_menu_pie', + op_kwargs={'name': 'PIE_MT_window_pie'}, + hotkey_kwargs={'type': "SPACE", 'value': "PRESS", 'ctrl': True}, + key_cat="3D View", + ) -- 2.30.2 From 1a13484f5d335fb1a082ee1478433f1e7ceb5718 Mon Sep 17 00:00:00 2001 From: Demeter Dzadik Date: Sun, 18 Aug 2024 01:11:13 +0100 Subject: [PATCH 6/6] Window pie was not in Window keymap --- source/pie_view_menu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/pie_view_menu.py b/source/pie_view_menu.py index 55187a7..923ef12 100644 --- a/source/pie_view_menu.py +++ b/source/pie_view_menu.py @@ -175,5 +175,5 @@ def register(): 'wm.call_menu_pie', op_kwargs={'name': 'PIE_MT_window_pie'}, hotkey_kwargs={'type': "SPACE", 'value': "PRESS", 'ctrl': True}, - key_cat="3D View", + key_cat="Window", ) -- 2.30.2