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.
This commit is contained in:
2006-12-28 11:09:36 +00:00
parent 356ea2ff28
commit 2feea3dcc3
9 changed files with 141 additions and 52 deletions

View File

@@ -794,8 +794,7 @@ def load_3ds(filename, PREF_UI= True):
scn= Scene.GetCurrent() scn= Scene.GetCurrent()
SCN_OBJECTS = scn.objects SCN_OBJECTS = scn.objects
for ob in SCN_OBJECTS: SCN_OBJECTS.selected = [] # de select all
ob.sel= 0
importedObjects= [] # Fill this list with objects importedObjects= [] # Fill this list with objects
process_next_chunk(file, current_chunk, importedObjects) process_next_chunk(file, current_chunk, importedObjects)

View File

@@ -548,9 +548,8 @@ Blender.Text.unlink(scripting)
#Go to frame that correspond to selected "vertex" #Go to frame that correspond to selected "vertex"
Blender.Set('curframe', TestFRAME[k]) Blender.Set('curframe', TestFRAME[k])
#un select all objects scene.objects.selected = [] #un select all objects
for _ob in Blender.Object.GetSelected():
_ob.sel= False
#FIXED TestLIST[j][0].sel=0, but no j. So ob.sel and above variable changed in obj #FIXED TestLIST[j][0].sel=0, but no j. So ob.sel and above variable changed in obj
ob.sel= True ob.sel= True
Blender.Run('Edit_Trajectory') Blender.Run('Edit_Trajectory')

View File

@@ -311,8 +311,7 @@ def bvh_node_dict2objects(bvh_nodes, IMPORT_START_FRAME= 1):
IMPORT_START_FRAME= 1 IMPORT_START_FRAME= 1
scn= Blender.Scene.GetCurrent() scn= Blender.Scene.GetCurrent()
for ob in scn.objects: scn.objects.selected = []
ob.sel= 0
objects= [] objects= []
@@ -444,14 +443,10 @@ def bvh_node_dict2armature(bvh_nodes, IMPORT_START_FRAME= 1):
scn= Blender.Scene.GetCurrent() scn= Blender.Scene.GetCurrent()
for ob in scn.objects: scn.objects.selected = []
ob.sel= 0
scn.link(arm_ob) scn.link(arm_ob)
arm_ob.sel= 1 scn.objects.context = [arm_ob]
arm_ob.Layers= scn.Layers
# Now Apply the animation to the armature # Now Apply the animation to the armature

View File

@@ -672,7 +672,7 @@ def load_obj(filepath, CLAMP_SIZE= 0.0, CREATE_FGONS= True, CREATE_SMOOTH_GROUPS
# deselect all # deselect all
for ob in Scene.GetCurrent().objects: ob.sel= False Scene.GetCurrent().objects.selected = []
new_objects= [] # put new objects here new_objects= [] # put new objects here
print '\tbuilding geometry;\n\tverts:%i faces:%i materials: %i smoothgroups:%i ...' % ( len(verts_loc), len(faces), len(unique_materials), len(unique_smooth_groups) ), print '\tbuilding geometry;\n\tverts:%i faces:%i materials: %i smoothgroups:%i ...' % ( len(verts_loc), len(faces), len(unique_materials), len(unique_smooth_groups) ),

View File

@@ -222,8 +222,7 @@ def read(filename):
tobj.logcon ("Importing file:") tobj.logcon ("Importing file:")
tobj.logcon (filename) tobj.logcon (filename)
for ob in Blender.Scene.GetCurrent().objects: Blender.Scene.GetCurrent().objects.selected = []
ob.sel= 0
start = Blender.sys.time() start = Blender.sys.time()
file = open(filename, "rb") file = open(filename, "rb")

View File

@@ -118,8 +118,8 @@ def polysFromMesh(me):
def mesh2polys(): def mesh2polys():
scn= Scene.GetCurrent() scn= Scene.GetCurrent()
for ob in scn.objects: scn.objects.selected = []
ob.sel= 0
meshOb= scn.objects.active meshOb= scn.objects.active
if meshOb==None or meshOb.type != 'Mesh': if meshOb==None or meshOb.type != 'Mesh':
Draw.PupMenu( 'ERROR: No Active Mesh Selected, Aborting' ) Draw.PupMenu( 'ERROR: No Active Mesh Selected, Aborting' )

View File

@@ -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_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" ) ) #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--*/ /*-----------------------Python API function prototypes for the Scene module--*/
static PyObject *M_Scene_New( PyObject * self, PyObject * args, static PyObject *M_Scene_New( PyObject * self, PyObject * args,
PyObject * keywords ); PyObject * keywords );
@@ -1118,6 +1126,71 @@ static PyObject *SceneObSeq_getObjects( BPy_SceneObSeq *self, void *mode)
return SceneObSeq_CreatePyObject(self->bpyscene, NULL, (int)((long)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 ) 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 *scene= self->bpyscene->scene;
SCENE_DEL_CHECK_INT(self->bpyscene); SCENE_DEL_CHECK_INT(self->bpyscene);
if (self->mode == 0) /* all obejcts */ if (self->mode == EXPP_OBSEQ_NORMAL)
return BLI_countlist( &( scene->base ) ); return BLI_countlist( &( scene->base ) );
else if (self->mode == 1) { /* selected obejcts */ else if (self->mode == EXPP_OBSEQ_SELECTED) {
int len=0; int len=0;
Base *base; Base *base;
for (base= scene->base.first; base; base= base->next) { for (base= scene->base.first; base; base= base->next) {
@@ -1144,7 +1217,7 @@ static int SceneObSeq_len( BPy_SceneObSeq * self )
} }
} }
return len; return len;
} else if (self->mode == 2) { /* user context */ } else if (self->mode == EXPP_OBSEQ_CONTEXT) {
int len=0; int len=0;
Base *base; Base *base;
@@ -1176,15 +1249,15 @@ static PyObject *SceneObSeq_item( BPy_SceneObSeq * self, int i )
SCENE_DEL_CHECK_PY(self->bpyscene); SCENE_DEL_CHECK_PY(self->bpyscene);
/* objects */ /* objects */
if (self->mode==0) if (self->mode==EXPP_OBSEQ_NORMAL)
for (base= scene->base.first; base && i!=index; base= base->next, index++) {} for (base= scene->base.first; base && i!=index; base= base->next, index++) {}
/* selected */ /* selected */
else if (self->mode==1) else if (self->mode==EXPP_OBSEQ_SELECTED)
for (base= scene->base.first; base && i!=index; base= base->next) for (base= scene->base.first; base && i!=index; base= base->next)
if (base->flag & SELECT) if (base->flag & SELECT)
index++; index++;
/* context */ /* context */
else if (self->mode==2) else if (self->mode==EXPP_OBSEQ_CONTEXT)
if (G.vd) if (G.vd)
for (base= scene->base.first; base && i!=index; base= base->next) for (base= scene->base.first; base && i!=index; base= base->next)
if ((base->flag & SELECT) && (base->lay & G.vd->lay)) 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); SCENE_DEL_CHECK_PY(self->bpyscene);
if (self->mode==1) /* selected */ if (self->mode==EXPP_OBSEQ_SELECTED)
while (base && !(base->flag & SELECT)) while (base && !(base->flag & SELECT))
base= base->next; base= base->next;
else if (self->mode==2) { /* context */ else if (self->mode==EXPP_OBSEQ_CONTEXT) {
if (!G.vd) if (!G.vd)
base= NULL; /* will never iterate if we have no */ base= NULL; /* will never iterate if we have no */
else else
@@ -1269,10 +1342,10 @@ static PyObject *SceneObSeq_nextIter( BPy_SceneObSeq * self )
object= Object_CreatePyObject( self->iter->object ); object= Object_CreatePyObject( self->iter->object );
base= self->iter->next; base= self->iter->next;
if (self->mode==1) /* selected */ if (self->mode==EXPP_OBSEQ_SELECTED)
while (base && !(base->flag & SELECT)) while (base && !(base->flag & SELECT))
base= base->next; base= base->next;
else if (self->mode==2) { /* context */ else if (self->mode==EXPP_OBSEQ_CONTEXT) {
if (!G.vd) if (!G.vd)
base= NULL; /* will never iterate if we have no */ base= NULL; /* will never iterate if we have no */
else else
@@ -1280,7 +1353,6 @@ static PyObject *SceneObSeq_nextIter( BPy_SceneObSeq * self )
base= base->next; base= base->next;
} }
self->iter= base; self->iter= base;
return object; return object;
} }
@@ -1290,7 +1362,7 @@ static PyObject *SceneObSeq_link( BPy_SceneObSeq * self, PyObject *pyobj )
SCENE_DEL_CHECK_PY(self->bpyscene); SCENE_DEL_CHECK_PY(self->bpyscene);
/* this shold eventually replace Scene_link */ /* this shold eventually replace Scene_link */
if (self->mode != 0) if (self->mode != EXPP_OBSEQ_NORMAL)
return (EXPP_ReturnPyObjError( PyExc_TypeError, return (EXPP_ReturnPyObjError( PyExc_TypeError,
"Cannot link to objects.selection or objects.context!" )); "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); SCENE_DEL_CHECK_PY(self->bpyscene);
if (self->mode != 0) if (self->mode != EXPP_OBSEQ_NORMAL)
return EXPP_ReturnPyObjError( PyExc_TypeError, return EXPP_ReturnPyObjError( PyExc_TypeError,
"Cannot add new to objects.selection or objects.context!" ); "Cannot add new to objects.selection or objects.context!" );
@@ -1455,16 +1527,16 @@ typeError:
} }
static PyObject *SceneObSeq_unlink( BPy_SceneObSeq * self, PyObject *args ) static PyObject *SceneObSeq_unlink( BPy_SceneObSeq * self, PyObject *args )
{ {
PyObject *pyobj; PyObject *pyobj;
Object *blen_ob; Object *blen_ob;
Scene *scene;
Base *base= NULL; Base *base= NULL;
SCENE_DEL_CHECK_PY(self->bpyscene); SCENE_DEL_CHECK_PY(self->bpyscene);
if (self->mode != 0) if (self->mode != EXPP_OBSEQ_NORMAL)
return (EXPP_ReturnPyObjError( PyExc_TypeError, return (EXPP_ReturnPyObjError( PyExc_TypeError,
"Cannot add new to objects.selection or objects.context!" )); "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" ) ); "expected a python object as an argument" ) );
blen_ob = ( ( BPy_Object * ) pyobj )->object; blen_ob = ( ( BPy_Object * ) pyobj )->object;
scene = self->bpyscene->scene;
/* is the object really in the 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 */ /* check that there is a data block before decrementing refcount */
if( (ID *)blen_ob->data ) if( (ID *)base->object->data )
((ID *)blen_ob->data)->us--; ((ID *)base->object->data)->us--;
else if( blen_ob->type != OB_EMPTY ) else if( blen_ob->type != OB_EMPTY )
return EXPP_ReturnPyObjError( PyExc_RuntimeError, return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"Object has no data!" ); "Object has no data!" );
if (self->bpyscene->scene->basact==base) if (scene->basact==base)
self->bpyscene->scene->basact= NULL; /* in case the object was selected */ scene->basact= NULL; /* in case the object was selected */
BLI_remlink( &(self->bpyscene->scene)->base, base ); BLI_remlink( &scene->base, base );
blen_ob->id.us--; base->object->id.us--;
MEM_freeN( base ); MEM_freeN( base );
} }
Py_RETURN_NONE; Py_RETURN_NONE;
@@ -1503,7 +1577,7 @@ PyObject *SceneObSeq_getActive(BPy_SceneObSeq *self)
SCENE_DEL_CHECK_PY(self->bpyscene); SCENE_DEL_CHECK_PY(self->bpyscene);
if (self->mode!=0) if (self->mode!=EXPP_OBSEQ_NORMAL)
return (EXPP_ReturnPyObjError( PyExc_TypeError, return (EXPP_ReturnPyObjError( PyExc_TypeError,
"cannot get active from objects.selected or objects.context" )); "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); SCENE_DEL_CHECK_INT(self->bpyscene);
if (self->mode!=0) if (self->mode!=EXPP_OBSEQ_NORMAL)
return (EXPP_ReturnIntError( PyExc_TypeError, return (EXPP_ReturnIntError( PyExc_TypeError,
"cannot set active from objects.selected or objects.context" )); "cannot set active from objects.selected or objects.context" ));
@@ -1586,10 +1660,10 @@ static PyObject *SceneObSeq_repr( BPy_SceneObSeq * self )
{ {
if( !(self->bpyscene->scene) ) if( !(self->bpyscene->scene) )
return PyString_FromFormat( "[Scene ObjectSeq Removed]" ); 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\"]", return PyString_FromFormat( "[Scene ObjectSeq Selected \"%s\"]",
self->bpyscene->scene->id.name + 2 ); 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\"]", return PyString_FromFormat( "[Scene ObjectSeq Context \"%s\"]",
self->bpyscene->scene->id.name + 2 ); self->bpyscene->scene->id.name + 2 );
@@ -1600,13 +1674,13 @@ static PyObject *SceneObSeq_repr( BPy_SceneObSeq * self )
static PyGetSetDef SceneObSeq_getseters[] = { static PyGetSetDef SceneObSeq_getseters[] = {
{"selected", {"selected",
(getter)SceneObSeq_getObjects, (setter)NULL, (getter)SceneObSeq_getObjects, (setter)SceneObSeq_setObjects,
"sequence of selected objects", "sequence of selected objects",
(void *)1}, (void *)EXPP_OBSEQ_SELECTED},
{"context", {"context",
(getter)SceneObSeq_getObjects, (setter)NULL, (getter)SceneObSeq_getObjects, (setter)SceneObSeq_setObjects,
"sequence of user context objects", "sequence of user context objects",
(void *)2}, (void *)EXPP_OBSEQ_CONTEXT},
{"active", {"active",
(getter)SceneObSeq_getActive, (setter)SceneObSeq_setActive, (getter)SceneObSeq_getActive, (setter)SceneObSeq_setActive,
"active object", "active object",

View File

@@ -42,6 +42,8 @@ extern PyTypeObject SceneObSeq_Type;
#define BPy_Scene_Check(v) \ #define BPy_Scene_Check(v) \
((v)->ob_type == &Scene_Type) ((v)->ob_type == &Scene_Type)
#define BPy_SceneObSeq_Check(v) \
((v)->ob_type == &SceneObSeq_Type)
/*---------------------------Python BPy_Scene structure definition----------*/ /*---------------------------Python BPy_Scene structure definition----------*/
typedef struct { typedef struct {
@@ -63,7 +65,7 @@ typedef struct {
PyObject *Scene_Init( void ); PyObject *Scene_Init( void );
PyObject *Scene_CreatePyObject( Scene * cam ); PyObject *Scene_CreatePyObject( Scene * cam );
Scene *Scene_FromPyObject( PyObject * pyobj ); /*Scene *Scene_FromPyObject( PyObject * pyobj );*/ /* not used yet */
int Scene_CheckPyObject( PyObject * pyobj ); int Scene_CheckPyObject( PyObject * pyobj );
Scene *GetSceneByName( char *name ); Scene *GetSceneByName( char *name );

View File

@@ -315,6 +315,27 @@ class SceneObjects:
========================================= =========================================
This object gives access to the Objects in a Scene in Blender. 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. @ivar selected: an iterator over all the selected objects in a scene.
@type selected: sequence of L{Object} @type selected: sequence of L{Object}
@ivar context: an iterator over all the visible selected objects in a scene. @ivar context: an iterator over all the visible selected objects in a scene.