[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18580] branches/blender2.5/blender/source /blender/editors/object: 2.5

Michael Fox mfoxdogg at gmail.com
Tue Jan 20 04:41:25 CET 2009


Revision: 18580
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18580
Author:   mfoxdogg
Date:     2009-01-20 04:41:23 +0100 (Tue, 20 Jan 2009)

Log Message:
-----------
  2.5
******
- Ported , add selected to group (Ctrl-G), remove selected from group(Alt-Ctrl-G)
	- add selected now has a add new entry which will put the object into a new group
	- remove selected now has an ALL option which removes the object from all groups
	- remove code is currently very messy, this will have to do until a better solution arrises, menus return strings instead of numbers perhaps

- add/remove to/from group of active object still need to be done

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/object/editgroup.c
    branches/blender2.5/blender/source/blender/editors/object/object_intern.h
    branches/blender2.5/blender/source/blender/editors/object/object_ops.c

Modified: branches/blender2.5/blender/source/blender/editors/object/editgroup.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/object/editgroup.c	2009-01-19 21:42:18 UTC (rev 18579)
+++ branches/blender2.5/blender/source/blender/editors/object/editgroup.c	2009-01-20 03:41:23 UTC (rev 18580)
@@ -42,8 +42,24 @@
 #include "BKE_depsgraph.h"
 #include "BKE_group.h"
 #include "BKE_global.h"
+#include "BKE_context.h"
 #include "BKE_main.h"
 
+#include "ED_view3d.h"
+#include "ED_space_api.h"
+#include "ED_screen.h"
+#include "ED_types.h"
+#include "ED_util.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
 #include "object_intern.h"
 
 /* XXX */
@@ -52,22 +68,6 @@
 static int pupmenu() {return 0;}
 static int pupmenu_col() {return 0;}
 
-void add_selected_to_group(Scene *scene, View3D *v3d, Group *group)
-{
-	Base *base;
-	
-	for(base=FIRSTBASE; base; base= base->next) {
-		if (TESTBASE(v3d, base)) {
-			add_to_group(group, base->object);
-			base->object->flag |= OB_FROMGROUP;
-			base->flag |= OB_FROMGROUP;
-		}
-	}
-	
-	DAG_scene_sort(scene);
-	BIF_undo_push("Add to Group");
-}
-
 void add_selected_to_act_ob_groups(Scene *scene, View3D *v3d)
 {
 	Object *ob= OBACT, *obt;
@@ -100,14 +100,17 @@
 	BIF_undo_push("Add to Active Objects Group");
 }
 
+static int group_remove_exec(bContext *C, wmOperator *op)
+{
+	Group *group= NULL;
+	Group *group_array[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+	int gid,i=0; //group id
 
-void rem_selected_from_all_groups(Scene *scene, View3D *v3d)
-{
-	Base *base;
-	Group *group;
+	gid = RNA_int_get(op->ptr, "GID");
 	
-	for(base=FIRSTBASE; base; base= base->next) {
-		if (TESTBASE(v3d, base)) {
+	/*remove from all groups*/
+	if (gid == 26) {
+		CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
 			group = NULL;
 			while( (group = find_group(base->object, group)) ) {
 				rem_from_group(group, base->object);
@@ -115,22 +118,46 @@
 			base->object->flag &= ~OB_FROMGROUP;
 			base->flag &= ~OB_FROMGROUP;
 		}
+		CTX_DATA_END;
 	}
+	else {		
+		/* build array of the groups that are in menu*/
+		for(group= G.main->group.first; group && i<24; group= group->id.next) {
+			if(group->id.lib==NULL) {
+				GroupObject *go;
+				for(go= group->gobject.first; go; go= go->next) {
+					if(go->ob->id.flag & LIB_DOIT) {
+						group_array[i] = group;
+						i++;
+						break; /* Only want to know if this group should go in the list*/
+					}
+				}
+			}
+		}
 	
-	DAG_scene_sort(scene);
-	BIF_undo_push("Remove from Group");
-}
+		CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+			/* if we are removed and are not in any group, set our flag */
+			if(rem_from_group(group, base->object) && find_group(base->object, NULL)==NULL) {
+				base->object->flag &= ~OB_FROMGROUP;
+				base->flag &= ~OB_FROMGROUP;
+			}
+		}
+		CTX_DATA_END;
+	}
 
+	DAG_scene_sort(CTX_data_scene(C));
+	ED_undo_push(C,"Remove From Group");
 
-void rem_selected_from_group(Scene *scene, View3D *v3d)
+	WM_event_add_notifier(C, NC_SCENE, CTX_data_scene(C));
+	
+	return OPERATOR_FINISHED;
+
+}
+static int group_remove_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
-	char menutext[30+(22*22)], *menupt;
-	int i=0;
-	short ret;
 	Group *group= NULL;
-	Object *ob;
-	Base *base;
-	Group *group_array[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+	char *menutext= MEM_callocN(30+(22*22), "group rem menu"), *menupt;
+	int i = 0;
 	
 	/* UnSet Tags for Objects and Groups */
 	for(group= G.main->group.first; group; group= group->id.next) {
@@ -138,25 +165,27 @@
 			group->id.flag &= ~LIB_DOIT;
 		}
 	}
-	for(ob=G.main->object.first; ob; ob= ob->id.next) {
+	CTX_DATA_BEGIN(C, Object*, ob, visible_objects) {
 		ob->id.flag &= ~LIB_DOIT;
 	}
+	CTX_DATA_END;
 	
 	/* Not tag selected objects */
-	for(base=FIRSTBASE; base; base= base->next) {
-		if (TESTBASELIB(v3d, base)) {
+	CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
 			base->object->id.flag |= LIB_DOIT;
-		}
 	}
+	CTX_DATA_END;
 	
 	menupt = menutext;
+	
+	menupt += sprintf(menupt, "Remove From %%t|");
+	
 	/* Build a list of groups that contain selected objects */
 	for(group= G.main->group.first; group && i<24; group= group->id.next) {
 		if(group->id.lib==NULL) {
 			GroupObject *go;
 			for(go= group->gobject.first; go; go= go->next) {
 				if(go->ob->id.flag & LIB_DOIT) {
-					group_array[i] = group;
 					menupt += sprintf(menupt, "|%s", group->id.name+2);
 					i++;
 					break; /* Only want to know if this group should go in the list*/
@@ -164,81 +193,92 @@
 			}
 		}
 	}
+	menupt += sprintf(menupt, "|%s %%x%d", "ALL", 26);
+	/* do we have any groups? */
+	if (i = 0) error("Object selection contains no groups");
+	else	uiPupmenuOperator(C, 0, op, "GID", menutext);
+		
+	MEM_freeN(menutext);
+	return OPERATOR_RUNNING_MODAL;
+}
+void GROUP_OT_group_remove(wmOperatorType *ot)
+{
 	
-	/* do we have any groups? */
-	if (group_array[0] == NULL) {
-		error("Object selection contains no groups");
-	} else {
-		ret = pupmenu(menutext);
-		if (ret==-1) {
-			return;
-		} else { 
-			group = group_array[ret-1];
-			for(base=FIRSTBASE; base; base= base->next) {
-				if (TESTBASELIB(v3d, base)) {
-					/* if we are removed and are not in any group, set our flag */
-					if(rem_from_group(group, base->object) && find_group(base->object, NULL)==NULL) {
-						base->object->flag &= ~OB_FROMGROUP;
-						base->flag &= ~OB_FROMGROUP;
-					}
-				}
-			}
-		}
+	/* identifiers */
+	ot->name= "remove Selected from group";
+	ot->idname= "GROUP_OT_group_remove";
+	
+	/* api callbacks */
+	ot->invoke = group_remove_invoke;
+	ot->exec= group_remove_exec;	
+	ot->poll= ED_operator_scene_editable;
+	
+	RNA_def_int(ot->srna, "GID", 0, INT_MIN, INT_MAX, "Group", "", INT_MIN, INT_MAX);
+}
+static int group_create_exec(bContext *C, wmOperator *op)
+{
+	Group *group= NULL;
+	int gid; //group id
+	
+	gid = RNA_int_get(op->ptr, "GID");
+	
+	if(gid>0) group= BLI_findlink(&G.main->group, gid-1);
+	else if (gid == 0 ) group= add_group( "Group" );
+	else return OPERATOR_CANCELLED;
+	
+	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;
 	}
+	CTX_DATA_END;
+
+	DAG_scene_sort(CTX_data_scene(C));
+	ED_undo_push(C,"Add to Group");
+
+	WM_event_add_notifier(C, NC_SCENE, CTX_data_scene(C));
 	
-	DAG_scene_sort(scene);
-	BIF_undo_push("Remove from Group");
+	return OPERATOR_FINISHED;
+
 }
-
-void group_operation(Scene *scene, View3D *v3d, int mode)
+static int group_create_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
 	Group *group= NULL;
-	
+	int tot= BLI_countlist(&G.main->group);
+	char *strp= MEM_callocN(tot*32 + 32, "group menu"), *strp1;
+
 	/* are there existing groups? */
 	for(group= G.main->group.first; group; group= group->id.next)
 		if(group->id.lib==NULL)
 			break;
+	strp1= strp;
+	strp1 += sprintf(strp1, "Add To %%t|");
 	
-	if(mode>0) {
-		if(group==NULL || mode==1) group= add_group( "Group" );
-		if(mode==3) {
-			int tot= BLI_countlist(&G.main->group);
-			char *strp= MEM_callocN(tot*32 + 32, "group menu"), *strp1;
-			
-			strp1= strp;
-			for(tot=1, group= G.main->group.first; group; group= group->id.next, tot++) {
-				if(group->id.lib==NULL) {
-					strp1 += sprintf(strp1, "%s %%x%d|", group->id.name+2, tot);
-				}
-			}
-			tot= pupmenu_col(strp, 20);
-			MEM_freeN(strp);
-			if(tot>0) group= BLI_findlink(&G.main->group, tot-1);
-			else return;
+	strp1 += sprintf(strp1, "%s %%x%d|", "ADD NEW", 0);
+	
+	for(tot=1, group= G.main->group.first; group; group= group->id.next, tot++) {
+		if(group->id.lib==NULL) {
+			strp1 += sprintf(strp1, "%s %%x%d|", group->id.name+2, tot);
 		}
-		
-		if(mode==4) add_selected_to_act_ob_groups(scene, v3d);
-		else if(mode==1 || mode==3) add_selected_to_group(scene, v3d, group);
-		else if(mode==2) rem_selected_from_all_groups(scene, v3d);
-		else if(mode==5) rem_selected_from_group(scene, v3d);
 	}
+	uiPupmenuOperator(C, 0, op, "GID", strp);
+	MEM_freeN(strp);
+
+	return OPERATOR_RUNNING_MODAL;
 }
-
-void group_operation_with_menu(Scene *scene, View3D *v3d)
+void GROUP_OT_group_create(wmOperatorType *ot)
 {
-	Group *group= NULL;
-	int mode;
 	
-	/* are there existing groups? */
-	for(group= G.main->group.first; group; group= group->id.next)
-		if(group->id.lib==NULL)
-			break;
+	/* identifiers */
+	ot->name= "Add Selected to group";
+	ot->idname= "GROUP_OT_group_create";
 	
-	if(group)
-		mode= pupmenu("Groups %t|Add to Existing Group %x3|Add to Active Objects Groups %x4|Add to New Group %x1|Remove from Group %x5|Remove from All Groups %x2");
-	else
-		mode= pupmenu("Groups %t|Add to New Group %x1|Remove from All Groups %x2");
+	/* api callbacks */
+	ot->invoke = group_create_invoke;
+	ot->exec= group_create_exec;	
+	ot->poll= ED_operator_scene_editable;
 	
-	group_operation(scene, v3d, mode);
+	RNA_def_int(ot->srna, "GID", 0, INT_MIN, INT_MAX, "Group", "", INT_MIN, INT_MAX);
 }
 

Modified: branches/blender2.5/blender/source/blender/editors/object/object_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/object/object_intern.h	2009-01-19 21:42:18 UTC (rev 18579)
+++ branches/blender2.5/blender/source/blender/editors/object/object_intern.h	2009-01-20 03:41:23 UTC (rev 18580)
@@ -72,6 +72,9 @@
 void load_editLatt(Object *obedit);
 void remake_editLatt(Object *obedit);
 
+/* editgroup.c */
+void GROUP_OT_group_create(struct wmOperatorType *ot);
+void GROUP_OT_group_remove(struct wmOperatorType *ot);
 
 #endif /* ED_OBJECT_INTERN_H */
 

Modified: branches/blender2.5/blender/source/blender/editors/object/object_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/object/object_ops.c	2009-01-19 21:42:18 UTC (rev 18579)
+++ branches/blender2.5/blender/source/blender/editors/object/object_ops.c	2009-01-20 03:41:23 UTC (rev 18580)
@@ -86,6 +86,8 @@
 	WM_operatortype_append(OBJECT_OT_make_dupli_real);
 	WM_operatortype_append(OBJECT_OT_object_add);
 	WM_operatortype_append(OBJECT_OT_add_duplicate);
+	WM_operatortype_append(GROUP_OT_group_create);
+	WM_operatortype_append(GROUP_OT_group_remove);
 }
 
 void ED_keymap_object(wmWindowManager *wm)
@@ -125,5 +127,8 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list