? .git ? user-config.py ? tools/Blender.pyc ? tools/__init__.pyc ? tools/bcolors.pyc ? tools/btools.pyc Index: source/blender/blenkernel/BKE_group.h =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/blenkernel/BKE_group.h,v retrieving revision 1.7 diff -u -r1.7 BKE_group.h --- source/blender/blenkernel/BKE_group.h 11 Mar 2007 16:25:13 -0000 1.7 +++ source/blender/blenkernel/BKE_group.h 12 Mar 2007 23:26:53 -0000 @@ -46,6 +46,7 @@ void add_to_group(struct Group *group, struct Object *ob); void rem_from_group(struct Group *group, struct Object *ob); struct Group *find_group(struct Object *ob); +int find_group_number ( struct Object *ob, int *names_len ); int object_in_group(struct Object *ob, struct Group *group); void group_tag_recalc(struct Group *group); Index: source/blender/blenkernel/intern/group.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/blenkernel/intern/group.c,v retrieving revision 1.8 diff -u -r1.8 group.c --- source/blender/blenkernel/intern/group.c 11 Mar 2007 16:25:13 -0000 1.8 +++ source/blender/blenkernel/intern/group.c 12 Mar 2007 23:26:54 -0000 @@ -176,6 +176,28 @@ return NULL; } +int find_group_number ( Object *ob, int *names_len ) +{ + Group *group = G.main->group.first; + int ngrp, nlen; + + ngrp = 0; + nlen = 0; + while (group) { + if (object_in_group (ob, group)) { + nlen += strlen (group->id.name); + ngrp++; + } + + group = group->id.next; + } + + if (names_len) + (*names_len) = (nlen+1); /* the NULL character. */ + + return (ngrp); +} + void group_tag_recalc(Group *group) { GroupObject *go; Index: source/blender/src/space.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/src/space.c,v retrieving revision 1.454 diff -u -r1.454 space.c --- source/blender/src/space.c 8 Mar 2007 05:54:39 -0000 1.454 +++ source/blender/src/space.c 12 Mar 2007 23:27:04 -0000 @@ -695,10 +695,87 @@ static void select_same_group(Object *ob) /* Select objects in the same group as the active */ { Base *base; - Group *group= find_group(ob); - if (!group || !ob) + Group *group; + char *str; + int ngr, nstr, menu, i, e, j; + + if (!ob) return; - + + nstr = 0; + ngr = find_group_number (ob, &nstr); + if (ngr == 0) + return; + else if (ngr == 1) { + group = find_group (ob); + for (base= FIRSTBASE; base; base= base->next) { + if (!(base->flag & SELECT) && object_in_group(base->object, group)) { + base->flag |= SELECT; + base->object->flag |= SELECT; + } + } + return; + } + + if (nstr > 9) + nstr += (5 * ngr); + else + nstr += (4 * ngr); + + nstr += 9; + str = MEM_mallocN (nstr, "select_groupmenu"); + sprintf (str, "Groups%%t|"); + e = strlen (str); + + /* build the menu. */ + group = G.main->group.first; + i = 0; + while (group) { + if (object_in_group (ob, group)) { + for (j = 0; j < strlen (group->id.name); j++) { + str[e] = group->id.name[j]; + e++; + } + + str[e] = '%'; + e++; + str[e] = 'x'; + e++; + if (i > 9) { + str[e] = (i/10) + 48; + e++; + str[e] = (i%10) + 48; + } else + str[e] = i + 48; + + e++; + str[e] = '|'; + i++; + e++; + } + if (i > ngr) + break; + group = group->id.next; + } + + str[e] = '\0'; + menu = pupmenu (str); + MEM_freeN (str); + + group = G.main->group.first; + i = 0; + while (group) { + if (object_in_group (ob, group)) { + if (i == menu) + break; + i++; + } + group = group->id.next; + } + + if (!group) + return; + for (base= FIRSTBASE; base; base= base->next) { if (!(base->flag & SELECT) && object_in_group(base->object, group)) { base->flag |= SELECT;