diff options
author | Campbell Barton <ideasman42@gmail.com> | 2007-03-11 07:05:45 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2007-03-11 07:05:45 +0300 |
commit | 1135434ed18b4d89505ce0ce9673bf801e4b48e7 (patch) | |
tree | e28fbb3300ca1e5013ea2719bfae0c6173d15176 /source/blender/python/api2_2x/gen_library.c | |
parent | 36eba6eb6c733bae0283758e7689595af023c401 (diff) |
moved python functions that deal with blender libdata into gen_library.c from gen_utils and BPY_interface
small cleanup, removed unused functions and explicetly cast pointers..
Diffstat (limited to 'source/blender/python/api2_2x/gen_library.c')
-rw-r--r-- | source/blender/python/api2_2x/gen_library.c | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/source/blender/python/api2_2x/gen_library.c b/source/blender/python/api2_2x/gen_library.c new file mode 100644 index 00000000000..af7b031f0fc --- /dev/null +++ b/source/blender/python/api2_2x/gen_library.c @@ -0,0 +1,308 @@ +#include "gen_library.h" +#include "gen_utils.h" /*This must come first*/ + +/* use for GenericLib_getProperties */ +#include "BKE_idprop.h" +#include "IDProp.h" + +#include "BKE_global.h" +#include "BKE_main.h" +#include "BKE_library.h" + +/* GenericLib */ +#include "World.h" +#include "Font.h" +#include "Metaball.h" +#include "Curve.h" +#include "Camera.h" +#include "NLA.h" +#include "Lattice.h" +#include "Armature.h" +#include "Lamp.h" +#include "Text.h" +#include "Sound.h" +#include "Scene.h" +#include "Mesh.h" +#include "Group.h" +#include "Object.h" +#include "Texture.h" +#include "Ipo.h" +#include "DNA_object_types.h" +#include "DNA_ipo_types.h" + + + +/* Generic get/set attrs */ +PyObject *GenericLib_getName( void *self ) +{ + ID *id = ((BPy_GenericLib *)self)->id; + if (!id) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "data has been removed" ) ); + return PyString_FromString( id->name + 2 ); +} + +int GenericLib_setName( void *self, PyObject *value ) +{ + ID *id = ((BPy_GenericLib *)self)->id; + char *name = NULL; + if (!id) return ( EXPP_ReturnIntError( PyExc_RuntimeError, "data has been removed" ) ); + + name = PyString_AsString ( value ); + if( !name ) + return EXPP_ReturnIntError( PyExc_TypeError, + "expected string argument" ); + + rename_id( id, name ); + + return 0; +} + +PyObject *GenericLib_getFakeUser( void *self ) +{ + ID *id = ((BPy_GenericLib *)self)->id; + if (!id) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "data has been removed" ) ); + if (id->flag & LIB_FAKEUSER) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} + +int GenericLib_setFakeUser( void *self, PyObject *value ) +{ + int param; + ID *id = ((BPy_GenericLib *)self)->id; + if (!id) return ( EXPP_ReturnIntError( PyExc_RuntimeError, "data has been removed" ) ); + + param = PyObject_IsTrue( value ); + if( param == -1 ) + return EXPP_ReturnIntError( PyExc_TypeError, + "expected int argument in range [0,1]" ); + + if (param) { + if (!(id->flag & LIB_FAKEUSER)) { + id->flag |= LIB_FAKEUSER; + id_us_plus(id); + } + } else { + if (id->flag & LIB_FAKEUSER) { + id->flag &= ~LIB_FAKEUSER; + id->us--; + } + } + return 0; +} + +/* read only */ +PyObject *GenericLib_getLib( void *self ) +{ + ID *id = ((BPy_GenericLib *)self)->id; + if (!id) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "data has been removed" ) ); + + if (id->lib) + return PyString_FromString(id->lib->name); + else + return EXPP_incr_ret( Py_None ); +} + +PyObject *GenericLib_getUsers( void *self ) +{ + ID *id = ((BPy_GenericLib *)self)->id; + if (!id) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "data has been removed" ) ); + return PyInt_FromLong(id->us); +} + +PyObject *GenericLib_getProperties( void *self ) +{ + ID *id = ((BPy_GenericLib *)self)->id; + if (!id) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "data has been removed" ) ); + return BPy_Wrap_IDProperty( id, IDP_GetProperties(id, 1), NULL ); +} + +/* use for any.setName("name")*/ +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 + * + * At the moment this is only used by GenericLib_assignData + * so not all types are needed. + */ +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; +} + + +/* + * This function is used to assign a PyObject representing + * blender libdata to a pointer. + * + * Python examples of this are... + * ob.DupGroup = dupliGroup + * mesh.texMesh = texme + * ob.ipo = None + * + * This function deals with type checking, data usercounts, + * and raising errors. + * + * value - python value + * data - Blender pointer to assign value to + * ndata - Use this if there is a value data cannot be. + * for instance, a curve's curve modifier cant point to its self. + * refcount - non zero values will modify blenders user count. + * type - ID type. + * subtype - used only for objects and IPO's to stop the wrong types of obs/ipos + * being assigned. + * + */ +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= (Object *)(((BPy_GenericLib *)value)->id); + if (ob->type != subtype) + return EXPP_ReturnIntError( PyExc_TypeError, + "Object type not supported" ); + } + + if (type == ID_IP) { + Ipo *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; +} + + +/* + * returns the ID of the object with given name + * from a given list. + */ +ID *GetIdFromList( ListBase * list, char *name ) +{ + ID *id = list->first; + + while( id ) { + if( strcmp( name, id->name + 2 ) == 0 ) + break; + id = id->next; + } + + return id; +} + + +PyObject *GetPyObjectFromID( ID * id ) +{ + switch ( MAKE_ID2( id->name[0], id->name[1] ) ) { + case ID_SCE: + return Scene_CreatePyObject( ( Scene *) id ); + break; + case ID_OB: + return Object_CreatePyObject( (Object *) id ); + break; + case ID_ME: + return Mesh_CreatePyObject( (Mesh *)id, NULL ); + break; + case ID_CU: /*todo, support curnurbs?*/ + return Curve_CreatePyObject((Curve *)id); + break; + case ID_MB: + return Metaball_CreatePyObject((MetaBall *)id); + break; + case ID_MA: + return Material_CreatePyObject((Material *)id); + break; + case ID_TE: + return Texture_CreatePyObject((Tex *)id); + break; + case ID_IM: + return Image_CreatePyObject((Image *)id); + break; + case ID_LT: + return Lattice_CreatePyObject((Lattice *)id); + break; + case ID_LA: + return Lamp_CreatePyObject((Lamp *)id); + break; + case ID_CA: + return Camera_CreatePyObject((Camera *)id); + break; + case ID_IP: + return Ipo_CreatePyObject((Ipo *)id); + break; + case ID_WO: + return World_CreatePyObject((World *)id); + break; + case ID_VF: + return Font_CreatePyObject((VFont *)id); + break; + case ID_TXT: + return Text_CreatePyObject((Text *)id); + break; + case ID_SO: + return Sound_CreatePyObject((bSound *)id); + break; + case ID_GR: + return Group_CreatePyObject((Group *)id); + break; + case ID_AR: + return Armature_CreatePyObject((bArmature *)id); + break; + case ID_AC: + return Action_CreatePyObject((bAction *)id); + break; + } + Py_RETURN_NONE; +} + |