Boutique Cinema 4D
Affichage des résultats 1 à 21 sur 21

Discussion: Créé un Tag en COFFEE ?

  1. #1
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    Autre
    Messages
    939

    Créé un Tag en COFFEE ?

    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);
    }

    }

  2. #2
    Pilier Avatar de parksto
    Date d'inscription
    juillet 2002
    C4D version
    Autre
    Messages
    840

    Créé un Tag en COFFEE ?


  3. #3
    Pilier
    Date d'inscription
    octobre 2003
    Messages
    1 630

    Créé un Tag en COFFEE ?

    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!!

  4. #4
    Invité
    Date d'inscription
    juin 2002
    C4D version
    R16 Studio
    OS
    Win 7 Pro
    Messages
    4 252

    Créé un Tag en COFFEE ?

    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)

  5. #5
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    Autre
    Messages
    939

    Créé un Tag en COFFEE ?

    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);

    }
    }

  6. #6
    Invité
    Date d'inscription
    juin 2002
    C4D version
    R16 Studio
    OS
    Win 7 Pro
    Messages
    4 252

    Créé un Tag en COFFEE ?

    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:

  7. #7
    Pilier
    Date d'inscription
    octobre 2003
    Messages
    1 630

    Créé un Tag en COFFEE ?

    Citation Envoyé par Tengaal
    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"...

  8. #8
    Invité
    Date d'inscription
    juin 2002
    C4D version
    R16 Studio
    OS
    Win 7 Pro
    Messages
    4 252

    Créé un Tag en COFFEE ?

    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
    }

    }

  9. #9
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    Autre
    Messages
    939

    Créé un Tag en COFFEE ?

    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
    }

    }

  10. #10
    Invité
    Date d'inscription
    juin 2002
    C4D version
    R16 Studio
    OS
    Win 7 Pro
    Messages
    4 252

    Créé un Tag en COFFEE ?

    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:

  11. #11
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    Autre
    Messages
    939

    Créé un Tag en COFFEE ?

    Cool ! :poucehaut: c'est fou toutes les choses qu'on aprend avec Shrek :shock: :wink:

  12. #12
    Vieux Croûton Avatar de Aurety
    Date d'inscription
    juillet 2002
    C4D version
    R17 Studio
    OS
    Mac
    Messages
    14 477
    Billets dans le blog
    3

    Créé un Tag en COFFEE ?

    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:
    kenavo !! // Pinterest KAMIGAZ®

  13. #13
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    Autre
    Messages
    939

    Créé un Tag en COFFEE ?

    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é :?

  14. #14
    Invité
    Date d'inscription
    juin 2002
    C4D version
    R16 Studio
    OS
    Win 7 Pro
    Messages
    4 252

    Créé un Tag en COFFEE ?

    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.

  15. #15
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    Autre
    Messages
    939

    Créé un Tag en COFFEE ?

    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.


  16. #16
    Pilier
    Date d'inscription
    octobre 2003
    Messages
    1 630

    Créé un Tag en COFFEE ?

    euh... d'ou sort Mon_objet?

  17. #17
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    Autre
    Messages
    939

    Créé un Tag en COFFEE ?

    Elle est lier directement au port XPresso, cette partie est juste :-) c'est Xpresso qui declare la variable Mon_Objet

  18. #18
    Invité
    Date d'inscription
    juin 2002
    C4D version
    R16 Studio
    OS
    Win 7 Pro
    Messages
    4 252

    Créé un Tag en COFFEE ?

    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:

  19. #19
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    Autre
    Messages
    939

    Créé un Tag en COFFEE ?


  20. #20
    Dépendant
    Date d'inscription
    janvier 2003
    C4D version
    R14 Prime
    Messages
    449

    Re: Créé un Tag en COFFEE ?

    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+

  21. #21
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    Autre
    Messages
    939

    Re: Créé un Tag en COFFEE ?

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

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •  
Mediaworks - Logiciels 3D | Design Internet - Creation site internet