[Bf-blender-cvs] [5a431be6299] blender2.8: Multi-Object-Editing: MESH_OT_shortest_path_select

Ish Bosamiya noreply at git.blender.org
Thu May 24 19:34:25 CEST 2018


Commit: 5a431be629940e0ecffba047e80e0946a01f3aa4
Author: Ish Bosamiya
Date:   Thu May 24 19:22:28 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB5a431be629940e0ecffba047e80e0946a01f3aa4

Multi-Object-Editing: MESH_OT_shortest_path_select

Note from revisor: Edit the error message to match the original one.

Maniphest Tasks: T54643
Differential Revision: https://developer.blender.org/D3351

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

M	source/blender/editors/mesh/editmesh_path.c

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

diff --git a/source/blender/editors/mesh/editmesh_path.c b/source/blender/editors/mesh/editmesh_path.c
index 4081e3b0302..64d890a7314 100644
--- a/source/blender/editors/mesh/editmesh_path.c
+++ b/source/blender/editors/mesh/editmesh_path.c
@@ -29,6 +29,8 @@
  *  \ingroup edmesh
  */
 
+#include "MEM_guardedalloc.h"
+
 #include "DNA_scene_types.h"
 #include "DNA_object_types.h"
 #include "DNA_mesh_types.h"
@@ -41,6 +43,7 @@
 #include "BLI_math.h"
 #include "BLI_linklist.h"
 
+#include "BKE_layer.h"
 #include "BKE_context.h"
 #include "BKE_editmesh.h"
 #include "BKE_report.h"
@@ -726,67 +729,87 @@ void MESH_OT_shortest_path_pick(wmOperatorType *ot)
 static int edbm_shortest_path_select_exec(bContext *C, wmOperator *op)
 {
 	Scene *scene = CTX_data_scene(C);
-	Object *obedit = CTX_data_edit_object(C);
-	BMEditMesh *em = BKE_editmesh_from_object(obedit);
-	BMesh *bm = em->bm;
-	BMIter iter;
-	BMEditSelection *ese_src, *ese_dst;
-	BMElem *ele_src = NULL, *ele_dst = NULL, *ele;
+	bool found_valid_elements = false;
+
+	ViewLayer *view_layer = CTX_data_view_layer(C);
+	uint objects_len = 0;
+	Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+	for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+		Object *obedit = objects[ob_index];
+		BMEditMesh *em = BKE_editmesh_from_object(obedit);
+		BMesh *bm = em->bm;
+		BMIter iter;
+		BMEditSelection *ese_src, *ese_dst;
+		BMElem *ele_src = NULL, *ele_dst = NULL, *ele;
+
+		if ((em->bm->totvertsel == 0) &&
+		    (em->bm->totedgesel == 0) &&
+		    (em->bm->totfacesel == 0))
+		{
+			continue;
+		}
 
-	/* first try to find vertices in edit selection */
-	ese_src = bm->selected.last;
-	if (ese_src && (ese_dst = ese_src->prev) && (ese_src->htype  == ese_dst->htype)) {
-		ele_src = ese_src->ele;
-		ele_dst = ese_dst->ele;
-	}
-	else {
-		/* if selection history isn't available, find two selected elements */
-		ele_src = ele_dst = NULL;
-		if ((em->selectmode & SCE_SELECT_VERTEX) && (bm->totvertsel >= 2)) {
-			BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
-				if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
-					if      (ele_src == NULL) ele_src = ele;
-					else if (ele_dst == NULL) ele_dst = ele;
-					else                      break;
+		/* first try to find vertices in edit selection */
+		ese_src = bm->selected.last;
+		if (ese_src && (ese_dst = ese_src->prev) && (ese_src->htype  == ese_dst->htype)) {
+			ele_src = ese_src->ele;
+			ele_dst = ese_dst->ele;
+		}
+		else {
+			/* if selection history isn't available, find two selected elements */
+			ele_src = ele_dst = NULL;
+			if ((em->selectmode & SCE_SELECT_VERTEX) && (bm->totvertsel >= 2)) {
+				BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
+					if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
+						if      (ele_src == NULL) ele_src = ele;
+						else if (ele_dst == NULL) ele_dst = ele;
+						else                      break;
+					}
 				}
 			}
-		}
 
-		if ((ele_dst == NULL) && (em->selectmode & SCE_SELECT_EDGE) && (bm->totedgesel >= 2)) {
-			ele_src = NULL;
-			BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
-				if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
-					if      (ele_src == NULL) ele_src = ele;
-					else if (ele_dst == NULL) ele_dst = ele;
-					else                      break;
+			if ((ele_dst == NULL) && (em->selectmode & SCE_SELECT_EDGE) && (bm->totedgesel >= 2)) {
+				ele_src = NULL;
+				BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
+					if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
+						if      (ele_src == NULL) ele_src = ele;
+						else if (ele_dst == NULL) ele_dst = ele;
+						else                      break;
+					}
 				}
 			}
-		}
 
-		if ((ele_dst == NULL) && (em->selectmode & SCE_SELECT_FACE) && (bm->totfacesel >= 2)) {
-			ele_src = NULL;
-			BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
-				if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
-					if      (ele_src == NULL) ele_src = ele;
-					else if (ele_dst == NULL) ele_dst = ele;
-					else                      break;
+			if ((ele_dst == NULL) && (em->selectmode & SCE_SELECT_FACE) && (bm->totfacesel >= 2)) {
+				ele_src = NULL;
+				BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
+					if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
+						if      (ele_src == NULL) ele_src = ele;
+						else if (ele_dst == NULL) ele_dst = ele;
+						else                      break;
+					}
 				}
 			}
 		}
-	}
 
-	if (ele_src && ele_dst) {
-		struct PathSelectParams op_params;
-		path_select_params_from_op(op, &op_params);
+		if (ele_src && ele_dst) {
+			struct PathSelectParams op_params;
+			path_select_params_from_op(op, &op_params);
 
-		edbm_shortest_path_pick_ex(scene, obedit, &op_params, ele_src, ele_dst);
+			edbm_shortest_path_pick_ex(scene, obedit, &op_params, ele_src, ele_dst);
 
-		return OPERATOR_FINISHED;
+			found_valid_elements = true;
+		}
 	}
-	else {
-		BKE_report(op->reports, RPT_WARNING, "Path selection requires two matching elements to be selected");
+	MEM_freeN(objects);
+
+	if (!found_valid_elements) {
+		BKE_report(op->reports,
+		           RPT_WARNING,
+		           "Path selection requires two matching elements to be selected");
 		return OPERATOR_CANCELLED;
 	}
+
+	return OPERATOR_FINISHED;
 }
 
 void MESH_OT_shortest_path_select(wmOperatorType *ot)



More information about the Bf-blender-cvs mailing list