smooth all objects (so we see their normals)
[blender-addons.git] / space_view3d_spacebar_menu.py
blob3668ed97345a4ab2524fa2a329ef2b6f0ae6f43b
1 #3d_cursor_menu.py (c) 2011 Jonathan Smith (JayDez)
3 # ##### BEGIN GPL LICENSE BLOCK #####
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software Foundation,
17 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 # ##### END GPL LICENSE BLOCK #####
21 bl_info = {
22 "name": "Dynamic Spacebar Menu",
23 "author": "JayDez, sim88, meta-androcto, sam",
24 "version": (1, 7, 3),
25 "blender": (2, 60, 0),
26 "location": "View3D > Spacebar Key",
27 "description": "Context Sensitive Spacebar Menu",
28 "warning": "",
29 "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"\
30 "Scripts/3D_interaction/Dynamic_Spacebar_Menu",
31 "tracker_url": "https://projects.blender.org/tracker/index.php?"\
32 "func=detail&aid=22060",
33 "category": "3D View"}
35 import bpy
36 from bpy import *
38 # Dynamic Menu
39 class VIEW3D_MT_Space_Dynamic_Menu(bpy.types.Menu):
40 bl_label = "Dynamic Spacebar Menu"
42 def draw(self, context):
43 layout = self.layout
44 settings = context.tool_settings
45 layout.operator_context = 'INVOKE_REGION_WIN'
47 ob = context
48 if ob.mode == 'OBJECT':
49 # Object mode
51 # Search Menu
52 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
53 layout.separator()
55 # Add Menu block
56 layout.menu("VIEW3D_MT_AddMenu", icon='OBJECT_DATAMODE')
58 # Transform block
59 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
61 # Mirror block
62 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
64 # Cursor Block
65 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
67 # Parent block
68 layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
70 # Group block
71 layout.menu("VIEW3D_MT_GroupMenu", icon='GROUP')
73 # Modifier block
74 layout.operator_menu_enum("object.modifier_add", "type",
75 icon='MODIFIER')
77 # Align block
78 layout.menu("VIEW3D_MT_AlignMenu", icon='ALIGN')
80 # Select block
81 layout.menu("VIEW3D_MT_SelectMenu", icon='RESTRICT_SELECT_OFF')
83 # Toolshelf block
84 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
86 # Properties block
87 layout.operator("view3d.properties", icon='MENU_PANEL')
89 #TODO: Add if statement to test whether editmode switch needs to
90 #be added to the menu, since certain object can't enter edit mode
91 #In which case we don't need the toggle
92 # Toggle Editmode
93 layout.operator("object.editmode_toggle", text="Enter Edit Mode",
94 icon='EDITMODE_HLT')
96 # Delete block
97 layout.operator("object.delete", text="Delete Object",
98 icon='CANCEL')
101 elif ob.mode == 'EDIT_MESH':
102 # Edit mode
104 # Search Menu
105 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
106 layout.separator()
108 # Add block
109 layout.menu("INFO_MT_mesh_add", text="Add Mesh",
110 icon='OUTLINER_OB_MESH')
112 # Transform block
113 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
115 # Mirror block
116 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
118 # Cursor block
119 layout.menu("VIEW3D_MT_EditCursorMenu", icon='CURSOR')
121 # Proportional block
122 layout.prop_menu_enum(settings, "proportional_edit",
123 icon="PROP_CON")
124 layout.prop_menu_enum(settings, "proportional_edit_falloff",
125 icon="SMOOTHCURVE")
127 # Edit block
128 layout.menu("VIEW3D_MT_edit_TK", icon='EDITMODE_HLT')
130 # Multi Select
131 layout.menu("VIEW3D_MT_edit_multi", icon='VERTEXSEL')
133 # Extrude block
134 layout.menu("VIEW3D_MT_edit_mesh_extrude", icon='EDIT_VEC')
136 # Tools block
137 layout.menu("VIEW3D_MT_edit_mesh_specials", icon='MODIFIER')
139 # UV Map block
140 layout.menu("VIEW3D_MT_uv_map", icon='MOD_UVPROJECT')
142 # Select block
143 layout.menu("VIEW3D_MT_SelectEditMenu",
144 icon='RESTRICT_SELECT_OFF')
146 # Toolshelf block
147 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
149 # Properties block
150 layout.operator("view3d.properties", icon='MENU_PANEL')
152 # Toggle Object Mode
153 layout.operator("object.editmode_toggle",
154 text="Enter Object Mode", icon='OBJECT_DATAMODE')
156 # Delete Block
157 layout.operator("mesh.delete", icon='CANCEL')
159 if ob.mode == 'EDIT_CURVE':
160 # Curve menu
162 # Search Menu
163 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
164 layout.separator()
166 # Add block
167 layout.menu("INFO_MT_curve_add", text="Add Curve",
168 icon='OUTLINER_OB_CURVE')
170 # Transform block
171 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
173 # Mirror block
174 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
176 # Cursor block
177 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
179 # Proportional block
180 layout.prop_menu_enum(settings, "proportional_edit",
181 icon="PROP_CON")
182 layout.prop_menu_enum(settings, "proportional_edit_falloff",
183 icon="SMOOTHCURVE")
185 # Edit Control Points
186 layout.menu("VIEW3D_MT_EditCurveCtrlpoints",
187 icon='CURVE_BEZCURVE')
189 # Edit Curve Specials
190 layout.menu("VIEW3D_MT_EditCurveSpecials",
191 icon='MODIFIER')
193 # Select Curve Block
194 #Could use: VIEW3D_MT_select_edit_curve
195 #Which is the default, instead of a hand written one, left it alone
196 #for now though.
197 layout.menu("VIEW3D_MT_SelectCurveMenu",
198 icon='RESTRICT_SELECT_OFF')
200 # Toolshelf block
201 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
203 # Properties block
204 layout.operator("view3d.properties", icon='MENU_PANEL')
206 # Toggle Objectmode
207 layout.operator("object.editmode_toggle", text="Enter Object Mode",
208 icon='OBJECT_DATA')
210 # Delete block
211 layout.operator("curve.delete", text="Delete Object",
212 icon='CANCEL')
214 if ob.mode == 'EDIT_SURFACE':
215 # Surface menu
217 # Search Menu
218 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
219 layout.separator()
221 # Add block
222 layout.menu("INFO_MT_surface_add", text="Add Surface",
223 icon='OUTLINER_OB_SURFACE')
225 # Transform block
226 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
228 # Mirror block
229 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
231 # Cursor block
232 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
234 # Proportional block
235 layout.prop_menu_enum(settings, "proportional_edit",
236 icon="PROP_CON")
237 layout.prop_menu_enum(settings, "proportional_edit_falloff",
238 icon="SMOOTHCURVE")
240 # Edit Curve Specials
241 layout.menu("VIEW3D_MT_EditCurveSpecials",
242 icon='MODIFIER')
244 # Select Surface
245 layout.menu("VIEW3D_MT_SelectSurface", icon='RESTRICT_SELECT_OFF')
247 # Toolshelf block
248 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
251 # Properties block
252 layout.operator("view3d.properties", icon='MENU_PANEL')
254 # Toggle Objectmode
255 layout.operator("object.editmode_toggle", text="Enter Object Mode",
256 icon='OBJECT_DATA')
258 # Delete block
259 layout.operator("curve.delete", text="Delete Object",
260 icon='CANCEL')
262 if ob.mode == 'EDIT_METABALL':
263 # Metaball menu
265 #Search Menu
266 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
267 layout.separator()
269 # Add block
270 #layout.menu("INFO_MT_metaball_add", text="Add Metaball",
271 # icon='OUTLINER_OB_META')
272 layout.operator_menu_enum("object.metaball_add", "type",
273 text="Add Metaball",
274 icon='OUTLINER_OB_META')
276 # Transform block
277 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
279 # Mirror block
280 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
282 # Cursor block
283 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
285 # Proportional block
286 layout.prop_menu_enum(settings, "proportional_edit",
287 icon="PROP_CON")
288 layout.prop_menu_enum(settings, "proportional_edit_falloff",
289 icon="SMOOTHCURVE")
291 #Select Metaball
292 layout.menu("VIEW3D_MT_SelectMetaball", icon='RESTRICT_SELECT_OFF')
294 # Toolshelf block
295 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
297 # Properties block
298 layout.operator("view3d.properties", icon='MENU_PANEL')
300 # Toggle Objectmode
301 layout.operator("object.editmode_toggle", text="Enter Object Mode",
302 icon='OBJECT_DATA')
304 # Delete block
305 layout.operator("mball.delete_metaelems", text="Delete Object",
306 icon='CANCEL')
308 elif ob.mode == 'EDIT_LATTICE':
309 # Lattice menu
311 #Search Menu
312 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
313 layout.separator()
315 # Transform block
316 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
318 # Mirror block
319 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
321 # Cursor block
322 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
324 # Proportional block
325 layout.prop_menu_enum(settings, "proportional_edit",
326 icon= "PROP_CON")
327 layout.prop_menu_enum(settings, "proportional_edit_falloff",
328 icon= "SMOOTHCURVE")
329 layout.operator("lattice.make_regular")
331 #Select Lattice
332 layout.menu("VIEW3D_MT_select_edit_lattice",
333 icon='RESTRICT_SELECT_OFF')
335 # Toolshelf block
336 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
338 # Properties block
339 layout.operator("view3d.properties", icon='MENU_PANEL')
341 # Toggle Objectmode
342 layout.operator("object.editmode_toggle", text="Enter Object Mode",
343 icon='OBJECT_DATA')
345 # Delete block - Can't delete any lattice stuff so not needed
346 #layout.operator("object.delete", text="Delete Object",
347 # icon='CANCEL')
349 if context.mode == 'PARTICLE':
350 # Particle menu
352 #Search Menu
353 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
354 layout.separator()
356 # Transform block
357 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
359 # Mirror block
360 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
362 # Cursor block
363 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
365 # Proportional block
366 layout.prop_menu_enum(settings, "proportional_edit",
367 icon= "PROP_CON")
368 layout.prop_menu_enum(settings, "proportional_edit_falloff",
369 icon= "SMOOTHCURVE")
371 # Particle block
372 layout.menu("VIEW3D_MT_particle", icon='PARTICLEMODE')
374 #Select Particle
375 layout.menu("VIEW3D_MT_select_particle",
376 icon='RESTRICT_SELECT_OFF')
378 # History/Cursor Block
379 layout.menu("VIEW3D_MT_undoS", icon='ARROW_LEFTRIGHT')
381 # Toolshelf block
382 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
384 # Properties block
385 layout.operator("view3d.properties", icon='MENU_PANEL')
387 # Toggle Objectmode
388 layout.operator("object.mode_set", text="Enter Object Mode",
389 icon='OBJECT_DATA')
391 # Delete block
392 layout.operator("object.delete", text="Delete Object",
393 icon='CANCEL')
395 ob = context
396 if ob.mode == 'PAINT_WEIGHT':
397 # Weight paint menu
399 # Search Menu
400 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
401 layout.separator()
403 # Transform block
404 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
406 # Cursor block
407 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
409 # Weight Paint block
410 layout.menu("VIEW3D_MT_paint_weight", icon='WPAINT_HLT')
412 # History/Cursor Block
413 layout.menu("VIEW3D_MT_undoS", icon='ARROW_LEFTRIGHT')
415 # Toolshelf block
416 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
418 # Properties block
419 layout.operator("view3d.properties", icon='MENU_PANEL')
421 # Toggle Objectmode
422 layout.operator("object.mode_set", text="Enter Object Mode",
423 icon='OBJECT_DATA')
425 elif ob.mode == 'PAINT_VERTEX':
426 # Vertex paint menu
428 # Search Menu
429 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
430 layout.separator()
432 # Transform block
433 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
435 # Cursor block
436 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
438 # Vertex Paint block
439 layout.operator("paint.vertex_color_set", icon='VPAINT_HLT')
441 # History/Cursor Block
442 layout.menu("VIEW3D_MT_undoS", icon='ARROW_LEFTRIGHT')
444 # Toolshelf block
445 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
447 # Properties block
448 layout.operator("view3d.properties", icon='MENU_PANEL')
450 # Toggle Objectmode
451 layout.operator("object.mode_set", text="Enter Object Mode",
452 icon='OBJECT_DATA')
454 elif ob.mode == 'PAINT_TEXTURE':
455 # Texture paint menu
457 # Search Menu
458 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
459 layout.separator()
461 # Transform block
462 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
464 # Cursor block
465 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
467 # History/Cursor Block
468 layout.menu("VIEW3D_MT_undoS", icon='ARROW_LEFTRIGHT')
470 # Toolshelf block
471 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
473 # Properties block
474 layout.operator("view3d.properties", icon='MENU_PANEL')
476 # Toggle Objectmode
477 layout.operator("object.mode_set", text="Enter Object Mode",
478 icon='OBJECT_DATA')
480 elif ob.mode == 'SCULPT':
481 # Sculpt menu
483 # Search Menu
484 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
485 layout.separator()
487 # Transform block
488 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
490 # Mirror block
491 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
493 # Cursor block
494 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
496 # Sculpt block
497 layout.menu("VIEW3D_MT_sculpt", icon='SCULPTMODE_HLT')
499 # History/Cursor Block
500 layout.menu("VIEW3D_MT_undoS", icon='ARROW_LEFTRIGHT')
502 # Toolshelf block
503 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
505 # Properties block
506 layout.operator("view3d.properties", icon='MENU_PANEL')
508 # Toggle Objectmode
509 layout.operator("object.mode_set", text="Enter Object Mode",
510 icon='OBJECT_DATA')
512 elif ob.mode == 'EDIT':
513 # Armature menu
515 # Search Menu
516 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
517 layout.separator()
519 # Transform block
520 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
522 # Mirror block
523 layout.menu("VIEW3D_MT_MirrorMenu", icon='MOD_MIRROR')
525 # Cursor block
526 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
528 # Proportional block
529 layout.prop_menu_enum(settings, "proportional_edit",
530 icon="PROP_CON")
531 layout.prop_menu_enum(settings, "proportional_edit_falloff",
532 icon="SMOOTHCURVE")
533 layout.separator()
535 # Edit Armature roll
536 layout.menu("VIEW3D_MT_edit_armature_roll",
537 icon='BONE_DATA')
539 # Edit Armature Toolkit
540 layout.menu("VIEW3D_MT_EditArmatureTK",
541 icon='ARMATURE_DATA')
543 # Edit Armature Name
544 layout.menu("VIEW3D_MT_ArmatureName",
545 icon='NEW')
547 # Parent block
548 layout.menu("VIEW3D_MT_ParentMenu", icon='ROTACTIVE')
550 # bone options block
551 layout.menu("VIEW3D_MT_bone_options_toggle",
552 text="Bone Settings")
554 # Edit Armature Specials
555 layout.menu("VIEW3D_MT_armature_specials", icon='MODIFIER')
557 # Edit Armature Select
558 layout.menu("VIEW3D_MT_SelectArmatureMenu",
559 icon='RESTRICT_SELECT_OFF')
561 # Toolshelf block
562 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
564 # Properties block
565 layout.operator("view3d.properties", icon='MENU_PANEL')
567 # Toggle Posemode
568 layout.operator("object.posemode_toggle", text="Enter Pose Mode",
569 icon='POSE_HLT')
571 # Toggle Posemode
572 layout.operator("object.editmode_toggle", text="Enter Object Mode",
573 icon='OBJECT_DATA')
575 # Delete block
576 layout.operator("armature.delete", text="Delete Object",
577 icon='CANCEL')
579 if context.mode == 'POSE':
580 # Pose mode menu
581 arm = context.active_object.data
583 # Search Menu
584 layout.operator("wm.search_menu", text="Search", icon='VIEWZOOM')
585 layout.separator()
587 # Transform Menu
588 layout.menu("VIEW3D_MT_TransformMenu", icon='MANIPUL')
590 # Clear Transform
591 layout.menu("VIEW3D_MT_pose_transform")
593 # Cursor Menu
594 layout.menu("VIEW3D_MT_CursorMenu", icon='CURSOR')
596 # Pose Copy Block
597 layout.menu("VIEW3D_MT_PoseCopy", icon='FILE')
599 if arm.draw_type in {'BBONE', 'ENVELOPE'}:
600 layout.operator("transform.transform",
601 text="Scale Envelope Distance").mode = 'BONE_SIZE'
603 layout.menu("VIEW3D_MT_pose_apply")
604 layout.operator("pose.relax")
605 layout.menu("VIEW3D_MT_KeyframeMenu")
606 layout.menu("VIEW3D_MT_pose_pose")
607 layout.menu("VIEW3D_MT_pose_motion")
608 layout.menu("VIEW3D_MT_pose_group")
609 layout.menu("VIEW3D_MT_pose_ik")
610 layout.menu("VIEW3D_MT_PoseNames")
611 layout.menu("VIEW3D_MT_pose_constraints")
612 layout.operator("pose.quaternions_flip")
614 layout.operator_context = 'INVOKE_AREA'
615 layout.operator("pose.armature_layers",
616 text="Change Armature Layers...")
617 layout.operator("pose.bone_layers", text="Change Bone Layers...")
619 layout.menu("VIEW3D_MT_pose_showhide")
620 layout.menu("VIEW3D_MT_bone_options_toggle",
621 text="Bone Settings")
623 # Select Pose Block
624 layout.menu("VIEW3D_MT_SelectPoseMenu", icon='RESTRICT_SELECT_OFF')
626 # Toolshelf block
627 layout.operator("view3d.toolshelf", icon='MENU_PANEL')
629 # Properties block
630 layout.operator("view3d.properties", icon='MENU_PANEL')
632 # Toggle Editmode
633 layout.operator("object.editmode_toggle", text="Enter Edit Mode",
634 icon='EDITMODE_HLT')
636 layout.operator("object.mode_set", text="Enter Object Mode",
637 icon='OBJECT_DATA').mode='OBJECT'
639 class VIEW3D_MT_AddMenu(bpy.types.Menu):
640 bl_label = "Add Object Menu"
642 def draw(self, context):
643 layout = self.layout
644 layout.operator_context = 'INVOKE_REGION_WIN'
646 layout.menu("INFO_MT_mesh_add", text="Add Mesh",
647 icon='OUTLINER_OB_MESH')
648 layout.menu("INFO_MT_curve_add", text="Add Curve",
649 icon='OUTLINER_OB_CURVE')
650 layout.menu("INFO_MT_surface_add", text="Add Surface",
651 icon='OUTLINER_OB_SURFACE')
652 layout.operator_menu_enum("object.metaball_add", "type",
653 icon='OUTLINER_OB_META')
654 layout.operator("object.text_add", text="Add Text",
655 icon='OUTLINER_OB_FONT')
656 layout.separator()
657 layout.menu("INFO_MT_armature_add", text="Add Armature",
658 icon='OUTLINER_OB_ARMATURE')
659 layout.operator("object.add", text="Lattice",
660 icon='OUTLINER_OB_LATTICE').type = 'LATTICE'
661 layout.separator()
662 layout.operator("object.add", text="Add Empty",
663 icon='OUTLINER_OB_EMPTY')
664 layout.separator()
665 layout.operator("object.speaker_add", text="Speaker", icon='OUTLINER_OB_SPEAKER')
666 layout.separator()
667 layout.operator("object.camera_add", text="Camera",
668 icon='OUTLINER_OB_CAMERA')
669 layout.operator_menu_enum("object.lamp_add", "type",
670 icon="OUTLINER_OB_LAMP")
671 layout.separator()
673 layout.operator_menu_enum("object.effector_add", "type",
674 text="Force Field",
675 icon='OUTLINER_OB_EMPTY')
676 layout.operator_menu_enum("object.group_instance_add", "group",
677 text="Group Instance",
678 icon='OUTLINER_OB_EMPTY')
681 class VIEW3D_MT_TransformMenu(bpy.types.Menu):
682 bl_label = "Transform Menu"
684 # TODO: get rid of the custom text strings?
685 def draw(self, context):
686 layout = self.layout
688 layout.operator("transform.translate", text="Grab/Move")
689 # TODO: sub-menu for grab per axis
690 layout.operator("transform.rotate", text="Rotate")
691 # TODO: sub-menu for rot per axis
692 layout.operator("transform.resize", text="Scale")
693 # TODO: sub-menu for scale per axis
694 layout.separator()
696 layout.operator("transform.tosphere", text="To Sphere")
697 layout.operator("transform.shear", text="Shear")
698 layout.operator("transform.warp", text="Warp")
699 layout.operator("transform.push_pull", text="Push/Pull")
700 if context.edit_object and context.edit_object.type == 'ARMATURE':
701 layout.operator("armature.align")
702 else:
703 layout.operator_context = 'EXEC_REGION_WIN'
704 # @todo vvv See alignmenu() in edit.c of b2.4x to get this working.
705 layout.operator("transform.transform",
706 text="Align to Transform Orientation").mode = 'ALIGN'
707 layout.separator()
709 layout.operator_context = 'EXEC_AREA'
711 layout.operator("object.origin_set",
712 text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
713 layout.operator("object.origin_set",
714 text="Origin to Geometry").type = 'ORIGIN_GEOMETRY'
715 layout.operator("object.origin_set",
716 text="Origin to 3D Cursor").type = 'ORIGIN_CURSOR'
719 class VIEW3D_MT_MirrorMenu(bpy.types.Menu):
720 bl_label = "Mirror Menu"
722 def draw(self, context):
723 layout = self.layout
725 layout.operator("transform.mirror", text="Interactive Mirror")
726 layout.separator()
728 layout.operator_context = 'INVOKE_REGION_WIN'
730 props = layout.operator("transform.mirror", text="X Global")
731 props.constraint_axis = (True, False, False)
732 props.constraint_orientation = 'GLOBAL'
734 props = layout.operator("transform.mirror", text="Y Global")
735 props.constraint_axis = (False, True, False)
736 props.constraint_orientation = 'GLOBAL'
738 props = layout.operator("transform.mirror", text="Z Global")
739 props.constraint_axis = (False, False, True)
740 props.constraint_orientation = 'GLOBAL'
742 if context.edit_object:
744 layout.separator()
746 props = layout.operator("transform.mirror", text="X Local")
747 props.constraint_axis = (True, False, False)
748 props.constraint_orientation = 'LOCAL'
749 props = layout.operator("transform.mirror", text="Y Local")
750 props.constraint_axis = (False, True, False)
751 props.constraint_orientation = 'LOCAL'
752 props = layout.operator("transform.mirror", text="Z Local")
753 props.constraint_axis = (False, False, True)
754 props.constraint_orientation = 'LOCAL'
756 layout.operator("object.vertex_group_mirror")
758 class VIEW3D_MT_ParentMenu(bpy.types.Menu):
759 bl_label = "Parent Menu"
761 def draw(self, context):
762 layout = self.layout
764 layout.operator("object.parent_set", text="Set")
765 layout.operator("object.parent_clear", text="Clear")
767 class VIEW3D_MT_GroupMenu(bpy.types.Menu):
768 bl_label = "Group Menu"
770 def draw(self, context):
771 layout = self.layout
773 layout.operator("group.create")
774 layout.operator("group.objects_remove")
775 layout.separator()
777 layout.operator("group.objects_add_active")
778 layout.operator("group.objects_remove_active")
780 class VIEW3D_MT_AlignMenu(bpy.types.Menu):
781 bl_label = "Align Menu"
783 def draw(self, context):
784 layout = self.layout
786 layout.menu("VIEW3D_MT_view_align_selected")
787 layout.separator()
789 layout.operator("view3d.view_all",
790 text="Center Cursor and View All").center = True
791 layout.operator("view3d.camera_to_view",
792 text="Align Active Camera to View")
793 layout.operator("view3d.view_selected")
794 layout.operator("view3d.view_center_cursor")
796 class VIEW3D_MT_SelectMenu(bpy.types.Menu):
797 bl_label = "Select Menu"
799 def draw(self, context):
800 layout = self.layout
801 layout.operator_context = 'INVOKE_REGION_WIN'
803 layout.operator("view3d.select_border")
804 layout.operator("view3d.select_circle")
805 layout.separator()
807 layout.operator("object.select_all").action = 'TOGGLE'
808 layout.operator("object.select_all", text="Inverse").action = 'INVERT'
809 layout.operator("object.select_random", text="Random")
810 layout.operator("object.select_mirror", text="Mirror")
811 layout.operator("object.select_by_layer", text="Select All by Layer")
812 layout.operator_menu_enum("object.select_by_type", "type",
813 text="Select All by Type...")
814 layout.operator("object.select_camera", text="Select Camera")
815 layout.separator()
817 layout.operator_menu_enum("object.select_grouped", "type",
818 text="Grouped")
819 layout.operator_menu_enum("object.select_linked", "type",
820 text="Linked")
821 layout.operator("object.select_pattern", text="Select Pattern...")
823 class VIEW3D_MT_SelectEditMenu(bpy.types.Menu):
824 bl_label = "Select Menu"
826 def draw(self, context):
827 layout = self.layout
829 layout.operator("view3d.select_border")
830 layout.operator("view3d.select_circle")
831 layout.separator()
833 layout.operator("mesh.select_all").action = 'TOGGLE'
834 layout.operator("mesh.select_all", text="Inverse").action = 'INVERT'
835 layout.separator()
837 layout.operator("mesh.select_random", text="Random")
838 layout.operator("mesh.select_nth", text="Every N Number of Verts")
839 layout.operator("mesh.edges_select_sharp", text="Sharp Edges")
840 layout.operator("mesh.faces_select_linked_flat",
841 text="Linked Flat Faces")
842 layout.operator("mesh.select_interior_faces", text="Interior Faces")
843 layout.operator("mesh.select_axis", text="Side of Active")
844 layout.separator()
846 layout.operator("mesh.select_face_by_sides", text="By Number of Verts")
847 if context.scene.tool_settings.mesh_select_mode[2] == False:
848 layout.operator("mesh.select_non_manifold", text="Non Manifold")
849 layout.operator("mesh.select_loose", text="Loose Geometry")
850 layout.operator("mesh.select_similar", text="Similar")
852 layout.separator()
854 layout.operator("mesh.select_less", text="Less")
855 layout.operator("mesh.select_more", text="More")
856 layout.separator()
858 layout.operator("mesh.select_mirror", text="Mirror")
860 layout.operator("mesh.select_linked", text="Linked")
861 layout.operator("mesh.shortest_path_select", text="Shortest Path")
862 layout.operator("mesh.loop_multi_select", text="Edge Loop")
863 layout.operator("mesh.loop_multi_select", text="Edge Ring").ring = True
864 layout.separator()
866 layout.operator("mesh.loop_to_region")
867 layout.operator("mesh.region_to_loop")
869 class VIEW3D_MT_SelectCurveMenu(bpy.types.Menu):
870 bl_label = "Select Menu"
872 def draw(self, context):
873 layout = self.layout
875 layout.operator("view3d.select_border")
876 layout.operator("view3d.select_circle")
877 layout.separator()
879 layout.operator("curve.select_all").action = 'TOGGLE'
880 layout.operator("curve.select_all").action = 'INVERT'
881 layout.operator("curve.select_random")
882 layout.operator("curve.select_nth")
883 layout.separator()
885 layout.operator("curve.de_select_first")
886 layout.operator("curve.de_select_last")
887 layout.operator("curve.select_next")
888 layout.operator("curve.select_previous")
889 layout.separator()
891 layout.operator("curve.select_more")
892 layout.operator("curve.select_less")
894 class VIEW3D_MT_SelectArmatureMenu(bpy.types.Menu):
895 bl_label = "Select Menu"
897 def draw(self, context):
898 layout = self.layout
900 layout.operator("view3d.select_border")
901 layout.separator()
903 layout.operator("armature.select_all")
904 layout.operator("armature.select_inverse", text="Inverse")
905 layout.separator()
907 layout.operator("armature.select_hierarchy",
908 text="Parent").direction = 'PARENT'
909 layout.operator("armature.select_hierarchy",
910 text="Child").direction = 'CHILD'
911 layout.separator()
913 props = layout.operator("armature.select_hierarchy",
914 text="Extend Parent")
915 props.extend = True
916 props.direction = 'PARENT'
918 props = layout.operator("armature.select_hierarchy",
919 text="Extend Child")
920 props.extend = True
921 props.direction = 'CHILD'
923 layout.operator("object.select_pattern", text="Select Pattern...")
926 class VIEW3D_MT_SelectPoseMenu(bpy.types.Menu):
927 bl_label = "Select Menu"
929 def draw(self, context):
930 layout = self.layout
932 layout.operator("view3d.select_border")
933 layout.separator()
935 layout.operator("pose.select_all").action = 'TOGGLE'
936 layout.operator("pose.select_all", text="Inverse").action = 'INVERT'
937 layout.operator("pose.select_constraint_target",
938 text="Constraint Target")
939 layout.operator("pose.select_linked", text="Linked")
940 layout.separator()
942 layout.operator("pose.select_hierarchy",
943 text="Parent").direction = 'PARENT'
944 layout.operator("pose.select_hierarchy",
945 text="Child").direction = 'CHILD'
946 layout.separator()
948 props = layout.operator("pose.select_hierarchy", text="Extend Parent")
949 props.extend = True
950 props.direction = 'PARENT'
952 props = layout.operator("pose.select_hierarchy", text="Extend Child")
953 props.extend = True
954 props.direction = 'CHILD'
955 layout.separator()
957 layout.operator_menu_enum("pose.select_grouped", "type",
958 text="Grouped")
959 layout.operator("object.select_pattern", text="Select Pattern...")
961 class VIEW3D_MT_PoseCopy(bpy.types.Menu):
962 bl_label = "Pose Copy"
964 def draw(self, context):
965 layout = self.layout
967 layout.operator("pose.copy")
968 layout.operator("pose.paste")
969 layout.operator("pose.paste",
970 text="Paste X-Flipped Pose").flipped = True
971 layout.separator()
973 class VIEW3D_MT_PoseNames(bpy.types.Menu):
974 bl_label = "Pose Copy"
976 def draw(self, context):
977 layout = self.layout
979 layout.operator_context = 'EXEC_AREA'
980 layout.operator("pose.autoside_names",
981 text="AutoName Left/Right").axis = 'XAXIS'
982 layout.operator("pose.autoside_names",
983 text="AutoName Front/Back").axis = 'YAXIS'
984 layout.operator("pose.autoside_names",
985 text="AutoName Top/Bottom").axis = 'ZAXIS'
987 layout.operator("pose.flip_names")
990 class VIEW3D_MT_SelectSurface(bpy.types.Menu):
991 bl_label = "Select Menu"
993 def draw(self, context):
994 layout = self.layout
996 layout.operator("view3d.select_border")
997 layout.operator("view3d.select_circle")
999 layout.separator()
1001 layout.operator("curve.select_all").action = 'TOGGLE'
1002 layout.operator("curve.select_all").action = 'INVERT'
1003 layout.operator("curve.select_random")
1004 layout.operator("curve.select_nth")
1006 layout.separator()
1008 layout.operator("curve.select_row")
1010 layout.separator()
1012 layout.operator("curve.select_more")
1013 layout.operator("curve.select_less")
1015 class VIEW3D_MT_SelectMetaball(bpy.types.Menu):
1016 bl_label = "Select Menu"
1018 def draw(self, context):
1019 layout = self.layout
1021 layout.operator("view3d.select_border")
1023 layout.separator()
1025 layout.operator("mball.select_all").action = 'TOGGLE'
1026 layout.operator("mball.select_all").action = 'INVERT'
1027 layout.operator("mball.select_random_metaelems")
1029 class VIEW3D_MT_edit_TK(bpy.types.Menu):
1030 bl_label = "Edit Mesh Tools"
1032 def draw(self, context):
1033 layout = self.layout
1034 layout.row() # XXX, is this needed?
1036 layout.operator_context = 'INVOKE_REGION_WIN'
1038 layout.menu("VIEW3D_MT_edit_mesh_vertices", icon='VERTEXSEL')
1039 layout.menu("VIEW3D_MT_edit_mesh_edges", icon='EDGESEL')
1040 layout.menu("VIEW3D_MT_edit_mesh_faces", icon='FACESEL')
1041 layout.separator()
1042 layout.menu("VIEW3D_MT_edit_mesh_normals", icon='META_DATA')
1043 layout.operator("mesh.loopcut_slide",
1044 text="Loopcut", icon='EDIT_VEC')
1048 class VIEW3D_MT_edit_multi(bpy.types.Menu):
1049 bl_label = "Multi Select"
1051 def draw(self, context):
1052 layout = self.layout
1053 layout.operator_context = 'INVOKE_REGION_WIN'
1055 layout.separator()
1056 prop = layout.operator("wm.context_set_value", text="Vertex Select",
1057 icon='VERTEXSEL')
1058 prop.value = "(True, False, False)"
1059 prop.data_path = "tool_settings.mesh_select_mode"
1061 prop = layout.operator("wm.context_set_value", text="Edge Select",
1062 icon='EDGESEL')
1063 prop.value = "(False, True, False)"
1064 prop.data_path = "tool_settings.mesh_select_mode"
1066 prop = layout.operator("wm.context_set_value", text="Face Select",
1067 icon='FACESEL')
1068 prop.value = "(False, False, True)"
1069 prop.data_path = "tool_settings.mesh_select_mode"
1070 layout.separator()
1072 prop = layout.operator("wm.context_set_value",
1073 text="Vertex & Edge Select",
1074 icon='EDITMODE_HLT')
1075 prop.value = "(True, True, False)"
1076 prop.data_path = "tool_settings.mesh_select_mode"
1078 prop = layout.operator("wm.context_set_value",
1079 text="Vertex & Face Select",
1080 icon='ORTHO')
1081 prop.value = "(True, False, True)"
1082 prop.data_path = "tool_settings.mesh_select_mode"
1084 prop = layout.operator("wm.context_set_value",
1085 text="Edge & Face Select",
1086 icon='SNAP_FACE')
1087 prop.value = "(False, True, True)"
1088 prop.data_path = "tool_settings.mesh_select_mode"
1089 layout.separator()
1091 prop = layout.operator("wm.context_set_value",
1092 text="Vertex & Edge & Face Select",
1093 icon='SNAP_VOLUME')
1094 prop.value = "(True, True, True)"
1095 prop.data_path = "tool_settings.mesh_select_mode"
1097 class VIEW3D_MT_editM_Edge(bpy.types.Menu):
1098 bl_label = "Edges"
1100 def draw(self, context):
1101 layout = self.layout
1102 layout.operator_context = 'INVOKE_REGION_WIN'
1104 layout.operator("mesh.mark_seam")
1105 layout.operator("mesh.mark_seam", text="Clear Seam").clear = True
1106 layout.separator()
1108 layout.operator("mesh.mark_sharp")
1109 layout.operator("mesh.mark_sharp", text="Clear Sharp").clear = True
1110 layout.operator("mesh.extrude_move_along_normals", text="Extrude")
1111 layout.separator()
1113 layout.operator("mesh.edge_rotate",
1114 text="Rotate Edge CW").direction = 'CW'
1115 layout.operator("mesh.edge_rotate",
1116 text="Rotate Edge CCW").direction = 'CCW'
1117 layout.separator()
1119 layout.operator("TFM_OT_edge_slide", text="Edge Slide")
1120 layout.operator("mesh.loop_multi_select", text="Edge Loop")
1121 layout.operator("mesh.loop_multi_select", text="Edge Ring").ring = True
1122 layout.operator("mesh.loop_to_region")
1123 layout.operator("mesh.region_to_loop")
1126 class VIEW3D_MT_EditCurveCtrlpoints(bpy.types.Menu):
1127 bl_label = "Control Points"
1129 def draw(self, context):
1130 layout = self.layout
1132 edit_object = context.edit_object
1134 if edit_object.type == 'CURVE':
1135 layout.operator("transform.transform").mode = 'TILT'
1136 layout.operator("curve.tilt_clear")
1137 layout.operator("curve.separate")
1139 layout.separator()
1141 layout.operator_menu_enum("curve.handle_type_set", "type")
1143 layout.separator()
1145 layout.menu("VIEW3D_MT_hook")
1148 class VIEW3D_MT_EditCurveSegments(bpy.types.Menu):
1149 bl_label = "Curve Segments"
1151 def draw(self, context):
1152 layout = self.layout
1154 layout.operator("curve.subdivide")
1155 layout.operator("curve.switch_direction")
1157 class VIEW3D_MT_EditCurveSpecials(bpy.types.Menu):
1158 bl_label = "Specials"
1160 def draw(self, context):
1161 layout = self.layout
1163 layout.operator("curve.subdivide")
1164 layout.operator("curve.switch_direction")
1165 layout.operator("curve.spline_weight_set")
1166 layout.operator("curve.radius_set")
1167 layout.operator("curve.smooth")
1168 layout.operator("curve.smooth_weight")
1169 layout.operator("curve.smooth_radius")
1170 layout.operator("curve.smooth_tilt")
1172 class VIEW3D_MT_EditArmatureTK(bpy.types.Menu):
1173 bl_label = "Armature Tools"
1175 def draw(self, context):
1176 layout = self.layout
1178 # Edit Armature
1180 layout.operator("transform.transform",
1181 text="Scale Envelope Distance").mode = 'BONE_SIZE'
1183 layout.operator("transform.transform",
1184 text="Scale B-Bone Width").mode = 'BONE_SIZE'
1185 layout.separator()
1187 layout.operator("armature.extrude_move")
1189 layout.operator("armature.extrude_forked")
1191 layout.operator("armature.duplicate_move")
1192 layout.operator("armature.merge")
1193 layout.operator("armature.fill")
1194 layout.operator("armature.delete")
1195 layout.operator("armature.separate")
1197 layout.separator()
1199 layout.operator("armature.subdivide", text="Subdivide")
1200 layout.operator("armature.switch_direction", text="Switch Direction")
1202 class VIEW3D_MT_ArmatureName(bpy.types.Menu):
1203 bl_label = "Armature Name"
1205 def draw(self, context):
1206 layout = self.layout
1208 layout.operator_context = 'EXEC_AREA'
1209 layout.operator("armature.autoside_names",
1210 text="AutoName Left/Right").type = 'XAXIS'
1211 layout.operator("armature.autoside_names",
1212 text="AutoName Front/Back").type = 'YAXIS'
1213 layout.operator("armature.autoside_names",
1214 text="AutoName Top/Bottom").type = 'ZAXIS'
1215 layout.operator("armature.flip_names")
1216 layout.separator()
1218 class VIEW3D_MT_KeyframeMenu(bpy.types.Menu):
1219 bl_label = "Keyframe Menu"
1221 def draw(self, context):
1222 layout = self.layout
1224 # Keyframe Bleck
1225 layout.operator("anim.keyframe_insert_menu",
1226 text="Insert Keyframe...")
1227 layout.operator("anim.keyframe_delete_v3d",
1228 text="Delete Keyframe...")
1229 layout.operator("anim.keying_set_active_set",
1230 text="Change Keying Set...")
1231 layout.separator()
1233 # Classes for VIEW3D_MT_CursorMenu()
1234 class VIEW3D_OT_pivot_cursor(bpy.types.Operator):
1235 "Cursor as Pivot Point"
1236 bl_idname = "view3d.pivot_cursor"
1237 bl_label = "Cursor as Pivot Point"
1239 @classmethod
1240 def poll(cls, context):
1241 return bpy.context.space_data.pivot_point != 'CURSOR'
1243 def execute(self, context):
1244 bpy.context.space_data.pivot_point = 'CURSOR'
1245 return {'FINISHED'}
1247 class VIEW3D_OT_revert_pivot(bpy.types.Operator):
1248 "Revert Pivot Point"
1249 bl_idname = "view3d.revert_pivot"
1250 bl_label = "Reverts Pivot Point to median"
1252 @classmethod
1253 def poll(cls, context):
1254 return bpy.context.space_data.pivot_point != 'MEDIAN_POINT'
1256 def execute(self, context):
1257 bpy.context.space_data.pivot_point = 'MEDIAN_POINT'
1258 # @todo Change this to 'BOUDNING_BOX_CENTER' if needed...
1259 return{'FINISHED'}
1261 class VIEW3D_MT_CursorMenu(bpy.types.Menu):
1262 bl_label = "Snap Cursor Menu"
1264 def draw(self, context):
1266 layout = self.layout
1267 layout.operator_context = 'INVOKE_REGION_WIN'
1268 layout.operator("view3d.snap_cursor_to_selected",
1269 text="Cursor to Selected")
1270 layout.operator("view3d.snap_cursor_to_center",
1271 text="Cursor to Center")
1272 layout.operator("view3d.snap_cursor_to_grid",
1273 text="Cursor to Grid")
1274 layout.operator("view3d.snap_cursor_to_active",
1275 text="Cursor to Active")
1276 layout.separator()
1277 layout.operator("view3d.snap_selected_to_cursor",
1278 text="Selection to Cursor")
1279 layout.operator("view3d.snap_selected_to_grid",
1280 text="Selection to Grid")
1281 layout.separator()
1282 layout.operator("view3d.pivot_cursor",
1283 text="Set Cursor as Pivot Point")
1284 layout.operator("view3d.revert_pivot",
1285 text="Revert Pivot Point")
1287 class VIEW3D_MT_EditCursorMenu(bpy.types.Menu):
1288 bl_label = "Snap Cursor Menu"
1290 def draw(self, context):
1292 layout = self.layout
1293 layout.operator_context = 'INVOKE_REGION_WIN'
1294 layout.operator("view3d.snap_cursor_to_selected",
1295 text="Cursor to Selected")
1296 layout.operator("view3d.snap_cursor_to_center",
1297 text="Cursor to Center")
1298 layout.operator("view3d.snap_cursor_to_grid",
1299 text="Cursor to Grid")
1300 layout.operator("view3d.snap_cursor_to_active",
1301 text="Cursor to Active")
1302 layout.separator()
1303 layout.operator("view3d.snap_selected_to_cursor",
1304 text="Selection to Cursor")
1305 layout.operator("view3d.snap_selected_to_grid",
1306 text="Selection to Grid")
1307 layout.separator()
1308 layout.operator("view3d.pivot_cursor",
1309 text="Set Cursor as Pivot Point")
1310 layout.operator("view3d.revert_pivot",
1311 text="Revert Pivot Point")
1312 layout.operator("view3d.snap_cursor_to_edge_intersection",
1313 text="Cursor to Edge Intersection")
1314 layout.operator("transform.snap_type", text="Snap Tools",
1315 icon='SNAP_ON')
1317 def abs(val):
1318 if val > 0:
1319 return val
1320 return -val
1322 def edgeIntersect(context, operator):
1323 from mathutils.geometry import intersect_line_line
1325 obj = context.active_object
1327 if (obj.type != "MESH"):
1328 operator.report({'ERROR'}, "Object must be a mesh")
1329 return None
1331 edges = []
1332 mesh = obj.data
1333 verts = mesh.vertices
1335 is_editmode = (obj.mode == 'EDIT')
1336 if is_editmode:
1337 bpy.ops.object.mode_set(mode='OBJECT')
1339 for e in mesh.edges:
1340 if e.select:
1341 edges.append(e)
1343 if len(edges) > 2:
1344 break
1346 if is_editmode:
1347 bpy.ops.object.mode_set(mode='EDIT')
1349 if len(edges) != 2:
1350 operator.report({'ERROR'},
1351 "Operator requires exactly 2 edges to be selected")
1352 return
1354 line = intersect_line_line(verts[edges[0].vertices[0]].co,
1355 verts[edges[0].vertices[1]].co,
1356 verts[edges[1].vertices[0]].co,
1357 verts[edges[1].vertices[1]].co)
1359 if line is None:
1360 operator.report({'ERROR'}, "Selected edges do not intersect")
1361 return
1363 point = line[0].lerp(line[1], 0.5)
1364 context.scene.cursor_location = obj.matrix_world * point
1366 class VIEW3D_OT_CursorToEdgeIntersection(bpy.types.Operator):
1367 "Finds the mid-point of the shortest distance between two edges"
1369 bl_idname = "view3d.snap_cursor_to_edge_intersection"
1370 bl_label = "Cursor to Edge Intersection"
1372 @classmethod
1373 def poll(cls, context):
1374 obj = context.active_object
1375 return obj != None and obj.type == 'MESH'
1377 def execute(self, context):
1378 edgeIntersect(context, self)
1379 return {'FINISHED'}
1381 class VIEW3D_MT_undoS(bpy.types.Menu):
1382 bl_label = "Undo/Redo"
1384 def draw(self, context):
1385 layout = self.layout
1386 layout.operator_context = 'INVOKE_REGION_WIN'
1387 layout.operator("ed.undo", icon='TRIA_LEFT')
1388 layout.operator("ed.redo", icon='TRIA_RIGHT')
1390 def register():
1391 bpy.utils.register_module(__name__)
1393 wm = bpy.context.window_manager
1394 kc = wm.keyconfigs.addon
1395 if kc:
1396 km = kc.keymaps.new(name='3D View', space_type='VIEW_3D')
1397 kmi = km.keymap_items.new('wm.call_menu', 'SPACE', 'PRESS')
1398 kmi.properties.name = "VIEW3D_MT_Space_Dynamic_Menu"
1400 def unregister():
1401 bpy.utils.unregister_module(__name__)
1403 wm = bpy.context.window_manager
1404 kc = wm.keyconfigs.addon
1405 if kc:
1406 km = kc.keymaps['3D View']
1407 for kmi in km.keymap_items:
1408 if kmi.idname == 'wm.call_menu':
1409 if kmi.properties.name == "VIEW3D_MT_Space_Dynamic_Menu":
1410 km.keymap_items.remove(kmi)
1411 break
1413 if __name__ == "__main__":
1414 register()