forked from bartvdbraak/blender
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:
parent
356ea2ff28
commit
2feea3dcc3
@ -794,8 +794,7 @@ def load_3ds(filename, PREF_UI= True):
|
||||
|
||||
scn= Scene.GetCurrent()
|
||||
SCN_OBJECTS = scn.objects
|
||||
for ob in SCN_OBJECTS:
|
||||
ob.sel= 0
|
||||
SCN_OBJECTS.selected = [] # de select all
|
||||
|
||||
importedObjects= [] # Fill this list with objects
|
||||
process_next_chunk(file, current_chunk, importedObjects)
|
||||
|
@ -548,9 +548,8 @@ Blender.Text.unlink(scripting)
|
||||
#Go to frame that correspond to selected "vertex"
|
||||
Blender.Set('curframe', TestFRAME[k])
|
||||
|
||||
#un select all objects
|
||||
for _ob in Blender.Object.GetSelected():
|
||||
_ob.sel= False
|
||||
scene.objects.selected = [] #un select all objects
|
||||
|
||||
#FIXED TestLIST[j][0].sel=0, but no j. So ob.sel and above variable changed in obj
|
||||
ob.sel= True
|
||||
Blender.Run('Edit_Trajectory')
|
||||
|
@ -311,8 +311,7 @@ def bvh_node_dict2objects(bvh_nodes, IMPORT_START_FRAME= 1):
|
||||
IMPORT_START_FRAME= 1
|
||||
|
||||
scn= Blender.Scene.GetCurrent()
|
||||
for ob in scn.objects:
|
||||
ob.sel= 0
|
||||
scn.objects.selected = []
|
||||
|
||||
objects= []
|
||||
|
||||
@ -444,14 +443,10 @@ def bvh_node_dict2armature(bvh_nodes, IMPORT_START_FRAME= 1):
|
||||
|
||||
scn= Blender.Scene.GetCurrent()
|
||||
|
||||
for ob in scn.objects:
|
||||
ob.sel= 0
|
||||
scn.objects.selected = []
|
||||
|
||||
scn.link(arm_ob)
|
||||
arm_ob.sel= 1
|
||||
arm_ob.Layers= scn.Layers
|
||||
|
||||
|
||||
scn.objects.context = [arm_ob]
|
||||
|
||||
# Now Apply the animation to the armature
|
||||
|
||||
|
@ -672,7 +672,7 @@ def load_obj(filepath, CLAMP_SIZE= 0.0, CREATE_FGONS= True, CREATE_SMOOTH_GROUPS
|
||||
|
||||
|
||||
# deselect all
|
||||
for ob in Scene.GetCurrent().objects: ob.sel= False
|
||||
Scene.GetCurrent().objects.selected = []
|
||||
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) ),
|
||||
|
@ -222,8 +222,7 @@ def read(filename):
|
||||
tobj.logcon ("Importing file:")
|
||||
tobj.logcon (filename)
|
||||
|
||||
for ob in Blender.Scene.GetCurrent().objects:
|
||||
ob.sel= 0
|
||||
Blender.Scene.GetCurrent().objects.selected = []
|
||||
|
||||
start = Blender.sys.time()
|
||||
file = open(filename, "rb")
|
||||
|
@ -118,8 +118,8 @@ def polysFromMesh(me):
|
||||
|
||||
def mesh2polys():
|
||||
scn= Scene.GetCurrent()
|
||||
for ob in scn.objects:
|
||||
ob.sel= 0
|
||||
scn.objects.selected = []
|
||||
|
||||
meshOb= scn.objects.active
|
||||
if meshOb==None or meshOb.type != 'Mesh':
|
||||
Draw.PupMenu( 'ERROR: No Active Mesh Selected, Aborting' )
|
||||
|
@ -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",
|
||||
|
@ -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 );
|
||||
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user