diff options
Diffstat (limited to 'source/blender/python/api2_2x/Modifier.c')
-rw-r--r-- | source/blender/python/api2_2x/Modifier.c | 227 |
1 files changed, 119 insertions, 108 deletions
diff --git a/source/blender/python/api2_2x/Modifier.c b/source/blender/python/api2_2x/Modifier.c index e6711a2b6d5..80d5c565087 100644 --- a/source/blender/python/api2_2x/Modifier.c +++ b/source/blender/python/api2_2x/Modifier.c @@ -34,6 +34,7 @@ #include "DNA_object_types.h" #include "DNA_effect_types.h" +#include "DNA_armature_types.h" #include "DNA_vec_types.h" #include "BKE_main.h" @@ -111,9 +112,6 @@ static PyObject *Modifier_getName( BPy_Modifier * self ); static int Modifier_setName( BPy_Modifier * self, PyObject *arg ); static PyObject *Modifier_getType( BPy_Modifier * self ); -static PyObject *Modifier_moveUp( BPy_Modifier * self ); -static PyObject *Modifier_moveDown( BPy_Modifier * self ); - static PyObject *Modifier_getData( BPy_Modifier * self, PyObject * key ); static int Modifier_setData( BPy_Modifier * self, PyObject * key, PyObject * value ); @@ -123,10 +121,6 @@ static int Modifier_setData( BPy_Modifier * self, PyObject * key, /*****************************************************************************/ static PyMethodDef BPy_Modifier_methods[] = { /* name, method, flags, doc */ - {"up", ( PyCFunction ) Modifier_moveUp, METH_NOARGS, - "Move modifier up in stack"}, - {"down", ( PyCFunction ) Modifier_moveDown, METH_NOARGS, - "Move modifier down in stack"}, {NULL, NULL, 0, NULL} }; @@ -292,41 +286,6 @@ static PyObject *Modifier_getType( BPy_Modifier * self ) return PyInt_FromLong( self->md->type ); } - -/* - * move the modifier up in the stack - */ - -static PyObject *Modifier_moveUp( BPy_Modifier * self ) -{ - if (self->md==NULL) - return (EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This modifier has been removed!" )); - - if( mod_moveUp( self->obj, self->md ) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cannot move above a modifier requiring original data" ); - - Py_RETURN_NONE; -} - -/* - * move the modifier down in the stack - */ - -static PyObject *Modifier_moveDown( BPy_Modifier * self ) -{ - if (self->md==NULL) - return (EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This modifier has been removed!" )); - - if( mod_moveDown( self->obj, self->md ) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cannot move beyond a non-deforming modifier" ); - - Py_RETURN_NONE; -} - static PyObject *subsurf_getter( BPy_Modifier * self, int type ) { SubsurfModifierData *md = ( SubsurfModifierData *)(self->md); @@ -860,7 +819,7 @@ ModifierData *Modifier_FromPyObject( PyObject * pyobj ) * Initialize the interator */ -static PyObject *ModSeq_getIter( BPy_ModSeq * self ) +static PyObject *Modifiers_getIter( BPy_Modifiers * self ) { self->iter = (ModifierData *)self->obj->modifiers.first; return EXPP_incr_ret ( (PyObject *) self ); @@ -870,7 +829,7 @@ static PyObject *ModSeq_getIter( BPy_ModSeq * self ) * Get the next Modifier */ -static PyObject *ModSeq_nextIter( BPy_ModSeq * self ) +static PyObject *Modifiers_nextIter( BPy_Modifiers * self ) { ModifierData *this = self->iter; if( this ) { @@ -884,20 +843,20 @@ static PyObject *ModSeq_nextIter( BPy_ModSeq * self ) /* return the number of modifiers */ -static int ModSeq_length( BPy_ModSeq * self ) +static int Modifiers_length( BPy_Modifiers * self ) { return BLI_countlist( &self->obj->modifiers ); } /* return a modifier */ -static PyObject *ModSeq_item( BPy_ModSeq * self, int i ) +static PyObject *Modifiers_item( BPy_Modifiers * self, int i ) { ModifierData *md = NULL; /* if index is negative, start counting from the end of the list */ if( i < 0 ) - i += ModSeq_length( self ); + i += Modifiers_length( self ); /* skip through the list until we get the modifier or end of list */ @@ -911,13 +870,13 @@ static PyObject *ModSeq_item( BPy_ModSeq * self, int i ) } /*****************************************************************************/ -/* Python BPy_ModSeq sequence table: */ +/* Python BPy_Modifiers sequence table: */ /*****************************************************************************/ -static PySequenceMethods ModSeq_as_sequence = { - ( inquiry ) ModSeq_length, /* sq_length */ +static PySequenceMethods Modifiers_as_sequence = { + ( inquiry ) Modifiers_length, /* sq_length */ ( binaryfunc ) 0, /* sq_concat */ ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) ModSeq_item, /* sq_item */ + ( intargfunc ) Modifiers_item, /* sq_item */ ( intintargfunc ) 0, /* sq_slice */ ( intobjargproc ) 0, /* sq_ass_item */ ( intintobjargproc ) 0, /* sq_ass_slice */ @@ -926,16 +885,49 @@ static PySequenceMethods ModSeq_as_sequence = { ( intargfunc ) 0, /* sq_inplace_repeat */ }; +/* + * helper function to check for a valid modifier argument + */ + +static ModifierData *locate_modifier( BPy_Modifiers *self, PyObject * args ) +{ + BPy_Modifier *pyobj; + ModifierData *md; + + /* check that argument is a modifier */ + if( !PyArg_ParseTuple( args, "O!", &Modifier_Type, &pyobj ) ) + return (ModifierData *)EXPP_ReturnPyObjError( PyExc_TypeError, + "expected an modifier as an argument" ); + + /* check whether modifier has been removed */ + if( !pyobj->md ) + return (ModifierData *)EXPP_ReturnPyObjError( PyExc_RuntimeError, + "This modifier has been removed!" ); + + /* find the modifier in the object's list */ + for( md = self->obj->modifiers.first; md; md = md->next ) + if( md == pyobj->md ) + return md; + + /* return exception if we can't find the modifier */ + return (ModifierData *)EXPP_ReturnPyObjError( PyExc_AttributeError, + "This modifier is not in the object's stack" ); +} + /* create a new modifier at the end of the list */ -static PyObject *ModSeq_append( BPy_ModSeq *self, PyObject *args ) +static PyObject *Modifiers_append( BPy_Modifiers *self, PyObject *args ) { int type; if( !PyArg_ParseTuple( args, "i", &type ) ) - EXPP_ReturnPyObjError( PyExc_TypeError, "expected int argument" ); - if (type<=0 || type >= NUM_MODIFIER_TYPES) /* type 0 is eModifierType_None, should we be able to add one of these? */ - return EXPP_ReturnPyObjError( PyExc_TypeError, "int argument out of range, expected an int from Blender.Modifier.Type" ); + return EXPP_ReturnPyObjError( PyExc_TypeError, + "expected int argument" ); + + /* type 0 is eModifierType_None, should we be able to add one of these? */ + if( type <= 0 || type >= NUM_MODIFIER_TYPES ) + return EXPP_ReturnPyObjError( PyExc_ValueError, + "int argument out of range, expected an int from Blender.Modifier.Type" ); BLI_addtail( &self->obj->modifiers, modifier_new( type ) ); return Modifier_CreatePyObject( self->obj, self->obj->modifiers.last ); @@ -943,84 +935,101 @@ static PyObject *ModSeq_append( BPy_ModSeq *self, PyObject *args ) /* remove an existing modifier */ -static PyObject *ModSeq_remove( BPy_ModSeq *self, PyObject *args ) +static PyObject *Modifiers_remove( BPy_Modifiers *self, PyObject *args ) { - PyObject *pyobj; - Object *obj; - ModifierData *md_v, *md; + ModifierData *md = locate_modifier( self, args ); + BPy_Modifier *py_obj; - /* check that argument is a modifier */ - if( !PyArg_ParseTuple( args, "O!", &Modifier_Type, &pyobj ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a modifier as an argument" ); + /* if we can't locate the modifier, return (exception already set) */ + if( !md ) + return (PyObject *)NULL; - /* - * check that modseq and modifier refer to the same object (this is - * more for user sanity than anything else) - */ + /* do the actual removal */ + BLI_remlink( &self->obj->modifiers, md ); + modifier_free( md ); - if( self->obj != ( ( BPy_Modifier * ) pyobj )->obj ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "modifier does not belong to this object" ); + /* erase the link to the modifier */ + py_obj = ( BPy_Modifier * )PyTuple_GET_ITEM( args, 0 ); + py_obj->md = NULL; - md_v = ( ( BPy_Modifier * ) pyobj )->md; + Py_RETURN_NONE; +} - if (md_v==NULL) +/* move the modifier up in the stack */ + +static PyObject *Modifiers_moveUp( BPy_Modifiers * self, PyObject * args ) +{ + ModifierData *md = locate_modifier( self, args ); + + /* if we can't locate the modifier, return (exception already set) */ + if( !md ) + return (PyObject *)NULL; + + if( mod_moveUp( self->obj, md ) ) return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This modifier has already been removed!" ); - - /* verify the modifier is still in the object's modifier */ - obj = self->obj; - for (md=obj->modifiers.first; md; md=md->next) - if (md==md_v) - break; - if (!md) + "cannot move above a modifier requiring original data" ); + + Py_RETURN_NONE; +} + +/* move the modifier down in the stack */ + +static PyObject *Modifiers_moveDown( BPy_Modifiers * self, PyObject *args ) +{ + ModifierData *md = locate_modifier( self, args ); + + /* if we can't locate the modifier, return (exception already set) */ + if( !md ) + return (PyObject *)NULL; + + if( mod_moveDown( self->obj, md ) ) return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This modifier is no longer in the object's stack" ); + "cannot move beyond a non-deforming modifier" ); - /* do the actual removal */ - BLI_remlink(&(obj->modifiers), md_v); - modifier_free(md_v); - ( ( BPy_Modifier * ) pyobj )->md= NULL; Py_RETURN_NONE; } + /*****************************************************************************/ -/* Function: ModSeq_dealloc */ +/* Function: Modifiers_dealloc */ /* Description: This is a callback function for the BPy_Modifier type. It */ /* destroys data when the object is deleted. */ /*****************************************************************************/ -static void ModSeq_dealloc( BPy_Modifier * self ) +static void Modifiers_dealloc( BPy_Modifier * self ) { PyObject_DEL( self ); } /*****************************************************************************/ -/* Python BPy_ModSeq methods table: */ +/* Python BPy_Modifiers methods table: */ /*****************************************************************************/ -static PyMethodDef BPy_ModSeq_methods[] = { +static PyMethodDef BPy_Modifiers_methods[] = { /* name, method, flags, doc */ - {"append", ( PyCFunction ) ModSeq_append, METH_VARARGS, + {"append", ( PyCFunction ) Modifiers_append, METH_VARARGS, "(type) - add a new modifier, where type is the type of modifier"}, - {"remove", ( PyCFunction ) ModSeq_remove, METH_VARARGS, + {"remove", ( PyCFunction ) Modifiers_remove, METH_VARARGS, "(modifier) - remove an existing modifier, where modifier is a modifier from this object."}, + {"moveUp", ( PyCFunction ) Modifiers_moveUp, METH_VARARGS, + "(modifier) - Move a modifier up in stack"}, + {"moveDown", ( PyCFunction ) Modifiers_moveDown, METH_VARARGS, + "(modifier) - Move a modifier down in stack"}, {NULL, NULL, 0, NULL} }; /*****************************************************************************/ -/* Python ModSeq_Type structure definition: */ +/* Python Modifiers_Type structure definition: */ /*****************************************************************************/ -PyTypeObject ModSeq_Type = { +PyTypeObject Modifiers_Type = { PyObject_HEAD_INIT( NULL ) /* required py macro */ 0, /* ob_size */ /* For printing, in format "<module>.<name>" */ - "Blender Modifier Sequence",/* char *tp_name; */ - sizeof( BPy_ModSeq ), /* int tp_basicsize; */ + "Blender.Modifiers", /* char *tp_name; */ + sizeof( BPy_Modifiers ), /* int tp_basicsize; */ 0, /* tp_itemsize; For allocation */ /* Methods to implement standard operations */ - ( destructor ) ModSeq_dealloc,/* destructor tp_dealloc; */ + ( destructor ) Modifiers_dealloc,/* destructor tp_dealloc; */ NULL, /* printfunc tp_print; */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ @@ -1030,7 +1039,7 @@ PyTypeObject ModSeq_Type = { /* Method suites for standard classes */ NULL, /* PyNumberMethods *tp_as_number; */ - &ModSeq_as_sequence, /* PySequenceMethods *tp_as_sequence; */ + &Modifiers_as_sequence, /* PySequenceMethods *tp_as_sequence; */ NULL, /* PyMappingMethods *tp_as_mapping; */ /* More standard operations (here for binary compatibility) */ @@ -1064,11 +1073,11 @@ PyTypeObject ModSeq_Type = { /*** Added in release 2.2 ***/ /* Iterators */ - ( getiterfunc )ModSeq_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc )ModSeq_nextIter, /* iternextfunc tp_iternext; */ + ( getiterfunc )Modifiers_getIter, /* getiterfunc tp_iter; */ + ( iternextfunc )Modifiers_nextIter, /* iternextfunc tp_iternext; */ /*** Attribute descriptor and subclassing stuff ***/ - BPy_ModSeq_methods, /* struct PyMethodDef *tp_methods; */ + BPy_Modifiers_methods, /* struct PyMethodDef *tp_methods; */ NULL, /* struct PyMemberDef *tp_members; */ NULL, /* struct PyGetSetDef *tp_getset; */ NULL, /* struct _typeobject *tp_base; */ @@ -1093,17 +1102,17 @@ PyTypeObject ModSeq_Type = { }; /*****************************************************************************/ -/* Function: ModSeq_CreatePyObject */ -/* Description: This function will create a new BPy_ModSeq from an existing */ -/* ListBase structure. */ +/* Function: Modifiers_CreatePyObject */ +/* Description: This function will create a new BPy_Modifiers from an */ +/* existing ListBase structure. */ /*****************************************************************************/ PyObject *ModSeq_CreatePyObject( Object *obj ) { - BPy_ModSeq *pymod; - pymod = ( BPy_ModSeq * ) PyObject_NEW( BPy_ModSeq, &ModSeq_Type ); + BPy_Modifiers *pymod; + pymod = ( BPy_Modifiers * ) PyObject_NEW( BPy_Modifiers, &Modifiers_Type ); if( !pymod ) return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_ModSeq object" ); + "couldn't create BPy_Modifiers object" ); pymod->obj = obj; return ( PyObject * ) pymod; } @@ -1248,10 +1257,12 @@ PyObject *Modifier_Init( void ) PyObject *TypeDict = M_Modifier_TypeDict( ); PyObject *SettingsDict = M_Modifier_SettingsDict( ); - if( PyType_Ready( &ModSeq_Type ) < 0 || PyType_Ready( &Modifier_Type ) < 0 ) + if( PyType_Ready( &Modifiers_Type ) < 0 || + PyType_Ready( &Modifier_Type ) < 0 ) return NULL; - submodule = Py_InitModule3( "Blender.Modifier", NULL, "Modifer module for accessing and creating object modifier data" ); + submodule = Py_InitModule3( "Blender.Modifier", NULL, + "Modifer module for accessing and creating object modifier data" ); if( TypeDict ) PyModule_AddObject( submodule, "Type", TypeDict ); |