[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52650] trunk/blender/source/blender/ python/bmesh: bmesh py api: use generic checking macros to see if an object if from the same bmesh.

Campbell Barton ideasman42 at gmail.com
Thu Nov 29 04:25:44 CET 2012


Revision: 52650
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52650
Author:   campbellbarton
Date:     2012-11-29 03:25:37 +0000 (Thu, 29 Nov 2012)
Log Message:
-----------
bmesh py api: use generic checking macros to see if an object if from the same bmesh.
- was such a common operation so this saves having exceptions set inline all over the place.

Modified Paths:
--------------
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.h
    trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types_select.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types.c	2012-11-29 02:44:06 UTC (rev 52649)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types.c	2012-11-29 03:25:37 UTC (rev 52650)
@@ -582,17 +582,10 @@
 		return 0;
 	}
 	else if (BPy_BMFace_Check(value)) {
-		BPY_BM_CHECK_INT(value);
+		BPY_BM_CHECK_SOURCE_INT(value, bm, "faces.active = f");
 
-		if (((BPy_BMFace *)value)->bm != bm) {
-			PyErr_SetString(PyExc_ValueError,
-			                "faces.active = f: f is from another mesh");
-			return -1;
-		}
-		else {
-			bm->act_face = ((BPy_BMFace *)value)->f;
-			return 0;
-		}
+		bm->act_face = ((BPy_BMFace *)value)->f;
+		return 0;
 	}
 	else {
 		PyErr_Format(PyExc_TypeError,
@@ -1281,14 +1274,8 @@
 	else {
 		BMesh *bm = self->bm;
 
-		BPY_BM_CHECK_OBJ(py_face);
+		BPY_BM_CHECK_SOURCE_OBJ(py_face, bm, "copy_from_face_interp()");
 
-		if (py_face->bm != bm) {
-			PyErr_SetString(PyExc_ValueError,
-			                "BMVert.copy_from_face_interp(face): face is from another mesh");
-			return NULL;
-		}
-
 		BM_vert_interp_from_face(bm, self->v, py_face->f);
 
 		Py_RETURN_NONE;
@@ -1421,14 +1408,8 @@
 		return NULL;
 	}
 
-	BPY_BM_CHECK_OBJ(value);
+	BPY_BM_CHECK_SOURCE_OBJ(value, self->bm, "BMEdge.other_vert(vert)");
 
-	if (self->bm != value->bm) {
-		PyErr_SetString(PyExc_ValueError,
-		                "BMEdge.other_vert(vert): vert is from another mesh");
-		return NULL;
-	}
-
 	other = BM_edge_other_vert(self->e, value->v);
 
 	if (other) {
@@ -1481,14 +1462,8 @@
 	else {
 		BMesh *bm = self->bm;
 
-		BPY_BM_CHECK_OBJ(py_face);
+		BPY_BM_CHECK_SOURCE_OBJ(py_face, bm, "BMFace.copy_from_face_interp(face)");
 
-		if (py_face->bm != bm) {
-			PyErr_SetString(PyExc_ValueError,
-			                "BMFace.copy_from_face_interp(face): face is from another mesh");
-			return NULL;
-		}
-
 		BM_face_interp_from_face(bm, self->f, py_face->f);
 
 		Py_RETURN_NONE;
@@ -1653,14 +1628,8 @@
 	else {
 		BMesh *bm = self->bm;
 
-		BPY_BM_CHECK_OBJ(py_face);
+		BPY_BM_CHECK_SOURCE_OBJ(py_face, bm, "BMLoop.copy_from_face_interp(face)");
 
-		if (py_face->bm != bm) {
-			PyErr_SetString(PyExc_ValueError,
-			                "BMLoop.copy_from_face_interp(face): face is from another mesh");
-			return NULL;
-		}
-
 		BM_loop_interp_from_face(bm, self->l, py_face->f, do_vertex, do_multires);
 
 		Py_RETURN_NONE;
@@ -1955,14 +1924,8 @@
 	else {
 		BMesh *bm = self->bm;
 
-		BPY_BM_CHECK_OBJ(value);
+		BPY_BM_CHECK_SOURCE_OBJ(value, bm, "verts.remove(vert)");
 
-		if (value->bm != bm) {
-			PyErr_SetString(PyExc_ValueError,
-			                "verts.remove(vert): vert is from another mesh");
-			return NULL;
-		}
-
 		BM_vert_kill(bm, value->v);
 		bpy_bm_generic_invalidate((BPy_BMGeneric *)value);
 
@@ -1985,14 +1948,8 @@
 	else {
 		BMesh *bm = self->bm;
 
-		BPY_BM_CHECK_OBJ(value);
+		BPY_BM_CHECK_SOURCE_OBJ(value, bm, "edges.remove(edges)");
 
-		if (value->bm != bm) {
-			PyErr_SetString(PyExc_ValueError,
-			                "edges.remove(edge): edge is from another mesh");
-			return NULL;
-		}
-
 		BM_edge_kill(bm, value->e);
 		bpy_bm_generic_invalidate((BPy_BMGeneric *)value);
 
@@ -2015,14 +1972,8 @@
 	else {
 		BMesh *bm = self->bm;
 
-		BPY_BM_CHECK_OBJ(value);
+		BPY_BM_CHECK_SOURCE_OBJ(value, bm, "faces.remove(face)");
 
-		if (value->bm != bm) {
-			PyErr_SetString(PyExc_ValueError,
-			                "faces.remove(face): face is from another mesh");
-			return NULL;
-		}
-
 		BM_face_kill(bm, value->f);
 		bpy_bm_generic_invalidate((BPy_BMGeneric *)value);
 
@@ -3450,6 +3401,21 @@
 	}
 }
 
+int bpy_bm_generic_valid_check_source(BPy_BMGeneric *self, BMesh *bm_source, const char *error_prefix)
+{
+	int ret = bpy_bm_generic_valid_check(self);
+	if (LIKELY(ret == 0)) {
+		if (UNLIKELY(self->bm != bm_source)) {
+			/* could give more info here */
+			PyErr_Format(PyExc_ValueError,
+			             "%.200s: BMesh data of type %.200s is from another mesh",
+			             error_prefix, Py_TYPE(self)->tp_name);
+			ret = -1;
+		}
+	}
+	return ret;
+}
+
 void bpy_bm_generic_invalidate(BPy_BMGeneric *self)
 {
 	self->bm = NULL;

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types.h
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types.h	2012-11-29 02:44:06 UTC (rev 52649)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types.h	2012-11-29 03:25:37 UTC (rev 52650)
@@ -158,9 +158,6 @@
 
 PyObject *BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele); /* just checks type and creates v/e/f/l */
 
-int  bpy_bm_generic_valid_check(BPy_BMGeneric *self);
-void bpy_bm_generic_invalidate(BPy_BMGeneric *self);
-
 void *BPy_BMElem_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_size,
                                 const char htype,
                                 const char do_unique_check, const char do_bm_check,
@@ -171,10 +168,21 @@
 char     *BPy_BMElem_StringFromHType_ex(const char htype, char ret[32]);
 char     *BPy_BMElem_StringFromHType(const char htype);
 
+void bpy_bm_generic_invalidate(BPy_BMGeneric *self);
+int  bpy_bm_generic_valid_check(BPy_BMGeneric *self);
+int  bpy_bm_generic_valid_check_source(BPy_BMGeneric *self, BMesh *bm_source, const char *error_prefix);
 
-#define BPY_BM_CHECK_OBJ(obj) if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { return NULL; } (void)0
-#define BPY_BM_CHECK_INT(obj) if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { return -1; }   (void)0
+#define BPY_BM_CHECK_OBJ(obj) \
+	if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { return NULL; } (void)0
+#define BPY_BM_CHECK_INT(obj) \
+	if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { return -1; }   (void)0
 
+/* macros like BPY_BM_CHECK_OBJ/BPY_BM_CHECK_INT that ensure we're from the right BMesh */
+#define BPY_BM_CHECK_SOURCE_OBJ(obj, bm, errmsg) \
+	if (UNLIKELY(bpy_bm_generic_valid_check_source((BPy_BMGeneric *)obj, bm, errmsg) == -1)) { return NULL; } (void)0
+#define BPY_BM_CHECK_SOURCE_INT(obj, bm, errmsg) \
+	if (UNLIKELY(bpy_bm_generic_valid_check_source((BPy_BMGeneric *)obj, bm, errmsg) == -1)) { return -1; }   (void)0
+
 #define BPY_BM_IS_VALID(obj) (LIKELY((obj)->bm != NULL))
 
 #define BM_ITER_BPY_BM_SEQ(ele, iter, bpy_bmelemseq)                          \

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c	2012-11-29 02:44:06 UTC (rev 52649)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c	2012-11-29 03:25:37 UTC (rev 52650)
@@ -262,16 +262,10 @@
 	}
 
 	BPY_BM_CHECK_OBJ(self);
-	BPY_BM_CHECK_OBJ(value);
+	BPY_BM_CHECK_SOURCE_OBJ(value, self->bm, "layer.copy_from()");
 
-	if (self->bm != value->bm) {
-		PyErr_SetString(PyExc_ValueError,
-		                "layer.copy_from(): layer is from another mesh");
-		return NULL;
-	}
-
-	else if ((self->htype != value->htype) ||
-	         (self->type  != value->type))
+	if ((self->htype != value->htype) ||
+	    (self->type  != value->type))
 	{
 		PyErr_SetString(PyExc_ValueError,
 		                "layer.copy_from(other): layer type mismatch");

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types_select.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types_select.c	2012-11-29 02:44:06 UTC (rev 52649)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types_select.c	2012-11-29 03:25:37 UTC (rev 52650)
@@ -114,14 +114,8 @@
 		return NULL;
 	}
 
-	BPY_BM_CHECK_OBJ(value);
+	BPY_BM_CHECK_SOURCE_OBJ(value, self->bm, "select_history.add()");
 
-	if (self->bm != value->bm) {
-		PyErr_SetString(PyExc_ValueError,
-		                "Element is not from this mesh");
-		return NULL;
-	}
-
 	BM_select_history_store(self->bm, value->ele);
 
 	Py_RETURN_NONE;
@@ -145,11 +139,9 @@
 		return NULL;
 	}
 
-	BPY_BM_CHECK_OBJ(value);
+	BPY_BM_CHECK_SOURCE_OBJ(value, self->bm, "select_history.remove()");
 
-	if ((self->bm != value->bm) ||
-	    (BM_select_history_remove(self->bm, value->ele) == FALSE))
-	{
+	if (BM_select_history_remove(self->bm, value->ele) == FALSE) {
 		PyErr_SetString(PyExc_ValueError,
 		                "Element not found in selection history");
 		return NULL;

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c	2012-11-29 02:44:06 UTC (rev 52649)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c	2012-11-29 03:25:37 UTC (rev 52650)
@@ -557,16 +557,10 @@
 		return NULL;
 	}
 
-	BPY_BM_CHECK_OBJ(py_face);
-	BPY_BM_CHECK_OBJ(py_vert);
-
 	bm = py_face->bm;
 
-	if (bm != py_vert->bm) {
-		PyErr_SetString(PyExc_ValueError,
-		                "mesh elements are from different meshes");
-		return NULL;
-	}
+	BPY_BM_CHECK_OBJ(py_face);
+	BPY_BM_CHECK_SOURCE_OBJ(py_vert, bm, "face_vert_separate()");
 
 	l = BM_face_vert_share_loop(py_face->f, py_vert->v);
 




More information about the Bf-blender-cvs mailing list