[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26524] trunk/blender: Mesh Extrude menu

Martin Poirier theeth at yahoo.com
Mon Feb 1 19:30:01 CET 2010


Revision: 26524
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26524
Author:   theeth
Date:     2010-02-01 19:30:00 +0100 (Mon, 01 Feb 2010)

Log Message:
-----------
Mesh Extrude menu

Todo for Campbell: 
- Make menu context sensitive
- Make menu automatically run the operator if there is only one option


Note: Saved configurations and keymaps with references to "Extrude and Move" operator needs to be updated to either call the menu or one of the new extrude macros.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_view3d.py
    trunk/blender/release/scripts/ui/space_view3d_toolbar.py
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    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-01 18:26:45 UTC (rev 26523)
+++ trunk/blender/release/scripts/ui/space_view3d.py	2010-02-01 18:30:00 UTC (rev 26524)
@@ -1131,7 +1131,7 @@
 
         layout.separator()
 
-        layout.operator("mesh.extrude_move")
+        layout.operator("wm.call_menu", text="Extrude").name = "VIEW3D_MT_edit_mesh_extrude"
         layout.operator("mesh.duplicate_move")
         layout.operator("mesh.delete", text="Delete...")
 
@@ -1198,7 +1198,20 @@
         prop.value = "(False, False, True)"
         prop.path = "tool_settings.mesh_selection_mode"
 
+class VIEW3D_MT_edit_mesh_extrude(bpy.types.Menu):
+    bl_label = "Extrude"
 
+    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")
+
+
 class VIEW3D_MT_edit_mesh_vertices(bpy.types.Menu):
     bl_label = "Vertices"
 
@@ -2032,6 +2045,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_curve)
 bpy.types.register(VIEW3D_MT_edit_curve_ctrlpoints)

Modified: trunk/blender/release/scripts/ui/space_view3d_toolbar.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d_toolbar.py	2010-02-01 18:26:45 UTC (rev 26523)
+++ trunk/blender/release/scripts/ui/space_view3d_toolbar.py	2010-02-01 18:30:00 UTC (rev 26524)
@@ -99,7 +99,7 @@
 
         col = layout.column(align=True)
         col.label(text="Add:")
-        col.operator("mesh.extrude_move")
+        col.operator("wm.call_menu", text="Extrude").name = "VIEW3D_MT_edit_mesh_extrude"
         col.operator("mesh.subdivide")
         col.operator("mesh.loopcut_slide")
         col.operator("mesh.duplicate_move", text="Duplicate")

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2010-02-01 18:26:45 UTC (rev 26523)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2010-02-01 18:30:00 UTC (rev 26524)
@@ -623,46 +623,16 @@
 }
 
 /* generic extern called extruder */
-void extrude_mesh(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op)
+void extrude_mesh(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op, short type)
 {
 	float nor[3]= {0.0, 0.0, 0.0};
-	short nr, transmode= 0;
+	short transmode= 0;
 
-	/* extrude depends on totvertsel etc */
-	EM_stats_update(em);
-	
-	if(em->selectmode & SCE_SELECT_VERTEX) {
-		if(em->totvertsel==0) nr= 0;
-		else if(em->totvertsel==1) nr= 4;
-		else if(em->totedgesel==0) nr= 4;
-		else if(em->totfacesel==0)
-			nr= 3; // pupmenu("Extrude %t|Only Edges%x3|Only Vertices%x4");
-		else if(em->totfacesel==1)
-			nr= 1; // pupmenu("Extrude %t|Region %x1|Only Edges%x3|Only Vertices%x4");
-		else
-			nr= 1; // pupmenu("Extrude %t|Region %x1||Individual Faces %x2|Only Edges%x3|Only Vertices%x4");
-	}
-	else if(em->selectmode & SCE_SELECT_EDGE) {
-		if (em->totedgesel==0) nr = 0;
-		else if (em->totedgesel==1) nr = 3;
-		else if(em->totfacesel==0) nr = 3;
-		else if(em->totfacesel==1)
-			nr= 1; // pupmenu("Extrude %t|Region %x1|Only Edges%x3");
-		else
-			nr= 1; // pupmenu("Extrude %t|Region %x1||Individual Faces %x2|Only Edges%x3");
-	}
-	else {
-		if (em->totfacesel == 0) nr = 0;
-		else if (em->totfacesel == 1) nr = 1;
-		else
-			nr= 1; // pupmenu("Extrude %t|Region %x1||Individual Faces %x2");
-	}
+	if(type<1) return;
 
-	if(nr<1) return;
-
-	if(nr==1)  transmode= extrudeflag(obedit, em, SELECT, nor, 0);
-	else if(nr==4) transmode= extrudeflag_verts_indiv(em, SELECT, nor);
-	else if(nr==3) transmode= extrudeflag_edges_indiv(em, SELECT, nor);
+	if(type==1)  transmode= extrudeflag(obedit, em, SELECT, nor, 0);
+	else if(type==4) transmode= extrudeflag_verts_indiv(em, SELECT, nor);
+	else if(type==3) transmode= extrudeflag_edges_indiv(em, SELECT, nor);
 	else transmode= extrudeflag_face_indiv(em, SELECT, nor);
 
 	if(transmode==0) {
@@ -682,7 +652,7 @@
 
 		/* individual faces? */
 //		BIF_TransformSetUndo("Extrude");
-		if(nr==2) {
+		if(type==2) {
 //			initTransform(TFM_SHRINKFATTEN, CTX_NO_PET|CTX_NO_MIRROR);
 //			Transform();
 		}
@@ -706,7 +676,7 @@
 	Object *obedit= CTX_data_edit_object(C);
 	EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
 	
-	extrude_mesh(scene, obedit, em, op);
+	extrude_mesh(scene, obedit, em, op, RNA_int_get(op->ptr, "type"));
 
 	BKE_mesh_end_editmesh(obedit->data, em);
 
@@ -723,7 +693,7 @@
 	Object *obedit= CTX_data_edit_object(C);
 	EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
 
-	extrude_mesh(scene, obedit, em, op);
+	extrude_mesh(scene, obedit, em, op, RNA_int_get(op->ptr, "type"));
 
 	DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
 	WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -732,62 +702,69 @@
 	return OPERATOR_FINISHED;
 }
 
-/* extrude options */
-EnumPropertyItem extrude_item_region = {1, "REGION", 0, "Region", ""};
-EnumPropertyItem extrude_item_faces = {2, "FACES", 0, "Individual Faces", ""};
-EnumPropertyItem extrude_item_edges = {3, "EDGES", 0, "Only Edges", ""};
-EnumPropertyItem extrude_item_verts = {4, "VERTS", 0, "Only Vertices", ""};
+EnumPropertyItem extrude_items[] = {
+		{1, "REGION", 0, "Region", ""},
+		{2, "FACES", 0, "Individual Faces", ""},
+		{3, "EDGES", 0, "Only Edges", ""},
+		{4, "VERTS", 0, "Only Vertices", ""},
+		{0, NULL, 0, NULL, NULL}};
 
+
 static EnumPropertyItem *extrude_itemf(bContext *C, PointerRNA *ptr, int *free)
 {
 	EnumPropertyItem *item= NULL;
 	Object *obedit= CTX_data_edit_object(C);
-	EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
+	EditMesh *em;
 
 	int totitem= 0;
 
 	if(!obedit)
-		return NULL;
+		return extrude_items;
 
+	em = BKE_mesh_get_editmesh(obedit->data);
+
+	EM_stats_update(em);
+
 	if(em->selectmode & SCE_SELECT_VERTEX) {
 		if(em->totvertsel==0) {}
-		else if(em->totvertsel==1) { RNA_enum_item_add(&item, &totitem, &extrude_item_verts); }
-		else if(em->totedgesel==0) { RNA_enum_item_add(&item, &totitem, &extrude_item_verts); }
+		else if(em->totvertsel==1) { RNA_enum_item_add(&item, &totitem, &extrude_items[3]); }
+		else if(em->totedgesel==0) { RNA_enum_item_add(&item, &totitem, &extrude_items[3]); }
 		else if(em->totfacesel==0) {
-			RNA_enum_item_add(&item, &totitem, &extrude_item_edges);
-			RNA_enum_item_add(&item, &totitem, &extrude_item_verts);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[2]);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[3]);
 		}
 		else if(em->totfacesel==1) {
-			RNA_enum_item_add(&item, &totitem, &extrude_item_region);
-			RNA_enum_item_add(&item, &totitem, &extrude_item_edges);
-			RNA_enum_item_add(&item, &totitem, &extrude_item_verts);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[0]);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[2]);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[3]);
 		}
 		else {
-			RNA_enum_item_add(&item, &totitem, &extrude_item_region);
-			RNA_enum_item_add(&item, &totitem, &extrude_item_edges);
-			RNA_enum_item_add(&item, &totitem, &extrude_item_verts);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[0]);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[1]);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[2]);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[3]);
 		}
 	}
 	else if(em->selectmode & SCE_SELECT_EDGE) {
 		if (em->totedgesel==0) {}
-		else if (em->totedgesel==1) { RNA_enum_item_add(&item, &totitem, &extrude_item_edges); }
-		else if(em->totfacesel==0) { RNA_enum_item_add(&item, &totitem, &extrude_item_edges); }
+		else if (em->totedgesel==1) { RNA_enum_item_add(&item, &totitem, &extrude_items[2]); }
+		else if(em->totfacesel==0) { RNA_enum_item_add(&item, &totitem, &extrude_items[2]); }
 		else if(em->totfacesel==1) {
-			RNA_enum_item_add(&item, &totitem, &extrude_item_region);
-			RNA_enum_item_add(&item, &totitem, &extrude_item_edges);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[0]);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[2]);
 		}
 		else {
-			RNA_enum_item_add(&item, &totitem, &extrude_item_region);
-			RNA_enum_item_add(&item, &totitem, &extrude_item_faces);
-			RNA_enum_item_add(&item, &totitem, &extrude_item_edges);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[0]);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[1]);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[2]);
 		}
 	}
 	else {
 		if (em->totfacesel == 0) {}
-		else if (em->totfacesel == 1) { RNA_enum_item_add(&item, &totitem, &extrude_item_region); }
+		else if (em->totfacesel == 1) { RNA_enum_item_add(&item, &totitem, &extrude_items[0]); }
 		else {
-			RNA_enum_item_add(&item, &totitem, &extrude_item_region);
-			RNA_enum_item_add(&item, &totitem, &extrude_item_faces);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[0]);
+			RNA_enum_item_add(&item, &totitem, &extrude_items[1]);
 		}
 	}
 
@@ -803,9 +780,7 @@
 
 void MESH_OT_extrude(wmOperatorType *ot)
 {
-#if 0
 	PropertyRNA *prop;
-#endif
 
 	/* identifiers */
 	ot->name= "Extrude";
@@ -820,12 +795,10 @@
 	/* flags */
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 
-#if 0
 	/* properties */
-	prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, 0, "Type", "");
+	prop= RNA_def_enum(ot->srna, "type", extrude_items, 0, "Type", "");
 	RNA_def_enum_funcs(prop, extrude_itemf);
 	ot->prop= prop;
-#endif
 }
 
 static int split_mesh(bContext *C, wmOperator *op)

Modified: trunk/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_ops.c	2010-02-01 18:26:45 UTC (rev 26523)
+++ trunk/blender/source/blender/editors/mesh/mesh_ops.c	2010-02-01 18:30:00 UTC (rev 26524)
@@ -188,18 +188,31 @@
 	otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list