void unlink_group(Group *group) { Material *ma; Object *ob; Scene *sce; SceneRenderLayer *srl; ParticleSystem *psys; for(ma= G.main->mat.first; ma; ma= ma->id.next) { if(ma->group==group) ma->group= NULL; } for(ma= G.main->mat.first; ma; ma= ma->id.next) { if(ma->group==group) ma->group= NULL; } for (sce= G.main->scene.first; sce; sce= sce->id.next) { Base *base= sce->base.first; /* 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) { base->object->flag &= ~OB_FROMGROUP; base->flag &= ~OB_FROMGROUP; } } for(srl= sce->r.layers.first; srl; srl= srl->next) { if (srl->light_override==group) srl->light_override= NULL; } } for(ob= G.main->object.first; ob; ob= ob->id.next) { bActionStrip *strip; if(ob->dup_group==group) { ob->dup_group= NULL; /* duplicator strips use a group object, we remove it */ for(strip= ob->nlastrips.first; strip; strip= strip->next) { if(strip->object) strip->object= NULL; } } for(psys=ob->particlesystem.first; psys; psys=psys->next){ if(psys->part->dup_group==group) psys->part->dup_group= NULL; if(psys->part->eff_group==group) psys->part->eff_group= NULL; } } /* group stays in library, but no members */ free_group(group); group->id.us= 0; }
static void rna_Group_objects_unlink(Group *group, bContext *C, ReportList *reports, Object *object) { if(!rem_from_group(group, object, CTX_data_scene(C), NULL)) { BKE_reportf(reports, RPT_ERROR, "Object \"%s\" not in group \"%s\"", object->id.name+2, group->id.name+2); return; } WM_main_add_notifier(NC_OBJECT|ND_DRAW, &object->id); }
static int objects_remove_active_exec(bContext *C, wmOperator *op) { Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); Object *ob= OBACT; Group *group; int ok = 0; if (!ob) return OPERATOR_CANCELLED; /* linking to same group requires its own loop so we can avoid * looking up the active objects groups each time */ for (group= bmain->group.first; group; group=group->id.next) { if (object_in_group(ob, group)) { /* Assign groups to selected objects */ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) { rem_from_group(group, base->object, scene, base); ok = 1; } CTX_DATA_END; } }