[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