PLY: cleanup style
[blender-addons.git] / space_view3d_spacebar_menu.py
blobd4054f70c83e75773b25b1dc45ea859768bf160a
1 # ##### BEGIN GPL LICENSE BLOCK #####
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software Foundation,
15 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 # ##### END GPL LICENSE BLOCK #####
18 # Contributed to by: meta-androcto, JayDez, sim88, sam, lijenstina, mkb, wisaac, CoDEmanX #
20 bl_info = {
21 "name": "Dynamic Context Menu",
22 "author": "meta-androcto",
23 "version": (1, 8, 7),
24 "blender": (2, 77, 0),
25 "location": "View3D > Spacebar",
26 "description": "Object Mode Context Sensitive Spacebar Menu",
27 "warning": "",
28 "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/"
29 "Scripts/3D_interaction/Dynamic_Spacebar_Menu",
30 "category": "3D View",
33 import bpy
34 from bpy.types import (
35 Operator,
36 Menu,
37 AddonPreferences,
39 from bpy.props import (
40 BoolProperty,
41 StringProperty,
44 from bl_ui.properties_paint_common import UnifiedPaintPanel
47 # Dynamic Context Sensitive Menu #
48 # Main Menu based on Object Type & 3d View Editor Mode #
50 class VIEW3D_MT_Space_Dynamic_Menu(Menu):
51 bl_label = "Dynamic Context Menu"
53 def draw(self, context):
54 layout = self.layout
55 settings = context.tool_settings
56 layout.operator_context = 'INVOKE_REGION_WIN'
57 obj = context.active_object
59 # No Object Selected #
60 if not obj:
62 layout.operator_context = 'INVOKE_REGION_WIN'
63 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
64 UseSeparator(self, context)
65 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
66 layout.menu("VIEW3D_MT_View_Directions", icon='ZOOM_ALL')
67 layout.menu("VIEW3D_MT_View_Navigation", icon='PIVOT_BOUNDBOX')
68 layout.menu("VIEW3D_MT_View_Toggle", icon='WORKSPACE')
69 layout.operator("view3d.snap_cursor_to_center",
70 text="Cursor to World Origin")
71 layout.operator("view3d.snap_cursor_to_grid",
72 text="Cursor to Grid")
73 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
74 UseSeparator(self, context)
75 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
76 layout.operator("view3d.properties", icon='MENU_PANEL')
77 if context.gpencil_data and context.gpencil_data.use_stroke_edit_mode:
78 layout.menu("VIEW3D_MT_Edit_Gpencil", icon='GREASEPENCIL')
80 # Mesh Object Mode #
81 if obj and obj.type == 'MESH' and obj.mode in {'OBJECT'}:
83 layout.operator_context = 'INVOKE_REGION_WIN'
84 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
85 UseSeparator(self, context)
86 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
87 layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
88 UseSeparator(self, context)
89 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
90 layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
91 UseSeparator(self, context)
92 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
93 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
94 layout.menu("VIEW3D_MT_CursorMenu", icon='PIVOT_CURSOR')
95 UseSeparator(self, context)
96 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
97 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
98 UseSeparator(self, context)
99 layout.menu("VIEW3D_MT_object_specials", text="Specials", icon='SOLO_OFF')
100 if context.gpencil_data and context.gpencil_data.use_stroke_edit_mode:
101 layout.menu("VIEW3D_MT_Edit_Gpencil", icon='GREASEPENCIL')
102 layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
103 layout.operator_menu_enum("object.modifier_add", "type", icon='MODIFIER')
104 layout.operator_menu_enum("object.constraint_add",
105 "type", text="Add Constraint", icon='CONSTRAINT')
106 UseSeparator(self, context)
107 layout.operator("object.delete", text="Delete Object", icon='X')
108 UseSeparator(self, context)
109 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
110 layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
111 UseSeparator(self, context)
112 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
113 layout.operator("view3d.properties", icon='MENU_PANEL')
115 # Mesh Edit Mode #
116 if obj and obj.type == 'MESH' and obj.mode in {'EDIT'}:
118 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
119 UseSeparator(self, context)
120 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
121 layout.menu("VIEW3D_MT_Select_Edit_Mesh", icon='RESTRICT_SELECT_OFF')
122 layout.menu("VIEW3D_MT_Edit_Multi", icon='VERTEXSEL')
123 UseSeparator(self, context)
124 layout.menu("VIEW3D_MT_mesh_add", text="Add Mesh", icon='OUTLINER_OB_MESH')
125 layout.menu("VIEW3D_MT_Edit_Mesh", text="Mesh", icon='MESH_DATA')
126 UseSeparator(self, context)
127 layout.menu("VIEW3D_MT_TransformMenuEdit", icon='MANIPUL')
128 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
129 layout.menu("VIEW3D_MT_EditCursorMenu", icon='PIVOT_CURSOR')
130 UseSeparator(self, context)
131 layout.menu("VIEW3D_MT_UV_Map", icon='MOD_UVPROJECT')
132 layout.menu("VIEW3D_MT_edit_mesh_specials", icon='SOLO_OFF')
133 layout.menu("VIEW3D_MT_edit_mesh_extrude", icon='XRAY')
134 UseSeparator(self, context)
135 layout.operator_menu_enum("object.modifier_add", "type", icon='MODIFIER')
136 layout.operator_menu_enum("object.constraint_add",
137 "type", text="Add Constraint", icon='CONSTRAINT')
138 UseSeparator(self, context)
139 layout.menu("VIEW3D_MT_edit_mesh_delete", icon='X')
140 UseSeparator(self, context)
141 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
142 layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
143 UseSeparator(self, context)
144 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
145 layout.operator("view3d.properties", icon='MENU_PANEL')
147 # Sculpt Mode #
148 if obj and obj.type == 'MESH' and obj.mode in {'SCULPT'}:
150 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
151 UseSeparator(self, context)
152 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
153 UseSeparator(self, context)
154 layout.menu("VIEW3D_MT_Sculpts", icon='SCULPTMODE_HLT')
155 layout.menu("VIEW3D_MT_Brush_Selection", text="Sculpt Tool", icon='BRUSH_SCULPT_DRAW')
156 layout.menu("VIEW3D_MT_Brush_Settings", icon='BRUSH_DATA')
157 layout.menu("VIEW3D_MT_Hide_Masks", icon='RESTRICT_VIEW_OFF')
158 UseSeparator(self, context)
159 layout.menu("VIEW3D_MT_Sculpt_Specials", icon='SOLO_OFF')
160 UseSeparator(self, context)
161 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
162 layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
163 UseSeparator(self, context)
164 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
165 layout.operator("view3d.properties", icon='MENU_PANEL')
167 # Vertex Paint #
168 if obj and obj.type == 'MESH' and obj.mode in {'VERTEX_PAINT'}:
170 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
171 UseSeparator(self, context)
172 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
173 UseSeparator(self, context)
174 layout.menu("VIEW3D_MT_Brush_Settings", icon='BRUSH_DATA')
175 layout.menu("VIEW3D_MT_Brush_Selection",
176 text="Vertex Paint Tool", icon='BRUSH_VERTEXDRAW')
177 layout.menu("VIEW3D_MT_Vertex_Colors", icon='GROUP_VCOL')
178 UseSeparator(self, context)
179 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
180 layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
181 UseSeparator(self, context)
182 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
183 layout.operator("view3d.properties", icon='MENU_PANEL')
185 # Weight Paint Menu #
186 if obj and obj.type == 'MESH' and obj.mode in {'WEIGHT_PAINT'}:
188 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
189 UseSeparator(self, context)
190 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
191 UseSeparator(self, context)
192 layout.menu("VIEW3D_MT_Paint_Weights", icon='WPAINT_HLT')
193 layout.menu("VIEW3D_MT_Brush_Settings", icon='BRUSH_DATA')
194 layout.menu("VIEW3D_MT_Brush_Selection",
195 text="Weight Paint Tool", icon='BRUSH_TEXMASK')
196 UseSeparator(self, context)
197 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
198 layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
199 UseSeparator(self, context)
200 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
201 layout.operator("view3d.properties", icon='MENU_PANEL')
203 # Texture Paint #
204 if obj and obj.type == 'MESH' and obj.mode in {'TEXTURE_PAINT'}:
206 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
207 UseSeparator(self, context)
208 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
209 layout.menu("VIEW3D_MT_Brush_Settings", icon='BRUSH_DATA')
210 layout.menu("VIEW3D_MT_Brush_Selection",
211 text="Texture Paint Tool", icon='SCULPTMODE_HLT')
212 UseSeparator(self, context)
213 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
214 layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='EDIT')
215 UseSeparator(self, context)
216 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
217 layout.operator("view3d.properties", icon='MENU_PANEL')
219 # Curve Object Mode #
220 if obj and obj.type == 'CURVE' and obj.mode in {'OBJECT'}:
222 layout.operator_context = 'INVOKE_REGION_WIN'
223 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
224 UseSeparator(self, context)
225 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
226 layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
227 UseSeparator(self, context)
228 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
229 layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
230 UseSeparator(self, context)
231 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
232 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
233 layout.menu("VIEW3D_MT_CursorMenu", icon='PIVOT_CURSOR')
234 UseSeparator(self, context)
235 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
236 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
237 UseSeparator(self, context)
238 layout.menu("VIEW3D_MT_object_specials", text="Specials", icon='SOLO_OFF')
239 layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
240 UseSeparator(self, context)
241 layout.operator_menu_enum("object.modifier_add", "type", icon='MODIFIER')
242 layout.operator_menu_enum("object.constraint_add",
243 "type", text="Add Constraint", icon='CONSTRAINT')
244 UseSeparator(self, context)
245 layout.operator("object.delete", text="Delete Object", icon='X')
246 UseSeparator(self, context)
247 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
248 layout.menu("VIEW3D_MT_Object_Interactive_Other", icon='OBJECT_DATA')
249 UseSeparator(self, context)
250 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
251 layout.operator("view3d.properties", icon='MENU_PANEL')
253 # Edit Curve #
254 if obj and obj.type == 'CURVE' and obj.mode in {'EDIT'}:
256 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
257 UseSeparator(self, context)
258 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
259 layout.menu("VIEW3D_MT_Select_Edit_Curve",
260 icon='RESTRICT_SELECT_OFF')
261 UseSeparator(self, context)
262 layout.menu("VIEW3D_MT_curve_add", text="Add Curve",
263 icon='OUTLINER_OB_CURVE')
264 layout.menu("VIEW3D_MT_Edit_Curve", icon='CURVE_DATA')
265 UseSeparator(self, context)
266 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
267 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
268 layout.menu("VIEW3D_MT_CursorMenu", icon='PIVOT_CURSOR')
269 layout.menu("VIEW3D_MT_EditCurveCtrlpoints",
270 icon='CURVE_BEZCURVE')
271 layout.menu("VIEW3D_MT_EditCurveSpecials",
272 icon='SOLO_OFF')
273 UseSeparator(self, context)
274 layout.operator("curve.delete", text="Delete Object",
275 icon='X')
276 UseSeparator(self, context)
277 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
278 layout.menu("VIEW3D_MT_Object_Interactive_Other", icon='OBJECT_DATA')
279 UseSeparator(self, context)
280 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
281 layout.operator("view3d.properties", icon='MENU_PANEL')
283 # Surface Object Mode #
284 if obj and obj.type == 'SURFACE' and obj.mode in {'OBJECT'}:
286 layout.operator_context = 'INVOKE_REGION_WIN'
287 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
288 UseSeparator(self, context)
289 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
290 layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
291 UseSeparator(self, context)
292 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
293 layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
294 UseSeparator(self, context)
295 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
296 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
297 layout.menu("VIEW3D_MT_CursorMenu", icon='PIVOT_CURSOR')
298 UseSeparator(self, context)
299 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
300 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
301 UseSeparator(self, context)
302 layout.menu("VIEW3D_MT_object_specials", text="Specials", icon='SOLO_OFF')
303 layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
304 layout.operator_menu_enum("object.modifier_add", "type", icon='MODIFIER')
305 layout.operator_menu_enum("object.constraint_add",
306 "type", text="Add Constraint", icon='CONSTRAINT')
307 UseSeparator(self, context)
308 layout.operator("object.delete", text="Delete Object", icon='X')
309 UseSeparator(self, context)
310 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
311 layout.menu("VIEW3D_MT_Object_Interactive_Other", icon='OBJECT_DATA')
312 UseSeparator(self, context)
313 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
314 layout.operator("view3d.properties", icon='MENU_PANEL')
316 # Edit Surface #
317 if obj and obj.type == 'SURFACE' and obj.mode in {'EDIT'}:
319 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
320 UseSeparator(self, context)
321 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
322 layout.menu("VIEW3D_MT_Select_Edit_Surface", icon='RESTRICT_SELECT_OFF')
323 UseSeparator(self, context)
324 layout.menu("VIEW3D_MT_surface_add", text="Add Surface",
325 icon='OUTLINER_OB_SURFACE')
326 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
327 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
328 layout.menu("VIEW3D_MT_CursorMenu", icon='PIVOT_CURSOR')
329 UseSeparator(self, context)
330 layout.prop_menu_enum(settings, "proportional_edit",
331 icon="PROP_CON")
332 layout.prop_menu_enum(settings, "proportional_edit_falloff",
333 icon="SMOOTHCURVE")
334 layout.menu("VIEW3D_MT_EditCurveSpecials",
335 icon='SOLO_OFF')
336 UseSeparator(self, context)
337 layout.operator("curve.delete", text="Delete Object",
338 icon='CANCEL')
339 UseSeparator(self, context)
340 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
341 layout.menu("VIEW3D_MT_Object_Interactive_Other", icon='OBJECT_DATA')
342 UseSeparator(self, context)
343 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
344 layout.operator("view3d.properties", icon='MENU_PANEL')
346 # Metaball Object Mode #
347 if obj and obj.type == 'META' and obj.mode in {'OBJECT'}:
349 layout.operator_context = 'INVOKE_REGION_WIN'
350 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
351 UseSeparator(self, context)
352 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
353 layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
354 UseSeparator(self, context)
355 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
356 layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
357 UseSeparator(self, context)
358 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
359 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
360 layout.menu("VIEW3D_MT_CursorMenu", icon='PIVOT_CURSOR')
361 UseSeparator(self, context)
362 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
363 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
364 UseSeparator(self, context)
365 layout.menu("VIEW3D_MT_object_specials", text="Specials", icon='SOLO_OFF')
366 layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
367 UseSeparator(self, context)
368 layout.operator_menu_enum("object.constraint_add",
369 "type", text="Add Constraint", icon='CONSTRAINT')
370 layout.operator("object.delete", text="Delete Object", icon='X')
371 UseSeparator(self, context)
372 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
373 layout.menu("VIEW3D_MT_Object_Interactive_Other", icon='OBJECT_DATA')
374 UseSeparator(self, context)
375 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
376 layout.operator("view3d.properties", icon='MENU_PANEL')
378 # Edit Metaball #
379 if obj and obj.type == 'META' and obj.mode in {'EDIT'}:
381 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
382 UseSeparator(self, context)
383 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
384 layout.menu("VIEW3D_MT_SelectMetaball", icon='RESTRICT_SELECT_OFF')
385 UseSeparator(self, context)
386 layout.operator_menu_enum("object.metaball_add", "type",
387 text="Add Metaball",
388 icon='OUTLINER_OB_META')
389 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
390 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
391 layout.menu("VIEW3D_MT_CursorMenu", icon='PIVOT_CURSOR')
392 UseSeparator(self, context)
393 layout.prop_menu_enum(settings, "proportional_edit",
394 icon="PROP_CON")
395 layout.prop_menu_enum(settings, "proportional_edit_falloff",
396 icon="SMOOTHCURVE")
397 UseSeparator(self, context)
398 layout.operator("mball.delete_metaelems", text="Delete Object",
399 icon='CANCEL')
400 UseSeparator(self, context)
401 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
402 layout.menu("VIEW3D_MT_Object_Interactive_Other", icon='OBJECT_DATA')
403 UseSeparator(self, context)
404 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
405 layout.operator("view3d.properties", icon='MENU_PANEL')
407 # Text Object Mode #
408 if obj and obj.type == 'FONT' and obj.mode in {'OBJECT'}:
410 layout.operator_context = 'INVOKE_REGION_WIN'
411 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
412 UseSeparator(self, context)
413 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
414 layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
415 UseSeparator(self, context)
416 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
417 layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
418 UseSeparator(self, context)
419 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
420 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
421 layout.menu("VIEW3D_MT_CursorMenu", icon='PIVOT_CURSOR')
422 UseSeparator(self, context)
423 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
424 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
425 UseSeparator(self, context)
426 layout.menu("VIEW3D_MT_object_specials", text="Specials", icon='SOLO_OFF')
427 layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
428 UseSeparator(self, context)
429 layout.operator_menu_enum("object.modifier_add", "type", icon='MODIFIER')
430 layout.operator_menu_enum("object.constraint_add",
431 "type", text="Add Constraint", icon='CONSTRAINT')
432 UseSeparator(self, context)
433 layout.operator("object.delete", text="Delete Object", icon='X')
434 UseSeparator(self, context)
435 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
436 # New Entry For Switching to Editmode
437 layout.operator("view3d.interactive_mode_text", icon='VIEW3D')
438 UseSeparator(self, context)
439 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
440 layout.operator("view3d.properties", icon='MENU_PANEL')
442 # Text Edit Mode #
443 # To Do: Space is already reserved for the typing tool
444 if obj and obj.type == 'FONT' and obj.mode in {'EDIT'}:
446 layout.operator_context = 'INVOKE_REGION_WIN'
447 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
448 UseSeparator(self, context)
449 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
450 layout.menu("VIEW3D_MT_select_edit_text", icon='VIEW3D')
451 layout.menu("VIEW3D_MT_edit_font", icon='RESTRICT_SELECT_OFF')
452 UseSeparator(self, context)
453 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
454 layout.operator("object.editmode_toggle", text="Enter Object Mode",
455 icon='OBJECT_DATA')
456 UseSeparator(self, context)
457 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
458 layout.operator("view3d.properties", icon='MENU_PANEL')
460 # Camera Object Mode #
461 if obj and obj.type == 'CAMERA' and obj.mode in {'OBJECT'}:
463 layout.operator_context = 'INVOKE_REGION_WIN'
464 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
465 UseSeparator(self, context)
466 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
467 layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
468 UseSeparator(self, context)
469 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
470 layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
471 UseSeparator(self, context)
472 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
473 layout.menu("VIEW3D_MT_CursorMenuLite", icon='PIVOT_CURSOR')
474 UseSeparator(self, context)
475 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
476 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
477 UseSeparator(self, context)
478 layout.menu("VIEW3D_MT_object_specials", text="Specials", icon='SOLO_OFF')
479 layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
480 UseSeparator(self, context)
481 layout.operator_menu_enum("object.constraint_add",
482 "type", text="Add Constraint", icon='CONSTRAINT')
483 UseSeparator(self, context)
484 layout.operator("object.delete", text="Delete Object", icon='X')
485 UseSeparator(self, context)
486 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
487 UseSeparator(self, context)
488 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
489 layout.operator("view3d.properties", icon='MENU_PANEL')
491 # Lamp Object Mode #
492 if obj and obj.type == 'LIGHT' and obj.mode in {'OBJECT'}:
494 layout.operator_context = 'INVOKE_REGION_WIN'
495 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
496 UseSeparator(self, context)
497 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
498 layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
499 UseSeparator(self, context)
500 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
501 layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
502 UseSeparator(self, context)
503 layout.menu("VIEW3D_MT_TransformMenuLite", icon='MANIPUL')
504 layout.menu("VIEW3D_MT_CursorMenuLite", icon='PIVOT_CURSOR')
505 UseSeparator(self, context)
506 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
507 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
508 UseSeparator(self, context)
509 layout.menu("VIEW3D_MT_object_specials", text="Specials", icon='SOLO_OFF')
510 layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
511 UseSeparator(self, context)
512 layout.operator_menu_enum("object.constraint_add",
513 "type", text="Add Constraint", icon='CONSTRAINT')
514 UseSeparator(self, context)
515 layout.operator("object.delete", text="Delete Object", icon='X')
516 UseSeparator(self, context)
517 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
518 UseSeparator(self, context)
519 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
520 layout.operator("view3d.properties", icon='MENU_PANEL')
522 # Armature Object Mode #
523 if obj and obj.type == 'ARMATURE' and obj.mode in {'OBJECT'}:
525 layout.operator_context = 'INVOKE_REGION_WIN'
526 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
527 UseSeparator(self, context)
528 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
529 layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
530 UseSeparator(self, context)
531 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
532 layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
533 UseSeparator(self, context)
534 layout.menu("VIEW3D_MT_TransformMenuArmature", icon='MANIPUL')
535 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
536 layout.menu("VIEW3D_MT_CursorMenuLite", icon='PIVOT_CURSOR')
537 UseSeparator(self, context)
538 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
539 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
540 UseSeparator(self, context)
541 layout.menu("VIEW3D_MT_object_specials", text="Specials", icon='SOLO_OFF')
542 layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
543 UseSeparator(self, context)
544 layout.operator_menu_enum("object.constraint_add",
545 "type", text="Add Constraint", icon='CONSTRAINT')
546 UseSeparator(self, context)
547 layout.operator("object.delete", text="Delete Object", icon='X')
548 UseSeparator(self, context)
549 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
550 layout.menu("VIEW3D_MT_Object_Interactive_Armature", icon='VIEW3D')
551 UseSeparator(self, context)
552 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
553 layout.operator("view3d.properties", icon='MENU_PANEL')
555 # Armature Edit #
556 if obj and obj.type == 'ARMATURE' and obj.mode in {'EDIT'}:
558 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
559 UseSeparator(self, context)
560 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
561 layout.menu("VIEW3D_MT_Select_Edit_Armature",
562 icon='RESTRICT_SELECT_OFF')
563 UseSeparator(self, context)
564 layout.menu("VIEW3D_MT_armature_add", text="Add Armature",
565 icon='OUTLINER_OB_ARMATURE')
566 layout.menu("VIEW3D_MT_Edit_Armature", text="Armature",
567 icon='OUTLINER_DATA_ARMATURE')
568 layout.menu("VIEW3D_MT_EditArmatureTK",
569 icon='ARMATURE_DATA')
570 UseSeparator(self, context)
571 layout.menu("VIEW3D_MT_TransformMenuArmatureEdit", icon='MANIPUL')
572 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
573 layout.menu("VIEW3D_MT_CursorMenuLite", icon='PIVOT_CURSOR')
574 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
575 layout.menu("VIEW3D_MT_armature_specials", icon='SOLO_OFF')
576 layout.menu("VIEW3D_MT_edit_armature_roll",
577 icon='BONE_DATA')
578 UseSeparator(self, context)
579 layout.operator("armature.delete", text="Delete Object",
580 icon='X')
581 UseSeparator(self, context)
582 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
583 layout.menu("VIEW3D_MT_Object_Interactive_Armature", icon='VIEW3D')
584 UseSeparator(self, context)
585 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
586 layout.operator("view3d.properties", icon='MENU_PANEL')
588 # Armature Pose #
589 if obj and obj.type == 'ARMATURE' and obj.mode in {'POSE'}:
591 arm = context.active_object.data
593 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
594 UseSeparator(self, context)
595 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
596 layout.menu("VIEW3D_MT_Select_Pose", icon='RESTRICT_SELECT_OFF')
597 UseSeparator(self, context)
598 layout.menu("VIEW3D_MT_Pose", icon='OUTLINER_DATA_POSE')
599 layout.menu("VIEW3D_MT_TransformMenuArmaturePose", icon='MANIPUL')
600 layout.menu("VIEW3D_MT_pose_transform", icon='EMPTY_DATA')
601 UseSeparator(self, context)
602 layout.menu("VIEW3D_MT_CursorMenuLite", icon='PIVOT_CURSOR')
603 layout.menu("VIEW3D_MT_PoseCopy", icon='FILE')
605 if arm.display_type in {'BBONE', 'ENVELOPE'}:
606 layout.operator("transform.transform",
607 text="Scale Envelope Distance").mode = 'BONE_SIZE'
609 layout.menu("VIEW3D_MT_pose_apply", icon='AUTO')
610 layout.operator("pose.relax", icon='ARMATURE_DATA')
611 layout.menu("VIEW3D_MT_KeyframeMenu", icon='KEY_HLT')
612 layout.menu("VIEW3D_MT_pose_specials", icon='SOLO_OFF')
613 layout.menu("VIEW3D_MT_pose_group", icon='GROUP_BONE')
614 UseSeparator(self, context)
615 layout.operator_menu_enum("pose.constraint_add",
616 "type", text="Add Constraint", icon='CONSTRAINT_BONE')
617 UseSeparator(self, context)
618 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
619 layout.menu("VIEW3D_MT_Object_Interactive_Armature", icon='VIEW3D')
620 UseSeparator(self, context)
621 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
622 layout.operator("view3d.properties", icon='MENU_PANEL')
624 # Lattice Object Mode #
625 if obj and obj.type == 'LATTICE' and obj.mode in {'OBJECT'}:
627 layout.operator_context = 'INVOKE_REGION_WIN'
628 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
629 UseSeparator(self, context)
630 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
631 layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
632 UseSeparator(self, context)
633 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
634 layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
635 UseSeparator(self, context)
636 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
637 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
638 layout.menu("VIEW3D_MT_CursorMenu", icon='PIVOT_CURSOR')
639 UseSeparator(self, context)
640 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
641 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
642 UseSeparator(self, context)
643 layout.menu("VIEW3D_MT_object_specials", text="Specials", icon='SOLO_OFF')
644 layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
645 UseSeparator(self, context)
646 layout.operator_menu_enum("object.modifier_add", "type", icon='MODIFIER')
647 layout.operator_menu_enum("object.constraint_add",
648 "type", text="Add Constraint", icon='CONSTRAINT')
649 UseSeparator(self, context)
650 layout.operator("object.delete", text="Delete Object", icon='X')
651 UseSeparator(self, context)
652 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
653 layout.menu("VIEW3D_MT_Object_Interactive_Other", icon='OBJECT_DATA')
654 UseSeparator(self, context)
655 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
656 layout.operator("view3d.properties", icon='MENU_PANEL')
658 # Edit Lattice #
659 if obj and obj.type == 'LATTICE' and obj.mode in {'EDIT'}:
661 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
662 UseSeparator(self, context)
663 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
664 layout.menu("VIEW3D_MT_Select_Edit_Lattice",
665 icon='RESTRICT_SELECT_OFF')
666 UseSeparator(self, context)
667 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
668 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
669 layout.menu("VIEW3D_MT_CursorMenu", icon='PIVOT_CURSOR')
670 UseSeparator(self, context)
671 layout.prop_menu_enum(settings, "proportional_edit",
672 icon="PROP_CON")
673 layout.prop_menu_enum(settings, "proportional_edit_falloff",
674 icon="SMOOTHCURVE")
675 UseSeparator(self, context)
676 layout.operator("lattice.make_regular")
677 UseSeparator(self, context)
678 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
679 layout.menu("VIEW3D_MT_Object_Interactive_Other", icon='OBJECT_DATA')
680 UseSeparator(self, context)
681 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
682 layout.operator("view3d.properties", icon='MENU_PANEL')
684 # Empty Object Mode #
685 if obj and obj.type == 'EMPTY' and obj.mode in {'OBJECT'}:
687 layout.operator_context = 'INVOKE_REGION_WIN'
688 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
689 UseSeparator(self, context)
690 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
691 layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
692 UseSeparator(self, context)
693 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
694 layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
695 UseSeparator(self, context)
696 layout.menu("VIEW3D_MT_TransformMenuLite", icon='MANIPUL')
697 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
698 layout.menu("VIEW3D_MT_CursorMenuLite", icon='PIVOT_CURSOR')
699 UseSeparator(self, context)
700 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
701 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
702 UseSeparator(self, context)
703 layout.menu("VIEW3D_MT_object_specials", text="Specials", icon='SOLO_OFF')
704 layout.menu("VIEW3D_MT_Camera_Options", icon='OUTLINER_OB_CAMERA')
705 UseSeparator(self, context)
706 layout.operator_menu_enum("object.constraint_add",
707 "type", text="Add Constraint", icon='CONSTRAINT')
708 UseSeparator(self, context)
709 layout.operator("object.delete", text="Delete Object", icon='X')
710 UseSeparator(self, context)
711 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
712 UseSeparator(self, context)
713 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
714 layout.operator("view3d.properties", icon='MENU_PANEL')
716 # Speaker Object Mode #
717 if obj and obj.type == 'SPEAKER' and obj.mode in {'OBJECT'}:
719 layout.operator_context = 'INVOKE_REGION_WIN'
720 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
721 UseSeparator(self, context)
722 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
723 layout.menu("VIEW3D_MT_Select_Object", icon='RESTRICT_SELECT_OFF')
724 UseSeparator(self, context)
725 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
726 layout.menu("VIEW3D_MT_Object", icon='VIEW3D')
727 UseSeparator(self, context)
728 layout.menu("VIEW3D_MT_TransformMenuLite", icon='MANIPUL')
729 layout.menu("VIEW3D_MT_CursorMenuLite", icon='PIVOT_CURSOR')
730 UseSeparator(self, context)
731 layout.menu("VIEW3D_MT_ParentMenu", icon='PIVOT_ACTIVE')
732 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
733 UseSeparator(self, context)
734 layout.operator_menu_enum("object.constraint_add",
735 "type", text="Add Constraint", icon='CONSTRAINT')
736 UseSeparator(self, context)
737 layout.operator("object.delete", text="Delete Object", icon='X')
738 UseSeparator(self, context)
739 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
740 UseSeparator(self, context)
741 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
742 layout.operator("view3d.properties", icon='MENU_PANEL')
744 # Particle Menu #
745 if obj and context.mode == 'PARTICLE':
747 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
748 UseSeparator(self, context)
749 layout.menu("VIEW3D_MT_View_Menu", icon='ZOOM_ALL')
750 layout.menu("VIEW3D_MT_Select_Particle",
751 icon='RESTRICT_SELECT_OFF')
752 layout.menu("VIEW3D_MT_Selection_Mode_Particle",
753 text="Select and Display Mode", icon='PARTICLE_PATH')
754 UseSeparator(self, context)
755 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
756 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
757 layout.menu("VIEW3D_MT_CursorMenuLite", icon='PIVOT_CURSOR')
758 UseSeparator(self, context)
759 layout.prop_menu_enum(settings, "proportional_edit",
760 icon="PROP_CON")
761 layout.prop_menu_enum(settings, "proportional_edit_falloff",
762 icon="SMOOTHCURVE")
763 UseSeparator(self, context)
764 layout.menu("VIEW3D_MT_particle", icon='PARTICLEMODE')
765 layout.menu("VIEW3D_MT_particle_specials", text="Hair Specials", icon='HAIR')
766 UseSeparator(self, context)
767 layout.operator("object.delete", text="Delete Object", icon='X')
768 UseSeparator(self, context)
769 layout.menu("VIEW3D_MT_UndoS", icon='ARROW_LEFTRIGHT')
770 layout.menu("VIEW3D_MT_Object_Interactive_Mode", icon='VIEW3D')
771 UseSeparator(self, context)
772 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
773 layout.operator("view3d.properties", icon='MENU_PANEL')
776 # Object Menus #
778 # ********** Object Menu **********
779 class VIEW3D_MT_Object(Menu):
780 bl_context = "objectmode"
781 bl_label = "Object"
783 def draw(self, context):
784 layout = self.layout
785 view = context.space_data
786 is_local_view = (view.local_view is not None)
788 layout.operator("object.delete", text="Delete...").use_global = False
789 UseSeparator(self, context)
790 layout.menu("VIEW3D_MT_object_parent")
791 layout.menu("VIEW3D_MT_Duplicate")
792 layout.operator("object.join")
794 if is_local_view:
795 layout.operator_context = 'EXEC_REGION_WIN'
796 layout.operator("object.move_to_layer", text="Move out of Local View")
797 layout.operator_context = 'INVOKE_REGION_WIN'
798 else:
799 layout.operator("object.move_to_layer", text="Move to Layer...")
801 layout.menu("VIEW3D_MT_make_links", text="Make Links...")
802 layout.menu("VIEW3D_MT_Object_Data_Link")
803 UseSeparator(self, context)
804 layout.menu("VIEW3D_MT_AutoSmooth", icon='ALIASED')
805 UseSeparator(self, context)
806 layout.menu("VIEW3D_MT_object_constraints")
807 layout.menu("VIEW3D_MT_object_track")
808 layout.menu("VIEW3D_MT_object_animation")
809 UseSeparator(self, context)
810 layout.menu("VIEW3D_MT_object_showhide")
811 UseSeparator(self, context)
812 layout.operator_menu_enum("object.convert", "target")
815 # ********** Object Add **********
816 class VIEW3D_MT_AddMenu(Menu):
817 bl_label = "Add Object"
819 def draw(self, context):
820 layout = self.layout
821 layout.operator_context = 'INVOKE_REGION_WIN'
823 layout.menu("VIEW3D_MT_mesh_add", text="Add Mesh",
824 icon='OUTLINER_OB_MESH')
825 layout.menu("VIEW3D_MT_curve_add", text="Add Curve",
826 icon='OUTLINER_OB_CURVE')
827 layout.menu("VIEW3D_MT_surface_add", text="Add Surface",
828 icon='OUTLINER_OB_SURFACE')
829 layout.operator_menu_enum("object.metaball_add", "type",
830 icon='OUTLINER_OB_META')
831 layout.operator("object.text_add", text="Add Text",
832 icon='OUTLINER_OB_FONT')
833 UseSeparator(self, context)
834 layout.menu("VIEW3D_MT_armature_add", text="Add Armature",
835 icon='OUTLINER_OB_ARMATURE')
836 layout.operator("object.add", text="Lattice",
837 icon='OUTLINER_OB_LATTICE').type = 'LATTICE'
838 layout.operator_menu_enum("object.empty_add", "type", text="Empty", icon='OUTLINER_OB_EMPTY')
839 UseSeparator(self, context)
840 layout.operator("object.speaker_add", text="Speaker", icon='OUTLINER_OB_SPEAKER')
841 UseSeparator(self, context)
842 layout.operator("object.camera_add", text="Camera",
843 icon='OUTLINER_OB_CAMERA')
844 layout.operator_menu_enum("object.light_add", "type",
845 icon="OUTLINER_OB_LIGHT")
846 UseSeparator(self, context)
847 layout.operator_menu_enum("object.effector_add", "type",
848 text="Force Field",
849 icon='FORCE_FORCE')
850 layout.menu("VIEW3D_MT_object_quick_effects", text="Quick Effects", icon='PARTICLES')
851 UseSeparator(self, context)
853 has_groups = (len(bpy.data.collections) > 0)
854 col_group = layout.column()
855 col_group.enabled = has_groups
857 if not has_groups or len(bpy.data.collections) > 10:
858 col_group.operator_context = 'INVOKE_REGION_WIN'
859 col_group.operator("object.collection_instance_add",
860 text="Collection Instance..." if has_groups else "No Groups in Data",
861 icon='GROUP_VERTEX')
862 else:
863 col_group.operator_menu_enum("object.collection_instance_add", "collection",
864 text="Collection Instance", icon='GROUP_VERTEX')
867 # ********** Object Manipulator **********
868 class VIEW3D_MT_ManipulatorMenu1(Menu):
869 bl_label = "Manipulator"
871 def draw(self, context):
872 layout = self.layout
873 layout.operator_context = 'INVOKE_REGION_WIN'
874 props = layout.operator("view3d.enable_manipulator", text='Translate', icon='MAN_TRANS')
875 props.translate = True
876 props = layout.operator("view3d.enable_manipulator", text='Rotate', icon='MAN_ROT')
877 props.rotate = True
878 props = layout.operator("view3d.enable_manipulator", text='Scale', icon='MAN_SCALE')
879 props.scale = True
880 UseSeparator(self, context)
881 props = layout.operator("view3d.enable_manipulator", text='Combo', icon='MAN_SCALE')
882 props.scale = True
883 props.rotate = True
884 props.translate = True
885 props = layout.operator("view3d.enable_manipulator", text='Hide', icon='MAN_SCALE')
886 props.scale = False
887 props.rotate = False
888 props.translate = False
891 # ********** Object Mirror **********
892 class VIEW3D_MT_MirrorMenu(Menu):
893 bl_label = "Mirror"
895 def draw(self, context):
896 layout = self.layout
897 layout.operator("transform.mirror", text="Interactive Mirror")
898 UseSeparator(self, context)
899 layout.operator_context = 'INVOKE_REGION_WIN'
900 props = layout.operator("transform.mirror", text="X Global")
901 props.constraint_axis = (True, False, False)
902 props.constraint_orientation = 'GLOBAL'
903 props = layout.operator("transform.mirror", text="Y Global")
904 props.constraint_axis = (False, True, False)
905 props.constraint_orientation = 'GLOBAL'
906 props = layout.operator("transform.mirror", text="Z Global")
907 props.constraint_axis = (False, False, True)
908 props.constraint_orientation = 'GLOBAL'
910 if context.edit_object:
912 UseSeparator(self, context)
913 props = layout.operator("transform.mirror", text="X Local")
914 props.constraint_axis = (True, False, False)
915 props.constraint_orientation = 'LOCAL'
916 props = layout.operator("transform.mirror", text="Y Local")
917 props.constraint_axis = (False, True, False)
918 props.constraint_orientation = 'LOCAL'
919 props = layout.operator("transform.mirror", text="Z Local")
920 props.constraint_axis = (False, False, True)
921 props.constraint_orientation = 'LOCAL'
922 UseSeparator(self, context)
923 layout.operator("object.vertex_group_mirror")
926 # ********** Object Snap Cursor **********
927 class VIEW3D_MT_Pivot(Menu):
928 bl_label = "Pivot"
930 def draw(self, context):
931 layout = self.layout
932 layout.prop(context.space_data, "pivot_point", expand=True)
933 if context.active_object.mode == 'OBJECT':
934 UseSeparator(self, context)
935 layout.prop(context.space_data, "use_pivot_point_align", text="Center Points")
938 class VIEW3D_Snap_Context(Menu):
939 bl_label = "Snapping"
941 def draw(self, context):
942 layout = self.layout
943 toolsettings = context.tool_settings
944 layout.prop(toolsettings, "snap_element", expand=True)
945 layout.prop(toolsettings, "use_snap")
948 class VIEW3D_Snap_Origin(Menu):
949 bl_label = "Snap "
951 def draw(self, context):
952 layout = self.layout
953 layout.operator_context = 'EXEC_AREA'
954 layout.operator("object.origin_set",
955 text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
956 UseSeparator(self, context)
957 layout.operator("object.origin_set",
958 text="Origin to Geometry").type = 'ORIGIN_GEOMETRY'
959 layout.operator("object.origin_set",
960 text="Origin to 3D Cursor").type = 'ORIGIN_CURSOR'
961 layout.operator("object.origin_set",
962 text="Origin to Center of Mass").type = 'ORIGIN_CENTER_OF_MASS'
965 class VIEW3D_MT_CursorMenu(Menu):
966 bl_label = "Snap Cursor"
968 def draw(self, context):
969 layout = self.layout
970 layout.operator_context = 'INVOKE_REGION_WIN'
971 layout.menu("VIEW3D_Snap_Origin")
972 layout.menu("VIEW3D_Snap_Context")
973 UseSeparator(self, context)
974 layout.operator("view3d.snap_cursor_to_selected",
975 text="Cursor to Selected")
976 layout.operator("view3d.snap_cursor_to_center",
977 text="Cursor to World Origin")
978 layout.operator("view3d.snap_cursor_to_grid",
979 text="Cursor to Grid")
980 layout.operator("view3d.snap_cursor_to_active",
981 text="Cursor to Active")
982 UseSeparator(self, context)
983 layout.operator("view3d.snap_selected_to_cursor",
984 text="Selection to Cursor").use_offset = False
985 layout.operator("view3d.snap_selected_to_cursor",
986 text="Selection to Cursor (Keep Offset)").use_offset = True
987 layout.operator("view3d.snap_selected_to_grid",
988 text="Selection to Grid")
989 layout.operator("view3d.snap_cursor_selected_to_center",
990 text="Selection and Cursor to World Origin")
991 UseSeparator(self, context)
992 layout.menu("VIEW3D_MT_Pivot")
993 layout.operator("view3d.pivot_cursor",
994 text="Set Cursor as Pivot Point")
995 layout.operator("view3d.revert_pivot",
996 text="Revert Pivot Point")
999 class VIEW3D_MT_CursorMenuLite(Menu):
1000 bl_label = "Snap Cursor"
1002 def draw(self, context):
1003 layout = self.layout
1004 layout.operator_context = 'INVOKE_REGION_WIN'
1005 layout.menu("VIEW3D_Snap_Origin")
1006 UseSeparator(self, context)
1007 layout.operator("view3d.snap_cursor_to_selected",
1008 text="Cursor to Selected")
1009 layout.operator("view3d.snap_cursor_to_center",
1010 text="Cursor to World Origin")
1011 layout.operator("view3d.snap_cursor_to_grid",
1012 text="Cursor to Grid")
1013 layout.operator("view3d.snap_cursor_to_active",
1014 text="Cursor to Active")
1015 UseSeparator(self, context)
1016 layout.operator("view3d.snap_selected_to_cursor",
1017 text="Selection to Cursor").use_offset = False
1018 layout.operator("view3d.snap_selected_to_cursor",
1019 text="Selection to Cursor (Keep Offset)").use_offset = True
1020 layout.operator("view3d.snap_selected_to_grid",
1021 text="Selection to Grid")
1022 layout.operator("view3d.snap_cursor_selected_to_center",
1023 text="Selection and Cursor to World Origin")
1024 UseSeparator(self, context)
1025 layout.menu("VIEW3D_MT_Pivot")
1026 layout.operator("view3d.pivot_cursor",
1027 text="Set Cursor as Pivot Point")
1028 layout.operator("view3d.revert_pivot",
1029 text="Revert Pivot Point")
1032 # ********** Object Interactive Mode **********
1033 class InteractiveMode(Menu):
1034 bl_idname = "VIEW3D_MT_Object_Interactive_Mode"
1035 bl_label = "Interactive Mode"
1036 bl_description = "Menu of objects' interactive modes (Window Types)"
1038 def draw(self, context):
1039 layout = self.layout
1040 obj = context.active_object
1041 psys = hasattr(obj, "particle_systems")
1042 psys_items = len(obj.particle_systems.items()) > 0 if psys else False
1044 layout.operator(SetObjectMode.bl_idname, text="Object", icon="OBJECT_DATAMODE").mode = "OBJECT"
1045 layout.operator(SetObjectMode.bl_idname, text="Edit", icon="EDITMODE_HLT").mode = "EDIT"
1046 layout.operator(SetObjectMode.bl_idname, text="Sculpt", icon="SCULPTMODE_HLT").mode = "SCULPT"
1047 layout.operator(SetObjectMode.bl_idname, text="Vertex Paint", icon="VPAINT_HLT").mode = "VERTEX_PAINT"
1048 layout.operator(SetObjectMode.bl_idname, text="Weight Paint", icon="WPAINT_HLT").mode = "WEIGHT_PAINT"
1049 layout.operator(SetObjectMode.bl_idname, text="Texture Paint", icon="TPAINT_HLT").mode = "TEXTURE_PAINT"
1050 if obj and psys_items:
1051 layout.operator(SetObjectMode.bl_idname, text="Particle Edit",
1052 icon="PARTICLEMODE").mode = "PARTICLE_EDIT"
1053 if context.gpencil_data:
1054 layout.operator("view3d.interactive_mode_grease_pencil", icon="GREASEPENCIL")
1057 # ********** Object Armature Interactive Mode **********
1058 class InteractiveModeArmature(Menu):
1059 bl_idname = "VIEW3D_MT_Object_Interactive_Armature"
1060 bl_label = "Interactive Mode"
1061 bl_description = "Menu of objects interactive mode"
1063 def draw(self, context):
1064 layout = self.layout
1066 layout.operator(SetObjectMode.bl_idname, text="Object", icon="OBJECT_DATAMODE").mode = "OBJECT"
1067 layout.operator(SetObjectMode.bl_idname, text="Edit", icon="EDITMODE_HLT").mode = "EDIT"
1068 layout.operator(SetObjectMode.bl_idname, text="Pose", icon="POSE_HLT").mode = "POSE"
1069 if context.gpencil_data:
1070 layout.operator("view3d.interactive_mode_grease_pencil", icon="GREASEPENCIL")
1073 # ********** Interactive Mode Other **********
1074 class InteractiveModeOther(Menu):
1075 bl_idname = "VIEW3D_MT_Object_Interactive_Other"
1076 bl_label = "Interactive Mode"
1077 bl_description = "Menu of objects interactive mode"
1079 def draw(self, context):
1080 layout = self.layout
1081 layout.operator("object.editmode_toggle", text="Edit/Object Toggle",
1082 icon='OBJECT_DATA')
1083 if context.gpencil_data:
1084 layout.operator("view3d.interactive_mode_grease_pencil", icon="GREASEPENCIL")
1087 # ********** Grease Pencil Interactive Mode **********
1088 class VIEW3D_OT_Interactive_Mode_Grease_Pencil(Operator):
1089 bl_idname = "view3d.interactive_mode_grease_pencil"
1090 bl_label = "Edit Strokes"
1091 bl_description = "Toggle Edit Strokes for Grease Pencil"
1093 @classmethod
1094 def poll(cls, context):
1095 return (context.gpencil_data is not None)
1097 def execute(self, context):
1098 try:
1099 bpy.ops.gpencil.editmode_toggle()
1100 except:
1101 self.report({'WARNING'}, "It is not possible to enter into the interactive mode")
1102 return {'FINISHED'}
1105 class VIEW3D_MT_Edit_Gpencil(Menu):
1106 bl_label = "GPencil"
1108 def draw(self, context):
1109 toolsettings = context.tool_settings
1110 layout = self.layout
1112 layout.operator("gpencil.brush_paint", text="Sculpt Strokes").wait_for_input = True
1113 layout.prop_menu_enum(toolsettings.gpencil_sculpt, "tool", text="Sculpt Brush")
1114 UseSeparator(self, context)
1116 layout.menu("VIEW3D_MT_edit_gpencil_transform")
1117 layout.operator("transform.mirror", text="Mirror")
1118 layout.menu("GPENCIL_MT_snap")
1119 UseSeparator(self, context)
1121 layout.menu("VIEW3D_MT_object_animation") # NOTE: provides keyingset access...
1122 UseSeparator(self, context)
1124 layout.menu("VIEW3D_MT_edit_gpencil_delete")
1125 layout.operator("gpencil.duplicate_move", text="Duplicate")
1126 UseSeparator(self, context)
1128 layout.menu("VIEW3D_MT_select_gpencil")
1129 UseSeparator(self, context)
1131 layout.operator("gpencil.copy", text="Copy")
1132 layout.operator("gpencil.paste", text="Paste")
1133 UseSeparator(self, context)
1135 layout.prop_menu_enum(toolsettings, "proportional_edit")
1136 layout.prop_menu_enum(toolsettings, "proportional_edit_falloff")
1137 UseSeparator(self, context)
1139 layout.operator("gpencil.reveal")
1140 layout.operator("gpencil.hide", text="Show Active Layer Only").unselected = True
1141 layout.operator("gpencil.hide", text="Hide Active Layer").unselected = False
1142 UseSeparator(self, context)
1144 layout.operator_menu_enum("gpencil.move_to_layer", "layer", text="Move to Layer")
1145 layout.operator_menu_enum("gpencil.convert", "type", text="Convert to Geometry...")
1148 # ********** Text Interactive Mode **********
1149 class VIEW3D_OT_Interactive_Mode_Text(Operator):
1150 bl_idname = "view3d.interactive_mode_text"
1151 bl_label = "Enter Edit Mode"
1152 bl_description = "Toggle object's editmode"
1154 @classmethod
1155 def poll(cls, context):
1156 return (context.active_object is not None)
1158 def execute(self, context):
1159 bpy.ops.object.editmode_toggle()
1160 self.report({'INFO'}, "Spacebar shortcut won't work in the Text Edit mode")
1161 return {'FINISHED'}
1164 # ********** Object Parent **********
1165 class VIEW3D_MT_ParentMenu(Menu):
1166 bl_label = "Parent"
1168 def draw(self, context):
1169 layout = self.layout
1171 layout.operator("object.parent_set", text="Set")
1172 layout.operator("object.parent_clear", text="Clear")
1175 # ********** Object Group **********
1176 class VIEW3D_MT_GroupMenu(Menu):
1177 bl_label = "Group"
1179 def draw(self, context):
1180 layout = self.layout
1181 layout.operator("collection.create")
1182 layout.operator("collection.objects_add_active")
1183 UseSeparator(self, context)
1184 layout.operator("collection.objects_remove")
1185 layout.operator("collection.objects_remove_all")
1186 layout.operator("collection.objects_remove_active")
1189 # ********** Object Camera Options **********
1190 class VIEW3D_MT_Camera_Options(Menu):
1191 bl_label = "Camera"
1193 def draw(self, context):
1194 layout = self.layout
1195 layout.operator_context = 'EXEC_REGION_WIN'
1196 layout.operator("object.camera_add", text="Add Camera", icon='OUTLINER_OB_CAMERA')
1197 self.layout.operator("view3d.object_as_camera", text="Object As Camera", icon='OUTLINER_OB_CAMERA')
1198 self.layout.operator("view3d.viewnumpad", text="View Active Camera",
1199 icon='OUTLINER_OB_CAMERA').type = 'CAMERA'
1202 class VIEW3D_MT_Object_Data_Link(Menu):
1203 bl_label = "Object Data"
1205 def draw(self, context):
1206 layout = self.layout
1208 layout.operator_menu_enum("object.make_local", "type", text="Make Local...")
1209 layout.menu("VIEW3D_MT_make_single_user")
1210 layout.operator("object.proxy_make", text="Make Proxy...")
1211 layout.operator("object.make_dupli_face")
1212 UseSeparator(self, context)
1213 layout.operator("object.data_transfer")
1214 layout.operator("object.datalayout_transfer")
1217 class VIEW3D_MT_Duplicate(Menu):
1218 bl_label = "Duplicate"
1220 def draw(self, context):
1221 layout = self.layout
1223 layout.operator("object.duplicate_move")
1224 layout.operator("object.duplicate_move_linked")
1227 class VIEW3D_MT_KeyframeMenu(Menu):
1228 bl_label = "Keyframe"
1230 def draw(self, context):
1231 layout = self.layout
1232 layout.operator("anim.keyframe_insert_menu",
1233 text="Insert Keyframe...")
1234 layout.operator("anim.keyframe_delete_v3d",
1235 text="Delete Keyframe...")
1236 layout.operator("anim.keying_set_active_set",
1237 text="Change Keying Set...")
1240 class VIEW3D_MT_UndoS(Menu):
1241 bl_label = "Undo/Redo"
1243 def draw(self, context):
1244 layout = self.layout
1246 layout.operator("ed.undo")
1247 layout.operator("ed.redo")
1248 UseSeparator(self, context)
1249 layout.operator("ed.undo_history")
1252 # ********** Normals / Auto Smooth Menu **********
1253 # Thanks to marvin.k.breuer for the Autosmooth part of the menu
1254 class VIEW3D_MT_AutoSmooth(Menu):
1255 bl_label = "Normals / Auto Smooth"
1257 def draw(self, context):
1258 layout = self.layout
1259 obj = context.object
1260 obj_data = context.active_object.data
1262 # moved the VIEW3D_MT_edit_mesh_normals contents here under an Edit mode check
1263 if obj and obj.type == 'MESH' and obj.mode in {'EDIT'}:
1264 layout.operator("mesh.normals_make_consistent",
1265 text="Recalculate Outside").inside = False
1266 layout.operator("mesh.normals_make_consistent",
1267 text="Recalculate Inside").inside = True
1268 layout.operator("mesh.flip_normals")
1269 UseSeparator(self, context)
1271 layout.prop(obj_data, "show_double_sided", text="Normals: Double Sided")
1272 UseSeparator(self, context)
1273 layout.prop(obj_data, "use_auto_smooth", text="Normals: Auto Smooth")
1275 # Auto Smooth Angle - two tab spaces to align it with the rest of the menu
1276 layout.prop(obj_data, "auto_smooth_angle",
1277 text=" Auto Smooth Angle")
1280 # Edit Mode Menu's #
1282 # ********** Edit Mesh **********
1283 class VIEW3D_MT_Edit_Mesh(Menu):
1284 bl_label = "Mesh"
1286 def draw(self, context):
1287 layout = self.layout
1288 toolsettings = context.tool_settings
1289 view = context.space_data
1291 layout.menu("VIEW3D_MT_edit_mesh_vertices", icon='VERTEXSEL')
1292 layout.menu("VIEW3D_MT_edit_mesh_edges", icon='EDGESEL')
1293 layout.menu("VIEW3D_MT_edit_mesh_faces", icon='FACESEL')
1294 UseSeparator(self, context)
1295 layout.operator("mesh.duplicate_move")
1296 UseSeparator(self, context)
1297 layout.menu("VIEW3D_MT_edit_mesh_clean", icon='AUTO')
1298 layout.prop(view, "use_occlude_geometry")
1299 UseSeparator(self, context)
1300 layout.menu("VIEW3D_MT_AutoSmooth", icon='META_DATA')
1301 layout.operator("mesh.loopcut_slide",
1302 text="Loopcut", icon='UV_EDGESEL')
1303 UseSeparator(self, context)
1304 layout.operator("mesh.symmetrize")
1305 layout.operator("mesh.symmetry_snap")
1306 UseSeparator(self, context)
1307 layout.operator("mesh.bisect")
1308 layout.operator_menu_enum("mesh.sort_elements", "type", text="Sort Elements...")
1309 UseSeparator(self, context)
1310 layout.prop_menu_enum(toolsettings, "proportional_edit")
1311 layout.prop_menu_enum(toolsettings, "proportional_edit_falloff")
1312 UseSeparator(self, context)
1314 layout.prop(toolsettings, "use_mesh_automerge")
1315 # Double Threshold - two tab spaces to align it with the rest of the menu
1316 layout.prop(toolsettings, "double_threshold", text=" Double Threshold")
1318 UseSeparator(self, context)
1319 layout.menu("VIEW3D_MT_edit_mesh_showhide")
1322 # ********** Edit Multiselect **********
1323 class VIEW3D_MT_Edit_Multi(Menu):
1324 bl_label = "Multi Select"
1326 def draw(self, context):
1327 layout = self.layout
1328 layout.operator_context = 'INVOKE_REGION_WIN'
1330 prop = layout.operator("wm.context_set_value", text="Vertex Select",
1331 icon='VERTEXSEL')
1332 prop.value = "(True, False, False)"
1333 prop.data_path = "tool_settings.mesh_select_mode"
1335 prop = layout.operator("wm.context_set_value", text="Edge Select",
1336 icon='EDGESEL')
1337 prop.value = "(False, True, False)"
1338 prop.data_path = "tool_settings.mesh_select_mode"
1340 prop = layout.operator("wm.context_set_value", text="Face Select",
1341 icon='FACESEL')
1342 prop.value = "(False, False, True)"
1343 prop.data_path = "tool_settings.mesh_select_mode"
1344 UseSeparator(self, context)
1346 prop = layout.operator("wm.context_set_value",
1347 text="Vertex & Edge Select",
1348 icon='EDITMODE_HLT')
1349 prop.value = "(True, True, False)"
1350 prop.data_path = "tool_settings.mesh_select_mode"
1352 prop = layout.operator("wm.context_set_value",
1353 text="Vertex & Face Select",
1354 icon='XRAY')
1355 prop.value = "(True, False, True)"
1356 prop.data_path = "tool_settings.mesh_select_mode"
1358 prop = layout.operator("wm.context_set_value",
1359 text="Edge & Face Select",
1360 icon='SNAP_FACE')
1361 prop.value = "(False, True, True)"
1362 prop.data_path = "tool_settings.mesh_select_mode"
1363 UseSeparator(self, context)
1365 prop = layout.operator("wm.context_set_value",
1366 text="Vertex & Edge & Face Select",
1367 icon='SNAP_VOLUME')
1368 prop.value = "(True, True, True)"
1369 prop.data_path = "tool_settings.mesh_select_mode"
1372 # ********** Edit Mesh Edge **********
1373 class VIEW3D_MT_EditM_Edge(Menu):
1374 bl_label = "Edges"
1376 def draw(self, context):
1377 layout = self.layout
1378 layout.operator_context = 'INVOKE_REGION_WIN'
1380 layout.operator("mesh.mark_seam")
1381 layout.operator("mesh.mark_seam", text="Clear Seam").clear = True
1382 UseSeparator(self, context)
1384 layout.operator("mesh.mark_sharp")
1385 layout.operator("mesh.mark_sharp", text="Clear Sharp").clear = True
1386 layout.operator("mesh.extrude_move_along_normals", text="Extrude")
1387 UseSeparator(self, context)
1389 layout.operator("mesh.edge_rotate",
1390 text="Rotate Edge CW").direction = 'CW'
1391 layout.operator("mesh.edge_rotate",
1392 text="Rotate Edge CCW").direction = 'CCW'
1393 UseSeparator(self, context)
1395 layout.operator("TFM_OT_edge_slide", text="Edge Slide")
1396 layout.operator("mesh.loop_multi_select", text="Edge Loop")
1397 layout.operator("mesh.loop_multi_select", text="Edge Ring").ring = True
1398 layout.operator("mesh.loop_to_region")
1399 layout.operator("mesh.region_to_loop")
1402 # ********** Edit Mesh Cursor **********
1403 class VIEW3D_MT_EditCursorMenu(Menu):
1404 bl_label = "Snap Cursor"
1406 def draw(self, context):
1407 layout = self.layout
1408 layout.operator_context = 'INVOKE_REGION_WIN'
1409 layout.operator("object.setorigintoselected",
1410 text="Origin to Selected V/F/E")
1411 UseSeparator(self, context)
1412 layout.menu("VIEW3D_Snap_Origin")
1413 layout.menu("VIEW3D_Snap_Context")
1414 UseSeparator(self, context)
1415 layout.operator("view3d.snap_cursor_to_selected",
1416 text="Cursor to Selected")
1417 layout.operator("view3d.snap_cursor_to_center",
1418 text="Cursor to World Origin")
1419 layout.operator("view3d.snap_cursor_to_grid",
1420 text="Cursor to Grid")
1421 layout.operator("view3d.snap_cursor_to_active",
1422 text="Cursor to Active")
1423 layout.operator("view3d.snap_cursor_to_edge_intersection",
1424 text="Cursor to Edge Intersection")
1425 UseSeparator(self, context)
1426 layout.operator("view3d.snap_selected_to_cursor",
1427 text="Selection to Cursor").use_offset = False
1428 layout.operator("view3d.snap_selected_to_cursor",
1429 text="Selection to Cursor (Keep Offset)").use_offset = True
1430 layout.operator("view3d.snap_selected_to_grid",
1431 text="Selection to Grid")
1432 UseSeparator(self, context)
1433 layout.menu("VIEW3D_MT_Pivot")
1434 layout.operator("view3d.pivot_cursor",
1435 text="Set Cursor as Pivot Point")
1436 layout.operator("view3d.revert_pivot",
1437 text="Revert Pivot Point")
1440 # ********** Edit Mesh UV **********
1441 class VIEW3D_MT_UV_Map(Menu):
1442 bl_label = "UV Mapping"
1444 def draw(self, context):
1445 layout = self.layout
1446 layout.operator("uv.unwrap")
1447 UseSeparator(self, context)
1448 layout.operator_context = 'INVOKE_DEFAULT'
1449 layout.operator("uv.smart_project")
1450 layout.operator("uv.lightmap_pack")
1451 layout.operator("uv.follow_active_quads")
1452 layout.operator_context = 'EXEC_REGION_WIN'
1453 layout.operator("uv.cube_project")
1454 layout.operator("uv.cylinder_project")
1455 layout.operator("uv.sphere_project")
1456 layout.operator_context = 'INVOKE_REGION_WIN'
1457 UseSeparator(self, context)
1458 layout.operator("uv.project_from_view").scale_to_bounds = False
1459 layout.operator("uv.project_from_view", text="Project from View (Bounds)").scale_to_bounds = True
1460 UseSeparator(self, context)
1461 layout.operator("uv.reset")
1464 # ********** Edit Curve **********
1465 class VIEW3D_MT_Edit_Curve(Menu):
1466 bl_label = "Curve"
1468 def draw(self, context):
1469 layout = self.layout
1471 toolsettings = context.tool_settings
1473 layout.operator("curve.extrude_move")
1474 layout.operator("curve.spin")
1475 layout.operator("curve.duplicate_move")
1476 layout.operator("curve.split")
1477 layout.operator("curve.separate")
1478 layout.operator("curve.make_segment")
1479 layout.operator("curve.cyclic_toggle")
1480 UseSeparator(self, context)
1481 layout.operator("curve.delete", text="Delete...")
1482 UseSeparator(self, context)
1483 layout.menu("VIEW3D_MT_edit_curve_segments")
1484 layout.prop_menu_enum(toolsettings, "proportional_edit",
1485 icon="PROP_CON")
1486 layout.prop_menu_enum(toolsettings, "proportional_edit_falloff",
1487 icon="SMOOTHCURVE")
1488 layout.menu("VIEW3D_MT_edit_curve_showhide")
1491 class VIEW3D_MT_EditCurveCtrlpoints(Menu):
1492 bl_label = "Control Points"
1494 def draw(self, context):
1495 layout = self.layout
1497 edit_object = context.edit_object
1499 if edit_object.type == 'CURVE':
1500 layout.operator("transform.transform").mode = 'TILT'
1501 layout.operator("curve.tilt_clear")
1502 layout.operator("curve.separate")
1503 layout.operator_menu_enum("curve.handle_type_set", "type")
1504 layout.menu("VIEW3D_MT_hook")
1507 class VIEW3D_MT_EditCurveSegments(Menu):
1508 bl_label = "Curve Segments"
1510 def draw(self, context):
1511 layout = self.layout
1512 layout.operator("curve.subdivide")
1513 layout.operator("curve.switch_direction")
1516 class VIEW3D_MT_EditCurveSpecials(Menu):
1517 bl_label = "Specials"
1519 def draw(self, context):
1520 layout = self.layout
1521 layout.operator("curve.subdivide")
1522 UseSeparator(self, context)
1523 layout.operator("curve.switch_direction")
1524 layout.operator("curve.spline_weight_set")
1525 layout.operator("curve.radius_set")
1526 UseSeparator(self, context)
1527 layout.operator("curve.smooth")
1528 layout.operator("curve.smooth_weight")
1529 layout.operator("curve.smooth_radius")
1530 layout.operator("curve.smooth_tilt")
1533 # Brushes Menu's #
1534 # Thanks to CoDEmanX for the code
1535 class VIEW3D_MT_Brush_Selection(Menu):
1536 bl_label = "Brush Tool"
1538 def draw(self, context):
1539 layout = self.layout
1540 settings = UnifiedPaintPanel.paint_settings(context)
1542 # check if brush exists (for instance, in paint mode before adding a slot)
1543 if hasattr(settings, 'brush'):
1544 brush = settings.brush
1545 else:
1546 brush = None
1548 if not brush:
1549 layout.label(text="No Brushes currently available", icon="INFO")
1550 return
1552 if not context.particle_edit_object:
1553 if UseBrushesLists():
1554 flow = layout.column_flow(columns=3)
1556 for brsh in bpy.data.brushes:
1557 if (context.sculpt_object and brsh.use_paint_sculpt):
1558 props = flow.operator("wm.context_set_id", text=brsh.name,
1559 icon_value=layout.icon(brsh))
1560 props.data_path = "tool_settings.sculpt.brush"
1561 props.value = brsh.name
1562 elif (context.image_paint_object and brsh.use_paint_image):
1563 props = flow.operator("wm.context_set_id", text=brsh.name,
1564 icon_value=layout.icon(brsh))
1565 props.data_path = "tool_settings.image_paint.brush"
1566 props.value = brsh.name
1567 elif (context.vertex_paint_object and brsh.use_paint_vertex):
1568 props = flow.operator("wm.context_set_id", text=brsh.name,
1569 icon_value=layout.icon(brsh))
1570 props.data_path = "tool_settings.vertex_paint.brush"
1571 props.value = brsh.name
1572 elif (context.weight_paint_object and brsh.use_paint_weight):
1573 props = flow.operator("wm.context_set_id", text=brsh.name,
1574 icon_value=layout.icon(brsh))
1575 props.data_path = "tool_settings.weight_paint.brush"
1576 props.value = brsh.name
1577 else:
1578 layout.template_ID_preview(settings, "brush", new="brush.add", rows=3, cols=8)
1581 class VIEW3D_MT_Brush_Settings(Menu):
1582 bl_label = "Brush Settings"
1584 def draw(self, context):
1585 layout = self.layout
1586 settings = UnifiedPaintPanel.paint_settings(context)
1587 brush = getattr(settings, "brush", None)
1589 ups = context.tool_settings.unified_paint_settings
1590 layout.prop(ups, "use_unified_size", text="Unified Size")
1591 layout.prop(ups, "use_unified_strength", text="Unified Strength")
1592 if context.image_paint_object or context.vertex_paint_object:
1593 layout.prop(ups, "use_unified_color", text="Unified Color")
1594 UseSeparator(self, context)
1596 if not brush:
1597 layout.label(text="No Brushes currently available", icon="INFO")
1598 return
1600 layout.menu("VIEW3D_MT_brush_paint_modes")
1602 if context.sculpt_object:
1603 sculpt_tool = brush.sculpt_tool
1605 UseSeparator(self, context)
1606 layout.operator_menu_enum("brush.curve_preset", "shape", text="Curve Preset")
1607 UseSeparator(self, context)
1609 if sculpt_tool != 'GRAB':
1610 layout.prop_menu_enum(brush, "stroke_method")
1612 if sculpt_tool in {'DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'}:
1613 layout.prop_menu_enum(brush, "direction")
1615 if sculpt_tool == 'LAYER':
1616 layout.prop(brush, "use_persistent")
1617 layout.operator("sculpt.set_persistent_base")
1620 # Sculpt Menu's #
1621 class VIEW3D_MT_Sculpts(Menu):
1622 bl_label = "Sculpt"
1624 def draw(self, context):
1625 layout = self.layout
1626 toolsettings = context.tool_settings
1627 sculpt = toolsettings.sculpt
1629 layout.prop(sculpt, "use_symmetry_x")
1630 layout.prop(sculpt, "use_symmetry_y")
1631 layout.prop(sculpt, "use_symmetry_z")
1633 UseSeparator(self, context)
1634 layout.prop(sculpt, "lock_x")
1635 layout.prop(sculpt, "lock_y")
1636 layout.prop(sculpt, "lock_z")
1638 UseSeparator(self, context)
1639 layout.prop(sculpt, "use_threaded", text="Threaded Sculpt")
1640 layout.prop(sculpt, "show_low_resolution")
1641 layout.prop(sculpt, "use_deform_only")
1643 UseSeparator(self, context)
1644 layout.prop(sculpt, "show_brush")
1645 layout.prop(sculpt, "show_diffuse_color")
1648 class VIEW3D_MT_Hide_Masks(Menu):
1649 bl_label = "Hide/Mask"
1651 def draw(self, context):
1652 layout = self.layout
1654 props = layout.operator("paint.mask_lasso_gesture", text="Lasso Mask")
1655 UseSeparator(self, context)
1656 props = layout.operator("view3d.select_box", text="Box Mask", icon="BORDER_RECT")
1657 props = layout.operator("paint.hide_show", text="Box Hide")
1658 props.action = 'HIDE'
1659 props.area = 'INSIDE'
1661 props = layout.operator("paint.hide_show", text="Box Show")
1662 props.action = 'SHOW'
1663 props.area = 'INSIDE'
1664 UseSeparator(self, context)
1666 props = layout.operator("paint.mask_flood_fill", text="Fill Mask", icon="BORDER_RECT")
1667 props.mode = 'VALUE'
1668 props.value = 1
1670 props = layout.operator("paint.mask_flood_fill", text="Clear Mask")
1671 props.mode = 'VALUE'
1672 props.value = 0
1674 layout.operator("paint.mask_flood_fill", text="Invert Mask").mode = 'INVERT'
1675 UseSeparator(self, context)
1677 props = layout.operator("paint.hide_show", text="Show All", icon="RESTRICT_VIEW_OFF")
1678 props.action = 'SHOW'
1679 props.area = 'ALL'
1681 props = layout.operator("paint.hide_show", text="Hide Masked", icon="RESTRICT_VIEW_ON")
1682 props.area = 'MASKED'
1683 props.action = 'HIDE'
1686 # Sculpt Specials Menu (Thanks to marvin.k.breuer) #
1687 class VIEW3D_MT_Sculpt_Specials(Menu):
1688 bl_label = "Sculpt Specials"
1690 def draw(self, context):
1691 layout = self.layout
1692 settings = context.tool_settings
1694 if context.sculpt_object.use_dynamic_topology_sculpting:
1695 layout.operator("sculpt.dynamic_topology_toggle",
1696 icon='X', text="Disable Dyntopo")
1697 UseSeparator(self, context)
1699 if (settings.sculpt.detail_type_method == 'CONSTANT'):
1700 layout.prop(settings.sculpt, "constant_detail", text="Const.")
1701 layout.operator("sculpt.sample_detail_size", text="", icon='EYEDROPPER')
1702 else:
1703 layout.prop(settings.sculpt, "detail_size", text="Detail")
1704 UseSeparator(self, context)
1706 layout.operator("sculpt.symmetrize", icon='ARROW_LEFTRIGHT')
1707 layout.prop(settings.sculpt, "symmetrize_direction", "")
1708 UseSeparator(self, context)
1710 layout.operator("sculpt.optimize")
1711 if (settings.sculpt.detail_type_method == 'CONSTANT'):
1712 layout.operator("sculpt.detail_flood_fill")
1713 UseSeparator(self, context)
1715 layout.prop(settings.sculpt, "detail_refine_method", text="")
1716 layout.prop(settings.sculpt, "detail_type_method", text="")
1717 UseSeparator(self, context)
1718 layout.prop(settings.sculpt, "use_smooth_shading", "Smooth")
1719 else:
1720 layout.operator("sculpt.dynamic_topology_toggle",
1721 icon='SCULPT_DYNTOPO', text="Enable Dyntopo")
1724 # Display Wire (Thanks to marvin.k.breuer) #
1725 class VIEW3D_OT_Display_Wire_All(Operator):
1726 bl_label = "Wire on All Objects"
1727 bl_idname = "view3d.display_wire_all"
1728 bl_description = "Enable/Disable Display Wire on All Objects"
1730 @classmethod
1731 def poll(cls, context):
1732 return context.active_object is not None
1734 def execute(self, context):
1735 is_error = False
1736 for obj in bpy.data.objects:
1737 try:
1738 if obj.show_wire:
1739 obj.show_all_edges = False
1740 obj.show_wire = False
1741 else:
1742 obj.show_all_edges = True
1743 obj.show_wire = True
1744 except:
1745 is_error = True
1746 pass
1748 if is_error:
1749 self.report({'WARNING'},
1750 "Wire on All Objects could not be completed for some objects")
1752 return {'FINISHED'}
1755 # Vertex Color Menu #
1756 class VIEW3D_MT_Vertex_Colors(Menu):
1757 bl_label = "Vertex Colors"
1759 def draw(self, context):
1760 layout = self.layout
1761 layout.operator("paint.vertex_color_set")
1762 UseSeparator(self, context)
1764 layout.operator("paint.vertex_color_smooth")
1765 layout.operator("paint.vertex_color_dirt")
1768 # Weight Paint Menu #
1769 class VIEW3D_MT_Paint_Weights(Menu):
1770 bl_label = "Weights"
1772 def draw(self, context):
1773 layout = self.layout
1775 layout.operator("paint.weight_from_bones",
1776 text="Assign Automatic From Bones").type = 'AUTOMATIC'
1777 layout.operator("paint.weight_from_bones",
1778 text="Assign From Bone Envelopes").type = 'ENVELOPES'
1779 UseSeparator(self, context)
1781 layout.operator("object.vertex_group_normalize_all", text="Normalize All")
1782 layout.operator("object.vertex_group_normalize", text="Normalize")
1783 UseSeparator(self, context)
1785 layout.operator("object.vertex_group_mirror", text="Mirror")
1786 layout.operator("object.vertex_group_invert", text="Invert")
1787 UseSeparator(self, context)
1789 layout.operator("object.vertex_group_clean", text="Clean")
1790 layout.operator("object.vertex_group_quantize", text="Quantize")
1791 UseSeparator(self, context)
1793 layout.operator("object.vertex_group_levels", text="Levels")
1794 layout.operator("object.vertex_group_smooth", text="Smooth")
1795 UseSeparator(self, context)
1797 props = layout.operator("object.data_transfer", text="Transfer Weights")
1798 props.use_reverse_transfer = True
1799 props.data_type = 'VGROUP_WEIGHTS'
1800 UseSeparator(self, context)
1802 layout.operator("object.vertex_group_limit_total", text="Limit Total")
1803 layout.operator("object.vertex_group_fix", text="Fix Deforms")
1804 UseSeparator(self, context)
1806 layout.operator("paint.weight_set")
1809 # Armature Menu's #
1811 class VIEW3D_MT_Edit_Armature(Menu):
1812 bl_label = "Armature"
1814 def draw(self, context):
1815 layout = self.layout
1816 toolsettings = context.tool_settings
1818 layout.prop_menu_enum(toolsettings, "proportional_edit", icon="PROP_CON")
1819 layout.prop_menu_enum(toolsettings, "proportional_edit_falloff", icon="SMOOTHCURVE")
1820 UseSeparator(self, context)
1822 layout.menu("VIEW3D_MT_bone_options_toggle", text="Bone Settings")
1823 layout.operator("armature.merge")
1824 layout.operator("armature.fill")
1825 layout.operator("armature.split")
1826 layout.operator("armature.separate")
1827 layout.operator("armature.switch_direction", text="Switch Direction")
1829 layout.operator_context = 'EXEC_AREA'
1830 layout.operator("armature.symmetrize")
1831 UseSeparator(self, context)
1833 layout.operator("armature.delete")
1834 UseSeparator(self, context)
1836 layout.operator_context = 'INVOKE_DEFAULT'
1837 layout.operator("armature.armature_layers")
1838 layout.operator("armature.bone_layers")
1841 class VIEW3D_MT_EditArmatureTK(Menu):
1842 bl_label = "Armature Tools"
1844 def draw(self, context):
1845 layout = self.layout
1846 layout.operator("armature.subdivide", text="Subdivide")
1847 layout.operator("armature.extrude_move")
1848 layout.operator("armature.extrude_forked")
1849 layout.operator("armature.duplicate_move")
1850 UseSeparator(self, context)
1851 layout.menu("VIEW3D_MT_edit_armature_delete")
1852 UseSeparator(self, context)
1853 layout.operator("transform.transform",
1854 text="Scale Envelope Distance").mode = 'BONE_SIZE'
1855 layout.operator("transform.transform",
1856 text="Scale B-Bone Width").mode = 'BONE_SIZE'
1859 # Armature Pose Menu's #
1861 class VIEW3D_MT_Pose(Menu):
1862 bl_label = "Pose"
1864 def draw(self, context):
1865 layout = self.layout
1867 layout.menu("VIEW3D_MT_object_animation")
1868 layout.menu("VIEW3D_MT_pose_slide")
1869 layout.menu("VIEW3D_MT_pose_propagate")
1870 layout.menu("VIEW3D_MT_pose_library")
1871 layout.menu("VIEW3D_MT_pose_motion")
1872 UseSeparator(self, context)
1873 layout.menu("VIEW3D_MT_pose_group")
1874 layout.menu("VIEW3D_MT_object_parent")
1875 UseSeparator(self, context)
1876 layout.menu("VIEW3D_MT_pose_ik")
1877 layout.menu("VIEW3D_MT_pose_constraints")
1878 layout.menu("VIEW3D_MT_PoseNames")
1879 layout.operator("pose.quaternions_flip")
1880 layout.operator_context = 'INVOKE_AREA'
1881 UseSeparator(self, context)
1882 layout.operator("armature.armature_layers", text="Change Armature Layers...")
1883 layout.operator("pose.bone_layers", text="Change Bone Layers...")
1884 UseSeparator(self, context)
1885 layout.menu("VIEW3D_MT_pose_showhide")
1886 layout.menu("VIEW3D_MT_bone_options_toggle", text="Bone Settings")
1889 # Transform Menu's #
1891 class VIEW3D_MT_TransformMenu(Menu):
1892 bl_label = "Transform"
1894 def draw(self, context):
1895 layout = self.layout
1896 layout.menu("VIEW3D_MT_ManipulatorMenu1")
1897 UseSeparator(self, context)
1898 layout.operator("transform.translate", text="Move")
1899 layout.operator("transform.rotate", text="Rotate")
1900 layout.operator("transform.resize", text="Scale")
1901 UseSeparator(self, context)
1902 layout.menu("VIEW3D_MT_object_clear")
1903 layout.menu("VIEW3D_MT_object_apply")
1904 UseSeparator(self, context)
1905 layout.operator("transform.translate", text="Move Texture Space").texture_space = True
1906 layout.operator("transform.resize", text="Scale Texture Space").texture_space = True
1907 UseSeparator(self, context)
1908 layout.operator("object.randomize_transform")
1909 layout.operator("transform.tosphere", text="To Sphere")
1910 layout.operator("transform.shear", text="Shear")
1911 layout.operator("transform.bend", text="Bend")
1912 layout.operator("transform.push_pull", text="Push/Pull")
1913 UseSeparator(self, context)
1914 layout.operator("object.align")
1915 layout.operator_context = 'EXEC_REGION_WIN'
1916 layout.operator("transform.transform",
1917 text="Align to Transform Orientation").mode = 'ALIGN'
1920 # ********** Edit Mesh Transform **********
1921 class VIEW3D_MT_TransformMenuEdit(Menu):
1922 bl_label = "Transform"
1924 def draw(self, context):
1925 layout = self.layout
1926 layout.menu("VIEW3D_MT_ManipulatorMenu1")
1927 UseSeparator(self, context)
1928 layout.operator("transform.translate", text="Move")
1929 layout.operator("transform.rotate", text="Rotate")
1930 layout.operator("transform.resize", text="Scale")
1931 UseSeparator(self, context)
1932 layout.operator("transform.tosphere", text="To Sphere")
1933 layout.operator("transform.shear", text="Shear")
1934 layout.operator("transform.bend", text="Bend")
1935 layout.operator("transform.push_pull", text="Push/Pull")
1936 layout.operator("transform.vertex_warp", text="Warp")
1937 layout.operator("transform.vertex_random", text="Randomize")
1938 UseSeparator(self, context)
1939 layout.operator("transform.translate", text="Move Texture Space").texture_space = True
1940 layout.operator("transform.resize", text="Scale Texture Space").texture_space = True
1941 UseSeparator(self, context)
1942 layout.operator_context = 'EXEC_REGION_WIN'
1943 layout.operator("transform.transform",
1944 text="Align to Transform Orientation").mode = 'ALIGN'
1945 layout.operator_context = 'EXEC_AREA'
1946 layout.operator("object.origin_set",
1947 text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
1950 # ********** Transform Lite/Short **********
1951 class VIEW3D_MT_TransformMenuLite(Menu):
1952 bl_label = "Transform"
1954 def draw(self, context):
1955 layout = self.layout
1956 layout.menu("VIEW3D_MT_ManipulatorMenu1")
1957 UseSeparator(self, context)
1958 layout.operator("transform.translate", text="Move")
1959 layout.operator("transform.rotate", text="Rotate")
1960 layout.operator("transform.resize", text="Scale")
1961 UseSeparator(self, context)
1962 layout.menu("VIEW3D_MT_object_clear")
1963 layout.menu("VIEW3D_MT_object_apply")
1964 UseSeparator(self, context)
1965 layout.operator("transform.transform",
1966 text="Align to Transform Orientation").mode = 'ALIGN'
1969 # ********** Transform Camera **********
1970 class VIEW3D_MT_TransformMenuCamera(Menu):
1971 bl_label = "Transform"
1973 def draw(self, context):
1974 layout = self.layout
1976 layout.menu("VIEW3D_MT_ManipulatorMenu1")
1977 layout.menu("VIEW3D_MT_object_clear")
1978 layout.menu("VIEW3D_MT_object_apply")
1979 layout.operator("transform.translate", text="Move")
1980 layout.operator("transform.rotate", text="Rotate")
1981 layout.operator("transform.resize", text="Scale")
1982 layout.operator("object.align")
1983 layout.operator_context = 'EXEC_REGION_WIN'
1984 UseSeparator(self, context)
1985 layout.operator("transform.transform",
1986 text="Align to Transform Orientation").mode = 'ALIGN'
1989 # ********** Transform Armature **********
1990 class VIEW3D_MT_TransformMenuArmature(Menu):
1991 bl_label = "Transform"
1993 def draw(self, context):
1994 layout = self.layout
1996 layout.menu("VIEW3D_MT_ManipulatorMenu1")
1997 UseSeparator(self, context)
1998 layout.operator("transform.translate", text="Move")
1999 layout.operator("transform.rotate", text="Rotate")
2000 layout.operator("transform.resize", text="Scale")
2001 UseSeparator(self, context)
2002 layout.operator("armature.align")
2003 layout.operator("object.align")
2004 layout.operator_context = 'EXEC_AREA'
2005 UseSeparator(self, context)
2006 layout.operator("object.origin_set",
2007 text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
2008 layout.operator("object.origin_set",
2009 text="Origin to Geometry").type = 'ORIGIN_GEOMETRY'
2010 layout.operator("object.origin_set",
2011 text="Origin to 3D Cursor").type = 'ORIGIN_CURSOR'
2012 layout.operator("object.origin_set",
2013 text="Origin to Center of Mass").type = 'ORIGIN_CENTER_OF_MASS'
2016 # ********** Transform Armature Edit **********
2017 class VIEW3D_MT_TransformMenuArmatureEdit(Menu):
2018 bl_label = "Transform"
2020 def draw(self, context):
2021 layout = self.layout
2022 layout.menu("VIEW3D_MT_ManipulatorMenu1")
2023 UseSeparator(self, context)
2024 layout.operator("transform.translate", text="Move")
2025 layout.operator("transform.rotate", text="Rotate")
2026 layout.operator("transform.resize", text="Scale")
2027 UseSeparator(self, context)
2028 layout.operator("transform.tosphere", text="To Sphere")
2029 layout.operator("transform.shear", text="Shear")
2030 layout.operator("transform.bend", text="Bend")
2031 layout.operator("transform.push_pull", text="Push/Pull")
2032 layout.operator("transform.vertex_warp", text="Warp")
2033 UseSeparator(self, context)
2034 layout.operator("transform.vertex_random", text="Randomize")
2035 layout.operator("armature.align")
2036 layout.operator_context = 'EXEC_AREA'
2039 # ********** Transform Armature Pose **********
2040 class VIEW3D_MT_TransformMenuArmaturePose(Menu):
2041 bl_label = "Transform"
2043 def draw(self, context):
2044 layout = self.layout
2045 layout.menu("VIEW3D_MT_ManipulatorMenu1")
2046 layout.operator("transform.translate", text="Move")
2047 layout.operator("transform.rotate", text="Rotate")
2048 layout.operator("transform.resize", text="Scale")
2049 UseSeparator(self, context)
2050 layout.operator("pose.transforms_clear", text="Clear All")
2051 layout.operator("pose.loc_clear", text="Location")
2052 layout.operator("pose.rot_clear", text="Rotation")
2053 layout.operator("pose.scale_clear", text="Scale")
2055 UseSeparator(self, context)
2057 layout.operator("pose.user_transforms_clear", text="Reset unkeyed")
2058 obj = context.object
2059 if obj.type == 'ARMATURE' and obj.mode in {'EDIT', 'POSE'}:
2060 if obj.data.display_type == 'BBONE':
2061 layout.operator("transform.transform", text="Scale BBone").mode = 'BONE_SIZE'
2062 elif obj.data.display_type == 'ENVELOPE':
2063 layout.operator("transform.transform", text="Scale Envelope Distance").mode = 'BONE_SIZE'
2064 layout.operator("transform.transform", text="Scale Radius").mode = 'BONE_ENVELOPE'
2067 # View Menu's #
2069 class VIEW3D_MT_View_Directions(Menu):
2070 bl_label = "Directions"
2072 def draw(self, context):
2073 layout = self.layout
2074 layout.operator("view3d.viewnumpad", text="Camera").type = 'CAMERA'
2075 UseSeparator(self, context)
2076 layout.operator("view3d.viewnumpad", text="Top").type = 'TOP'
2077 layout.operator("view3d.viewnumpad", text="Bottom").type = 'BOTTOM'
2078 UseSeparator(self, context)
2079 layout.operator("view3d.viewnumpad", text="Front").type = 'FRONT'
2080 layout.operator("view3d.viewnumpad", text="Back").type = 'BACK'
2081 UseSeparator(self, context)
2082 layout.operator("view3d.viewnumpad", text="Right").type = 'RIGHT'
2083 layout.operator("view3d.viewnumpad", text="Left").type = 'LEFT'
2086 class VIEW3D_MT_View_Border(Menu):
2087 bl_label = "Set Border"
2089 def draw(self, context):
2090 layout = self.layout
2091 layout.operator_context = 'INVOKE_REGION_WIN'
2092 layout.operator("view3d.clip_border", text="Clipping Border...")
2093 layout.operator("view3d.zoom_border", text="Zoom Border...")
2094 layout.operator("view3d.render_border", text="Render Border...")
2097 class VIEW3D_MT_View_Toggle(Menu):
2098 bl_label = "View Toggle"
2100 def draw(self, context):
2101 layout = self.layout
2102 layout.operator_context = 'INVOKE_REGION_WIN'
2103 layout.operator("screen.area_dupli")
2104 UseSeparator(self, context)
2105 layout.operator("screen.region_quadview")
2106 layout.operator("screen.screen_full_area", text="Toggle Maximize Area")
2107 layout.operator("screen.screen_full_area").use_hide_panels = True
2110 class VIEW3D_MT_View_Menu(Menu):
2111 bl_label = "View"
2113 def draw(self, context):
2114 layout = self.layout
2115 layout.menu("VIEW3D_MT_Shade")
2116 UseSeparator(self, context)
2117 layout.menu("VIEW3D_MT_view_cameras", text="Cameras")
2118 layout.menu("VIEW3D_MT_View_Directions")
2119 layout.menu("VIEW3D_MT_View_Navigation")
2120 UseSeparator(self, context)
2121 layout.menu("VIEW3D_MT_View_Align")
2122 layout.menu("VIEW3D_MT_View_Toggle")
2123 layout.operator("view3d.view_persportho")
2124 layout.operator("view3d.localview", text="View Global/Local")
2125 layout.operator("view3d.view_selected").use_all_regions = False
2126 layout.operator("view3d.view_all").center = False
2127 UseSeparator(self, context)
2128 layout.menu("VIEW3D_MT_View_Border")
2129 layout.operator("view3d.layers", text="Show All Layers").nr = 0
2130 UseSeparator(self, context)
2131 # New menu entry for Animation player
2132 layout.menu("VIEW3D_MT_Animation_Player",
2133 text="Playback Animation", icon='PLAY')
2136 class VIEW3D_MT_View_Navigation(Menu):
2137 bl_label = "Navigation"
2139 def draw(self, context):
2140 from math import pi
2141 layout = self.layout
2142 layout.operator_enum("view3d.view_orbit", "type")
2143 props = layout.operator("view3d.view_orbit", "Orbit Opposite")
2144 props.type = 'ORBITRIGHT'
2145 props.angle = pi
2147 UseSeparator(self, context)
2148 layout.operator("view3d.view_roll", text="Roll Left").type = 'LEFT'
2149 layout.operator("view3d.view_roll", text="Roll Right").type = 'RIGHT'
2150 UseSeparator(self, context)
2151 layout.operator_enum("view3d.view_pan", "type")
2152 UseSeparator(self, context)
2153 layout.operator("view3d.zoom", text="Zoom In").delta = 1
2154 layout.operator("view3d.zoom", text="Zoom Out").delta = -1
2155 UseSeparator(self, context)
2156 layout.operator("view3d.zoom_camera_1_to_1", text="Zoom Camera 1:1")
2157 UseSeparator(self, context)
2158 layout.operator("view3d.fly")
2159 layout.operator("view3d.walk")
2162 class VIEW3D_MT_View_Align(Menu):
2163 bl_label = "Align View"
2165 def draw(self, context):
2166 layout = self.layout
2167 layout.operator("view3d.view_all", text="Center Cursor and View All").center = True
2168 layout.operator("view3d.view_center_cursor")
2169 UseSeparator(self, context)
2170 layout.operator("view3d.camera_to_view", text="Align Active Camera to View")
2171 layout.operator("view3d.camera_to_view_selected", text="Align Active Camera to Selected")
2172 UseSeparator(self, context)
2173 layout.operator("view3d.view_selected")
2174 layout.operator("view3d.view_lock_to_active")
2175 layout.operator("view3d.view_lock_clear")
2178 class VIEW3D_MT_View_Align_Selected(Menu):
2179 bl_label = "Align View to Active"
2181 def draw(self, context):
2182 layout = self.layout
2183 props = layout.operator("view3d.viewnumpad", text="Top")
2184 props.align_active = True
2185 props.type = 'TOP'
2186 props = layout.operator("view3d.viewnumpad", text="Bottom")
2187 props.align_active = True
2188 props.type = 'BOTTOM'
2189 props = layout.operator("view3d.viewnumpad", text="Front")
2190 props.align_active = True
2191 props.type = 'FRONT'
2192 props = layout.operator("view3d.viewnumpad", text="Back")
2193 props.align_active = True
2194 props.type = 'BACK'
2195 props = layout.operator("view3d.viewnumpad", text="Right")
2196 props.align_active = True
2197 props.type = 'RIGHT'
2198 props = layout.operator("view3d.viewnumpad", text="Left")
2199 props.align_active = True
2200 props.type = 'LEFT'
2203 class VIEW3D_MT_View_Cameras(Menu):
2204 bl_label = "Cameras"
2206 def draw(self, context):
2207 layout = self.layout
2208 layout.operator("view3d.object_as_camera")
2209 layout.operator("view3d.viewnumpad", text="Active Camera").type = 'CAMERA'
2212 # Matcap and AO, Wire all and X-Ray entries thanks to marvin.k.breuer
2213 class VIEW3D_MT_Shade(Menu):
2214 bl_label = "Shade"
2216 def draw(self, context):
2217 layout = self.layout
2219 layout.prop(context.space_data, "viewport_shade", expand=True)
2220 UseSeparator(self, context)
2222 if context.active_object:
2223 if(context.mode == 'EDIT_MESH'):
2224 layout.operator("MESH_OT_faces_shade_smooth")
2225 layout.operator("MESH_OT_faces_shade_flat")
2226 else:
2227 layout.operator("OBJECT_OT_shade_smooth")
2228 layout.operator("OBJECT_OT_shade_flat")
2230 UseSeparator(self, context)
2231 layout.operator("view3d.display_wire_all", text="Wire all", icon='SHADING_WIRE')
2232 layout.prop(context.object, "show_in_front", text="X-Ray", icon="META_CUBE")
2234 UseSeparator(self, context)
2235 layout.prop(context.space_data.fx_settings, "use_ssao",
2236 text="Ambient Occlusion", icon="GROUP")
2237 layout.prop(context.space_data, "use_matcap", icon="MATCAP_01")
2239 if context.space_data.use_matcap:
2240 row = layout.column(1)
2241 row.scale_y = 0.3
2242 row.scale_x = 0.5
2243 row.template_icon_view(context.space_data, "matcap_icon")
2246 # Animation Player (Thanks to marvin.k.breuer) #
2247 class VIEW3D_MT_Animation_Player(Menu):
2248 bl_label = "Animation Player"
2250 def draw(self, context):
2251 layout = self.layout
2253 layout.operator("screen.frame_jump", text="Jump REW", icon='REW').end = False
2254 layout.operator("screen.keyframe_jump", text="Previous FR", icon='PREV_KEYFRAME').next = False
2256 UseSeparator(self, context)
2257 layout.operator("screen.animation_play", text="Reverse", icon='PLAY_REVERSE').reverse = True
2258 layout.operator("screen.animation_play", text="PLAY", icon='PLAY')
2259 layout.operator("screen.animation_play", text="Stop", icon='PAUSE')
2260 UseSeparator(self, context)
2262 layout.operator("screen.keyframe_jump", text="Next FR", icon='NEXT_KEYFRAME').next = True
2263 layout.operator("screen.frame_jump", text="Jump FF", icon='FF').end = True
2266 # Select Menu's #
2268 # Object Select #
2269 class VIEW3D_MT_Select_Object(Menu):
2270 bl_label = "Select"
2272 def draw(self, context):
2273 layout = self.layout
2274 layout.operator_context = 'INVOKE_REGION_WIN'
2275 layout.operator("view3d.select_box")
2276 layout.operator("view3d.select_circle")
2277 UseSeparator(self, context)
2278 layout.operator("object.select_all").action = 'TOGGLE'
2279 layout.operator("object.select_all", text="Inverse").action = 'INVERT'
2280 layout.operator("object.select_random", text="Random")
2281 layout.operator("object.select_mirror", text="Mirror")
2282 UseSeparator(self, context)
2283 layout.operator("object.select_by_layer", text="Select All by Layer")
2284 layout.operator_menu_enum("object.select_by_type", "type",
2285 text="Select All by Type...")
2286 layout.operator_menu_enum("object.select_grouped", "type",
2287 text="Grouped")
2288 layout.operator_menu_enum("object.select_linked", "type",
2289 text="Linked")
2290 layout.operator("object.select_camera", text="Select Camera")
2291 UseSeparator(self, context)
2292 layout.menu("VIEW3D_MT_Select_Object_More_Less", text="More/Less")
2293 layout.operator("object.select_pattern", text="Select Pattern...")
2296 class VIEW3D_MT_Select_Object_More_Less(Menu):
2297 bl_label = "Select More/Less"
2299 def draw(self, context):
2300 layout = self.layout
2301 layout.operator("object.select_more", text="More")
2302 layout.operator("object.select_less", text="Less")
2303 UseSeparator(self, context)
2304 props = layout.operator("object.select_hierarchy", text="Parent")
2305 props.extend = False
2306 props.direction = 'PARENT'
2307 props = layout.operator("object.select_hierarchy", text="Child")
2308 props.extend = False
2309 props.direction = 'CHILD'
2310 UseSeparator(self, context)
2311 props = layout.operator("object.select_hierarchy", text="Extend Parent")
2312 props.extend = True
2313 props.direction = 'PARENT'
2314 props = layout.operator("object.select_hierarchy", text="Extend Child")
2315 props.extend = True
2316 props.direction = 'CHILD'
2319 # Edit Select #
2320 class VIEW3D_MT_Select_Edit_Mesh(Menu):
2321 bl_label = "Select"
2323 def draw(self, context):
2324 layout = self.layout
2325 layout.operator("view3d.select_box")
2326 layout.operator("view3d.select_circle")
2327 UseSeparator(self, context)
2328 layout.operator("mesh.select_all").action = 'TOGGLE'
2329 layout.operator("mesh.select_all", text="Inverse").action = 'INVERT'
2330 layout.operator("mesh.select_linked", text="Linked")
2331 layout.operator("mesh.faces_select_linked_flat",
2332 text="Linked Flat Faces")
2333 layout.operator("mesh.select_random", text="Random")
2334 layout.operator("mesh.select_nth", text="Every N Number of Verts")
2335 UseSeparator(self, context)
2336 layout.menu("VIEW3D_MT_Edit_Mesh_Select_Trait")
2337 layout.menu("VIEW3D_MT_Edit_Mesh_Select_Similar")
2338 layout.menu("VIEW3D_MT_Edit_Mesh_Select_More_Less")
2339 UseSeparator(self, context)
2340 layout.operator("mesh.select_mirror", text="Mirror")
2341 layout.operator("mesh.edges_select_sharp", text="Sharp Edges")
2342 layout.operator("mesh.select_axis", text="Side of Active")
2343 layout.operator("mesh.shortest_path_select", text="Shortest Path")
2344 UseSeparator(self, context)
2345 layout.operator("mesh.loop_multi_select", text="Edge Loops").ring = False
2346 layout.operator("mesh.loop_multi_select", text="Edge Rings").ring = True
2347 layout.operator("mesh.loop_to_region")
2348 layout.operator("mesh.region_to_loop")
2351 class VIEW3D_MT_Edit_Mesh_Select_Similar(Menu):
2352 bl_label = "Select Similar"
2354 def draw(self, context):
2355 layout = self.layout
2356 layout.operator_enum("mesh.select_similar", "type")
2357 layout.operator("mesh.select_similar_region", text="Face Regions")
2360 class VIEW3D_MT_Edit_Mesh_Select_Trait(Menu):
2361 bl_label = "Select All by Trait"
2363 def draw(self, context):
2364 layout = self.layout
2365 if context.scene.tool_settings.mesh_select_mode[2] is False:
2366 layout.operator("mesh.select_non_manifold", text="Non Manifold")
2367 layout.operator("mesh.select_loose", text="Loose Geometry")
2368 layout.operator("mesh.select_interior_faces", text="Interior Faces")
2369 layout.operator("mesh.select_face_by_sides", text="By Number of Verts")
2370 layout.operator("mesh.select_ungrouped", text="Ungrouped Verts")
2373 class VIEW3D_MT_Edit_Mesh_Select_More_Less(Menu):
2374 bl_label = "Select More/Less"
2376 def draw(self, context):
2377 layout = self.layout
2378 layout.operator("mesh.select_more", text="More")
2379 layout.operator("mesh.select_less", text="Less")
2380 UseSeparator(self, context)
2381 layout.operator("mesh.select_next_item", text="Next Active")
2382 layout.operator("mesh.select_prev_item", text="Previous Active")
2385 # Edit Curve Select #
2386 class VIEW3D_MT_Select_Edit_Curve(Menu):
2387 bl_label = "Select"
2389 def draw(self, context):
2390 layout = self.layout
2391 layout.operator("view3d.select_box")
2392 layout.operator("view3d.select_circle")
2393 UseSeparator(self, context)
2394 layout.operator("curve.select_all").action = 'TOGGLE'
2395 layout.operator("curve.select_all", text="Inverse").action = 'INVERT'
2396 layout.operator("curve.select_nth")
2397 UseSeparator(self, context)
2398 layout.operator("curve.select_random")
2399 layout.operator("curve.select_linked", text="Select Linked")
2400 layout.operator("curve.select_similar", text="Select Similar")
2401 layout.operator("curve.de_select_first")
2402 layout.operator("curve.de_select_last")
2403 layout.operator("curve.select_next")
2404 layout.operator("curve.select_previous")
2405 UseSeparator(self, context)
2406 layout.operator("curve.select_more")
2407 layout.operator("curve.select_less")
2410 # Armature Select #
2411 class VIEW3D_MT_SelectArmatureMenu(Menu):
2412 bl_label = "Select"
2414 def draw(self, context):
2415 layout = self.layout
2416 layout.operator("view3d.select_box")
2417 layout.operator("armature.select_all")
2418 layout.operator("armature.select_inverse", text="Inverse")
2419 layout.operator("armature.select_hierarchy",
2420 text="Parent").direction = 'PARENT'
2421 layout.operator("armature.select_hierarchy",
2422 text="Child").direction = 'CHILD'
2423 props = layout.operator("armature.select_hierarchy",
2424 text="Extend Parent")
2425 props.extend = True
2426 props.direction = 'PARENT'
2427 props = layout.operator("armature.select_hierarchy",
2428 text="Extend Child")
2429 props.extend = True
2430 props.direction = 'CHILD'
2431 layout.operator("object.select_pattern", text="Select Pattern...")
2434 class VIEW3D_MT_Select_Edit_Armature(Menu):
2435 bl_label = "Select"
2437 def draw(self, context):
2438 layout = self.layout
2440 layout.operator("view3d.select_box")
2441 layout.operator("view3d.select_circle")
2443 UseSeparator(self, context)
2445 layout.operator("armature.select_all").action = 'TOGGLE'
2446 layout.operator("armature.select_all", text="Inverse").action = 'INVERT'
2447 layout.operator("armature.select_mirror", text="Mirror").extend = False
2449 UseSeparator(self, context)
2451 layout.operator("armature.select_more", text="More")
2452 layout.operator("armature.select_less", text="Less")
2454 UseSeparator(self, context)
2456 props = layout.operator("armature.select_hierarchy", text="Parent")
2457 props.extend = False
2458 props.direction = 'PARENT'
2460 props = layout.operator("armature.select_hierarchy", text="Child")
2461 props.extend = False
2462 props.direction = 'CHILD'
2464 UseSeparator(self, context)
2466 props = layout.operator("armature.select_hierarchy", text="Extend Parent")
2467 props.extend = True
2468 props.direction = 'PARENT'
2470 props = layout.operator("armature.select_hierarchy", text="Extend Child")
2471 props.extend = True
2472 props.direction = 'CHILD'
2474 layout.operator_menu_enum("armature.select_similar", "type", text="Similar")
2475 layout.operator("object.select_pattern", text="Select Pattern...")
2478 class VIEW3D_MT_Select_Pose(Menu):
2479 bl_label = "Select"
2481 def draw(self, context):
2482 layout = self.layout
2483 layout.operator("view3d.select_box")
2484 layout.operator("view3d.select_circle")
2485 UseSeparator(self, context)
2486 layout.operator("pose.select_all").action = 'TOGGLE'
2487 layout.operator("pose.select_all", text="Inverse").action = 'INVERT'
2488 layout.operator("pose.select_mirror", text="Flip Active")
2489 layout.operator("pose.select_constraint_target",
2490 text="Constraint Target")
2491 UseSeparator(self, context)
2492 layout.operator("pose.select_linked", text="Linked")
2493 layout.operator("pose.select_hierarchy",
2494 text="Parent").direction = 'PARENT'
2495 layout.operator("pose.select_hierarchy",
2496 text="Child").direction = 'CHILD'
2497 props = layout.operator("pose.select_hierarchy", text="Extend Parent")
2498 props.extend = True
2499 props.direction = 'PARENT'
2500 props = layout.operator("pose.select_hierarchy", text="Extend Child")
2501 props.extend = True
2502 props.direction = 'CHILD'
2503 layout.operator_menu_enum("pose.select_grouped", "type",
2504 text="Grouped")
2505 UseSeparator(self, context)
2506 layout.operator("object.select_pattern", text="Select Pattern...")
2507 layout.menu("VIEW3D_MT_select_pose_more_less")
2510 class VIEW3D_MT_Select_Pose_More_Less(Menu):
2511 bl_label = "Select More/Less"
2513 def draw(self, context):
2514 layout = self.layout
2515 props = layout.operator("pose.select_hierarchy", text="Parent")
2516 props.extend = False
2517 props.direction = 'PARENT'
2519 props = layout.operator("pose.select_hierarchy", text="Child")
2520 props.extend = False
2521 props.direction = 'CHILD'
2523 props = layout.operator("pose.select_hierarchy", text="Extend Parent")
2524 props.extend = True
2525 props.direction = 'PARENT'
2527 props = layout.operator("pose.select_hierarchy", text="Extend Child")
2528 props.extend = True
2529 props.direction = 'CHILD'
2532 class VIEW3D_MT_PoseCopy(Menu):
2533 bl_label = "Pose Copy"
2535 def draw(self, context):
2536 layout = self.layout
2537 layout.operator("pose.copy")
2538 layout.operator("pose.paste")
2539 layout.operator("pose.paste",
2540 text="Paste X-Flipped Pose").flipped = True
2543 class VIEW3D_MT_PoseNames(Menu):
2544 bl_label = "Pose Names"
2546 def draw(self, context):
2547 layout = self.layout
2548 layout.operator_context = 'EXEC_AREA'
2549 layout.operator("pose.autoside_names",
2550 text="AutoName Left/Right").axis = 'XAXIS'
2551 layout.operator("pose.autoside_names",
2552 text="AutoName Front/Back").axis = 'YAXIS'
2553 layout.operator("pose.autoside_names",
2554 text="AutoName Top/Bottom").axis = 'ZAXIS'
2555 layout.operator("pose.flip_names")
2558 # Surface Select #
2559 class VIEW3D_MT_Select_Edit_Surface(Menu):
2560 bl_label = "Select"
2562 def draw(self, context):
2563 layout = self.layout
2564 layout.operator("view3d.select_box")
2565 layout.operator("view3d.select_circle")
2566 UseSeparator(self, context)
2567 layout.operator("curve.select_all").action = 'TOGGLE'
2568 layout.operator("curve.select_all", text="Inverse").action = 'INVERT'
2569 layout.operator("curve.select_random")
2570 layout.operator("curve.select_nth")
2571 layout.operator("curve.select_linked", text="Select Linked")
2572 layout.operator("curve.select_similar", text="Select Similar")
2573 layout.operator("curve.select_row")
2574 UseSeparator(self, context)
2575 layout.operator("curve.select_more")
2576 layout.operator("curve.select_less")
2579 # Metaball Select #
2580 class VIEW3D_MT_SelectMetaball(Menu):
2581 bl_label = "Select"
2583 def draw(self, context):
2584 layout = self.layout
2585 layout.operator("view3d.select_box")
2586 layout.operator("view3d.select_circle")
2587 UseSeparator(self, context)
2588 layout.operator("mball.select_all").action = 'TOGGLE'
2589 layout.operator("mball.select_all").action = 'INVERT'
2590 layout.operator("mball.select_random_metaelems")
2593 class VIEW3D_MT_Select_Edit_Metaball(Menu):
2594 bl_label = "Select"
2596 def draw(self, context):
2597 layout = self.layout
2598 layout.operator("view3d.select_box")
2599 layout.operator("view3d.select_circle")
2600 layout.operator("mball.select_all").action = 'TOGGLE'
2601 layout.operator("mball.select_all", text="Inverse").action = 'INVERT'
2602 layout.operator("mball.select_random_metaelems")
2603 layout.operator_menu_enum("mball.select_similar", "type", text="Similar")
2606 # Particle Select #
2607 class VIEW3D_MT_Selection_Mode_Particle(Menu):
2608 bl_label = "Particle Select and Display Mode"
2610 def draw(self, context):
2611 layout = self.layout
2612 toolsettings = context.tool_settings
2614 layout.prop(toolsettings.particle_edit, "select_mode", expand=True)
2617 class VIEW3D_MT_Select_Particle(Menu):
2618 bl_label = "Select"
2620 def draw(self, context):
2621 layout = self.layout
2623 layout.operator("view3d.select_box")
2624 layout.operator("view3d.select_circle")
2625 UseSeparator(self, context)
2627 layout.operator("particle.select_all").action = 'TOGGLE'
2628 layout.operator("particle.select_linked")
2629 layout.operator("particle.select_all", text="Inverse").action = 'INVERT'
2631 UseSeparator(self, context)
2632 layout.operator("particle.select_more")
2633 layout.operator("particle.select_less")
2635 UseSeparator(self, context)
2636 layout.operator("particle.select_random")
2638 UseSeparator(self, context)
2639 layout.operator("particle.select_roots", text="Roots")
2640 layout.operator("particle.select_tips", text="Tips")
2643 # Lattice Edit Select #
2644 class VIEW3D_MT_Select_Edit_Lattice(Menu):
2645 bl_label = "Select"
2647 def draw(self, context):
2648 layout = self.layout
2650 layout.operator("view3d.select_box")
2651 layout.operator("view3d.select_circle")
2652 UseSeparator(self, context)
2653 layout.operator("lattice.select_mirror")
2654 layout.operator("lattice.select_random")
2655 layout.operator("lattice.select_all").action = 'TOGGLE'
2656 layout.operator("lattice.select_all", text="Inverse").action = 'INVERT'
2657 UseSeparator(self, context)
2658 layout.operator("lattice.select_ungrouped", text="Ungrouped Verts")
2661 # Grease Pencil Select #
2662 class VIEW3D_MT_Select_Gpencil(Menu):
2663 # To Do: used in 3dview header might work if mapped to mouse
2664 # Not in Class List yet
2665 bl_label = "Select"
2667 def draw(self, context):
2668 layout = self.layout
2670 layout.operator("gpencil.select_box")
2671 layout.operator("gpencil.select_circle")
2673 UseSeparator(self, context)
2675 layout.operator("gpencil.select_all", text="(De)select All").action = 'TOGGLE'
2676 layout.operator("gpencil.select_all", text="Inverse").action = 'INVERT'
2677 layout.operator("gpencil.select_linked", text="Linked")
2678 # layout.operator_menu_enum("gpencil.select_grouped", "type", text="Grouped")
2679 layout.operator("gpencil.select_grouped", text="Grouped")
2681 UseSeparator(self, context)
2683 layout.operator("gpencil.select_more")
2684 layout.operator("gpencil.select_less")
2687 # Text Select #
2688 class VIEW3D_MT_Select_Edit_Text(Menu):
2689 # To Do: used in 3dview header might work if mapped to mouse
2690 # Not in Class List yet
2691 bl_label = "Edit"
2693 def draw(self, context):
2694 layout = self.layout
2695 layout.operator("font.text_copy", text="Copy")
2696 layout.operator("font.text_cut", text="Cut")
2697 layout.operator("font.text_paste", text="Paste")
2698 layout.operator("font.text_paste_from_file")
2699 layout.operator("font.select_all")
2702 # Paint Mode Menus #
2703 class VIEW3D_MT_Select_Paint_Mask(Menu):
2704 bl_label = "Select"
2706 def draw(self, context):
2707 layout = self.layout
2708 layout.operator("view3d.select_box")
2709 layout.operator("view3d.select_circle")
2710 layout.operator("paint.face_select_all").action = 'TOGGLE'
2711 layout.operator("paint.face_select_all", text="Inverse").action = 'INVERT'
2712 layout.operator("paint.face_select_linked", text="Linked")
2715 class VIEW3D_MT_Select_Paint_Mask_Vertex(Menu):
2716 bl_label = "Select"
2718 def draw(self, context):
2719 layout = self.layout
2720 layout.operator("view3d.select_box")
2721 layout.operator("view3d.select_circle")
2722 layout.operator("paint.vert_select_all").action = 'TOGGLE'
2723 layout.operator("paint.vert_select_all", text="Inverse").action = 'INVERT'
2724 layout.operator("paint.vert_select_ungrouped", text="Ungrouped Verts")
2727 class VIEW3D_MT_Angle_Control(Menu):
2728 bl_label = "Angle Control"
2730 @classmethod
2731 def poll(cls, context):
2732 settings = UnifiedPaintPanel.paint_settings(context)
2733 if not settings:
2734 return False
2736 brush = settings.brush
2737 tex_slot = brush.texture_slot
2739 return tex_slot.has_texture_angle and tex_slot.has_texture_angle_source
2741 def draw(self, context):
2742 layout = self.layout
2744 settings = UnifiedPaintPanel.paint_settings(context)
2745 brush = settings.brush
2747 sculpt = (context.sculpt_object is not None)
2749 tex_slot = brush.texture_slot
2751 layout.prop(tex_slot, "use_rake", text="Rake")
2753 if brush.brush_capabilities.has_random_texture_angle and tex_slot.has_random_texture_angle:
2754 if sculpt:
2755 if brush.sculpt_capabilities.has_random_texture_angle:
2756 layout.prop(tex_slot, "use_random", text="Random")
2757 else:
2758 layout.prop(tex_slot, "use_random", text="Random")
2761 # Cursor Menu Operators #
2762 class VIEW3D_OT_Pivot_Cursor(Operator):
2763 bl_idname = "view3d.pivot_cursor"
2764 bl_label = "Cursor as Pivot Point"
2765 bl_description = "Set Pivot Point back to Cursor"
2767 @classmethod
2768 def poll(cls, context):
2769 space = context.space_data
2770 return (hasattr(space, "pivot_point") and space.pivot_point != 'CURSOR')
2772 def execute(self, context):
2773 bpy.context.space_data.pivot_point = 'CURSOR'
2774 return {'FINISHED'}
2777 class VIEW3D_OT_Revert_Pivot(Operator):
2778 bl_idname = "view3d.revert_pivot"
2779 bl_label = "Revert Pivot Point to Median"
2780 bl_description = "Set Pivot Point back to Median"
2782 @classmethod
2783 def poll(cls, context):
2784 space = context.space_data
2785 return (hasattr(space, "pivot_point") and space.pivot_point != 'MEDIAN_POINT')
2787 def execute(self, context):
2788 bpy.context.space_data.pivot_point = 'MEDIAN_POINT'
2789 return{'FINISHED'}
2792 # Cursor Edge Intersection Defs #
2794 def abs(val):
2795 if val > 0:
2796 return val
2797 return -val
2800 def edgeIntersect(context, operator):
2801 from mathutils.geometry import intersect_line_line
2803 obj = context.active_object
2805 if (obj.type != "MESH"):
2806 operator.report({'ERROR'}, "Object must be a mesh")
2807 return None
2809 edges = []
2810 mesh = obj.data
2811 verts = mesh.vertices
2813 is_editmode = (obj.mode == 'EDIT')
2814 if is_editmode:
2815 bpy.ops.object.mode_set(mode='OBJECT')
2817 for e in mesh.edges:
2818 if e.select:
2819 edges.append(e)
2821 if len(edges) > 2:
2822 break
2824 if is_editmode:
2825 bpy.ops.object.mode_set(mode='EDIT')
2827 if len(edges) != 2:
2828 operator.report({'ERROR'},
2829 "Operator requires exactly 2 edges to be selected")
2830 return
2832 line = intersect_line_line(verts[edges[0].vertices[0]].co,
2833 verts[edges[0].vertices[1]].co,
2834 verts[edges[1].vertices[0]].co,
2835 verts[edges[1].vertices[1]].co)
2837 if line is None:
2838 operator.report({'ERROR'}, "Selected edges do not intersect")
2839 return
2841 point = line[0].lerp(line[1], 0.5)
2842 context.scene.cursor_location = obj.matrix_world * point
2845 # Cursor Edge Intersection Operator #
2846 class VIEW3D_OT_CursorToEdgeIntersection(Operator):
2847 bl_idname = "view3d.snap_cursor_to_edge_intersection"
2848 bl_label = "Cursor to Edge Intersection"
2849 bl_description = "Finds the mid-point of the shortest distance between two edges"
2851 @classmethod
2852 def poll(cls, context):
2853 obj = context.active_object
2854 return (obj is not None and obj.type == 'MESH')
2856 def execute(self, context):
2857 # Prevent unsupported Execution in Local View modes
2858 space_data = bpy.context.space_data
2859 if True in space_data.layers_local_view:
2860 self.report({'INFO'}, 'Global Perspective modes only unable to continue.')
2861 return {'FINISHED'}
2862 edgeIntersect(context, self)
2863 return {'FINISHED'}
2866 # Set Mode Operator #
2867 class SetObjectMode(Operator):
2868 bl_idname = "object.set_object_mode"
2869 bl_label = "Set the object interactive mode"
2870 bl_description = "I set the interactive mode of object"
2871 bl_options = {'REGISTER'}
2873 mode: StringProperty(
2874 name="Interactive mode",
2875 default="OBJECT"
2878 def execute(self, context):
2879 if (context.active_object):
2880 try:
2881 bpy.ops.object.mode_set(mode=self.mode)
2882 except TypeError:
2883 msg = context.active_object.name + ": It is not possible to enter into the interactive mode"
2884 self.report(type={"WARNING"}, message=msg)
2885 else:
2886 self.report(type={"WARNING"}, message="There is no active object")
2887 return {'FINISHED'}
2890 # Origin To Selected Edit Mode #
2891 def vfeOrigin(context):
2892 try:
2893 cursorPositionX = context.scene.cursor_location[0]
2894 cursorPositionY = context.scene.cursor_location[1]
2895 cursorPositionZ = context.scene.cursor_location[2]
2896 bpy.ops.view3d.snap_cursor_to_selected()
2897 bpy.ops.object.mode_set()
2898 bpy.ops.object.origin_set(type='ORIGIN_CURSOR', center='MEDIAN')
2899 bpy.ops.object.mode_set(mode='EDIT')
2900 context.scene.cursor_location[0] = cursorPositionX
2901 context.scene.cursor_location[1] = cursorPositionY
2902 context.scene.cursor_location[2] = cursorPositionZ
2903 return True
2904 except:
2905 return False
2908 class SetOriginToSelected(Operator):
2909 bl_idname = "object.setorigintoselected"
2910 bl_label = "Set Origin to Selected"
2911 bl_description = "Set Origin to Selected"
2913 @classmethod
2914 def poll(cls, context):
2915 return (context.area.type == "VIEW_3D" and context.active_object is not None)
2917 def execute(self, context):
2918 check = vfeOrigin(context)
2919 if not check:
2920 self.report({"ERROR"}, "Set Origin to Selected could not be performed")
2921 return {'CANCELLED'}
2923 return {'FINISHED'}
2926 # Code thanks to Isaac Weaver (wisaac) D1963
2927 class SnapCursSelToCenter(Operator):
2928 bl_idname = "view3d.snap_cursor_selected_to_center"
2929 bl_label = "Snap Cursor & Selection to World Origin"
2930 bl_description = ("Snap 3D cursor and selected objects to the center \n"
2931 "Works only in Object Mode")
2933 @classmethod
2934 def poll(cls, context):
2935 return (context.area.type == "VIEW_3D" and context.mode == "OBJECT")
2937 def execute(self, context):
2938 context.space_data.cursor_location = (0, 0, 0)
2939 for obj in context.selected_objects:
2940 obj.location = (0, 0, 0)
2941 return {'FINISHED'}
2944 # Preferences utility functions
2946 # Draw Separator #
2947 def UseSeparator(operator, context):
2948 useSep = bpy.context.preferences.addons[__name__].preferences.use_separators
2949 if useSep:
2950 operator.layout.separator()
2953 # Use compact brushes menus #
2954 def UseBrushesLists():
2955 # separate function just for more convenience
2956 useLists = bpy.context.preferences.addons[__name__].preferences.use_brushes_lists
2958 return bool(useLists)
2961 # Addon Preferences #
2962 class VIEW3D_MT_Space_Dynamic_Menu_Pref(AddonPreferences):
2963 bl_idname = __name__
2965 use_separators: BoolProperty(
2966 name="Use Separators in the menus",
2967 default=True,
2968 description=("Use separators in the menus, a trade-off between \n"
2969 "readability vs. using more space for displaying items")
2971 use_brushes_lists: BoolProperty(
2972 name="Use compact menus for brushes",
2973 default=False,
2974 description=("Use more compact menus instead \n"
2975 "of thumbnails for displaying brushes")
2978 def draw(self, context):
2979 layout = self.layout
2980 row = layout.row(align=True)
2981 row.prop(self, "use_separators", toggle=True)
2982 row.prop(self, "use_brushes_lists", toggle=True)
2985 # List The Classes #
2987 classes = (
2988 VIEW3D_MT_Space_Dynamic_Menu,
2989 VIEW3D_MT_AddMenu,
2990 VIEW3D_MT_Object,
2991 VIEW3D_MT_Edit_Mesh,
2992 VIEW3D_MT_TransformMenu,
2993 VIEW3D_MT_TransformMenuEdit,
2994 VIEW3D_MT_TransformMenuArmature,
2995 VIEW3D_MT_TransformMenuArmatureEdit,
2996 VIEW3D_MT_TransformMenuArmaturePose,
2997 VIEW3D_MT_TransformMenuLite,
2998 VIEW3D_MT_TransformMenuCamera,
2999 VIEW3D_MT_MirrorMenu,
3000 VIEW3D_MT_ParentMenu,
3001 VIEW3D_MT_GroupMenu,
3002 VIEW3D_MT_Select_Object,
3003 VIEW3D_MT_Select_Object_More_Less,
3004 VIEW3D_MT_Select_Edit_Mesh,
3005 VIEW3D_MT_Edit_Mesh_Select_Similar,
3006 VIEW3D_MT_Edit_Mesh_Select_Trait,
3007 VIEW3D_MT_Edit_Mesh_Select_More_Less,
3008 VIEW3D_MT_Select_Edit_Curve,
3009 VIEW3D_MT_SelectArmatureMenu,
3010 VIEW3D_MT_Select_Pose,
3011 VIEW3D_MT_Select_Pose_More_Less,
3012 VIEW3D_MT_Pose,
3013 VIEW3D_MT_PoseCopy,
3014 VIEW3D_MT_PoseNames,
3015 VIEW3D_MT_Select_Edit_Surface,
3016 VIEW3D_MT_SelectMetaball,
3017 VIEW3D_MT_Select_Edit_Metaball,
3018 VIEW3D_MT_Select_Particle,
3019 VIEW3D_MT_Select_Edit_Lattice,
3020 VIEW3D_MT_Select_Edit_Armature,
3021 VIEW3D_MT_Select_Paint_Mask,
3022 VIEW3D_MT_Select_Paint_Mask_Vertex,
3023 VIEW3D_MT_Angle_Control,
3024 VIEW3D_MT_Edit_Multi,
3025 VIEW3D_MT_EditM_Edge,
3026 VIEW3D_MT_Edit_Curve,
3027 VIEW3D_MT_EditCurveCtrlpoints,
3028 VIEW3D_MT_EditCurveSegments,
3029 VIEW3D_MT_EditCurveSpecials,
3030 VIEW3D_MT_Edit_Armature,
3031 VIEW3D_MT_EditArmatureTK,
3032 VIEW3D_MT_KeyframeMenu,
3033 VIEW3D_OT_Pivot_Cursor,
3034 VIEW3D_OT_Revert_Pivot,
3035 VIEW3D_MT_CursorMenu,
3036 VIEW3D_MT_CursorMenuLite,
3037 VIEW3D_MT_EditCursorMenu,
3038 VIEW3D_OT_CursorToEdgeIntersection,
3039 VIEW3D_MT_UndoS,
3040 VIEW3D_MT_Camera_Options,
3041 InteractiveMode,
3042 InteractiveModeArmature,
3043 SetObjectMode,
3044 VIEW3D_MT_View_Directions,
3045 VIEW3D_MT_View_Border,
3046 VIEW3D_MT_View_Toggle,
3047 VIEW3D_MT_View_Menu,
3048 VIEW3D_MT_View_Navigation,
3049 VIEW3D_MT_View_Align,
3050 VIEW3D_MT_View_Align_Selected,
3051 VIEW3D_MT_View_Cameras,
3052 VIEW3D_MT_UV_Map,
3053 VIEW3D_MT_Pivot,
3054 VIEW3D_Snap_Context,
3055 VIEW3D_Snap_Origin,
3056 VIEW3D_MT_Shade,
3057 VIEW3D_MT_ManipulatorMenu1,
3058 SetOriginToSelected,
3059 VIEW3D_MT_Object_Data_Link,
3060 VIEW3D_MT_Duplicate,
3061 VIEW3D_MT_Space_Dynamic_Menu_Pref,
3062 VIEW3D_MT_Selection_Mode_Particle,
3063 VIEW3D_MT_AutoSmooth,
3064 VIEW3D_MT_Animation_Player,
3065 VIEW3D_OT_Interactive_Mode_Text,
3066 SnapCursSelToCenter,
3067 VIEW3D_MT_Sculpt_Specials,
3068 VIEW3D_MT_Brush_Settings,
3069 VIEW3D_MT_Brush_Selection,
3070 VIEW3D_MT_Sculpts,
3071 VIEW3D_MT_Hide_Masks,
3072 VIEW3D_OT_Display_Wire_All,
3073 VIEW3D_MT_Vertex_Colors,
3074 VIEW3D_MT_Paint_Weights,
3075 VIEW3D_OT_Interactive_Mode_Grease_Pencil,
3076 VIEW3D_MT_Edit_Gpencil,
3077 InteractiveModeOther,
3081 # Register Classes & Hotkeys #
3082 def register():
3083 for cls in classes:
3084 bpy.utils.register_class(cls)
3086 wm = bpy.context.window_manager
3087 kc = wm.keyconfigs.addon
3088 if kc:
3089 km = kc.keymaps.new(name='3D View', space_type='VIEW_3D')
3090 kmi = km.keymap_items.new('wm.call_menu', 'SPACE', 'PRESS')
3091 kmi.properties.name = "VIEW3D_MT_Space_Dynamic_Menu"
3094 # Unregister Classes & Hotkeys #
3095 def unregister():
3096 wm = bpy.context.window_manager
3097 kc = wm.keyconfigs.addon
3098 if kc:
3099 km = kc.keymaps['3D View']
3100 for kmi in km.keymap_items:
3101 if kmi.idname == 'wm.call_menu':
3102 if kmi.properties.name == "VIEW3D_MT_Space_Dynamic_Menu":
3103 km.keymap_items.remove(kmi)
3104 break
3105 for cls in classes:
3106 bpy.utils.unregister_class(cls)
3109 if __name__ == "__main__":
3110 register()