diff options
author | Campbell Barton <ideasman42@gmail.com> | 2007-02-25 04:07:28 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2007-02-25 04:07:28 +0300 |
commit | 75147698e2b8765022097203b9bb1291a105f2d8 (patch) | |
tree | a74dc1f9874be70936a5faf73811c91e17ee99be /source/blender | |
parent | f791672e76f90b360920c0d644d1f15f87dbd0e4 (diff) |
Scene
* Moved to getsetattrs
* added scene.users (get)
* added scene.fakeUser (get/set)
* added scene.world (get/set)
* added scene.timeline (get)
* added scene.render (get)
* added scene.radiosity (get)
* added scene.objects.camera (get/set)
Group
* added properties
gen_utils
* made getScriptLinks work as documented, return an empty list rather then None.
header files, noted libdata after PyObject as a requirement.
Others,
* Deprecate prints for older functionality
EpyDocs still need updating.
Diffstat (limited to 'source/blender')
28 files changed, 493 insertions, 256 deletions
diff --git a/source/blender/python/api2_2x/Curve.h b/source/blender/python/api2_2x/Curve.h index 38e977adbdc..8fdf76781dc 100644 --- a/source/blender/python/api2_2x/Curve.h +++ b/source/blender/python/api2_2x/Curve.h @@ -43,7 +43,7 @@ extern PyTypeObject Curve_Type; /* Python BPy_Curve structure definition */ typedef struct { PyObject_HEAD /* required py macro */ - Curve * curve; + Curve * curve; /* libdata must be second */ /* pointer for iterator: does not point to owned memory */ Nurb *iter_pointer; } BPy_Curve; diff --git a/source/blender/python/api2_2x/Font.h b/source/blender/python/api2_2x/Font.h index 807d4cbe373..097cbd47416 100644 --- a/source/blender/python/api2_2x/Font.h +++ b/source/blender/python/api2_2x/Font.h @@ -40,7 +40,7 @@ extern PyTypeObject Font_Type; typedef struct { PyObject_HEAD /* required py macro */ - VFont * font; + VFont * font; /* libdata must be second */ } BPy_Font; /*------------------------------visible prototypes----------------------*/ diff --git a/source/blender/python/api2_2x/Group.c b/source/blender/python/api2_2x/Group.c index 4fb3a4c099b..413f069305f 100755 --- a/source/blender/python/api2_2x/Group.c +++ b/source/blender/python/api2_2x/Group.c @@ -214,6 +214,20 @@ static int Group_compare( BPy_Group * a, BPy_Group * b ); /*****************************************************************************/ /* Python BPy_Group methods: */ /*****************************************************************************/ +static PyObject *Group_getName( BPy_Group * self ) +{ + PyObject *attr; + GROUP_DEL_CHECK_PY(self); + + attr = PyString_FromString( self->group->id.name + 2 ); + + if( attr ) + return attr; + + return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, + "couldn't get Group.name attribute" ) ); +} + static int Group_setName( BPy_Group * self, PyObject * value ) { char *name = NULL; @@ -230,21 +244,6 @@ static int Group_setName( BPy_Group * self, PyObject * value ) return 0; } - -static PyObject *Group_getName( BPy_Group * self ) -{ - PyObject *attr; - GROUP_DEL_CHECK_PY(self); - - attr = PyString_FromString( self->group->id.name + 2 ); - - if( attr ) - return attr; - - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get Group.name attribute" ) ); -} - static PyObject *Group_getLib( BPy_Group * self ) { GROUP_DEL_CHECK_PY(self); @@ -273,6 +272,11 @@ static int Group_setFakeUser( BPy_Group * self, PyObject * value ) return SetIdFakeUser(&self->group->id, value); } +static PyObject *Group_getProperties( BPy_Group * self ) +{ + /*sanity check, we set parent property type to Group here*/ + return BPy_Wrap_IDProperty( (ID*)self->group, IDP_GetProperties((ID*)self->group, 1), NULL ); +} /*****************************************************************************/ @@ -325,6 +329,9 @@ static PyGetSetDef BPy_Group_getseters[] = { (getter)Group_getFakeUser, (setter)Group_setFakeUser, "Groups fake user state", NULL}, + {"properties", + (getter)Group_getProperties, NULL, + "get the ID properties associated with this group"}, {"layers", (getter)Group_getLayers, (setter)Group_setLayers, "Number of group users", diff --git a/source/blender/python/api2_2x/Group.h b/source/blender/python/api2_2x/Group.h index 62f2ceb10b6..613a14908a9 100755 --- a/source/blender/python/api2_2x/Group.h +++ b/source/blender/python/api2_2x/Group.h @@ -48,7 +48,7 @@ extern PyTypeObject GroupObSeq_Type; /*****************************************************************************/ typedef struct { PyObject_HEAD /* required python macro */ - struct Group *group; /* Blender group type, can be NULL when unlinked */ + struct Group *group; /* Blender group type, can be NULL when unlinkedm, libdata must be second */*/ } BPy_Group; diff --git a/source/blender/python/api2_2x/Image.h b/source/blender/python/api2_2x/Image.h index 70509a8f7f8..e5955e4df2e 100644 --- a/source/blender/python/api2_2x/Image.h +++ b/source/blender/python/api2_2x/Image.h @@ -42,7 +42,7 @@ /*****************************************************************************/ typedef struct { PyObject_HEAD - Image * image; + Image * image; /* libdata must be second */ } BPy_Image; diff --git a/source/blender/python/api2_2x/Ipo.h b/source/blender/python/api2_2x/Ipo.h index 95aa5a729a2..1be7b6bf54f 100644 --- a/source/blender/python/api2_2x/Ipo.h +++ b/source/blender/python/api2_2x/Ipo.h @@ -41,7 +41,7 @@ /*****************************************************************************/ typedef struct { PyObject_HEAD /* required macro */ - Ipo * ipo; + Ipo * ipo; /* libdata must be second */ short iter; short mtex; } BPy_Ipo; diff --git a/source/blender/python/api2_2x/Key.h b/source/blender/python/api2_2x/Key.h index 10007e417d4..6def2944d89 100644 --- a/source/blender/python/api2_2x/Key.h +++ b/source/blender/python/api2_2x/Key.h @@ -47,7 +47,7 @@ extern PyTypeObject KeyBlock_Type; typedef struct { PyObject_HEAD /* required python macro */ - Key * key; + Key * key; /* libdata must be second */ /* Object *object;*/ /* for vertex grouping info, since it's stored on the object */ /*PyObject *keyBlock;*/ PyObject *ipo; diff --git a/source/blender/python/api2_2x/Lamp.h b/source/blender/python/api2_2x/Lamp.h index e96073be50e..9042ab12ed4 100644 --- a/source/blender/python/api2_2x/Lamp.h +++ b/source/blender/python/api2_2x/Lamp.h @@ -45,7 +45,7 @@ extern PyTypeObject Lamp_Type; /* Python BPy_Lamp structure definition */ typedef struct { PyObject_HEAD /* required py macro */ - Lamp * lamp; + Lamp * lamp; /* libdata must be second */ BPy_rgbTuple *color; } BPy_Lamp; diff --git a/source/blender/python/api2_2x/Lattice.h b/source/blender/python/api2_2x/Lattice.h index 832c1973154..05d8d771193 100644 --- a/source/blender/python/api2_2x/Lattice.h +++ b/source/blender/python/api2_2x/Lattice.h @@ -43,7 +43,7 @@ /*****************************************************************************/ typedef struct { PyObject_HEAD - Lattice * Lattice; + Lattice * Lattice; /* libdata must be second */ } BPy_Lattice; diff --git a/source/blender/python/api2_2x/MTex.h b/source/blender/python/api2_2x/MTex.h index 484d7ba04ec..dfcd2cc00b8 100644 --- a/source/blender/python/api2_2x/MTex.h +++ b/source/blender/python/api2_2x/MTex.h @@ -42,7 +42,8 @@ /*****************************************************************************/ typedef struct { - PyObject_HEAD MTex * mtex; + PyObject_HEAD + MTex * mtex; } BPy_MTex; extern PyTypeObject MTex_Type; diff --git a/source/blender/python/api2_2x/Material.h b/source/blender/python/api2_2x/Material.h index e49aaca1023..382bff552c7 100644 --- a/source/blender/python/api2_2x/Material.h +++ b/source/blender/python/api2_2x/Material.h @@ -43,7 +43,7 @@ /*****************************************************************************/ typedef struct { PyObject_HEAD - Material * material; + Material * material; /* libdata must be second */ BPy_rgbTuple *col, *amb, *spec, *mir; } BPy_Material; diff --git a/source/blender/python/api2_2x/Metaball.h b/source/blender/python/api2_2x/Metaball.h index e2d37ed7706..af04b2099b8 100644 --- a/source/blender/python/api2_2x/Metaball.h +++ b/source/blender/python/api2_2x/Metaball.h @@ -45,7 +45,7 @@ extern PyTypeObject Metaball_Type; /* Python BPy_Metaball structure definition */ typedef struct { PyObject_HEAD /* required py macro */ - MetaBall * metaball; + MetaBall * metaball; /* libdata must be second */ } BPy_Metaball; diff --git a/source/blender/python/api2_2x/NLA.c b/source/blender/python/api2_2x/NLA.c index 61d5c447418..bcac2a3254d 100644 --- a/source/blender/python/api2_2x/NLA.c +++ b/source/blender/python/api2_2x/NLA.c @@ -515,8 +515,7 @@ PyObject *Action_CreatePyObject( struct bAction * act ) { BPy_Action *blen_action; - if(!act) - return EXPP_incr_ret(Py_None); + if(!act) Py_RETURN_NONE; blen_action = ( BPy_Action * ) PyObject_NEW( BPy_Action, &Action_Type ); diff --git a/source/blender/python/api2_2x/NLA.h b/source/blender/python/api2_2x/NLA.h index 219e2f0aa8d..287499ab5e1 100644 --- a/source/blender/python/api2_2x/NLA.h +++ b/source/blender/python/api2_2x/NLA.h @@ -49,7 +49,7 @@ extern PyTypeObject ActionStrips_Type; /** Python BPy_NLA structure definition. */ typedef struct { PyObject_HEAD - bAction * action; + bAction * action; /* libdata must be second */ } BPy_Action; typedef struct { diff --git a/source/blender/python/api2_2x/NMesh.h b/source/blender/python/api2_2x/NMesh.h index 5c689f775b8..d623d737bfa 100644 --- a/source/blender/python/api2_2x/NMesh.h +++ b/source/blender/python/api2_2x/NMesh.h @@ -116,7 +116,7 @@ typedef struct { typedef struct { PyObject_HEAD /* required python macro */ - Mesh * mesh; + Mesh * mesh; /* libdata must be second */ Object *object; /* for vertex grouping info, since it's stored on the object */ PyObject *name; PyObject *materials; diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c index 1593fa2ed1e..6a88ba5bd9b 100644 --- a/source/blender/python/api2_2x/Object.c +++ b/source/blender/python/api2_2x/Object.c @@ -3121,10 +3121,8 @@ PyObject *Object_CreatePyObject( struct Object * obj ) { BPy_Object *blen_object; - if( !obj ) { - Py_RETURN_NONE; - } - + if( !obj ) Py_RETURN_NONE; + blen_object = ( BPy_Object * ) PyObject_NEW( BPy_Object, &Object_Type ); @@ -4625,9 +4623,6 @@ static PyObject *get_obj_data( BPy_Object *self, int mesh ) break; case ID_SCE: break; - case ID_TXT: - data_object = Text_CreatePyObject( object->data ); - break; case OB_FONT: data_object = Text3d_CreatePyObject( object->data ); break; diff --git a/source/blender/python/api2_2x/Object.h b/source/blender/python/api2_2x/Object.h index 5d9951c13c3..5424728728e 100644 --- a/source/blender/python/api2_2x/Object.h +++ b/source/blender/python/api2_2x/Object.h @@ -47,7 +47,7 @@ extern PyTypeObject Object_Type; /*****************************************************************************/ typedef struct { PyObject_HEAD - struct Object *object; + struct Object *object; /* libdata must be second */ short realtype; } BPy_Object; diff --git a/source/blender/python/api2_2x/Scene.c b/source/blender/python/api2_2x/Scene.c index 5279142c03b..5b65903a0c6 100644 --- a/source/blender/python/api2_2x/Scene.c +++ b/source/blender/python/api2_2x/Scene.c @@ -67,6 +67,7 @@ struct View3D; #include "Curve.h" #include "NMesh.h" #include "Mesh.h" +#include "World.h" #include "Lattice.h" #include "Metaball.h" #include "IDProp.h" @@ -124,11 +125,10 @@ struct PyMethodDef M_Scene_methods[] = { {NULL, NULL, 0, NULL} }; /*-----------------------BPy_Scene method declarations--------------------*/ -static PyObject *Scene_getName( BPy_Scene * self ); -static PyObject *Scene_setName( BPy_Scene * self, PyObject * arg ); -static PyObject *Scene_getLayers( BPy_Scene * self ); -static PyObject *Scene_setLayers( BPy_Scene * self, PyObject * arg ); -static PyObject *Scene_setLayersMask( BPy_Scene * self, PyObject * arg ); +static PyObject *Scene_oldgetName( BPy_Scene * self ); +static PyObject *Scene_oldsetName( BPy_Scene * self, PyObject * arg ); +static PyObject *Scene_getLayerList( BPy_Scene * self ); +static PyObject *Scene_oldsetLayers( BPy_Scene * self, PyObject * arg ); static PyObject *Scene_copy( BPy_Scene * self, PyObject * arg ); static PyObject *Scene_makeCurrent( BPy_Scene * self ); static PyObject *Scene_update( BPy_Scene * self, PyObject * args ); @@ -145,14 +145,11 @@ static PyObject *Scene_addScriptLink( BPy_Scene * self, PyObject * args ); static PyObject *Scene_clearScriptLinks( BPy_Scene * self, PyObject * args ); static PyObject *Scene_play( BPy_Scene * self, PyObject * args ); static PyObject *Scene_getTimeLine( BPy_Scene * self ); -static PyObject *Scene_getObjects( BPy_Scene * self ); /*internal*/ static void Scene_dealloc( BPy_Scene * self ); -static int Scene_setAttr( BPy_Scene * self, char *name, PyObject * v ); static int Scene_compare( BPy_Scene * a, BPy_Scene * b ); -static PyObject *Scene_getAttr( BPy_Scene * self, char *name ); static PyObject *Scene_repr( BPy_Scene * self ); /*object seq*/ @@ -161,13 +158,13 @@ static PyObject *SceneObSeq_CreatePyObject( BPy_Scene *self, Base *iter, int mod /*-----------------------BPy_Scene method def------------------------------*/ static PyMethodDef BPy_Scene_methods[] = { /* name, method, flags, doc */ - {"getName", ( PyCFunction ) Scene_getName, METH_NOARGS, + {"getName", ( PyCFunction ) Scene_oldgetName, METH_NOARGS, "() - Return Scene name"}, - {"setName", ( PyCFunction ) Scene_setName, METH_VARARGS, + {"setName", ( PyCFunction ) Scene_oldsetName, METH_VARARGS, "(str) - Change Scene name"}, - {"getLayers", ( PyCFunction ) Scene_getLayers, METH_NOARGS, + {"getLayers", ( PyCFunction ) Scene_getLayerList, METH_NOARGS, "() - Return a list of layers int indices which are set in this scene "}, - {"setLayers", ( PyCFunction ) Scene_setLayers, METH_VARARGS, + {"setLayers", ( PyCFunction ) Scene_oldsetLayers, METH_VARARGS, "(layers) - Change layers which are set in this scene\n" "(layers) - list of integers in the range [1, 20]."}, {"copy", ( PyCFunction ) Scene_copy, METH_VARARGS, @@ -230,6 +227,289 @@ static PyMethodDef BPy_Scene_methods[] = { "() - Get time line of this Scene"}, {NULL, NULL, 0, NULL} }; + + +/*****************************************************************************/ +/* Python BPy_Scene methods: */ +/*****************************************************************************/ +static PyObject *Scene_getName( BPy_Scene * self ) +{ + PyObject *attr; + SCENE_DEL_CHECK_PY(self); + + attr = PyString_FromString( self->scene->id.name + 2 ); + + if( attr ) + return attr; + + return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, + "couldn't get Scene.name attribute" ) ); +} + +static int Scene_setName( BPy_Scene * self, PyObject * value ) +{ + char *name = NULL; + + SCENE_DEL_CHECK_INT(self); + + name = PyString_AsString ( value ); + if( !name ) + return EXPP_ReturnIntError( PyExc_TypeError, + "expected string argument" ); + + rename_id( &self->scene->id, name ); + + return 0; +} + +static PyObject *Scene_getLib( BPy_Scene * self ) +{ + SCENE_DEL_CHECK_PY(self); + return EXPP_GetIdLib((ID *)self->scene); + +} + +static PyObject *Scene_getUsers( BPy_Scene * self ) +{ + SCENE_DEL_CHECK_PY(self); + return PyInt_FromLong( self->scene->id.us ); +} + +static PyObject *Scene_getFakeUser( BPy_Scene * self ) +{ + SCENE_DEL_CHECK_PY(self); + if (self->scene->id.flag & LIB_FAKEUSER) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} + +static int Scene_setFakeUser( BPy_Scene * self, PyObject * value ) +{ + SCENE_DEL_CHECK_INT(self); + return SetIdFakeUser(&self->scene->id, value); +} + +static PyObject *Scene_getLayerMask( BPy_Scene * self ) +{ + SCENE_DEL_CHECK_PY(self); + return PyInt_FromLong( self->scene->lay & ((1<<20)-1) ); +} + +static int Scene_setLayerMask( BPy_Scene * self, PyObject * value ) +{ + int laymask = 0; + + SCENE_DEL_CHECK_INT(self); + + if (!PyInt_CheckExact(value)) { + return EXPP_ReturnIntError( PyExc_AttributeError, + "expected an integer (bitmask) as argument" ); + } + + laymask = PyInt_AsLong(value); + + if (laymask <= 0 || laymask > (1<<20) - 1) /* binary: 1111 1111 1111 1111 1111 */ + return EXPP_ReturnIntError( PyExc_AttributeError, + "bitmask must have from 1 up to 20 bits set"); + + self->scene->lay = laymask; + /* if this is the current scene then apply the scene layers value + * to the view layers value: */ + if (G.vd && (self->scene == G.scene)) { + int val, bit = 0; + G.vd->lay = laymask; + + while( bit < 20 ) { + val = 1 << bit; + if( laymask & val ) { + G.vd->layact = val; + break; + } + bit++; + } + } + + return 0; +} + +static PyObject *Scene_getLayerList( BPy_Scene * self ) +{ + PyObject *laylist = PyList_New( 0 ), *item; + int layers, bit = 0, val = 0; + + SCENE_DEL_CHECK_PY(self); + + if( !laylist ) + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "couldn't create pylist!" ) ); + + layers = self->scene->lay; + + while( bit < 20 ) { + val = 1 << bit; + if( layers & val ) { + item = Py_BuildValue( "i", bit + 1 ); + PyList_Append( laylist, item ); + Py_DECREF( item ); + } + bit++; + } + return laylist; +} + +static int Scene_setLayerList( BPy_Scene * self, PyObject * value ) +{ + PyObject *item = NULL; + int layers = 0, val, i, len_list; + + SCENE_DEL_CHECK_INT(self); + + if( !PySequence_Check( value ) ) + return ( EXPP_ReturnIntError( PyExc_TypeError, + "expected a list of integers in the range [1, 20]" ) ); + + len_list = PySequence_Size(value); + + if (len_list == 0) + return ( EXPP_ReturnIntError( PyExc_AttributeError, + "list can't be empty, at least one layer must be set" ) ); + + for( i = 0; i < len_list; i++ ) { + item = PySequence_GetItem( value, i ); + + if( !PyInt_Check( item ) ) { + Py_DECREF( item ); + return EXPP_ReturnIntError + ( PyExc_AttributeError, + "list must contain only integer numbers" ); + } + + val = ( int ) PyInt_AsLong( item ); + if( val < 1 || val > 20 ) + return EXPP_ReturnIntError + ( PyExc_AttributeError, + "layer values must be in the range [1, 20]" ); + + layers |= 1 << ( val - 1 ); + } + self->scene->lay = layers; + + if (G.vd && (self->scene == G.scene)) { + int bit = 0; + G.vd->lay = layers; + + while( bit < 20 ) { + val = 1 << bit; + if( layers & val ) { + G.vd->layact = val; + break; + } + bit++; + } + } + + return 0; +} + +static PyObject *Scene_getWorld( BPy_Scene * self ) +{ + SCENE_DEL_CHECK_PY(self); + + if (!self->scene->world) + Py_RETURN_NONE; + return World_CreatePyObject(self->scene->world); +} + +static int Scene_setWorld( BPy_Scene * self, PyObject * value ) +{ + World *world=NULL; + + SCENE_DEL_CHECK_INT(self); + + if (!BPy_World_Check(value)) + return ( EXPP_ReturnIntError( PyExc_TypeError, + "expected a world object" ) ); + + world = World_FromPyObject(value); + /* If there is a world then it now has one less user */ + if( self->scene->world ) + self->scene->world->id.us--; + world->id.us++; + G.scene->world = world; + return 0; +} + +/* accessed from scn.objects */ +static PyObject *Scene_getObjects( BPy_Scene *self) +{ + SCENE_DEL_CHECK_PY(self); + return SceneObSeq_CreatePyObject(self, NULL, 0); +} + +static PyObject *Scene_GetProperties(BPy_Scene * self) +{ + SCENE_DEL_CHECK_PY(self); + return BPy_Wrap_IDProperty( (ID*)self->scene, IDP_GetProperties((ID*)self->scene, 1), NULL ); +} + +/*****************************************************************************/ +/* Python attributes get/set structure: */ +/*****************************************************************************/ +static PyGetSetDef BPy_Scene_getseters[] = { + {"name", + (getter)Scene_getName, (setter)Scene_setName, + "Scene name", + NULL}, + {"lib", + (getter)Scene_getLib, (setter)NULL, + "Scenes external library path", + NULL}, + {"users", + (getter)Scene_getUsers, (setter)NULL, + "Scenes user count", + NULL}, + {"fakeUser", + (getter)Scene_getFakeUser, (setter)Scene_setFakeUser, + "Scene fake user state", + NULL}, + {"properties", + (getter)Scene_GetProperties, (setter)NULL, + "Scene properties", + NULL}, + {"Layer", + (getter)Scene_getLayerMask, (setter)Scene_setLayerMask, + "Scene layer bitmask", + NULL}, + {"layers", + (getter)Scene_getLayerList, (setter)Scene_setLayerList, + "Scene layer list", + NULL}, + {"world", + (getter)Scene_getWorld, (setter)Scene_setWorld, + "Scene layer bitmask", + NULL}, + {"timeline", + (getter)Scene_getTimeLine, (setter)NULL, + "Scenes timeline (read only)", + NULL}, + {"render", + (getter)Scene_getRenderingContext, (setter)NULL, + "Scenes rendering context (read only)", + NULL}, + {"radiosity", + (getter)Scene_getRadiosityContext, (setter)NULL, + "Scenes radiosity context (read only)", + NULL}, + {"objects", + (getter)Scene_getObjects, (setter)NULL, + "Scene object iterator", + NULL}, + {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ +}; + + + /*-----------------------BPy_Scene method def------------------------------*/ PyTypeObject Scene_Type = { PyObject_HEAD_INIT( NULL ) @@ -239,22 +519,77 @@ PyTypeObject Scene_Type = { 0, /* tp_itemsize */ /* methods */ ( destructor ) Scene_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - ( getattrfunc ) Scene_getAttr, /* tp_getattr */ - ( setattrfunc ) Scene_setAttr, /* tp_setattr */ + NULL, /* printfunc tp_print; */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ ( cmpfunc ) Scene_compare, /* tp_compare */ ( reprfunc ) Scene_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_as_hash */ - 0, 0, 0, 0, 0, 0, - 0, /* tp_doc */ - 0, 0, 0, 0, 0, 0, - BPy_Scene_methods, /* tp_methods */ - 0, /* tp_members */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + + /* Method suites for standard classes */ + + NULL, /* PyNumberMethods *tp_as_number; */ + NULL, /* PySequenceMethods *tp_as_sequence; */ + NULL, /* PyMappingMethods *tp_as_mapping; */ + + /* More standard operations (here for binary compatibility) */ + + NULL, /* hashfunc tp_hash; */ + NULL, /* ternaryfunc tp_call; */ + NULL, /* reprfunc tp_str; */ + NULL, /* getattrofunc tp_getattro; */ + NULL, /* setattrofunc tp_setattro; */ + + /* Functions to access object as input/output buffer */ + NULL, /* PyBufferProcs *tp_as_buffer; */ + + /*** Flags to define presence of optional/expanded features ***/ + Py_TPFLAGS_DEFAULT, /* long tp_flags; */ + + NULL, /* char *tp_doc; Documentation string */ + /*** Assigned meaning in release 2.0 ***/ + /* call function for all accessible objects */ + NULL, /* traverseproc tp_traverse; */ + + /* delete references to contained objects */ + NULL, /* inquiry tp_clear; */ + + /*** Assigned meaning in release 2.1 ***/ + /*** rich comparisons ***/ + NULL, /* richcmpfunc tp_richcompare; */ + + /*** weak reference enabler ***/ + 0, /* long tp_weaklistoffset; */ + + /*** Added in release 2.2 ***/ + /* Iterators */ + NULL, /* getiterfunc tp_iter; */ + NULL, /* iternextfunc tp_iternext; */ + + /*** Attribute descriptor and subclassing stuff ***/ + BPy_Scene_methods, /* struct PyMethodDef *tp_methods; */ + NULL, /* struct PyMemberDef *tp_members; */ + BPy_Scene_getseters, /* struct PyGetSetDef *tp_getset; */ + NULL, /* struct _typeobject *tp_base; */ + NULL, /* PyObject *tp_dict; */ + NULL, /* descrgetfunc tp_descr_get; */ + NULL, /* descrsetfunc tp_descr_set; */ + 0, /* long tp_dictoffset; */ + NULL, /* initproc tp_init; */ + NULL, /* allocfunc tp_alloc; */ + NULL, /* newfunc tp_new; */ + /* Low-level free-memory routine */ + NULL, /* freefunc tp_free; */ + /* For PyObject_IS_GC */ + NULL, /* inquiry tp_is_gc; */ + NULL, /* PyObject *tp_bases; */ + /* method resolution order */ + NULL, /* PyObject *tp_mro; */ + NULL, /* PyObject *tp_cache; */ + NULL, /* PyObject *tp_subclasses; */ + NULL, /* PyObject *tp_weaklist; */ + NULL }; + /*-----------------------Scene module Init())-----------------------------*/ PyObject *Scene_Init( void ) { @@ -283,91 +618,6 @@ static void Scene_dealloc( BPy_Scene * self ) PyObject_DEL( self ); } -/*-----------------------getAttr----------------------------------------*/ -static PyObject *Scene_getAttr( BPy_Scene * self, char *name ) -{ - PyObject *attr = Py_None; - SCENE_DEL_CHECK_PY(self); - - if( strcmp( name, "name" ) == 0 ) - attr = PyString_FromString( self->scene->id.name + 2 ); - - else if ( strcmp( name, "properties" ) == 0 ) - return BPy_Wrap_IDProperty( (ID*)self->scene, IDP_GetProperties((ID*)self->scene, 1), NULL ); - - else if ( strcmp( name, "lib" ) == 0 ) - return EXPP_GetIdLib((ID *)self->scene); - - /* accept both Layer (for compatibility with ob.Layer) and Layers */ - else if( strncmp( name, "Layer", 5 ) == 0 ) - attr = PyInt_FromLong( self->scene->lay & ((1<<20)-1) ); - /* Layers returns a bitmask, layers returns a list of integers */ - else if( strcmp( name, "layers") == 0) - return Scene_getLayers(self); - else if( strcmp( name, "objects") == 0) - return Scene_getObjects(self); - - else if( strcmp( name, "__members__" ) == 0 ) - attr = Py_BuildValue( "[ssssss]", "name", "Layers", "layers", "objects", "properties", "lib"); - - if( !attr ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyObject" ) ); - - if( attr != Py_None ) - return attr; /* member attribute found, return it */ - - /* not an attribute, search the methods table */ - return Py_FindMethod( BPy_Scene_methods, ( PyObject * ) self, name ); -} - -/*-----------------------setAttr----------------------------------------*/ -static int Scene_setAttr( BPy_Scene * self, char *name, PyObject * value ) -{ - PyObject *valtuple; - PyObject *error = NULL; - - SCENE_DEL_CHECK_INT(self); - -/* We're playing a trick on the Python API users here. Even if they use - * Scene.member = val instead of Scene.setMember(val), we end up using the - * function anyway, since it already has error checking, clamps to the right - * interval and updates the Blender Scene structure when necessary. */ - -/* First we put "value" in a tuple, because we want to pass it to functions - * that only accept PyTuples. Using "N" doesn't increment value's ref count */ - valtuple = Py_BuildValue( "(O)", value ); - - if( !valtuple ) /* everything OK with our PyObject? */ - return EXPP_ReturnIntError( PyExc_MemoryError, - "SceneSetAttr: couldn't create PyTuple" ); - -/* Now we just compare "name" with all possible BPy_Scene member variables */ - if( strcmp( name, "name" ) == 0 ) - error = Scene_setName( self, valtuple ); - else if (strncmp(name, "Layer", 5) == 0) - error = Scene_setLayersMask(self, valtuple); - else if (strcmp(name, "layers") == 0) - error = Scene_setLayers(self, valtuple); - - else { /* Error: no member with the given name was found */ - Py_DECREF( valtuple ); - return ( EXPP_ReturnIntError( PyExc_AttributeError, name ) ); - } - -/* valtuple won't be returned to the caller, so we need to DECREF it */ - Py_DECREF( valtuple ); - - if( error != Py_None ) - return -1; - -/* Py_None was incref'ed by the called Scene_set* function. We probably - * don't need to decref Py_None (!), but since Python/C API manual tells us - * to treat it like any other PyObject regarding ref counting ... */ - Py_DECREF( Py_None ); - return 0; /* normal exit */ -} - /*-----------------------compare----------------------------------------*/ static int Scene_compare( BPy_Scene * a, BPy_Scene * b ) { @@ -412,28 +662,6 @@ Scene *Scene_FromPyObject( PyObject * pyobj ) return ( ( BPy_Scene * ) pyobj )->scene; } -/*-----------------------GetSceneByName()-------------------------------*/ -/* Description: Returns the object with the name specified by the argument name. -Note that the calling function has to remove the first two characters of the object name. -These two characters specify the type of the object (OB, ME, WO, ...)The function -will return NULL when no object with the given name is found. */ -Scene *GetSceneByName( char *name ) -{ - Scene *scene_iter; - - scene_iter = G.main->scene.first; - while( scene_iter ) { - if( StringEqual( name, GetIdName( &( scene_iter->id ) ) ) ) { - return ( scene_iter ); - } - scene_iter = scene_iter->id.next; - } - - /* There is no object with the given name */ - return ( NULL ); -} - - /*-----------------------Scene module function defintions---------------*/ /*-----------------------Scene.New()------------------------------------*/ static PyObject *M_Scene_New( PyObject * self, PyObject * args, @@ -572,9 +800,10 @@ static PyObject *M_Scene_Unlink( PyObject * self, PyObject * args ) Py_RETURN_NONE; } +/* DEPRECATE ME !!! */ /*-----------------------BPy_Scene function defintions-------------------*/ /*-----------------------Scene.getName()---------------------------------*/ -static PyObject *Scene_getName( BPy_Scene * self ) +static PyObject *Scene_oldgetName( BPy_Scene * self ) { PyObject *attr; @@ -590,7 +819,7 @@ static PyObject *Scene_getName( BPy_Scene * self ) } /*-----------------------Scene.setName()---------------------------------*/ -static PyObject *Scene_setName( BPy_Scene * self, PyObject * args ) +static PyObject *Scene_oldsetName( BPy_Scene * self, PyObject * args ) { char *name; @@ -605,34 +834,8 @@ static PyObject *Scene_setName( BPy_Scene * self, PyObject * args ) Py_RETURN_NONE; } -/*-----------------------Scene.getLayers()---------------------------------*/ -static PyObject *Scene_getLayers( BPy_Scene * self ) -{ - PyObject *laylist = PyList_New( 0 ), *item; - int layers, bit = 0, val = 0; - - SCENE_DEL_CHECK_PY(self); - - if( !laylist ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create pylist!" ) ); - - layers = self->scene->lay; - - while( bit < 20 ) { - val = 1 << bit; - if( layers & val ) { - item = Py_BuildValue( "i", bit + 1 ); - PyList_Append( laylist, item ); - Py_DECREF( item ); - } - bit++; - } - return laylist; -} - /*-----------------------Scene.setLayers()---------------------------------*/ -static PyObject *Scene_setLayers( BPy_Scene * self, PyObject * args ) +static PyObject *Scene_oldsetLayers( BPy_Scene * self, PyObject * args ) { PyObject *list = NULL, *item = NULL; int layers = 0, val, i, len_list; @@ -682,42 +885,8 @@ static PyObject *Scene_setLayers( BPy_Scene * self, PyObject * args ) Py_RETURN_NONE; } +/* END DEPRECATE CODE */ -/* only used by setAttr */ -static PyObject *Scene_setLayersMask(BPy_Scene *self, PyObject *args) -{ - int laymask = 0; - - SCENE_DEL_CHECK_PY(self); - - if (!PyArg_ParseTuple(args , "i", &laymask)) { - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected an integer (bitmask) as argument" ); - } - - if (laymask <= 0 || laymask > (1<<20) - 1) /* binary: 1111 1111 1111 1111 1111 */ - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "bitmask must have from 1 up to 20 bits set"); - - self->scene->lay = laymask; - /* if this is the current scene then apply the scene layers value - * to the view layers value: */ - if (G.vd && (self->scene == G.scene)) { - int val, bit = 0; - G.vd->lay = laymask; - - while( bit < 20 ) { - val = 1 << bit; - if( laymask & val ) { - G.vd->layact = val; - break; - } - bit++; - } - } - - Py_RETURN_NONE; -} /*-----------------------Scene.copy()------------------------------------*/ static PyObject *Scene_copy( BPy_Scene * self, PyObject * args ) @@ -741,6 +910,8 @@ static PyObject *Scene_makeCurrent( BPy_Scene * self ) SCENE_DEL_CHECK_PY(self); + printf("scene.makeCurrent() deprecated!\n\tuse Blender.Main.scenes.active = scene instead\n"); + if( scene && scene != G.scene) { set_scene( scene ); scene_update_for_newframe(scene, scene->lay); @@ -756,7 +927,6 @@ static PyObject *Scene_update( BPy_Scene * self, PyObject * args ) int full = 0; SCENE_DEL_CHECK_PY(self); - if( !PyArg_ParseTuple( args, "|i", &full ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected nothing or int (0 or 1) argument" ); @@ -789,6 +959,8 @@ static PyObject *Scene_link( BPy_Scene * self, PyObject * args ) SCENE_DEL_CHECK_PY(self); + printf("scene.link(ob) deprecated!\n\tuse scene.objects.link(ob) instead\n"); + if( !PyArg_ParseTuple( args, "O!", &Object_Type, &bpy_obj ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected Object argument" ); @@ -859,6 +1031,8 @@ static PyObject *Scene_unlink( BPy_Scene * self, PyObject * args ) SCENE_DEL_CHECK_PY(self); + printf("scene.unlink(ob) deprecated!\n\tuse scene.objects.unlink(ob) instead\n"); + if( !PyArg_ParseTuple( args, "O!", &Object_Type, &bpy_obj ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected Object as argument" ); @@ -888,6 +1062,8 @@ static PyObject *Scene_getChildren( BPy_Scene * self ) SCENE_DEL_CHECK_PY(self); + printf("scene.getChildren() deprecated!\n\tuse scene.objects instead\n"); + base = scene->base.first; while( base ) { @@ -917,6 +1093,8 @@ static PyObject *Scene_getActiveObject(BPy_Scene *self) SCENE_DEL_CHECK_PY(self); + printf("scene.getActiveObject() deprecated!\n\tuse scene.objects.active instead\n"); + ob = ((scene->basact) ? (scene->basact->object) : 0); if (ob) { @@ -940,6 +1118,8 @@ static PyObject *Scene_getCurrentCamera( BPy_Scene * self ) Scene *scene = self->scene; SCENE_DEL_CHECK_PY(self); + + printf("scene.getCurrentCamera() deprecated!\n\tGet scene.objects.camera instead\n"); cam_obj = scene->camera; @@ -963,6 +1143,8 @@ static PyObject *Scene_setCurrentCamera( BPy_Scene * self, PyObject * args ) SCENE_DEL_CHECK_PY(self); + printf("scene.setCurrentCamera(ob) deprecated!\n\tSet scene.objects.camera = ob instead\n"); + if( !PyArg_ParseTuple( args, "O!", &Object_Type, &cam_obj ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected Camera Object as argument" ); @@ -1114,12 +1296,6 @@ static PyObject *Scene_getTimeLine( BPy_Scene *self ) return (PyObject *)tm; } -/* accessed from scn.objects */ -static PyObject *Scene_getObjects( BPy_Scene *self) -{ - SCENE_DEL_CHECK_PY(self); - return SceneObSeq_CreatePyObject(self, NULL, 0); -} /************************************************************************ * @@ -1588,6 +1764,58 @@ static int SceneObSeq_setActive(BPy_SceneObSeq *self, PyObject *value) return 0; } +PyObject *SceneObSeq_getCamera(BPy_SceneObSeq *self) +{ + PyObject *pyob; + Object *ob; + + SCENE_DEL_CHECK_PY(self->bpyscene); + + if (self->mode!=EXPP_OBSEQ_NORMAL) + return (EXPP_ReturnPyObjError( PyExc_TypeError, + "cannot get camera from objects.selected or objects.context" )); + + ob= self->bpyscene->scene->camera; + if (!ob) + Py_RETURN_NONE; + + pyob = Object_CreatePyObject( ob ); + + if (!pyob) + return EXPP_ReturnPyObjError(PyExc_MemoryError, + "couldn't create new object wrapper!"); + + return pyob; +} + +static int SceneObSeq_setCamera(BPy_SceneObSeq *self, PyObject *value) +{ + SCENE_DEL_CHECK_INT(self->bpyscene); + + 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; + + /* 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 */ + copy_view3d_lock( REDRAW ); + +/* XXX copy_view3d_lock(REDRAW) prints "bad call to addqueue: 0 (18, 1)". + * The same happens in bpython. */ + + return 0; +} static struct PyMethodDef BPy_SceneObSeq_methods[] = { @@ -1650,6 +1878,10 @@ static PyGetSetDef SceneObSeq_getseters[] = { (getter)SceneObSeq_getActive, (setter)SceneObSeq_setActive, "active object", NULL}, + {"camera", + (getter)SceneObSeq_getCamera, (setter)SceneObSeq_setCamera, + "camera object", + NULL}, {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ }; diff --git a/source/blender/python/api2_2x/Scene.h b/source/blender/python/api2_2x/Scene.h index 4d45d849c6d..c390bb934dc 100644 --- a/source/blender/python/api2_2x/Scene.h +++ b/source/blender/python/api2_2x/Scene.h @@ -48,7 +48,7 @@ extern PyTypeObject SceneObSeq_Type; /*---------------------------Python BPy_Scene structure definition----------*/ typedef struct { PyObject_HEAD - Scene * scene; + Scene * scene; /* libdata must be second */ } BPy_Scene; /*---------------------------Python BPy_Scene visible prototypes-----------*/ /* Python Scene_Type helper functions needed by Blender (the Init function) and Object modules. */ @@ -67,6 +67,5 @@ PyObject *Scene_Init( void ); PyObject *Scene_CreatePyObject( Scene * scene ); /*Scene *Scene_FromPyObject( PyObject * pyobj );*/ /* not used yet */ int Scene_CheckPyObject( PyObject * pyobj ); -Scene *GetSceneByName( char *name ); #endif /* EXPP_SCENE_H */ diff --git a/source/blender/python/api2_2x/SurfNurb.h b/source/blender/python/api2_2x/SurfNurb.h index 735c0f27cc7..c9f9beadeeb 100644 --- a/source/blender/python/api2_2x/SurfNurb.h +++ b/source/blender/python/api2_2x/SurfNurb.h @@ -42,7 +42,7 @@ extern PyTypeObject SurfNurb_Type; /* Python BPy_SurfNurb structure definition */ typedef struct { PyObject_HEAD /* required py macro */ - Nurb * nurb; /* pointer to Blender data */ + Nurb * nurb; /* pointer to Blender data, libdata must be second */ */ /* iterator stuff */ /* internal ptrs to point data. do not free */ diff --git a/source/blender/python/api2_2x/Text.h b/source/blender/python/api2_2x/Text.h index d4421c3b890..b40c3807a81 100644 --- a/source/blender/python/api2_2x/Text.h +++ b/source/blender/python/api2_2x/Text.h @@ -43,7 +43,7 @@ extern PyTypeObject Text_Type; typedef struct { PyObject_HEAD - Text * text; + Text * text; /* libdata must be second */ } BPy_Text; PyObject *Text_Init( void ); diff --git a/source/blender/python/api2_2x/Text3d.h b/source/blender/python/api2_2x/Text3d.h index f57debdbe32..f767f10d9a2 100644 --- a/source/blender/python/api2_2x/Text3d.h +++ b/source/blender/python/api2_2x/Text3d.h @@ -39,7 +39,7 @@ #define BPy_Text3d_Check(v) ((v)->ob_type==&Text3d_Type) typedef Curve Text3d; -//prototypes +/*prototypes*/ int Text3d_CheckPyObject( PyObject * py_obj ); PyObject *Text3d_Init( void ); struct Text3d *Text3d_FromPyObject( PyObject * py_obj ); diff --git a/source/blender/python/api2_2x/Texture.h b/source/blender/python/api2_2x/Texture.h index d4fcd805ad1..b162dc4b2e9 100644 --- a/source/blender/python/api2_2x/Texture.h +++ b/source/blender/python/api2_2x/Texture.h @@ -44,7 +44,7 @@ typedef struct { PyObject_HEAD - Tex * texture; + Tex * texture; /* libdata must be second */ } BPy_Texture; extern PyTypeObject Texture_Type; diff --git a/source/blender/python/api2_2x/World.c b/source/blender/python/api2_2x/World.c index 6400f3a716e..50d7c561d80 100644 --- a/source/blender/python/api2_2x/World.c +++ b/source/blender/python/api2_2x/World.c @@ -377,11 +377,12 @@ static PyObject *M_World_Get( PyObject * self, PyObject * args ) } - - static PyObject *M_World_GetCurrent( PyObject * self ) { BPy_World *w = NULL; + + printf("Blender.World.GetCurrent() deprecated!\n\tuse Blender.Main.scenes.world instead\n"); + if( !G.scene->world ) Py_RETURN_NONE; @@ -876,6 +877,7 @@ static PyObject *World_setCurrent( BPy_World * self ) { World *world = self->world; /* If there is a world then it now has one less user */ + printf("world.setCurrent() deprecated!\n\tuse Blender.Main.scenes.world=world instead\n"); if( G.scene->world ) G.scene->world->id.us--; world->id.us++; @@ -1068,7 +1070,6 @@ PyObject *World_CreatePyObject( struct World * world ) } blen_object->world = world; return ( ( PyObject * ) blen_object ); - } int World_CheckPyObject( PyObject * py_obj ) diff --git a/source/blender/python/api2_2x/World.h b/source/blender/python/api2_2x/World.h index d085c3f28bb..eaeaedfcd61 100644 --- a/source/blender/python/api2_2x/World.h +++ b/source/blender/python/api2_2x/World.h @@ -41,7 +41,7 @@ /* Python BPy_World structure definition */ typedef struct { PyObject_HEAD /* required py macro */ - World * world; + World * world; /* Libdata must be second */ } BPy_World; extern PyTypeObject World_Type; diff --git a/source/blender/python/api2_2x/doc/Scene.py b/source/blender/python/api2_2x/doc/Scene.py index 7276c035e85..0ad018b2538 100644 --- a/source/blender/python/api2_2x/doc/Scene.py +++ b/source/blender/python/api2_2x/doc/Scene.py @@ -199,6 +199,7 @@ class Scene: scripts, for example), it's probably better to use this scene.GetChildren instead, since it will only access objects from this particular scene. + @warn: Depricated! use scene.objects instead. """ def getActiveObject(): @@ -213,6 +214,7 @@ class Scene: return the active object even when no objects are selected. @rtype: Blender Object or None @return: the active object or None if not available. + @warn: Depricated! use scene.objects.active instead. """ def getCurrentCamera(): diff --git a/source/blender/python/api2_2x/gen_utils.c b/source/blender/python/api2_2x/gen_utils.c index 01cf7c461bc..894e7e55f23 100644 --- a/source/blender/python/api2_2x/gen_utils.c +++ b/source/blender/python/api2_2x/gen_utils.c @@ -453,15 +453,16 @@ PyObject *EXPP_getScriptLinks( ScriptLink * slink, PyObject * args, char *eventname = NULL; int i, event = 0; - /* actually !scriptlink shouldn't happen ... */ - if( !slink || !slink->totscript ) - return EXPP_incr_ret( Py_None ); + list = PyList_New( 0 ); if( !PyArg_ParseTuple( args, "s", &eventname ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected event name (string) as argument" ); - list = PyList_New( 0 ); + /* actually !scriptlink shouldn't happen ... */ + if( !slink || !slink->totscript ) + return list; + if( !list ) return EXPP_ReturnPyObjError( PyExc_MemoryError, "couldn't create PyList!" ); diff --git a/source/blender/python/api2_2x/sceneTimeLine.c b/source/blender/python/api2_2x/sceneTimeLine.c index 89c55acc352..07dca6e7cdb 100644 --- a/source/blender/python/api2_2x/sceneTimeLine.c +++ b/source/blender/python/api2_2x/sceneTimeLine.c @@ -64,7 +64,7 @@ static void TimeLine_dealloc (PyObject *self) { static PyObject *TimeLine_repr (BPy_TimeLine *self) { - return PyString_FromFormat ("TimeLine:)"); + return PyString_FromFormat ("[TimeLine]"); } static PyMethodDef BPy_TimeLine_methods[] = { |