[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26856] trunk/blender: Smart Extrude ( hotkeys are tentative)
Martin Poirier
theeth at yahoo.com
Fri Feb 12 23:13:47 CET 2010
Revision: 26856
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26856
Author: theeth
Date: 2010-02-12 23:13:47 +0100 (Fri, 12 Feb 2010)
Log Message:
-----------
Smart Extrude (hotkeys are tentative)
Ekey: Extrude Region
Based on selection totals:
Extrude region along normal if at least one face selected
Extrude vertex along normal if only one vertex selected (experimental)
Extrude edge on its plane if only one edge selected (experimental)
Extrude with no constraint axis otherwise
Shift-Ekey: Extrude Individual
Based on selection modes and selection totals
Individual Faces if face select and some faces are selected
Individual Edges if edge select and some edges are selected
Individual Vertice otherwise
Alt-Ekey: Extrude Menu (only shows valid options for selection mode and selection totals)
Modified Paths:
--------------
trunk/blender/release/scripts/ui/space_view3d.py
trunk/blender/source/blender/editors/mesh/mesh_ops.c
Modified: trunk/blender/release/scripts/ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d.py 2010-02-12 22:03:23 UTC (rev 26855)
+++ trunk/blender/release/scripts/ui/space_view3d.py 2010-02-12 22:13:47 UTC (rev 26856)
@@ -1203,20 +1203,114 @@
prop.value = "(False, False, True)"
prop.path = "tool_settings.mesh_selection_mode"
+
class VIEW3D_MT_edit_mesh_extrude(bpy.types.Menu):
bl_label = "Extrude"
+ @staticmethod
+ def extrude_options(context):
+ mesh = context.object.data
+ selection_mode = context.tool_settings.mesh_selection_mode
+
+ totface = mesh.total_face_sel
+ totedge = mesh.total_edge_sel
+ totvert = mesh.total_vert_sel
+
+ if selection_mode[0]: # vert
+ if totvert == 0:
+ return ()
+ elif totvert == 1:
+ return (3,)
+ elif totedge == 0:
+ return (3,)
+ elif totface == 0:
+ return (2, 3)
+ elif totface == 1:
+ return (0, 2, 3)
+ else:
+ return (0, 1, 2, 3)
+ elif selection_mode[1]: # edge
+ if totedge == 0:
+ return ()
+ elif totedge == 1:
+ return (2,)
+ elif totface == 0:
+ return (2,)
+ elif totface == 1:
+ return (0, 2)
+ else:
+ return (0, 1, 2)
+ elif selection_mode[2]: # face
+ if totface == 0:
+ return ()
+ elif totface == 1:
+ return (0,)
+ else:
+ return (0, 1)
+
+ # should never get here
+ return ()
+
def draw(self, context):
layout = self.layout
-
layout.operator_context = 'INVOKE_REGION_WIN'
- layout.operator("mesh.extrude_region_move", text="Region")
- layout.operator("mesh.extrude_faces_move", text="Individual Faces")
- layout.operator("mesh.extrude_edges_move", text="Edges Only")
- layout.operator("mesh.extrude_vertices_move", text="Vertices Only")
+ region_menu = lambda: layout.operator("mesh.extrude_region_move", text="Region")
+ face_menu = lambda: layout.operator("mesh.extrude_faces_move", text="Individual Faces")
+ edge_menu = lambda: layout.operator("mesh.extrude_edges_move", text="Edges Only")
+ vert_menu = lambda: layout.operator("mesh.extrude_vertices_move", text="Vertices Only")
+
+ menu_funcs = region_menu, face_menu, edge_menu, vert_menu
+
+ for i in self.extrude_options(context):
+ func = menu_funcs[i]
+ func()
+class VIEW3D_OT_edit_mesh_extrude_individual_move(bpy.types.Operator):
+ bl_label = "Extrude Individual and Move"
+ bl_idname = "view3d.edit_mesh_extrude_individual_move"
+ def execute(self, context):
+ mesh = context.object.data
+ selection_mode = context.tool_settings.mesh_selection_mode
+
+ totface = mesh.total_face_sel
+ totedge = mesh.total_edge_sel
+ totvert = mesh.total_vert_sel
+
+ if selection_mode[2] and totface == 1:
+ return bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN', TRANSFORM_OT_translate = {"constraint_orientation":"NORMAL", "constraint_axis":[False, False, True]})
+ elif selection_mode[2] and totface > 1:
+ return bpy.ops.mesh.extrude_faces_move('INVOKE_REGION_WIN')
+ elif selection_mode[1] and totedge >= 1:
+ return bpy.ops.mesh.extrude_edges_move('INVOKE_REGION_WIN')
+ else:
+ return bpy.ops.mesh.extrude_vertices_move('INVOKE_REGION_WIN')
+
+ def invoke(self, context, event):
+ return self.execute(context)
+
+class VIEW3D_OT_edit_mesh_extrude_move(bpy.types.Operator):
+ bl_label = "Extrude and Move"
+ bl_idname = "view3d.edit_mesh_extrude_move"
+
+ def execute(self, context):
+ mesh = context.object.data
+
+ totface = mesh.total_face_sel
+ totedge = mesh.total_edge_sel
+ totvert = mesh.total_vert_sel
+
+ if totface >= 1 or totvert == 1:
+ return bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN', TRANSFORM_OT_translate = {"constraint_orientation":"NORMAL", "constraint_axis":[False, False, True]})
+ elif totedge == 1:
+ return bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN', TRANSFORM_OT_translate = {"constraint_orientation":"NORMAL", "constraint_axis":[True, True, False]})
+ else:
+ return bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN')
+
+ def invoke(self, context, event):
+ return self.execute(context)
+
class VIEW3D_MT_edit_mesh_vertices(bpy.types.Menu):
bl_label = "Vertices"
@@ -1987,6 +2081,9 @@
rna_prop_ui.draw(self.layout, context, member, False)
+bpy.types.register(VIEW3D_OT_edit_mesh_extrude_move) # detects constraints setup and extrude region
+bpy.types.register(VIEW3D_OT_edit_mesh_extrude_individual_move)
+
bpy.types.register(VIEW3D_HT_header) # Header
bpy.types.register(VIEW3D_MT_view) #View Menus
@@ -2050,7 +2147,7 @@
bpy.types.register(VIEW3D_MT_edit_mesh_faces)
bpy.types.register(VIEW3D_MT_edit_mesh_normals)
bpy.types.register(VIEW3D_MT_edit_mesh_showhide)
-bpy.types.register(VIEW3D_MT_edit_mesh_extrude)
+bpy.types.register(VIEW3D_MT_edit_mesh_extrude) # use with VIEW3D_OT_edit_mesh_extrude_menu
bpy.types.register(VIEW3D_MT_edit_curve)
bpy.types.register(VIEW3D_MT_edit_curve_ctrlpoints)
Modified: trunk/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_ops.c 2010-02-12 22:03:23 UTC (rev 26855)
+++ trunk/blender/source/blender/editors/mesh/mesh_ops.c 2010-02-12 22:13:47 UTC (rev 26856)
@@ -172,7 +172,6 @@
{
wmOperatorType *ot;
wmOperatorTypeMacro *otmacro;
- int constraint_axis[3] = {0, 0, 1};
ot= WM_operatortype_append_macro("MESH_OT_loopcut_slide", "Loop Cut and Slide", OPTYPE_UNDO|OPTYPE_REGISTER);
WM_operatortype_macro_define(ot, "MESH_OT_loopcut");
@@ -193,8 +192,6 @@
RNA_enum_set(otmacro->ptr, "type", 1);
otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
RNA_enum_set(otmacro->ptr, "proportional", 0);
- RNA_enum_set(otmacro->ptr, "constraint_orientation", V3D_MANIP_NORMAL);
- RNA_boolean_set_array(otmacro->ptr, "constraint_axis", constraint_axis);
ot= WM_operatortype_append_macro("MESH_OT_extrude_faces_move", "Extrude Individual Faces and Move", OPTYPE_UNDO|OPTYPE_REGISTER);
otmacro= WM_operatortype_macro_define(ot, "MESH_OT_extrude");
@@ -264,7 +261,9 @@
WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "inside", 1);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_extrude", EKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "VIEW3D_OT_edit_mesh_extrude_move", EKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "VIEW3D_OT_edit_mesh_extrude_individual_move", EKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_extrude", EKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_spin", RKEY, KM_PRESS, KM_ALT, 0);
More information about the Bf-blender-cvs
mailing list