4 # ********** Header **********
6 class VIEW3D_HT_header(bpy.types.Header):
7 __space_type__ = 'VIEW_3D'
9 def draw(self, context):
12 view = context.space_data
13 mode_string = context.mode
14 edit_object = context.edit_object
15 object = context.active_object
17 row = layout.row(align=True)
21 if context.area.show_menus:
22 sub = row.row(align=True)
24 sub.itemM("VIEW3D_MT_view")
27 if mode_string not in ('EDIT_TEXT', 'SCULPT', 'PAINT_WEIGHT', 'PAINT_VERTEX', 'PAINT_TEXTURE'):
28 sub.itemM("VIEW3D_MT_select_%s" % mode_string)
31 sub.itemM("VIEW3D_MT_edit_%s" % edit_object.type)
33 ob_mode_string = object.mode
35 if mode_string not in ['PAINT_WEIGHT', 'PAINT_TEXTURE']:
36 sub.itemM("VIEW3D_MT_%s" % mode_string)
38 layout.template_header_3D()
40 # ********** Menu **********
42 # ********** Utilities **********
44 class VIEW3D_MT_showhide(bpy.types.Menu):
45 __space_type__ = "VIEW_3D"
46 __label__ = "Show/Hide"
49 def draw(self, context):
52 layout.itemO("%s.reveal" % self._operator_name, text="Show Hidden")
53 layout.itemO("%s.hide" % self._operator_name, text="Hide Selected")
54 layout.item_booleanO("%s.hide" % self._operator_name, "unselected", True, text="Hide Unselected")
56 class VIEW3D_MT_snap(bpy.types.Menu):
57 __space_type__ = "VIEW_3D"
60 def draw(self, context):
63 layout.itemO("view3d.snap_selected_to_grid")
64 layout.itemO("view3d.snap_selected_to_cursor")
65 layout.itemO("view3d.snap_selected_to_center")
69 layout.itemO("view3d.snap_cursor_to_selected")
70 layout.itemO("view3d.snap_cursor_to_grid")
71 layout.itemO("view3d.snap_cursor_to_active")
73 # ********** View menus **********
75 class VIEW3D_MT_view(bpy.types.Menu):
76 __space_type__ = 'VIEW_3D'
79 def draw(self, context):
82 layout.itemO("view3d.properties", icon='ICON_MENU_PANEL')
83 layout.itemO("view3d.toolbar", icon='ICON_MENU_PANEL')
87 layout.item_enumO("view3d.viewnumpad", "type", 'CAMERA')
88 layout.item_enumO("view3d.viewnumpad", "type", 'TOP')
89 layout.item_enumO("view3d.viewnumpad", "type", 'FRONT')
90 layout.item_enumO("view3d.viewnumpad", "type", 'RIGHT')
92 layout.itemM("VIEW3D_MT_view_cameras", text="Cameras")
96 layout.itemO("view3d.view_persportho")
100 layout.itemM("VIEW3D_MT_view_navigation")
101 layout.itemM("VIEW3D_MT_view_align")
105 layout.operator_context = "INVOKE_REGION_WIN"
107 layout.itemO("view3d.clip_border")
108 layout.itemO("view3d.zoom_border")
112 layout.itemO("view3d.view_center")
113 layout.itemO("view3d.view_all")
117 layout.itemO("screen.region_foursplit", text="Toggle Quad View")
118 layout.itemO("screen.screen_full_area", text="Toggle Full Screen")
120 class VIEW3D_MT_view_navigation(bpy.types.Menu):
121 __space_type__ = 'VIEW_3D'
122 __label__ = "Navigation"
124 def draw(self, context):
127 layout.items_enumO("view3d.view_orbit", "type")
131 layout.items_enumO("view3d.view_pan", "type")
135 layout.item_floatO("view3d.zoom", "delta", 1.0, text="Zoom In")
136 layout.item_floatO("view3d.zoom", "delta", -1.0, text="Zoom Out")
138 class VIEW3D_MT_view_align(bpy.types.Menu):
139 __space_type__ = "VIEW_3D"
140 __label__ = "Align View"
142 def draw(self, context):
145 layout.itemO("view3d.view_center")
147 class VIEW3D_MT_view_cameras(bpy.types.Menu):
148 __space_type__ = "VIEW_3D"
149 __label__ = "Cameras"
151 def draw(self, context):
154 # ********** Select menus, suffix from context.mode **********
156 class VIEW3D_MT_select_OBJECT(bpy.types.Menu):
157 __space_type__ = 'VIEW_3D'
160 def draw(self, context):
163 layout.itemO("view3d.select_border")
167 layout.itemO("object.select_all_toggle", text="Select/Deselect All")
168 layout.itemO("object.select_inverse", text="Inverse")
169 layout.itemO("object.select_random", text="Random")
170 layout.itemO("object.select_by_layer", text="Select All by Layer")
171 layout.item_enumO("object.select_by_type", "type", "", text="Select All by Type")
172 layout.itemO("object.select_grouped", text="Select Grouped")
174 class VIEW3D_MT_select_POSE(bpy.types.Menu):
175 __space_type__ = 'VIEW_3D'
178 def draw(self, context):
181 layout.itemO("view3d.select_border")
185 layout.itemO("pose.select_all_toggle", text="Select/Deselect All")
186 layout.itemO("pose.select_inverse", text="Inverse")
187 layout.itemO("pose.select_constraint_target", text="Constraint Target")
191 layout.item_enumO("pose.select_hierarchy", "direction", 'PARENT')
192 layout.item_enumO("pose.select_hierarchy", "direction", 'CHILD')
196 props = layout.itemO("pose.select_hierarchy", properties=True, text="Extend Parent")
198 props.direction = 'PARENT'
200 props = layout.itemO("pose.select_hierarchy", properties=True, text="Extend Child")
202 props.direction = 'CHILD'
204 class VIEW3D_MT_select_PARTICLE(bpy.types.Menu):
205 __space_type__ = 'VIEW_3D'
208 def draw(self, context):
211 layout.itemO("view3d.select_border")
215 layout.itemO("particle.select_all_toggle", text="Select/Deselect All")
216 layout.itemO("particle.select_linked")
220 layout.itemO("particle.select_more")
221 layout.itemO("particle.select_less")
223 class VIEW3D_MT_select_EDIT_MESH(bpy.types.Menu):
224 __space_type__ = 'VIEW_3D'
227 def draw(self, context):
230 layout.itemO("view3d.select_border")
234 layout.itemO("mesh.select_all_toggle", text="Select/Deselect All")
235 layout.itemO("mesh.select_inverse", text="Inverse")
239 layout.itemO("mesh.select_random", text="Random...")
240 layout.itemO("mesh.edges_select_sharp", text="Sharp Edges")
241 layout.itemO("mesh.faces_select_linked_flat", text="Linked Flat Faces")
245 layout.item_enumO("mesh.select_by_number_vertices", "type", 'TRIANGLES', text="Triangles")
246 layout.item_enumO("mesh.select_by_number_vertices", "type", 'QUADS', text="Quads")
247 layout.item_enumO("mesh.select_by_number_vertices", "type", 'OTHER', text="Loose Verts/Edges")
248 layout.itemO("mesh.select_similar", text="Similar...")
252 layout.itemO("mesh.select_less", text="Less")
253 layout.itemO("mesh.select_more", text="More")
257 layout.itemO("mesh.select_linked", text="Linked")
258 layout.itemO("mesh.select_vertex_path", text="Vertex Path")
259 layout.itemO("mesh.loop_multi_select", text="Edge Loop")
260 layout.item_booleanO("mesh.loop_multi_select", "ring", True, text="Edge Ring")
264 layout.itemO("mesh.loop_to_region")
265 layout.itemO("mesh.region_to_loop")
267 class VIEW3D_MT_select_EDIT_CURVE(bpy.types.Menu):
268 __space_type__ = 'VIEW_3D'
271 def draw(self, context):
274 layout.itemO("view3d.select_border")
275 layout.itemO("view3d.select_circle")
279 layout.itemO("curve.select_all_toggle", text="Select/Deselect All")
280 layout.itemO("curve.select_inverse")
281 layout.itemO("curve.select_random")
282 layout.itemO("curve.select_every_nth")
286 layout.itemO("curve.de_select_first")
287 layout.itemO("curve.de_select_last")
288 layout.itemO("curve.select_next")
289 layout.itemO("curve.select_previous")
293 layout.itemO("curve.select_more")
294 layout.itemO("curve.select_less")
296 class VIEW3D_MT_select_EDIT_SURFACE(bpy.types.Menu):
297 __space_type__ = 'VIEW_3D'
300 def draw(self, context):
303 layout.itemO("view3d.select_border")
304 layout.itemO("view3d.select_circle")
308 layout.itemO("curve.select_all_toggle", text="Select/Deselect All")
309 layout.itemO("curve.select_inverse")
310 layout.itemO("curve.select_random")
311 layout.itemO("curve.select_every_nth")
315 layout.itemO("curve.select_row")
319 layout.itemO("curve.select_more")
320 layout.itemO("curve.select_less")
322 class VIEW3D_MT_select_EDIT_METABALL(bpy.types.Menu):
323 __space_type__ = 'VIEW_3D'
326 def draw(self, context):
329 layout.itemO("view3d.select_border")
333 layout.itemO("mball.select_deselect_all_metaelems")
334 layout.itemO("mball.select_inverse_metaelems")
338 layout.itemO("mball.select_random_metaelems")
340 class VIEW3D_MT_select_EDIT_LATTICE(bpy.types.Menu):
341 __space_type__ = 'VIEW_3D'
344 def draw(self, context):
347 layout.itemO("view3d.select_border")
351 layout.itemO("lattice.select_all_toggle", text="Select/Deselect All")
353 class VIEW3D_MT_select_EDIT_ARMATURE(bpy.types.Menu):
354 __space_type__ = 'VIEW_3D'
357 def draw(self, context):
360 layout.itemO("view3d.select_border")
364 layout.itemO("armature.select_all_toggle", text="Select/Deselect All")
365 layout.itemO("armature.select_inverse", text="Inverse")
369 layout.item_enumO("armature.select_hierarchy", "direction", 'PARENT', text="Parent")
370 layout.item_enumO("armature.select_hierarchy", "direction", 'CHILD', text="Child")
374 props = layout.itemO("armature.select_hierarchy", properties=True, text="Extend Parent")
376 props.direction = 'PARENT'
378 props = layout.itemO("armature.select_hierarchy", properties=True, text="Extend Child")
380 props.direction = 'CHILD'
382 class VIEW3D_MT_select_FACE(bpy.types.Menu):# XXX no matching enum
383 __space_type__ = 'VIEW_3D'
386 def draw(self, context):
389 layout.view3d_select_faceselmenu()
391 # ********** Object menu **********
393 class VIEW3D_MT_OBJECT(bpy.types.Menu):
394 __space_type__ = 'VIEW_3D'
395 __context__ = "objectmode"
398 def draw(self, context):
401 layout.itemM("VIEW3D_MT_OBJECT_clear")
402 layout.itemM("VIEW3D_MT_snap")
406 layout.itemO("anim.insert_keyframe_menu")
407 layout.itemO("anim.delete_keyframe_v3d")
411 layout.itemO("object.duplicate")
412 layout.item_booleanO("object.duplicate", "linked", True, text="Duplicate Linked")
413 layout.itemO("object.delete")
414 layout.itemO("object.proxy_make")
418 layout.itemM("VIEW3D_MT_OBJECT_parent")
419 layout.itemM("VIEW3D_MT_OBJECT_track")
420 layout.itemM("VIEW3D_MT_OBJECT_group")
421 layout.itemM("VIEW3D_MT_OBJECT_constraints")
425 layout.itemO("object.join")
429 layout.itemM("VIEW3D_MT_OBJECT_showhide")
431 class VIEW3D_MT_OBJECT_clear(bpy.types.Menu):
432 __space_type__ = 'VIEW_3D'
435 def draw(self, context):
438 layout.itemO("object.location_clear")
439 layout.itemO("object.rotation_clear")
440 layout.itemO("object.scale_clear")
441 layout.itemO("object.origin_clear")
443 class VIEW3D_MT_OBJECT_parent(bpy.types.Menu):
444 __space_type__ = 'VIEW_3D'
447 def draw(self, context):
450 layout.itemO("object.parent_set")
451 layout.itemO("object.parent_clear")
453 class VIEW3D_MT_OBJECT_track(bpy.types.Menu):
454 __space_type__ = 'VIEW_3D'
457 def draw(self, context):
460 layout.itemO("object.track_set")
461 layout.itemO("object.track_clear")
463 class VIEW3D_MT_OBJECT_group(bpy.types.Menu):
464 __space_type__ = 'VIEW_3D'
467 def draw(self, context):
470 layout.itemO("group.group_create")
471 layout.itemO("group.objects_remove")
475 layout.itemO("group.objects_add_active")
476 layout.itemO("group.objects_remove_active")
478 class VIEW3D_MT_OBJECT_constraints(bpy.types.Menu):
479 __space_type__ = 'VIEW_3D'
480 __label__ = "Constraints"
482 def draw(self, context):
485 layout.itemO("object.constraint_add_with_targets")
486 layout.itemO("object.constraints_clear")
488 class VIEW3D_MT_OBJECT_showhide(bpy.types.Menu):
489 __space_type__ = 'VIEW_3D'
490 __label__ = "Show/Hide"
492 def draw(self, context):
495 layout.itemO("object.restrictview_clear", text="Show Hidden")
496 layout.itemO("object.restrictview_set", text="Hide Selected")
497 layout.item_booleanO("object.restrictview_set", "unselected", True, text="Hide Unselected")
499 # ********** Vertex paint menu **********
501 class VIEW3D_MT_PAINT_VERTEX(bpy.types.Menu):
502 __space_type__ = 'VIEW_3D'
505 def draw(self, context):
508 sculpt = context.tool_settings.sculpt
510 layout.itemO("paint.vertex_color_set")
511 props = layout.itemO("paint.vertex_color_set", text="Set Selected Vertex Colors", properties=True)
512 props.selected = True
514 # ********** Sculpt menu **********
516 class VIEW3D_MT_SCULPT(bpy.types.Menu):
517 __space_type__ = 'VIEW_3D'
520 def draw(self, context):
523 sculpt = context.tool_settings.sculpt
524 brush = context.tool_settings.sculpt.brush
526 layout.itemR(sculpt, "symmetry_x")
527 layout.itemR(sculpt, "symmetry_y")
528 layout.itemR(sculpt, "symmetry_z")
530 layout.itemR(sculpt, "lock_x")
531 layout.itemR(sculpt, "lock_y")
532 layout.itemR(sculpt, "lock_z")
534 layout.item_menu_enumO("brush.curve_preset", property="shape")
537 if brush.sculpt_tool != 'GRAB':
538 layout.itemR(brush, "airbrush")
540 if brush.sculpt_tool != 'LAYER':
541 layout.itemR(brush, "anchored")
543 if brush.sculpt_tool in ('DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'):
544 layout.itemR(brush, "flip_direction")
546 if brush.sculpt_tool == 'LAYER':
547 layout.itemR(brush, "persistent")
548 layout.itemO("sculpt.set_persistent_base")
550 # ********** Particle menu **********
552 class VIEW3D_MT_PARTICLE(bpy.types.Menu):
553 __space_type__ = 'VIEW_3D'
554 __label__ = "Particle"
556 def draw(self, context):
559 particle_edit = context.tool_settings.particle_edit
561 layout.itemO("particle.mirror")
565 layout.itemO("particle.remove_doubles")
566 layout.itemO("particle.delete")
568 if particle_edit.selection_mode == 'POINT':
569 layout.itemO("particle.subdivide")
571 layout.itemO("particle.rekey")
575 layout.itemM("VIEW3D_MT_PARTICLE_showhide")
577 class VIEW3D_MT_PARTICLE_showhide(VIEW3D_MT_showhide):
578 _operator_name = "particle"
580 # ********** Pose Menu **********
582 class VIEW3D_MT_POSE(bpy.types.Menu):
583 __space_type__ = "VIEW_3D"
586 def draw(self, context):
589 arm = context.active_object.data
591 if arm.drawtype in ('BBONE', 'ENVELOPE'):
592 layout.item_enumO("tfm.transform", "mode", 'BONESIZE', text="Scale Envelope Distance")
594 layout.itemM("VIEW3D_MT_POSE_transform")
598 layout.itemO("anim.insert_keyframe_menu")
599 layout.itemO("anim.delete_keyframe_v3d")
603 layout.itemO("pose.apply")
607 layout.itemO("pose.copy")
608 layout.itemO("pose.paste")
609 layout.item_booleanO("pose.paste", "flipped", True, text="Paste X-Flipped Pose")
613 layout.itemM("VIEW3D_MT_POSE_pose")
614 layout.itemM("VIEW3D_MT_POSE_motion")
615 layout.itemM("VIEW3D_MT_POSE_group")
619 layout.itemM("VIEW3D_MT_POSE_ik")
620 layout.itemM("VIEW3D_MT_POSE_constraints")
624 layout.item_enumO("pose.autoside_names", "axis", 'XAXIS', text="AutoName Left/Right")
625 layout.item_enumO("pose.autoside_names", "axis", 'YAXIS', text="AutoName Front/Back")
626 layout.item_enumO("pose.autoside_names", "axis", 'ZAXIS', text="AutoName Top/Bottom")
628 layout.itemO("pose.flip_names")
632 layout.itemO("pose.armature_layers")
633 layout.itemO("pose.bone_layers")
637 layout.itemM("VIEW3D_MT_POSE_showhide")
638 layout.item_menu_enumO("pose.flags_set", 'mode', text="Bone Settings")
640 class VIEW3D_MT_POSE_transform(bpy.types.Menu):
641 __space_type__ = "VIEW_3D"
642 __label__ = "Clear Transform"
644 def draw(self, context):
647 layout.itemL(text="Clear User Transform")
649 layout.itemO("pose.loc_clear")
650 layout.itemO("pose.rot_clear")
651 layout.itemO("pose.scale_clear")
653 layout.itemL(text="Clear Origin")
655 class VIEW3D_MT_POSE_pose(bpy.types.Menu):
656 __space_type__ = "VIEW_3D"
657 __label__ = "Pose Library"
659 def draw(self, context):
662 layout.itemO("poselib.browse_interactive")
666 layout.itemO("poselib.pose_add")
667 layout.itemO("poselib.pose_rename")
668 layout.itemO("poselib.pose_remove")
670 class VIEW3D_MT_POSE_motion(bpy.types.Menu):
671 __space_type__ = "VIEW_3D"
672 __label__ = "Motion Paths"
674 def draw(self, context):
677 layout.itemO("pose.paths_calculate")
678 layout.itemO("pose.paths_clear")
680 class VIEW3D_MT_POSE_group(bpy.types.Menu):
681 __space_type__ = "VIEW_3D"
682 __label__ = "Bone Groups"
684 def draw(self, context):
687 layout.itemO("pose.group_assign")
688 layout.itemO("pose.group_add")
689 layout.itemO("pose.group_unassign")
690 layout.itemO("pose.group_remove")
692 class VIEW3D_MT_POSE_ik(bpy.types.Menu):
693 __space_type__ = "VIEW_3D"
694 __label__ = "Inverse Kinematics"
696 def draw(self, context):
699 layout.itemO("pose.ik_add")
700 layout.itemO("pose.ik_clear")
702 class VIEW3D_MT_POSE_constraints(bpy.types.Menu):
703 __space_type__ = "VIEW_3D"
704 __label__ = "Constraints"
706 def draw(self, context):
709 layout.itemO("pose.constraint_add_with_targets")
710 layout.itemO("pose.constraints_clear")
712 class VIEW3D_MT_POSE_showhide(VIEW3D_MT_showhide):
713 _operator_name = "pose"
715 # ********** Edit Menus, suffix from ob.type **********
718 class VIEW3D_MT_edit_MESH(bpy.types.Menu):
719 __space_type__ = 'VIEW_3D'
722 def draw(self, context):
725 settings = context.tool_settings
727 layout.itemO("ed.undo")
728 layout.itemO("ed.redo")
732 layout.itemM("VIEW3D_MT_snap")
736 layout.itemO("uv.mapping_menu")
740 layout.itemO("mesh.extrude")
741 layout.itemO("mesh.duplicate")
742 layout.itemO("mesh.delete")
746 layout.itemM("VIEW3D_MT_edit_MESH_vertices")
747 layout.itemM("VIEW3D_MT_edit_MESH_edges")
748 layout.itemM("VIEW3D_MT_edit_MESH_faces")
749 layout.itemM("VIEW3D_MT_edit_MESH_normals")
753 layout.itemR(settings, "automerge_editing")
754 layout.itemR(settings, "proportional_editing")
755 layout.item_menu_enumR(settings, "proportional_editing_falloff")
759 layout.itemM("VIEW3D_MT_edit_MESH_showhide")
761 class VIEW3D_MT_edit_MESH_vertices(bpy.types.Menu):
762 __space_type__ = 'VIEW_3D'
763 __label__ = "Vertices"
765 def draw(self, context):
768 layout.itemO("mesh.merge")
769 layout.itemO("mesh.rip")
770 layout.itemO("mesh.split")
771 layout.itemO("mesh.separate")
775 layout.itemO("mesh.vertices_smooth")
776 layout.itemO("mesh.remove_doubles")
778 class VIEW3D_MT_edit_MESH_edges(bpy.types.Menu):
779 __space_type__ = 'VIEW_3D'
782 def draw(self, context):
785 layout.itemO("mesh.edge_face_add")
786 layout.itemO("mesh.subdivide")
787 layout.item_floatO("mesh.subdivide", "smoothness", 1.0, text="Subdivide Smooth")
791 layout.itemO("mesh.mark_seam")
792 layout.item_booleanO("mesh.mark_seam", "clear", True, text="Clear Seam")
796 layout.itemO("mesh.mark_sharp")
797 layout.item_booleanO("mesh.mark_sharp", "clear", True, text="Clear Sharp")
801 layout.item_enumO("mesh.edge_rotate", "direction", 'CW', text="Rotate Edge CW")
802 layout.item_enumO("mesh.edge_rotate", "direction", 'CCW', text="Rotate Edge CCW")
804 class VIEW3D_MT_edit_MESH_faces(bpy.types.Menu):
805 __space_type__ = 'VIEW_3D'
808 def draw(self, context):
811 layout.itemO("mesh.edge_face_add")
812 layout.itemO("mesh.fill")
813 layout.itemO("mesh.beauty_fill")
817 layout.itemO("mesh.quads_convert_to_tris")
818 layout.itemO("mesh.tris_convert_to_quads")
819 layout.itemO("mesh.edge_flip")
823 layout.itemO("mesh.faces_shade_smooth")
824 layout.itemO("mesh.faces_shade_flat")
826 class VIEW3D_MT_edit_MESH_normals(bpy.types.Menu):
827 __space_type__ = 'VIEW_3D'
828 __label__ = "Normals"
830 def draw(self, context):
833 layout.itemO("mesh.normals_make_consistent", text="Recalculate Outside")
834 layout.item_booleanO("mesh.normals_make_consistent", "inside", True, text="Recalculate Inside")
838 layout.itemO("mesh.flip_normals")
840 class VIEW3D_MT_edit_MESH_showhide(VIEW3D_MT_showhide):
841 _operator_name = "mesh"
845 # draw_CURVE is used by VIEW3D_MT_edit_CURVE and VIEW3D_MT_edit_SURFACE
846 def draw_CURVE(self, context):
849 settings = context.tool_settings
851 layout.itemM("VIEW3D_MT_snap")
855 layout.itemO("curve.extrude")
856 layout.itemO("curve.duplicate")
857 layout.itemO("curve.separate")
858 layout.itemO("curve.make_segment")
859 layout.itemO("curve.cyclic_toggle")
860 layout.itemO("curve.delete")
864 layout.itemM("VIEW3D_MT_edit_CURVE_ctrlpoints")
865 layout.itemM("VIEW3D_MT_edit_CURVE_segments")
869 layout.itemR(settings, "proportional_editing")
870 layout.item_menu_enumR(settings, "proportional_editing_falloff")
874 layout.itemM("VIEW3D_MT_edit_CURVE_showhide")
876 class VIEW3D_MT_edit_CURVE(bpy.types.Menu):
877 __space_type__ = 'VIEW_3D'
882 class VIEW3D_MT_edit_CURVE_ctrlpoints(bpy.types.Menu):
883 __space_type__ = 'VIEW_3D'
884 __label__ = "Control Points"
886 def draw(self, context):
889 edit_object = context.edit_object
891 if edit_object.type == 'CURVE':
892 layout.item_enumO("tfm.transform", "mode", 'TILT')
893 layout.itemO("curve.tilt_clear")
894 layout.itemO("curve.separate")
898 layout.item_menu_enumO("curve.handle_type_set", "type")
900 class VIEW3D_MT_edit_CURVE_segments(bpy.types.Menu):
901 __space_type__ = 'VIEW_3D'
902 __label__ = "Segments"
904 def draw(self, context):
907 layout.itemO("curve.subdivide")
908 layout.itemO("curve.switch_direction")
910 class VIEW3D_MT_edit_CURVE_showhide(VIEW3D_MT_showhide):
911 _operator_name = "curve"
914 class VIEW3D_MT_edit_SURFACE(bpy.types.Menu):
915 __space_type__ = 'VIEW_3D'
916 __label__ = "Surface"
921 class VIEW3D_MT_edit_TEXT(bpy.types.Menu):
922 __space_type__ = 'VIEW_3D'
925 def draw(self, context):
928 layout.itemO("font.file_paste")
932 layout.itemM("VIEW3D_MT_edit_TEXT_chars")
934 class VIEW3D_MT_edit_TEXT_chars(bpy.types.Menu):
935 __space_type__ = 'VIEW_3D'
936 __label__ = "Special Characters"
938 def draw(self, context):
941 layout.item_stringO("font.text_insert", "text", b'\xC2\xA9'.decode(), text="Copyright|Alt C")
942 layout.item_stringO("font.text_insert", "text", b'\xC2\xAE'.decode(), text="Registered Trademark|Alt R")
946 layout.item_stringO("font.text_insert", "text", b'\xC2\xB0'.decode(), text="Degree Sign|Alt G")
947 layout.item_stringO("font.text_insert", "text", b'\xC3\x97'.decode(), text="Multiplication Sign|Alt x")
948 layout.item_stringO("font.text_insert", "text", b'\xC2\x8A'.decode(), text="Circle|Alt .")
949 layout.item_stringO("font.text_insert", "text", b'\xC2\xB9'.decode(), text="Superscript 1|Alt 1")
950 layout.item_stringO("font.text_insert", "text", b'\xC2\xB2'.decode(), text="Superscript 2|Alt 2")
951 layout.item_stringO("font.text_insert", "text", b'\xC2\xB3'.decode(), text="Superscript 3|Alt 3")
952 layout.item_stringO("font.text_insert", "text", b'\xC2\xBB'.decode(), text="Double >>|Alt >")
953 layout.item_stringO("font.text_insert", "text", b'\xC2\xAB'.decode(), text="Double <<|Alt <")
954 layout.item_stringO("font.text_insert", "text", b'\xE2\x80\xB0'.decode(), text="Promillage|Alt %")
958 layout.item_stringO("font.text_insert", "text", b'\xC2\xA4'.decode(), text="Dutch Florin|Alt F")
959 layout.item_stringO("font.text_insert", "text", b'\xC2\xA3'.decode(), text="British Pound|Alt L")
960 layout.item_stringO("font.text_insert", "text", b'\xC2\xA5'.decode(), text="Japanese Yen|Alt Y")
964 layout.item_stringO("font.text_insert", "text", b'\xC3\x9F'.decode(), text="German S|Alt S")
965 layout.item_stringO("font.text_insert", "text", b'\xC2\xBF'.decode(), text="Spanish Question Mark|Alt ?")
966 layout.item_stringO("font.text_insert", "text", b'\xC2\xA1'.decode(), text="Spanish Exclamation Mark|Alt !")
969 class VIEW3D_MT_edit_META(bpy.types.Menu):
970 __space_type__ = 'VIEW_3D'
971 __label__ = "Metaball"
973 def draw(self, context):
976 settings = context.tool_settings
978 layout.itemO("ed.undo")
979 layout.itemO("ed.redo")
983 layout.itemM("VIEW3D_MT_snap")
987 layout.itemO("mball.delete_metaelems")
988 layout.itemO("mball.duplicate_metaelems")
992 layout.itemR(settings, "proportional_editing")
993 layout.item_menu_enumR(settings, "proportional_editing_falloff")
997 layout.itemM("VIEW3D_MT_edit_META_showhide")
999 class VIEW3D_MT_edit_META_showhide(bpy.types.Menu):
1000 __space_type__ = 'VIEW_3D'
1001 __label__ = "Show/Hide"
1003 def draw(self, context):
1004 layout = self.layout
1006 layout.itemO("mball.reveal_metaelems", text="Show Hidden")
1007 layout.itemO("mball.hide_metaelems", text="Hide Selected")
1008 layout.item_booleanO("mball.hide_metaelems", "unselected", True, text="Hide Unselected")
1011 class VIEW3D_MT_edit_LATTICE(bpy.types.Menu):
1012 __space_type__ = 'VIEW_3D'
1013 __label__ = "Lattice"
1015 def draw(self, context):
1016 layout = self.layout
1018 settings = context.tool_settings
1020 layout.itemM("VIEW3D_MT_snap")
1024 layout.itemO("lattice.make_regular")
1028 layout.itemR(settings, "proportional_editing")
1029 layout.item_menu_enumR(settings, "proportional_editing_falloff")
1032 class VIEW3D_MT_edit_ARMATURE(bpy.types.Menu):
1033 __space_type__ = 'VIEW_3D'
1034 __label__ = "Armature"
1036 def draw(self, context):
1037 layout = self.layout
1039 edit_object = context.edit_object
1040 arm = edit_object.data
1042 layout.itemM("VIEW3D_MT_snap")
1043 layout.itemM("VIEW3D_MT_edit_ARMATURE_roll")
1045 if arm.drawtype == 'ENVELOPE':
1046 layout.item_enumO("tfm.transform", "mode", 'BONESIZE', text="Scale Envelope Distance")
1048 layout.item_enumO("tfm.transform", "mode", 'BONESIZE', text="Scale B-Bone Width")
1052 layout.itemO("armature.extrude")
1054 if arm.x_axis_mirror:
1055 layout.item_booleanO("armature.extrude", "forked", True, text="Extrude Forked")
1057 layout.itemO("armature.duplicate")
1058 layout.itemO("armature.merge")
1059 layout.itemO("armature.fill")
1060 layout.itemO("armature.delete")
1061 layout.itemO("armature.separate")
1065 layout.itemO("armature.subdivide_simple")
1066 layout.itemO("armature.subdivide_multi")
1070 layout.item_enumO("armature.autoside_names", "axis", 'XAXIS', text="AutoName Left/Right")
1071 layout.item_enumO("armature.autoside_names", "axis", 'YAXIS', text="AutoName Front/Back")
1072 layout.item_enumO("armature.autoside_names", "axis", 'ZAXIS', text="AutoName Top/Bottom")
1073 layout.itemO("armature.flip_names")
1077 layout.itemO("armature.armature_layers")
1078 layout.itemO("armature.bone_layers")
1082 layout.itemM("VIEW3D_MT_edit_ARMATURE_parent")
1086 layout.item_menu_enumO("armature.flags_set", "mode", text="Bone Settings")
1088 class VIEW3D_MT_edit_ARMATURE_parent(bpy.types.Menu):
1089 __space_type__ = 'VIEW_3D'
1090 __label__ = "Parent"
1092 def draw(self, context):
1093 layout = self.layout
1095 layout.itemO("armature.parent_set")
1096 layout.itemO("armature.parent_clear")
1098 class VIEW3D_MT_edit_ARMATURE_roll(bpy.types.Menu):
1099 __space_type__ = 'VIEW_3D'
1100 __label__ = "Bone Roll"
1102 def draw(self, context):
1103 layout = self.layout
1105 layout.item_enumO("armature.calculate_roll", "type", 'GLOBALUP', text="Clear Roll (Z-Axis Up)")
1106 layout.item_enumO("armature.calculate_roll", "type", 'CURSOR', text="Roll to Cursor")
1110 layout.item_enumO("tfm.transform", "mode", 'BONE_ROLL', text="Set Roll")
1112 # ********** Panel **********
1114 class VIEW3D_PT_3dview_properties(bpy.types.Panel):
1115 __space_type__ = 'VIEW_3D'
1116 __region_type__ = 'UI'
1119 def poll(self, context):
1120 view = context.space_data
1123 def draw(self, context):
1124 layout = self.layout
1126 view = context.space_data
1127 scene = context.scene
1129 col = layout.column()
1130 col.itemR(view, "camera")
1131 col.itemR(view, "lens")
1133 layout.itemL(text="Clip:")
1134 col = layout.column(align=True)
1135 col.itemR(view, "clip_start", text="Start")
1136 col.itemR(view, "clip_end", text="End")
1138 layout.itemL(text="Grid:")
1139 col = layout.column(align=True)
1140 col.itemR(view, "grid_lines", text="Lines")
1141 col.itemR(view, "grid_spacing", text="Spacing")
1142 col.itemR(view, "grid_subdivisions", text="Subdivisions")
1144 layout.column().itemR(scene, "cursor_location", text="3D Cursor:")
1146 class VIEW3D_PT_3dview_display(bpy.types.Panel):
1147 __space_type__ = 'VIEW_3D'
1148 __region_type__ = 'UI'
1149 __label__ = "Display"
1151 def poll(self, context):
1152 view = context.space_data
1155 def draw(self, context):
1156 layout = self.layout
1157 view = context.space_data
1159 col = layout.column()
1160 col.itemR(view, "display_floor", text="Grid Floor")
1161 col.itemR(view, "display_x_axis", text="X Axis")
1162 col.itemR(view, "display_y_axis", text="Y Axis")
1163 col.itemR(view, "display_z_axis", text="Z Axis")
1164 col.itemR(view, "outline_selected")
1165 col.itemR(view, "all_object_centers")
1166 col.itemR(view, "relationship_lines")
1167 col.itemR(view, "textured_solid")
1171 layout.itemO("screen.region_foursplit")
1173 col = layout.column()
1174 col.itemR(view, "lock_rotation")
1175 col.itemR(view, "box_preview")
1176 col.itemR(view, "box_clip")
1178 class VIEW3D_PT_3dview_meshdisplay(bpy.types.Panel):
1179 __space_type__ = 'VIEW_3D'
1180 __region_type__ = 'UI'
1181 __label__ = "Mesh Display"
1183 def poll(self, context):
1184 editmesh = context.mode == 'EDIT_MESH'
1187 def draw(self, context):
1188 layout = self.layout
1190 mesh = context.active_object.data
1192 col = layout.column()
1193 col.itemL(text="Overlays:")
1194 col.itemR(mesh, "draw_edges", text="Edges")
1195 col.itemR(mesh, "draw_faces", text="Faces")
1196 col.itemR(mesh, "draw_creases", text="Creases")
1197 col.itemR(mesh, "draw_bevel_weights", text="Bevel Weights")
1198 col.itemR(mesh, "draw_seams", text="Seams")
1199 col.itemR(mesh, "draw_sharp", text="Sharp")
1202 col.itemL(text="Normals:")
1203 col.itemR(mesh, "draw_normals", text="Face")
1204 col.itemR(mesh, "draw_vertex_normals", text="Vertex")
1207 col.itemL(text="Numerics:")
1208 col.itemR(mesh, "draw_edge_lenght")
1209 col.itemR(mesh, "draw_edge_angle")
1210 col.itemR(mesh, "draw_face_area")
1212 class VIEW3D_PT_background_image(bpy.types.Panel):
1213 __space_type__ = 'VIEW_3D'
1214 __region_type__ = 'UI'
1215 __label__ = "Background Image"
1216 __default_closed__ = True
1218 def poll(self, context):
1219 view = context.space_data
1220 bg = context.space_data.background_image
1223 def draw_header(self, context):
1224 layout = self.layout
1225 view = context.space_data
1227 layout.itemR(view, "display_background_image", text="")
1229 def draw(self, context):
1230 layout = self.layout
1232 view = context.space_data
1233 bg = view.background_image
1236 layout.active = view.display_background_image
1238 col = layout.column()
1239 col.itemR(bg, "image", text="")
1240 #col.itemR(bg, "image_user")
1241 col.itemR(bg, "size")
1242 col.itemR(bg, "transparency", slider=True)
1243 col.itemL(text="Offset:")
1245 col = layout.column(align=True)
1246 col.itemR(bg, "x_offset", text="X")
1247 col.itemR(bg, "y_offset", text="Y")
1249 bpy.types.register(VIEW3D_HT_header) # Header
1251 bpy.types.register(VIEW3D_MT_view) #View Menus
1252 bpy.types.register(VIEW3D_MT_view_navigation)
1253 bpy.types.register(VIEW3D_MT_view_align)
1254 bpy.types.register(VIEW3D_MT_view_cameras)
1256 bpy.types.register(VIEW3D_MT_select_OBJECT) # Select Menus
1257 bpy.types.register(VIEW3D_MT_select_POSE)
1258 bpy.types.register(VIEW3D_MT_select_PARTICLE)
1259 bpy.types.register(VIEW3D_MT_select_EDIT_MESH)
1260 bpy.types.register(VIEW3D_MT_select_EDIT_CURVE)
1261 bpy.types.register(VIEW3D_MT_select_EDIT_SURFACE)
1262 bpy.types.register(VIEW3D_MT_select_EDIT_METABALL)
1263 bpy.types.register(VIEW3D_MT_select_EDIT_LATTICE)
1264 bpy.types.register(VIEW3D_MT_select_EDIT_ARMATURE)
1265 bpy.types.register(VIEW3D_MT_select_FACE) # XXX todo
1267 bpy.types.register(VIEW3D_MT_OBJECT) # Object Menu
1268 bpy.types.register(VIEW3D_MT_OBJECT_clear)
1269 bpy.types.register(VIEW3D_MT_OBJECT_parent)
1270 bpy.types.register(VIEW3D_MT_OBJECT_track)
1271 bpy.types.register(VIEW3D_MT_OBJECT_group)
1272 bpy.types.register(VIEW3D_MT_OBJECT_constraints)
1273 bpy.types.register(VIEW3D_MT_OBJECT_showhide)
1275 bpy.types.register(VIEW3D_MT_SCULPT) # Sculpt Menu
1277 bpy.types.register(VIEW3D_MT_PAINT_VERTEX)
1279 bpy.types.register(VIEW3D_MT_PARTICLE) # Particle Menu
1280 bpy.types.register(VIEW3D_MT_PARTICLE_showhide)
1282 bpy.types.register(VIEW3D_MT_POSE) # POSE Menu
1283 bpy.types.register(VIEW3D_MT_POSE_transform)
1284 bpy.types.register(VIEW3D_MT_POSE_pose)
1285 bpy.types.register(VIEW3D_MT_POSE_motion)
1286 bpy.types.register(VIEW3D_MT_POSE_group)
1287 bpy.types.register(VIEW3D_MT_POSE_ik)
1288 bpy.types.register(VIEW3D_MT_POSE_constraints)
1289 bpy.types.register(VIEW3D_MT_POSE_showhide)
1291 bpy.types.register(VIEW3D_MT_snap) # Edit Menus
1293 bpy.types.register(VIEW3D_MT_edit_MESH)
1294 bpy.types.register(VIEW3D_MT_edit_MESH_vertices)
1295 bpy.types.register(VIEW3D_MT_edit_MESH_edges)
1296 bpy.types.register(VIEW3D_MT_edit_MESH_faces)
1297 bpy.types.register(VIEW3D_MT_edit_MESH_normals)
1298 bpy.types.register(VIEW3D_MT_edit_MESH_showhide)
1300 bpy.types.register(VIEW3D_MT_edit_CURVE)
1301 bpy.types.register(VIEW3D_MT_edit_CURVE_ctrlpoints)
1302 bpy.types.register(VIEW3D_MT_edit_CURVE_segments)
1303 bpy.types.register(VIEW3D_MT_edit_CURVE_showhide)
1305 bpy.types.register(VIEW3D_MT_edit_SURFACE)
1307 bpy.types.register(VIEW3D_MT_edit_TEXT)
1308 bpy.types.register(VIEW3D_MT_edit_TEXT_chars)
1310 bpy.types.register(VIEW3D_MT_edit_META)
1311 bpy.types.register(VIEW3D_MT_edit_META_showhide)
1313 bpy.types.register(VIEW3D_MT_edit_LATTICE)
1315 bpy.types.register(VIEW3D_MT_edit_ARMATURE)
1316 bpy.types.register(VIEW3D_MT_edit_ARMATURE_parent)
1317 bpy.types.register(VIEW3D_MT_edit_ARMATURE_roll)
1319 bpy.types.register(VIEW3D_PT_3dview_properties) # Panels
1320 bpy.types.register(VIEW3D_PT_3dview_display)
1321 bpy.types.register(VIEW3D_PT_3dview_meshdisplay)
1322 bpy.types.register(VIEW3D_PT_background_image)