Skip to content
Snippets Groups Projects
space_view3d_3d_navigation.py 12.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • # 3D NAVIGATION TOOLBAR v1.2 - 3Dview Addon - Blender 2.5x
    #
    
    # please read the license block.
    #
    # ##### BEGIN GPL LICENSE BLOCK #####
    #
    #  This program is free software; you can redistribute it and/or
    #  modify it under the terms of the GNU General Public License
    #  as published by the Free Software Foundation; either version 2
    #  of the License, or (at your option) any later version.
    #
    #  This program is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with this program; if not, write to the Free Software Foundation,
    
    #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    
    #
    # ##### END GPL LICENSE BLOCK #####
    
    # contributed to by: Demohero, uriel, jbelcik, meta-androcto
    
    bl_info = {
    
        "name": "3D Navigation",
        "author": "Demohero, uriel",
    
        "version": (1, 2, 1),
        "blender": (2, 77, 0),
    
        "location": "View3D > Tool Shelf > Navigation Tab",
    
        "description": "Navigate the Camera & 3D View from the Toolshelf",
    
        "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
    
                    "Scripts/3D_interaction/3D_Navigation",
        "category": "3D View",
    }
    
    
    # import the basic library
    import bpy
    
    # main class of this toolbar
    
    
    ## re-ordered (reversed) Orbit Oprators
    class OrbitUpView1(bpy.types.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'
    
        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'
    
        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'
    
        def execute(self, context):
            bpy.ops.view3d.view_orbit(type='ORBITDOWN')
            return {'FINISHED'}
    
    ## re-ordered (reversed) Pan Oprators
    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'}
    
    
    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 Oprators
    class ZoomInView1(bpy.types.Operator):
        bl_idname = 'opr.zoom_in_view1'
        bl_label = 'Zoom In View'
        bl_description = 'Zoom in in the 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'
    
        def execute(self, context):
            bpy.ops.view3d.zoom(delta=-1)
            return {'FINISHED'}
    
    ## Roll Oprators
    class RollLeftView1(bpy.types.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'
    
        def execute(self, context):
            bpy.ops.view3d.view_roll(angle=0.261799)
            return {'FINISHED'}
    
    
    class LeftViewpoint1(bpy.types.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'
    
        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'
    
        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'
    
        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'
    
        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'
    
        def execute(self, context):
            bpy.ops.view3d.viewnumpad(type='BOTTOM')
            return {'FINISHED'}
    
    
    class ShowHideObject1(bpy.types.Operator):
        bl_idname = 'opr.show_hide_object1'
        bl_label = 'Show/Hide Object'
        bl_description = 'Show/hide selected objects'
        bl_options = {'REGISTER', 'UNDO'}
    
        def execute(self, context):
            if context.object == None:
                self.report({'ERROR'}, 'Cannot perform this operation on NoneType objects')
                return {'CANCELLED'}
    
            if context.object.mode != 'OBJECT':
                self.report({'ERROR'}, 'This operation can be performed only in object mode')
                return {'CANCELLED'}
    
            for i in bpy.data.objects:
                if i.select:
                    if i.hide:
                        i.hide = False
                        i.hide_select = False
                        i.hide_render = False
                    else:
                        i.hide = True
                        i.select = False
    
                        if i.type not in ['CAMERA', 'LAMP']:
                            i.hide_render = True
            return {'FINISHED'}
    
    # main class of this toolbar
    
    
    
    class VIEW3D_PT_3dnavigationPanel(bpy.types.Panel):
    
        bl_category = "Navigation"
    
        bl_space_type = "VIEW_3D"
        bl_region_type = "TOOLS"
    
    
        def draw(self, context):
            layout = self.layout
            view = context.space_data
    
    
            col = layout.column(align=True)
    
    Thomas Dinges's avatar
    Thomas Dinges committed
            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
            col = layout.column(align=True)
            col.label(text="Align view from:")
            row = col.row()
    
            row.operator("view3d.viewnumpad", text="Front").type = 'FRONT'
            row.operator("view3d.viewnumpad", text="Back").type = 'BACK'
    
            row.operator("view3d.viewnumpad", text="Left").type = 'LEFT'
            row.operator("view3d.viewnumpad", text="Right").type = 'RIGHT'
    
            row.operator("view3d.viewnumpad", text="Top").type = 'TOP'
            row.operator("view3d.viewnumpad", text="Bottom").type = 'BOTTOM'
    
    
    # group of 2 buttons
            col = layout.column(align=True)
            col.label(text="View to Object:")
            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()
            row.operator("view3d.snap_cursor_to_center", text="Center")
            row.operator("view3d.view_center_cursor", text="View")
    
    Thomas Dinges's avatar
    Thomas Dinges committed
            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 = 'Navigation'
    
        def draw(self, context):
            layout = self.layout
            layout.label(text='Screen View Perspective')
            row = layout.row()
            box = row.box()
            box.label(text='Pan:')
            rowr = box.row()
            rowr.operator('opr.pan_up_view1', text='', icon='TRIA_DOWN')
            rowr.operator('opr.pan_down_view1', text='', icon='TRIA_UP')
    
            rowr = box.row()
            rowr.operator('opr.pan_right_view1', text='', icon='BACK')
            rowr.operator('opr.pan_left_view1', text='', icon='FORWARD')
    
            rowr = box.row()
    
            box = row.box()
            box.label(text='Orbit:')
            rowr = box.row()
            rowr.operator('opr.orbit_up_view1', text='', icon='TRIA_DOWN')
            rowr.operator('opr.orbit_down_view1', text='', icon='TRIA_UP')
            rowr = box.row()
            rowr.operator('opr.orbit_right_view1', text='', icon='BACK')
            rowr.operator('opr.orbit_left_view1', text='', icon='FORWARD')
    
            rowr = box.row()
            row = layout.row()
    
            box = row.box()
            box.label(text='Zoom:')
            rowr = box.row()
            rowrowr = rowr.row(align=True)
            rowrowr.operator('opr.zoom_in_view1', text='', icon='ZOOMIN')
            rowrowr.operator('opr.zoom_out_view1', text='', icon='ZOOMOUT')
    
            box = row.box()
            box.label(text='Roll:')
            rowr = box.row()
            rowrowr = rowr.row(align=True)
            rowrowr.operator('opr.roll_left_view1', text='', icon='LOOP_BACK')
            rowrowr.operator('opr.roll_right_view1', text='', icon='LOOP_FORWARDS')
    
    ## Addons Preferences Update Panel
    def update_panel(self, context):
        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)
    
    class NavAddonPreferences(bpy.types.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(
    
                name="Tab Category",
    
                description="Choose a name for the category of the panel",
                default="Navigation",
                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 = [
        VIEW3D_PT_3dnavigationPanel,
        VIEW3D_PT_pan_navigation1,
        OrbitUpView1,
        OrbitLeftView1,
        OrbitRightView1,
        OrbitDownView1,
        PanUpView1,
        PanLeftView1,
        PanRightView1,
        PanDownView1,
        ZoomInView1,
        ZoomOutView1,
        RollLeftView1,
        RollRightView1,
        LeftViewpoint1,
        RightViewpoint1,
        FrontViewpoint1,
        BackViewpoint1,
        TopViewpoint1,
        BottomViewpoint1,
        ShowHideObject1,
        NavAddonPreferences,
    ]
    
    
    def register():
        for cls in classes:
            bpy.utils.register_class(cls)
    
        for cls in classes:
            bpy.utils.unregister_class(cls)