PDA

Voir la version complète : Créé un Tag en COFFEE ?



Steph3D ::.
18/12/2003, 17h26
Hello,
Aujourd'hui j'essaye de comprendre la gestion des tags en C.O.F.F.E.E., mais j'ai un problème :cry: il n'y a rien qui se passe et j"ai pas trouvé d'exemple dans la doc ou sur le net à ce sujet :?

Voilà mon petit code d'expérimentation où je veux placer un KinematicTag configuré sur une bone.


main(doc,op)
{

// Crée une variable test
var test=doc->FindObject("Os1");

// Si test n'existe pas deja
if(!test) {

// Definir test comme un Kinematic Tag
test=new(KinematicTag);

// Les valeurs d'options du tag
test -> setdata(KINEMATICTAG_WX,1); // [bool] Limit H
test -> SetData(KINEMATICTAG_WY,1); // [bool] Limit P
test -> SetData(KINEMATICTAG_WZ,1); // [bool] Limit B
test -> SetData(KINEMATICTAG_MIN_W,vector(0,0,0)); // [vector] Min rotation
test -> SetData(KINEMATICTAG_MAX_W,vector(180,0,0)); // [vector] Max rotation
test -> SetData(KINEMATICTAG_DAMP_W,0); // [float] Damping

// Nome le tag
test -> SetName("Cinématique de test");

// Insert le Tag
doc -> InsertTag(test,op,NULL);
}

}

parksto
18/12/2003, 17h47
t'es allé voir là ?
http://www.frenchcinema4d.com/phpBB2/viewtopic.php?t=523

Floby
18/12/2003, 23h47
pfffff génial ce lien parksto!!! pour un metit mec comme moi qui veut apprendre un rien de coffee...

ça se rapproche par moment d'une "expression-qui-te-fait-une-image-toute-seule" ce dont vous parlez!! :lol:
pour steph, je crois que c'est la fonction "doc -> InsertTag(test,op,NULL);" que tu as utilisé qui est mauvaise, d'après ce que j'ai observé: seulement 2 indication dans les parenthèses de cette fonction. :wink: . Pour le reste je comprend pas grand' chose alors je peux pas te dire si c'est mauvais, ou bon!!

Tengaal
19/12/2003, 00h12
Non, Floby il y a bien 3 paramètres :
- le tag à insérer
- l'objet sur lequel placer le tag
- NULL ou bien tag après lequel doit être placé le nouveau tag.
Edition du post:
Les lignes ci-dessus sont fausses, c'est Floby qui a raison, je confond avec l'insertion d'objet dans un document ! Honte sur moi !!! :oops:

Une astuce de développeur COFFEE:
Pendant les tests de script, ouvrir la fenêtre "Console", les erreurs de programme y sont affichées en permanence (une sorte de debugger en fait...) :wink:
Ton script ne tourne pas car ton premier "setdata" est mal écrit, ça doit être impérativement "SetData", le langage prend en compte les majuscules et minuscules ! :wink:
Un autre tuyau, quand tu fais des modifications dans ton document (ajout d'objets, de tags, ou modifications), pense à la fin de ton script à ajouter un rafraichissement de la scène ou de l'objet avec la fonction ->Message(MSG_UPDATE)

Steph3D ::.
19/12/2003, 00h17
Merci pour l'info, je n'avais pas vu ce topic

Bon alors j'ai bien réusis à créer des Tags, et pour le test, j'ai mis aussi une variable globale pour tester la boucle et empecher le script de tourné en boucle infinie, ce qui peut faire planter C4d. Là il crée juste le Tag à l'ouverture du document. L'idéal serait de pouvoir testé s'il y a déjà un Tag du même type de mis et par conséquent, ne pas en créer un autre ou alors l'effacé avant.

Par contre j'ai toujours pas trouvé la fonction ou le truc pour leur envoyer des paramètres pour pouvoir configurer les Tag par le COFFEE.
J'ai esayé plusieurs trucs, mais bon il ne se passe toujours rien pour l'instant :coup: :cry:

Voilà le code qui ne marche qu'à moitier :oops: :cry:
Attention, suis pas responsable sur votre machine prend feu après avoir utilisé se script. :mrgreen:


var test;

main(doc,op)
{
// Crée une variable Mon_Objet

var Mon_Objet=doc->FindObject("Os1");

// Si Mon_Objet n'existe pas deja
if(!Mon_Objet) return;

if (test!=1) {

test=1;

// Definir Mon_Objet comme un Kinematic Tag
Mon_Objet=new(KinematicTag);

// Insert le Tag
op -> InsertTag(Mon_Objet,NULL);

// Les valeurs d'options du tag
var Mon_Tag = Mon_Objet -> GetFirstTag();

Mon_Tag -> SetName("Tag de test");
Mon_Tag -> SetData(KINEMATICTAG_WX,1); // [bool] Limit H
Mon_Tag -> SetData(KINEMATICTAG_WY,1); // [bool] Limit P
Mon_Tag -> SetData(KINEMATICTAG_WZ,1); // [bool] Limit B
Mon_Tag -> SetData(KINEMATICTAG_MIN_W,vector(0,0,0)); // [vector] Min rotation
Mon_Tag -> SetData(KINEMATICTAG_MAX_W,vector(180,0,0)); // [vector] Max rotation
Mon_Tag -> SetData(KINEMATICTAG_DAMP_W,0); // [float] Damping
Mon_Objet -> SetActiveTag(Mon_Tag);

}
}

Tengaal
19/12/2003, 00h24
Pour envoyer les paramètres à un objet il faut passer par son Container
var mon_container=Mon_Tag->GetContainer();

ensuite tu utilises les GetData(...) et SetData(...) pour lire ou écrire les paramètres:
var ma_valeur=mon_container->GetData(...);
mon_container->SetData(valeurs...);

Enfin pour que ces valeurs soient envoyées dans l'objet il suffit de redéfinir le container modifié avec
Mon_Tag->SetContainer(mon_container);

Le container est un accès sur un groupe de paramètres. :wink:

Floby
19/12/2003, 00h25
Non, Floby il y a bien 3 paramètres :
- le tag à insérer
- l'objet sur lequel placer le tag
- NULL ou bien tag après lequel doit être placé le nouveau tag.

je dois avoir les yeux qui se croisent :o

pour ton expression, je ne comprend pas pourquoi tu change Mon_objet qui es un os à la base en KinematikTag? Tu n'as pas de quoi te payer une autre variable ou quelque chose m'échappe? Tu le change, je comprendrais, mais ensuite tu le reprends comme si c'était toujours ton "Os1"...

Tengaal
19/12/2003, 00h30
J'allais justement parler de ça, bien vu Floby !
D'ailleurs c'est moi qui n'aies plus les yeux en face des trous car Floby était dans le vrai quand il disais qu'il y avait seulement 2 paramètres dans InsertTag, j'ai confondu avec une fonction similaire pour insérer des objets dans le document doc->InsertObject(...), il est temps que j'aille dormir ! :roll: :oops:

En effet, Pour le new(KinematicTag) utilises une autre variable (mon_KTag par ex) car sinon, Mon_Objet étant un Tag, tu ne peux pas lui appliquer la fonction ->GetFirstTag() car celle-ci s'applique uniquement aux objets, un tag ne peux pas contenir des tags...

J'ai l'impression que tu mélange l'objet "Os" et le tag Cinematique, car Mon_Objet concerne un objet "os" et si il n'existe pas tu créés un tag, et là ce n'est pas logique car si ton os n'existe pas, tu le mets sur quoi ton tag ? :o
J'imagine en fait que ce que tu cherches c'est, localiser un os par son nom, ensuite regarder si il est associé à un KinematicTag, si ce n'est pas le cas on créé ce KinematicTag, non ?

Dans ce cas là:


main(doc,op)
{
var Mon_Objet=doc->FindObject("Os1");
if (!Mon_Objet) return; //si il n'existe pas on quitte le script

//On recherche un KinematicTag:
var tmp_tag=Mon_Objet->GetFirstTag();
var exist=FALSE;
while (tmp_tag)
{
if (instanceof(tmp_tag,KinematicTag)) exist=TRUE;
if (!exist) tmp_tag=tmp_tag->GetNext();
else tmp_tag=NULL;
}

if (!exist) // si on a pas trouvé de KinematicTag sur l'objet alors on le créé
{
var Mon_Tag=new(KinematicTag);
var tag_c=Mon_Tag->GetContainer();

tag_c -> SetData(KINEMATICTAG_WX,1); // [bool] Limit H
tag_c -> SetData(KINEMATICTAG_WY,1); // [bool] Limit P
tag_c -> SetData(KINEMATICTAG_WZ,1); // [bool] Limit B
tag_c -> SetData(KINEMATICTAG_MIN_W,vector(0,0,0)); // [vector] Min rotation
tag_c -> SetData(KINEMATICTAG_MAX_W,vector(180,0,0)); // [vector] Max rotation
tag_c -> SetData(KINEMATICTAG_DAMP_W,0); // [float] Damping

Mon_Tag->SetContainer(tag_c); // fixe ces paramètres
Mon_Objet->InsertTag(Mon_Tag,NULL); // ajoute le tag à l'objet
Mon_Objet->Message(MSG_UPDATE); // rafraichie la scène
}

}

Steph3D ::.
19/12/2003, 02h12
Merci Tengaal :poucehaut: c'est exactement le principe que je cherche à comprendre pour y voir plus clair sur les objets dans C4D

Pour l'objet Os, ça me semblait etrange comme truc, mais comme ça marcher quand même... donc sur le coup j'ai pensé que le tag est en quelque sorte une partie de l'objet.

Maintenant en relisant mon code, je me rends compte que j'ai juste redefini la variable Objet en variable Tag. En d'autre terme, le début ne sert à rien et fausse la compréhension du code, quelle banane je fais là ! et puis comme le Tag COFFEE et juste sur l'os, ben il crée quand même le tag, bien sûr sans les options pré-configurer complètement fauses :oops:

Par contre, 1 petits problèmes.
Les valeurs dans le Tag créé sont largement démesurées, 1 fait 100 % et 180 fait 10313.24, peut etre faut-il faire une conversion de type de variable ?

Pour ton code, le voici au propre car ça peu servir :-)


main(doc,op)
{
var Mon_Objet=doc->FindObject("Os1");

if (!Mon_Objet) return; //si il n'existe pas on quitte le script

//On recherche un KinematicTag:
var tmp_tag=Mon_Objet->GetFirstTag();
var exist=FALSE;

while (tmp_tag)
{
if (instanceof(tmp_tag,KinematicTag)) exist=TRUE;
if (!exist) tmp_tag=tmp_tag->GetNext();
else tmp_tag=NULL;
}

if (!exist) // si on a pas trouvé de KinematicTag sur l'objet alors on le crée
{
var Mon_Tag=new(KinematicTag);
var tag_c=Mon_Tag->GetContainer();

tag_c -> SetData(KINEMATICTAG_WX,1); // [bool] Limit H
tag_c -> SetData(KINEMATICTAG_WY,1); // [bool] Limit P
tag_c -> SetData(KINEMATICTAG_WZ,1); // [bool] Limit B
tag_c -> SetData(KINEMATICTAG_MIN_W,vector(0,0,0)); // [vector] Min rotation
tag_c -> SetData(KINEMATICTAG_MAX_W,vector(180,0,0)); // [vector] Max rotation
tag_c -> SetData(KINEMATICTAG_DAMP_W,0); // [float] Damping

Mon_Tag->SetContainer(tag_c); // fixe ces paramètres
Mon_Objet->InsertTag(Mon_Tag,NULL); // ajoute le tag à l'objet
Mon_Objet->Message(MSG_UPDATE); // rafraichie la scène
}

}

Tengaal
19/12/2003, 02h28
Une précision sur le système des valeurs de C4D:
- les booléens: 0 ou FALSE = inactif et 1 ou TRUE = actif
- les pourcentages, 0% = 0.0 et 100% = 1.0 (car 100%= 100/100=1) donc 50%=0.5
- les angles: C4D ne connait que les radians il faut donc utiliser la fonction mon_angle_rad=Radians(valeur_degres); qui convertie directement l'angle donné.

Donc dans tes définitions de paramètres tu auras vector(Radians(180),0,0) :wink:

Steph3D ::.
19/12/2003, 05h00
Cool ! :poucehaut: c'est fou toutes les choses qu'on aprend avec Shrek :shock: :wink:

Aurety
19/12/2003, 10h32
Merci les gars, pour une fois que je parviens à comprendre un script. Continuez sur votre lancée, c'est super intéressant et mention spéciale à Floby pour son analyse critique :efface: , remettre en question les "axiomes" de Tengaal n'est malheureusement pas de ma portée !! Respect Mr Floby !! :poucehaut:

Steph3D ::.
19/12/2003, 17h15
Et vi Aurety, rien de tel que des petits problemes à résoudre en C.O.F.F.E.E. pour avancer. :poucehaut:

Bon j'ai fait des tests avec les Objets et la hiérarchie, adaptation dans xpresso et tout.
C'est vachement cool tout ça, ça promet pas mal de possibilités.

Par contre je bloque encor une fois sur un petit truc avec un Tag, le Ikexpressiontag pour etre présis
C'est de lui metre dans le script le parametre de l'objet cible qui ne passe pas, c'est le seul parametre de ce Tag

La notice dit ça
Container ID Type Explanation
IKEXPRESSIONTAG_NAME [string] Name

Alors bon j'ai pensé metre dans XPresso une variable nomé Ikcible de type lien vers le port-type Objet de l'Objet neutre, ce qui marche bien en général dans mes scripts, mais là ça ne passe pas. Après avoir regardé la doc qui dit que c'est une variable string, j'ai tenté le type texte aussi, ben non :shock:

tag_c -> SetData(IKEXPRESSIONTAG_NAME,"ma_cible");

Sinon j'ai fait des essais sur la création des Objets. Bon, pour le moment, no probe, voici le code pour xpresso relativement simple à comprendre pour qui ça intéresse, et qui marche bien cette fois, huhu ;-)


main()
{

var doc=GetActiveDocument();

if (!Mon_Objet) return;

var Enfant=Mon_Objet->GetDown();

if(!Enfant)
{
Enfant=new(NullObject);

Enfant->SetName("Axe");

var Enfant_c=Enfant->GetContainer();

//Enfant_c -> SetData(); // Affichage
//Enfant_c -> SetData(); // Rayon
//Enfant_c -> SetData(); // Rapport d'affichage
//Enfant_c -> SetData(); // Orientation
//Enfant_c -> SetData(); // Couleur (Actif/auto/off)
//Enfant_c -> SetData(); // Choix de la couleur
//Enfant_c -> SetData(); // Visibilité (vue)
//Enfant_c -> SetData(); // Visibilité (rendu)

Enfant->SetContainer(Enfant_c);

doc->InsertObject(Enfant,Mon_Objet,NULL);

Mon_Objet->Message(MSG_UPDATE);

}

}

Le probe que j'ai là, ben voui ! :oops: c'est que je voudrais trouver les paramètres SetData de l'onglet attributs qui permet notamment dans XL8 de changer la couleur des objets ainsi que la taille, l'orientation, la visibilité et la forme des objets neutre. Mais je ne trouve pas de doc sur ces parametres qui existe forcément, c'est obligé :?

Tengaal
19/12/2003, 18h22
La documentation COFFEE s'est arrêtée à la version 6 de C4D, et la version 8 utilise un système de pointage différent pour les objets glissés dans les champs "cible", il n'utilise plus le nom des objets mais un identifiant interne propre à chaque objet de la scène, ainsi, même si il y a plusieurs objets dy même nom dans le projet, la cible sera associée à un seul et unique. Donc sur C4D 8 la définition d'un paramètre qui pointe un objet ne fonctionne pas avec le COFFEE (string). Par contre Xpresso peut y accéder, il y a peut-être une possibilité. Ou bien il faut carrément passer sur le SDK C++ de C4D 8, et là ce n'est plus de la rigolade ! :o
Par contre il y a possibilité d'accéder aux paramètres Visibilité(vue) et Visibilité(rendu) en COFFEE avec
objet->GetEditorMode() et objet->GetRenderMode() qui permettent de lire l'état de visibilité des objets et également
objet->SetEditorMode(etat) et objet->SetRenderMode(etat) qui permettent de définir les modes de visibilités (ces dernières sont absentes de la doc COFFEE, je suis tombé dessus par hasard, comme quelques autres d'ailleurs) Avec etat= MODE_ON(vert) ou MODE_OFF(rouge) ou MODE_UNDEF(gris) :wink:
Idem pour l'activation coche verte/rouge avec objet->GetDeformMode() et objet->SetDeformMode(etat) où
etat = MODE_ON ou MODE_OFF ou encore NOTOK si l'objet n'a pas de coche.

Steph3D ::.
19/12/2003, 20h56
Ok, je me disais aussi que la doc du C.O.F.F.E.E. etait un peu poussiéreuse :roll:
Donc, en gros les nouveaux paramètres, faut esayé de les deviné. :evil: :cry:

Pour le Ikexpressiontag, le principe de base serait à partir de 2 liens, crée automatiquement le Tag ainsi que son parametre cible.

Alors voilà mon idée de base en utilisant Xpresso, je posterai le fichier final si j'arrive à faire marcher le truc ! :|
Là faudrait que j'envoie l'objet Tag en variable nomé "IdTag" à la variable "Objet" de l'Objet Xpresso pour activer sa référence encor indéfini avec le Tag en question une fois celui si créé par COFFEE.
Cela devrait actionner la variable indéfinie de l'objet en cible et prendre automatiquement l'Objet Neutre dans le lien comme ciblage pour l'Ikexpressiontag.

http://annur.free.fr/c4dfr/XPressoTag.jpg

Floby
19/12/2003, 21h19
euh... d'ou sort Mon_objet?

Steph3D ::.
19/12/2003, 21h28
Elle est lier directement au port XPresso, cette partie est juste :-) c'est Xpresso qui declare la variable Mon_Objet

Tengaal
19/12/2003, 21h41
En effet Floby, en Xpresso, on utilise des boîtes ou plutôt ce qu'on appelle des "noeuds" ("nodes" en anglais).
Ces noeuds peuvent recevoir et envoyer des paramètres grâce à des ports, un paramètre entre par le port d'entrée (à gauche de couleur bleu) et un paramètre sort du noeud par le port de sortie (à droite de couleur rouge).
Dans le cas d'un noeud COFFEE, qui représente un script, on peut envoyer à celui-ci des paramètres, et dans ce cas là le noms des ports est directement utilisable dans le code COFFEE, comme si ces variables étaient déjà définies, en fait elles sont définies par Xpresso.
Tu peux donc ainsi constater que "Mon_Objet" est le nom du port d'entrée du noeud COFFEE, et par conséquent, dans le programme, Steph3D peut directement utiliser cette variable provenant d'un autre noeud. :wink:

Steph3D ::.
19/12/2003, 21h52
Pour plus d'infos sur ce sujet :) http://www.peranders.com/c4d8/tute/tutcofnode.html#introduction

Majoul
08/02/2006, 23h37
Steph3D , Je fais remonter ce sujet comme promis. Je télécharge le fichier* du tag , je le complète à ma sauce et je le poste, et on démarre les explications .

Ce n'est pas le bon sujet :oops: :oops: :oops:

A+

Steph3D ::.
08/02/2006, 23h43
OK, merci
oui, c'était sur ce sujet que j'avais le plus avancé avec les explications http://www.frenchcinema4d.com/forum/index.php?topic=11361.0