[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32837] trunk/blender/source/blender/ editors/mesh: bugfix [#24398] Select Nth

Campbell Barton ideasman42 at gmail.com
Tue Nov 2 12:14:04 CET 2010


Revision: 32837
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32837
Author:   campbellbarton
Date:     2010-11-02 12:14:04 +0100 (Tue, 02 Nov 2010)

Log Message:
-----------
bugfix [#24398] Select Nth
- use first selected if non active (clears confusion since this isn't at all clear)
- dont take unselected into account when calculating connectivity, would mess up in many cases.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/mesh/editmesh_lib.c
    trunk/blender/source/blender/editors/mesh/editmesh_mods.c

Modified: trunk/blender/source/blender/editors/mesh/editmesh_lib.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_lib.c	2010-11-02 11:10:21 UTC (rev 32836)
+++ trunk/blender/source/blender/editors/mesh/editmesh_lib.c	2010-11-02 11:14:04 UTC (rev 32837)
@@ -2578,18 +2578,23 @@
 		ok = 0;
 
 		for (efa= em->faces.first; efa; efa= efa->next) {
-			if(efa->tmp.l==1) { /* initialize */
-				tag_face_edges(efa);
+			if(efa->f & SELECT) {
+				if(efa->tmp.l==1) { /* initialize */
+					tag_face_edges(efa);
+				}
+	
+				if(efa->tmp.l) {
+					efa->tmp.l++;
+				}
 			}
-
-			if(efa->tmp.l)
-				efa->tmp.l++;
 		}
 
 		for (efa= em->faces.first; efa; efa= efa->next) {
-			if(efa->tmp.l==0 && tag_face_edges_test(efa)) {
-				efa->tmp.l= 1;
-				ok = 1; /* keep looping */
+			if(efa->f & SELECT) {
+				if(efa->tmp.l==0 && tag_face_edges_test(efa)) {
+					efa->tmp.l= 1;
+					ok = 1; /* keep looping */
+				}
 			}
 		}
 	}
@@ -2644,18 +2649,23 @@
 		ok = 0;
 
 		for (eed= em->edges.first; eed; eed= eed->next) {
-			if(eed->tmp.l==1) { /* initialize */
-				tag_edge_verts(eed);
+			if(eed->f & SELECT) {
+				if(eed->tmp.l==1) { /* initialize */
+					tag_edge_verts(eed);
+				}
+	
+				if(eed->tmp.l) {
+					eed->tmp.l++;
+				}
 			}
-
-			if(eed->tmp.l)
-				eed->tmp.l++;
 		}
 
 		for (eed= em->edges.first; eed; eed= eed->next) {
-			if(eed->tmp.l==0 && tag_edge_verts_test(eed)) {
-				eed->tmp.l= 1;
-				ok = 1; /* keep looping */
+			if(eed->f & SELECT) {
+				if(eed->tmp.l==0 && tag_edge_verts_test(eed)) {
+					eed->tmp.l= 1;
+					ok = 1; /* keep looping */
+				}
 			}
 		}
 	}
@@ -2711,19 +2721,23 @@
 		ok = 0;
 
 		for (eve= em->verts.first; eve; eve= eve->next) {
-			if(eve->tmp.l)
-				eve->tmp.l++;
+			if(eve->f & SELECT) {
+				if(eve->tmp.l)
+					eve->tmp.l++;
+			}
 		}
 
 		for (eed= em->edges.first; eed; eed= eed->next) {
-			if(eed->v1->tmp.l==2 && eed->v2->tmp.l==0) { /* initialize */
-				eed->v2->tmp.l= 1;
-				ok = 1; /* keep looping */
+			if(eed->f & SELECT) {
+				if(eed->v1->tmp.l==2 && eed->v2->tmp.l==0) { /* initialize */
+					eed->v2->tmp.l= 1;
+					ok = 1; /* keep looping */
+				}
+				else if(eed->v2->tmp.l==2 && eed->v1->tmp.l==0) { /* initialize */
+					eed->v1->tmp.l= 1;
+					ok = 1; /* keep looping */
+				}
 			}
-			else if(eed->v2->tmp.l==2 && eed->v1->tmp.l==0) { /* initialize */
-				eed->v1->tmp.l= 1;
-				ok = 1; /* keep looping */
-			}
 		}
 	}
 
@@ -2740,32 +2754,79 @@
 	// EM_nfaces_selected(em); // flush does these
 }
 
-int EM_deselect_nth(EditMesh *em, int nth)
+static void deselect_nth_active(EditMesh *em, EditVert **eve_p, EditEdge **eed_p, EditFace **efa_p)
 {
 	EditSelection *ese;
-	ese = ((EditSelection*)em->selected.last);
+
+	*eve_p= NULL;
+	*eed_p= NULL;
+	*efa_p= NULL;
+
+	ese= (EditSelection*)em->selected.last;
+
 	if(ese) {
-		if(ese->type == EDITVERT) {
-			em_deselect_nth_vert(em, nth, (EditVert*)ese->data);
-			return 1;
+		switch(ese->type) {
+		case EDITVERT:
+			*eve_p= (EditVert *)ese->data;
+			return;
+		case EDITEDGE:
+			*eed_p= (EditEdge *)ese->data;
+			return;
+		case EDITFACE:
+			*efa_p= (EditFace *)ese->data;
+			return;
 		}
+	}
 
-		if(ese->type == EDITEDGE) {
-			em_deselect_nth_edge(em, nth, (EditEdge*)ese->data);
-			return 1;
+	if(em->selectmode & SCE_SELECT_VERTEX) {
+		EditVert *eve;
+		for (eve= em->verts.first; eve; eve= eve->next) {
+			if(eve->f & SELECT) {
+				*eve_p= eve;
+				return;
+			}
 		}
 	}
-	else {
-		EditFace *efa_act = EM_get_actFace(em, 0);
-		if(efa_act) {
-			em_deselect_nth_face(em, nth, efa_act);
-			return 1;
+
+	if(em->selectmode & SCE_SELECT_EDGE) {
+		EditEdge *eed;
+		for (eed= em->edges.first; eed; eed= eed->next) {
+			if(eed->f & SELECT) {
+				*eed_p= eed;
+				return;
+			}
 		}
 	}
 
-	return 0;
+	if(em->selectmode & SCE_SELECT_FACE) {
+		EditFace *efa= EM_get_actFace(em, 1);
+		if(efa) {
+			*efa_p= efa;
+			return;
+		}
+	}
 }
 
+int EM_deselect_nth(EditMesh *em, int nth)
+{
+	EditVert *eve;
+	EditEdge *eed;
+	EditFace *efa;
+
+	deselect_nth_active(em, &eve, &eed, &efa);
+
+	if(eve)
+		em_deselect_nth_vert(em, nth, eve);
+	else if (eed)
+		em_deselect_nth_edge(em, nth, eed);
+	else if (efa)
+		em_deselect_nth_face(em, nth, efa);
+	else
+		return 0;
+	
+	return 1;
+}
+
 void EM_project_snap_verts(bContext *C, ARegion *ar, Object *obedit, EditMesh *em)
 {
 	EditVert *eve;

Modified: trunk/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_mods.c	2010-11-02 11:10:21 UTC (rev 32836)
+++ trunk/blender/source/blender/editors/mesh/editmesh_mods.c	2010-11-02 11:14:04 UTC (rev 32837)
@@ -4581,10 +4581,7 @@
 	EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
 	int nth = RNA_int_get(op->ptr, "nth");
 
-	if(EM_deselect_nth(em, nth) == 0) {
-		BKE_report(op->reports, RPT_ERROR, "Mesh has no active vert/edge/face.");
-		return OPERATOR_CANCELLED;
-	}
+	EM_deselect_nth(em, nth);
 
 	BKE_mesh_end_editmesh(obedit->data, em);
 





More information about the Bf-blender-cvs mailing list