3D Navigation: Update panel Rename, fix the view_pan context
Bumped version to 1.2.2 Pep8 cleanup As a part of the task T50726: Update the Panel rename code to more generic one Small cleanup merge the pan Operators into one fix the error with the invoke context of the view_pan needed INVOKE_REGION_WIN to be passed on
This commit is contained in:
parent
91083be457
commit
04a688cca5
|
@ -2,7 +2,7 @@
|
|||
#
|
||||
# THIS SCRIPT IS LICENSED UNDER GPL,
|
||||
# please read the license block.
|
||||
#
|
||||
|
||||
# ##### BEGIN GPL LICENSE BLOCK #####
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
|
@ -25,203 +25,198 @@
|
|||
bl_info = {
|
||||
"name": "3D Navigation",
|
||||
"author": "Demohero, uriel",
|
||||
"version": (1, 2, 1),
|
||||
"version": (1, 2, 2),
|
||||
"blender": (2, 77, 0),
|
||||
"location": "View3D > Tool Shelf > Display Tab",
|
||||
"description": "Navigate the Camera & 3D View from the Toolshelf",
|
||||
"warning": "",
|
||||
"wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
|
||||
"wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/"
|
||||
"Scripts/3D_interaction/3D_Navigation",
|
||||
"category": "3D View",
|
||||
}
|
||||
|
||||
# import the basic library
|
||||
import bpy
|
||||
from bpy.types import (
|
||||
AddonPreferences,
|
||||
Operator,
|
||||
Panel,
|
||||
)
|
||||
from bpy.props import StringProperty
|
||||
|
||||
|
||||
# main class of this toolbar
|
||||
|
||||
## re-ordered (reversed) Orbit Operators
|
||||
class OrbitUpView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.orbit_up_view1'
|
||||
bl_label = 'Orbit Up View'
|
||||
bl_description = 'Orbit the view towards you'
|
||||
# re-ordered (reversed) Orbit Operators
|
||||
class OrbitUpView1(Operator):
|
||||
bl_idname = "opr.orbit_up_view1"
|
||||
bl_label = "Orbit Up View"
|
||||
bl_description = "Orbit the view towards you"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.view_orbit(type='ORBITUP')
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class OrbitLeftView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.orbit_left_view1'
|
||||
bl_label = 'Orbit Left View'
|
||||
bl_description = 'Orbit the view around to your Right'
|
||||
class OrbitLeftView1(Operator):
|
||||
bl_idname = "opr.orbit_left_view1"
|
||||
bl_label = "Orbit Left View"
|
||||
bl_description = "Orbit the view around to your Right"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.view_orbit(type='ORBITLEFT')
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class OrbitRightView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.orbit_right_view1'
|
||||
bl_label = 'Orbit Right View'
|
||||
bl_description = 'Orbit the view around to your Left'
|
||||
class OrbitRightView1(Operator):
|
||||
bl_idname = "opr.orbit_right_view1"
|
||||
bl_label = "Orbit Right View"
|
||||
bl_description = "Orbit the view around to your Left"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.view_orbit(type='ORBITRIGHT')
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class OrbitDownView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.orbit_down_view1'
|
||||
bl_label = 'Orbit Down View'
|
||||
bl_description = 'Orbit the view away from you'
|
||||
class OrbitDownView1(Operator):
|
||||
bl_idname = "opr.orbit_down_view1"
|
||||
bl_label = "Orbit Down View"
|
||||
bl_description = "Orbit the view away from you"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.view_orbit(type='ORBITDOWN')
|
||||
return {'FINISHED'}
|
||||
|
||||
## re-ordered (reversed) Pan Operators
|
||||
class PanUpView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.pan_up_view1'
|
||||
bl_label = 'Pan Up View'
|
||||
bl_description = 'Pan the view Down'
|
||||
|
||||
# re-ordered (reversed) Pan Operators
|
||||
# just pass the enum from the VIEW3D_PT_pan_navigation1 Panel
|
||||
class PanUpViewsAll(Operator):
|
||||
bl_idname = "opr.pan_up_views_all"
|
||||
bl_label = "Pan View"
|
||||
bl_description = "Pan the 3D View"
|
||||
|
||||
panning = StringProperty(
|
||||
default="PANUP",
|
||||
options={"HIDDEN"}
|
||||
)
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.view_pan(type='PANUP')
|
||||
try:
|
||||
bpy.ops.view3d.view_pan("INVOKE_REGION_WIN", type=self.panning)
|
||||
except Exception as e:
|
||||
self.report({"WARNING"},
|
||||
"Pan Views could not be completed. Operation Cancelled")
|
||||
print("\n[3D Navigation]\nOperator: opr.pan_up_views_all\n {}\n".format(e))
|
||||
|
||||
return {"CANCELLED"}
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class PanLeftView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.pan_left_view1'
|
||||
bl_label = 'Pan Right View'
|
||||
bl_description = 'Pan the view to your Right'
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.view_pan(type='PANLEFT')
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class PanRightView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.pan_right_view1'
|
||||
bl_label = 'Pan Left View'
|
||||
bl_description = 'Pan the view to your Left'
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.view_pan(type='PANRIGHT')
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class PanDownView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.pan_down_view1'
|
||||
bl_label = 'Pan Down View'
|
||||
bl_description = 'Pan the view Up'
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.view_pan(type='PANDOWN')
|
||||
return {'FINISHED'}
|
||||
|
||||
## Zoom Operators
|
||||
class ZoomInView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.zoom_in_view1'
|
||||
bl_label = 'Zoom In View'
|
||||
bl_description = 'Zoom In the View/Camera View'
|
||||
# Zoom Operators
|
||||
class ZoomInView1(Operator):
|
||||
bl_idname = "opr.zoom_in_view1"
|
||||
bl_label = "Zoom In View"
|
||||
bl_description = "Zoom In the View/Camera View"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.zoom(delta=1)
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class ZoomOutView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.zoom_out_view1'
|
||||
bl_label = 'Zoom Out View'
|
||||
bl_description = 'Zoom out In the View/Camera View'
|
||||
class ZoomOutView1(Operator):
|
||||
bl_idname = "opr.zoom_out_view1"
|
||||
bl_label = "Zoom Out View"
|
||||
bl_description = "Zoom out In the View/Camera View"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.zoom(delta=-1)
|
||||
return {'FINISHED'}
|
||||
|
||||
## Roll Operators
|
||||
class RollLeftView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.roll_left_view1'
|
||||
bl_label = 'Roll Left View'
|
||||
bl_description = 'Roll the view Left'
|
||||
|
||||
# Roll Operators
|
||||
class RollLeftView1(Operator):
|
||||
bl_idname = "opr.roll_left_view1"
|
||||
bl_label = "Roll Left View"
|
||||
bl_description = "Roll the view Left"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.view_roll(angle=-0.261799)
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class RollRightView1(bpy.types.Operator):
|
||||
bl_idname = 'opr.roll_right_view1'
|
||||
bl_label = 'Roll Right View'
|
||||
bl_description = 'Roll the view Right'
|
||||
class RollRightView1(Operator):
|
||||
bl_idname = "opr.roll_right_view1"
|
||||
bl_label = "Roll Right View"
|
||||
bl_description = "Roll the view Right"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.view_roll(angle=0.261799)
|
||||
return {'FINISHED'}
|
||||
|
||||
## View Operators
|
||||
class LeftViewpoint1(bpy.types.Operator):
|
||||
bl_idname = 'opr.left_viewpoint1'
|
||||
bl_label = 'Left Viewpoint'
|
||||
bl_description = 'View from the Left'
|
||||
|
||||
# View Operators
|
||||
class LeftViewpoint1(Operator):
|
||||
bl_idname = "opr.left_viewpoint1"
|
||||
bl_label = "Left Viewpoint"
|
||||
bl_description = "View from the Left"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.viewnumpad(type='LEFT')
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class RightViewpoint1(bpy.types.Operator):
|
||||
bl_idname = 'opr.right_viewpoint1'
|
||||
bl_label = 'Right Viewpoint'
|
||||
bl_description = 'View from the Right'
|
||||
class RightViewpoint1(Operator):
|
||||
bl_idname = "opr.right_viewpoint1"
|
||||
bl_label = "Right Viewpoint"
|
||||
bl_description = "View from the Right"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.viewnumpad(type='RIGHT')
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class FrontViewpoint1(bpy.types.Operator):
|
||||
bl_idname = 'opr.front_viewpoint1'
|
||||
bl_label = 'Front Viewpoint'
|
||||
bl_description = 'View from the Front'
|
||||
class FrontViewpoint1(Operator):
|
||||
bl_idname = "opr.front_viewpoint1"
|
||||
bl_label = "Front Viewpoint"
|
||||
bl_description = "View from the Front"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.viewnumpad(type='FRONT')
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class BackViewpoint1(bpy.types.Operator):
|
||||
bl_idname = 'opr.back_viewpoint1'
|
||||
bl_label = 'Back Viewpoint'
|
||||
bl_description = 'View from the Back'
|
||||
class BackViewpoint1(Operator):
|
||||
bl_idname = "opr.back_viewpoint1"
|
||||
bl_label = "Back Viewpoint"
|
||||
bl_description = "View from the Back"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.viewnumpad(type='BACK')
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class TopViewpoint1(bpy.types.Operator):
|
||||
bl_idname = 'opr.top_viewpoint1'
|
||||
bl_label = 'Top Viewpoint'
|
||||
bl_description = 'View from the Top'
|
||||
class TopViewpoint1(Operator):
|
||||
bl_idname = "opr.top_viewpoint1"
|
||||
bl_label = "Top Viewpoint"
|
||||
bl_description = "View from the Top"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.viewnumpad(type='TOP')
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class BottomViewpoint1(bpy.types.Operator):
|
||||
bl_idname = 'opr.bottom_viewpoint1'
|
||||
bl_label = 'Bottom Viewpoint'
|
||||
bl_description = 'View from the Bottom'
|
||||
class BottomViewpoint1(Operator):
|
||||
bl_idname = "opr.bottom_viewpoint1"
|
||||
bl_label = "Bottom Viewpoint"
|
||||
bl_description = "View from the Bottom"
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.view3d.viewnumpad(type='BOTTOM')
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
# Panel class of this toolbar
|
||||
class VIEW3D_PT_3dnavigationPanel(bpy.types.Panel):
|
||||
class VIEW3D_PT_3dnavigationPanel(Panel):
|
||||
bl_category = "Display"
|
||||
bl_space_type = "VIEW_3D"
|
||||
bl_region_type = "TOOLS"
|
||||
|
@ -231,15 +226,15 @@ class VIEW3D_PT_3dnavigationPanel(bpy.types.Panel):
|
|||
layout = self.layout
|
||||
view = context.space_data
|
||||
|
||||
# Triple boutons
|
||||
# Triple buttons
|
||||
col = layout.column(align=True)
|
||||
col.operator("view3d.localview", text="View Global/Local")
|
||||
col.operator("view3d.view_persportho", text="View Persp/Ortho")
|
||||
col.operator("view3d.localview", text="View Global / Local")
|
||||
col.operator("view3d.view_persportho", text="View Persp / Ortho")
|
||||
col.operator("view3d.viewnumpad", text="View Camera", icon='CAMERA_DATA').type = 'CAMERA'
|
||||
|
||||
# group of 6 buttons
|
||||
# group of 6 buttons
|
||||
col = layout.column(align=True)
|
||||
col.label(text="Align view from:")
|
||||
col.label(text="Align view from:", icon="VIEW3D")
|
||||
row = col.row()
|
||||
row.operator("view3d.viewnumpad", text="Front").type = 'FRONT'
|
||||
row.operator("view3d.viewnumpad", text="Back").type = 'BACK'
|
||||
|
@ -250,106 +245,123 @@ class VIEW3D_PT_3dnavigationPanel(bpy.types.Panel):
|
|||
row.operator("view3d.viewnumpad", text="Top").type = 'TOP'
|
||||
row.operator("view3d.viewnumpad", text="Bottom").type = 'BOTTOM'
|
||||
|
||||
# group of 2 buttons
|
||||
# group of 2 buttons
|
||||
col = layout.column(align=True)
|
||||
col.label(text="Lock View to Object:")
|
||||
col.label(text="Lock View to Object:", icon="LOCKED")
|
||||
col.prop(view, "lock_object", text="")
|
||||
col.operator("view3d.view_selected", text="View to Selected")
|
||||
|
||||
col = layout.column(align=True)
|
||||
col.label(text="Cursor:")
|
||||
row = col.row()
|
||||
col.label(text="Cursor:", icon="CURSOR")
|
||||
row = col.row(align=True)
|
||||
row.operator("view3d.snap_cursor_to_center", text="Center")
|
||||
row.operator("view3d.view_center_cursor", text="View")
|
||||
col.operator("view3d.snap_cursor_to_selected", text="Cursor to Selected")
|
||||
|
||||
|
||||
class VIEW3D_PT_pan_navigation1(bpy.types.Panel):
|
||||
bl_idname = 'pan.navigation1'
|
||||
bl_label = 'Pan Orbit Zoom Roll'
|
||||
bl_space_type = 'VIEW_3D'
|
||||
bl_region_type = 'TOOLS'
|
||||
bl_category = 'Display'
|
||||
class VIEW3D_PT_pan_navigation1(Panel):
|
||||
bl_idname = "pan.navigation1"
|
||||
bl_label = "Pan Orbit Zoom Roll"
|
||||
bl_space_type = "VIEW_3D"
|
||||
bl_region_type = "TOOLS"
|
||||
bl_category = "Display"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
layout.label(text='Screen View Perspective')
|
||||
layout.label(text="Screen View Perspective")
|
||||
|
||||
row = layout.row()
|
||||
row.label(text='Pan:')
|
||||
row.label(text="Pan:")
|
||||
row = layout.row()
|
||||
row.operator('opr.pan_down_view1', text='Up', icon='TRIA_UP')
|
||||
row.operator('opr.pan_up_view1', text='Down', icon='TRIA_DOWN')
|
||||
|
||||
row.operator("opr.pan_up_views_all", text="Up",
|
||||
icon="TRIA_UP").panning = "PANDOWN"
|
||||
row.operator("opr.pan_up_views_all", text="Down",
|
||||
icon="TRIA_DOWN").panning = "PANUP"
|
||||
|
||||
row = layout.row()
|
||||
row.operator('opr.pan_right_view1', text='Left', icon='BACK')
|
||||
row.operator('opr.pan_left_view1', text='Right', icon='FORWARD')
|
||||
row.operator("opr.pan_up_views_all", text="Left",
|
||||
icon="BACK").panning = "PANRIGHT"
|
||||
row.operator("opr.pan_up_views_all", text="Right",
|
||||
icon="FORWARD").panning = "PANLEFT"
|
||||
|
||||
row = layout.row()
|
||||
row.label(text='Orbit:')
|
||||
row.label(text="Orbit:")
|
||||
row = layout.row()
|
||||
row.operator('opr.orbit_down_view1', text='Up', icon='TRIA_UP')
|
||||
row.operator('opr.orbit_up_view1', text='Down', icon='TRIA_DOWN')
|
||||
row.operator("opr.orbit_down_view1", text="Up", icon="TRIA_UP")
|
||||
row.operator("opr.orbit_up_view1", text="Down", icon="TRIA_DOWN")
|
||||
|
||||
row = layout.row()
|
||||
row.operator('opr.orbit_right_view1', text='Left', icon='BACK')
|
||||
row.operator('opr.orbit_left_view1', text='Right', icon='FORWARD')
|
||||
row.operator("opr.orbit_right_view1", text="Left", icon="BACK")
|
||||
row.operator("opr.orbit_left_view1", text="Right", icon="FORWARD")
|
||||
|
||||
row = layout.row()
|
||||
row.label(text='Zoom:')
|
||||
row.label(text="Zoom:")
|
||||
row = layout.row()
|
||||
row.operator('opr.zoom_in_view1', text='In', icon='ZOOMIN')
|
||||
row.operator('opr.zoom_out_view1', text='Out', icon='ZOOMOUT')
|
||||
row.operator("opr.zoom_in_view1", text="In", icon="ZOOMIN")
|
||||
row.operator("opr.zoom_out_view1", text="Out", icon="ZOOMOUT")
|
||||
|
||||
row = layout.row()
|
||||
row.label(text='Roll:')
|
||||
row.label(text="Roll:")
|
||||
row = layout.row()
|
||||
row.operator('opr.roll_left_view1', text='Left', icon='LOOP_BACK')
|
||||
row.operator('opr.roll_right_view1', text='Right', icon='LOOP_FORWARDS')
|
||||
row.operator("opr.roll_left_view1", text="Left", icon="LOOP_BACK")
|
||||
row.operator("opr.roll_right_view1", text="Right", icon="LOOP_FORWARDS")
|
||||
|
||||
|
||||
# Add-ons Preferences Update Panel
|
||||
|
||||
# Define Panel classes for updating
|
||||
panels = (
|
||||
VIEW3D_PT_3dnavigationPanel,
|
||||
VIEW3D_PT_pan_navigation1,
|
||||
)
|
||||
|
||||
|
||||
## Addons Preferences Update Panel
|
||||
def update_panel(self, context):
|
||||
message = ": Updating Panel locations has failed"
|
||||
try:
|
||||
bpy.utils.unregister_class(VIEW3D_PT_3dnavigationPanel)
|
||||
bpy.utils.unregister_class(VIEW3D_PT_pan_navigation1)
|
||||
except:
|
||||
pass
|
||||
VIEW3D_PT_3dnavigationPanel.bl_category = context.user_preferences.addons[__name__].preferences.category
|
||||
bpy.utils.register_class(VIEW3D_PT_3dnavigationPanel)
|
||||
VIEW3D_PT_pan_navigation1.bl_category = context.user_preferences.addons[__name__].preferences.category
|
||||
bpy.utils.register_class(VIEW3D_PT_pan_navigation1)
|
||||
for panel in panels:
|
||||
if "bl_rna" in panel.__dict__:
|
||||
bpy.utils.unregister_class(panel)
|
||||
|
||||
class NavAddonPreferences(bpy.types.AddonPreferences):
|
||||
for panel in panels:
|
||||
panel.bl_category = context.user_preferences.addons[__name__].preferences.category
|
||||
bpy.utils.register_class(panel)
|
||||
|
||||
except Exception as e:
|
||||
print("\n[{}]\n{}\n\nError:\n{}".format(__name__, message, e))
|
||||
pass
|
||||
|
||||
|
||||
class NavAddonPreferences(AddonPreferences):
|
||||
# this must match the addon name, use '__package__'
|
||||
# when defining this in a submodule of a python package.
|
||||
bl_idname = __name__
|
||||
|
||||
category = bpy.props.StringProperty(
|
||||
category = StringProperty(
|
||||
name="Tab Category",
|
||||
description="Choose a name for the category of the panel",
|
||||
default="Display",
|
||||
update=update_panel)
|
||||
update=update_panel
|
||||
)
|
||||
|
||||
def draw(self, context):
|
||||
|
||||
layout = self.layout
|
||||
|
||||
row = layout.row()
|
||||
col = row.column()
|
||||
col.label(text="Tab Category:")
|
||||
col.prop(self, "category", text="")
|
||||
|
||||
classes = [
|
||||
|
||||
classes = (
|
||||
VIEW3D_PT_3dnavigationPanel,
|
||||
VIEW3D_PT_pan_navigation1,
|
||||
OrbitUpView1,
|
||||
OrbitLeftView1,
|
||||
OrbitRightView1,
|
||||
OrbitDownView1,
|
||||
PanUpView1,
|
||||
PanLeftView1,
|
||||
PanRightView1,
|
||||
PanDownView1,
|
||||
ZoomInView1,
|
||||
ZoomOutView1,
|
||||
RollLeftView1,
|
||||
|
@ -361,17 +373,21 @@ classes = [
|
|||
TopViewpoint1,
|
||||
BottomViewpoint1,
|
||||
NavAddonPreferences,
|
||||
]
|
||||
PanUpViewsAll,
|
||||
)
|
||||
|
||||
# register the class
|
||||
|
||||
# Register
|
||||
def register():
|
||||
for cls in classes:
|
||||
bpy.utils.register_class(cls)
|
||||
update_panel(None, bpy.context)
|
||||
|
||||
|
||||
def unregister():
|
||||
for cls in classes:
|
||||
bpy.utils.unregister_class(cls)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
register()
|
||||
|
|
Loading…
Reference in New Issue