[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