PDA

Voir la version complète : Gestion des fichiers en COFFEE



Steph3D ::.
27/01/2004, 09h32
Bon alors cette fois, j'essaye de comprendre la gestion des fichiers. Enfin je me démerde comme je peux avec la doc des fonctions vu que je n'ai pas trouvé d'exemples comcrets sur le sujet :|
J'esaye de pouvoir à partir d'un petit plug-in, fusionné des scènes (merge) rangé dans son répertoir racine (du plug) et éventuellement sauvegardé la scene en cours de la même façon.

Je me dis que la classe BaseDocument (http://www.plugincafe.com/sdk_detail.asp?ID=38934&gmode=3) est la base de toute la scene, alors je regarde dans la doc, et là, pas de fonction Merge ni même Load :(

Par contre il y a Save, alors je tente le coup avec ça pour voir, mais déjà là, mon plug démare bien, mais sauvegarde pas la scene, ce n'est pas gagné quoi :o :oops:


const var PLUGIN_ID = 1910352;

var icon;

class CreateSaveLoadObjet extends MenuPlugin
{
public:
CreateSaveLoadObjet();
GetID();
GetName();
GetHelp();
GetIcon();
Execute(doc);
}

CreateSaveLoadObjet::CreateSaveLoadObjet() { super(); }

CreateSaveLoadObjet::GetID() { return PLUGIN_ID; }

CreateSaveLoadObjet::GetName() { return "SaveLoadObjet"; }

CreateSaveLoadObjet::GetHelp() { return "SaveLoadObjet test"; }

CreateSaveLoadObjet::GetIcon() { return icon; }

CreateSaveLoadObjet::Execute(doc)
{
var f=new(Filename);
f->FileSelect("Ma_scene.c4d"); // nom du fichier
f->PathSelect(GeGetRootFilename()); // chemin du dossier du plug
doc->Save(f); // save scene en cours
}

main()
{
var path = GeGetRootFilename();
path->RemoveLast();
path->AddLast("ico.tif");
icon = new(BaseBitmap,1,1);
icon->Load(path);
Register(CreateSaveLoadObjet);
return TRUE;
}

Tengaal
27/01/2004, 09h43
Dejà, tu n'a pas besoin de ta ligne f->PathSelect(titre_dialog) à partir du moment ou l'utilisateur à choisi le fichier avec
f->FileSelect(titre_dialog,TRUE).
Sinon, tu peux génerer toi même le chemin (f) avec les fonction AddLast(..), RemoveLast(...), SetSuffix(...) ...

Quand tu developpes ainsi tes plugs, pense à ouvrir la fenetre console qui t'indique les erreurs de ton code si aucune action ne se fait. :wink:

Steph3D ::.
27/01/2004, 11h47
Merci pour l'info :-)
alors bon voila la correction, ça marche pour la sauvegarde :poucehaut:

Par contre pour fusionner la scene appelée, là, je ne vois pas car il n'y a pas de fonction du type doc ->Merge(f) ; ou doc->Load(f); :cry2:



const var PLUGIN_ID = 1910352;

var icon;

class CreateSaveLoadObjet extends MenuPlugin
{
public:
CreateSaveLoadObjet();
GetID();
GetName();
GetHelp();
GetIcon();
Execute(doc);
}

CreateSaveLoadObjet::CreateSaveLoadObjet() { super(); }

CreateSaveLoadObjet::GetID() { return PLUGIN_ID; }

CreateSaveLoadObjet::GetName() { return "SaveLoadObjet"; }

CreateSaveLoadObjet::GetHelp() { return "SaveLoadObjet test"; }

CreateSaveLoadObjet::GetIcon() { return icon; }

CreateSaveLoadObjet::Execute(doc)
{

var f=GeGetRootFilename();
f->RemoveLast();
f->AddLast("Ma_scene.c4d");
doc->Save(f);

}

main()
{
var path = GeGetRootFilename();
path->RemoveLast();
path->AddLast("ico.tif");
icon = new(BaseBitmap,1,1);
icon->Load(path);
Register(CreateSaveLoadObjet);
return TRUE;
}

Tengaal
27/01/2004, 13h11
Oui, on ne peut pas importer (merge/fusion) un fichier dans un document existant, on ne peut que charger (load) ce qui bien entendu créé un nouveau document à chaque fois.
Je n'ai pas encore eu à traiter ce cas de figure mais, il est peut-être possible de bricoler ça en ouvrant le fichier C4D dans un nouveau document, puis toujours par programme on copie les objets dans la scène de travail (ou on veut importer), ensuite, une fois les objets insérés dans cette scène, on ferme le document ouvert précédemment (KillDocument(last_doc) : fonction non mentionnées dans la doc Coffee.)
Pour le principe copier/coller du contenu d'un document vers l'autre, il faut utiliser objet->CopyTo(objet_dest,flag); ou bien new_objet=objet->GetClone(flag);
Pour connaitre les différents flags, dans la doc du BaseObject voir CopyTo(...)

Aurety
27/01/2004, 13h33
euh... je sais pas si ça peut avoir le moindre intérêt dans votre petit duo mais je copie/colle un extrait sur une des questions que j'avais posé à Klaus de Bonderland... mon anglais est déplorable !



Always me...

I love your BL Browser but I can't understand why i can merge the BipedRig in my scene and not another file placed in the same folder. f.e. I modify the BipedRig for my character and I save the changes in another file called Bipedrig2.c4d in the same folder but I can't merge it on my character scene. I open a new scene... Why ??
Is there a way at the end to use your BL Browser like an objects library ??

thanks for your "patience" :D

currently c4d-files with the suffix:
.c4d - loads
.mop - merge the first object

I will add an addionally .rig suffix which merge with the scene


you can use it as an obj-library, just copy it to Bonderland/files

Tengaal
27/01/2004, 14h12
Je pense qu'il s'est créé son propre format .mop qui contient les infos sur les objets à créer et c'est ensuite le programme qui le génère directement dans la scène en cours...
Enfin on dirait, je n'y ai encore pas regardé à Bonderland ! (Pauvre de moi...)

Steph3D ::.
27/01/2004, 15h46
Sayé, là j'ai mal au crâne :cry2: Pas simple de faire une action normalement si simple :o

J'ai esayé diverse trucs délirants :oops: mais rien à faire


CreateLoadObjet::Execute(doc)
{

var f=GeGetRootFilename();
f->RemoveLast();
f->AddLast("test.c4d");
var ndoc=LoadDocument(f);
var objet=ndoc->FindObject("Objet test"); // Objet test dans test.c4d

//var new_objet=objet->GetClone();

//doc->InsertObject(news_objet,NULL,NULL);
//KillDocument(last_doc);

}

De plus j'ai bien du mal à voir comment je pourrais communiquer avec le nouveau fichier ouvert dans ma scene en cours
Les Flags proposent que ça comme options :shock:


Flag Explanation
CL_NO_BITS : Copy no BaseList2D bits (e.g. selection bits).
CL_ONLY_VISIBLETAGS : Copy only tags that are visible in the object manager.
CL_NO_TRACKS : Copy no tracks.
CL_NO_HIERARCHY : Copy only object without children.

KillDocument est documenté dans la doc C++, ça marche mais pas l'option last_flag, donc ça ne veux pas killté le document ouvert

Un truc à devenir chevre :coup:

Par contre des plugs pour planter C4D :mrgreen: ça j'arrive bien à faire de mille et une façon :poucehaut: :roll:

Tengaal
27/01/2004, 19h07
Heu... Quand j'ai écrit KillDocument(last_doc); j'ai pris "last_doc" comme nom d'exemple pour le document à fermer, ce n'est pas un flag.
Et tu vois bien que tu n'as aucune valeur last_doc définie dans ton programme ! :roll: :lol:

Les flags sont toujours écrits en majuscules...

Donc dans ton code il faudrait mettre KillDocument(ndoc); car "ndoc" est le document dans lequel tu as chargé ton fichier et que tu veux supprimer...

Steph3D ::.
27/01/2004, 20h21
a ok :o :oops:
Bon ben alors j'ai peut-être une piste pour choper les objets si mon résonement est bon. Une fois démarrer avec LoadDocument, c'est le nouveau document qui devient actif, donc suffirait de faire doc2=Getactivedocument ( ); pour le chopper et pouvoir y accéder par le COFFEE, puis copier les objets de doc2 vers doc et terminé par un KillDocument (doc2) ;

Bon le tout est que j'arrive à comprendre comment copier/coller maintenant :roll:

Tengaal
27/01/2004, 21h01
Pour la copie de ton objet avec GetClone(...) tu avais fait une erreur sur le nom "new_objet" et "news_objet" pour l'insertion dans le document, tu as dû voir le message d'erreur dans la fenêtre console avec le numéro de la ligne concernée. :wink:

Le principe me parait bon mais si malheureusement très lourd :cry:
Je n'ai pas eu le temps de tester le truc, je crois que lesujet avais été abordé sur le forum des developpeurs sur http://www.plugincafe.com .

Thierry HL
27/01/2004, 21h08
vous pouvez pas faire des efforts, et parler comme il faut non ???
je comprends rien à ce que vous dites :?

vous avez lu la charte oui ou non ???

après le texto et le SMS, voila le COFFEE, je rêve....


ok, je sorts, et je referme la porte :odile:

Steph3D ::.
27/01/2004, 21h10
Ayé, c'est bon, ça marche, voila le code de base


var f=GeGetRootFilename();
f->RemoveLast();
f->AddLast("scene.c4d");

LoadDocument(f);
var doc2=GetActiveDocument();

var objet=doc2->FindObject("MonObjet");
var new_objet=objet->GetClone(CL_NO_TRACKS);
doc->InsertObject(new_objet,NULL,NULL);

KillDocument(doc2);

Mais le seul probleme, c'est que les scripts Xpresso perdent leurs cibles sur les données de type "lien" lors du clonage :poucebas: :cry:

Klaus K.
27/01/2004, 23h08
Je pense qu'il s'est créé son propre format .mop qui contient les infos sur les objets à créer et c'est ensuite le programme qui le génère directement dans la scène en cours...
Enfin on dirait, je n'y ai encore pas regardé à Bonderland ! (Pauvre de moi...)

Hi,
the .mop and .rig files are c4d-files, I have changed only the suffix. The Bonderland Library merges this files with the scene and files with the suffix .c4d load into the scene.

Another problem with merging is that you need to create an AliasTranslators, otherwise all BaseLinks are lost. (f.e. tex-tags <-> materials, Xpresso <-> user-data ....)
I don’t know if you can do this with Coffee, but nevertheless here some C++ code-snipets, maybe it helps:




BaseDocument *doc=GetActiveDocument&#40;&#41;;
if &#40;!doc&#41; return FALSE;
BaseDocument *load_doc=LoadDocument&#40;this->file,TRUE&#41;;
if &#40;!load_doc&#41; return FALSE;

BaseObject *first_obj;
BaseMaterial *mat;

AutoAlloc<AliasTrans> aliastrans;
if &#40;!aliastrans || !aliastrans->Init&#40;load_doc&#41;&#41; return FALSE;

//transfer materials
for &#40;mat=load_doc->GetFirstMaterial&#40;&#41;;mat;mat=mat->GetNext&#40;&#41;&#41;
&#123;
BaseMaterial *dup_mat=&#40;BaseMaterial*&#41;mat->GetClone&#40;0,aliastrans&#41;; if &#40;!dup_mat&#41; return FALSE;
doc->InsertMaterial&#40;dup_mat,NULL&#41;;
&#125;

//transfer objects
for &#40;first_obj=load_doc->GetFirstObject&#40;&#41;;first_obj;first_obj=first_obj->GetNext&#40;&#41;&#41;
&#123;
BaseObject *dup = &#40;BaseObject*&#41;first_obj->GetClone&#40;0,aliastrans&#41;; if &#40;!dup&#41; return FALSE;
doc->InsertObject&#40;dup,NULL,NULL&#41;;
&#125;

aliastrans->Translate&#40;TRUE&#41;;

KillDocument&#40;load_doc&#41;;

Aurety
27/01/2004, 23h20
:D Wow !! Nice to see you here Klaus !! Thanks for the answer, I'm not able to appreciate your help but I think they're happy to see you here.

Look at the Steph3D experiments, and if you have time to comment or critic, it will be welcome !
:odile:

This is his topic...
http://www.frenchcinema4d.com/phpBB2/viewtopic.php?t=5440

Tengaal
28/01/2004, 00h05
Oui en C++ la fusion de fichier est faisable sans trop de problème.
Par contre pour le cas des pertes de liens d'Xpresso c'est simplement dû au fait qu'il pointe sur les objets de manière absolue par un identifiant unique et non en relatif par leur nom par exemple. Ainsi même si on a 2 cubes parfaitement identiques avec le même nom, Xpresso (et C4D 8 en général) distingue chacun des objets, le lien est donc unique pour un seul objet.

Klaus K.
28/01/2004, 00h13
:D Wow !! Nice to see you here Klaus !! Thanks for the answer, I'm not able to appreciate your help but I think they're happy to see you here.

Look at the Steph3D experiments, and if you have time to comment or critic, it will be welcome !
:odile:

This is his topic...
http://www.frenchcinema4d.com/phpBB2/viewtopic.php?t=5440

Yes, looks nice. Here at FrenchCinema4D is really a strong CA-community.

I can recommend Steph3D only to switch to C++, because with Coffee there are unfortunately too many SDK-limitations. I have also started with Coffee and switched (about 1 year ago) to C++. Read some C++ books, get a C++-Compiler and the fun begins :bounce:

Of course it’s at the beginning a bit hard "to ride the horse", many crashes, memory leaks and also the problem that you must compile extra for mac and pc.

But after some hard months :coup: you will see C4D in "a new light" because you understand much more of the background tasks and you have the SDK-power to add every kind of plugin :lol:

Steph3D ::.
28/01/2004, 09h27
Merci tout le monde ! :poucehaut: :D

En fait, là, j'ai fait une paire de prototypes d'outils d'animations en Xpresso, parfois façon Mac Gyver ;) et qui tournent très bien dans leurs principes.
Maintenant je cherche à les refaires au propre sous forme de plug in pour que cela soit bien plus accésible et pratique, mais ce n'est vraiment pas de la tarte ! :coup:
Et malheureusement je n'ai pas le temps de me mettre au C++, déjà que je débute en COFFEE. Si encor je pouvais rentabiliser le temps perdu et que j'etait pas tout seul dans mon coin, mais là... :cry2:
C'est parfois frustrant dans le sens où j'ai acquis après de très longues années (j'ai fait mes premières images sur Amiga en 1992), beaucoups de connaissance sur l'utilisation de logiciels 3D divers en tant qu'utilisateur et notament une bonne maîtrise de 3ds Max et CS. Cela me permet rapidement d'analysé assez bien les outils qui manquent à C4D et trouver des méthodes de travail. Malheuresuement mes bien modest connaissance en programation ne me permetent pour le moment au mieux que de faire des prototypes, exploitable certe, mais pas toujours tres propre :oops:


Sinon, pour le coffee, j'ai remarqué qu'avec CopyTo, ça semble faire une copie parfaite :? mais le probleme, c'est que ça ne veut pas passé au document1 et ça reste sur doc2

Avec un truc comme ça. :?

var dest_objet=new(NullObject);
doc->InsertObject(dest_objet,NULL,NULL);

LoadDocument(f);
var doc2=GetActiveDocument();

var objet=doc2->FindObject("Mon_Obj"); // L'objet à récupérer

dest_objet->CopyTo(objet,CL_NO_TRACKS);
KillDocument(doc2);

Et justement à propos des pointages d'objets qui me manquent cruellement au coffee :( je me demande si on ne pouvait pas au moins créer un GeBaseDialog de type LINK propre à XL8 dans une boîte de dialogue COFFEE. Du style AddEditLink ?


PS: désolé, je ne sais pas vraiment écrire en anglais :oops:

Tengaal
28/01/2004, 09h47
Je pense qu'il faut que tu insères objet_dest dans doc uniquement à la fin.
C'est à dire que tu le créés d'abord en mémoire, tu charges ton document 2, tu copies un objet du document 2 dans objet_dest, tu fermes document 2, puis tu insères objet_dest dans doc.

Je pense que ça doit le faire...

Avec si possible à chaque modification de scène un rafraichissement forcé:
GeEventAdd(DOCUMENT_CHANGED|REDRAW_ALL);

Steph3D ::.
29/01/2004, 08h39
Hélas, ça ne marche pas non plus, dommage, ça me paraissait une bonne idée, mais bon...