diff options
author | Campbell Barton <ideasman42@gmail.com> | 2007-03-08 17:37:34 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2007-03-08 17:37:34 +0300 |
commit | 5eaf9f90c1acc1b337a3fee38887f5db2a46ac81 (patch) | |
tree | 6c2608c7d77487761dfeefc0caf15be68dd64b0b | |
parent | 51c16edabc18a13e91bee1a35cbe39eb1e911ea3 (diff) |
BPython API
added a function - GenericLib_assignData for assigning blender data, to assign an ipo to a camera or world to a scene for instance.
Using this function removed ~300 lines of code.
also fixes user count error in some places that didnt check.
also made it possible to clear the colorband by setting it to []
-rw-r--r-- | source/blender/python/api2_2x/Camera.c | 74 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Curve.c | 43 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Key.c | 71 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Lamp.c | 40 | ||||
-rw-r--r-- | source/blender/python/api2_2x/MTex.c | 66 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Material.c | 91 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Material.h | 2 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Mesh.c | 24 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Modifier.c | 138 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Object.c | 80 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Pose.c | 9 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Scene.c | 42 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Texture.c | 4 | ||||
-rw-r--r-- | source/blender/python/api2_2x/World.c | 30 | ||||
-rw-r--r-- | source/blender/python/api2_2x/gen_utils.c | 83 | ||||
-rw-r--r-- | source/blender/python/api2_2x/gen_utils.h | 6 |
16 files changed, 184 insertions, 619 deletions
diff --git a/source/blender/python/api2_2x/Camera.c b/source/blender/python/api2_2x/Camera.c index a3e39e5c346..0bd73e11500 100644 --- a/source/blender/python/api2_2x/Camera.c +++ b/source/blender/python/api2_2x/Camera.c @@ -109,7 +109,6 @@ struct PyMethodDef M_Camera_methods[] = { /*****************************************************************************/ /* Python BPy_Camera methods declarations: */ /*****************************************************************************/ -static PyObject *Camera_oldgetIpo( BPy_Camera * self ); static PyObject *Camera_oldgetType( BPy_Camera * self ); static PyObject *Camera_oldgetMode( BPy_Camera * self ); static PyObject *Camera_oldgetLens( BPy_Camera * self ); @@ -117,6 +116,8 @@ static PyObject *Camera_oldgetClipStart( BPy_Camera * self ); static PyObject *Camera_oldgetClipEnd( BPy_Camera * self ); static PyObject *Camera_oldgetDrawSize( BPy_Camera * self ); static PyObject *Camera_oldgetScale( BPy_Camera * self ); +static PyObject *Camera_getIpo( BPy_Camera * self ); +static int Camera_setIpo( BPy_Camera * self, PyObject * value ); static PyObject *Camera_oldsetIpo( BPy_Camera * self, PyObject * args ); static PyObject *Camera_oldsetType( BPy_Camera * self, PyObject * args ); static PyObject *Camera_oldsetMode( BPy_Camera * self, PyObject * args ); @@ -138,7 +139,7 @@ static PyObject *Camera_copy( BPy_Camera * self ); /*****************************************************************************/ static PyMethodDef BPy_Camera_methods[] = { /* name, method, flags, doc */ - {"getIpo", ( PyCFunction ) Camera_oldgetIpo, METH_NOARGS, + {"getIpo", ( PyCFunction ) Camera_getIpo, METH_NOARGS, "() - Return Camera Data Ipo"}, {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, "() - Return Camera Data name"}, @@ -459,36 +460,7 @@ static PyObject *Camera_oldgetDrawSize( BPy_Camera * self ) static PyObject *Camera_oldsetIpo( BPy_Camera * self, PyObject * args ) { - PyObject *pyipo = 0; - Ipo *ipo = NULL; - Ipo *oldipo; - - if( !PyArg_ParseTuple( args, "O!", &Ipo_Type, &pyipo ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Ipo as argument" ); - - ipo = Ipo_FromPyObject( pyipo ); - - if( !ipo ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "null ipo!" ); - - if( ipo->blocktype != ID_CA ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "this ipo is not a camera data ipo" ); - - oldipo = self->camera->ipo; - if( oldipo ) { - ID *id = &oldipo->id; - if( id->us > 0 ) - id->us--; - } - - id_us_plus(&ipo->id); - - self->camera->ipo = ipo; - - Py_RETURN_NONE; + return EXPP_setterWrapper( (void *)self, args, (setter)Camera_setIpo ); } static PyObject *Camera_oldclearIpo( BPy_Camera * self ) @@ -767,43 +739,7 @@ static PyObject *Camera_getIpo( BPy_Camera * self ) static int Camera_setIpo( BPy_Camera * self, PyObject * value ) { - Ipo *ipo = NULL; - Ipo *oldipo = self->camera->ipo; - ID *id; - - /* if parameter is not None, check for valid Ipo */ - - if ( value != Py_None ) { - if ( !Ipo_CheckPyObject( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an Ipo object" ); - - ipo = Ipo_FromPyObject( value ); - - if( !ipo ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "null ipo!" ); - - if( ipo->blocktype != ID_CA ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Ipo is not a camera data Ipo" ); - } - - /* if already linked to Ipo, delete link */ - - if ( oldipo ) { - id = &oldipo->id; - if( id->us > 0 ) - id->us--; - } - - /* assign new Ipo and increment user count, or set to NULL if deleting */ - - self->camera->ipo = ipo; - if ( ipo ) - id_us_plus(&ipo->id); - - return 0; + return GenericLib_assignData(value, (void **) &self->camera->ipo, 0, 1, ID_IP, ID_CA); } /* diff --git a/source/blender/python/api2_2x/Curve.c b/source/blender/python/api2_2x/Curve.c index f42b5959d14..f72851e115e 100644 --- a/source/blender/python/api2_2x/Curve.c +++ b/source/blender/python/api2_2x/Curve.c @@ -1037,22 +1037,12 @@ static PyObject *Curve_getBevOb( BPy_Curve * self) /*****************************************************************************/ static int Curve_newsetBevOb( BPy_Curve * self, PyObject * args ) { - BPy_Object *pybevobj = (BPy_Object *) args; - - if( args == Py_None ) { /* Accept None */ - self->curve->bevobj = (Object *)NULL; - } else { /* Accept Object with type 'Curve' */ - if( !Object_CheckPyObject( args ) || - pybevobj->object->type != OB_CURVE ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected Curve object type or None argument" ); - if( pybevobj->object->data == self->curve ) - return EXPP_ReturnIntError( PyExc_ValueError, - "Can't bevel an object to itself" ); - self->curve->bevobj = Object_FromPyObject( args ); - } - - return 0; + + if (Object_CheckPyObject( args ) && ((BPy_Object *)args)->object->data == self->curve ) + return EXPP_ReturnIntError( PyExc_ValueError, + "Can't bevel an object to itself" ); + + return GenericLib_assignData(args, (void **) &self->curve->bevobj, 0, 0, ID_OB, OB_CURVE); } /*****************************************************************************/ @@ -1075,22 +1065,11 @@ static PyObject *Curve_getTaperOb( BPy_Curve * self) static int Curve_newsetTaperOb( BPy_Curve * self, PyObject * args ) { - BPy_Object *pytaperobj = (BPy_Object *) args; - - if( args == Py_None ) { /* Accept None */ - self->curve->taperobj = (Object *)NULL; - } else { /* Accept Object with type 'Curve' */ - if( !Object_CheckPyObject( args ) || - pytaperobj->object->type != OB_CURVE ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected Curve object type or None argument" ); - if( pytaperobj->object->data == self->curve ) - return EXPP_ReturnIntError( PyExc_ValueError, - "Can't bevel an object to itself" ); - self->curve->taperobj = Object_FromPyObject( args ); - } - - return 0; + if (Object_CheckPyObject( args ) && ((BPy_Object *)args)->object->data == self->curve ) + return EXPP_ReturnIntError( PyExc_ValueError, + "Can't taper an object to itself" ); + + return GenericLib_assignData(args, (void **) &self->curve->taperobj, 0, 0, ID_OB, OB_CURVE); } /*****************************************************************************/ diff --git a/source/blender/python/api2_2x/Key.c b/source/blender/python/api2_2x/Key.c index 82b6687f394..87edb8f4e5b 100644 --- a/source/blender/python/api2_2x/Key.c +++ b/source/blender/python/api2_2x/Key.c @@ -65,12 +65,12 @@ static void KeyBlock_dealloc( PyObject * self ); static int Key_compare( BPy_Key * a, BPy_Key * b ); static PyObject *Key_repr( BPy_Key * self ); -static PyObject *Key_getBlocks( PyObject * self ); +static PyObject *Key_getBlocks( BPy_Key * self ); static PyObject *Key_getType( BPy_Key * self ); static PyObject *Key_getRelative( BPy_Key * self ); -static PyObject *Key_getIpo( PyObject * self ); -static int Key_setIpo( PyObject * self, PyObject * args ); -static PyObject *Key_getValue( PyObject * self ); +static PyObject *Key_getIpo( BPy_Key * self ); +static int Key_setIpo( BPy_Key * self, PyObject * args ); +static PyObject *Key_getValue( BPy_Key * self ); static int Key_setRelative( BPy_Key * self, PyObject * value ); static struct PyMethodDef Key_methods[] = { @@ -319,69 +319,30 @@ static PyObject *Key_repr( BPy_Key * self ) return PyString_FromFormat( "[Key \"%s\"]", self->key->id.name + 2 ); } -static PyObject *Key_getIpo( PyObject * self ) +static PyObject *Key_getIpo( BPy_Key * self ) { - BPy_Key *k = ( BPy_Key * ) self; BPy_Ipo *new_ipo; - if (k->key->ipo) { + if (self->key->ipo) { new_ipo = ( BPy_Ipo * ) PyObject_NEW( BPy_Ipo, &Ipo_Type ); - new_ipo->ipo = k->key->ipo; + new_ipo->ipo = self->key->ipo; return (PyObject *) new_ipo; } else { - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } } -static int Key_setIpo( PyObject * self, PyObject * value ) +static int Key_setIpo( BPy_Key * self, PyObject * value ) { - Ipo *ipo = NULL; - Ipo *oldipo = (( BPy_Key * )self)->key->ipo; - ID *id; - - /* if parameter is not None, check for valid Ipo */ - - if ( value != Py_None ) { - if ( !Ipo_CheckPyObject( value ) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "expected an Ipo object" ); - - ipo = Ipo_FromPyObject( value ); - - if( !ipo ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "null ipo!" ); - - if( ipo->blocktype != ID_KE ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Ipo is not a key data Ipo" ); - } - - /* if already linked to Ipo, delete link */ - - if ( oldipo ) { - id = &oldipo->id; - if( id->us > 0 ) - id->us--; - } - - /* assign new Ipo and increment user count, or set to NULL if deleting */ - - (( BPy_Key * )self)->key->ipo = ipo; - if ( ipo ) { - id = &ipo->id; - id_us_plus(id); - } - - return 0; + return GenericLib_assignData(value, (void **) &self->key->ipo, 0, 1, ID_IP, ID_KE); } static PyObject *Key_getRelative( BPy_Key * self ) { if( self->key->type == KEY_RELATIVE ) - return EXPP_incr_ret(Py_True); + Py_RETURN_TRUE; else - return EXPP_incr_ret(Py_False); + Py_RETURN_FALSE; } static int Key_setRelative( BPy_Key * self, PyObject * value ) @@ -418,16 +379,14 @@ static PyObject *Key_getType( BPy_Key * self ) return PyInt_FromLong( type ); } -static PyObject *Key_getBlocks( PyObject * self ) +static PyObject *Key_getBlocks( BPy_Key * self ) { - BPy_Key *k = ( BPy_Key * ) self; - Key *key = k->key; + Key *key = self->key; KeyBlock *kb; PyObject *keyblock_object; PyObject *l = PyList_New( 0 ); for (kb = key->block.first; kb; kb = kb->next) { - keyblock_object = KeyBlock_CreatePyObject( kb, key ); PyList_Append( l, keyblock_object ); } @@ -435,7 +394,7 @@ static PyObject *Key_getBlocks( PyObject * self ) return l; } -static PyObject *Key_getValue( PyObject * self ) +static PyObject *Key_getValue( BPy_Key * self ) { BPy_Key *k = ( BPy_Key * ) self; diff --git a/source/blender/python/api2_2x/Lamp.c b/source/blender/python/api2_2x/Lamp.c index 2588d376913..c7ec3de5892 100644 --- a/source/blender/python/api2_2x/Lamp.c +++ b/source/blender/python/api2_2x/Lamp.c @@ -1394,45 +1394,7 @@ static PyObject *Lamp_getIpo( BPy_Lamp * self ) static int Lamp_setIpo( BPy_Lamp * self, PyObject * value ) { - Ipo *ipo = NULL; - Ipo *oldipo = self->lamp->ipo; - ID *id; - - /* if parameter is not None, check for valid Ipo */ - - if ( value != Py_None ) { - if ( !Ipo_CheckPyObject( value ) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "expected an Ipo object" ); - - ipo = Ipo_FromPyObject( value ); - - if( !ipo ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "null ipo!" ); - - if( ipo->blocktype != ID_LA ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Ipo is not a lamp data Ipo" ); - } - - /* if already linked to Ipo, delete link */ - - if ( oldipo ) { - id = &oldipo->id; - if( id->us > 0 ) - id->us--; - } - - /* assign new Ipo and increment user count, or set to NULL if deleting */ - - self->lamp->ipo = ipo; - if ( ipo ) { - id = &ipo->id; - id_us_plus(id); - } - - return 0; + return GenericLib_assignData(value, (void **) &self->lamp->ipo, 0, 1, ID_IP, ID_LA); } /* diff --git a/source/blender/python/api2_2x/MTex.c b/source/blender/python/api2_2x/MTex.c index 71e60c9ec3f..c345cf30fc0 100644 --- a/source/blender/python/api2_2x/MTex.c +++ b/source/blender/python/api2_2x/MTex.c @@ -283,27 +283,7 @@ int MTex_CheckPyObject( PyObject * pyobj ) static PyObject *MTex_setTexMethod( BPy_MTex * self, PyObject * args ) { - Tex *tex; - - if( args == Py_None ) - { - tex = NULL; - } else if( Texture_CheckPyObject( args ) ) { - tex = Texture_FromPyObject( args ); - } else { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Texture argument" ); - } - - if( self->mtex->tex ) - self->mtex->tex->id.us--; - - self->mtex->tex = tex; - - if( self->mtex->tex ) - self->mtex->tex->id.us++; - - Py_RETURN_NONE; + return EXPP_setterWrapper( (void *)self, args, (setter)MTex_setTex ); } static void MTex_dealloc( BPy_MTex * self ) @@ -336,27 +316,7 @@ static PyObject *MTex_getTex( BPy_MTex *self, void *closure ) static int MTex_setTex( BPy_MTex *self, PyObject *value, void *closure) { - Tex *tex; - - if( value == Py_None ) - { - tex = NULL; - } else if( Texture_CheckPyObject( value ) ) { - tex = Texture_FromPyObject( value ); - } else { - return EXPP_ReturnIntError( PyExc_TypeError, - "expected Texture argument" ); - } - - if( self->mtex->tex ) - self->mtex->tex->id.us--; - - self->mtex->tex = tex; - - if( self->mtex->tex ) - self->mtex->tex->id.us++; - - return 0; + return GenericLib_assignData(value, (void **) &self->mtex->tex, 0, 1, ID_TE, 0); } static PyObject *MTex_getTexCo( BPy_MTex *self, void *closure ) @@ -397,27 +357,7 @@ static PyObject *MTex_getObject( BPy_MTex *self, void *closure ) static int MTex_setObject( BPy_MTex *self, PyObject *value, void *closure) { - Object *obj; - - if( value == Py_None ) - { - obj = NULL; - } else if( Object_CheckPyObject( value ) ) { - obj = Object_FromPyObject( value ); - } else { - return EXPP_ReturnIntError( PyExc_TypeError, - "expected Object argument" ); - } - - if( self->mtex->object ) - self->mtex->object->id.us--; - - self->mtex->object = obj; - - if( self->mtex->object ) - self->mtex->object->id.us++; - - return 0; + return GenericLib_assignData(value, (void **) &self->mtex->object, 0, 1, ID_OB, 0); } static PyObject *MTex_getUVLayer( BPy_MTex *self, void *closure ) diff --git a/source/blender/python/api2_2x/Material.c b/source/blender/python/api2_2x/Material.c index ee496c14737..4ff4e23d9e9 100644 --- a/source/blender/python/api2_2x/Material.c +++ b/source/blender/python/api2_2x/Material.c @@ -1818,49 +1818,10 @@ static PyObject *Material_getTextures( BPy_Material * self ) static int Material_setIpo( BPy_Material * self, PyObject * value ) { - Ipo *ipo = NULL; - Ipo *oldipo = self->material->ipo; - ID *id; - - /* if parameter is not None, check for valid Ipo */ - - if ( value != Py_None ) { - if ( !Ipo_CheckPyObject( value ) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "expected an Ipo object" ); - - ipo = Ipo_FromPyObject( value ); - - if( !ipo ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "null ipo!" ); - - if( ipo->blocktype != ID_MA ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Ipo is not a material data Ipo" ); - } - - /* if already linked to Ipo, delete link */ - - if ( oldipo ) { - id = &oldipo->id; - if( id->us > 0 ) - id->us--; - } - - /* assign new Ipo and increment user count, or set to NULL if deleting */ - - self->material->ipo = ipo; - if ( ipo ) { - id = &ipo->id; - id_us_plus(id); - } - - return 0; + return GenericLib_assignData(value, (void **) &self->material->ipo, 0, 1, ID_IP, ID_MA); } - /* * Material_insertIpoKey( key ) * inserts Material IPO key at current frame @@ -2084,18 +2045,9 @@ static int Material_setZOffset( BPy_Material * self, PyObject * value ) EXPP_MAT_ZOFFS_MAX ); } -static int Material_setLightGroup( BPy_Material * self, PyObject * value ) { - BPy_Group *pygrp=NULL; - if ( PyObject_TypeCheck(value, &Group_Type) ) { - pygrp= (BPy_Group *)value; - self->material->group= pygrp->group; - } else if (value==Py_None) { - self->material->group= NULL; - } else { - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a group or None" ); - } - return 0; +static int Material_setLightGroup( BPy_Material * self, PyObject * value ) +{ + return GenericLib_assignData(value, (void **) &self->material->group, NULL, 1, ID_GR, 0); } static int Material_setAdd( BPy_Material * self, PyObject * value ) @@ -2505,22 +2457,31 @@ PyObject *EXPP_PyList_fromColorband( ColorBand *coba ) } /* make sure you coba is not none before calling this */ -int EXPP_Colorband_fromPyList( ColorBand *coba, PyObject * value ) +int EXPP_Colorband_fromPyList( ColorBand **coba, PyObject * value ) { short totcol, i; PyObject *colseq; PyObject *pyflt; float f; - if ( !PySequence_Check( value ) ) + if ( !PySequence_Check( value ) ) return ( EXPP_ReturnIntError( PyExc_TypeError, "Colorband must be a sequence" ) ); totcol = PySequence_Size(value); - if (totcol < 1 || totcol > 31) + if ( totcol > 31) return ( EXPP_ReturnIntError( PyExc_ValueError, "Colorband must be between 1 and 31 in length" ) ); + if (totcol==0) { + MEM_freeN(*coba); + *coba = NULL; + return 0; + } + + if (!*coba) + *coba = MEM_callocN( sizeof(ColorBand), "colorband"); + for (i=0; i<totcol; i++) { colseq = PySequence_GetItem( value, i ); if ( !PySequence_Check( colseq ) || PySequence_Size( colseq ) != 5) { @@ -2542,38 +2503,38 @@ int EXPP_Colorband_fromPyList( ColorBand *coba, PyObject * value ) } /* ok, continue - should check for 5 floats, will ignore non floats for now */ - coba->tot = totcol; + (*coba)->tot = totcol; for (i=0; i<totcol; i++) { colseq = PySequence_GetItem( value, i ); pyflt = PySequence_GetItem( colseq, 0 ); f = (float)PyFloat_AsDouble( pyflt ); CLAMP(f, 0.0, 1.0); - coba->data[i].r = f; + (*coba)->data[i].r = f; Py_DECREF ( pyflt ); pyflt = PySequence_GetItem( colseq, 1 ); f = (float)PyFloat_AsDouble( pyflt ); CLAMP(f, 0.0, 1.0); - coba->data[i].g = f; + (*coba)->data[i].g = f; Py_DECREF ( pyflt ); pyflt = PySequence_GetItem( colseq, 2 ); f = (float)PyFloat_AsDouble( pyflt ); CLAMP(f, 0.0, 1.0); - coba->data[i].b = f; + (*coba)->data[i].b = f; Py_DECREF ( pyflt ); pyflt = PySequence_GetItem( colseq, 3 ); f = (float)PyFloat_AsDouble( pyflt ); CLAMP(f, 0.0, 1.0); - coba->data[i].a = f; + (*coba)->data[i].a = f; Py_DECREF ( pyflt ); pyflt = PySequence_GetItem( colseq, 4 ); f = (float)PyFloat_AsDouble( pyflt ); CLAMP(f, 0.0, 1.0); - coba->data[i].pos = f; + (*coba)->data[i].pos = f; Py_DECREF ( pyflt ); Py_DECREF ( colseq ); @@ -2814,13 +2775,9 @@ int Material_setColorband( BPy_Material * self, PyObject * value, void * type) { switch( (long)type ) { case 0: /* these are backwards, but that how it works */ - if (!self->material->ramp_col) - self->material->ramp_col = MEM_callocN( sizeof(ColorBand), "colorband"); - return EXPP_Colorband_fromPyList( self->material->ramp_col, value ); + return EXPP_Colorband_fromPyList( &self->material->ramp_col, value ); case 1: - if (!self->material->ramp_spec) - self->material->ramp_spec = MEM_callocN( sizeof(ColorBand), "colorband"); - return EXPP_Colorband_fromPyList( self->material->ramp_spec, value ); + return EXPP_Colorband_fromPyList( &self->material->ramp_spec, value ); } return 0; } diff --git a/source/blender/python/api2_2x/Material.h b/source/blender/python/api2_2x/Material.h index 0b8f48b713b..6e3c3c767c4 100644 --- a/source/blender/python/api2_2x/Material.h +++ b/source/blender/python/api2_2x/Material.h @@ -66,7 +66,7 @@ int Material_CheckPyObject( PyObject * pyobj ); /* colorband tp_getseters */ PyObject *EXPP_PyList_fromColorband( ColorBand *coba ); -int EXPP_Colorband_fromPyList( ColorBand *coba, PyObject * value ); +int EXPP_Colorband_fromPyList( ColorBand **coba, PyObject * value ); /* Some functions needed by NMesh, Curve and friends */ PyObject *EXPP_PyList_fromMaterialList( Material ** matlist, int len, diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c index eb8f875fc34..963c1051662 100644 --- a/source/blender/python/api2_2x/Mesh.c +++ b/source/blender/python/api2_2x/Mesh.c @@ -7508,27 +7508,13 @@ static PyObject *Mesh_getTexMesh( BPy_Mesh * self ) Py_RETURN_NONE; } -static int Mesh_setTexMesh( BPy_Mesh * self, PyObject * arg ) -{ - - /*None or Mesh*/ - if ( arg != Py_None && !Mesh_CheckPyObject(arg) ) - return EXPP_ReturnIntError( PyExc_ValueError, - "texmesh must be a Mesh or None type" ); +static int Mesh_setTexMesh( BPy_Mesh * self, PyObject * value ) +{ + int ret = GenericLib_assignData(value, (void **) &self->mesh->texcomesh, 0, 1, ID_ME, 0); - /*remove existing texmesh*/ - if (self->mesh->texcomesh) { - self->mesh->texcomesh->id.us--; - self->mesh->texcomesh= NULL; - } + if (ret==0 && value!=Py_None) /*This must be a mesh type*/ + (( BPy_Mesh * ) value)->new= 0; - if (arg != Py_None) { /* its a mesh */ - BPy_Mesh *blen_obj = ( BPy_Mesh * ) arg; - /*This is a mesh so it needs to be added */ - self->mesh->texcomesh= blen_obj->mesh; - self->mesh->texcomesh->id.us++; - blen_obj->new= 0; - } return 0; } diff --git a/source/blender/python/api2_2x/Modifier.c b/source/blender/python/api2_2x/Modifier.c index 751100964cf..8ddbb2f9dcf 100644 --- a/source/blender/python/api2_2x/Modifier.c +++ b/source/blender/python/api2_2x/Modifier.c @@ -398,27 +398,8 @@ static int armature_setter( BPy_Modifier *self, int type, PyObject *value ) ArmatureModifierData *md = (ArmatureModifierData *)(self->md); switch( type ) { - case EXPP_MOD_OBJECT: { - Object *ob_new=NULL; - if (value == Py_None) { - md->object = NULL; - } else if (BPy_Object_Check( value )) { - ob_new = ((( BPy_Object * )value)->object); - if( ob_new->type != OB_ARMATURE) { - return EXPP_ReturnIntError( PyExc_TypeError, - "this object is not a supported type" ); - } - - if( ob_new == self->object ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Cannot assign the object to its self" ); - md->object = ob_new; - } else { - return EXPP_ReturnIntError( PyExc_TypeError, - "Expected an Object or None value" ); - } - return 0; - } + case EXPP_MOD_OBJECT: + return GenericLib_assignData(value, (void **) &md->object, 0, 0, ID_OB, OB_ARMATURE); case EXPP_MOD_VERTGROUP: return EXPP_setBitfield( value, &md->deformflag, 1, 'h' ); case EXPP_MOD_ENVELOPES: @@ -447,27 +428,8 @@ static int lattice_setter( BPy_Modifier *self, int type, PyObject *value ) LatticeModifierData *md = (LatticeModifierData *)(self->md); switch( type ) { - case EXPP_MOD_OBJECT: { - Object *ob_new=NULL; - if (value == Py_None) { - md->object = NULL; - } else if (BPy_Object_Check( value )) { - ob_new = ((( BPy_Object * )value)->object); - if( ob_new->type != OB_LATTICE) { - return EXPP_ReturnIntError( PyExc_TypeError, - "this object is not a supported type" ); - } - - if( ob_new == self->object ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Cannot assign the object to its self" ); - md->object = ob_new; - } else { - return EXPP_ReturnIntError( PyExc_TypeError, - "Expected an Object or None value" ); - } - return 0; - } + case EXPP_MOD_OBJECT: + return GenericLib_assignData(value, (void **) &md->object, (void **) &self->object, 0, ID_OB, OB_LATTICE); case EXPP_MOD_VERTGROUP: { char *name = PyString_AsString( value ); if( !name ) @@ -501,26 +463,8 @@ static int curve_setter( BPy_Modifier *self, int type, PyObject *value ) CurveModifierData *md = (CurveModifierData *)(self->md); switch( type ) { - case EXPP_MOD_OBJECT: { - Object *ob_new=NULL; - if (value == Py_None) { - md->object = NULL; - } else if (BPy_Object_Check( value )) { - ob_new = ((( BPy_Object * )value)->object); - if( ob_new->type != OB_CURVE) { - return EXPP_ReturnIntError( PyExc_TypeError, - "this object is not a supported type" ); - } - if( ob_new == self->object ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Cannot assign the object to its self" ); - md->object = ob_new; - } else { - return EXPP_ReturnIntError( PyExc_TypeError, - "Expected an Object or None value" ); - } - return 0; - } + case EXPP_MOD_OBJECT: + return GenericLib_assignData(value, (void **) &md->object, (void **) &self->object, 0, ID_OB, OB_CURVE); case EXPP_MOD_VERTGROUP: { char *name = PyString_AsString( value ); if( !name ) @@ -715,40 +659,10 @@ static int array_setter( BPy_Modifier *self, int type, PyObject *value ) { ArrayModifierData *md = (ArrayModifierData *)(self->md); switch( type ) { - case EXPP_MOD_OBJECT_OFFSET: { - Object *ob_new=NULL; - if (value == Py_None) { - md->offset_ob = NULL; - } else if (BPy_Object_Check( value )) { - ob_new = ((( BPy_Object * )value)->object); - - if( ob_new == self->object ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Cannot assign the object to its self" ); - md->offset_ob = ob_new; - } else { - return EXPP_ReturnIntError( PyExc_TypeError, - "Expected an Object or None value" ); - } - return 0; - } - case EXPP_MOD_OBJECT_CURVE: { - Object *ob_new=NULL; - if (value == Py_None) { - md->curve_ob = NULL; - } else if (BPy_Object_Check( value )) { - ob_new = ((( BPy_Object * )value)->object); - - if( ob_new == self->object ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Cannot assign the object to its self" ); - md->curve_ob = ob_new; - } else { - return EXPP_ReturnIntError( PyExc_TypeError, - "Expected an Object or None value" ); - } - return 0; - } + case EXPP_MOD_OBJECT_OFFSET: + return GenericLib_assignData(value, (void **) &md->offset_ob, (void **) &self->object, 0, ID_OB, 0); + case EXPP_MOD_OBJECT_CURVE: + return GenericLib_assignData(value, (void **) &md->curve_ob, 0, 0, ID_OB, OB_CURVE); case EXPP_MOD_COUNT: return EXPP_setIValueClamped( value, &md->count, 1, 1000, 'i' ); case EXPP_MOD_LENGTH: @@ -780,17 +694,9 @@ static int boolean_setter( BPy_Modifier *self, int type, PyObject *value ) { BooleanModifierData *md = (BooleanModifierData *)(self->md); - if( type == EXPP_MOD_OBJECT ) { - Object *ob = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) || ob->type != OB_MESH ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy mesh object argument" ); - if(ob == self->object ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Cannot boolean an object with its self" ); - md->object = ob; - return 0; - } else if( type == EXPP_MOD_OPERATION ) + if( type == EXPP_MOD_OBJECT ) + return GenericLib_assignData(value, (void **) &md->object, (void **) &self->object, 0, ID_OB, OB_MESH); + else if( type == EXPP_MOD_OPERATION ) return EXPP_setIValueRange( value, &md->operation, eBooleanModifierOp_Intersect, eBooleanModifierOp_Difference, 'h' ); @@ -870,23 +776,7 @@ static int displace_setter( BPy_Modifier *self, int type, PyObject *value ) switch( type ) { case EXPP_MOD_TEXTURE: - if (md->texture) - md->texture->id.us--; - - if (value == Py_None) { - md->texture = NULL; - } else if (Texture_CheckPyObject(value)) { - BPy_Texture *bpytex = (BPy_Texture *)value; - md->texture = bpytex->texture; - md->texture->id.us--; - - } else { - if (md->texture) - md->texture->id.us++; - return EXPP_ReturnIntError( PyExc_TypeError, - "Texture must be of Texture or None type" ); - } - return 0; + return GenericLib_assignData(value, (void **) &md->texture, 0, 1, ID_TE, 0); case EXPP_MOD_STRENGTH: return EXPP_setFloatClamped( value, &md->strength, -1000.0, 1000.0 ); diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c index a2a80683f7f..cfdcd67f932 100644 --- a/source/blender/python/api2_2x/Object.c +++ b/source/blender/python/api2_2x/Object.c @@ -2982,26 +2982,9 @@ static PyObject *Object_getDupliGroup( BPy_Object * self ) Py_RETURN_NONE; } -static int Object_setDupliGroup( BPy_Object * self, BPy_Group * args ) +static int Object_setDupliGroup( BPy_Object * self, PyObject * value ) { - Object *ob= self->object; - - if( (PyObject *)args == Py_None ) { - if (ob->dup_group) - ob->dup_group->id.us--; - - ob->dup_group = NULL; - } else if( BPy_Group_Check( args ) ) { - if (ob->dup_group) - ob->dup_group->id.us--; - - ob->dup_group = args->group; - id_us_plus(&ob->dup_group->id); - } else { - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a group or None" ); - } - return 0; + return GenericLib_assignData(value, (void **) &self->object->dup_group, 0, 1, ID_GR, 0); } static PyObject *Object_getEffects( BPy_Object * self ) @@ -4307,43 +4290,7 @@ static int Object_setLayersMask( BPy_Object *self, PyObject *value ) static int Object_setIpo( BPy_Object * self, PyObject * value ) { - Ipo *ipo = NULL; - Ipo *oldipo = self->object->ipo; - ID *id; - - /* if parameter is not None, check for valid Ipo */ - - if ( value != Py_None ) { - if ( !Ipo_CheckPyObject( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an Ipo object" ); - - ipo = Ipo_FromPyObject( value ); - - if( !ipo ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "null ipo!" ); - - if( ipo->blocktype != ID_OB ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Ipo is not a object data Ipo" ); - } - - /* if already linked to Ipo, delete link */ - - if ( oldipo ) { - id = &oldipo->id; - if( id->us > 0 ) - id->us--; - } - - /* assign new Ipo and increment user count, or set to NULL if deleting */ - - self->object->ipo = ipo; - if ( ipo ) - id_us_plus(&ipo->id); - - return 0; + return GenericLib_assignData(value, (void **) &self->object->ipo, 0, 1, ID_IP, ID_OB); } static PyObject *Object_getOopsLoc( BPy_Object * self ) @@ -4434,20 +4381,13 @@ static int Object_setOopsSel( BPy_Object * self, PyObject * value ) static int Object_setTracked( BPy_Object * self, PyObject * value ) { - Object *ob = self->object; - - if( value != Py_None && !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an object argument" ); - - if( value != Py_None ) - ob->track = ((BPy_Object *)value)->object; - else - ob->track = ((BPy_Object *)value)->object; - self->object->recalc |= OB_RECALC_OB; - DAG_scene_sort( G.scene ); - - return 0; + int ret; + ret = GenericLib_assignData(value, (void **) &self->object->track, 0, 0, ID_OB, 0); + if (ret==0) { + self->object->recalc |= OB_RECALC_OB; + DAG_scene_sort( G.scene ); + } + return ret; } /* Localspace matrix */ diff --git a/source/blender/python/api2_2x/Pose.c b/source/blender/python/api2_2x/Pose.c index ea26c855477..364b37d3e67 100644 --- a/source/blender/python/api2_2x/Pose.c +++ b/source/blender/python/api2_2x/Pose.c @@ -962,14 +962,7 @@ static PyObject *PoseBone_getDisplayObject(BPy_PoseBone *self, void *closure) //Sets the pose bones object used for display static int PoseBone_setDisplayObject(BPy_PoseBone *self, PyObject *value, void *closure) { - if (value == Py_None) { - self->posechannel->custom = NULL; - } else if (BPy_Object_Check(value)) { - self->posechannel->custom = Object_FromPyObject(value); - } else { - return EXPP_ReturnIntError(PyExc_AttributeError, "can only assign a Blender Object or None"); - } - return 0; + return GenericLib_assignData(value, (void **) &self->posechannel->custom, 0, 0, ID_OB, 0); } //------------------------PoseBone.hasIK (getter) diff --git a/source/blender/python/api2_2x/Scene.c b/source/blender/python/api2_2x/Scene.c index ffe6ca7510e..8c8c2bda89c 100644 --- a/source/blender/python/api2_2x/Scene.c +++ b/source/blender/python/api2_2x/Scene.c @@ -368,27 +368,8 @@ static PyObject *Scene_getWorld( BPy_Scene * self ) static int Scene_setWorld( BPy_Scene * self, PyObject * value ) { - World *world=NULL; - SCENE_DEL_CHECK_INT(self); - - /* accepts a World or None */ - if (BPy_World_Check(value)) { - world = World_FromPyObject(value); - } else if (value != Py_None) { - return ( EXPP_ReturnIntError( PyExc_TypeError, - "expected a world object" ) ); - } - - /* If there is a world then it now has one less user */ - if( self->scene->world ) - self->scene->world->id.us--; - - if (world) - world->id.us++; - - G.scene->world = world; - return 0; + return GenericLib_assignData(value, (void **) &self->scene->world, NULL, 1, ID_WO, 0); } /* accessed from scn.objects */ @@ -398,8 +379,6 @@ static PyObject *Scene_getObjects( BPy_Scene *self) return SceneObSeq_CreatePyObject(self, NULL, 0); } - - static PyObject *Scene_getCursor( BPy_Scene * self ) { SCENE_DEL_CHECK_PY(self); @@ -1685,30 +1664,21 @@ PyObject *SceneObSeq_getCamera(BPy_SceneObSeq *self) static int SceneObSeq_setCamera(BPy_SceneObSeq *self, PyObject *value) { SCENE_DEL_CHECK_INT(self->bpyscene); - + int ret; if (self->mode!=EXPP_OBSEQ_NORMAL) return (EXPP_ReturnIntError( PyExc_TypeError, "cannot set camera from objects.selected or objects.context" )); - if (value==Py_None) { - self->bpyscene->scene->camera= NULL; - return 0; - } - - if (!BPy_Object_Check(value)) - return (EXPP_ReturnIntError( PyExc_ValueError, - "Object or None types can only be assigned to camera!" )); - - self->bpyscene->scene->camera= ((BPy_Object *)value)->object; + ret = GenericLib_assignData(value, (void **) &self->bpyscene->scene->camera, 0, 0, ID_OB, 0); /* if this is the current scene, update its window now */ - if( !G.background && self->bpyscene->scene == G.scene ) /* Traced a crash to redrawing while in background mode -Campbell */ + if( ret == 0 && !G.background && self->bpyscene->scene == G.scene ) /* Traced a crash to redrawing while in background mode -Campbell */ copy_view3d_lock( REDRAW ); /* XXX copy_view3d_lock(REDRAW) prints "bad call to addqueue: 0 (18, 1)". * The same happens in bpython. */ - - return 0; + + return ret; } diff --git a/source/blender/python/api2_2x/Texture.c b/source/blender/python/api2_2x/Texture.c index 67120b5f6c6..1f2f54aadd3 100644 --- a/source/blender/python/api2_2x/Texture.c +++ b/source/blender/python/api2_2x/Texture.c @@ -2662,9 +2662,7 @@ static PyObject *Texture_getColorband( BPy_Texture * self) int Texture_setColorband( BPy_Texture * self, PyObject * value) { - if (!self->texture->coba) - self->texture->coba = MEM_callocN( sizeof(ColorBand), "colorband"); - return EXPP_Colorband_fromPyList( self->texture->coba, value ); + return EXPP_Colorband_fromPyList( &self->texture->coba, value ); } static PyObject *Texture_evaluate( BPy_Texture * self, PyObject * args ) diff --git a/source/blender/python/api2_2x/World.c b/source/blender/python/api2_2x/World.c index cb7dee16194..95436027f8c 100644 --- a/source/blender/python/api2_2x/World.c +++ b/source/blender/python/api2_2x/World.c @@ -522,35 +522,7 @@ static PyObject *World_getIpo( BPy_World * self ) static int World_setIpo( BPy_World * self, PyObject * value ) { - Ipo *ipo = NULL; - Ipo *oldipo; - - if( !BPy_Ipo_Check(value) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected Ipo as argument" ); - - ipo = Ipo_FromPyObject( value ); - - if( !ipo ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "null ipo!" ); - - if( ipo->blocktype != ID_WO ) - return EXPP_ReturnIntError( PyExc_TypeError, - "this ipo is not a World type ipo" ); - - oldipo = self->world->ipo; - if( oldipo ) { - ID *id = &oldipo->id; - if( id->us > 0 ) - id->us--; - } - - id_us_plus(&ipo->id); - - self->world->ipo = ipo; - - return 0; + return GenericLib_assignData(value, (void **) &self->world->ipo, 0, 1, ID_IP, ID_WO); } static PyObject *World_oldsetIpo( BPy_World * self, PyObject * args ) diff --git a/source/blender/python/api2_2x/gen_utils.c b/source/blender/python/api2_2x/gen_utils.c index 46fb1e40961..d47c53448e2 100644 --- a/source/blender/python/api2_2x/gen_utils.c +++ b/source/blender/python/api2_2x/gen_utils.c @@ -49,6 +49,14 @@ #include "constant.h" +/* GenericLib */ +#include "World.h" +#include "Object.h" +#include "Texture.h" +#include "Ipo.h" +#include "DNA_object_types.h" +#include "DNA_ipo_types.h" + /*---------------------- EXPP_FloatsAreEqual ------------------------- Floating point comparisons floatStep = number of representable floats allowable in between @@ -1039,3 +1047,78 @@ PyObject * GenericLib_setName_with_method( void *self, PyObject *args ) return EXPP_setterWrapper( (void *)self, args, (setter)GenericLib_setName ); } + +/* returns the Blender lib type code from a PyObject + -1 for no match, only give this function libdata */ +short GenericLib_getType(PyObject * pydata) +{ + //~ if (BPy_Scene_Check(pydata)) return ID_SCE; + if (BPy_Object_Check(pydata)) return ID_OB; + //~ if (BPy_Mesh_Check(pydata)) return ID_ME; + //~ if (BPy_Curve_Check(pydata)) return ID_CU; + //~ if (BPy_Metaball_Check(pydata)) return ID_MB; + //~ if (BPy_Material_Check(pydata)) return ID_MA; + if (BPy_Texture_Check(pydata)) return ID_TE; + //~ if (BPy_Image_Check(pydata)) return ID_IM; + //~ //if (BPy_Lattice_Check(pydata)) return ID_LT; + //~ if (BPy_Lamp_Check(pydata)) return ID_LA; + //~ if (BPy_Camera_Check(pydata)) return ID_CA; + if (BPy_Ipo_Check(pydata)) return ID_IP; + if (BPy_World_Check(pydata)) return ID_WO; + //~ //if (BPy_Font_Check(pydata)) return ID_VF; + //~ if (BPy_Text_Check(pydata)) return ID_TXT; + //~ if (BPy_Sound_Check(pydata)) return ID_SO; + //~ if (BPy_Group_Check(pydata)) return ID_GR; + //~ if (BPy_Armature_Check(pydata)) return ID_AR; + //~ if (BPy_Action_Check(pydata)) return ID_AC; + + + + + return -1; +} + + +int GenericLib_assignData(PyObject *value, void **data, void **ndata, short refcount, short type, short subtype) +{ + ID *id=NULL; + + if (*data && ndata && *data == *ndata) { + return EXPP_ReturnIntError( PyExc_TypeError, + "Cannot set this data to its self" ); + + id = ((ID*)*data); + } + if (value == Py_None) { + *data = NULL; + if (refcount && id) id->us--; + } else if (GenericLib_getType(value) == type) { + + /* object subtypes */ + if (subtype != 0) { + if (type == ID_OB) { + Object *ob= ((BPy_GenericLib *)value)->id; + if (ob->type != subtype) + return EXPP_ReturnIntError( PyExc_TypeError, + "Object type not supported" ); + } + + if (type == ID_IP) { + Ipo *ipo = ((BPy_GenericLib *)value)->id; + if (ipo->blocktype != subtype) + return EXPP_ReturnIntError( PyExc_TypeError, + "Ipo type does is not compatible" ); + } + + + } + if (refcount && id) id->us--; + id = ((BPy_GenericLib *)value)->id; + id->us++; + *data = id; + } else { + return EXPP_ReturnIntError( PyExc_TypeError, + "Could not assign Python Type - None or Library Object" ); + } + return 0; +} diff --git a/source/blender/python/api2_2x/gen_utils.h b/source/blender/python/api2_2x/gen_utils.h index f34aa22b57b..2e4a52a286b 100644 --- a/source/blender/python/api2_2x/gen_utils.h +++ b/source/blender/python/api2_2x/gen_utils.h @@ -169,7 +169,6 @@ typedef struct { } BPy_GenericLib; - /* ID functions for all libdata */ #define GENERIC_LIB_GETSETATTR \ {"name",\ @@ -194,8 +193,6 @@ typedef struct { NULL} - - int GenericLib_setName( void *self, PyObject *value ); PyObject *GenericLib_getName( void *self ); PyObject *GenericLib_getFakeUser( void *self ); @@ -207,4 +204,7 @@ PyObject *GenericLib_getProperties( void *self ); /* use this for oldstyle somedata.getName("name") */ PyObject * GenericLib_setName_with_method( void *self, PyObject *value ); +int GenericLib_assignData(PyObject *value, void **data, void **ndata, short refcount, short type, short subtype); +short GenericLib_getType(PyObject * pydata); + #endif /* EXPP_gen_utils_h */ |