diff options
author | Campbell Barton <ideasman42@gmail.com> | 2006-12-28 14:09:36 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2006-12-28 14:09:36 +0300 |
commit | 2feea3dcc36fbd250445e4efca756e50d221be29 (patch) | |
tree | 2fd20815b65bdd9dce61af704bc2be4d3fbe57fa /source | |
parent | 356ea2ff28517cc8e32c5af117e0f697174d8ee7 (diff) |
made scn.objects more flexible... you can now things like...
scn.objects.selected = [] # deselect all
scn.objects.selected = scn.objects # select all
scn.objects.context = [ob1, ob2...]
Added epydoc examples and updates importer scripts to use this de-select-all method.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/python/api2_2x/Scene.c | 140 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Scene.h | 4 | ||||
-rw-r--r-- | source/blender/python/api2_2x/doc/Scene.py | 21 |
3 files changed, 131 insertions, 34 deletions
diff --git a/source/blender/python/api2_2x/Scene.c b/source/blender/python/api2_2x/Scene.c index ee254df8bc1..8e737f1f496 100644 --- a/source/blender/python/api2_2x/Scene.c +++ b/source/blender/python/api2_2x/Scene.c @@ -83,6 +83,14 @@ PyObject *M_Object_Get( PyObject * self, PyObject * args ); /* from Object.c */ #define SCENE_DEL_CHECK_PY(bpy_scene) if (!(bpy_scene->scene)) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "Scene has been removed" ) ) #define SCENE_DEL_CHECK_INT(bpy_scene) if (!(bpy_scene->scene)) return ( EXPP_ReturnIntError( PyExc_RuntimeError, "Scene has been removed" ) ) + +enum obj_consts { + EXPP_OBSEQ_NORMAL = 0, + EXPP_OBSEQ_SELECTED, + EXPP_OBSEQ_CONTEXT, +}; + + /*-----------------------Python API function prototypes for the Scene module--*/ static PyObject *M_Scene_New( PyObject * self, PyObject * args, PyObject * keywords ); @@ -1118,6 +1126,71 @@ static PyObject *SceneObSeq_getObjects( BPy_SceneObSeq *self, void *mode) return SceneObSeq_CreatePyObject(self->bpyscene, NULL, (int)((long)mode)); } +int SceneObSeq_setObjects( BPy_SceneObSeq *self, PyObject *value, void *_mode_) +{ + /* + ONLY SUPPORTS scn.objects.selected and scn.objects.context + cannot assign to scn.objects yet!!! + */ + PyObject *item; + Scene *scene= self->bpyscene->scene; + Object *blen_ob; + Base *base; + int size, mode = (int)_mode_; + + SCENE_DEL_CHECK_INT(self->bpyscene); + + /* scn.objects.selected = scn.objects - shortcut to select all */ + if (BPy_SceneObSeq_Check(value)) { + BPy_SceneObSeq *bpy_sceneseq = (BPy_SceneObSeq *)value; + if (self->bpyscene->scene != bpy_sceneseq->bpyscene->scene) + return EXPP_ReturnIntError( PyExc_ValueError, + "Cannot assign a SceneObSeq type from another scene" ); + if (bpy_sceneseq->mode != EXPP_OBSEQ_NORMAL) + return EXPP_ReturnIntError( PyExc_ValueError, + "Can only assign scn.objects to scn.objects.context or scn.objects.selected" ); + + for (base= scene->base.first; base; base= base->next) { + base->flag |= SELECT; + base->object->flag |= SELECT; + + if (mode==EXPP_OBSEQ_CONTEXT && G.vd) { + base->object->lay= base->lay= G.vd->lay; + } + } + return 0; + } + + if (!PySequence_Check(value)) + return EXPP_ReturnIntError( PyExc_ValueError, + "Error, must assign a sequence of objects to scn.objects.selected" ); + + /* for context and selected, just deselect, dont remove */ + for (base= scene->base.first; base; base= base->next) { + base->flag &= ~SELECT; + base->object->flag &= ~SELECT; + } + + size = PySequence_Length(value); + while (size) { + size--; + item = PySequence_GetItem(value, size); + if ( PyObject_TypeCheck(item, &Object_Type) ) { + blen_ob= ((BPy_Object *)item)->object; + base = object_in_scene( blen_ob, scene ); + if (base) { + blen_ob->flag |= SELECT; + base->flag |= SELECT; + if (mode==EXPP_OBSEQ_CONTEXT && G.vd) { + blen_ob->lay= base->lay= G.vd->lay; + } + } + } + Py_DECREF(item); + } + return 0; +} + static PyObject *SceneObSeq_CreatePyObject( BPy_Scene *self, Base *iter, int mode ) { @@ -1133,9 +1206,9 @@ static int SceneObSeq_len( BPy_SceneObSeq * self ) Scene *scene= self->bpyscene->scene; SCENE_DEL_CHECK_INT(self->bpyscene); - if (self->mode == 0) /* all obejcts */ + if (self->mode == EXPP_OBSEQ_NORMAL) return BLI_countlist( &( scene->base ) ); - else if (self->mode == 1) { /* selected obejcts */ + else if (self->mode == EXPP_OBSEQ_SELECTED) { int len=0; Base *base; for (base= scene->base.first; base; base= base->next) { @@ -1144,7 +1217,7 @@ static int SceneObSeq_len( BPy_SceneObSeq * self ) } } return len; - } else if (self->mode == 2) { /* user context */ + } else if (self->mode == EXPP_OBSEQ_CONTEXT) { int len=0; Base *base; @@ -1176,15 +1249,15 @@ static PyObject *SceneObSeq_item( BPy_SceneObSeq * self, int i ) SCENE_DEL_CHECK_PY(self->bpyscene); /* objects */ - if (self->mode==0) + if (self->mode==EXPP_OBSEQ_NORMAL) for (base= scene->base.first; base && i!=index; base= base->next, index++) {} /* selected */ - else if (self->mode==1) + else if (self->mode==EXPP_OBSEQ_SELECTED) for (base= scene->base.first; base && i!=index; base= base->next) if (base->flag & SELECT) index++; /* context */ - else if (self->mode==2) + else if (self->mode==EXPP_OBSEQ_CONTEXT) if (G.vd) for (base= scene->base.first; base && i!=index; base= base->next) if ((base->flag & SELECT) && (base->lay & G.vd->lay)) @@ -1233,10 +1306,10 @@ static PyObject *SceneObSeq_getIter( BPy_SceneObSeq * self ) SCENE_DEL_CHECK_PY(self->bpyscene); - if (self->mode==1) /* selected */ + if (self->mode==EXPP_OBSEQ_SELECTED) while (base && !(base->flag & SELECT)) base= base->next; - else if (self->mode==2) { /* context */ + else if (self->mode==EXPP_OBSEQ_CONTEXT) { if (!G.vd) base= NULL; /* will never iterate if we have no */ else @@ -1269,10 +1342,10 @@ static PyObject *SceneObSeq_nextIter( BPy_SceneObSeq * self ) object= Object_CreatePyObject( self->iter->object ); base= self->iter->next; - if (self->mode==1) /* selected */ + if (self->mode==EXPP_OBSEQ_SELECTED) while (base && !(base->flag & SELECT)) base= base->next; - else if (self->mode==2) { /* context */ + else if (self->mode==EXPP_OBSEQ_CONTEXT) { if (!G.vd) base= NULL; /* will never iterate if we have no */ else @@ -1280,7 +1353,6 @@ static PyObject *SceneObSeq_nextIter( BPy_SceneObSeq * self ) base= base->next; } self->iter= base; - return object; } @@ -1290,7 +1362,7 @@ static PyObject *SceneObSeq_link( BPy_SceneObSeq * self, PyObject *pyobj ) SCENE_DEL_CHECK_PY(self->bpyscene); /* this shold eventually replace Scene_link */ - if (self->mode != 0) + if (self->mode != EXPP_OBSEQ_NORMAL) return (EXPP_ReturnPyObjError( PyExc_TypeError, "Cannot link to objects.selection or objects.context!" )); @@ -1317,7 +1389,7 @@ static PyObject *SceneObSeq_new( BPy_SceneObSeq * self, PyObject *args ) SCENE_DEL_CHECK_PY(self->bpyscene); - if (self->mode != 0) + if (self->mode != EXPP_OBSEQ_NORMAL) return EXPP_ReturnPyObjError( PyExc_TypeError, "Cannot add new to objects.selection or objects.context!" ); @@ -1455,16 +1527,16 @@ typeError: } - static PyObject *SceneObSeq_unlink( BPy_SceneObSeq * self, PyObject *args ) { PyObject *pyobj; Object *blen_ob; + Scene *scene; Base *base= NULL; SCENE_DEL_CHECK_PY(self->bpyscene); - if (self->mode != 0) + if (self->mode != EXPP_OBSEQ_NORMAL) return (EXPP_ReturnPyObjError( PyExc_TypeError, "Cannot add new to objects.selection or objects.context!" )); @@ -1473,23 +1545,25 @@ static PyObject *SceneObSeq_unlink( BPy_SceneObSeq * self, PyObject *args ) "expected a python object as an argument" ) ); blen_ob = ( ( BPy_Object * ) pyobj )->object; - + + scene = self->bpyscene->scene; + /* is the object really in the scene? */ - base = object_in_scene( blen_ob, self->bpyscene->scene ); + base = object_in_scene( blen_ob, scene); - if( base ) { /* if it is, remove it */ + if( base ) { /* if it is, remove it */ /* check that there is a data block before decrementing refcount */ - if( (ID *)blen_ob->data ) - ((ID *)blen_ob->data)->us--; + if( (ID *)base->object->data ) + ((ID *)base->object->data)->us--; else if( blen_ob->type != OB_EMPTY ) return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Object has no data!" ); + "Object has no data!" ); - if (self->bpyscene->scene->basact==base) - self->bpyscene->scene->basact= NULL; /* in case the object was selected */ + if (scene->basact==base) + scene->basact= NULL; /* in case the object was selected */ - BLI_remlink( &(self->bpyscene->scene)->base, base ); - blen_ob->id.us--; + BLI_remlink( &scene->base, base ); + base->object->id.us--; MEM_freeN( base ); } Py_RETURN_NONE; @@ -1503,7 +1577,7 @@ PyObject *SceneObSeq_getActive(BPy_SceneObSeq *self) SCENE_DEL_CHECK_PY(self->bpyscene); - if (self->mode!=0) + if (self->mode!=EXPP_OBSEQ_NORMAL) return (EXPP_ReturnPyObjError( PyExc_TypeError, "cannot get active from objects.selected or objects.context" )); @@ -1526,7 +1600,7 @@ static int SceneObSeq_setActive(BPy_SceneObSeq *self, PyObject *value) SCENE_DEL_CHECK_INT(self->bpyscene); - if (self->mode!=0) + if (self->mode!=EXPP_OBSEQ_NORMAL) return (EXPP_ReturnIntError( PyExc_TypeError, "cannot set active from objects.selected or objects.context" )); @@ -1586,10 +1660,10 @@ static PyObject *SceneObSeq_repr( BPy_SceneObSeq * self ) { if( !(self->bpyscene->scene) ) return PyString_FromFormat( "[Scene ObjectSeq Removed]" ); - else if (self->mode==1) + else if (self->mode==EXPP_OBSEQ_SELECTED) return PyString_FromFormat( "[Scene ObjectSeq Selected \"%s\"]", self->bpyscene->scene->id.name + 2 ); - else if (self->mode==2) + else if (self->mode==EXPP_OBSEQ_CONTEXT) return PyString_FromFormat( "[Scene ObjectSeq Context \"%s\"]", self->bpyscene->scene->id.name + 2 ); @@ -1600,13 +1674,13 @@ static PyObject *SceneObSeq_repr( BPy_SceneObSeq * self ) static PyGetSetDef SceneObSeq_getseters[] = { {"selected", - (getter)SceneObSeq_getObjects, (setter)NULL, + (getter)SceneObSeq_getObjects, (setter)SceneObSeq_setObjects, "sequence of selected objects", - (void *)1}, + (void *)EXPP_OBSEQ_SELECTED}, {"context", - (getter)SceneObSeq_getObjects, (setter)NULL, + (getter)SceneObSeq_getObjects, (setter)SceneObSeq_setObjects, "sequence of user context objects", - (void *)2}, + (void *)EXPP_OBSEQ_CONTEXT}, {"active", (getter)SceneObSeq_getActive, (setter)SceneObSeq_setActive, "active object", diff --git a/source/blender/python/api2_2x/Scene.h b/source/blender/python/api2_2x/Scene.h index ee4c4573983..4d294700c63 100644 --- a/source/blender/python/api2_2x/Scene.h +++ b/source/blender/python/api2_2x/Scene.h @@ -42,6 +42,8 @@ extern PyTypeObject SceneObSeq_Type; #define BPy_Scene_Check(v) \ ((v)->ob_type == &Scene_Type) +#define BPy_SceneObSeq_Check(v) \ + ((v)->ob_type == &SceneObSeq_Type) /*---------------------------Python BPy_Scene structure definition----------*/ typedef struct { @@ -63,7 +65,7 @@ typedef struct { PyObject *Scene_Init( void ); PyObject *Scene_CreatePyObject( Scene * cam ); -Scene *Scene_FromPyObject( PyObject * pyobj ); +/*Scene *Scene_FromPyObject( PyObject * pyobj );*/ /* not used yet */ int Scene_CheckPyObject( PyObject * pyobj ); Scene *GetSceneByName( char *name ); diff --git a/source/blender/python/api2_2x/doc/Scene.py b/source/blender/python/api2_2x/doc/Scene.py index 2ada3062826..4fd9f896edc 100644 --- a/source/blender/python/api2_2x/doc/Scene.py +++ b/source/blender/python/api2_2x/doc/Scene.py @@ -315,6 +315,27 @@ class SceneObjects: ========================================= This object gives access to the Objects in a Scene in Blender. + Example:: + from Blender import Scene + scn = Scene.GetCurrent() + + scn.objects.selected = [] # select none + scn.objects.selected = scn.objects # select all + scn.objects.context = scn.objects # select all and move into the scenes display layer + + # get a list of mesh objects + obs = [ob for ob in scn.objects if ob.type == 'Mesh'] + + # Select only these mesh objects + scn.objects.selected = obs + + # print all object names + for ob in scn.objects: print ob.name + + # make a list of objects that you can add and remove to + # will not affect the current scene + scene_obs = list(scn.objects) + @ivar selected: an iterator over all the selected objects in a scene. @type selected: sequence of L{Object} @ivar context: an iterator over all the visible selected objects in a scene. |