[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40075] branches/bmesh/blender/source/ blender/editors/mesh/bmesh_tools.c: patch [#28588] BMesh: "Split" tool

Campbell Barton ideasman42 at gmail.com
Fri Sep 9 16:58:49 CEST 2011


Revision: 40075
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40075
Author:   campbellbarton
Date:     2011-09-09 14:58:49 +0000 (Fri, 09 Sep 2011)
Log Message:
-----------
patch [#28588] BMesh: "Split" tool
from Andrew Wiggin (ender79)

Impliments the split tool in bmesh.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2011-09-09 14:51:30 UTC (rev 40074)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2011-09-09 14:58:49 UTC (rev 40075)
@@ -3883,28 +3883,42 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
-//BMESH_TODO
-static int split_mesh(bContext *UNUSED(C), wmOperator *UNUSED(op))
+static int split_mesh_exec(bContext *C, wmOperator *op)
 {
-#if 0
-	Object *obedit= CTX_data_edit_object(C);
-	EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
+	Object *ob= CTX_data_edit_object(C);
+	BMEditMesh *em= ((Mesh*)ob->data)->edit_btmesh;
+	BMOperator bmopDupe, bmopDel;
 
-	WM_cursor_wait(1);
+	/*Duplicate selected geometry*/
+	EDBM_InitOpf(em, &bmopDupe, op, "dupe geom=%hvef", BM_SELECT);
+	BMO_Exec_Op(em->bm, &bmopDupe);
 
-	/* make duplicate first */
-	adduplicateflag(em, SELECT);
-	/* old faces have flag 128 set, delete them */
-	delfaceflag(em, 128);
-	recalc_editnormals(em);
+	/*Duplicated geometry starts out selected. Deselect all duplicated
+	  geometry to return to the original selection.*/
+	BMO_UnHeaderFlag_Buffer(em->bm, &bmopDupe, "newout", BM_SELECT, BM_ALL);
 
-	WM_cursor_wait(0);
+	/*Delete selected faces*/
+	EDBM_InitOpf(em, &bmopDel, op, "del geom=%hvef context=%i", BM_SELECT, DEL_FACES);
+	BMO_Exec_Op(em->bm, &bmopDel);
+	if (!EDBM_FinishOp(em, &bmopDel, op, 1)) {
+		/*Also clean up the dupe op*/
+		EDBM_FinishOp(em, &bmopDupe, op, 1);
+		return OPERATOR_CANCELLED;
+	}
 
-	DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
-	WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+	/*Clear prior selection and select the dupliated geometry*/
+	BM_clear_flag_all(em->bm, BM_SELECT);
+	BMO_HeaderFlag_Buffer(em->bm, &bmopDupe, "newout", BM_SELECT, BM_ALL);
+	if (!EDBM_FinishOp(em, &bmopDupe, op, 1))
+		return OPERATOR_CANCELLED;
 
-	BKE_mesh_end_editmesh(obedit->data, em);
-#endif
+	/*Geometry has changed, need to recalc normals and looptris*/
+	BMEdit_RecalcTesselation(em);
+	EDBM_RecalcNormals(em);
+
+	DAG_id_tag_update(ob->data, OB_RECALC_DATA);
+	WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
+
 	return OPERATOR_FINISHED;
 }
 
@@ -3915,7 +3929,7 @@
 	ot->idname= "MESH_OT_split";
 
 	/* api callbacks */
-	ot->exec= split_mesh;
+	ot->exec= split_mesh_exec;
 	ot->poll= ED_operator_editmesh;
 
 	/* flags */




More information about the Bf-blender-cvs mailing list