diff options
author | lijenstina <lijenstina@gmail.com> | 2017-05-31 07:26:08 +0300 |
---|---|---|
committer | lijenstina <lijenstina@gmail.com> | 2017-05-31 07:26:08 +0300 |
commit | 04a688cca54be0280491a81089310b88d11683ba (patch) | |
tree | f461d4d21c46d7e7a83b1d2b7337652392c5498d /space_view3d_3d_navigation.py | |
parent | 91083be457c2c76463db8e5a9f9f3bee677dacdc (diff) |
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
Diffstat (limited to 'space_view3d_3d_navigation.py')
-rw-r--r-- | space_view3d_3d_navigation.py | 310 |
1 files changed, 163 insertions, 147 deletions
diff --git a/space_view3d_3d_navigation.py b/space_view3d_3d_navigation.py index 9218d5f5..a4c359cc 100644 --- a/space_view3d_3d_navigation.py +++ b/space_view3d_3d_navigation.py @@ -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' - def execute(self, context): - bpy.ops.view3d.view_pan(type='PANUP') - return {'FINISHED'} +# 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" - -class PanLeftView1(bpy.types.Operator): - bl_idname = 'opr.pan_left_view1' - bl_label = 'Pan Right View' - bl_description = 'Pan the view to your Right' + panning = StringProperty( + default="PANUP", + options={"HIDDEN"} + ) def execute(self, context): - bpy.ops.view3d.view_pan(type='PANLEFT') - return {'FINISHED'} + 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"} -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: + for panel in panels: + if "bl_rna" in panel.__dict__: + bpy.utils.unregister_class(panel) + + 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 - 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) -class NavAddonPreferences(bpy.types.AddonPreferences): + +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() |