[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11117] branches/2-44-stable/blender/ source/blender/python/api2_2x/Mesh.c: Some of the fixes/checks from trunk.

Campbell Barton cbarton at metavr.com
Fri Jun 29 01:43:57 CEST 2007


Revision: 11117
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11117
Author:   campbellbarton
Date:     2007-06-29 01:43:57 +0200 (Fri, 29 Jun 2007)

Log Message:
-----------
Some of the fixes/checks from trunk.

Revision: 11099
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11099
Author:   campbellbarton
Date:     2007-06-28 15:46:42 +0200 (Thu, 28 Jun 2007)

Modified Paths:
--------------
    branches/2-44-stable/blender/source/blender/python/api2_2x/Mesh.c

Modified: branches/2-44-stable/blender/source/blender/python/api2_2x/Mesh.c
===================================================================
--- branches/2-44-stable/blender/source/blender/python/api2_2x/Mesh.c	2007-06-28 22:37:38 UTC (rev 11116)
+++ branches/2-44-stable/blender/source/blender/python/api2_2x/Mesh.c	2007-06-28 23:43:57 UTC (rev 11117)
@@ -125,6 +125,8 @@
 static PyObject *MFace_CreatePyObject( Mesh * mesh, int i );
 static PyObject *MEdge_CreatePyObject( Mesh * mesh, int i );
 
+#define MFACE_VERT_BADRANGE_CHECK(me, face) ((int)face->v1 >= me->totvert || (int)face->v2 >= me->totvert || (int)face->v3 >= me->totvert || (int)face->v4 >= me->totvert)
+#define MEDGE_VERT_BADRANGE_CHECK(me, edge) ((int)edge->v1 >= me->totvert || (int)edge->v2 >= me->totvert)
 
 /************************************************************************
  *
@@ -947,11 +949,9 @@
 {
 	MVert *v;
 
-	v = MVert_get_pointer( self );
-	
-	if( self->index >= ((Mesh *)self->data)->totvert )
-		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
-				"MVert is no longer valid" );
+	v = MVert_get_pointer( self );	
+	if (!v)
+		return NULL; /* error is set */
 
 	return EXPP_getBitfield( &v->flag, (int)((long)type & 0xff), 'b' );
 }
@@ -968,9 +968,8 @@
 
 	v = MVert_get_pointer( self );
 
-	if( self->index >= ((Mesh *)self->data)->totvert )
-		return EXPP_ReturnIntError( PyExc_RuntimeError,
-				"MVert is no longer valid" );
+	if (!v)
+		return -1; /* error is set */
 
 	return EXPP_setBitfield( value, &v->flag, 
 			(int)((long)type & 0xff), 'b' );
@@ -1050,6 +1049,8 @@
 {
 	MVert *v = MVert_get_pointer( self );
 	Mesh *me = (Mesh *)self->data;
+	if (!v)
+		return -1; /* error is set */
 
 	/* 
 	 * if vertex exists and setting status is OK, delete select storage
@@ -2203,8 +2204,8 @@
 	MEdge *edge = MEdge_get_pointer( self );
 
 	if( !edge )
-		return NULL;
-
+		return NULL; /* error is set */
+	/* if v2 is out of range, the python mvert will complain, no need to check here  */
 	return MVert_CreatePyObject( self->mesh, edge->v2 );
 }
 
@@ -2217,10 +2218,13 @@
 	MEdge *edge = MEdge_get_pointer( self );
 
 	if( !edge )
-		return -1;
+		return -1; /* error is set */
 	if( !BPy_MVert_Check( value ) )
 		return EXPP_ReturnIntError( PyExc_TypeError, "expected an MVert" );
 
+	if ( edge->v1 == value->index )
+		return EXPP_ReturnIntError( PyExc_ValueError, "an edge cant use the same vertex for each end" );
+	
 	edge->v2 = value->index;
 	return 0;
 }
@@ -2271,6 +2275,12 @@
 	int i;
 	float *v1, *v2;
 
+	if (!edge)
+		return NULL; /* error is set */	
+	
+	if MEDGE_VERT_BADRANGE_CHECK(self->mesh, edge)
+		return EXPP_ReturnPyObjError( PyExc_RuntimeError, "This edge uses removed vert(s)" );
+	
 	/* get the 2 edges vert locations */
 	v1= (&((Mesh *)self->mesh)->mvert[edge->v1])->co;
 	v2= (&((Mesh *)self->mesh)->mvert[edge->v2])->co;
@@ -2317,6 +2327,10 @@
 	if( !edge )
 		return -1;
 
+	
+	if MEDGE_VERT_BADRANGE_CHECK(me, edge)
+		return EXPP_ReturnIntError( PyExc_RuntimeError, "This edge uses removed vert(s)" );
+	
 	if( param == -1 )
 		return EXPP_ReturnIntError( PyExc_TypeError,
 				"expected true/false argument" );
@@ -3472,7 +3486,26 @@
 				&MVert_Type, &v2, &MVert_Type, &v3, &MVert_Type, &v4 ) )
 		return EXPP_ReturnIntError( PyExc_TypeError,
 			"expected tuple of 3 or 4 MVerts" );
-
+	
+	if(	v1->index == v2->index || 
+		v1->index == v3->index || 
+		v2->index == v3->index  ) 
+		return EXPP_ReturnIntError( PyExc_ValueError,
+			"cannot assign 2 or move verts that are the same" );
+	
+	if(v4 && (	v1->index == v4->index ||
+				v2->index == v4->index ||
+				v3->index == v4->index ))
+		return EXPP_ReturnIntError( PyExc_ValueError,
+			"cannot assign 2 or move verts that are the same" );
+	
+	if(		v1->index >= self->mesh->totvert || 
+			v2->index >= self->mesh->totvert || 
+			v3->index >= self->mesh->totvert ||
+	(v4 &&(	v4->index >= self->mesh->totvert)))
+		return EXPP_ReturnIntError( PyExc_ValueError,
+			"cannot assign verts that have been removed" );
+	
 	face->v1 = v1->index;
 	face->v2 = v2->index;
 	face->v3 = v3->index;
@@ -3547,21 +3580,20 @@
 	float no[3];
 	MFace *face = MFace_get_pointer( self );
 
+	Mesh *me = self->mesh;
+	
 	if( !face )
-		return NULL;
-
-	if( (int)face->v1 >= self->mesh->totvert ||
-			(int)face->v2 >= self->mesh->totvert ||
-			(int)face->v3 >= self->mesh->totvert ||
-			(int)face->v4 >= self->mesh->totvert )
+	return NULL; /* error is set */
+	
+	if MFACE_VERT_BADRANGE_CHECK(me, face)
 		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
 				"one or more MFace vertices are no longer valid" );
 
-	vert[0] = self->mesh->mvert[face->v1].co;
-	vert[1] = self->mesh->mvert[face->v2].co;
-	vert[2] = self->mesh->mvert[face->v3].co;
+	vert[0] = me->mvert[face->v1].co;
+	vert[1] = me->mvert[face->v2].co;
+	vert[2] = me->mvert[face->v3].co;
 	if( face->v4 ) {
-		vert[3] = self->mesh->mvert[face->v4].co;
+		vert[3] = me->mvert[face->v4].co;
 		CalcNormFloat4( vert[0], vert[1], vert[2], vert[3], no );
 	} else
 		CalcNormFloat( vert[0], vert[1], vert[2], no );
@@ -3578,23 +3610,22 @@
 	float *vert[4];
 	float cent[3]= {0,0,0};
 	int i=3, j, k;
+	Mesh *me = self->mesh;
 	MFace *face = MFace_get_pointer( self );
 	
 	if( !face )
-		return NULL;
+		return NULL; /* error is set */
+	
 
-	if( (int)face->v1 >= self->mesh->totvert ||
-			(int)face->v2 >= self->mesh->totvert ||
-			(int)face->v3 >= self->mesh->totvert ||
-			(int)face->v4 >= self->mesh->totvert )
+	if MFACE_VERT_BADRANGE_CHECK(me, face)
 		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
 				"one or more MFace vertices are no longer valid" );
 
-	vert[0] = self->mesh->mvert[face->v1].co;
-	vert[1] = self->mesh->mvert[face->v2].co;
-	vert[2] = self->mesh->mvert[face->v3].co;
+	vert[0] = me->mvert[face->v1].co;
+	vert[1] = me->mvert[face->v2].co;
+	vert[2] = me->mvert[face->v3].co;
 	if( face->v4 ) {
-		vert[3] = self->mesh->mvert[face->v4].co;
+		vert[3] = me->mvert[face->v4].co;
 		i=4;
 	} 
 	
@@ -3617,23 +3648,21 @@
 {
 	float *v1,*v2,*v3,*v4;
 	MFace *face = MFace_get_pointer( self );
+	Mesh *me = self->mesh;
 	
 	if( !face )
-		return NULL;
+		return NULL; /* error is set */
 
-	if( (int)face->v1 >= self->mesh->totvert ||
-			(int)face->v2 >= self->mesh->totvert ||
-			(int)face->v3 >= self->mesh->totvert ||
-			(int)face->v4 >= self->mesh->totvert )
+	if MFACE_VERT_BADRANGE_CHECK(me, face)
 		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
 				"one or more MFace vertices are no longer valid" );
 
-	v1 = self->mesh->mvert[face->v1].co;
-	v2 = self->mesh->mvert[face->v2].co;
-	v3 = self->mesh->mvert[face->v3].co;
+	v1 = me->mvert[face->v1].co;
+	v2 = me->mvert[face->v2].co;
+	v3 = me->mvert[face->v3].co;
 	
 	if( face->v4 ) {
-		v4 = self->mesh->mvert[face->v4].co;
+		v4 = me->mvert[face->v4].co;
 		return PyFloat_FromDouble( AreaQ3Dfl(v1, v2, v3, v4));
 	} else
 		return PyFloat_FromDouble( AreaT3Dfl(v1, v2, v3));
@@ -4196,6 +4225,10 @@
 {
 	MFace *face = MFace_get_pointer( self );
 	PyObject *attr, *edpair;
+	
+	if (!face)
+		return NULL; /* error set */
+	
 	if (face->v4) {
 		attr = PyTuple_New( 4 );
 		edpair = PyTuple_New( 2 );
@@ -7537,7 +7570,7 @@
 	if (ret==0 && value!=Py_None) /*This must be a mesh type*/
 		(( BPy_Mesh * ) value)->new= 0;
 	
-	return 0;
+	return ret;
 }
 
 static int Mesh_setSel( BPy_Mesh * self, PyObject * arg )





More information about the Bf-blender-cvs mailing list