Bonjour la compagnie :odile:
Maintenant que, grâce à mes études, je suis sensé savoir un peu mieux coder :nono: je me suis dit que j'allais me recoller à COFFEE pour faire un petit Plug.
Je voulais juste faire une automatisation d'un truc qu'on voit souvent fait en Xpresso sur les rigs de personnages. En gros c'est un plug avec deux fonctions :
- "Set home" qui ajoute un tag fait maison à/aux objets sélectionnés qui stocke les coordonnées (locales) de l'objet.
- "Get Back Home" qui fait rentrer le/les objets sélectionnés à la maison grâce aux infos du tag.
J'ai donc lu pas mal de SDK Coffee et commencé, mais j'ai tout de même quelques problèmes pour que ça fonctionne, et je demande avec toute mon humilité si des pros (ou moins pros vu que je suis tout en bas de l'échelle) pourraient m'aider. :calim:
---> Le fichier source. <--- [EDIT : LIEN MORT]
Dans un premier temps, j'ai des problèmes de rafraichissement, il faut cliquer dans le vide pour voir les effets de ce qu'on vient de faire. Dans un second temps, quand j'essaye de faire "Set Home" sur un objet qui a déjà un tag ça fia tplanter C4D, ce qui est plutôt embêtant...
Je pense que le gros de mes problème vient du fait que j'ai stocké les données du tag dans des champs de la classe (publiques avec ça). Je pense que je devrais utiliser un Container mais même à la lecture de la doc, son fonctionnement m'est complètement ésotérique.
Merci d'avance à ceux qui pourront m'aider :poucehaut:
Ps : ne faites pas attention à mon code :mrgreen: c'est moche et en franglais mais il faut bien s'amuser un peu
Hum, après relecture attentive de mon code, j'ai corrigé beaucoup de bêtises dues à la correction à chaud :art:
c'est surtout dans les execute.
Code:MyHomeTagMenu::Execute(doc) { doc->StartUndo(); var op=doc->GetActiveObject(); var ntag=op->GetFirstTag(); while((ntag!=NULL) && !instanceof(ntag,HomeTag)) { ntag=ntag->GetNext(); } if(ntag==NULL) { ntag=AllocTag(1000001); doc->AddUndo(UNDO_TAG_NEW,ntag); op->InsertTag(ntag); } doc->AddUndo(UNDO_TAG_DATA,ntag); ntag->P=op->GetPosition(); ntag->E=op->GetScale(); ntag->R=op->GetRotation(); doc->EndUndo(); }Voilà, les problèmes qui subsistent sont les problèmes de rafraichissementCode:HomeTagBackHome::Execute(doc) { doc->StartUndo(); var op=doc->GetActiveObject(); var tagtmp=op->GetFirstTag(); while(tagtmp!=NULL) { if(instanceof(tagtmp,HomeTag)) { doc->AddUndo(UNDO_OBJECT_BASEDATA,op); op->SetPosition(tagtmp->P); op->SetScale(tagtmp->E); op->SetRotation(tagtmp->R); break; } tagtmp=tagtmp->GetNext(); } doc->EndUndo(); }
Maintenant que ça commence à marcher, je me suis dit que ce serait bien que ça marche avec des selections multiples et d'avoir un minimum d'options dans le Tag (ne serait-ce que Activer/Désactiver).
salut floby
une petite idée comme ça en passant , le plus simple je pense ,
comme ton tag est attache a un objet , peut etre serrait t il plus simple de lier les valeur que tu veut stoker au container de cette objet
vas voir la pour savoir comment faire
paspas
Ah oui pas bête merci du tuyau. j'ai vu qu'on pouvait faire ça dans le SDK mais ils disaient qu'il faut avoir un ID unique de PluginCafé ou chépakoi. Ca m'a fait peur, je me suis dit que c'était pas pour moi ^^.
Cela dit, ça ne me semble pas réalisable de cette manière parce que ce tag doit pouvoir être applicable sur n'importe quel type d'objet. Or les IDs et le nombre d'IDs par container change d'un objet à l'autre. Puis en plus, à l'école on m'a appris que je devais pas aller toucher les données d'une classe que j'avais pas faite .
J'ai essayé d'ajouter un container à mon tag, et ça n'a pas raté, ça ne fonctionne pas. il dit :
"Incompatible values... NIL / OBJECT"
Dans ma fonction GetContainer sur l'instruction :
SV_ étant le container de mon tag.Code:return SV_->GetClone();
Et je n'ai toujours pas résolu les problèmes de rafraichissement, et je sens que c'est tout simple en plus, genre doc->Refresh() ou un truc comme ça ^^
pour les rafraîchissement vas voir du cote de "MESSAGE "
je comprends pas : si tu u crée X nouvelle valeur au container de l' objet ,le plus dont tu a besoin , et si il y en a moin que prevus tu ne met pas de valeurCela dit, ça ne me semble pas réalisable de cette manière parce que ce tag doit pouvoir être applicable sur n'importe quel type d'objet.
ce qui ferra a la lecture un "nil" pour cette valeur -> pas prit en compte par l' autre tag
de plus de cette manière tu sait pas in FindObjet trouver un objet et recupéré tes datas dans n' importe quelle cofee
paspas
hum... Je comprends pas bien ce que tu veux dire :?
Personne ne comprend jamais de toute façon. :mrgreen:
2x6coreXéon2.66(24T);64Gram; GTX 1080; OSX10.13.6 ////
Mac Studio 128 Ram ; OSX 12.3.1 ; papiercrayoncerveau;S22Studio;Redshift;Zbrush2022; CS2022
///SHTL 2011 DEMO HERE : http://demo.shtl.org/ /// NEW! 2014 WIP
Oui mais là il a du écrire super vite quand même, ou alors il faut lui dire que le "." de sont clavier ne fonctionne plus :mrgreen:
Je me prends vraiment la tête avec les sélections multiples, c'est le seul truc qu'il me manque (avec un jolie icône). Est-ce que ça n'est tout simplement pas géré en COFFEE ? C'est pas que ça me gène de le recoder en C++, mais ça fait quand même pas mal d'autres trucs à installer :mrgreen:
je ne dirais plus rien na !! :mrgreen:
paspas
Oh si, s'il te plait :calim:
Voila, mon plug est opérationnel ormis le fait que je n'ai toujours pas réussi à utiliser de container, je crois que j'ai des problèmes à la construction de celui-ci. Je crois que pour la multiselection c'est définitivement mort en COFFEE. J'ai vu comment faire en C++, peut-être que je reprendrais ce plug quand j'aurais eu le courage d'installer la SDK.
Il me faudrait aussi une image d'E.T. pour l'icône :mrgreen:
super initiative Floby ! :odile:
merci à toi ..et à super Paspas pour son aide :wink:
Super Floby,
Un de plus dans le monde mystérieux et obscur du COFFE.
Je vais essayer de t'aider dans la mesure de mes moyens.
cela ne concerne pas les containers mais le numéro de référence de tes plugins, pour l'instant tu as travaillé avec 3 nombres (1000001 à 1000003). Mais si tu commences à avoir plusieurs plugs et que par malheur 2 ont le même nombre de reférence C4D va planter, C'est pour cela qu'il faut obtenir un numéro unique chez Maxon, un fois que tu es inscrit cela prend 1 minute.qu'il faut avoir un ID unique de PluginCafé ou chépakoi. Ca m'a fait peur...
la fonction GetClone() ne fonctionne pas sur un container, elle fonctionne uniquement sur un objet type "BaseObject", c'est pour cela que tu as le message d'erreur.Code:return SV_->GetClone();
effectivement il n'y a pas à ma connaissance une fonction qui te renvoie automatiquement tous les objets sélectionnés, mais tu peux toujours essayer de parcourir tous les objets de ton doc et de vérifier avec la fonction objet->GetBit(BIT_AOBJ) si l'objet est sélectionné (renvoie true) ou non (renvoie false).Je crois que pour la multiselection c'est définitivement mort en COFFEE
Bon courage et bravo !
Edit : Encore une chose pour récupérer la position, l'échelle et la rotation tu peux utiliser une matrice tu auras tout cela en une opération. Regarde dans la doc sous "Tutorials", "Using matrix"
Merci de tes explications
Oui pour les IDs de container, il disait en fait qu'il en fallait pas utiliser les IDs déjà utilisés, et donc par extension d'avoir un ID unique si d'autre developpeurs avaient eu l'idée d'utiliser le container de ces objets.
Par contre ça me chagrine un peu que l'on ne puisse pas avoir de clone de container, ne de le copier vers un autre. D'autant plus que ces fonctions sont présente dans le SDK de "BaseContainer" :? de la version 9.5 certes, mais j'avais esperé qu'une méthode aussi utiles et basiques puisse être gardée. Tout cela ne me dit rien de bon, comme dirait Tintin.
J'aurais un question aussi, ça veut dire quoi "NIL" ? Je suppose que le N veut dire Not, le I veut dire In, mais le L...
Tu as raison pour l'utilisation de matrices, je n'y avais pas pensé. Et pour l'utilisiation de GetBit, je vais voir si ça fonctionne :poucehaut: Merci
Merci pour les sélections multiples ça marche du tonnerre !!! :poucehaut:
Autamps pour moi (néologisme pour mettre enfin tout le monde d'accord entre "Autant pour moi" et "Au temps pour moi"). C'est vrai que je n'avais pas vu qu'il y avait aussi cette fonction dans la classe BaseContainer, il doit donc y avoir une autre explication à ton problème que j'ignore ...D'autant plus que ces fonctions sont présente dans le SDK de "BaseContainer"
Mais en fait je ne comprend pas très bien pourquoi tu veux dupliquer ce container.Ce qui t'intéresse si j'ai bien compris c'est la matrice, non ?
Je n'en sais rien, mais je pencherai plus pour un truc du genre nothing in L???. En tous cas c'est pour différencier un cas ou il n'y a rien (NIL) d'un cas valeur 0 (NULL).J'aurais un question aussi, ça veut dire quoi "NIL" ? Je suppose que le N veut dire Not, le I veut dire In, mais le L...
Ouah c'est pire que NULL ! :shock:
Le container, c'était du temps ou je stockais pas la matrice mais la position, la rotation et l'échelle. Je voulais un container pour que ça ressemble plus à un objet C4D, vu qu'ils stockent tous leurs données comme ça. je voulais faire comme les grand quoi :calim: Dupliquer le container c'était dans la Fonction GetContainer de ma classe tout simplement. Je pense que le problème vient du fait que j'utilisais SetData() sur mon container, sans jamais avoir fait de InsData() donc il avait du mal/ Il faudra que je re-teste ça même si maintenant que je stocke qu'une matrice ça risque de devenir moins intéressant.
Et pour trancher entre "au temps pour moi" et "autant pour moi" il y a un institution dont c'est le boulot :wink: ->http://www.academie-francaise.fr/lan....html#au_temps
Bon je pense avoir fini de débugger. l'enregistrement, l'undo et le redo sont opérationnels, et le reste marche aussi :mrgreen:
J'ai mis que le plug marchait pour 9.5 et plus. mais je n'ai pas les moyen de tester pour les versions inférieures.
C'est un fichier .cob donc si vous voulez voir le code, envoyez moi un MP et je me ferai un plaisir de vous envoyer une copie
Par contre j'ai été obligé d'enregistrer mes icônes (je me suis bien amusé ^^) en PSD, parce que en tif la transparence ne fonctionnait pas. bizarre :?
C'est mon premier plug alors j'ai tout suivi ce qu'ils disaient dans le SDK :nono:, ne soyez pas surpris de voir pleins de fichiers différents pour un si petit plug.
--> le fichier <--
N'hésitez pas à me rapporter tout bug/dysfonctionnement/amélioration :odile: Et merci à tous ceux qui m'ont aidé :love:
Bravo Floby :efface:,
Pour ton problème de tif est-ce que tu as bien enregistré le fichier avec une couche alpha, parce que normalement cela fonctionne très bien.
Vivement ton prochain plug ! :poucehaut:
Ah oui :oops: c'était ça.
Seulement, les demies transparences ne marchent pas, enfin pas pareil en tout cas, j'éviterai la prochaine fois.
Allez c'est reparti !! :nono:
J'ai une autre idée de plug, toujours pour le rig et l'animation. J'ai eu l'idée, et surtout entrevue comment faire, en lisant le chapitre qui traite des matrices dans le SDK. Je vais mettre à un plat un peu ce que je veux faire, c'est bien de savoir exactement ce qu'il faut avant de se lancer.
L'idée serait de permettre à un objet (neutre, contrôleur de commissures de lèvres (de bouche) par exemple) de se comporter comme un point d'un maillage influencé par des os. Tout ceci indépendamment de la hiérarchie. Mais je voudrais qu'il soit tout de même possible de bouger à la main cet objet (puisque ce serait un contrôleur) quand on le souhaite et que lorsque l'on a fini, il continue de suivre les mouvements de autres, à sa nouvelle position (ça à l'air pas clair quand je le dit, mais je vais essayer de montrer un exemple rapidement).
J'ai commencé à coder un COFFEE à mettre sur l'objet qui nous interesse. il faut avoir dans sa scène un objet P1 et un objet P2 (dans ma scène c'était des pyramides). Vloià le code ->
Un petit exemple de ce que ce code fait A l'evidence je suis pas aussi doué que Base80 pour faire de jolis GIF :art:Code:GetFinalMatrix(a,b) { var res=new(Matrix); res->SetV0((a->GetV0() + b->GetV0())/2); res->SetV1((a->GetV1() + b->GetV1())/2); res->SetV2((a->GetV2() + b->GetV2())/2); res->SetV3((a->GetV3() + b->GetV3())/2); return res; } main(doc,op){ var P1=doc->FindObject("P1"); //controlleur 1 var MP1=P1->GetMg(); var P2=doc->FindObject("P2"); //controlleur 2 var MP2=P2->GetMg(); //on initialise une matrice qui définit un objet en coordonnées 0 et //rotation 0 par rapport à son parent (ici pour les deux) var OM=new(Matrix); OM->SetV0(vector(0,0,0)); OM->SetV0(vector(1,0,0)); OM->SetV0(vector(0,1,0)); OM->SetV0(vector(0,0,1)); //on simule la matrice globale de l'objet s'il se trouvait //enfant du controlleur var MR1=MP1->GetMulM(OM); //<- matrice globale de l'objet var MR2=MP2->GetMulM(OM); //<-aussi mais "enfant" de l'autre var MRF=GetFinalMatrix(MR1,MR2); op->SetMg(MRF); }
dans ce fichier, la sphère est le parent du cube.
Je pense qu'il faudra que je code le plug en C++ car j'aurais besoin de stocker dynamiquement dans un tag, et surtout d'avoir une interface pour ce tag, mais surtout en particulier parce qu'il me faudra surement des liens vers les objets (vu que le nom c'est pas génial).
Super Floby ! Merci...Envoyé par Floby
Ce qui serait bien d'ajouter...
- Un bouton "update tag" ( mettre à jour le tag ) plutôt qu'à devoir le supprimer pour le mettre à jour en le recréant.
- Un mode "absolute"/"relative" pour travailler en home tag objet ou monde.
- Une boite liste pour glisser plusieurs objets et faire un home tag sur une liste d'objets. Un peu comme le faisait pose2pose dans Mocca.
- La possibilité de stocker différentes valeurs de home tag sur un objet ( ou une liste ) et de pouvoir switcher entre 2 homes via un slider ( avec toutes les interpolations de l'animation ( ease-in, ease-out, acceleration,etc... ) : L'idée serait de passer d'un home tag 1 d'un, à un home tag 2 ( 50% du slider ) pour finir à un home tag 3 ( 100% du slider ). L'ideal serait qu'on pourrait jouer sur l'ordre des homes tag si nécessaire.
voilà pour quelques idées. :bounce:
kenavo !! // Pinterest KAMIGAZ®
Merci d'avoir essayé Aurety
Pour tes propositions je vais te répondre dans l'ordre :
- Pas besoin de bouton update tag, ni de le supprimer d'ailleurs ! il suffit de repasser par la commande "Emménager" qui remet à jour le tag s'il en existe déjà un.
- C'est une bonne idée, mais on ne peut pas toucher au gestionnaire de propriétés pour les tag en COFFEE malheureusement. Je peux ajouter ça au niveau de la commande emménager, mais ça rajoute du dialogue pour la manip. Ou alors juste faire une seconde commande Globale. Mais encore le seul moyen que j'aurais d'indiquer si le tag est en mode Global ou Local serait dans le nom de celui-ci, ce qui n'est tout de même pas pratique :?
- Je ne suis pas sûr de comprendre. Si c'est juste pour en définir plusieurs à la fois, il faut juste en avoir sélectionné plusieurs quand on lance la commande. Si c'est pour stocker la position d'un ensemble d'objet c'est un peu plus compliqué.
- Là c'est carrément de l'anim' c'est effectivement possible, voire facile, si je recode le plug en C++, ce qui va sûrement bientôt arriver puisque il y a plein d'amélioration à faire qui le nécessite. Cela dit, le plug n'avait pas pour vocation à servir pour l'animation :oops: mais plutôt d'être un moyen rapide de faire un truc minime mais très utile pour un rig.
Encore merci pour les suggestions ! Et moi je vais commencer à me pencher sur la compilation du SDK :art:
salut Flobby
tient comme tu es dans les plugins pour l'anim , j'en avais commencé un ( enfin un expresso )
-> un outil de mirroir de pose ( on drag and drop ses controlleurs et en 1 clic on mirroir tout ça suivant un pivot et un plan mirroir choisi ( donc le pivot c'est biensur un controlleur dans le perso , mais pas forcement le master .. et donc faudrait pouvoir choisir un mode mirroir local pur ou tout calculer en mode "parent" , c'est à dire chaque controlleur du rig , par rapport au pivot choisi ( par exemple les mains par rapport au master , et non pas par rapport à leur parent 1er qui pourrait être le pelvis par ex .. car le résultat ne sera pas la même chose si le pelvis est tourné dans l'espace ).
http://www.frenchcinema4d.fr/forum/i...?topic=22340.0
mais faute de temps j'ai mis ça en stand by pour le moment :cry2: , donc si tu veux t'y coller pour mettre ça en coffee :mrgreen:
Paspas , avait fillé une partie excellente :art: :prie: , où il faisait en coffée la transformation mirroir ( juste les positions ) entre 2 objets et un 3ème servant de pivot , et tout ça sans relation parent-enfants dans la hiérarchie
donc voila si ça te dit :odile:
Ah oui c'est déjà un petit niveau au dessus oui :nono:
mais je viens d'essayer 2-3 trucs en COFFEE et ça à l'air pas trop compliqué mathématiquement parlant. Ce qui va poser problème c'est :
- Trouver les contrôleurs à symétriser, je ne sais pas comment tu fais dans ton Xpresso, c'est sûr que s'ils sont bien nommés ça ne doit pas poser de problèmes, après c'est possible de trouver par la hiérarchie si celle-ci est bien rangée.
- savoir quel axe inverser au final, mais ça j'en fait une affaire personnelle ^^. C'est surtout que j'essaye de limiter au maximum les paramètres compliqués (parce que c'est sûr je pourrais demander au mec "ton contrôleur, tu l'as placé comment ? non je dis ça parce que j'en ai besoin pour faire un truc avec le bidule pour que ça soit tictactictac comme il faut..." :mrgreen: )
- L'interface, parce qu'en COFFEE on est limité, mais je compte explorer le C++, mais le COFFEE c'est quand meme mieux pour explorer parce que plus facile à débugger.
Mais sinon je suis partant ( :coup: d'avance)
un truc comme ça ?
ha super !!Envoyé par Floby
donc pour trouver les controlleurs a symétriser , en fait moi j'étais partis sur le fait que pied D et G , main D et G , solvers genou D et G , et solvers coudes D et G fonctionnent par paires ... tous les autres controlleurs ajoutés fonctionneraient en solo ( mirroir sur "eux mêmes" )
donc avec ce principe on match tout biped et quadriped standard. ( après pourquoi pas permettre à l'utilisateur de définir par lui même son type de perso , avec combien de controlleur par 'paires' ? de controlleur seul ? etc ..)
Après si tu arrives à trouver une solution pour qu'il lise en auto la hiérarchie et trouve par lui même les controlleurs par paire ? ( genre il cherche une racine commune comme Rfoot .. Lfoot il en déduit que ce sont 2 controlleurs fonctionnant par paire ? etc .. je sais pas trop en fait ce qui est faisable. Ou alors mieux , on définit de rajouter une certaine syntaxe sur les controlleurs genre ' Ctr_master .. Ctr_pelvis .. Ctr_Rfoot ..etc ' , donc la racine "Ctr_" définirait quoi prendre comme controlleur ? enfin libre à toi :art:
Pour ton probleme d'axe a choisir , bein en fait , je voyais bien ceci dans le principe :
on drag and drop l'object servant d'origine au mirroir ( donc par exemple le controlleur master du perso ) , ensuite , on coche une checkbox ' X Y ou Z' , qui correspond aux axes de l'objet origine choisi ( donc si le master à son YZ formant le plan mirroir , on va donc cocher 'X' ..etc )
et donc après tu mirrorises tout via cette objet origine (donc en utilisant le code de super Paspas par ex :boss: + le transfert de rotations)
Pour ce qui est de savoir comment il va savoir qu'est-ce qui est controlleur ou pas , bein peut-être faire un drag and drop de tous les controlleurs ou alors un systeme de liste ? enfin je sais pas trop ce qui existe niveau codes :? .. comme ça on le fait une fois et apres c'est bon il garde en mémoire sur le fichier du perso la liste ?
J'ai vu que sur le site de Maxon , il y a des plugins de création de plugins ^^ .. te permettant de créer rapidement une boite de dialogue , des boutons etc .. mais bon c'est du chinois pour moi :calim: .. on rentre dans l'univers de XSYann, Paspas et JeanLaurent ^^
bein merci beaucoup si tu peux faire quelque chose :odile:
bon cuuurage ! :poucehaut:
Envoyé par Floby
:lol: Haha même pas le temps de raconter ma vie , t'as deja finis ! ^^
bien joué , ouep voila c'est ça
:odile:
ha oui et donc si tu peux rajouter une option de stockage de pose ? ( j'avais fais ça dans mon expresso et j'avoue que c'est assez pratique .. comme ça en dehors de l'outil mirroir on peut aussi aller copier une pose dans une anim et la coller plus loin .. si tu arrives à rajouter une option de 'add keyframes' quand on collerait la pose ? ça serait top )
et des checkbox devant les controlleurs dans la liste si tu peux , pour éventuellement ne travailler que les pieds et donc ne pas copier coller avec clés , les autres controlleurs ..
Ben c'est les vacances tu sais ^^.Envoyé par kiteman
Pour les histoires de contrôleurs à symétriser, je pense que le plus simple est un genre de liste avec un lien vers l'objet gauche et son miroir, plus quelques autres trucs si besoin, et dont on rajoute des lignes avec un bouton "ajouter" au quelque chose comme ça. Éventuellement par dessus ça, on peut rajouter une fonction de recherche automatique. Mais tout ça c'est du fignolage d'interface. Mais j'aimerais bien, si ça ne pose pas de problème bien sûr que tu me montre un fichier avec un rig histoire de voir comment travailler sur un rig complet (et je te fais confiance pour avoir un rig de pro). Mais c'est vraiment si ça ne pose pas de problème, je n'ai pas besoin du modèle ni d'animation, juste les contrôleurs pour voir comment ça réagit en "Grandeur Nature" quoi
Ca m'interesse. Mais je viens de passer sur le site et je n'ai pas vu trace de ce dont tu parles, c'est dans quelle section ?Envoyé par kiteman
C'est sûrement possible, mais pour être honnête je n'ai jamais manipulé de données aussi importantes en COFFEE, je vais essayer de voir comment stocker ça quelque part, peut-être dans un tag (j'aime les tag :nono.Envoyé par kiteman
--- MISE A PLAT --- eh ouais je travaille serieusement ^^ ...
_________________________________________________
Mon idée pour mettre ça sous forme de plug :
Un tag à poser sur la racine de l'arborescence de contrôleurs.
Dans les options, on précise l'objet qui sert de miroir et quel plan de cet objet choisir (prendre un objet différent du master du perso offre plus de possibilités, mais ça c'est selon les goûts). On précise aussi la différentiation Gauche/Droite se fait par suffixe ou préfixe et on précise lesquels.
Ensuite (dans un autre onglet surement), la liste des contrôleurs et de leur miroir (vide ou identique si le contrôleur marche en solo) sous la forme:
Ctrl. Gauche { } Ctrl. Droit { } [Trouver]
[Ajouter un contrôleur] [Auto.]
Ensuite, un onglet d'utilisation avec des boutons tels que "Miroiter", "Copier la pose", "Coller la pose" et autres truc marrants. Sachant que je n'ai aucune idée de comment présenter le choix de la pose à copier ; je vois bien un truc comme le tag Morphing, mais à mon avis c'est plus compliqué que ça.
_________________________________________________
Bon de toute manière, tout ça nécessite de passer au C++ :art: :coup: :cry2: :arg: (et autres smileys)