[Bf-blender-cvs] [5568d7c] master: EditMesh: add delete loose operator (access from Cleanup menu)

Campbell Barton noreply at git.blender.org
Fri Jan 17 04:56:08 CET 2014


Commit: 5568d7c3a17b0e9b6159f5dcfc1985f5ed7b9ac2
Author: Campbell Barton
Date:   Fri Jan 17 12:08:12 2014 +1100
https://developer.blender.org/rB5568d7c3a17b0e9b6159f5dcfc1985f5ed7b9ac2

EditMesh: add delete loose operator (access from Cleanup menu)

===================================================================

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/editors/mesh/mesh_intern.h
M	source/blender/editors/mesh/mesh_ops.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 0844bff..825bf51 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -2301,6 +2301,10 @@ class VIEW3D_MT_edit_mesh_clean(Menu):
     def draw(self, context):
         layout = self.layout
 
+        layout.operator("mesh.delete_loose")
+
+        layout.separator()
+
         layout.operator("mesh.fill_holes")
         layout.operator("mesh.vert_connect_nonplanar")
 
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 95271a1..6165531 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -382,6 +382,107 @@ void MESH_OT_delete(wmOperatorType *ot)
 	ot->prop = RNA_def_enum(ot->srna, "type", prop_mesh_delete_types, 0, "Type", "Method used for deleting mesh data");
 }
 
+
+static bool bm_face_is_loose(BMFace *f)
+{
+	BMLoop *l_iter, *l_first;
+
+	l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+	do {
+		if (!BM_edge_is_boundary(l_iter->e)) {
+			return false;
+		}
+	} while ((l_iter = l_iter->next) != l_first);
+
+	return true;
+}
+
+static int edbm_delete_loose_exec(bContext *C, wmOperator *op)
+{
+	Object *obedit = CTX_data_edit_object(C);
+	BMEditMesh *em = BKE_editmesh_from_object(obedit);
+	BMesh *bm = em->bm;
+	BMIter iter;
+
+	const bool use_verts = (RNA_boolean_get(op->ptr, "use_verts") && bm->totvertsel);
+	const bool use_edges = (RNA_boolean_get(op->ptr, "use_edges") && bm->totedgesel);
+	const bool use_faces = (RNA_boolean_get(op->ptr, "use_faces") && bm->totfacesel);
+
+	const int totelem[3] = {bm->totvert, bm->totedge, bm->totface};
+
+
+	BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false);
+
+	if (use_faces) {
+		BMFace *f;
+
+		BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+			if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
+				BM_elem_flag_set(f, BM_ELEM_TAG, bm_face_is_loose(f));
+			}
+		}
+
+		BM_mesh_delete_hflag_context(bm, BM_ELEM_TAG, DEL_FACES);
+	}
+
+	if (use_edges) {
+		BMEdge *e;
+
+		BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+			if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
+				BM_elem_flag_set(e, BM_ELEM_TAG, BM_edge_is_wire(e));
+			}
+		}
+
+		BM_mesh_delete_hflag_context(bm, BM_ELEM_TAG, DEL_EDGES);
+	}
+
+	if (use_verts) {
+		BMVert *v;
+
+		BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
+			if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+				BM_elem_flag_set(v, BM_ELEM_TAG, (v->e == NULL));
+			}
+		}
+
+		BM_mesh_delete_hflag_context(bm, BM_ELEM_TAG, DEL_VERTS);
+	}
+
+	EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+
+	EDBM_update_generic(em, true, true);
+
+	BKE_reportf(op->reports, RPT_INFO,
+	            "Removed: %d vertices, %d edges, %d faces",
+	            totelem[0] - bm->totvert, totelem[1] - bm->totedge, totelem[2] - bm->totface);
+
+	return OPERATOR_FINISHED;
+}
+
+
+void MESH_OT_delete_loose(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Delete Loose";
+	ot->description = "Delete loose vertices, edges or faces";
+	ot->idname = "MESH_OT_delete_loose";
+
+	/* api callbacks */
+	ot->exec = edbm_delete_loose_exec;
+
+	ot->poll = ED_operator_editmesh;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+	/* props */
+	RNA_def_boolean(ot->srna, "use_verts", true, "Vertices", "Remove loose vertices");
+	RNA_def_boolean(ot->srna, "use_edges", true, "Edges", "Remove loose edges");
+	RNA_def_boolean(ot->srna, "use_faces", false, "Faces", "Remove loose faces");
+}
+
+
 static int edbm_collapse_edge_exec(bContext *C, wmOperator *op)
 {
 	Object *obedit = CTX_data_edit_object(C);
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index 98c145c..e2111a9 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -184,6 +184,7 @@ void MESH_OT_uvs_reverse(struct wmOperatorType *ot);
 void MESH_OT_colors_rotate(struct wmOperatorType *ot);
 void MESH_OT_colors_reverse(struct wmOperatorType *ot);
 void MESH_OT_delete(struct wmOperatorType *ot);
+void MESH_OT_delete_loose(struct wmOperatorType *ot);
 void MESH_OT_edge_collapse(struct wmOperatorType *ot);
 void MESH_OT_faces_shade_smooth(struct wmOperatorType *ot);
 void MESH_OT_faces_shade_flat(struct wmOperatorType *ot);
diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c
index 3c42beb..26a6f41 100644
--- a/source/blender/editors/mesh/mesh_ops.c
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -121,6 +121,7 @@ void ED_operatortypes_mesh(void)
 #endif
 
 	WM_operatortype_append(MESH_OT_delete);
+	WM_operatortype_append(MESH_OT_delete_loose);
 	WM_operatortype_append(MESH_OT_edge_collapse);
 
 	WM_operatortype_append(MESH_OT_separate);




More information about the Bf-blender-cvs mailing list