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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to