Rework/New: Camera, 3D View, Window Pies #8
@ -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",
|
||||
|
179
source/pie_view_menu.py
Normal file
179
source/pie_view_menu.py
Normal file
@ -0,0 +1,179 @@
|
||||
# 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
|
||||
from sys import platform
|
||||
|
||||
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_UNSELECTED')
|
||||
# 2 - BOTTOM
|
||||
box = pie.box().column(align=True)
|
||||
row = box.row()
|
||||
if space.type == 'VIEW_3D' and space.use_local_camera:
|
||||
row.prop(space, 'camera')
|
||||
else:
|
||||
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
|
||||
icon = 'LOCKED' if context.space_data.lock_camera else 'UNLOCKED'
|
||||
pie.prop(context.space_data, 'lock_camera', icon=icon)
|
||||
# 7 - TOP - LEFT
|
||||
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('view3d.object_as_camera', icon='VIEW_CAMERA')
|
||||
# 1 - BOTTOM - LEFT
|
||||
# 3 - BOTTOM - RIGHT
|
||||
|
||||
|
||||
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'}
|
||||
|
||||
|
||||
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:
|
||||
return space.camera
|
||||
return context.scene.camera
|
||||
|
||||
|
||||
registry = (
|
||||
PIE_MT_camera_pie,
|
||||
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_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_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="Window",
|
||||
)
|
@ -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",
|
||||
)
|
Loading…
Reference in New Issue
Block a user