Bugfix; appending with using relative paths made all dynamic links from

other libraries local.

Also added some securities in the temporal 'sync pose' testing code. It now
asks with a menu to confirm the object to be replaced too. Later more!
This commit is contained in:
Ton Roosendaal 2005-10-25 18:22:34 +00:00
parent dd38751a84
commit ce85adc780
2 changed files with 46 additions and 32 deletions

@ -5846,7 +5846,6 @@ void BLO_library_append(SpaceFile *sfile, char *dir, int idcode)
BLI_strncpy(filename, G.sce, sizeof(filename));
BLI_strncpy(G.sce, fd->filename, sizeof(filename)); // already opened file, to reconstruct relative paths
if(sfile->flag & FILE_AUTOSELECT) scene_deselect_all(G.scene);
fd->mainlist.first= fd->mainlist.last= G.main;
@ -5893,7 +5892,12 @@ void BLO_library_append(SpaceFile *sfile, char *dir, int idcode)
sfile->libfiledata= 0;
}
if(sfile->flag & FILE_STRINGCODE) BLI_makestringcode(filename, mainl->curlib->name); // uses old .blend file as reference
if(sfile->flag & FILE_STRINGCODE) {
/* uses old .blend file (*filename) as reference */
BLI_makestringcode(filename, mainl->curlib->name);
/* the caller checks for appended library, so we make sure names match */
BLI_strncpy(dir, mainl->curlib->name, sizeof(mainl->curlib->name));
}
if(sfile->flag & FILE_ATCURSOR) {
centerbase= (G.scene->base.first);

@ -2264,37 +2264,44 @@ static void do_sync_pose(Library *lib)
if(ob->type==OB_ARMATURE && ob->id.lib==lib)
break;
if(ob==NULL || ob->pose==NULL)
if(ob==NULL || ob->pose==NULL) {
error("No pose appended");
return;
}
arm= ob->data;
/* for all visible objects in this scene */
for(base= G.scene->base.first; base; base= base->next) {
if((base->flag & SELECT) || (base->object->flag & OB_POSEMODE)) {
if((base->flag & SELECT)) {
obt= base->object;
if(obt->type==OB_ARMATURE && obt->pose && ob!=obt) {
bPoseChannel *chan;
bArmature *oldarm= obt->data;
char str[128];
/* link armature */
oldarm->id.us--;
obt->data= arm;
arm->id.us++;
/* link pose */
free_pose_channels(obt->pose);
MEM_freeN(obt->pose);
copy_pose(&obt->pose, ob->pose, 1);
/* relink */
ob->id.newid= &obt->id;
for (chan = obt->pose->chanbase.first; chan; chan=chan->next){
relink_constraints(&chan->constraints);
sprintf(str, "Replace Object %s", obt->id.name);
if(okee(str)) {
bPoseChannel *chan;
bArmature *oldarm= obt->data;
/* link armature */
oldarm->id.us--;
obt->data= arm;
arm->id.us++;
/* link pose */
free_pose_channels(obt->pose);
MEM_freeN(obt->pose);
copy_pose(&obt->pose, ob->pose, 1);
/* relink */
ob->id.newid= &obt->id;
for (chan = obt->pose->chanbase.first; chan; chan=chan->next){
relink_constraints(&chan->constraints);
}
obt->pose->flag |= POSE_RECALC;
obt->recalc |= OB_RECALC_DATA;
}
obt->pose->flag |= POSE_RECALC;
obt->recalc |= OB_RECALC_DATA;
}
}
}
@ -2308,6 +2315,8 @@ static void do_sync_pose(Library *lib)
if(base) {
free_and_unlink_base(base);
}
DAG_scene_sort(G.scene); // for accidentally appended other objects
}
static void do_library_append(SpaceFile *sfile)
@ -2327,7 +2336,7 @@ static void do_library_append(SpaceFile *sfile)
Object *ob;
int idcode = groupname_to_code(group);
BLO_library_append(sfile, dir, idcode);
BLO_library_append(sfile, dir, idcode); /* warning; if relative, it changes the *dir to relative path */
/* DISPLISTS? */
ob= G.main->object.first;
@ -2338,9 +2347,6 @@ static void do_library_append(SpaceFile *sfile)
ob= ob->id.next;
}
/* in sfile->dir is the whole lib name */
strcpy(G.lib, sfile->dir);
/* and now find the latest append lib file */
lib= G.main->library.first;
while(lib) {
@ -2348,12 +2354,16 @@ static void do_library_append(SpaceFile *sfile)
lib= lib->id.next;
}
if(sfile->flag & FILE_SYNCPOSE)
do_sync_pose(lib);
if((sfile->flag & FILE_LINK)==0)
all_local(lib);
if(lib) {
if(sfile->flag & FILE_SYNCPOSE)
do_sync_pose(lib);
if((sfile->flag & FILE_LINK)==0)
all_local(lib);
}
/* in sfile->dir is the whole lib name */
strcpy(G.lib, sfile->dir);
DAG_scene_sort(G.scene);
}
}