Skip to content
Snippets Groups Projects
space_view3d_spacebar_menu.py 48.6 KiB
Newer Older
#3d_cursor_menu.py (c) 2011 Jonathan Smith (JayDez)
#
# ##### 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 #####

bl_info = {
Luca Bonavita's avatar
Luca Bonavita committed
    "name": "Dynamic Spacebar Menu",
    "author": "JayDez, sim88, meta-androcto, sam",
    "version": (1, 7, 3),
    "blender": (2, 6, 0),
    "location": "View3D > Spacebar Key",
    "description": "Context Sensitive Spacebar Menu",
    "warning": "",
    "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"\
Luca Bonavita's avatar
Luca Bonavita committed
        "Scripts/3D_interaction/Dynamic_Spacebar_Menu",
    "tracker_url": "https://projects.blender.org/tracker/index.php?"\
        "func=detail&aid=22060",
    "category": "3D View"}

import bpy
from bpy import *

# Dynamic Menu
class VIEW3D_MT_Space_Dynamic_Menu(bpy.types.Menu):
    bl_label = "Dynamic Spacebar Menu"

    def draw(self, context):
        layout = self.layout
        settings = context.tool_settings
        layout.operator_context = 'INVOKE_REGION_WIN'

        ob = context
        if ob.mode == 'OBJECT':
            # Object mode

            # Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
            layout.separator()

            # Add Menu block
            layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Mirror block
            layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')

            # Cursor Block
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')

            # Parent block
            layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')

            # Group block
            layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')

            # Modifier block
            layout.operator_menu_enum("object.modifier_add", "type",

            # Align block
            layout.menu("VIEW3D_MT_AlignMenu", icon='ALIGN')

            # Select block
            layout.menu("VIEW3D_MT_SelectMenu", icon='RESTRICT_SELECT_OFF')

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')

            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

Jonathan Smith's avatar
Jonathan Smith committed
            #TODO: Add if statement to test whether editmode switch needs to
            #be added to the menu, since certain object can't enter edit mode
            #In which case we don't need the toggle
            # Toggle Editmode
            layout.operator("object.editmode_toggle", text="Enter Edit Mode",

            # Delete block
            layout.operator("object.delete", text="Delete Object",


        elif ob.mode == 'EDIT_MESH':
            # Edit mode

            # Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')

            # Add block
            layout.menu("INFO_MT_mesh_add", text="Add Mesh",

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Mirror block
            layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')

            # Cursor block
            layout.menu("VIEW3D_MT_EditCursorMenu", icon='CURSOR')
            # Proportional block
            layout.prop_menu_enum(settings, "proportional_edit",
            layout.prop_menu_enum(settings, "proportional_edit_falloff",
            layout.menu("VIEW3D_MT_edit_TK", icon='EDITMODE_HLT')
            # Multi Select
            layout.menu("VIEW3D_MT_edit_multi", icon='VERTEXSEL')
            layout.menu("VIEW3D_MT_edit_mesh_extrude", icon='EDIT_VEC')

            # Tools block
            layout.menu("VIEW3D_MT_edit_mesh_specials", icon='MODIFIER')
            layout.menu("VIEW3D_MT_uv_map", icon='MOD_UVPROJECT')
            layout.menu("VIEW3D_MT_SelectEditMenu",
                        icon='RESTRICT_SELECT_OFF')

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')

            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

            layout.operator("object.editmode_toggle",
                            text="Enter Object Mode", icon='OBJECT_DATAMODE')

            # Delete Block
            layout.operator("mesh.delete", icon='CANCEL')

        if ob.mode == 'EDIT_CURVE':
            # Curve menu

            # Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
            layout.separator()

            # Add block
            layout.menu("INFO_MT_curve_add", text="Add Curve",

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Mirror block
            layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')

            # Cursor block
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
            layout.prop_menu_enum(settings, "proportional_edit",
            layout.prop_menu_enum(settings, "proportional_edit_falloff",

            # Edit Control Points
            layout.menu("VIEW3D_MT_EditCurveCtrlpoints",

            # Edit Curve Specials
            layout.menu("VIEW3D_MT_EditCurveSpecials",
            # Select Curve Block
            #Could use: VIEW3D_MT_select_edit_curve
            #Which is the default, instead of a hand written one, left it alone
            #for now though.
            layout.menu("VIEW3D_MT_SelectCurveMenu",
                        icon='RESTRICT_SELECT_OFF')

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')

            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

            # Toggle Objectmode
            layout.operator("object.editmode_toggle", text="Enter Object Mode",
            layout.operator("curve.delete", text="Delete Object",

        if ob.mode == 'EDIT_SURFACE':
            # Surface menu

            # Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
            layout.separator()

            # Add block
            layout.menu("INFO_MT_surface_add", text="Add Surface",
                        icon='OUTLINER_OB_SURFACE')

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Mirror block
            layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')

            # Cursor block
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
            layout.prop_menu_enum(settings, "proportional_edit",
            layout.prop_menu_enum(settings, "proportional_edit_falloff",

            # Edit Curve Specials
            layout.menu("VIEW3D_MT_EditCurveSpecials",

            # Select Surface
            layout.menu("VIEW3D_MT_SelectSurface", icon='RESTRICT_SELECT_OFF')

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')
            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

            # Toggle Objectmode
            layout.operator("object.editmode_toggle", text="Enter Object Mode",
            layout.operator("curve.delete", text="Delete Object",

        if ob.mode == 'EDIT_METABALL':
            # Metaball menu

            #Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
            layout.separator()

            # Add block
            #layout.menu("INFO_MT_metaball_add", text="Add Metaball",
            #            icon='OUTLINER_OB_META')
            layout.operator_menu_enum("object.metaball_add", "type",
                                      text="Add Metaball",
                                      icon='OUTLINER_OB_META')

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Mirror block
            layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')

            # Cursor block
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
            layout.prop_menu_enum(settings, "proportional_edit",
            layout.prop_menu_enum(settings, "proportional_edit_falloff",

            #Select Metaball
            layout.menu("VIEW3D_MT_SelectMetaball", icon='RESTRICT_SELECT_OFF')

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')

            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

Brendon Murphy's avatar
Brendon Murphy committed
            # Toggle Objectmode
            layout.operator("object.editmode_toggle", text="Enter Object Mode",
Brendon Murphy's avatar
Brendon Murphy committed

            # Delete block
            layout.operator("mball.delete_metaelems", text="Delete Object",
Brendon Murphy's avatar
Brendon Murphy committed

        elif ob.mode == 'EDIT_LATTICE':
            # Lattice menu

            #Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
Jonathan Smith's avatar
Jonathan Smith committed
            layout.separator()
Brendon Murphy's avatar
Brendon Murphy committed

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Mirror block
            layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')

            # Cursor block
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
Brendon Murphy's avatar
Brendon Murphy committed

            # Proportional block
            layout.prop_menu_enum(settings, "proportional_edit",
            layout.prop_menu_enum(settings, "proportional_edit_falloff",
Brendon Murphy's avatar
Brendon Murphy committed

            #Select Lattice
            layout.menu("VIEW3D_MT_select_edit_lattice",
                        icon='RESTRICT_SELECT_OFF')
Brendon Murphy's avatar
Brendon Murphy committed

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')

            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

Brendon Murphy's avatar
Brendon Murphy committed
            # Toggle Objectmode
            layout.operator("object.editmode_toggle", text="Enter Object Mode",
Brendon Murphy's avatar
Brendon Murphy committed

Jonathan Smith's avatar
Jonathan Smith committed
            # Delete block - Can't delete any lattice stuff so not needed
            #layout.operator("object.delete", text="Delete Object",
Brendon Murphy's avatar
Brendon Murphy committed

        if  context.mode == 'PARTICLE':
            # Particle menu

            #Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
Brendon Murphy's avatar
Brendon Murphy committed

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Mirror block
            layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')

            # Cursor block
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
Brendon Murphy's avatar
Brendon Murphy committed

            # Proportional block
            layout.prop_menu_enum(settings, "proportional_edit",
            layout.prop_menu_enum(settings, "proportional_edit_falloff",
Brendon Murphy's avatar
Brendon Murphy committed

            # Particle block
            layout.menu("VIEW3D_MT_particle", icon='PARTICLEMODE')

            #Select Particle
            layout.menu("VIEW3D_MT_select_particle",
                        icon='RESTRICT_SELECT_OFF')

            # History/Cursor Block
            layout.menu("VIEW3D_MT_undoS", icon='ARROW_LEFTRIGHT')

Brendon Murphy's avatar
Brendon Murphy committed
            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')

            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

            layout.operator("object.mode_set", text="Enter Object Mode",

            # Delete block
            layout.operator("object.delete", text="Delete Object",

        ob = context
        if ob.mode == 'PAINT_WEIGHT':
            # Weight paint menu

            # Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Cursor block
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')

            # Weight Paint block
            layout.menu("VIEW3D_MT_paint_weight", icon='WPAINT_HLT')

            # History/Cursor Block
            layout.menu("VIEW3D_MT_undoS", icon='ARROW_LEFTRIGHT')

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')

            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

            layout.operator("object.mode_set", text="Enter Object Mode",

        elif ob.mode == 'PAINT_VERTEX':
            # Vertex paint menu

            # Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Cursor block
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')

            # Vertex Paint block
            layout.operator("paint.vertex_color_set", icon='VPAINT_HLT')

            # History/Cursor Block
            layout.menu("VIEW3D_MT_undoS", icon='ARROW_LEFTRIGHT')

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')

            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

            layout.operator("object.mode_set", text="Enter Object Mode",

        elif ob.mode == 'PAINT_TEXTURE':
            # Texture paint menu

            # Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Cursor block
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')

            # History/Cursor Block
            layout.menu("VIEW3D_MT_undoS", icon='ARROW_LEFTRIGHT')

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')

            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

            layout.operator("object.mode_set", text="Enter Object Mode",

        elif ob.mode == 'SCULPT':
            # Sculpt menu

            # Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Mirror block
            layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')

            # Cursor block
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')

            # Sculpt block
            layout.menu("VIEW3D_MT_sculpt", icon='SCULPTMODE_HLT')

            # History/Cursor Block
            layout.menu("VIEW3D_MT_undoS", icon='ARROW_LEFTRIGHT')

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')

            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

            # Toggle Objectmode
            layout.operator("object.mode_set", text="Enter Object Mode",

        elif ob.mode == 'EDIT_ARMATURE':
            # Armature menu

            # Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')

            # Transform block
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Mirror block
            layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')

            # Cursor block
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')

            # Proportional block
            layout.prop_menu_enum(settings, "proportional_edit",
            layout.prop_menu_enum(settings, "proportional_edit_falloff",
            # Edit Armature roll
            layout.menu("VIEW3D_MT_edit_armature_roll",

            # Edit Armature Toolkit
            layout.menu("VIEW3D_MT_EditArmatureTK",

            # Edit Armature Name
            layout.menu("VIEW3D_MT_ArmatureName",
            # Parent block
            layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')

            # bone options block
            layout.menu("VIEW3D_MT_bone_options_toggle",
            # Edit Armature Specials
            layout.menu("VIEW3D_MT_armature_specials", icon='MODIFIER')

            # Edit Armature Select
            layout.menu("VIEW3D_MT_SelectArmatureMenu",
                        icon='RESTRICT_SELECT_OFF')

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')
            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')
            # Toggle Posemode
            layout.operator("object.posemode_toggle", text="Enter Pose Mode",

            # Toggle Posemode
            layout.operator("object.editmode_toggle", text="Enter Object Mode",
            layout.operator("armature.delete", text="Delete Object",

        if context.mode == 'POSE':
            # Pose mode menu
            arm = context.active_object.data

            # Search Menu
            layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')

            # Transform Menu
            layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')

            # Clear Transform
            layout.menu("VIEW3D_MT_pose_transform")

            # Cursor Menu
            layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')

            # Pose Copy Block
            layout.menu("VIEW3D_MT_PoseCopy", icon='FILE')

            if arm.draw_type in {'BBONE', 'ENVELOPE'}:
                layout.operator("transform.transform",
                                text="Scale Envelope Distance").mode = 'BONE_SIZE'

            layout.menu("VIEW3D_MT_pose_apply")
            layout.operator("pose.relax")
            layout.menu("VIEW3D_MT_KeyframeMenu")
            layout.menu("VIEW3D_MT_pose_pose")
            layout.menu("VIEW3D_MT_pose_motion")
            layout.menu("VIEW3D_MT_pose_group")
            layout.menu("VIEW3D_MT_pose_ik")
            layout.menu("VIEW3D_MT_PoseNames")
            layout.menu("VIEW3D_MT_pose_constraints")
            layout.operator("pose.quaternions_flip")

            layout.operator_context = 'INVOKE_AREA'
            layout.operator("pose.armature_layers",
                            text="Change Armature Layers...")
            layout.operator("pose.bone_layers", text="Change Bone Layers...")

            layout.menu("VIEW3D_MT_pose_showhide")
            layout.menu("VIEW3D_MT_bone_options_toggle",
            # Select Pose Block
            layout.menu("VIEW3D_MT_SelectPoseMenu", icon='RESTRICT_SELECT_OFF')

            # Toolshelf block
            layout.operator("view3d.toolshelf", icon='MENU_PANEL')

            # Properties block
            layout.operator("view3d.properties", icon='MENU_PANEL')

            # Toggle Editmode
            layout.operator("object.editmode_toggle", text="Enter Edit Mode",
            layout.operator("object.mode_set", text="Enter Object Mode",
                            icon='OBJECT_DATA').mode='OBJECT'
class VIEW3D_MT_AddMenu(bpy.types.Menu):
    bl_label = "Add Object Menu"

    def draw(self, context):
        layout = self.layout
        layout.operator_context = 'INVOKE_REGION_WIN'

        layout.menu("INFO_MT_mesh_add", text="Add Mesh",
Brendon Murphy's avatar
Brendon Murphy committed
        layout.menu("INFO_MT_curve_add", text="Add Curve",
        layout.menu("INFO_MT_surface_add", text="Add Surface",
                    icon='OUTLINER_OB_SURFACE')
        layout.operator_menu_enum("object.metaball_add", "type",
        layout.operator("object.text_add", text="Add Text",
        layout.separator()
        layout.menu("INFO_MT_armature_add", text="Add Armature",
                    icon='OUTLINER_OB_ARMATURE')
Brendon Murphy's avatar
Brendon Murphy committed
        layout.operator("object.add", text="Lattice",
                        icon='OUTLINER_OB_LATTICE').type = 'LATTICE'
Brendon Murphy's avatar
Brendon Murphy committed
        layout.separator()
        layout.operator("object.add", text="Add Empty",
        layout.operator("object.speaker_add", text="Speaker", icon='OUTLINER_OB_SPEAKER')
        layout.separator()
        layout.operator("object.camera_add", text="Camera",
                        icon='OUTLINER_OB_CAMERA')
        layout.operator_menu_enum("object.lamp_add", "type",
        layout.separator()

        layout.operator_menu_enum("object.effector_add", "type",
                                  text="Force Field",
                                  icon='OUTLINER_OB_EMPTY')
        layout.operator_menu_enum("object.group_instance_add", "group",
                                  text="Group Instance",
                                  icon='OUTLINER_OB_EMPTY')


class VIEW3D_MT_TransformMenu(bpy.types.Menu):
    bl_label = "Transform Menu"

    # TODO: get rid of the custom text strings?
    def draw(self, context):
        layout = self.layout

        layout.operator("transform.translate", text="Grab/Move")
        # TODO: sub-menu for grab per axis
        layout.operator("transform.rotate", text="Rotate")
        # TODO: sub-menu for rot per axis
        layout.operator("transform.resize", text="Scale")
        # TODO: sub-menu for scale per axis
        layout.separator()

        layout.operator("transform.tosphere", text="To Sphere")
        layout.operator("transform.shear", text="Shear")
        layout.operator("transform.warp", text="Warp")
        layout.operator("transform.push_pull", text="Push/Pull")
        if context.edit_object and context.edit_object.type == 'ARMATURE':
            layout.operator("armature.align")
        else:
            layout.operator_context = 'EXEC_REGION_WIN'
            # @todo vvv See alignmenu() in edit.c of b2.4x to get this working.
            layout.operator("transform.transform",
                            text="Align to Transform Orientation").mode = 'ALIGN'
        layout.separator()

        layout.operator_context = 'EXEC_AREA'

        layout.operator("object.origin_set",
                        text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
        layout.operator("object.origin_set",
                        text="Origin to Geometry").type = 'ORIGIN_GEOMETRY'
        layout.operator("object.origin_set",
                        text="Origin to 3D Cursor").type = 'ORIGIN_CURSOR'


class VIEW3D_MT_MirrorMenu(bpy.types.Menu):
    bl_label = "Mirror Menu"

    def draw(self, context):
        layout = self.layout

        layout.operator("transform.mirror", text="Interactive Mirror")
        layout.separator()

        layout.operator_context = 'INVOKE_REGION_WIN'

        props = layout.operator("transform.mirror", text="X Global")
        props.constraint_axis = (True, False, False)
        props.constraint_orientation = 'GLOBAL'
        props = layout.operator("transform.mirror", text="Y Global")
        props.constraint_axis = (False, True, False)
        props.constraint_orientation = 'GLOBAL'
        props = layout.operator("transform.mirror", text="Z Global")
        props.constraint_axis = (False, False, True)
        props.constraint_orientation = 'GLOBAL'

        if context.edit_object:
            layout.separator()

            props = layout.operator("transform.mirror", text="X Local")
            props.constraint_axis = (True, False, False)
            props.constraint_orientation = 'LOCAL'
            props = layout.operator("transform.mirror", text="Y Local")
            props.constraint_axis = (False, True, False)
            props.constraint_orientation = 'LOCAL'
            props = layout.operator("transform.mirror", text="Z Local")
            props.constraint_axis = (False, False, True)
            props.constraint_orientation = 'LOCAL'

            layout.operator("object.vertex_group_mirror")

class VIEW3D_MT_ParentMenu(bpy.types.Menu):
    bl_label = "Parent Menu"

    def draw(self, context):
        layout = self.layout

        layout.operator("object.parent_set", text="Set")
        layout.operator("object.parent_clear", text="Clear")

class VIEW3D_MT_GroupMenu(bpy.types.Menu):
    bl_label = "Group Menu"

    def draw(self, context):
        layout = self.layout

        layout.operator("group.create")
        layout.operator("group.objects_remove")
        layout.separator()

        layout.operator("group.objects_add_active")
        layout.operator("group.objects_remove_active")

class VIEW3D_MT_AlignMenu(bpy.types.Menu):
    bl_label = "Align Menu"

    def draw(self, context):
        layout = self.layout

        layout.menu("VIEW3D_MT_view_align_selected")
        layout.separator()

        layout.operator("view3d.view_all",
                        text="Center Cursor and View All").center = True
        layout.operator("view3d.camera_to_view",
                        text="Align Active Camera to View")
        layout.operator("view3d.view_selected")
        layout.operator("view3d.view_center_cursor")

class VIEW3D_MT_SelectMenu(bpy.types.Menu):
    bl_label = "Select Menu"

    def draw(self, context):
        layout = self.layout
        layout.operator_context = 'INVOKE_REGION_WIN'

        layout.operator("view3d.select_border")
        layout.operator("view3d.select_circle")
        layout.separator()
        layout.operator("object.select_all").action = 'TOGGLE'
        layout.operator("object.select_all", text="Inverse").action = 'INVERT'
        layout.operator("object.select_random", text="Random")
        layout.operator("object.select_mirror", text="Mirror")
        layout.operator("object.select_by_layer", text="Select All by Layer")
        layout.operator_menu_enum("object.select_by_type", "type",
                                  text="Select All by Type...")
        layout.operator("object.select_camera", text="Select Camera")
        layout.separator()

        layout.operator_menu_enum("object.select_grouped", "type",
        layout.operator_menu_enum("object.select_linked", "type",
        layout.operator("object.select_pattern", text="Select Pattern...")

class VIEW3D_MT_SelectEditMenu(bpy.types.Menu):
    bl_label = "Select Menu"

    def draw(self, context):
        layout = self.layout

        layout.operator("view3d.select_border")
        layout.operator("view3d.select_circle")
        layout.separator()

        layout.operator("mesh.select_all").action = 'TOGGLE'
        layout.operator("mesh.select_all", text="Inverse").action = 'INVERT'
        layout.separator()

        layout.operator("mesh.select_random", text="Random")
        layout.operator("mesh.select_nth", text="Every N Number of Verts")
        layout.operator("mesh.edges_select_sharp", text="Sharp Edges")
        layout.operator("mesh.faces_select_linked_flat",
        layout.operator("mesh.select_interior_faces", text="Interior Faces")
        layout.operator("mesh.select_axis", text="Side of Active")
        layout.separator()

        layout.operator("mesh.select_by_number_vertices", text="By Number of Verts")
        if context.scene.tool_settings.mesh_select_mode[2] == False:
            layout.operator("mesh.select_non_manifold", text="Non Manifold")
        layout.operator("mesh.select_loose_verts", text="Loose Verts/Edges")
        layout.operator("mesh.select_similar", text="Similar")
        layout.separator()

        layout.operator("mesh.select_less", text="Less")
        layout.operator("mesh.select_more", text="More")
        layout.separator()

        layout.operator("mesh.select_mirror", text="Mirror")

        layout.operator("mesh.select_linked", text="Linked")
        layout.operator("mesh.select_vertex_path", text="Vertex Path")
        layout.operator("mesh.loop_multi_select", text="Edge Loop")
        layout.operator("mesh.loop_multi_select", text="Edge Ring").ring = True
        layout.separator()

        layout.operator("mesh.loop_to_region")
        layout.operator("mesh.region_to_loop")

class VIEW3D_MT_SelectCurveMenu(bpy.types.Menu):
    bl_label = "Select Menu"

    def draw(self, context):
        layout = self.layout

        layout.operator("view3d.select_border")
        layout.operator("view3d.select_circle")
        layout.separator()

        layout.operator("curve.select_all").action = 'TOGGLE'
        layout.operator("curve.select_all").action = 'INVERT'
        layout.operator("curve.select_random")
        layout.operator("curve.select_nth")
        layout.separator()

        layout.operator("curve.de_select_first")
        layout.operator("curve.de_select_last")
        layout.operator("curve.select_next")
        layout.operator("curve.select_previous")
        layout.separator()

        layout.operator("curve.select_more")
        layout.operator("curve.select_less")

class VIEW3D_MT_SelectArmatureMenu(bpy.types.Menu):
    bl_label = "Select Menu"

    def draw(self, context):
        layout = self.layout

        layout.operator("view3d.select_border")
        layout.separator()

        layout.operator("armature.select_all")
        layout.operator("armature.select_inverse", text="Inverse")
        layout.separator()

        layout.operator("armature.select_hierarchy",
                        text="Parent").direction = 'PARENT'
        layout.operator("armature.select_hierarchy",
                        text="Child").direction = 'CHILD'
        props = layout.operator("armature.select_hierarchy",
        props.extend = True
        props.direction = 'PARENT'

        props = layout.operator("armature.select_hierarchy",
        props.extend = True
        props.direction = 'CHILD'

        layout.operator("object.select_pattern", text="Select Pattern...")


class VIEW3D_MT_SelectPoseMenu(bpy.types.Menu):
    bl_label = "Select Menu"

    def draw(self, context):
        layout = self.layout

        layout.operator("view3d.select_border")
        layout.separator()

        layout.operator("pose.select_all").action = 'TOGGLE'
        layout.operator("pose.select_all", text="Inverse").action = 'INVERT'
        layout.operator("pose.select_constraint_target",
        layout.operator("pose.select_linked", text="Linked")
        layout.separator()

        layout.operator("pose.select_hierarchy",
                        text="Parent").direction = 'PARENT'
        layout.operator("pose.select_hierarchy",
                        text="Child").direction = 'CHILD'
        layout.separator()

        props = layout.operator("pose.select_hierarchy", text="Extend Parent")
        props.extend = True
        props.direction = 'PARENT'

        props = layout.operator("pose.select_hierarchy", text="Extend Child")
        props.extend = True
        props.direction = 'CHILD'
        layout.separator()

        layout.operator_menu_enum("pose.select_grouped", "type",
        layout.operator("object.select_pattern", text="Select Pattern...")

class VIEW3D_MT_PoseCopy(bpy.types.Menu):
    bl_label = "Pose Copy"

    def draw(self, context):
        layout = self.layout
        layout.operator("pose.copy")
        layout.operator("pose.paste")
        layout.operator("pose.paste",
                        text="Paste X-Flipped Pose").flipped = True
        layout.separator()

class VIEW3D_MT_PoseNames(bpy.types.Menu):
    bl_label = "Pose Copy"

    def draw(self, context):
        layout = self.layout
        layout.operator_context = 'EXEC_AREA'
        layout.operator("pose.autoside_names",
                        text="AutoName Left/Right").axis = 'XAXIS'
        layout.operator("pose.autoside_names",
                        text="AutoName Front/Back").axis = 'YAXIS'
        layout.operator("pose.autoside_names",
                        text="AutoName Top/Bottom").axis = 'ZAXIS'

        layout.operator("pose.flip_names")


class VIEW3D_MT_SelectSurface(bpy.types.Menu):
    bl_label = "Select Menu"

    def draw(self, context):
        layout = self.layout

        layout.operator("view3d.select_border")
        layout.operator("view3d.select_circle")

        layout.separator()