diff --git a/space_view3d_objects_panel.py b/space_view3d_objects_panel.py deleted file mode 100644 index 98c198cead9bfd3bd152547ce3aaf1e336b93896..0000000000000000000000000000000000000000 --- a/space_view3d_objects_panel.py +++ /dev/null @@ -1,80 +0,0 @@ -# ##### 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# ##### END GPL LICENSE BLOCK ##### - -bl_info = { - "name": "Add Objects Panel", - "author": "Murat Egretli (Demohero)", - "version": (1, 2), - "blender": (2, 71, 0), - "location": "View3D > Toolshelf > Addons", - "description": "add objects(mesh, curve etc.) from Toolbar", - "warning": "", - "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/" - "Scripts/", - "tracker_url": "https://developer.blender.org/T22154", - "category": "3D View"} - - -import bpy - - -class View3DPanel(): - bl_space_type = 'VIEW_3D' - bl_region_type = 'TOOLS' - - -class VIEW3D_PT_add_menu(View3DPanel,bpy.types.Panel): - bl_context = "objectmode" - bl_label = "Add Objects" - bl_category = 'Addons' - bl_options = {'DEFAULT_CLOSED'} - - def draw(self, context): - layout = self.layout - layout.label("Primitive Object") - layout.menu("INFO_MT_mesh_add", text="Mesh", icon='OUTLINER_OB_MESH') - layout.menu("INFO_MT_curve_add", text="Curve", icon='OUTLINER_OB_CURVE') - layout.menu("INFO_MT_surface_add", text="Surface", icon='OUTLINER_OB_SURFACE') - layout.operator_menu_enum("object.metaball_add", "type", text="Metaball", icon='OUTLINER_OB_META') - layout.operator("object.text_add", text="Text", icon='OUTLINER_OB_FONT') - layout.label("Object Helpers") - layout.menu("INFO_MT_armature_add", icon='OUTLINER_OB_ARMATURE') - layout.operator("object.add", text="Lattice", icon='OUTLINER_OB_LATTICE').type = 'LATTICE' - layout.operator("object.add", text="Empty", icon='OUTLINER_OB_EMPTY').type = 'EMPTY' - layout.operator_menu_enum("object.group_instance_add", "group", - text="Group Instance", - icon='OUTLINER_OB_EMPTY') - layout.label("3d View Objects") - layout.operator("object.camera_add", text="Camera", icon='OUTLINER_OB_CAMERA') - layout.operator_menu_enum("object.lamp_add", "type", text="Lamp", icon='OUTLINER_OB_LAMP') - layout.operator_menu_enum("object.effector_add", "type", text="Force Field", icon='OUTLINER_OB_EMPTY') - - -# register the class -def register(): - bpy.utils.register_module(__name__) - - pass - -def unregister(): - bpy.utils.unregister_module(__name__) - - pass - -if __name__ == "__main__": - register() diff --git a/space_view3d_toolshelf_menu.py b/space_view3d_toolshelf_menu.py new file mode 100644 index 0000000000000000000000000000000000000000..93a65fdde76eb2276c00d43fd12bfa153e9af53f --- /dev/null +++ b/space_view3d_toolshelf_menu.py @@ -0,0 +1,1402 @@ +# ##### 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 ##### +# some parts based on 3d_cursor_menu.py by Jonathan Smith (JayDez) & work by sim88 & sam. +# view3d_advanced_dynamic_toolshelf_menu byBrendon Murphy (meta-androcto) + +bl_info = { + "name": "Dynamic Toolshelf Menu", + "author": "meta-androcto", + "version": (3, 0, 0), + "blender": (2, 7, 1), + "location": "View3D > Spacebar Key, Dynamic Tab", + "description": "Context Sensitive Toolshelf Menu", + "warning": "", + "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/" + "Scripts/3D_interaction/Dynamic_Spacebar_Menu", + "category": "3D View", +} + +import bpy +from bpy import * + +class View3DPanel(): + bl_space_type = 'VIEW_3D' + bl_region_type = 'TOOLS' + + +class VIEW3D_PT_add_menu(View3DPanel,bpy.types.Panel): + bl_label = "Dynamic Toolshelf" + bl_category = "Dynamic" + + 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", + icon='MODIFIER') + + # 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", text= 'hide toolshelf', icon='MENU_PANEL') + + # Properties block + layout.operator("view3d.properties", icon='MENU_PANEL') + + #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", + icon='EDITMODE_HLT') + + # Delete block + layout.operator("object.delete", text="Delete Object", + icon='CANCEL') + + + elif ob.mode == 'EDIT_MESH': + # Edit mode + + # Search Menu + layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM') + layout.separator() + + # Add block + layout.menu("INFO_MT_mesh_add", text="Add Mesh", + icon='OUTLINER_OB_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", + icon="PROP_CON") + layout.prop_menu_enum(settings, "proportional_edit_falloff", + icon="SMOOTHCURVE") + + # Edit block + layout.menu("VIEW3D_MT_edit_TK", icon='EDITMODE_HLT') + + # Multi Select + layout.menu("VIEW3D_MT_edit_multi", icon='VERTEXSEL') + + # Extrude block + layout.menu("VIEW3D_MT_edit_mesh_extrude", icon='EDIT_VEC') + + # Tools block + layout.menu("VIEW3D_MT_edit_mesh_specials", icon='MODIFIER') + + # UV Map block + layout.menu("VIEW3D_MT_uv_map", icon='MOD_UVPROJECT') + + # Select block + 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') + + # Toggle Object Mode + 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", + icon='OUTLINER_OB_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') + + # Proportional block + layout.prop_menu_enum(settings, "proportional_edit", + icon="PROP_CON") + layout.prop_menu_enum(settings, "proportional_edit_falloff", + icon="SMOOTHCURVE") + + # Edit Control Points + layout.menu("VIEW3D_MT_EditCurveCtrlpoints", + icon='CURVE_BEZCURVE') + + # Edit Curve Specials + layout.menu("VIEW3D_MT_EditCurveSpecials", + icon='MODIFIER') + + # 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", + icon='OBJECT_DATA') + + # Delete block + layout.operator("curve.delete", text="Delete Object", + icon='CANCEL') + + 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') + + # Proportional block + layout.prop_menu_enum(settings, "proportional_edit", + icon="PROP_CON") + layout.prop_menu_enum(settings, "proportional_edit_falloff", + icon="SMOOTHCURVE") + + # Edit Curve Specials + layout.menu("VIEW3D_MT_EditCurveSpecials", + icon='MODIFIER') + + # 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", + icon='OBJECT_DATA') + + # Delete block + layout.operator("curve.delete", text="Delete Object", + icon='CANCEL') + + 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') + + # Proportional block + layout.prop_menu_enum(settings, "proportional_edit", + icon="PROP_CON") + layout.prop_menu_enum(settings, "proportional_edit_falloff", + icon="SMOOTHCURVE") + + #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') + + # Toggle Objectmode + layout.operator("object.editmode_toggle", text="Enter Object Mode", + icon='OBJECT_DATA') + + # Delete block + layout.operator("mball.delete_metaelems", text="Delete Object", + icon='CANCEL') + + elif ob.mode == 'EDIT_LATTICE': + # Lattice menu + + #Search Menu + layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM') + layout.separator() + + # 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", + icon= "PROP_CON") + layout.prop_menu_enum(settings, "proportional_edit_falloff", + icon= "SMOOTHCURVE") + layout.operator("lattice.make_regular") + + #Select Lattice + layout.menu("VIEW3D_MT_select_edit_lattice", + 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", + icon='OBJECT_DATA') + + # Delete block - Can't delete any lattice stuff so not needed + #layout.operator("object.delete", text="Delete Object", + # icon='CANCEL') + + if context.mode == 'PARTICLE': + # Particle menu + + #Search Menu + layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM') + layout.separator() + + # 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", + icon= "PROP_CON") + layout.prop_menu_enum(settings, "proportional_edit_falloff", + icon= "SMOOTHCURVE") + + # 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') + + # 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", + icon='OBJECT_DATA') + + # Delete block + layout.operator("object.delete", text="Delete Object", + icon='CANCEL') + + ob = context + if ob.mode == 'PAINT_WEIGHT': + # Weight paint menu + + # Search Menu + layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM') + layout.separator() + + # 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') + + # Toggle Objectmode + layout.operator("object.mode_set", text="Enter Object Mode", + icon='OBJECT_DATA') + + elif ob.mode == 'PAINT_VERTEX': + # Vertex paint menu + + # Search Menu + layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM') + layout.separator() + + # 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') + + # Toggle Objectmode + layout.operator("object.mode_set", text="Enter Object Mode", + icon='OBJECT_DATA') + + elif ob.mode == 'PAINT_TEXTURE': + # Texture paint menu + + # Search Menu + layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM') + layout.separator() + + # 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') + + # Toggle Objectmode + layout.operator("object.mode_set", text="Enter Object Mode", + icon='OBJECT_DATA') + + elif ob.mode == 'SCULPT': + # Sculpt menu + + # Search Menu + layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM') + layout.separator() + + # 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", + icon='OBJECT_DATA') + + elif ob.mode == 'EDIT_ARMATURE': + # Armature Edit menu + + # Search Menu + layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM') + layout.separator() + + # 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", + icon="PROP_CON") + layout.prop_menu_enum(settings, "proportional_edit_falloff", + icon="SMOOTHCURVE") + layout.separator() + + # Edit Armature roll + layout.menu("VIEW3D_MT_edit_armature_roll", + icon='BONE_DATA') + + # Edit Armature Toolkit + layout.menu("VIEW3D_MT_EditArmatureTK", + icon='ARMATURE_DATA') + + # Edit Armature Name + layout.menu("VIEW3D_MT_ArmatureName", + icon='NEW') + + # Parent block + layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE') + + # bone options block + layout.menu("VIEW3D_MT_bone_options_toggle", + text="Bone Settings") + + # 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", + icon='POSE_HLT') + + # Toggle Posemode + layout.operator("object.editmode_toggle", text="Enter Object Mode", + icon='OBJECT_DATA') + + # Delete block + layout.operator("armature.delete", text="Delete Object", + icon='CANCEL') + + if context.mode == 'POSE': + # Pose mode menu + arm = context.active_object.data + + # Search Menu + layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM') + layout.separator() + + # 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("armature.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", + text="Bone Settings") + + # 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", + icon='EDITMODE_HLT') + + 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", + icon='OUTLINER_OB_MESH') + layout.menu("INFO_MT_curve_add", text="Add Curve", + icon='OUTLINER_OB_CURVE') + layout.menu("INFO_MT_surface_add", text="Add Surface", + icon='OUTLINER_OB_SURFACE') + layout.operator_menu_enum("object.metaball_add", "type", + icon='OUTLINER_OB_META') + layout.operator("object.text_add", text="Add Text", + icon='OUTLINER_OB_FONT') + layout.separator() + layout.menu("INFO_MT_armature_add", text="Add Armature", + icon='OUTLINER_OB_ARMATURE') + layout.operator("object.add", text="Lattice", + icon='OUTLINER_OB_LATTICE').type = 'LATTICE' + layout.separator() + layout.operator("object.add", text="Add Empty", + icon='OUTLINER_OB_EMPTY') + layout.separator() + 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", + icon="OUTLINER_OB_LAMP") + 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.bend", text="Bend") + 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", + text="Grouped") + layout.operator_menu_enum("object.select_linked", "type", + text="Linked") + 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", + text="Linked Flat Faces") + layout.operator("mesh.select_interior_faces", text="Interior Faces") + layout.operator("mesh.select_axis", text="Side of Active") + layout.separator() + + layout.operator("mesh.select_face_by_sides", 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", text="Loose Geometry") + 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.shortest_path_select", text="Shortest 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' + layout.separator() + + props = layout.operator("armature.select_hierarchy", + text="Extend Parent") + props.extend = True + props.direction = 'PARENT' + + props = layout.operator("armature.select_hierarchy", + text="Extend Child") + 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", + text="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", + text="Grouped") + 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() + + 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.select_row") + + layout.separator() + + layout.operator("curve.select_more") + layout.operator("curve.select_less") + +class VIEW3D_MT_SelectMetaball(bpy.types.Menu): + bl_label = "Select Menu" + + def draw(self, context): + layout = self.layout + + layout.operator("view3d.select_border") + + layout.separator() + + layout.operator("mball.select_all").action = 'TOGGLE' + layout.operator("mball.select_all").action = 'INVERT' + layout.operator("mball.select_random_metaelems") + +class VIEW3D_MT_edit_TK(bpy.types.Menu): + bl_label = "Edit Mesh Tools" + + def draw(self, context): + layout = self.layout + layout.row() # XXX, is this needed? + + layout.operator_context = 'INVOKE_REGION_WIN' + + layout.menu("VIEW3D_MT_edit_mesh_vertices", icon='VERTEXSEL') + layout.menu("VIEW3D_MT_edit_mesh_edges", icon='EDGESEL') + layout.menu("VIEW3D_MT_edit_mesh_faces", icon='FACESEL') + layout.separator() + layout.menu("VIEW3D_MT_edit_mesh_normals", icon='META_DATA') + layout.operator("mesh.loopcut_slide", + text="Loopcut", icon='EDIT_VEC') + + + +class VIEW3D_MT_edit_multi(bpy.types.Menu): + bl_label = "Multi Select" + + def draw(self, context): + layout = self.layout + layout.operator_context = 'INVOKE_REGION_WIN' + + layout.separator() + prop = layout.operator("wm.context_set_value", text="Vertex Select", + icon='VERTEXSEL') + prop.value = "(True, False, False)" + prop.data_path = "tool_settings.mesh_select_mode" + + prop = layout.operator("wm.context_set_value", text="Edge Select", + icon='EDGESEL') + prop.value = "(False, True, False)" + prop.data_path = "tool_settings.mesh_select_mode" + + prop = layout.operator("wm.context_set_value", text="Face Select", + icon='FACESEL') + prop.value = "(False, False, True)" + prop.data_path = "tool_settings.mesh_select_mode" + layout.separator() + + prop = layout.operator("wm.context_set_value", + text="Vertex & Edge Select", + icon='EDITMODE_HLT') + prop.value = "(True, True, False)" + prop.data_path = "tool_settings.mesh_select_mode" + + prop = layout.operator("wm.context_set_value", + text="Vertex & Face Select", + icon='ORTHO') + prop.value = "(True, False, True)" + prop.data_path = "tool_settings.mesh_select_mode" + + prop = layout.operator("wm.context_set_value", + text="Edge & Face Select", + icon='SNAP_FACE') + prop.value = "(False, True, True)" + prop.data_path = "tool_settings.mesh_select_mode" + layout.separator() + + prop = layout.operator("wm.context_set_value", + text="Vertex & Edge & Face Select", + icon='SNAP_VOLUME') + prop.value = "(True, True, True)" + prop.data_path = "tool_settings.mesh_select_mode" + +class VIEW3D_MT_editM_Edge(bpy.types.Menu): + bl_label = "Edges" + + def draw(self, context): + layout = self.layout + layout.operator_context = 'INVOKE_REGION_WIN' + + layout.operator("mesh.mark_seam") + layout.operator("mesh.mark_seam", text="Clear Seam").clear = True + layout.separator() + + layout.operator("mesh.mark_sharp") + layout.operator("mesh.mark_sharp", text="Clear Sharp").clear = True + layout.operator("mesh.extrude_move_along_normals", text="Extrude") + layout.separator() + + layout.operator("mesh.edge_rotate", + text="Rotate Edge CW").direction = 'CW' + layout.operator("mesh.edge_rotate", + text="Rotate Edge CCW").direction = 'CCW' + layout.separator() + + layout.operator("TFM_OT_edge_slide", text="Edge Slide") + layout.operator("mesh.loop_multi_select", text="Edge Loop") + layout.operator("mesh.loop_multi_select", text="Edge Ring").ring = True + layout.operator("mesh.loop_to_region") + layout.operator("mesh.region_to_loop") + + +class VIEW3D_MT_EditCurveCtrlpoints(bpy.types.Menu): + bl_label = "Control Points" + + def draw(self, context): + layout = self.layout + + edit_object = context.edit_object + + if edit_object.type == 'CURVE': + layout.operator("transform.transform").mode = 'TILT' + layout.operator("curve.tilt_clear") + layout.operator("curve.separate") + + layout.separator() + + layout.operator_menu_enum("curve.handle_type_set", "type") + + layout.separator() + + layout.menu("VIEW3D_MT_hook") + + +class VIEW3D_MT_EditCurveSegments(bpy.types.Menu): + bl_label = "Curve Segments" + + def draw(self, context): + layout = self.layout + + layout.operator("curve.subdivide") + layout.operator("curve.switch_direction") + +class VIEW3D_MT_EditCurveSpecials(bpy.types.Menu): + bl_label = "Specials" + + def draw(self, context): + layout = self.layout + + layout.operator("curve.subdivide") + layout.operator("curve.switch_direction") + layout.operator("curve.spline_weight_set") + layout.operator("curve.radius_set") + layout.operator("curve.smooth") + layout.operator("curve.smooth_weight") + layout.operator("curve.smooth_radius") + layout.operator("curve.smooth_tilt") + +class VIEW3D_MT_EditArmatureTK(bpy.types.Menu): + bl_label = "Armature Tools" + + def draw(self, context): + layout = self.layout + + # Edit Armature + + layout.operator("transform.transform", + text="Scale Envelope Distance").mode = 'BONE_SIZE' + + layout.operator("transform.transform", + text="Scale B-Bone Width").mode = 'BONE_SIZE' + layout.separator() + + layout.operator("armature.extrude_move") + + layout.operator("armature.extrude_forked") + + layout.operator("armature.duplicate_move") + layout.operator("armature.merge") + layout.operator("armature.fill") + layout.operator("armature.delete") + layout.operator("armature.separate") + + layout.separator() + + layout.operator("armature.subdivide", text="Subdivide") + layout.operator("armature.switch_direction", text="Switch Direction") + +class VIEW3D_MT_ArmatureName(bpy.types.Menu): + bl_label = "Armature Name" + + def draw(self, context): + layout = self.layout + + layout.operator_context = 'EXEC_AREA' + layout.operator("armature.autoside_names", + text="AutoName Left/Right").type = 'XAXIS' + layout.operator("armature.autoside_names", + text="AutoName Front/Back").type = 'YAXIS' + layout.operator("armature.autoside_names", + text="AutoName Top/Bottom").type = 'ZAXIS' + layout.operator("armature.flip_names") + layout.separator() + +class VIEW3D_MT_KeyframeMenu(bpy.types.Menu): + bl_label = "Keyframe Menu" + + def draw(self, context): + layout = self.layout + + # Keyframe Bleck + layout.operator("anim.keyframe_insert_menu", + text="Insert Keyframe...") + layout.operator("anim.keyframe_delete_v3d", + text="Delete Keyframe...") + layout.operator("anim.keying_set_active_set", + text="Change Keying Set...") + layout.separator() + +# Classes for VIEW3D_MT_CursorMenu() +class VIEW3D_OT_pivot_cursor(bpy.types.Operator): + "Cursor as Pivot Point" + bl_idname = "view3d.pivot_cursor" + bl_label = "Cursor as Pivot Point" + + @classmethod + def poll(cls, context): + return bpy.context.space_data.pivot_point != 'CURSOR' + + def execute(self, context): + bpy.context.space_data.pivot_point = 'CURSOR' + return {'FINISHED'} + +class VIEW3D_OT_revert_pivot(bpy.types.Operator): + "Revert Pivot Point" + bl_idname = "view3d.revert_pivot" + bl_label = "Reverts Pivot Point to median" + + @classmethod + def poll(cls, context): + return bpy.context.space_data.pivot_point != 'MEDIAN_POINT' + + def execute(self, context): + bpy.context.space_data.pivot_point = 'MEDIAN_POINT' + # @todo Change this to 'BOUDNING_BOX_CENTER' if needed... + return{'FINISHED'} + +class VIEW3D_MT_CursorMenu(bpy.types.Menu): + bl_label = "Snap Cursor Menu" + + def draw(self, context): + + layout = self.layout + layout.operator_context = 'INVOKE_REGION_WIN' + layout.operator("view3d.snap_cursor_to_selected", + text="Cursor to Selected") + layout.operator("view3d.snap_cursor_to_center", + text="Cursor to Center") + layout.operator("view3d.snap_cursor_to_grid", + text="Cursor to Grid") + layout.operator("view3d.snap_cursor_to_active", + text="Cursor to Active") + layout.separator() + layout.operator("view3d.snap_selected_to_cursor", + text="Selection to Cursor") + layout.operator("view3d.snap_selected_to_grid", + text="Selection to Grid") + layout.separator() + layout.operator("view3d.pivot_cursor", + text="Set Cursor as Pivot Point") + layout.operator("view3d.revert_pivot", + text="Revert Pivot Point") + +class VIEW3D_MT_EditCursorMenu(bpy.types.Menu): + bl_label = "Snap Cursor Menu" + + def draw(self, context): + + layout = self.layout + layout.operator_context = 'INVOKE_REGION_WIN' + layout.operator("view3d.snap_cursor_to_selected", + text="Cursor to Selected") + layout.operator("view3d.snap_cursor_to_center", + text="Cursor to Center") + layout.operator("view3d.snap_cursor_to_grid", + text="Cursor to Grid") + layout.operator("view3d.snap_cursor_to_active", + text="Cursor to Active") + layout.separator() + layout.operator("view3d.snap_selected_to_cursor", + text="Selection to Cursor") + layout.operator("view3d.snap_selected_to_grid", + text="Selection to Grid") + layout.separator() + layout.operator("view3d.pivot_cursor", + text="Set Cursor as Pivot Point") + layout.operator("view3d.revert_pivot", + text="Revert Pivot Point") + layout.operator("view3d.snap_cursor_to_edge_intersection", + text="Cursor to Edge Intersection") + layout.operator("transform.snap_type", text="Snap Tools", + icon='SNAP_ON') + +def abs(val): + if val > 0: + return val + return -val + +def edgeIntersect(context, operator): + from mathutils.geometry import intersect_line_line + + obj = context.active_object + + if (obj.type != "MESH"): + operator.report({'ERROR'}, "Object must be a mesh") + return None + + edges = [] + mesh = obj.data + verts = mesh.vertices + + is_editmode = (obj.mode == 'EDIT') + if is_editmode: + bpy.ops.object.mode_set(mode='OBJECT') + + for e in mesh.edges: + if e.select: + edges.append(e) + + if len(edges) > 2: + break + + if is_editmode: + bpy.ops.object.mode_set(mode='EDIT') + + if len(edges) != 2: + operator.report({'ERROR'}, + "Operator requires exactly 2 edges to be selected") + return + + line = intersect_line_line(verts[edges[0].vertices[0]].co, + verts[edges[0].vertices[1]].co, + verts[edges[1].vertices[0]].co, + verts[edges[1].vertices[1]].co) + + if line is None: + operator.report({'ERROR'}, "Selected edges do not intersect") + return + + point = line[0].lerp(line[1], 0.5) + context.scene.cursor_location = obj.matrix_world * point + +class VIEW3D_OT_CursorToEdgeIntersection(bpy.types.Operator): + "Finds the mid-point of the shortest distance between two edges" + + bl_idname = "view3d.snap_cursor_to_edge_intersection" + bl_label = "Cursor to Edge Intersection" + + @classmethod + def poll(cls, context): + obj = context.active_object + return obj != None and obj.type == 'MESH' + + def execute(self, context): + edgeIntersect(context, self) + return {'FINISHED'} + +class VIEW3D_MT_undoS(bpy.types.Menu): + bl_label = "Undo/Redo" + + def draw(self, context): + layout = self.layout + layout.operator_context = 'INVOKE_REGION_WIN' + layout.operator("ed.undo", icon='TRIA_LEFT') + layout.operator("ed.redo", icon='TRIA_RIGHT') + +def register(): + bpy.utils.register_module(__name__) + + +def unregister(): + bpy.utils.unregister_module(__name__) + +if __name__ == "__main__": + register()