[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57445] trunk/blender: Change edgeloop delete to use dissolve, fixes bug [#35738].

Campbell Barton ideasman42 at gmail.com
Fri Jun 14 05:04:39 CEST 2013


Revision: 57445
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57445
Author:   campbellbarton
Date:     2013-06-14 03:04:36 +0000 (Fri, 14 Jun 2013)
Log Message:
-----------
Change edgeloop delete to use dissolve, fixes bug [#35738].

Was using edge-slide & remove-doubles but this was error prone since remove doubles could fail in some cases or find doubles where it shouldn't (with very small scale objects).

This gives more predictable behavior when the edges of a loop wouldnt slide (in that case they would just drag over to one of the sides with no user control)
and multiple edge loops work better too. eg:
- http://www.graphicall.org/ftp/ideasman42/edge_loop_del_update.png

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_operators/wm.py
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/mesh_intern.h
    trunk/blender/source/blender/editors/mesh/mesh_ops.c

Modified: trunk/blender/release/scripts/startup/bl_operators/wm.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_operators/wm.py	2013-06-14 02:30:40 UTC (rev 57444)
+++ trunk/blender/release/scripts/startup/bl_operators/wm.py	2013-06-14 03:04:36 UTC (rev 57445)
@@ -32,30 +32,6 @@
 from bpy.app.translations import pgettext_tip as tip_
 
 
-class MESH_OT_delete_edgeloop(Operator):
-    """Delete an edge loop by merging the faces on each side """ \
-    """to a single face loop"""
-    bl_idname = "mesh.delete_edgeloop"
-    bl_label = "Delete Edge Loop"
-    bl_options = {'UNDO', 'REGISTER'}
-
-    @classmethod
-    def poll(cls, context):
-        return bpy.ops.transform.edge_slide.poll()
-
-    def execute(self, context):
-        mesh = context.object.data
-        use_mirror_x = mesh.use_mirror_x
-        mesh.use_mirror_x = False
-        if 'FINISHED' in bpy.ops.transform.edge_slide(value=1.0, correct_uv=True):
-            bpy.ops.mesh.select_more()
-            bpy.ops.mesh.remove_doubles()
-            ret = {'FINISHED'}
-        else:
-            ret = {'CANCELLED'}
-        mesh.use_mirror_x = use_mirror_x
-        return ret
-
 rna_path_prop = StringProperty(
         name="Context Attributes",
         description="RNA context string",

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-06-14 02:30:40 UTC (rev 57444)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-06-14 03:04:36 UTC (rev 57445)
@@ -3136,6 +3136,63 @@
 	                  "Delimit dissolve operation");
 }
 
+/* internally uses dissolve */
+static int edbm_delete_edgeloop_exec(bContext *C, wmOperator *op)
+{
+	Object *obedit = CTX_data_edit_object(C);
+	BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+	const bool use_face_split = RNA_boolean_get(op->ptr, "use_face_split");
+
+	/* deal with selection */
+	{
+		BMEdge *e;
+		BMIter iter;
+
+		BM_mesh_elem_hflag_disable_all(em->bm, BM_FACE, BM_ELEM_TAG, false);
+
+		BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
+			if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
+				BMLoop *l_iter = e->l;
+				do {
+					BM_elem_flag_enable(l_iter->f, BM_ELEM_TAG);
+				} while ((l_iter = l_iter->radial_next) != e->l);
+			}
+		}
+	}
+
+	if (!EDBM_op_callf(em, op,
+	                   "dissolve_edges edges=%he use_verts=%b use_face_split=%b",
+	                   BM_ELEM_SELECT, true, use_face_split))
+	{
+		return OPERATOR_CANCELLED;
+	}
+
+	BM_mesh_elem_hflag_enable_test(em->bm, BM_FACE, BM_ELEM_SELECT, true, BM_ELEM_TAG);
+
+	EDBM_update_generic(em, true, true);
+
+	return OPERATOR_FINISHED;
+}
+
+void MESH_OT_delete_edgeloop(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Delete Edge Loop";
+	ot->description = "Delete an edge loop by merging the faces on each side";
+	ot->idname = "MESH_OT_delete_edgeloop";
+
+	/* api callbacks */
+	ot->exec = edbm_delete_edgeloop_exec;
+	ot->poll = ED_operator_editmesh;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+	RNA_def_boolean(ot->srna, "use_face_split", true, "Face Split",
+	                "Split off face corners to maintain surrounding geometry");
+}
+
 static int edbm_split_exec(bContext *C, wmOperator *op)
 {
 	Object *ob = CTX_data_edit_object(C);

Modified: trunk/blender/source/blender/editors/mesh/mesh_intern.h
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_intern.h	2013-06-14 02:30:40 UTC (rev 57444)
+++ trunk/blender/source/blender/editors/mesh/mesh_intern.h	2013-06-14 03:04:36 UTC (rev 57445)
@@ -202,6 +202,7 @@
 void MESH_OT_dissolve_edges(struct wmOperatorType *ot);
 void MESH_OT_dissolve_faces(struct wmOperatorType *ot);
 void MESH_OT_dissolve_limited(struct wmOperatorType *ot);
+void MESH_OT_delete_edgeloop(struct wmOperatorType *ot);
 void MESH_OT_edge_face_add(struct wmOperatorType *ot);
 void MESH_OT_duplicate(struct wmOperatorType *ot);
 void MESH_OT_merge(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_ops.c	2013-06-14 02:30:40 UTC (rev 57444)
+++ trunk/blender/source/blender/editors/mesh/mesh_ops.c	2013-06-14 03:04:36 UTC (rev 57445)
@@ -107,6 +107,7 @@
 	WM_operatortype_append(MESH_OT_dissolve_edges);
 	WM_operatortype_append(MESH_OT_dissolve_faces);
 	WM_operatortype_append(MESH_OT_dissolve_limited);
+	WM_operatortype_append(MESH_OT_delete_edgeloop);
 	WM_operatortype_append(MESH_OT_faces_shade_smooth);
 	WM_operatortype_append(MESH_OT_faces_shade_flat);
 	WM_operatortype_append(MESH_OT_sort_elements);




More information about the Bf-blender-cvs mailing list