mirror of
https://github.com/blender/blender-addons.git
synced 2025-08-16 15:35:05 +00:00
2859 lines
120 KiB
Python
2859 lines
120 KiB
Python
# ##### 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: meta-androcto, JayDez, sim88, sam, lijenstina, mkb, wisaac, CoDEmanX #
|
|
|
|
bl_info = {
|
|
"name": "Dynamic Context Menu",
|
|
"author": "meta-androcto",
|
|
"version": (1, 8, 2),
|
|
"blender": (2, 77, 0),
|
|
"location": "View3D > Spacebar",
|
|
"description": "Object Mode Context Sensitive Spacebar 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.types import Operator, Menu
|
|
from bl_ui.properties_paint_common import UnifiedPaintPanel, brush_texture_settings
|
|
|
|
### Dynamic Context Sensitive Menu ###
|
|
### Main Menu based on Object Type & 3d View Editor Mode ###
|
|
|
|
class VIEW3D_MT_Space_Dynamic_Menu(bpy.types.Menu):
|
|
bl_label = "Dynamic Context Menu"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
settings = context.tool_settings
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
scene = context.scene
|
|
obj = context.object
|
|
|
|
### No Object Selected ###
|
|
if not context.active_object:
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_View_Directions", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_View_Navigation", icon='ROTATE')
|
|
layout.menu("VIEW3D_MT_View_Toggle", icon='SPLITSCREEN')
|
|
layout.operator("view3d.snap_cursor_to_center",
|
|
text="Cursor to Center")
|
|
layout.operator("view3d.snap_cursor_to_grid",
|
|
text="Cursor to Grid")
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Mesh Object Mode ###
|
|
if obj and obj.type == 'MESH' and obj.mode in {'OBJECT'}:
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_specials", text = "Specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
|
|
layout.operator_menu_enum("object.modifier_add", "type", icon='MODIFIER')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Mesh Edit Mode ##
|
|
if obj and obj.type == 'MESH' and obj.mode in {'EDIT'}:
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Edit_Mesh", icon='RESTRICT_SELECT_OFF')
|
|
layout.menu("VIEW3D_MT_Edit_Multi", icon='VERTEXSEL')
|
|
UseSeparator(self,context)
|
|
layout.menu("INFO_MT_mesh_add", text="Add Mesh", icon='OUTLINER_OB_MESH')
|
|
layout.menu("VIEW3D_MT_Edit_Mesh", text="Mesh", icon='MESH_DATA')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenuEdit", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_EditCursorMenu", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UV_Map", icon='MOD_UVPROJECT')
|
|
layout.menu("VIEW3D_MT_edit_mesh_specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_edit_mesh_extrude", icon='ORTHO')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_edit_mesh_delete", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Sculpt Mode ##
|
|
if obj and obj.type == 'MESH' and obj.mode in {'SCULPT'}:
|
|
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_Sculpts", icon='SCULPTMODE_HLT')
|
|
layout.menu("VIEW3D_MT_Brush_Selection", text="Sculpt Tool", icon='BRUSH_SCULPT_DRAW')
|
|
layout.menu("VIEW3D_MT_Brush_Settings", icon='BRUSH_DATA')
|
|
layout.menu("VIEW3D_MT_Hide_Masks", icon='RESTRICT_VIEW_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_Sculpt_Specials", icon='SOLO_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Vertex Paint ##
|
|
if obj and obj.type == 'MESH' and obj.mode in {'VERTEX_PAINT'}:
|
|
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_Brush_Settings", icon='BRUSH_DATA')
|
|
layout.menu("VIEW3D_MT_Brush_Selection", text="Vertex Paint Tool", icon='BRUSH_VERTEXDRAW')
|
|
layout.menu("VIEW3D_MT_Vertex_Colors", icon='GROUP_VCOL')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Weight Paint Menu ##
|
|
if obj and obj.type == 'MESH' and obj.mode in {'WEIGHT_PAINT'}:
|
|
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_Paint_Weights", icon='WPAINT_HLT')
|
|
layout.menu("VIEW3D_MT_Brush_Settings", icon='BRUSH_DATA')
|
|
layout.menu("VIEW3D_MT_Brush_Selection", text="Weight Paint Tool", icon='BRUSH_TEXMASK')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Texture Paint ##
|
|
if obj and obj.type == 'MESH' and obj.mode in {'TEXTURE_PAINT'}:
|
|
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Brush_Settings", icon='BRUSH_DATA')
|
|
layout.menu("VIEW3D_MT_Brush_Selection", text="Texture Paint Tool", icon='SCULPTMODE_HLT')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Curve Object Mode ###
|
|
if obj and obj.type == 'CURVE' and obj.mode in {'OBJECT'}:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_specials", text = "Specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
|
|
layout.operator_menu_enum("object.modifier_add", "type", icon='MODIFIER')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.operator("object.editmode_toggle", text="Enter Edit Mode",
|
|
icon='OBJECT_DATA')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Edit Curve ##
|
|
if obj and obj.type == 'CURVE' and obj.mode in {'EDIT'}:
|
|
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Edit_Curve",
|
|
icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("INFO_MT_curve_add", text="Add Curve",
|
|
icon='OUTLINER_OB_CURVE')
|
|
layout.menu("VIEW3D_MT_Edit_Curve", icon='CURVE_DATA')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
|
|
layout.menu("VIEW3D_MT_EditCurveCtrlpoints",
|
|
icon='CURVE_BEZCURVE')
|
|
layout.menu("VIEW3D_MT_EditCurveSpecials",
|
|
icon= 'SOLO_OFF')
|
|
UseSeparator(self,context)
|
|
layout.operator("curve.delete", text="Delete Object",
|
|
icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.operator("object.editmode_toggle", text="Enter Object Mode",
|
|
icon='OBJECT_DATA')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Surface Object Mode ###
|
|
if obj and obj.type == 'SURFACE' and obj.mode in {'OBJECT'}:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_specials", text = "Specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
|
|
layout.operator_menu_enum("object.modifier_add", "type", icon='MODIFIER')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.operator("object.editmode_toggle", text="Enter Edit Mode",
|
|
icon='OBJECT_DATA')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Edit Surface ##
|
|
if obj and obj.type == 'SURFACE' and obj.mode in {'EDIT'}:
|
|
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Edit_Surface", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("INFO_MT_surface_add", text="Add Surface",
|
|
icon='OUTLINER_OB_SURFACE')
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.prop_menu_enum(settings, "proportional_edit",
|
|
icon="PROP_CON")
|
|
layout.prop_menu_enum(settings, "proportional_edit_falloff",
|
|
icon="SMOOTHCURVE")
|
|
layout.menu("VIEW3D_MT_EditCurveSpecials",
|
|
icon='SOLO_OFF')
|
|
UseSeparator(self,context)
|
|
layout.operator("curve.delete", text="Delete Object",
|
|
icon='CANCEL')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.operator("object.editmode_toggle", text="Enter Object Mode",
|
|
icon='OBJECT_DATA')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Metaball Object Mode ###
|
|
if obj and obj.type == 'META' and obj.mode in {'OBJECT'}:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_specials", text = "Specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.operator("object.editmode_toggle", text="Enter Edit Mode",
|
|
icon='OBJECT_DATA')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Edit Metaball ##
|
|
if obj and obj.type == 'META' and obj.mode in {'EDIT'}:
|
|
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_SelectMetaball", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.operator_menu_enum("object.metaball_add", "type",
|
|
text="Add Metaball",
|
|
icon='OUTLINER_OB_META')
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.prop_menu_enum(settings, "proportional_edit",
|
|
icon="PROP_CON")
|
|
layout.prop_menu_enum(settings, "proportional_edit_falloff",
|
|
icon="SMOOTHCURVE")
|
|
UseSeparator(self,context)
|
|
layout.operator("mball.delete_metaelems", text="Delete Object",
|
|
icon='CANCEL')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.operator("object.editmode_toggle", text="Enter Object Mode",
|
|
icon='OBJECT_DATA')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Text Object Mode ###
|
|
if obj and obj.type == 'FONT' and obj.mode in {'OBJECT'}:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_specials", text = "Specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
# New Entry For Switching to Editmode
|
|
layout.operator("view3d.interactive_mode_text", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Text Edit Mode ###
|
|
# To Do: Space is already reserved for the typing tool
|
|
if obj and obj.type == 'FONT' and obj.mode in {'EDIT'}:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_select_edit_text", icon='VIEW3D')
|
|
layout.menu("VIEW3D_MT_edit_font", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.operator("object.editmode_toggle", text="Enter Object Mode",
|
|
icon='OBJECT_DATA')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Camera Object Mode ###
|
|
if obj and obj.type == 'CAMERA' and obj.mode in {'OBJECT'}:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_CursorMenuLite", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_specials", text = "Specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Lamp Object Mode ###
|
|
if obj and obj.type == 'LAMP' and obj.mode in {'OBJECT'}:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenuLite", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_CursorMenuLite", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_specials", text = "Specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Armature Object Mode ###
|
|
if obj and obj.type == 'ARMATURE' and obj.mode in {'OBJECT'}:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenuArmature", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenuLite", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_specials", text = "Specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.menu("VIEW3D_MT_Object_Interactive_Armature", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Armature Edit ##
|
|
if obj and obj.type == 'ARMATURE' and obj.mode in {'EDIT'}:
|
|
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Edit_Armature",
|
|
icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("INFO_MT_armature_add", text="Add Armature",
|
|
icon='OUTLINER_OB_ARMATURE')
|
|
layout.menu("VIEW3D_MT_Edit_Armature", text="Armature",
|
|
icon='OUTLINER_DATA_ARMATURE')
|
|
layout.menu("VIEW3D_MT_EditArmatureTK",
|
|
icon='ARMATURE_DATA')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenuArmatureEdit", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenuLite", icon='CURSOR')
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_armature_specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_edit_armature_roll",
|
|
icon='BONE_DATA')
|
|
UseSeparator(self,context)
|
|
layout.operator("armature.delete", text="Delete Object",
|
|
icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.menu("VIEW3D_MT_Object_Interactive_Armature", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Armature Pose ##
|
|
if obj and obj.type == 'ARMATURE' and obj.mode in {'POSE'}:
|
|
|
|
arm = context.active_object.data
|
|
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Pose", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_Pose", icon='OUTLINER_DATA_POSE')
|
|
layout.menu("VIEW3D_MT_TransformMenuArmaturePose", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_pose_transform", icon='EMPTY_DATA')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_CursorMenuLite", icon='CURSOR')
|
|
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", icon='AUTO')
|
|
layout.operator("pose.relax", icon= 'ARMATURE_DATA')
|
|
layout.menu("VIEW3D_MT_KeyframeMenu", icon='KEY_HLT')
|
|
layout.menu("VIEW3D_MT_pose_specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_pose_group", icon= 'GROUP_BONE')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.menu("VIEW3D_MT_Object_Interactive_Armature", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Lattice Object Mode ###
|
|
if obj and obj.type == 'LATTICE' and obj.mode in {'OBJECT'}:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_specials", text = "Specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
|
|
layout.operator_menu_enum("object.modifier_add", "type", icon='MODIFIER')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.operator("object.editmode_toggle", text="Enter Edit Mode",
|
|
icon='OBJECT_DATA')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Edit Lattice ##
|
|
if obj and obj.type == 'LATTICE' and obj.mode in {'EDIT'}:
|
|
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Edit_Lattice",
|
|
icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.prop_menu_enum(settings, "proportional_edit",
|
|
icon= "PROP_CON")
|
|
layout.prop_menu_enum(settings, "proportional_edit_falloff",
|
|
icon= "SMOOTHCURVE")
|
|
UseSeparator(self,context)
|
|
layout.operator("lattice.make_regular")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.operator("object.editmode_toggle", text="Enter Object Mode",
|
|
icon='OBJECT_DATA')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Empty Object Mode ###
|
|
if obj and obj.type == 'EMPTY' and obj.mode in {'OBJECT'}:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenuLite", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenuLite", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_specials", text = "Specials", icon='SOLO_OFF')
|
|
layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
### Speaker Object Mode ###
|
|
if obj and obj.type == 'SPEAKER' and obj.mode in {'OBJECT'}:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
|
|
layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenuLite", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_CursorMenuLite", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
|
|
layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
## Particle Menu ##
|
|
if obj and context.mode == 'PARTICLE':
|
|
|
|
layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
|
|
layout.menu("VIEW3D_MT_Select_Particle",
|
|
icon='RESTRICT_SELECT_OFF')
|
|
layout.menu("VIEW3D_MT_Selection_Mode_Particle",
|
|
text="Select and Display Mode", icon='PARTICLE_PATH')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
|
|
layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
|
|
layout.menu("VIEW3D_MT_CursorMenuLite", icon='CURSOR')
|
|
UseSeparator(self,context)
|
|
layout.prop_menu_enum(settings, "proportional_edit",
|
|
icon= "PROP_CON")
|
|
layout.prop_menu_enum(settings, "proportional_edit_falloff",
|
|
icon= "SMOOTHCURVE")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_particle", icon='PARTICLEMODE')
|
|
layout.menu("VIEW3D_MT_particle_specials", text="Hair Specials", icon='HAIR')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.delete", text="Delete Object", icon='X_VEC')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
|
|
layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='VIEW3D')
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
|
|
|
############ Object Menus #########
|
|
|
|
# ********** Object Menu **********
|
|
class VIEW3D_MT_Object(bpy.types.Menu):
|
|
bl_context = "objectmode"
|
|
bl_label = "Object"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
view = context.space_data
|
|
is_local_view = (view.local_view is not None)
|
|
|
|
layout.operator("object.delete", text="Delete...").use_global = False
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_parent")
|
|
layout.menu("VIEW3D_MT_Duplicate")
|
|
layout.operator("object.join")
|
|
|
|
if is_local_view:
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
|
layout.operator("object.move_to_layer", text="Move out of Local View")
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
else:
|
|
layout.operator("object.move_to_layer", text="Move to Layer...")
|
|
|
|
layout.menu("VIEW3D_MT_make_links", text="Make Links...")
|
|
layout.menu("VIEW3D_MT_Object_Data_Link")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AutoSmooth", icon='ALIASED')
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_constraints")
|
|
layout.menu("VIEW3D_MT_object_track")
|
|
layout.menu("VIEW3D_MT_object_animation")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_game")
|
|
layout.menu("VIEW3D_MT_object_showhide")
|
|
UseSeparator(self,context)
|
|
layout.operator_menu_enum("object.convert", "target")
|
|
|
|
# ********** Object Add **********
|
|
class VIEW3D_MT_AddMenu(bpy.types.Menu):
|
|
bl_label = "Add Object"
|
|
|
|
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')
|
|
UseSeparator(self,context)
|
|
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.operator_menu_enum("object.empty_add", "type", text="Empty", icon='OUTLINER_OB_EMPTY')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.speaker_add", text="Speaker", icon='OUTLINER_OB_SPEAKER')
|
|
UseSeparator(self,context)
|
|
layout.operator("object.camera_add", text="Camera",
|
|
icon='OUTLINER_OB_CAMERA')
|
|
layout.operator_menu_enum("object.lamp_add", "type",
|
|
icon="OUTLINER_OB_LAMP")
|
|
UseSeparator(self,context)
|
|
layout.operator_menu_enum("object.effector_add", "type",
|
|
text="Force Field",
|
|
icon='FORCE_FORCE')
|
|
layout.menu("VIEW3D_MT_object_quick_effects", text="Quick Effects", icon='PARTICLES')
|
|
UseSeparator(self,context)
|
|
layout.operator_menu_enum("object.group_instance_add", "group",
|
|
text="Group Instance",
|
|
icon='GROUP_VERTEX')
|
|
|
|
# ********** Object Manipulator **********
|
|
class VIEW3D_MT_ManipulatorMenu1(bpy.types.Menu):
|
|
bl_label = "Manipulator"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
props = layout.operator("view3d.enable_manipulator",text ='Translate', icon='MAN_TRANS')
|
|
props.translate = True
|
|
props = layout.operator("view3d.enable_manipulator",text ='Rotate', icon='MAN_ROT')
|
|
props.rotate = True
|
|
props = layout.operator("view3d.enable_manipulator",text ='Scale', icon='MAN_SCALE')
|
|
props.scale = True
|
|
UseSeparator(self,context)
|
|
props = layout.operator("view3d.enable_manipulator",text ='Combo', icon='MAN_SCALE')
|
|
props.scale = True
|
|
props.rotate = True
|
|
props.translate = True
|
|
props = layout.operator("view3d.enable_manipulator",text ='Hide', icon='MAN_SCALE')
|
|
props.scale = False
|
|
props.rotate = False
|
|
props.translate = False
|
|
|
|
# ********** Object Mirror **********
|
|
class VIEW3D_MT_MirrorMenu(bpy.types.Menu):
|
|
bl_label = "Mirror"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("transform.mirror", text="Interactive Mirror")
|
|
UseSeparator(self,context)
|
|
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:
|
|
|
|
UseSeparator(self,context)
|
|
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'
|
|
UseSeparator(self,context)
|
|
layout.operator("object.vertex_group_mirror")
|
|
|
|
# ********** Object Snap Cursor **********
|
|
class VIEW3D_MT_Pivot(bpy.types.Menu):
|
|
bl_label = "Pivot"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.prop(context.space_data, "pivot_point", expand=True)
|
|
if context.active_object.mode == 'OBJECT':
|
|
UseSeparator(self,context)
|
|
layout.prop(context.space_data, "use_pivot_point_align", text="Center Points")
|
|
|
|
class VIEW3D_Snap_Context(bpy.types.Menu):
|
|
bl_label = "Snapping"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
toolsettings = context.tool_settings
|
|
layout.prop(toolsettings, "snap_element", expand=True)
|
|
layout.prop(toolsettings, "use_snap")
|
|
|
|
class VIEW3D_Snap_Origin(bpy.types.Menu):
|
|
bl_label = "Snap "
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'EXEC_AREA'
|
|
layout.operator("object.origin_set",
|
|
text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
|
|
UseSeparator(self,context)
|
|
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'
|
|
layout.operator("object.origin_set",
|
|
text="Origin to Center of Mass").type = 'ORIGIN_CENTER_OF_MASS'
|
|
|
|
class VIEW3D_MT_CursorMenu(bpy.types.Menu):
|
|
bl_label = "Snap Cursor"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.menu("VIEW3D_Snap_Origin")
|
|
layout.menu("VIEW3D_Snap_Context")
|
|
UseSeparator(self,context)
|
|
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")
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor").use_offset = False
|
|
layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor (Offset)").use_offset = True
|
|
layout.operator("view3d.snap_selected_to_grid",
|
|
text="Selection to Grid")
|
|
layout.operator("view3d.snap_cursor_selected_to_center",
|
|
text="Selection and Cursor to Center")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_Pivot")
|
|
layout.operator("view3d.pivot_cursor",
|
|
text="Set Cursor as Pivot Point")
|
|
layout.operator("view3d.revert_pivot",
|
|
text="Revert Pivot Point")
|
|
|
|
class VIEW3D_MT_CursorMenuLite(bpy.types.Menu):
|
|
bl_label = "Snap Cursor"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.menu("VIEW3D_Snap_Origin")
|
|
UseSeparator(self,context)
|
|
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")
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor").use_offset = False
|
|
layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor (Offset)").use_offset = True
|
|
layout.operator("view3d.snap_selected_to_grid",
|
|
text="Selection to Grid")
|
|
layout.operator("view3d.snap_cursor_selected_to_center",
|
|
text="Selection and Cursor to Center")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_Pivot")
|
|
layout.operator("view3d.pivot_cursor",
|
|
text="Set Cursor as Pivot Point")
|
|
layout.operator("view3d.revert_pivot",
|
|
text="Revert Pivot Point")
|
|
|
|
# ********** Object Interactive Mode **********
|
|
class InteractiveMode(bpy.types.Menu):
|
|
bl_idname = "VIEW3D_MT_Object_Interactive_Mode"
|
|
bl_label = "Interactive Mode"
|
|
bl_description = "Menu of objects interactive modes (Window Types)"
|
|
|
|
def draw(self, context):
|
|
self.layout.operator(SetObjectMode.bl_idname, text="Object", icon="OBJECT_DATAMODE").mode = "OBJECT"
|
|
self.layout.operator(SetObjectMode.bl_idname, text="Edit", icon="EDITMODE_HLT").mode = "EDIT"
|
|
self.layout.operator(SetObjectMode.bl_idname, text="Sculpt", icon="SCULPTMODE_HLT").mode = "SCULPT"
|
|
self.layout.operator(SetObjectMode.bl_idname, text="Vertex Paint", icon="VPAINT_HLT").mode = "VERTEX_PAINT"
|
|
self.layout.operator(SetObjectMode.bl_idname, text="Weight Paint", icon="WPAINT_HLT").mode = "WEIGHT_PAINT"
|
|
self.layout.operator(SetObjectMode.bl_idname, text="Texture Paint", icon="TPAINT_HLT").mode = "TEXTURE_PAINT"
|
|
self.layout.operator(SetObjectMode.bl_idname, text="Particle Edit", icon="PARTICLEMODE").mode = "PARTICLE_EDIT"
|
|
|
|
# ********** Object Armature Interactive Mode **********
|
|
class InteractiveModeArmature(bpy.types.Menu):
|
|
bl_idname = "VIEW3D_MT_Object_Interactive_Armature"
|
|
bl_label = "Interactive Mode"
|
|
bl_description = "Menu of objects interactive mode"
|
|
|
|
def draw(self, context):
|
|
self.layout.operator(SetObjectMode.bl_idname, text="Object", icon="OBJECT_DATAMODE").mode = "OBJECT"
|
|
self.layout.operator(SetObjectMode.bl_idname, text="Edit", icon="EDITMODE_HLT").mode = "EDIT"
|
|
self.layout.operator(SetObjectMode.bl_idname, text="Pose", icon="POSE_HLT").mode = "POSE"
|
|
|
|
# ********** Text Interactive Mode **********
|
|
class VIEW3D_OT_Interactive_Mode_Text(bpy.types.Operator):
|
|
"""Toggle object's editmode"""
|
|
bl_idname = "view3d.interactive_mode_text"
|
|
bl_label = "Enter Edit Mode"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
return (context.active_object is not None)
|
|
|
|
def execute(self, context):
|
|
bpy.ops.object.editmode_toggle()
|
|
self.report({'INFO'}, "Spacebar shortcut won't work in the Text Edit mode")
|
|
return {'FINISHED'}
|
|
|
|
|
|
# ********** Object Parent **********
|
|
class VIEW3D_MT_ParentMenu(bpy.types.Menu):
|
|
bl_label = "Parent"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator("object.parent_set", text="Set")
|
|
layout.operator("object.parent_clear", text="Clear")
|
|
|
|
# ********** Object Group **********
|
|
class VIEW3D_MT_GroupMenu(bpy.types.Menu):
|
|
bl_label = "Group"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("group.create")
|
|
layout.operator("group.objects_add_active")
|
|
UseSeparator(self,context)
|
|
layout.operator("group.objects_remove")
|
|
layout.operator("group.objects_remove_all")
|
|
layout.operator("group.objects_remove_active")
|
|
|
|
# ********** Object Camera Options **********
|
|
class VIEW3D_MT_Camera_Options(bpy.types.Menu):
|
|
bl_label = "Camera"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
|
layout.operator("object.camera_add", text="Add Camera", icon='OUTLINER_OB_CAMERA')
|
|
self.layout.operator("view3d.object_as_camera", text="Object As Camera", icon='OUTLINER_OB_CAMERA')
|
|
self.layout.operator("view3d.viewnumpad", text="View Active Camera" , icon='OUTLINER_OB_CAMERA').type = 'CAMERA'
|
|
|
|
|
|
class VIEW3D_MT_Object_Data_Link(Menu):
|
|
bl_label = "Object Data"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator_menu_enum("object.make_local", "type", text="Make Local...")
|
|
layout.menu("VIEW3D_MT_make_single_user")
|
|
layout.operator("object.proxy_make", text="Make Proxy...")
|
|
layout.operator("object.make_dupli_face")
|
|
UseSeparator(self,context)
|
|
layout.operator("object.data_transfer")
|
|
layout.operator("object.datalayout_transfer")
|
|
|
|
class VIEW3D_MT_Duplicate(Menu):
|
|
bl_label = "Duplicate"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator("object.duplicate_move")
|
|
layout.operator("object.duplicate_move_linked")
|
|
|
|
class VIEW3D_MT_KeyframeMenu(bpy.types.Menu):
|
|
bl_label = "Keyframe"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
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...")
|
|
|
|
class VIEW3D_MT_UndoS(bpy.types.Menu):
|
|
bl_label = "Undo/Redo"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator("ed.undo")
|
|
layout.operator("ed.redo")
|
|
UseSeparator(self,context)
|
|
layout.operator("ed.undo_history")
|
|
|
|
# ********** Normals / Auto Smooth Menu **********
|
|
# Thanks to marvin.k.breuer for the Autosmooth part of the menu
|
|
class VIEW3D_MT_AutoSmooth(bpy.types.Menu):
|
|
bl_label = "Normals / Auto Smooth"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
obj = context.object
|
|
obj_data = context.active_object.data
|
|
|
|
# moved the VIEW3D_MT_edit_mesh_normals contents here under an Edit mode check
|
|
if obj and obj.type == 'MESH' and obj.mode in {'EDIT'}:
|
|
layout.operator("mesh.normals_make_consistent",
|
|
text="Recalculate Outside").inside = False
|
|
layout.operator("mesh.normals_make_consistent",
|
|
text="Recalculate Inside").inside = True
|
|
layout.operator("mesh.flip_normals")
|
|
UseSeparator(self,context)
|
|
|
|
layout.prop(obj_data, "show_double_sided", text = "Normals: Double Sided")
|
|
UseSeparator(self,context)
|
|
layout.prop(obj_data, "use_auto_smooth", text = "Normals: Auto Smooth")
|
|
|
|
# Auto Smooth Angle has two tab spaces to align it with the rest of the menu
|
|
layout.prop(obj_data, "auto_smooth_angle",
|
|
text=" Auto Smooth Angle")
|
|
|
|
|
|
############ Edit Mode Menu's #########
|
|
|
|
# ********** Edit Mesh **********
|
|
class VIEW3D_MT_Edit_Mesh(Menu):
|
|
bl_label = "Mesh"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
toolsettings = context.tool_settings
|
|
view = context.space_data
|
|
|
|
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')
|
|
UseSeparator(self,context)
|
|
layout.operator("mesh.duplicate_move")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_edit_mesh_clean", icon='AUTO')
|
|
layout.prop(view, "use_occlude_geometry")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_AutoSmooth", icon='META_DATA')
|
|
layout.operator("mesh.loopcut_slide",
|
|
text="Loopcut", icon='EDIT_VEC')
|
|
UseSeparator(self,context)
|
|
layout.operator("mesh.symmetrize")
|
|
layout.operator("mesh.symmetry_snap")
|
|
UseSeparator(self,context)
|
|
layout.operator("mesh.bisect")
|
|
layout.operator_menu_enum("mesh.sort_elements", "type", text="Sort Elements...")
|
|
UseSeparator(self,context)
|
|
layout.prop_menu_enum(toolsettings, "proportional_edit")
|
|
layout.prop_menu_enum(toolsettings, "proportional_edit_falloff")
|
|
UseSeparator(self,context)
|
|
|
|
layout.prop(toolsettings, "use_mesh_automerge")
|
|
#text = Double Threshold has two tab spaces to align it with the rest of the menu
|
|
layout.prop(toolsettings, "double_threshold", text=" Double Threshold")
|
|
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_edit_mesh_showhide")
|
|
|
|
# ********** Edit Multiselect **********
|
|
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'
|
|
|
|
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"
|
|
UseSeparator(self,context)
|
|
|
|
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"
|
|
UseSeparator(self,context)
|
|
|
|
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"
|
|
|
|
# ********** Edit Mesh Edge **********
|
|
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
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("mesh.mark_sharp")
|
|
layout.operator("mesh.mark_sharp", text="Clear Sharp").clear = True
|
|
layout.operator("mesh.extrude_move_along_normals", text="Extrude")
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("mesh.edge_rotate",
|
|
text="Rotate Edge CW").direction = 'CW'
|
|
layout.operator("mesh.edge_rotate",
|
|
text="Rotate Edge CCW").direction = 'CCW'
|
|
UseSeparator(self,context)
|
|
|
|
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")
|
|
|
|
|
|
# ********** Edit Mesh Cursor **********
|
|
class VIEW3D_MT_EditCursorMenu(bpy.types.Menu):
|
|
bl_label = "Snap Cursor"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("object.setorigintoselected",
|
|
text="Origin to Selected V/F/E")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_Snap_Origin")
|
|
layout.menu("VIEW3D_Snap_Context")
|
|
UseSeparator(self,context)
|
|
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.operator("view3d.snap_cursor_to_edge_intersection",
|
|
text="Cursor to Edge Intersection")
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor").use_offset = False
|
|
layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor (Offset)").use_offset = True
|
|
layout.operator("view3d.snap_selected_to_grid",
|
|
text="Selection to Grid")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_Pivot")
|
|
layout.operator("view3d.pivot_cursor",
|
|
text="Set Cursor as Pivot Point")
|
|
layout.operator("view3d.revert_pivot",
|
|
text="Revert Pivot Point")
|
|
|
|
# ********** Edit Mesh UV **********
|
|
class VIEW3D_MT_UV_Map(bpy.types.Menu):
|
|
bl_label = "UV Mapping"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("uv.unwrap")
|
|
UseSeparator(self,context)
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
|
layout.operator("uv.smart_project")
|
|
layout.operator("uv.lightmap_pack")
|
|
layout.operator("uv.follow_active_quads")
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
|
layout.operator("uv.cube_project")
|
|
layout.operator("uv.cylinder_project")
|
|
layout.operator("uv.sphere_project")
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
UseSeparator(self,context)
|
|
layout.operator("uv.project_from_view").scale_to_bounds = False
|
|
layout.operator("uv.project_from_view", text="Project from View (Bounds)").scale_to_bounds = True
|
|
UseSeparator(self,context)
|
|
layout.operator("uv.reset")
|
|
|
|
|
|
# ********** Edit Curve **********
|
|
class VIEW3D_MT_Edit_Curve(bpy.types.Menu):
|
|
bl_label = "Curve"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
toolsettings = context.tool_settings
|
|
|
|
layout.operator("curve.extrude_move")
|
|
layout.operator("curve.spin")
|
|
layout.operator("curve.duplicate_move")
|
|
layout.operator("curve.split")
|
|
layout.operator("curve.separate")
|
|
layout.operator("curve.make_segment")
|
|
layout.operator("curve.cyclic_toggle")
|
|
UseSeparator(self,context)
|
|
layout.operator("curve.delete", text="Delete...")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_edit_curve_segments")
|
|
layout.prop_menu_enum(settings, "proportional_edit",
|
|
icon="PROP_CON")
|
|
layout.prop_menu_enum(settings, "proportional_edit_falloff",
|
|
icon="SMOOTHCURVE")
|
|
layout.menu("VIEW3D_MT_edit_curve_showhide")
|
|
|
|
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.operator_menu_enum("curve.handle_type_set", "type")
|
|
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")
|
|
UseSeparator(self,context)
|
|
layout.operator("curve.switch_direction")
|
|
layout.operator("curve.spline_weight_set")
|
|
layout.operator("curve.radius_set")
|
|
UseSeparator(self,context)
|
|
layout.operator("curve.smooth")
|
|
layout.operator("curve.smooth_weight")
|
|
layout.operator("curve.smooth_radius")
|
|
layout.operator("curve.smooth_tilt")
|
|
|
|
############ Brushes Menu's ########
|
|
# Thanks to CoDEmanX for the code
|
|
class VIEW3D_MT_Brush_Selection(bpy.types.Menu):
|
|
bl_label = "Brush Tool"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
settings = UnifiedPaintPanel.paint_settings(context)
|
|
|
|
#check if brush exists (for instance, in paint mode before adding a slot)
|
|
if hasattr(settings, 'brush'):
|
|
brush = settings.brush
|
|
else:
|
|
brush = None
|
|
|
|
if not brush: return
|
|
|
|
if not context.particle_edit_object:
|
|
if UseBrushesLists():
|
|
col = layout.row()
|
|
flow = layout.column_flow(columns=3)
|
|
|
|
for brsh in bpy.data.brushes:
|
|
if (context.sculpt_object and brsh.use_paint_sculpt):
|
|
props = flow.operator("wm.context_set_id", text=brsh.name,
|
|
icon_value=layout.icon(brsh))
|
|
props.data_path = "tool_settings.sculpt.brush"
|
|
props.value = brsh.name
|
|
elif (context.image_paint_object and brsh.use_paint_image):
|
|
props = flow.operator("wm.context_set_id", text=brsh.name,
|
|
icon_value=layout.icon(brsh))
|
|
props.data_path = "tool_settings.image_paint.brush"
|
|
props.value = brsh.name
|
|
elif (context.vertex_paint_object and brsh.use_paint_vertex):
|
|
props = flow.operator("wm.context_set_id", text=brsh.name,
|
|
icon_value=layout.icon(brsh))
|
|
props.data_path = "tool_settings.vertex_paint.brush"
|
|
props.value = brsh.name
|
|
elif (context.weight_paint_object and brsh.use_paint_weight):
|
|
props = flow.operator("wm.context_set_id", text=brsh.name,
|
|
icon_value=layout.icon(brsh))
|
|
props.data_path = "tool_settings.weight_paint.brush"
|
|
props.value = brsh.name
|
|
else:
|
|
layout.template_ID_preview(settings, "brush", new="brush.add", rows=3, cols=8)
|
|
|
|
class VIEW3D_MT_Brush_Settings(bpy.types.Menu):
|
|
bl_label = "Brush Settings"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
settings = UnifiedPaintPanel.paint_settings(context)
|
|
brush = settings.brush
|
|
|
|
ups = context.tool_settings.unified_paint_settings
|
|
layout.prop(ups, "use_unified_size", text="Unified Size")
|
|
layout.prop(ups, "use_unified_strength", text="Unified Strength")
|
|
if context.image_paint_object or context.vertex_paint_object:
|
|
layout.prop(ups, "use_unified_color", text="Unified Color")
|
|
UseSeparator(self,context)
|
|
|
|
layout.menu("VIEW3D_MT_brush_paint_modes")
|
|
|
|
if not brush:
|
|
return
|
|
|
|
if context.sculpt_object:
|
|
sculpt_tool = brush.sculpt_tool
|
|
|
|
UseSeparator(self,context)
|
|
layout.operator_menu_enum("brush.curve_preset", "shape", text="Curve Preset")
|
|
UseSeparator(self,context)
|
|
|
|
if sculpt_tool != 'GRAB':
|
|
layout.prop_menu_enum(brush, "stroke_method")
|
|
|
|
if sculpt_tool in {'DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'}:
|
|
layout.prop_menu_enum(brush, "direction")
|
|
|
|
if sculpt_tool == 'LAYER':
|
|
layout.prop(brush, "use_persistent")
|
|
layout.operator("sculpt.set_persistent_base")
|
|
|
|
|
|
############ Sculpt Menu's #########
|
|
class VIEW3D_MT_Sculpts(Menu):
|
|
bl_label = "Sculpt"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
toolsettings = context.tool_settings
|
|
sculpt = toolsettings.sculpt
|
|
|
|
layout.prop(sculpt, "use_symmetry_x")
|
|
layout.prop(sculpt, "use_symmetry_y")
|
|
layout.prop(sculpt, "use_symmetry_z")
|
|
|
|
UseSeparator(self,context)
|
|
layout.prop(sculpt, "lock_x")
|
|
layout.prop(sculpt, "lock_y")
|
|
layout.prop(sculpt, "lock_z")
|
|
|
|
UseSeparator(self,context)
|
|
layout.prop(sculpt, "use_threaded", text="Threaded Sculpt")
|
|
layout.prop(sculpt, "show_low_resolution")
|
|
layout.prop(sculpt, "use_deform_only")
|
|
|
|
UseSeparator(self,context)
|
|
layout.prop(sculpt, "show_brush")
|
|
layout.prop(sculpt, "show_diffuse_color")
|
|
|
|
class VIEW3D_MT_Hide_Masks(Menu):
|
|
bl_label = "Hide/Mask"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
props = layout.operator("paint.mask_lasso_gesture", text="Lasso Mask")
|
|
UseSeparator(self,context)
|
|
props = layout.operator("view3d.select_border", text="Box Mask", icon="BORDER_RECT")
|
|
props = layout.operator("paint.hide_show", text="Box Hide")
|
|
props.action = 'HIDE'
|
|
props.area = 'INSIDE'
|
|
|
|
props = layout.operator("paint.hide_show", text="Box Show")
|
|
props.action = 'SHOW'
|
|
props.area = 'INSIDE'
|
|
UseSeparator(self,context)
|
|
|
|
props = layout.operator("paint.mask_flood_fill", text="Fill Mask", icon="BORDER_RECT")
|
|
props.mode = 'VALUE'
|
|
props.value = 1
|
|
|
|
props = layout.operator("paint.mask_flood_fill", text="Clear Mask")
|
|
props.mode = 'VALUE'
|
|
props.value = 0
|
|
|
|
layout.operator("paint.mask_flood_fill", text="Invert Mask").mode = 'INVERT'
|
|
UseSeparator(self,context)
|
|
|
|
props = layout.operator("paint.hide_show", text="Show All", icon="RESTRICT_VIEW_OFF")
|
|
props.action = 'SHOW'
|
|
props.area = 'ALL'
|
|
|
|
props = layout.operator("paint.hide_show", text="Hide Masked", icon="RESTRICT_VIEW_ON")
|
|
props.area = 'MASKED'
|
|
props.action = 'HIDE'
|
|
|
|
## Dyntopo Menu (Thanks to marvin.k.breuer) ##
|
|
class VIEW3D_MT_Sculpt_Dyntopo(bpy.types.Menu):
|
|
bl_label = "Dyntopo Set"
|
|
bl_idname = "view3d.set_brush_dyntopo"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
settings = context.tool_settings
|
|
|
|
layout.prop(settings.sculpt, "detail_refine_method", text="")
|
|
layout.prop(settings.sculpt, "detail_type_method", text="")
|
|
UseSeparator(self,context)
|
|
layout.prop(settings.sculpt, "use_smooth_shading", "Smooth")
|
|
|
|
## Sculpt Specials Menu (Thanks to marvin.k.breuer) ##
|
|
class VIEW3D_MT_Sculpt_Specials(bpy.types.Menu):
|
|
bl_label = "Sculpt Specials"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
settings = context.tool_settings
|
|
|
|
if context.sculpt_object.use_dynamic_topology_sculpting:
|
|
layout.operator("sculpt.dynamic_topology_toggle", icon='X', text="Disable Dyntopo")
|
|
UseSeparator(self,context)
|
|
if (settings.sculpt.detail_type_method == 'CONSTANT'):
|
|
layout.prop(settings.sculpt, "constant_detail", text="Const.")
|
|
layout.operator("sculpt.sample_detail_size", text="", icon='EYEDROPPER')
|
|
else:
|
|
layout.prop(settings.sculpt, "detail_size", text="Detail")
|
|
|
|
UseSeparator(self,context)
|
|
layout.operator("sculpt.symmetrize", icon='ARROW_LEFTRIGHT')
|
|
layout.prop(settings.sculpt, "symmetrize_direction", "")
|
|
UseSeparator(self,context)
|
|
layout.operator("sculpt.optimize")
|
|
if (settings.sculpt.detail_type_method == 'CONSTANT'):
|
|
layout.operator("sculpt.detail_flood_fill")
|
|
|
|
layout.menu("view3d.set_brush_dyntopo")
|
|
|
|
else:
|
|
layout.operator("sculpt.dynamic_topology_toggle", icon='SCULPT_DYNTOPO', text="Enable Dyntopo")
|
|
|
|
## Display Wire (Thanks to marvin.k.breuer) ##
|
|
class VIEW3D_OT_Display_Wire_All(bpy.types.Operator):
|
|
"""Display Wire on All Objects"""
|
|
bl_label = "Wire on All Objects"
|
|
bl_idname = "view3d.display_wire_all"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
return context.active_object is not None
|
|
|
|
def execute(self, context):
|
|
|
|
for obj in bpy.data.objects:
|
|
if obj.show_wire:
|
|
obj.show_all_edges = False
|
|
obj.show_wire = False
|
|
else:
|
|
obj.show_all_edges = True
|
|
obj.show_wire = True
|
|
|
|
return {'FINISHED'}
|
|
|
|
## Vertex Color Menu ##
|
|
class VIEW3D_MT_Vertex_Colors(Menu):
|
|
bl_label = "Vertex Colors"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("paint.vertex_color_set")
|
|
UseSeparator(self,context)
|
|
layout.operator("paint.vertex_color_smooth")
|
|
layout.operator("paint.vertex_color_dirt")
|
|
|
|
## Weight Paint Menu ##
|
|
class VIEW3D_MT_Paint_Weights(Menu):
|
|
bl_label = "Weights"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator("paint.weight_from_bones", text="Assign Automatic From Bones").type = 'AUTOMATIC'
|
|
layout.operator("paint.weight_from_bones", text="Assign From Bone Envelopes").type = 'ENVELOPES'
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("object.vertex_group_normalize_all", text="Normalize All")
|
|
layout.operator("object.vertex_group_normalize", text="Normalize")
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("object.vertex_group_mirror", text="Mirror")
|
|
layout.operator("object.vertex_group_invert", text="Invert")
|
|
UseSeparator(self,context)
|
|
layout.operator("object.vertex_group_clean", text="Clean")
|
|
layout.operator("object.vertex_group_quantize", text="Quantize")
|
|
UseSeparator(self,context)
|
|
layout.operator("object.vertex_group_levels", text="Levels")
|
|
layout.operator("object.vertex_group_smooth", text="Smooth")
|
|
UseSeparator(self,context)
|
|
props = layout.operator("object.data_transfer", text="Transfer Weights")
|
|
props.use_reverse_transfer = True
|
|
props.data_type = 'VGROUP_WEIGHTS'
|
|
UseSeparator(self,context)
|
|
layout.operator("object.vertex_group_limit_total", text="Limit Total")
|
|
layout.operator("object.vertex_group_fix", text="Fix Deforms")
|
|
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("paint.weight_set")
|
|
############ Armature Menu's #########
|
|
|
|
class VIEW3D_MT_Edit_Armature(bpy.types.Menu):
|
|
bl_label = "Armature"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
edit_object = context.edit_object
|
|
arm = edit_object.data
|
|
toolsettings = context.tool_settings
|
|
|
|
layout.prop_menu_enum(toolsettings, "proportional_edit", icon="PROP_CON")
|
|
layout.prop_menu_enum(toolsettings, "proportional_edit_falloff", icon="SMOOTHCURVE")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_bone_options_toggle", text="Bone Settings")
|
|
layout.operator("armature.merge")
|
|
layout.operator("armature.fill")
|
|
layout.operator("armature.split")
|
|
layout.operator("armature.separate")
|
|
layout.operator("armature.switch_direction", text="Switch Direction")
|
|
layout.operator_context = 'EXEC_AREA'
|
|
layout.operator("armature.symmetrize")
|
|
UseSeparator(self,context)
|
|
layout.operator("armature.delete")
|
|
UseSeparator(self,context)
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
|
layout.operator("armature.armature_layers")
|
|
layout.operator("armature.bone_layers")
|
|
|
|
class VIEW3D_MT_EditArmatureTK(bpy.types.Menu):
|
|
bl_label = "Armature Tools"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("armature.subdivide", text="Subdivide")
|
|
layout.operator("armature.extrude_move")
|
|
layout.operator("armature.extrude_forked")
|
|
layout.operator("armature.duplicate_move")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_edit_armature_delete")
|
|
UseSeparator(self,context)
|
|
layout.operator("transform.transform",
|
|
text="Scale Envelope Distance").mode = 'BONE_SIZE'
|
|
layout.operator("transform.transform",
|
|
text="Scale B-Bone Width").mode = 'BONE_SIZE'
|
|
|
|
############ Armature Pose Menu's #########
|
|
|
|
class VIEW3D_MT_Pose(bpy.types.Menu):
|
|
bl_label = "Pose"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.menu("VIEW3D_MT_object_animation")
|
|
layout.menu("VIEW3D_MT_pose_slide")
|
|
layout.menu("VIEW3D_MT_pose_propagate")
|
|
layout.menu("VIEW3D_MT_pose_library")
|
|
layout.menu("VIEW3D_MT_pose_motion")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_pose_group")
|
|
layout.menu("VIEW3D_MT_object_parent")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_pose_ik")
|
|
layout.menu("VIEW3D_MT_pose_constraints")
|
|
layout.menu("VIEW3D_MT_PoseNames")
|
|
layout.operator("pose.quaternions_flip")
|
|
layout.operator_context = 'INVOKE_AREA'
|
|
UseSeparator(self,context)
|
|
layout.operator("armature.armature_layers", text="Change Armature Layers...")
|
|
layout.operator("pose.bone_layers", text="Change Bone Layers...")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_pose_showhide")
|
|
layout.menu("VIEW3D_MT_bone_options_toggle", text="Bone Settings")
|
|
|
|
############ Transform Menu's #########
|
|
|
|
class VIEW3D_MT_TransformMenu(bpy.types.Menu):
|
|
bl_label = "Transform"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.menu("VIEW3D_MT_ManipulatorMenu1")
|
|
UseSeparator(self,context)
|
|
layout.operator("transform.translate", text="Grab/Move")
|
|
layout.operator("transform.rotate", text="Rotate")
|
|
layout.operator("transform.resize", text="Scale")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_clear")
|
|
layout.menu("VIEW3D_MT_object_apply")
|
|
UseSeparator(self,context)
|
|
layout.operator("transform.translate", text="Move Texture Space").texture_space = True
|
|
layout.operator("transform.resize", text="Scale Texture Space").texture_space = True
|
|
UseSeparator(self,context)
|
|
layout.operator("object.randomize_transform")
|
|
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")
|
|
UseSeparator(self,context)
|
|
layout.operator("object.align")
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
|
layout.operator("transform.transform",
|
|
text="Align to Transform Orientation").mode = 'ALIGN'
|
|
|
|
# ********** Edit Mesh Transform **********
|
|
class VIEW3D_MT_TransformMenuEdit(bpy.types.Menu):
|
|
bl_label = "Transform"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.menu("VIEW3D_MT_ManipulatorMenu1")
|
|
UseSeparator(self,context)
|
|
layout.operator("transform.translate", text="Grab/Move")
|
|
layout.operator("transform.rotate", text="Rotate")
|
|
layout.operator("transform.resize", text="Scale")
|
|
UseSeparator(self,context)
|
|
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")
|
|
layout.operator("transform.vertex_warp", text="Warp")
|
|
layout.operator("transform.vertex_random", text="Randomize")
|
|
UseSeparator(self,context)
|
|
layout.operator("transform.translate", text="Move Texture Space").texture_space = True
|
|
layout.operator("transform.resize", text="Scale Texture Space").texture_space = True
|
|
UseSeparator(self,context)
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
|
layout.operator("transform.transform",
|
|
text="Align to Transform Orientation").mode = 'ALIGN'
|
|
layout.operator_context = 'EXEC_AREA'
|
|
layout.operator("object.origin_set",
|
|
text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
|
|
|
|
# ********** Transform Lite/Short **********
|
|
class VIEW3D_MT_TransformMenuLite(bpy.types.Menu):
|
|
bl_label = "Transform"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.menu("VIEW3D_MT_ManipulatorMenu1")
|
|
UseSeparator(self,context)
|
|
layout.operator("transform.translate", text="Grab/Move")
|
|
layout.operator("transform.rotate", text="Rotate")
|
|
layout.operator("transform.resize", text="Scale")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_object_clear")
|
|
layout.menu("VIEW3D_MT_object_apply")
|
|
UseSeparator(self,context)
|
|
layout.operator("transform.transform",
|
|
text="Align to Transform Orientation").mode = 'ALIGN'
|
|
|
|
# ********** Transform Camera **********
|
|
class VIEW3D_MT_TransformMenuCamera(bpy.types.Menu):
|
|
bl_label = "Transform"
|
|
|
|
def draw(self, context):
|
|
layout.menu("VIEW3D_MT_ManipulatorMenu1")
|
|
layout.menu("VIEW3D_MT_object_clear")
|
|
layout.menu("VIEW3D_MT_object_apply")
|
|
layout.operator("transform.translate", text="Grab/Move")
|
|
layout.operator("transform.rotate", text="Rotate")
|
|
layout.operator("transform.resize", text="Scale")
|
|
layout.operator("object.align")
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
|
UseSeparator(self,context)
|
|
layout.operator("transform.transform",
|
|
text="Align to Transform Orientation").mode = 'ALIGN'
|
|
|
|
# ********** Transform Armature **********
|
|
class VIEW3D_MT_TransformMenuArmature(bpy.types.Menu):
|
|
bl_label = "Transform"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.menu("VIEW3D_MT_ManipulatorMenu1")
|
|
UseSeparator(self,context)
|
|
layout.operator("transform.translate", text="Grab/Move")
|
|
layout.operator("transform.rotate", text="Rotate")
|
|
layout.operator("transform.resize", text="Scale")
|
|
UseSeparator(self,context)
|
|
layout.operator("armature.align")
|
|
layout.operator("object.align")
|
|
layout.operator_context = 'EXEC_AREA'
|
|
UseSeparator(self,context)
|
|
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'
|
|
layout.operator("object.origin_set",
|
|
text="Origin to Center of Mass").type = 'ORIGIN_CENTER_OF_MASS'
|
|
|
|
# ********** Transform Armature Edit **********
|
|
class VIEW3D_MT_TransformMenuArmatureEdit(bpy.types.Menu):
|
|
bl_label = "Transform"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.menu("VIEW3D_MT_ManipulatorMenu1")
|
|
UseSeparator(self,context)
|
|
layout.operator("transform.translate", text="Grab/Move")
|
|
layout.operator("transform.rotate", text="Rotate")
|
|
layout.operator("transform.resize", text="Scale")
|
|
UseSeparator(self,context)
|
|
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")
|
|
layout.operator("transform.vertex_warp", text="Warp")
|
|
UseSeparator(self,context)
|
|
layout.operator("transform.vertex_random", text="Randomize")
|
|
layout.operator("armature.align")
|
|
layout.operator_context = 'EXEC_AREA'
|
|
|
|
# ********** Transform Armature Pose **********
|
|
class VIEW3D_MT_TransformMenuArmaturePose(bpy.types.Menu):
|
|
bl_label = "Transform"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.menu("VIEW3D_MT_ManipulatorMenu1")
|
|
layout.operator("transform.translate", text="Grab/Move")
|
|
layout.operator("transform.rotate", text="Rotate")
|
|
layout.operator("transform.resize", text="Scale")
|
|
UseSeparator(self,context)
|
|
layout.operator("pose.transforms_clear", text="Clear All")
|
|
layout.operator("pose.loc_clear", text="Location")
|
|
layout.operator("pose.rot_clear", text="Rotation")
|
|
layout.operator("pose.scale_clear", text="Scale")
|
|
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("pose.user_transforms_clear", text="Reset unkeyed")
|
|
obj = context.object
|
|
if obj.type == 'ARMATURE' and obj.mode in {'EDIT', 'POSE'}:
|
|
if obj.data.draw_type == 'BBONE':
|
|
layout.operator("transform.transform", text="Scale BBone").mode = 'BONE_SIZE'
|
|
elif obj.data.draw_type == 'ENVELOPE':
|
|
layout.operator("transform.transform", text="Scale Envelope Distance").mode = 'BONE_SIZE'
|
|
layout.operator("transform.transform", text="Scale Radius").mode = 'BONE_ENVELOPE'
|
|
|
|
############ View Menu's #########
|
|
|
|
class VIEW3D_MT_View_Directions(bpy.types.Menu):
|
|
bl_label = "Directions"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.viewnumpad", text="Camera").type = 'CAMERA'
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.viewnumpad", text="Top").type = 'TOP'
|
|
layout.operator("view3d.viewnumpad", text="Bottom").type = 'BOTTOM'
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.viewnumpad", text="Front").type = 'FRONT'
|
|
layout.operator("view3d.viewnumpad", text="Back").type = 'BACK'
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.viewnumpad", text="Right").type = 'RIGHT'
|
|
layout.operator("view3d.viewnumpad", text="Left").type = 'LEFT'
|
|
|
|
|
|
class VIEW3D_MT_View_Border(bpy.types.Menu):
|
|
bl_label = "Set Border"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("view3d.clip_border", text="Clipping Border...")
|
|
layout.operator("view3d.zoom_border", text="Zoom Border...")
|
|
layout.operator("view3d.render_border", text="Render Border...").camera_only = False
|
|
|
|
class VIEW3D_MT_View_Toggle(bpy.types.Menu):
|
|
bl_label = "View Toggle"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("screen.area_dupli")
|
|
UseSeparator(self,context)
|
|
layout.operator("screen.region_quadview")
|
|
layout.operator("screen.screen_full_area", text="Toggle Maximize Area")
|
|
layout.operator("screen.screen_full_area").use_hide_panels = True
|
|
|
|
|
|
class VIEW3D_MT_View_Menu(bpy.types.Menu):
|
|
bl_label = "View"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.menu("VIEW3D_MT_Shade")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_view_cameras", text="Cameras")
|
|
layout.menu("VIEW3D_MT_View_Directions")
|
|
layout.menu("VIEW3D_MT_View_Navigation")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Align")
|
|
layout.menu("VIEW3D_MT_View_Toggle")
|
|
layout.operator("view3d.view_persportho")
|
|
layout.operator("view3d.localview", text="View Global/Local")
|
|
layout.operator("view3d.view_selected").use_all_regions = False
|
|
layout.operator("view3d.view_all").center = False
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_View_Border")
|
|
layout.operator("view3d.layers", text="Show All Layers").nr = 0
|
|
UseSeparator(self,context)
|
|
# New menu entry for Animation player
|
|
layout.menu("VIEW3D_MT_Animation_Player",
|
|
text="Playback Animation", icon='PLAY')
|
|
|
|
class VIEW3D_MT_View_Navigation(bpy.types.Menu):
|
|
bl_label = "Navigation"
|
|
|
|
def draw(self, context):
|
|
from math import pi
|
|
layout = self.layout
|
|
layout.operator_enum("view3d.view_orbit", "type")
|
|
props = layout.operator("view3d.view_orbit", "Orbit Opposite")
|
|
props.type = 'ORBITRIGHT'
|
|
props.angle = pi
|
|
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.view_roll", text="Roll Left").type = 'LEFT'
|
|
layout.operator("view3d.view_roll", text="Roll Right").type = 'RIGHT'
|
|
UseSeparator(self,context)
|
|
layout.operator_enum("view3d.view_pan", "type")
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.zoom", text="Zoom In").delta = 1
|
|
layout.operator("view3d.zoom", text="Zoom Out").delta = -1
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.zoom_camera_1_to_1", text="Zoom Camera 1:1")
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.fly")
|
|
layout.operator("view3d.walk")
|
|
|
|
class VIEW3D_MT_View_Align(bpy.types.Menu):
|
|
bl_label = "Align View"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.view_all", text="Center Cursor and View All").center = True
|
|
layout.operator("view3d.view_center_cursor")
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.camera_to_view", text="Align Active Camera to View")
|
|
layout.operator("view3d.camera_to_view_selected", text="Align Active Camera to Selected")
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.view_selected")
|
|
layout.operator("view3d.view_lock_to_active")
|
|
layout.operator("view3d.view_lock_clear")
|
|
|
|
class VIEW3D_MT_View_Align_Selected(bpy.types.Menu):
|
|
bl_label = "Align View to Active"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
props = layout.operator("view3d.viewnumpad", text="Top")
|
|
props.align_active = True
|
|
props.type = 'TOP'
|
|
props = layout.operator("view3d.viewnumpad", text="Bottom")
|
|
props.align_active = True
|
|
props.type = 'BOTTOM'
|
|
props = layout.operator("view3d.viewnumpad", text="Front")
|
|
props.align_active = True
|
|
props.type = 'FRONT'
|
|
props = layout.operator("view3d.viewnumpad", text="Back")
|
|
props.align_active = True
|
|
props.type = 'BACK'
|
|
props = layout.operator("view3d.viewnumpad", text="Right")
|
|
props.align_active = True
|
|
props.type = 'RIGHT'
|
|
props = layout.operator("view3d.viewnumpad", text="Left")
|
|
props.align_active = True
|
|
props.type = 'LEFT'
|
|
|
|
class VIEW3D_MT_View_Cameras(bpy.types.Menu):
|
|
bl_label = "Cameras"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.object_as_camera")
|
|
layout.operator("view3d.viewnumpad", text="Active Camera").type = 'CAMERA'
|
|
|
|
# Matcap and AO, Wire all and X-Ray entries thanks to marvin.k.breuer
|
|
class VIEW3D_MT_Shade(Menu):
|
|
bl_label = "Shade"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.prop(context.space_data, "viewport_shade", expand=True)
|
|
UseSeparator(self,context)
|
|
|
|
if context.active_object:
|
|
if(context.mode == 'EDIT_MESH'):
|
|
layout.operator("MESH_OT_faces_shade_smooth")
|
|
layout.operator("MESH_OT_faces_shade_flat")
|
|
else:
|
|
layout.operator("OBJECT_OT_shade_smooth")
|
|
layout.operator("OBJECT_OT_shade_flat")
|
|
|
|
UseSeparator(self,context)
|
|
layout.operator("view3d.display_wire_all", text="Wire all", icon='WIRE')
|
|
layout.prop(context.object, "show_x_ray", text="X-Ray", icon="META_CUBE")
|
|
|
|
UseSeparator(self,context)
|
|
layout.prop(context.space_data.fx_settings, "use_ssao",
|
|
text="Ambient Occlusion", icon="GROUP")
|
|
layout.prop(context.space_data, "use_matcap", icon="MATCAP_01")
|
|
|
|
if context.space_data.use_matcap:
|
|
row = layout.column(1)
|
|
row.scale_y = 0.3
|
|
row.scale_x = 0.5
|
|
row.template_icon_view(context.space_data, "matcap_icon")
|
|
|
|
|
|
## Animation Player (Thanks to marvin.k.breuer) ##
|
|
class VIEW3D_MT_Animation_Player(bpy.types.Menu):
|
|
bl_label = "Animation Player"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
scene = context.scene
|
|
toolsettings = context.tool_settings
|
|
screen = context.screen
|
|
|
|
layout.operator("screen.frame_jump", text="Jump REW", icon='REW').end = False
|
|
layout.operator("screen.keyframe_jump", text="Previous FR", icon='PREV_KEYFRAME').next = False
|
|
|
|
UseSeparator(self,context)
|
|
layout.operator("screen.animation_play", text="Reverse", icon='PLAY_REVERSE').reverse = True
|
|
layout.operator("screen.animation_play", text="PLAY", icon='PLAY')
|
|
layout.operator("screen.animation_play", text="Stop", icon='PAUSE')
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("screen.keyframe_jump", text="Next FR", icon='NEXT_KEYFRAME').next = True
|
|
layout.operator("screen.frame_jump", text="Jump FF", icon='FF').end = True
|
|
|
|
|
|
############ Select Menu's #########
|
|
|
|
## Object Select ##
|
|
class VIEW3D_MT_Select_Object(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
UseSeparator(self,context)
|
|
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")
|
|
UseSeparator(self,context)
|
|
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_menu_enum("object.select_grouped", "type",
|
|
text="Grouped")
|
|
layout.operator_menu_enum("object.select_linked", "type",
|
|
text="Linked")
|
|
layout.operator("object.select_camera", text="Select Camera")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_Select_Object_More_Less", text="More/Less")
|
|
layout.operator("object.select_pattern", text="Select Pattern...")
|
|
|
|
class VIEW3D_MT_Select_Object_More_Less(bpy.types.Menu):
|
|
bl_label = "Select More/Less"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("object.select_more", text="More")
|
|
layout.operator("object.select_less", text="Less")
|
|
UseSeparator(self,context)
|
|
props = layout.operator("object.select_hierarchy", text="Parent")
|
|
props.extend = False
|
|
props.direction = 'PARENT'
|
|
props = layout.operator("object.select_hierarchy", text="Child")
|
|
props.extend = False
|
|
props.direction = 'CHILD'
|
|
UseSeparator(self,context)
|
|
props = layout.operator("object.select_hierarchy", text="Extend Parent")
|
|
props.extend = True
|
|
props.direction = 'PARENT'
|
|
props = layout.operator("object.select_hierarchy", text="Extend Child")
|
|
props.extend = True
|
|
props.direction = 'CHILD'
|
|
|
|
## Edit Select ##
|
|
class VIEW3D_MT_Select_Edit_Mesh(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
UseSeparator(self,context)
|
|
layout.operator("mesh.select_all").action = 'TOGGLE'
|
|
layout.operator("mesh.select_all", text="Inverse").action = 'INVERT'
|
|
layout.operator("mesh.select_linked", text="Linked")
|
|
layout.operator("mesh.faces_select_linked_flat",
|
|
text="Linked Flat Faces")
|
|
layout.operator("mesh.select_random", text="Random")
|
|
layout.operator("mesh.select_nth", text="Every N Number of Verts")
|
|
UseSeparator(self,context)
|
|
layout.menu("VIEW3D_MT_Edit_Mesh_Select_Trait")
|
|
layout.menu("VIEW3D_MT_Edit_Mesh_Select_Similar")
|
|
layout.menu("VIEW3D_MT_Edit_Mesh_Select_More_Less")
|
|
UseSeparator(self,context)
|
|
layout.operator("mesh.select_mirror", text="Mirror")
|
|
layout.operator("mesh.edges_select_sharp", text="Sharp Edges")
|
|
layout.operator("mesh.select_axis", text="Side of Active")
|
|
layout.operator("mesh.shortest_path_select", text="Shortest Path")
|
|
UseSeparator(self,context)
|
|
layout.operator("mesh.loop_multi_select", text="Edge Loops").ring = False
|
|
layout.operator("mesh.loop_multi_select", text="Edge Rings").ring = True
|
|
layout.operator("mesh.loop_to_region")
|
|
layout.operator("mesh.region_to_loop")
|
|
|
|
class VIEW3D_MT_Edit_Mesh_Select_Similar(bpy.types.Menu):
|
|
bl_label = "Select Similar"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_enum("mesh.select_similar", "type")
|
|
layout.operator("mesh.select_similar_region", text="Face Regions")
|
|
|
|
class VIEW3D_MT_Edit_Mesh_Select_Trait(bpy.types.Menu):
|
|
bl_label = "Select All by Trait"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
if context.scene.tool_settings.mesh_select_mode[2] is False:
|
|
layout.operator("mesh.select_non_manifold", text="Non Manifold")
|
|
layout.operator("mesh.select_loose", text="Loose Geometry")
|
|
layout.operator("mesh.select_interior_faces", text="Interior Faces")
|
|
layout.operator("mesh.select_face_by_sides", text="By Number of Verts")
|
|
layout.operator("mesh.select_ungrouped", text="Ungrouped Verts")
|
|
|
|
class VIEW3D_MT_Edit_Mesh_Select_More_Less(bpy.types.Menu):
|
|
bl_label = "Select More/Less"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("mesh.select_more", text="More")
|
|
layout.operator("mesh.select_less", text="Less")
|
|
UseSeparator(self,context)
|
|
layout.operator("mesh.select_next_item", text="Next Active")
|
|
layout.operator("mesh.select_prev_item", text="Previous Active")
|
|
|
|
## Edit Curve Select ##
|
|
class VIEW3D_MT_Select_Edit_Curve(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
UseSeparator(self,context)
|
|
layout.operator("curve.select_all").action = 'TOGGLE'
|
|
layout.operator("curve.select_all", text="Inverse").action = 'INVERT'
|
|
layout.operator("curve.select_nth")
|
|
UseSeparator(self,context)
|
|
layout.operator("curve.select_random")
|
|
layout.operator("curve.select_linked", text="Select Linked")
|
|
layout.operator("curve.select_similar", text="Select Similar")
|
|
layout.operator("curve.de_select_first")
|
|
layout.operator("curve.de_select_last")
|
|
layout.operator("curve.select_next")
|
|
layout.operator("curve.select_previous")
|
|
UseSeparator(self,context)
|
|
layout.operator("curve.select_more")
|
|
layout.operator("curve.select_less")
|
|
|
|
## Armature Select ##
|
|
class VIEW3D_MT_SelectArmatureMenu(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("armature.select_all")
|
|
layout.operator("armature.select_inverse", text="Inverse")
|
|
layout.operator("armature.select_hierarchy",
|
|
text="Parent").direction = 'PARENT'
|
|
layout.operator("armature.select_hierarchy",
|
|
text="Child").direction = 'CHILD'
|
|
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_Select_Edit_Armature(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("armature.select_all").action = 'TOGGLE'
|
|
layout.operator("armature.select_all", text="Inverse").action = 'INVERT'
|
|
layout.operator("armature.select_mirror", text="Mirror").extend = False
|
|
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("armature.select_more", text="More")
|
|
layout.operator("armature.select_less", text="Less")
|
|
|
|
UseSeparator(self,context)
|
|
|
|
props = layout.operator("armature.select_hierarchy", text="Parent")
|
|
props.extend = False
|
|
props.direction = 'PARENT'
|
|
|
|
props = layout.operator("armature.select_hierarchy", text="Child")
|
|
props.extend = False
|
|
props.direction = 'CHILD'
|
|
|
|
UseSeparator(self,context)
|
|
|
|
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_menu_enum("armature.select_similar", "type", text="Similar")
|
|
layout.operator("object.select_pattern", text="Select Pattern...")
|
|
|
|
class VIEW3D_MT_Select_Pose(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
UseSeparator(self,context)
|
|
layout.operator("pose.select_all").action = 'TOGGLE'
|
|
layout.operator("pose.select_all", text="Inverse").action = 'INVERT'
|
|
layout.operator("pose.select_mirror", text="Flip Active")
|
|
layout.operator("pose.select_constraint_target",
|
|
text="Constraint Target")
|
|
UseSeparator(self,context)
|
|
layout.operator("pose.select_linked", text="Linked")
|
|
layout.operator("pose.select_hierarchy",
|
|
text="Parent").direction = 'PARENT'
|
|
layout.operator("pose.select_hierarchy",
|
|
text="Child").direction = 'CHILD'
|
|
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.operator_menu_enum("pose.select_grouped", "type",
|
|
text="Grouped")
|
|
UseSeparator(self,context)
|
|
layout.operator("object.select_pattern", text="Select Pattern...")
|
|
layout.menu("VIEW3D_MT_select_pose_more_less")
|
|
|
|
class VIEW3D_MT_Select_Pose_More_Less(bpy.types.Menu):
|
|
bl_label = "Select More/Less"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
props = layout.operator("pose.select_hierarchy", text="Parent")
|
|
props.extend = False
|
|
props.direction = 'PARENT'
|
|
|
|
props = layout.operator("pose.select_hierarchy", text="Child")
|
|
props.extend = False
|
|
props.direction = 'CHILD'
|
|
|
|
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'
|
|
|
|
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
|
|
|
|
class VIEW3D_MT_PoseNames(bpy.types.Menu):
|
|
bl_label = "Pose Names"
|
|
|
|
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")
|
|
|
|
## Surface Select ##
|
|
class VIEW3D_MT_Select_Edit_Surface(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
UseSeparator(self,context)
|
|
layout.operator("curve.select_all").action = 'TOGGLE'
|
|
layout.operator("curve.select_all", text="Inverse").action = 'INVERT'
|
|
layout.operator("curve.select_random")
|
|
layout.operator("curve.select_nth")
|
|
layout.operator("curve.select_linked", text="Select Linked")
|
|
layout.operator("curve.select_similar", text="Select Similar")
|
|
layout.operator("curve.select_row")
|
|
UseSeparator(self,context)
|
|
layout.operator("curve.select_more")
|
|
layout.operator("curve.select_less")
|
|
|
|
## Metaball Select ##
|
|
class VIEW3D_MT_SelectMetaball(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
UseSeparator(self,context)
|
|
layout.operator("mball.select_all").action = 'TOGGLE'
|
|
layout.operator("mball.select_all").action = 'INVERT'
|
|
layout.operator("mball.select_random_metaelems")
|
|
|
|
class VIEW3D_MT_Select_Edit_Metaball(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
layout.operator("mball.select_all").action = 'TOGGLE'
|
|
layout.operator("mball.select_all", text="Inverse").action = 'INVERT'
|
|
layout.operator("mball.select_random_metaelems")
|
|
layout.operator_menu_enum("mball.select_similar", "type", text="Similar")
|
|
|
|
## Particle Select ##
|
|
class VIEW3D_MT_Selection_Mode_Particle(bpy.types.Menu):
|
|
bl_label = "Particle Select and Display Mode"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
toolsettings = context.tool_settings
|
|
|
|
layout.prop(toolsettings.particle_edit, "select_mode", expand=True)
|
|
|
|
|
|
class VIEW3D_MT_Select_Particle(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
toolsettings = context.tool_settings
|
|
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("particle.select_all").action = 'TOGGLE'
|
|
layout.operator("particle.select_linked")
|
|
layout.operator("particle.select_all", text="Inverse").action = 'INVERT'
|
|
|
|
UseSeparator(self,context)
|
|
layout.operator("particle.select_more")
|
|
layout.operator("particle.select_less")
|
|
|
|
UseSeparator(self,context)
|
|
layout.operator("particle.select_random")
|
|
|
|
UseSeparator(self,context)
|
|
layout.operator("particle.select_roots", text="Roots")
|
|
layout.operator("particle.select_tips", text="Tips")
|
|
|
|
## Lattice Edit Select ##
|
|
class VIEW3D_MT_Select_Edit_Lattice(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
UseSeparator(self,context)
|
|
layout.operator("lattice.select_mirror")
|
|
layout.operator("lattice.select_random")
|
|
layout.operator("lattice.select_all").action = 'TOGGLE'
|
|
layout.operator("lattice.select_all", text="Inverse").action = 'INVERT'
|
|
UseSeparator(self,context)
|
|
layout.operator("lattice.select_ungrouped", text="Ungrouped Verts")
|
|
|
|
## Grease Pencil Select ##
|
|
class VIEW3D_MT_Select_Gpencil(bpy.types.Menu):
|
|
# To Do: used in 3dview header might work if mapped to mouse
|
|
# Not in Class List yet
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator("gpencil.select_border")
|
|
layout.operator("gpencil.select_circle")
|
|
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("gpencil.select_all", text="(De)select All").action = 'TOGGLE'
|
|
layout.operator("gpencil.select_all", text="Inverse").action = 'INVERT'
|
|
layout.operator("gpencil.select_linked", text="Linked")
|
|
#layout.operator_menu_enum("gpencil.select_grouped", "type", text="Grouped")
|
|
layout.operator("gpencil.select_grouped", text="Grouped")
|
|
|
|
UseSeparator(self,context)
|
|
|
|
layout.operator("gpencil.select_more")
|
|
layout.operator("gpencil.select_less")
|
|
|
|
## Text Select ##
|
|
class VIEW3D_MT_Select_Edit_Text(bpy.types.Menu):
|
|
# To Do: used in 3dview header might work if mapped to mouse
|
|
# Not in Class List yet
|
|
bl_label = "Edit"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("font.text_copy", text="Copy")
|
|
layout.operator("font.text_cut", text="Cut")
|
|
layout.operator("font.text_paste", text="Paste")
|
|
layout.operator("font.text_paste_from_file")
|
|
layout.operator("font.select_all")
|
|
|
|
## Paint Mode Menus ##
|
|
class VIEW3D_MT_Select_Paint_Mask(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
layout.operator("paint.face_select_all").action = 'TOGGLE'
|
|
layout.operator("paint.face_select_all", text="Inverse").action = 'INVERT'
|
|
layout.operator("paint.face_select_linked", text="Linked")
|
|
|
|
|
|
class VIEW3D_MT_Select_Paint_Mask_Vertex(bpy.types.Menu):
|
|
bl_label = "Select"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("view3d.select_border")
|
|
layout.operator("view3d.select_circle")
|
|
layout.operator("paint.vert_select_all").action = 'TOGGLE'
|
|
layout.operator("paint.vert_select_all", text="Inverse").action = 'INVERT'
|
|
layout.operator("paint.vert_select_ungrouped", text="Ungrouped Verts")
|
|
|
|
|
|
class VIEW3D_MT_Angle_Control(bpy.types.Menu):
|
|
bl_label = "Angle Control"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
settings = UnifiedPaintPanel.paint_settings(context)
|
|
if not settings:
|
|
return False
|
|
|
|
brush = settings.brush
|
|
tex_slot = brush.texture_slot
|
|
|
|
return tex_slot.has_texture_angle and tex_slot.has_texture_angle_source
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
settings = UnifiedPaintPanel.paint_settings(context)
|
|
brush = settings.brush
|
|
|
|
sculpt = (context.sculpt_object is not None)
|
|
|
|
tex_slot = brush.texture_slot
|
|
|
|
layout.prop(tex_slot, "use_rake", text="Rake")
|
|
|
|
if brush.brush_capabilities.has_random_texture_angle and tex_slot.has_random_texture_angle:
|
|
if sculpt:
|
|
if brush.sculpt_capabilities.has_random_texture_angle:
|
|
layout.prop(tex_slot, "use_random", text="Random")
|
|
else:
|
|
layout.prop(tex_slot, "use_random", text="Random")
|
|
|
|
## Cursor Menu Operators ##
|
|
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'
|
|
return{'FINISHED'}
|
|
|
|
## Cursor Edge Intersection Defs ##
|
|
|
|
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
|
|
|
|
|
|
## Cursor Edge Intersection Operator ##
|
|
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'}
|
|
|
|
|
|
### Set Mode Operator ###
|
|
class SetObjectMode(bpy.types.Operator):
|
|
bl_idname = "object.set_object_mode"
|
|
bl_label = "Set the object interactive mode"
|
|
bl_description = "I set the interactive mode of object"
|
|
bl_options = {'REGISTER'}
|
|
|
|
mode = bpy.props.StringProperty(name="Interactive mode", default="OBJECT")
|
|
|
|
def execute(self, context):
|
|
if (context.active_object):
|
|
try:
|
|
bpy.ops.object.mode_set(mode=self.mode)
|
|
except TypeError:
|
|
self.report(type={"WARNING"}, message=context.active_object.name+" It is not possible to enter into the interactive mode")
|
|
else:
|
|
self.report(type={"WARNING"}, message="There is no active object")
|
|
return {'FINISHED'}
|
|
|
|
|
|
## Origin To Selected Edit Mode ##
|
|
def vfeOrigin(context):
|
|
cursorPositionX = bpy.context.scene.cursor_location[0]
|
|
cursorPositionY = bpy.context.scene.cursor_location[1]
|
|
cursorPositionZ = bpy.context.scene.cursor_location[2]
|
|
bpy.ops.view3d.snap_cursor_to_selected()
|
|
bpy.ops.object.mode_set()
|
|
bpy.ops.object.origin_set(type='ORIGIN_CURSOR', center='MEDIAN')
|
|
bpy.ops.object.mode_set(mode='EDIT')
|
|
bpy.context.scene.cursor_location[0] = cursorPositionX
|
|
bpy.context.scene.cursor_location[1] = cursorPositionY
|
|
bpy.context.scene.cursor_location[2] = cursorPositionZ
|
|
|
|
|
|
class SetOriginToSelected(bpy.types.Operator):
|
|
'''Tooltip'''
|
|
bl_idname = "object.setorigintoselected"
|
|
bl_label = "Set Origin to Selected"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
return context.active_object is not None
|
|
|
|
def execute(self, context):
|
|
vfeOrigin(context)
|
|
return {'FINISHED'}
|
|
|
|
# Code thanks to Isaac Weaver (wisaac) D1963
|
|
class SnapCursSelToCenter(bpy.types.Operator):
|
|
"""Snap 3D cursor and selected objects to the center \n"""\
|
|
"""Works only in Object Mode"""
|
|
bl_idname = "view3d.snap_cursor_selected_to_center"
|
|
bl_label = "Snap Cursor & Selection to Center"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
return (context.mode == "OBJECT")
|
|
|
|
def execute(self, context):
|
|
context.space_data.cursor_location = (0, 0, 0)
|
|
for obj in context.selected_objects:
|
|
obj.location = (0, 0, 0)
|
|
return {'FINISHED'}
|
|
|
|
## Draw Separator ##
|
|
def UseSeparator(operator, context):
|
|
#pass the preferences use_separators bool to enable/disable them
|
|
useSep = bpy.context.user_preferences.addons[__name__].preferences.use_separators
|
|
if useSep:
|
|
operator.layout.separator()
|
|
|
|
## Use compact brushes menus ##
|
|
def UseBrushesLists():
|
|
#pass the prefrences use_brushes_lists bool to enable/disable them
|
|
#separate function just for more convience
|
|
useLists = bpy.context.user_preferences.addons[__name__].preferences.use_brushes_lists
|
|
if useLists: return True
|
|
return False
|
|
|
|
### Addon Preferences ###
|
|
class VIEW3D_MT_Space_Dynamic_Menu_Pref(bpy.types.AddonPreferences):
|
|
bl_idname = __name__
|
|
|
|
use_separators = bpy.props.BoolProperty(
|
|
name="Use Separators in the menus",
|
|
default=True,
|
|
description="Use separators in the menus, a trade-off between \n"\
|
|
"readability vs. using more space for displaying items"
|
|
)
|
|
|
|
use_brushes_lists = bpy.props.BoolProperty(
|
|
name="Use compact menus for brushes",
|
|
default=False,
|
|
description="Use more compact menus instead \n"\
|
|
"of thumbnails for displaying brushes"
|
|
)
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
row = layout.row()
|
|
row.prop(self, "use_separators")
|
|
row.prop(self, "use_brushes_lists")
|
|
|
|
|
|
### List The Classes ###
|
|
|
|
classes = [
|
|
VIEW3D_MT_Space_Dynamic_Menu,
|
|
VIEW3D_MT_AddMenu,
|
|
VIEW3D_MT_Object,
|
|
VIEW3D_MT_Edit_Mesh,
|
|
VIEW3D_MT_TransformMenu,
|
|
VIEW3D_MT_TransformMenuEdit,
|
|
VIEW3D_MT_TransformMenuArmature,
|
|
VIEW3D_MT_TransformMenuArmatureEdit,
|
|
VIEW3D_MT_TransformMenuArmaturePose,
|
|
VIEW3D_MT_TransformMenuLite,
|
|
VIEW3D_MT_TransformMenuCamera,
|
|
VIEW3D_MT_MirrorMenu,
|
|
VIEW3D_MT_ParentMenu,
|
|
VIEW3D_MT_GroupMenu,
|
|
VIEW3D_MT_Select_Object,
|
|
VIEW3D_MT_Select_Object_More_Less,
|
|
VIEW3D_MT_Select_Edit_Mesh,
|
|
VIEW3D_MT_Edit_Mesh_Select_Similar,
|
|
VIEW3D_MT_Edit_Mesh_Select_Trait,
|
|
VIEW3D_MT_Edit_Mesh_Select_More_Less,
|
|
VIEW3D_MT_Select_Edit_Curve,
|
|
VIEW3D_MT_SelectArmatureMenu,
|
|
VIEW3D_MT_Select_Pose,
|
|
VIEW3D_MT_Select_Pose_More_Less,
|
|
VIEW3D_MT_Pose,
|
|
VIEW3D_MT_PoseCopy,
|
|
VIEW3D_MT_PoseNames,
|
|
VIEW3D_MT_Select_Edit_Surface,
|
|
VIEW3D_MT_SelectMetaball,
|
|
VIEW3D_MT_Select_Edit_Metaball,
|
|
VIEW3D_MT_Select_Particle,
|
|
VIEW3D_MT_Select_Edit_Lattice,
|
|
VIEW3D_MT_Select_Edit_Armature,
|
|
VIEW3D_MT_Select_Paint_Mask,
|
|
VIEW3D_MT_Select_Paint_Mask_Vertex,
|
|
VIEW3D_MT_Angle_Control,
|
|
VIEW3D_MT_Edit_Multi,
|
|
VIEW3D_MT_EditM_Edge,
|
|
VIEW3D_MT_Edit_Curve,
|
|
VIEW3D_MT_EditCurveCtrlpoints,
|
|
VIEW3D_MT_EditCurveSegments,
|
|
VIEW3D_MT_EditCurveSpecials,
|
|
VIEW3D_MT_Edit_Armature,
|
|
VIEW3D_MT_EditArmatureTK,
|
|
VIEW3D_MT_KeyframeMenu,
|
|
VIEW3D_OT_Pivot_Cursor,
|
|
VIEW3D_OT_Revert_Pivot,
|
|
VIEW3D_MT_CursorMenu,
|
|
VIEW3D_MT_CursorMenuLite,
|
|
VIEW3D_MT_EditCursorMenu,
|
|
VIEW3D_OT_CursorToEdgeIntersection,
|
|
VIEW3D_MT_UndoS,
|
|
VIEW3D_MT_Camera_Options,
|
|
InteractiveMode,
|
|
InteractiveModeArmature,
|
|
SetObjectMode,
|
|
VIEW3D_MT_View_Directions,
|
|
VIEW3D_MT_View_Border,
|
|
VIEW3D_MT_View_Toggle,
|
|
VIEW3D_MT_View_Menu,
|
|
VIEW3D_MT_View_Navigation,
|
|
VIEW3D_MT_View_Align,
|
|
VIEW3D_MT_View_Align_Selected,
|
|
VIEW3D_MT_View_Cameras,
|
|
VIEW3D_MT_UV_Map,
|
|
VIEW3D_MT_Pivot,
|
|
VIEW3D_Snap_Context,
|
|
VIEW3D_Snap_Origin,
|
|
VIEW3D_MT_Shade,
|
|
VIEW3D_MT_ManipulatorMenu1,
|
|
SetOriginToSelected,
|
|
VIEW3D_MT_Object_Data_Link,
|
|
VIEW3D_MT_Duplicate,
|
|
VIEW3D_MT_Space_Dynamic_Menu_Pref,
|
|
VIEW3D_MT_Selection_Mode_Particle,
|
|
VIEW3D_MT_AutoSmooth,
|
|
VIEW3D_MT_Animation_Player,
|
|
VIEW3D_OT_Interactive_Mode_Text,
|
|
SnapCursSelToCenter,
|
|
VIEW3D_MT_Sculpt_Specials,
|
|
VIEW3D_MT_Sculpt_Dyntopo,
|
|
VIEW3D_MT_Brush_Settings,
|
|
VIEW3D_MT_Brush_Selection,
|
|
VIEW3D_MT_Sculpts,
|
|
VIEW3D_MT_Hide_Masks,
|
|
VIEW3D_OT_Display_Wire_All,
|
|
VIEW3D_MT_Vertex_Colors,
|
|
VIEW3D_MT_Paint_Weights
|
|
]
|
|
|
|
## Register Classes ^ & Hotkeys ##
|
|
|
|
def register():
|
|
for cls in classes:
|
|
bpy.utils.register_class(cls)
|
|
|
|
wm = bpy.context.window_manager
|
|
kc = wm.keyconfigs.addon
|
|
if kc:
|
|
km = kc.keymaps.new(name='3D View', space_type='VIEW_3D')
|
|
kmi = km.keymap_items.new('wm.call_menu', 'SPACE', 'PRESS')
|
|
kmi.properties.name = "VIEW3D_MT_Space_Dynamic_Menu"
|
|
|
|
|
|
## Unegister Classes & Hotkeys ##
|
|
|
|
def unregister():
|
|
for cls in classes:
|
|
bpy.utils.unregister_class(cls)
|
|
|
|
wm = bpy.context.window_manager
|
|
kc = wm.keyconfigs.addon
|
|
if kc:
|
|
km = kc.keymaps['3D View']
|
|
for kmi in km.keymap_items:
|
|
if kmi.idname == 'wm.call_menu':
|
|
if kmi.properties.name == "VIEW3D_MT_Space_Dynamic_Menu":
|
|
km.keymap_items.remove(kmi)
|
|
break
|
|
|
|
if __name__ == "__main__":
|
|
register()
|