[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24502] trunk/blender/source/blender: python api for collection add()/remove()
Campbell Barton
ideasman42 at gmail.com
Wed Nov 11 17:28:53 CET 2009
Revision: 24502
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24502
Author: campbellbarton
Date: 2009-11-11 17:28:53 +0100 (Wed, 11 Nov 2009)
Log Message:
-----------
python api for collection add()/remove()
Added a group example
C = bpy.context
ob = C.active_object
bpy.data.groups[0].objects.add(ob)
- add_to_group and rem_from_group now take optional scene and base flags and deal with updating the object & base flags
- operators that add objects to groups were setting ob->recalc= OB_RECALC_OB; looks like its not needed.
- previously add() ignored python args, now add and remove are called like any other FunctionRNA from python.
- made the pyrna api use tp_getset's for collestions active/add()/remove()
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_group.h
trunk/blender/source/blender/blenkernel/intern/group.c
trunk/blender/source/blender/blenkernel/intern/object.c
trunk/blender/source/blender/blenloader/intern/readfile.c
trunk/blender/source/blender/editors/object/object_add.c
trunk/blender/source/blender/editors/object/object_group.c
trunk/blender/source/blender/makesrna/RNA_access.h
trunk/blender/source/blender/makesrna/intern/rna_access.c
trunk/blender/source/blender/makesrna/intern/rna_group.c
trunk/blender/source/blender/python/intern/bpy_rna.c
trunk/blender/source/blender/python/intern/bpy_rna.h
Modified: trunk/blender/source/blender/blenkernel/BKE_group.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_group.h 2009-11-11 16:27:00 UTC (rev 24501)
+++ trunk/blender/source/blender/blenkernel/BKE_group.h 2009-11-11 16:28:53 UTC (rev 24502)
@@ -42,8 +42,8 @@
void unlink_group(struct Group *group);
struct Group *add_group(char *name);
struct Group *copy_group(struct Group *group);
-void add_to_group(struct Group *group, struct Object *ob);
-int rem_from_group(struct Group *group, struct Object *ob);
+int add_to_group(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base);
+int rem_from_group(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base);
struct Group *find_group(struct Object *ob, struct Group *group);
int object_in_group(struct Object *ob, struct Group *group);
int group_is_animated(struct Object *parent, struct Group *group);
Modified: trunk/blender/source/blender/blenkernel/intern/group.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/group.c 2009-11-11 16:27:00 UTC (rev 24501)
+++ trunk/blender/source/blender/blenkernel/intern/group.c 2009-11-11 16:28:53 UTC (rev 24502)
@@ -95,7 +95,7 @@
/* ensure objects are not in this group */
for(; base; base= base->next) {
- if(rem_from_group(group, base->object) && find_group(base->object, NULL)==NULL) {
+ if(rem_from_group(group, base->object, sce, base) && find_group(base->object, NULL)==NULL) {
base->object->flag &= ~OB_FROMGROUP;
base->flag &= ~OB_FROMGROUP;
}
@@ -153,15 +153,15 @@
}
/* external */
-void add_to_group(Group *group, Object *ob)
+static int add_to_group_internal(Group *group, Object *ob)
{
GroupObject *go;
- if(group==NULL || ob==NULL) return;
+ if(group==NULL || ob==NULL) return 0;
/* check if the object has been added already */
for(go= group->gobject.first; go; go= go->next) {
- if(go->ob==ob) return;
+ if(go->ob==ob) return 0;
}
go= MEM_callocN(sizeof(GroupObject), "groupobject");
@@ -169,10 +169,31 @@
go->ob= ob;
+ return 1;
}
+int add_to_group(Group *group, Object *object, Scene *scene, Base *base)
+{
+ if(add_to_group_internal(group, object)) {
+ if((object->flag & OB_FROMGROUP)==0) {
+
+ if(scene && base==NULL)
+ base= object_in_scene(object, scene);
+
+ object->flag |= OB_FROMGROUP;
+
+ if(base)
+ base->flag |= OB_FROMGROUP;
+ }
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
/* also used for ob==NULL */
-int rem_from_group(Group *group, Object *ob)
+static int rem_from_group_internal(Group *group, Object *ob)
{
GroupObject *go, *gon;
int removed = 0;
@@ -192,6 +213,26 @@
return removed;
}
+int rem_from_group(Group *group, Object *object, Scene *scene, Base *base)
+{
+ if(rem_from_group_internal(group, object)) {
+
+ if(find_group(object, NULL) == NULL) {
+ if(scene && base==NULL)
+ base= object_in_scene(object, scene);
+
+ object->flag &= ~OB_FROMGROUP;
+
+ if(base)
+ base->flag &= ~OB_FROMGROUP;
+ }
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
int object_in_group(Object *ob, Group *group)
{
GroupObject *go;
Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c 2009-11-11 16:27:00 UTC (rev 24501)
+++ trunk/blender/source/blender/blenkernel/intern/object.c 2009-11-11 16:28:53 UTC (rev 24502)
@@ -622,7 +622,7 @@
/* groups */
group= G.main->group.first;
while(group) {
- rem_from_group(group, ob);
+ rem_from_group(group, ob, NULL, NULL);
group= group->id.next;
}
Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c 2009-11-11 16:27:00 UTC (rev 24501)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c 2009-11-11 16:28:53 UTC (rev 24502)
@@ -5261,7 +5261,7 @@
go= go->next;
}
if(add_us) group->id.us++;
- rem_from_group(group, NULL); /* removes NULL entries */
+ rem_from_group(group, NULL, NULL, NULL); /* removes NULL entries */
}
group= group->id.next;
}
Modified: trunk/blender/source/blender/editors/object/object_add.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_add.c 2009-11-11 16:27:00 UTC (rev 24501)
+++ trunk/blender/source/blender/editors/object/object_add.c 2009-11-11 16:28:53 UTC (rev 24502)
@@ -1262,9 +1262,8 @@
Group *group;
for(group= G.main->group.first; group; group= group->id.next) {
if(object_in_group(ob, group))
- add_to_group(group, obn);
+ add_to_group(group, obn, scene, basen);
}
- obn->flag |= OB_FROMGROUP; /* this flag is unset with copy_object() */
}
/* duplicates using userflags */
Modified: trunk/blender/source/blender/editors/object/object_group.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_group.c 2009-11-11 16:27:00 UTC (rev 24501)
+++ trunk/blender/source/blender/editors/object/object_group.c 2009-11-11 16:28:53 UTC (rev 24502)
@@ -60,7 +60,7 @@
static int objects_add_active_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= OBACT, *obt;
+ Object *ob= OBACT;
Group *group;
int ok = 0;
@@ -73,11 +73,7 @@
if(object_in_group(ob, group)) {
/* Assign groups to selected objects */
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- obt= base->object;
- add_to_group(group, obt);
- obt->flag |= OB_FROMGROUP;
- base->flag |= OB_FROMGROUP;
- base->object->recalc= OB_RECALC_OB;
+ add_to_group(group, base->object, scene, base);
ok = 1;
}
CTX_DATA_END;
@@ -110,7 +106,7 @@
static int objects_remove_active_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= OBACT, *obt;
+ Object *ob= OBACT;
Group *group;
int ok = 0;
@@ -123,11 +119,7 @@
if(object_in_group(ob, group)) {
/* Assign groups to selected objects */
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- obt= base->object;
- rem_from_group(group, obt);
- obt->flag &= ~OB_FROMGROUP;
- base->flag &= ~OB_FROMGROUP;
- base->object->recalc= OB_RECALC_OB;
+ rem_from_group(group, base->object, scene, base);
ok = 1;
}
CTX_DATA_END;
@@ -165,11 +157,7 @@
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
group = NULL;
while((group = find_group(base->object, group)))
- rem_from_group(group, base->object);
-
- base->object->flag &= ~OB_FROMGROUP;
- base->flag &= ~OB_FROMGROUP;
- base->object->recalc= OB_RECALC_OB;
+ rem_from_group(group, base->object, scene, base);
}
CTX_DATA_END;
@@ -205,10 +193,7 @@
group= add_group(name);
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- add_to_group(group, base->object);
- base->object->flag |= OB_FROMGROUP;
- base->flag |= OB_FROMGROUP;
- base->object->recalc= OB_RECALC_OB;
+ add_to_group(group, base->object, scene, base);
}
CTX_DATA_END;
@@ -259,9 +244,7 @@
group= BLI_findlink(&bmain->group, value);
if(group) {
- add_to_group(group, ob);
- ob->flag |= OB_FROMGROUP;
- base->flag |= OB_FROMGROUP;
+ add_to_group(group, ob, scene, NULL); /* base will be used if found */
}
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -323,22 +306,12 @@
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Group *group= CTX_data_pointer_get_type(C, "group", &RNA_Group).data;
- Base *base;
if(!ob || !group)
return OPERATOR_CANCELLED;
- base= object_in_scene(ob, scene);
- if(!base)
- return OPERATOR_CANCELLED;
+ rem_from_group(group, ob, scene, NULL); /* base will be used if found */
- rem_from_group(group, ob);
-
- if(find_group(ob, NULL) == NULL) {
- ob->flag &= ~OB_FROMGROUP;
- base->flag &= ~OB_FROMGROUP;
- }
-
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return OPERATOR_FINISHED;
Modified: trunk/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_access.h 2009-11-11 16:27:00 UTC (rev 24501)
+++ trunk/blender/source/blender/makesrna/RNA_access.h 2009-11-11 16:28:53 UTC (rev 24502)
@@ -683,7 +683,10 @@
int RNA_property_collection_lookup_index(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *t_ptr);
int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr);
int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr);
+
PropertyRNA *RNA_property_collection_active(PropertyRNA *prop);
+FunctionRNA *RNA_property_collection_add_func(PropertyRNA *prop);
+FunctionRNA *RNA_property_collection_remove_func(PropertyRNA *prop);
/* efficient functions to set properties for arrays */
int RNA_property_collection_raw_array(PointerRNA *ptr, PropertyRNA *prop, PropertyRNA *itemprop, RawArray *array);
Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c 2009-11-11 16:27:00 UTC (rev 24501)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c 2009-11-11 16:28:53 UTC (rev 24502)
@@ -1567,7 +1567,7 @@
void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr)
{
IDProperty *idprop;
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+// CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
if((idprop=rna_idproperty_check(&prop, ptr))) {
IDPropertyTemplate val = {0};
@@ -1593,6 +1593,9 @@
MEM_freeN(item);
}
}
+
+ /* py api calls directly */
+#if 0
else if(cprop->add){
if(!(cprop->add->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */
ParameterList params;
@@ -1603,6 +1606,7 @@
}
/*else
printf("RNA_property_collection_add %s.%s: not implemented for this property.\n", ptr->type->identifier, prop->identifier);*/
+#endif
if(r_ptr) {
if(idprop) {
@@ -1620,7 +1624,7 @@
int RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key)
{
IDProperty *idprop;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list