[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [10990] branches/pyapi_devel/source/ blender/python/api2_2x/layer_set.c: added set method wrappers to layer_set

Campbell Barton cbarton at metavr.com
Thu Jun 21 06:07:01 CEST 2007


Revision: 10990
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=10990
Author:   campbellbarton
Date:     2007-06-21 06:07:01 +0200 (Thu, 21 Jun 2007)

Log Message:
-----------
added set method wrappers to layer_set

Modified Paths:
--------------
    branches/pyapi_devel/source/blender/python/api2_2x/layer_set.c

Modified: branches/pyapi_devel/source/blender/python/api2_2x/layer_set.c
===================================================================
--- branches/pyapi_devel/source/blender/python/api2_2x/layer_set.c	2007-06-21 00:21:56 UTC (rev 10989)
+++ branches/pyapi_devel/source/blender/python/api2_2x/layer_set.c	2007-06-21 04:07:01 UTC (rev 10990)
@@ -45,8 +45,32 @@
 #define LAYSEQ_COMPAT_INT(i) (i>=1 && i<=20)
 #define LAYSEQ_COMPAT_INT_BLEN(i) (i>=0 && i<=19)
 
-static char LayerSet_Type_Error[] = "MateriaLists only contain None or a Blender Material types";
+/* can the layers be empty? */
+#define LAYSEQ_EMPTY_SUPPORT(genlib) ((!genlib) || (genlib && genlib->id && (GS(genlib->id->name) == ID_GR)))
 
+/* used for removing */
+#define LAYSEQ_RET_NULLCHECK(_self, _ret) \
+	if (_ret) {\
+		if (PySet_Size((PyObject *)_self)==0 && !LAYSEQ_EMPTY_SUPPORT(_self->genlib)) {\
+			sync_set_from_layer__internal(_self);\
+			return ( EXPP_ReturnPyObjError( PyExc_ValueError,\
+					"Cannot discard the last layer from an object or scene" ) );\
+		} else {\
+			sync_layer_from_set__internal(_self);\
+		}\
+	}\
+	return ret;
+
+/* checks the set before returning,
+ * raises an error and reverts if the set
+ * contains ints that cant be used as layers */
+#define LAYSEQ_RET_ERRORCHECK(_self, _ret) \
+	if (_ret && !sync_layer_from_set__internal(_self))\
+			return ( EXPP_ReturnPyObjError( PyExc_ValueError,\
+					"Unsupported values for a layer in this set." ) );\
+	return _ret;
+
+
 /* store these methods so we dont have to lookup the list methods each time */
 static const PyObject * CONST_PySet_add;
 static const PyObject * CONST_PySet_clear;
@@ -139,14 +163,15 @@
 	}
 }
 
-static void sync_layer_from_set__internal(BPy_LayerSet *self)
+/* return 0 on unsupported set keys, 1 when it works */
+static int sync_layer_from_set__internal(BPy_LayerSet *self)
 {
 	PyObject *item, *iter;
 	ID *id;
-	int layer = 0;
+	int bit, layer = 0;
 	
 	if (!self->genlib || !self->genlib->id)
-		return;
+		return 0;
 	
 	id = self->genlib->id;
 	layer = layer_from_id(id);
@@ -156,30 +181,52 @@
 	item = PyIter_Next(iter);
 	while (item) {
 		/* type checking is alredy been done! */
-		layer |= PyInt_AsLong(item);
+		if (!PyInt_Check(item)) {
+			Py_DECREF(item);
+			Py_DECREF(iter);
+			sync_set_from_layer__internal(self); /* revert */
+			return 0;
+		}
+		
+		bit = PyInt_AS_LONG(item)-1;
 		Py_DECREF(item);
+		
+		if (!LAYSEQ_COMPAT_INT_BLEN(bit)) {
+			Py_DECREF(iter);
+			sync_set_from_layer__internal(self); /* revert */
+			return 0;
+		}		
+		
+		layer |= 1<<(bit-1); 
 		item = PyIter_Next(iter);
 	}
 	Py_DECREF(iter);
 	
 	id_set_layer(id, layer);
+	return 1;
 }
 
-/* returns the layer or zero if the iter has an error */
+/* returns the layer, -1 if the there is an error */
 static int layer_from_iter__internal(PyObject *seq)
 {
 	PyObject *item, *iter;
 	int layer = 0, bit;
-		
-	iter = PyObject_GetIter((PyObject *)seq);
 	
+	if (!PyIter_Check(seq))
+		return -1;
+	
+	iter = PyObject_GetIter(seq);
+	
 	item = PyIter_Next(iter);
-	if (!item)
-		return 0; /* must have at least 1 layer */
 	
 	while (item) {
 		/* type checking is alredy been done! */
-		bit = PyInt_AsLong(item);
+		if (!PyInt_Check(item)) {
+			Py_DECREF(iter);
+			return -1;
+		}
+		
+		bit = (int)PyInt_AsLong(item);
 		Py_DECREF(item);
 		if (!LAYSEQ_COMPAT_INT(bit)) { /* not an int or out of range */
 			Py_DECREF(iter);
@@ -190,17 +237,11 @@
 		item = PyIter_Next(iter);
 	}
 	Py_DECREF(iter);
-	
-	return layer;
+	return layer; /* zero is ok here */
 }
 
+static PyObject * LayerSet_contains(BPy_LayerSet *self, PyObject *key);
 
-static int LayerSet_contains(BPy_LayerSet *self, PyObject * value)
-{
-	sync_set_from_layer__internal(self);
-	return PySet_Type.tp_as_sequence->sq_contains((PyObject *)self, value);
-}
-
 static PySequenceMethods LayerSet_as_sequence = {
 	0/*(lenfunc)LayerSet_length*/,		/* sq_length */
 	0,								/* sq_concat */
@@ -249,184 +290,252 @@
 	return 0;
 }
 
-/* ignoring tp_traverse - we dont have to worry about cyclic
- * garbage collection since the LayerSet can never contain a list */
 
-//static PyGetSetDef LayerSet_getsets[] = {
-//	{"state", (getter)LayerSet_state_get, NULL,
-//	 "an int variable for demonstration purposes"},
-//	{0}
-//};
+/* Methods */
+static PyObject * LayerSet_add(BPy_LayerSet *self, PyObject *value)
+{
+	PyObject *ret;
+	PyObject *newargs = PyTuple_Pack(2, (PyObject *)self, value);
+	
+	sync_set_from_layer__internal(self);
+	
+	ret = PyObject_Call(CONST_PySet_add, newargs, NULL);
+	Py_DECREF(newargs);
+	
+	LAYSEQ_RET_ERRORCHECK(self, ret); /* checks set is valid and reverts to original if its not */
+}
 
+static PyObject * LayerSet_clear(BPy_LayerSet *self )
+{
+	/* Groups support no layers.. odd */
+	if (LAYSEQ_EMPTY_SUPPORT(self->genlib)) {
+		PyObject *ret;
+		PyObject *newargs = PyTuple_Pack(1, (PyObject *)self);
+		
+		ret = PyObject_Call(CONST_PySet_clear, newargs, NULL);
+		Py_DECREF(newargs);
+		
+		if (ret)
+			sync_layer_from_set__internal(self);
+		
+		return ret;
+	} else {
+		return ( EXPP_ReturnPyObjError( PyExc_ValueError,
+				"Scene and object layers cannot be cleared because they dont support all layers disabled." ) );
+	}
+}
 
-/*
- * Wrap Funcs
- */
+static PyObject * LayerSet_contains(BPy_LayerSet *self, PyObject *key)
+{
+	PyObject *ret;
+	PyObject *newargs = PyTuple_Pack(2, (PyObject *)self, key);
+	
+	sync_set_from_layer__internal(self);
+	
+	ret = PyObject_Call(CONST_PySet_contains, newargs, NULL);
+	Py_DECREF(newargs);
+	return ret;
+}
 
-//static PyObject * LayerSet_append(BPy_LayerSet *self, PyObject *value)
-//{
-//	if (PyList_Size((PyObject *)self) >= 16)
-//		return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
-//					LayerSet_Size_Error ) );
-//	if (!LAYSEQ_COMPAT_INT(value))
-//		return ( EXPP_ReturnPyObjError( PyExc_ValueError,
-//					LayerSet_Type_Error ) );
-//	
-//	sync_set_from_layer__internal(self);
-//	
-//	if (PyList_Append((PyObject *)self, value)==-1)
-//		return (PyObject*)NULL;
-//	
-//	sync_layer_from_set__internal(self);
-//	Py_RETURN_NONE;
-//}
+static PyObject * LayerSet_copy(BPy_LayerSet *self, PyObject *key)
+{
+	PyObject *ret;
+	PyObject *newargs = PyTuple_Pack(1, (PyObject *)self);
+	
+	sync_set_from_layer__internal(self);
+	
+	ret = PyObject_Call(CONST_PySet_copy, newargs, NULL);
+	Py_DECREF(newargs);
+	return ret;
+}
 
-//static PyObject * LayerSet_insert(BPy_LayerSet *self, PyObject *args)
-//{
-//	PyObject *value, *ret, *newargs;
-//	int i;
-//	if (PyList_Size((PyObject *)self) >= 16)
-//		return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
-//					LayerSet_Size_Error ) );
-//	
-//	if (!PyArg_ParseTuple(args, "nO:insert", &i, &value))
-//		return NULL;
-//	
-//	if (!LAYSEQ_COMPAT_INT(value))
-//		return ( EXPP_ReturnPyObjError( PyExc_ValueError,
-//					LayerSet_Type_Error ) );
-//	
-//	newargs = EXPP_PyTuple_New_Prepend(args, (PyObject *)self);
-//	
-//	sync_set_from_layer__internal(self);
-//	
-//	ret = PyObject_Call(CONST_PyList_insert, newargs, NULL);
-//	Py_DECREF(newargs);
-//	
-//	if (ret)	
-//		sync_layer_from_set__internal(self);
-//	
-//	return ret;
-//}
+static PyObject * LayerSet_discard(BPy_LayerSet *self, PyObject *key)
+{
+	PyObject *ret;
+	PyObject *newargs = PyTuple_Pack(2, (PyObject *)self, key);
+	
+	sync_set_from_layer__internal(self);
+	
+	ret = PyObject_Call(CONST_PySet_discard, newargs, NULL);
+	Py_DECREF(newargs);
+	
+	LAYSEQ_RET_NULLCHECK(self, ret); /* return */
+}
 
-//static PyObject * LayerSet_extend(BPy_LayerSet *self, PyObject *value)
-//{
-//	PyObject *ret;
-//	PyObject *newargs;
-//	
-//	if (PyList_Size((PyObject *)self) + PySequence_Size(value) >= 16)
-//		return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
-//					LayerSet_Size_Error ) );
-//	if (!LAYSEQ_COMPAT_INT_SEQ(value))
-//		return ( EXPP_ReturnPyObjError( PyExc_ValueError,
-//					LayerSet_Type_Error ) );
-//	
-//	newargs = PyTuple_Pack(2, (PyObject *)self, value);
-//	
-//	sync_set_from_layer__internal(self);
-//	
-//	ret = PyObject_Call(CONST_PyList_extend, newargs, NULL);
-//	Py_DECREF(newargs);
-//		
-//	if (ret)
-//		sync_layer_from_set__internal(self);
-//	
-//	return ret;
-//}
+static PyObject * LayerSet_difference(BPy_LayerSet *self, PyObject *other)
+{
+	PyObject *ret;
+	PyObject *newargs = PyTuple_Pack(2, (PyObject *)self, other);
+	
+	sync_set_from_layer__internal(self);
+	
+	ret = PyObject_Call(CONST_PySet_difference, newargs, NULL);
+	Py_DECREF(newargs);
+	
+	LAYSEQ_RET_NULLCHECK(self, ret); /* return */
+}
 
-//static PyObject * LayerSet_pop(BPy_LayerSet *self, PyObject *args)
-//{
-//	PyObject *ret;
-//	PyObject *newargs = EXPP_PyTuple_New_Prepend(args, (PyObject *)self);
-//	
-//	sync_set_from_layer__internal(self);
-//	
-//	ret = PyObject_Call(CONST_PyList_pop, newargs, NULL);
-//	
-//	if (ret)
-//		sync_layer_from_set__internal(self);
-//	
-//	return ret;
-//}
+static PyObject * LayerSet_difference_update(BPy_LayerSet *self, PyObject *other)
+{
+	PyObject *ret;
+	PyObject *newargs = PyTuple_Pack(2, (PyObject *)self, other);
+	
+	sync_set_from_layer__internal(self);
+	
+	ret = PyObject_Call(CONST_PySet_difference_update, newargs, NULL);
+	Py_DECREF(newargs);
+	
+	LAYSEQ_RET_NULLCHECK(self, ret); /* return */
+}
 
-//static PyObject * LayerSet_remove(BPy_LayerSet *self, PyObject *value)
-//{
-//	PyObject *ret;
-//	PyObject *newargs = PyTuple_Pack(2, (PyObject *)self, value);
-//	
-//	sync_set_from_layer__internal(self);
-//	
-//	ret = PyObject_Call(CONST_PyList_remove, newargs, NULL);
-//	Py_DECREF(newargs);
-//	
-//	if (ret)
-//		sync_layer_from_set__internal(self);
-//	
-//	return ret;
-//}
+static PyObject * LayerSet_intersection(BPy_LayerSet *self, PyObject *other)
+{
+	PyObject *ret;
+	PyObject *newargs = PyTuple_Pack(2, (PyObject *)self, other);
+	
+	sync_set_from_layer__internal(self);
+	
+	ret = PyObject_Call(CONST_PySet_intersection, newargs, NULL);
+	Py_DECREF(newargs);
 
-//static PyObject * LayerSet_index(BPy_LayerSet *self, PyObject *args)
-//{
-//	PyObject *ret;
-//	PyObject *newargs = EXPP_PyTuple_New_Prepend(args, (PyObject *)self);
-//	
-//	sync_set_from_layer__internal(self);
-//	
-//	ret = PyObject_Call(CONST_PyList_index, newargs, NULL);
-//	Py_DECREF(newargs);
-//	return ret;
-//}
+	return ret;
+}
 
-//static PyObject * LayerSet_count(BPy_LayerSet *self, PyObject *value)
-//{
-//	PyObject *ret;
-//	PyObject *newargs = PyTuple_Pack(2, (PyObject *)self, value);
-//	
-//	sync_set_from_layer__internal(self);
-//	
-//	ret = PyObject_Call(CONST_PyList_count, newargs, NULL);
-//	Py_DECREF(newargs);
-//	
-//	return ret;
-//}

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list