PDA

Voir la version complète : format cof.



nagua
28/07/2004, 19h08
salut les p'tit lou

j'aimerais simplement savoir comment enregistré du code coffee au format cof. car chez moi ca ne marche pas

Tengaal
28/07/2004, 19h17
Le format cof c'est tout simplement du format texte (ASCII) dont tu changes l'extension. Donc soit tu fais ton code COFFEE dans un éditeur de texte et tu sauves avec une extension .cof, ou bien tu fais ton script dans une expression COFFEE dans C4D, et là aussi tu sauvegardes avec l'extension .cof depuis l'éditeur COFFEE.
Le format cob par contre est la version compilée d'un fichier cof, par conséquent on ne peut pas modifier un fichier cob . :wink:

Si tu as mis ton fichier cof dans le répertoire "Plugins" de C4D mais que ton programme n'apparait pas dans C4D c'est que tu dois avoir une erreur dans ton code, ouvres tout simplmenet la fenêtre "Console" c'est elle qui affiche les messages d'erreurs des scripts et plugins. :wink:

piK
28/07/2004, 19h19
salut,
je pense qu'il suffit de l'ouvrir dans un éditeur de texte et de l'enregistrer sous avec la bonne extension ( attention, active l'affichage des extensions de fichier si t'es sous windows )
NB: le format .cof est destiné aux plugins il me semble. Si ce n'est pas ce que tu veux faire, je crois que tu peux le laisser en format texte et l'importer directement dans la console COFFEE de c4d.

grillé... :roll:

nagua
29/07/2004, 10h52
http://membres.lycos.fr/stryktnik6/images_c4d/rick%20art%20making%20off/coffee%20323.jpg

moi j'essai d'enregistrer comme illustre sur l'image mais il me le formate qu'en fichier txt et non en cof.
comment fait on pour rajouter cette fameuse extension????????

mon but etant de creer des sliders "un peu comme les DU " via resedit
pour controlle la rotation et le deplacement des os

seulement c'est la premier fois que je m'aventure sur ce terrain et j'ai beaucoup de chose a apprendre etant donné que je ne connais pas grand chose sur la facon de faire; par exemple a quoi correspond


const var PLUGIN_ID = 1121114;

enfin bon si tengaal pouvait m'aiguille quant a la marche a suivre pour commencer a creer ce p'tit plug :bail:

Tengaal
29/07/2004, 12h07
Pour tes extensions, il suffit dans Windows d'aller dans les options de dossier et d'activer l'affichage des extensions.Sinon, en faisant un clic droit puis "Propriétés" ou bien "Renommer" tu peux normalement changer le nom de fichier donc son extension.
Quand tu sauve ton script depuis la fenêtre COFFEE, tu peux également taper le nom du fichier avec son extension ".cof"...

const var PLUGIN_ID = 1121114;
C'est une valeur (var) fixe (const) appelée PLUGIN_ID et qui représente la valeur 1121114.
Ici il s'agit plus précisément du numéro d'identification du plugin. Chaque plugin doit être enregistré auprès de Maxon (www.plugincafe.com) pour obtenir un numéro ID unique, et ainsi éviter les conflits entre les différents plugins.

nagua
29/07/2004, 12h32
merci shrek

j'en sais maintenant un peu plus donc en renommant mon fichier

trucmuch txt. en trucmuch cof. ca fonctionne si j'ai bien compris!!!!!

autre chose
je demande mon numero ID a maxon des les premisse du code (donc tous de suite, et pas quant le plug in est terminé, c'est ca ?????

autre chose, il est assez facile de mettre des sliders via resedit mais comment faire pour que mes sliders controlle la rotation d'un os par exemple

dois je coddé en disant que:
si je selectionne un os dans une hierarchie celui a acces aux valeur de rotation dans un edit box et un slider sur les axes X,Y,Z
et que si je bouge mes sliders, il tourne mes os sur l'axe definie

en gros comment je fais interagir mon code avec les sliders et les edits box de resedit

comme je suis super debutant dans ce domaine tous ne dois pas forcement etre clair pour toi
mais j'ai vraiment envie de commencer a faire quelque chose de gerable pour mes os sans pour autant etre une bete incontesté en programation c4d et je suis sur que c'est possible :oops:

si tu peux me donner la methodologie a suivre pour faire ca je suis tous ouie car je n'ai pas peur de dire que pour le moment je patauge un peu

en tous cas merci a toi (et bien sur tous les autres , c'est vraiment cool de pouvoir compter sur une communaute comme celle de frenchcinema 4d qui ne m'a jamais decu)

chapeau bas a tous :love:

nagua
30/07/2004, 13h19
personne au bout du fil :mrgreen:

Realzeb
30/07/2004, 13h33
si nagua il y a au moins moi, mais là, moi du sol, je te vois passer dans un avion à 2 000 m d'altitude, tes compétences en la matière, là me dépassent totalement, donc je lis et me refixe juste la mâchoire de temps en temps... pour me dire : "mais, keskidi ! mais de quoi il parle..." :mrgreen:

nagua
30/07/2004, 14h10
mais t'inquiete dans le domaine de la prog c4d je ne dois pas etre plus balaise que les autres bien aux contraire

seulement je me dis qu'avec la version que j'ai de c4d et ce que je veux faire avec mon projet d'anim, on ne peut faire autrement que passe par le coffe si on veux faire quelque chose de correct :mrgreen:

donc avec les vacances si je peux preparer aux mieux mes outils pour la rentrer ca me vas

donc le but de ce que j'essaie de faire pour le moment est tous simple en theorie en revanche en pratique "pas evident"

donc pour resumé je veux juste faire un programme coffee:
POUR FAIRE EN SORTE DE PILOTE LES OS EN ROTATION

vous allez me dire, mais pourquoi veux t'il faire ca alors qu'il y a l'outils adequat, seulement sur mon programme
1/ je veux faire en sorte qu'en selectionnant un OS sont nom s'affiche dans un edit box :coup:
2 /de pouvoir controllé leurs rotations sur leurs axes respectifs a l'aide de sliders :coup:

en gros on aurai plus qu'a selectionné l'os A ou B pour lui appliqué la rotation voulue
"a mon avis ca devrais etre plus fluide que l'outils rotation de c4d"
:coup:

du coup pour le moment j'ai creer mais sliders X Y et Z, ca fonctionne et maintenant j'essaie de comprendre comment controllé cette fameuse rotation sur un os par le biais de ces sliders




main(doc,op)
{
var p = op->GetPosition();

if (p.y>400.0) p.y = 400.0;
if &#40;p.y<0.0&#41; p.y = 0.0;

p.x = -400.0;
p.z = 0.0;

op->SetPosition&#40;p&#41;;
&#125;

nagua
30/07/2004, 17h31
alors voila ou j'en suis

je fait mes 3 sliders X Y et Z
J'applique un tag expression coffee ou je glisse ce code



// 3D slider x

main &#40; Document, Object &#41;

&#123;

var the_Position = Object->GetPosition &#40; &#41;;

the_Position.x = -300;

the_Position.y = Clamp &#40; -400.0, 400.0, the_Position.y &#41;;

the_Position.z = 0;

Object->SetPosition &#40; the_Position &#41;;

&#125;



// 3D slider Y

main &#40; Document, Object &#41;

&#123;

var the_Position = Object->GetPosition &#40; &#41;;

the_Position.x = -200;

the_Position.y = Clamp &#40; -400.0, 400.0, the_Position.y &#41;;

the_Position.z = 0;

Object->SetPosition &#40; the_Position &#41;;

&#125;



// 3D slider Z

main &#40; Document, Object &#41;

&#123;

var the_Position = Object->GetPosition &#40; &#41;;

the_Position.x = -100;

the_Position.y = Clamp &#40; -400.0, 400.0, the_Position.y &#41;;

the_Position.z = 0;

Object->SetPosition &#40; the_Position &#41;;

&#125;



ensuite

je prends un cube (pour voir)

ou je lui applique ce code




main &#40; the_Document, the_Object&#41;

&#123;
var slider = the_Document->FindObject &#40; "X" &#41;; if &#40; !slider &#41; return;
var slider1 = the_Document->FindObject &#40; "Z" &#41;; if &#40; !slider1 &#41; return;
var slider2 = the_Document->FindObject &#40; "Y" &#41;; if &#40; !slider2 &#41; return;

var the_Target_Position = slider->GetPosition &#40; &#41;;
var the_Target_Position1 = slider1->GetPosition &#40; &#41;;
var the_Target_Position2 = slider2->GetPosition &#40; &#41;;

var the_Minimum_Rotation = vector &#40; 0.0, -PI * 1, 0.0 &#41;;
var the_Maximum_Rotation = vector &#40; 0.0, PI * 1, 0.0 &#41;;
var the_Minimum_Rotation1 = vector &#40; 0.0, 0.0, -PI * 1 &#41;;
var the_Maximum_Rotation1 = vector &#40; 0.0, 0.0, PI * 1&#41;;
var the_Minimum_Rotation2 = vector &#40; -PI * 1, 0.0, 0.0 &#41;;
var the_Maximum_Rotation2 = vector &#40; PI * 1, 0.0, 0.0 &#41;;

var the_Relation = BoxStep &#40; -400.0, 400.0, the_Target_Position.y &#41;;
var the_Relation1 = BoxStep &#40; -400.0, 400.0, the_Target_Position1.y &#41;;
var the_Relation2 = BoxStep &#40; -400.0, 400.0, the_Target_Position2.y &#41;;


var the_Rotation = Mix &#40; the_Minimum_Rotation, the_Maximum_Rotation, the_Relation &#41;;
var the_Rotation1 = Mix &#40; the_Minimum_Rotation1, the_Maximum_Rotation1, the_Relation1 &#41;;
var the_Rotation2 = Mix &#40; the_Minimum_Rotation2, the_Maximum_Rotation2, the_Relation2 &#41;;

the_Object->SetRotation &#40; the_Rotation &#41;;
the_Object->SetRotation &#40; the_Rotation1 &#41;;
the_Object->SetRotation &#40; the_Rotation2 &#41;;

&#125;


et la!!! pas d'erreur mais le script ne fonctionne que sur l'axe Y
comment resumé ce code pour qu'il marche sur ces 3 axes independamment???????????????????????????????????? ???????


:bounce: :bounce: :bounce: :bounce: :bounce: :bounce: :bounce:

:bounce:

Tengaal
30/07/2004, 18h38
C'est une vraie uzine à gaz ton machin ! :shock:

Je ne comprend pas trop la suite de tes axes X,Z,Y pour la gestion des rotations ?
La correspondance HPB est YXZ.

C'est normal que ta rotation agisse seulement sur Y, puisque le 3e slider qui pour toi correspond à Y définit le vecteur the_Rotation2.
Or à la fin de ton script tu changes 3 fois la rotation de l'objet, c'est donc la dernière qui est prise en compte.

Il faut appliquer 1 seule fois le SetRotation(Rotation_finale).

Commences par utiliser seulement 2 variables pour tes rotations mini et maxi. Ainsi tu as 2 vecteurs du type (rotationX, rotationY,rotationZ)

var Mini_Rotation=vector(-Pi*1,-PI*1,-PI*1); // mini
var Maxi_Rotation=vector(Pi*1,PI*1,PI*1); // maxi

(Il faudra que tu m'explique l'utilité du "PI*1" ! :mrgreen: )

Tu fait pareil pour tes valeurs the_Relation1 2 et 3, tu utilises 1 seule valeur sous forme d'un vecteur:
the_Relation contiendra donc 3 valeurs .x , .y et .z)

Tu auras donc au final:
var the_rotation=vector(0,0,0); //tu créés ton vecteur de rotation finale
the_rotation.x=Mix ( Mini_Rotation.x, Maxi_Rotation.x, the_Relation.x );
the_rotation.y=Mix ( Mini_Rotation.y, Maxi_Rotation.y, the_Relation.y );
the_rotation.z=Mix ( Mini_Rotation.z, Maxi_Rotation.z, the_Relation.z );

Puis enfin the_Object->SetRotation ( the_rotation );

Mais bon je ne sais pas si ton truc est plus pratique que de tourner manuellement l'os... :roll:
L'idéal est de faire un vrai plugin et non un script, tu auras ainsi accès aux éléments d'interface (fenêtre, boutons, sliders...) mais bon, il faut déjà que tu connaisses les bases indispensables du COFFEE. :wink:

nagua
30/07/2004, 18h44
Mais bon je ne sais pas si ton truc est plus pratique que de tourner manuellement l'os...
L'idéal est de faire un vrai plugin et non un script, tu auras ainsi accès aux éléments d'interface (fenêtre, boutons, sliders...) mais bon, il faut déjà que tu connaisses les bases indispensables du COFFEE.


justement le but final est d'integrer tous ca en forme de plug in via resedit
mais comme tu dis faut d'abord que j'apprenne corectement a codé et donc je passe d'abord par cette etape et ensuite "si je suis a niveau bien sur" je le ferais en plugin

j'etudie tous ce que tu m'a dis plus haut (j'espere que j'aurais compris avant noel :mrgreen: )

en tous cas marci beaucoup "je pense que j'ai pas fini de te solicité :mrgreen:

Tengaal
30/07/2004, 18h51
Resedit permet juste de dessiner des interfaces, c'est à toi dans ton plugin de charger ces ressources produites puis de gérer chaque éléments de cette interface pour les connecter aux valeurs de ton système.

walien
30/07/2004, 18h56
Incroyable ocmment vous devenz insolent :D

Ouaisssss vas y comment tu m'a traité espèce de Vecteur, tu vas voir je vais te clamper ton axe Y

scuzez moi

nagua
30/07/2004, 19h13
ah d'accord pour resedit

donc en gros tous ce sue j'essai de faire en coffee ne me servira pas si j'edit un vrai plug "tous le code vas changer" :coup:

Tengaal
30/07/2004, 20h18
ah d'accord pour resedit

donc en gros tous ce sue j'essai de faire en coffee ne me servira pas si j'edit un vrai plug "tous le code vas changer" :coup:
Non, pas du tout ton plugin gère en fait 2 choses:
- le noyau : le coeur du programme, son action sur les objets. (ce que tu fais actuellement en script)
- l'interface: la gestion des éléments de l'interface (récupération des valeurs, des textes, des éléments activés ou non...)

Ensuite il faut "connecter" les 2 parties, de manière à ce que les paramètres changés par l'utilisateur dans la fenêtre du plugin, soient appliqués à ton noyau (variables). :wink:

nagua
31/07/2004, 11h59
c'est bien ce que je pensez en parcourant les threads de steph 3d
le tous est de savoir connecté le programme avec l'intreface graphique
mais avant ca il faut vraiment que j'apprenne le coffee correctement
"dommage que les seul ressources sont celles de tengaal qui sont genial pour debuter et ce vieux manuel sdk que l'on ne comprend qu'a moitié"

si vous connaissez des tuto ou livre de programation coffee ca m'interresse car a voir si l'on est pas englophone c'est un peu mort de tous savoir correcement??????????????

Majoul
31/07/2004, 13h38
salut nagua

les tutos coffee que connaît:

http://www.nthd.org/nthd/69

http://www.peranders.com/c4d8/tute/tutcofsdk.html

http://www.peranders.com/c4d8/tute/tutcofnode.html

http://www.vgd.co.uk/pages/notebook/seib/house_intro.html


et le plus important c'est la maîtrise des matrices :

http://www.maxoncomputer.com/tutorial_detail.asp?site=CAFE-DEV&tutorialID=136


dommage que les seul ressources sont celles de tengaal qui sont genial pour debuter et ce vieux manuel sdk que l'on ne comprend qu'a moitié"

je pense que c'est largement suffisant pour apprendre le coffee, le reste n'est que de la pure logique et rien de plus.

A+

nagua
02/08/2004, 15h50
MERCI majoul pr toute cette doc forte interressante :mrgreen:

mais ces pour ca que j'ai resolu mes problemes :cry2:

si j'applique le code de tengaal tous ce que j'arrive a faire ces appliqué une rotation sur mon cube sur les 3 axes xyz alors que je veux que les axes de rotation soit appliqué indépendamment sur le slider approprié x y ou z

quand je bouge mon slider en position x: le cube tourne en rotation sur l'axe x mais est bloqué sur les 2 autres axes (y et z donc)

quand je bouge mon slider en position y: le cube tourne en rotation sur l'axe y mais est bloqué sur les 2 autres axes (x et z donc)

quand je bouge mon slider en position z: le cube tourne en rotation sur l'axe z mais est bloqué sur les 2 autres axes ( y et x donc)

quand j' applique le code ci dessous: je bouge mon slider z et il me tourne le cube sur l'axe z
comment arrivé a construire la matrice pour faire en sorte qu'il bouge ce meme cube sur l'axe x en bougeant le slider x et faire de meme avec le slider y :coup:
(je comprends le methodologie mais je suis encore trop novice pour pouvoir l'appliqué avec 2 autres sliders)



main &#40; the_Document, the_Object&#41;

&#123;

var slider = the_Document->FindObject &#40; "Z" &#41;;
if &#40; !slider &#41; return;

var the_Target_Position = slider->GetPosition &#40; &#41;;


var the_Minimum_Rotation = vector &#40; 0.0, 0.0, -PI * 1 &#41;;
var the_Maximum_Rotation = vector &#40; 0.0, 0.0, PI * 1&#41;;

var the_Relation = BoxStep &#40; -400.0, 400.0, the_Target_Position.y &#41;;


var the_Rotation = Mix &#40; the_Minimum_Rotation, the_Maximum_Rotation, the_Relation &#41;;


the_Object->SetRotation &#40; the_Rotation &#41;;
&#125;





(Il faudra que tu m'explique l'utilité du "PI*1" ! )

j'aurais pu faire PI tous simplement
"si j'enleve PI ; le cube sera bloqué sur l'axe ou il est appliqué
alors que si je fais PI2 (donc 3.14*2) le cube tourneras 2 fois plus vite par rapport a la position du slider sur y donc au final quand le slider est a -400 sur y le cube aura tourné de -360°, pour PI: il aura touné de -180 sur l'axe z (donc B)

nagua
02/08/2004, 17h06
bon ben j'ai trouvé un script avec exactement ce que je voulais faire ds les exemple (j'ai pas l'ere c.. :arg: )

donc pour les gros naze "comme moi " qui voudrais en benificiais

vous prenez un fichier cof. ou vous mettais le code ci dessous et puis vous n'avez plus qu' a recharge la console et voila



// be sure to use a unique ID obtained from www.plugincafe.com
var PLUGIN_ID = 1000450;
// be sure to use a unique ID obtained from www.plugincafe.com

// *********** Definition of my dialog ****************
class MyDialog &#58; GeDialog
&#123;
private&#58;
var my_op; // local object cache for speedup
var my_doc; // local document cache for speedup
var first;

EnableGadgets&#40;&#41;;

public&#58;
MyDialog&#40;&#41;;

// from GeDialog
CreateLayout&#40;&#41;;
Init&#40;&#41;;
CoreMessage&#40;id,msg&#41;;
Command&#40;id,msg&#41;;
&#125;

MyDialog&#58;&#58;EnableGadgets&#40;&#41;
&#123;
Enable&#40;4001,my_op!=NULL&#41;;
Enable&#40;4002,my_op!=NULL&#41;;
Enable&#40;4003,my_op!=NULL&#41;;
&#125;

MyDialog&#58;&#58;MyDialog&#40;&#41;
&#123;
super&#40;PLUGIN_ID&#41;;
my_op = NULL;
my_doc = NULL;
first = TRUE;
&#125;

MyDialog&#58;&#58;CreateLayout&#40;&#41;
&#123;
SetTitle&#40;"RotateIt!"&#41;;

AddGroupBeginV&#40;4000,BFH_SCALEFIT,2,"Group",0&#41;;
&#123;
AddGroupBorderSpace&#40;4,4,4,4&#41;;

AddStaticText&#40;1000,0,0,0,"H",0&#41;;
AddEditSlider&#40;4001,BFH_SCALEFIT,350,0&#41;;

AddStaticText&#40;1000,0,0,0,"P",0&#41;;
AddEditSlider&#40;4002,BFH_SCALEFIT,350,0&#41;;

AddStaticText&#40;1000,0,0,0,"B",0&#41;;
AddEditSlider&#40;4003,BFH_SCALEFIT,350,0&#41;;
&#125;
AddGroupEnd&#40;&#41;;
return TRUE;
&#125;


MyDialog&#58;&#58;Init&#40;&#41;
&#123;
var doc = GetActiveDocument&#40;&#41;; if &#40;!doc&#41; return FALSE;
var op = GetActiveObject&#40;doc&#41;;

my_doc = doc;
my_op = op; // even if it's NULL
first = TRUE;

if &#40;my_op&#41;
&#123;
var w = my_op->GetRotation&#40;&#41;;
SetDegree&#40;4001,Degree&#40;w.x&#41;,-180.0,180.0,1.0&#41;;
SetDegree&#40;4002,Degree&#40;w.y&#41;,-180.0,180.0,1.0&#41;;
SetDegree&#40;4003,Degree&#40;w.z&#41;,-180.0,180.0,1.0&#41;;
&#125;
EnableGadgets&#40;&#41;;

return TRUE;
&#125;

MyDialog&#58;&#58;Command&#40;id,msg&#41;
&#123;
if &#40;!my_op || !my_doc&#41; return FALSE;
switch &#40;id&#41;
&#123;
case 4001&#58;
case 4002&#58;
case 4003&#58;
&#123;
StopAllThreads&#40;&#41;; // VERY IMPORTANT!!!

var w = vector&#40;Radians&#40;GetDegree&#40;4001&#41;&#41;,Radians&#40;GetDegree&#40; 4002&#41;&#41;,Radians&#40;GetDegree&#40;4003&#41;&#41;&#41;;

if &#40;first&#41;
&#123;
// only add undo before changing the object the first time, not while dragging the slider
my_doc->StartUndo&#40;&#41;;
my_doc->AddUndo&#40;UNDO_OBJECT_BASEDATA,my_op&#41;;
my_doc->EndUndo&#40;&#41;;
first = FALSE;
&#125;

my_op->SetRotation&#40;w&#41;;

if &#40;msg->GetData&#40;BFM_ACTION_INDRAG&#41;&#41; // refresh only view while dragging
DrawViews&#40;DA_ONLY_ACTIVE|DA_NO_THREAD|DA_NO_ANIMAT ION|DA_ONLY_ACTIVE_VIEW&#41;;
else
&#123;
// when releasing the slider send a message to all managers
first = TRUE;
GeEventAdd&#40;ACTIVE_OBJECT_CHANGED&#41;;
&#125;
&#125;
&#125;
EnableGadgets&#40;&#41;;
return TRUE;
&#125;

MyDialog&#58;&#58;CoreMessage&#40;id,msg&#41;
&#123;
switch &#40;id&#41;
&#123;
// every time something has changed in the scene refresh my local data
case NEW_DOCUMENT&#58;
case DOCUMENT_CHANGED&#58;
case NEW_ACTIVE_OBJECT&#58;
case ACTIVE_OBJECT_CHANGED&#58;
&#123;
Init&#40;&#41;;
return TRUE;
&#125;
break;
&#125;
return FALSE;
&#125;

// *********** Definition of my Menu plugin ****************
class MyMenuPlugin &#58; MenuPlugin
&#123;
public&#58;
MyMenuPlugin&#40;&#41;;

GetID&#40;&#41;;
GetName&#40;&#41;;
GetHelp&#40;&#41;;
GetState&#40;&#41;;
Execute&#40;doc&#41;;

RestoreLayout&#40;secret&#41;;
&#125;

MyMenuPlugin&#58;&#58;MyMenuPlugin&#40;&#41;
&#123;
super&#40;&#41;;
&#125;

MyMenuPlugin&#58;&#58;GetState&#40;&#41;
&#123;
return CMD_ENABLED;
&#125;

MyMenuPlugin&#58;&#58;GetID&#40;&#41;
&#123;
return PLUGIN_ID;
&#125;

MyMenuPlugin&#58;&#58;GetName&#40;&#41;
&#123;
return "RotateIt!";
&#125;

MyMenuPlugin&#58;&#58;GetHelp&#40;&#41;
&#123;
return "Rotate an object interatictively";
&#125;

var d;

MyMenuPlugin&#58;&#58;Execute&#40;doc&#41;
&#123;
d->Open&#40;TRUE,-1,-1&#41;;
&#125;

MyMenuPlugin&#58;&#58;RestoreLayout&#40;secret&#41;
&#123;
if &#40;!d&#41; d = new&#40;MyDialog&#41;;
d->RestoreLayout&#40;secret&#41;;
&#125;


main&#40;&#41;
&#123;
d = new&#40;MyDialog&#41;;

Register&#40;MyMenuPlugin&#41;;
&#125;

Tengaal
02/08/2004, 17h16
Ca c'est pour le cas d'un MenuPlugin, mais il y a également des structures différentes pour les ShaderPlugin, FilterPlugin, et autres...

Dans la doc Coffee, il y a les structures vierges toutes faites, c'est dans la partie "Exemples" -> "XLEnt Framework" ! :wink: