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

Discussion: Voilà un scanneur de Tag.

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

    Voilà un scanneur de Tag.

    Hello, comme je suis entrain de coder un plug-in qui scanne toute la scène de C4D pour les exports, ben je vous passe une petite fonction de base très simple que j'ai entièrement commenté, et qui sert à scanner tous les tags sur un objet. C'est un code de base, mais qui modifié peu faire pas mal de chose :mrgreen:

    Suffit de lui dir quel type de tag en recherche, et il va dire ou le tag se trouve dans la console de C4D

    Faut copier/coller le code dans un coffee expression tag, et d'ajouter pleins de tag pour faire mumuse

    //////////////////////////////////////////////////////////////////////
    // Fonction de base commentée pour rechercher des tags dans un objet
    // (c) 2007 Steph3D - http://www.steph3d.net
    //////////////////////////////////////////////////////////////////////

    ScanTag(obj,Mon_Tag) { //On recherche un tag ( objet cible, class tag )

    var tmp_tag = obj->GetFirstTag(); // on se place sur le 1er tag de la liste de l'objet cible

    var i=0; // une p'tite variable pour compter les tag scanné dans la boucle

    while (tmp_tag) // scan la liste des tag si le tmp_tag n'est pas vide
    {
    // si notre tag existe on le signal dans la console
    if (instanceof(tmp_tag,Mon_Tag)) println("Tag trouvé ! ");

    tmp_tag=tmp_tag->GetNext(); // on passe au tag suivant

    // on signal dans la console le nouveau passage, ou la fin du scan ( si tmp_tag->GetNext() est vide )
    if(tmp_tag) println("Ce tag n'est pas le bon, suivant... "); else println("Plus de tag à scanner");

    i++; // Compteur ++

    }
    println(tostring(i)+" tag(s) scanné "); // affiche le compteur
    println("---------------------");

    return NULL; // renvois rien
    }


    main(doc,op)
    {
    var ChercheTag=PhongTag; // cherche tag de lissage phong
    ScanTag(op, ChercheTag); // lancer la fonction scan
    }

  2. #2
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990

    Re*: Voilà un scanneur de Tag.

    Et en plus combiné à la fonction que m'a donné Majoul (:love, tu peux scanner tous les tags de tous les objets :boss: :
    Code:
    GetAllObjects(op,stop)
    {
    	if(!op) return NULL;
    	var next;
    	if(next = op->GetDown())return next;
    	if(next = op->GetNext())return next;
    
    	var prev = op;
    	while (prev = prev->GetUp())
    	{
    		if(prev == stop)return NULL;
    		if(next=prev->GetNext())return next;
    	}
    }
    
    main(doc,op)
    {
    var objet,tag;
    var i=0;
    var j= 0;
    var k = 0;
    var type = PhongTag;
    for(objet = doc->GetFirstObject();objet;objet=GetAllObjects(objet,NULL))
    {
    	for(tag = objet->GetFirstTag();tag;tag = tag->GetNext())
    	{
    		j++;
    		if(instanceof(tag,type)) k++;
    	}
    	i++;
    }
    var name = strmid(tostring(type),7,sizeof(tostring(type))-8);
    
    println("Il y a "+tostring(i)+" objet(s) sur la scène et "+tostring(j)+" tag dont "+tostring(k)+" "+tostring(name));
    
    }

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

    Re : Voilà un scanneur de Tag.

    Argh ! merci, j'en ai aussi fait un qui scanne toute la scène avec les objets ( j'y avais passé ma soirée ), mais j'avais encor un petit bug à ressoudre dans certaines conditions, je vais étudié le GetAllObjects.

    Par contre, se scanne de tag ne trouve pas les tag personnalisé avec instanceof, mon nouveau plug-in de scan le fait, car maintenant je fais une recherche par GetType en exploitant l'id du plugintag personnalisé. Je poste le code quand je l'aurais remis au propre sans bug C'est des fonctions élémentaires très intéressante pour développer des plug-ins.

  4. #4
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990

    Re*: Voilà un scanneur de Tag.

    La fonction de majoul : http://www.frenchcinema4d.fr/forum/i...topic=18946.80

    Il suffit de faire ça non? :
    Code:
    GetAllObjects(op,stop)
    {
    	if(!op) return NULL;
    	var next;
    	if(next = op->GetDown())return next;
    	if(next = op->GetNext())return next;
    
    	var prev = op;
    	while (prev = prev->GetUp())
    	{
    		if(prev == stop)return NULL;
    		if(next=prev->GetNext())return next;
    	}
    }
    
    main(doc,op)
    {
    var objet,tag;
    var i=0;
    var j= 0;
    var k = 0;
    var type = 1001102; //IDs
    for(objet = doc->GetFirstObject();objet;objet=GetAllObjects(objet,NULL))
    {
    	for(tag = objet->GetFirstTag();tag;tag = tag->GetNext())
    	{
    		j++;
    		if(tag->GetType==type) k++;
    	}
    	i++;
    }
    var name = strmid(tostring(type),7,sizeof(tostring(type))-8);
    
    println("Il y a "+tostring(i)+" objet(s) sur la scène et "+tostring(j)+" tag dont "+tostring(k)+" "+tostring(name));
    
    }
    Citation Envoyé par Steph3D
    C'est des fonctions élémentaires très intéressante pour développer des plug-ins.
    C'est clair et c'est cool de les faire partager. :poucehaut:
    C'est un peu grâce à toi que j'ai commencé le coffee quand même :roll:

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

    Re : Voilà un scanneur de Tag.

    Tu veux dir en postant mes questions de noob sur le coffee partout sur le forum, mais c'est vrais que c'était du taf de torturer Tengaal pour qu'il donne les bonnes réponses :mrgreen:

    var type = 1001102; ça ne marche pas, enfin sur mes persoTag que j'ai testés.

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

    Re : Voilà un scanneur de Tag.

    Bon, voilà le code de base pour faire un plug-in de scan.

    Faut copier/coller dans un fichier *.cof à mettre dans le dossier plug-in. J'ai pas activé le code de l'icône, mais vous pouvez en faire une en tif.
    Avec ça vous pouvez automatiser pas mal de trucs avec un peu d'imagination ;-)

    //////////////////////////////////////////////////////////////////////////////////////////////
    // Demo script
    // (c) 2007 S.LAUX http://www.steph3d.net
    //////////////////////////////////////////////////////////////////////////////////////////////
    const var PLUGIN_ID = 10011; // Plugin ID (Registered)

    var icon; // Variable global de l'icône

    ///// Fonction scan
    ScanAllObjects(Obj,Doc)
    {
    if(!Obj) return NULL; // stop, si pas d'objet

    var next;
    if(next = Obj->GetDown())return next;
    if(next = Obj->GetNext())return next;

    var prev = Obj;
    while (prev = prev->GetUp())
    {
    if(prev == NULL)return NULL;
    if(next=prev->GetNext())return next;
    }
    }

    // Plugin class pour créer l'object
    class DemoScan extends MenuPlugin {
    public:
    DemoScan(); // Constructeur
    GetID(); // Plugin ID
    GetName(); // Plugin nom
    GetHelp(); // Plugin étiquette
    // GetIcon(); // Icon image
    Execute(doc); // Execution du Plug-in
    }

    DemoScan:emoScan() { super(); }
    DemoScan::GetID() { return PLUGIN_ID; }
    DemoScan::GetName() { return "Demo Script"; } // Non du plugin
    DemoScan::GetHelp() { return "Lancer la demo"; } // Etiquette du plugin
    //DemoSysteme::GetIcon() { return icon; }


    DemoScan::Execute(doc) { // code principal d'execution

    var Obj = doc->GetFirstObject(); // prend le 1er objet de la liste

    var i=1; // variable du compteur

    for(Obj = doc->GetFirstObject();Obj; Obj=ScanAllObjects(Obj,doc))
    {
    // Ici on place le code de traitement du scan qu'on veux faire pour chaque objet de la scene
    Obj#ID_BASELIST_NAME="Scan Objet["+tostring(i)+"] --> Ok !!";

    i++; // compteur
    }

    /////////////////////////////////////////////////////
    // Pour rafraîchir toute la scène, c'est plus sur !
    GeEventAdd(NEW_ACTIVE_OBJECT);
    doc->Message(MSG_UPDATE);
    doc->Message(DOCUMENT_CHANGED);

    return TRUE;
    }

    main() {

    // Récuperer le chemin du plug-in sur le disque
    var path = GeGetRootFilename();
    path->RemoveLast();

    // Charger l'icone du plug-in
    // path->AddLast("Ico.tif");
    // icon = new(BaseBitmap,1,1);
    // icon->Load(path);

    // Enregistrer le Plug-in
    Register(DemoScan);
    }

  7. #7
    Gourou Avatar de nikolas
    Date d'inscription
    novembre 2003
    C4D version
    R16 Studio
    OS
    Win10
    Messages
    4 911

    Re*: Voilà un scanneur de Tag.

    ça a l'air bien pratique.... Mais je comprend quedalle. :mrgreen: on fait comment? un copié/collé dans la console coffee?
    nikolas; boulet intersidéral dans ce domaine...
    Win 10 - R17 - www.nicolasverdon.fr

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

    Re : Voilà un scanneur de Tag.

    Non dans un fichier txt renommé en cof et placé dans ton rep plug-in

    Cela va renommer tout tes objets ( démo)

    Mais ici
    Code:
    {
    // Ici on place le code de traitement du scan qu'on veut faire pour chaque objet de la scène
    Obj#ID_BASELIST_NAME="Scan Objet["+tostring(i)+"] --> Ok !!";
    
    i++; // compteur
    }
    Il suffit de remplacé le Obj#ID_BASELIST_NAME="Scan Objet["+tostring(i)+"] --> Ok !!";
    Par un code de notre choix pour exécuter le script sur tous les objets de la scène

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

    Re : Voilà un scanneur de Tag.

    Et voilà la source complète de mon scanneur de scène avec une image de ce que cela fait dans C4D

    Avec ça, comme vous pouvez facilement scanner toutes les données de C4D par les containers, vous avez les bases pour programmer un exportateur de fichiers 8)

    //////////////////////////////////////////////////////////////////////////////////////////////
    // Code source d'un plug-in de base pour scanner toute la scène de Cinema4D
    // (c) 2007 S.LAUX http://www.steph3d.net
    //////////////////////////////////////////////////////////////////////////////////////////////
    const var PLUGIN_ID = 10011; // Défini l' ID de notre nouveau plugin perso

    var icon; // Variable global de l'icône

    ///// Fonction scan objet
    ScanAllObjects(Obj,Doc)
    {
    if(!Obj) return NULL; // stop, si pas d'objet

    var next;
    if(next = Obj->GetDown())return next;
    if(next = Obj->GetNext())return next;

    var prev = Obj;
    while (prev = prev->GetUp())
    {
    if(prev == NULL)return NULL;
    if(next=prev->GetNext())return next;
    }
    }

    ///// Fonction scan tag
    ScanTag(obj,R_Tag) { //On recherche un tag R_Tag sur l'objet obj

    var tmp_tag = obj->GetFirstTag(); // on se place sur le 1er tag de la liste dans l'objet
    var test,ID_Tag;
    var i=0; // une p'tite variable pour compter les tag scanné

    while (tmp_tag) // scan la liste des tag si tmp_tag n'est pas vide
    {
    ID_Tag=tmp_tag->GetType(); // Récup l'ID du tag
    if (ID_Tag==R_Tag) { // si l'ID du tag = l'ID du tag qu'on recherche
    println("[ID:"+tostring(ID_Tag)+"] Tag trouvé ! "); // si notre tag existe on le signal dans la console
    }
    // on signal dans la console le nouveau passage, ou la fin du scan ( si tmp_tag->GetNext() est vide )
    else if(tmp_tag) println("[ID:"+tostring(ID_Tag)+"] Ce tag n'est pas le bon, suivant... "); else println("Plus de tag à scanner");

    tmp_tag=tmp_tag->GetNext(); // on passe au tag suivant
    i++; // Compteur ++
    }
    println(tostring(i)+" tag(s) scanné "); // affiche le compteur

    return NULL;
    }

    // Plugin class pour créer l'object
    class DemoScan extends MenuPlugin {
    public:
    DemoScan(); // Constructeur
    GetID(); // Plugin ID
    GetName(); // Plugin nom
    GetHelp(); // Plugin étiquette
    // GetIcon(); // Icon image du plug-in
    Execute(doc); // Execution du Plug-in
    }

    DemoScan:emoScan() { super(); }
    DemoScan::GetID() { return PLUGIN_ID; }
    DemoScan::GetName() { return "Scaner 4D"; } // Non du plugin
    DemoScan::GetHelp() { return "Scaner la scene"; } // Etiquette d'aide du plugin
    //DemoSysteme::GetIcon() { return icon; } // Icon du plug


    DemoScan::Execute(doc) { // code principal d'execution

    var Obj = doc->GetFirstObject(); // prend le 1er objet de la liste de des objets de C4D
    var i=1; // variable du compteur
    var RechercheTag = 5612; // ID du tag, ici un phong tag pour exemple
    CallCommand(13957); // vide la console ( 13957 = l'ID de la commande "effacer" de la console )

    for(Obj = doc->GetFirstObject();Obj; Obj=ScanAllObjects(Obj,doc))
    { // Ici on place le code de traitement du scan qu'on veux faire pour chaque objet de la scene

    println("------------------------------------------> Objet"+tostring(i)); // println affiche un text dans la console
    ScanTag(Obj,RechercheTag); // scan les tags
    i++; // compteur
    }
    println("------------------------------------------> Fin du scan");
    println("------------------------------------------> "+tostring(i-1)+" Objet(s) scannés");
    println("//////////////////////////////////////////////////");

    /////////////////////////////////////////////////////
    // Pour rafraîchir toute la scène, c'est plus sur !
    GeEventAdd(NEW_ACTIVE_OBJECT);
    doc->Message(MSG_UPDATE);
    doc->Message(DOCUMENT_CHANGED);

    return TRUE;
    }

    main() {

    // Récuperer le chemin du plug-in sur le disque
    var path = GeGetRootFilename();
    path->RemoveLast();

    // Charger l'icone du plug-in
    // path->AddLast("Ico.tif");
    // icon = new(BaseBitmap,1,1);
    // icon->Load(path);

    // Enregistrer le Plug-in
    Register(DemoScan);
    }


    [Fichier joint supprimé par l'administrateur]

  10. #10
    Gourou Avatar de lenogre
    Date d'inscription
    août 2002
    C4D version
    R20 Studio
    OS
    OS 10.12.6
    Messages
    4 372

    Re*: Voilà un scanneur de Tag.

    Majoul avait fait un plug dans le genre (SelectFilterReplace) qui permet de croiser différents critères pour faire des recherches d'objets. Très efficace comme tjs.
    Tout ce que j'écris est à prendre au 15e degré. Car comme dit le proverbe chinois : Quand le dragon d'or, le ragondin ; voilà qui devrait faire taire les critiques et me mettre à l'abri d'attaques frontales.

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

    Re : Voilà un scanneur de Tag.

    Connais pas, mais bon la c'est pas vraiment un plug-in dans le sens utiles. C'est plus un code de base pour ceux qui débute avec le coffee, ça leur évitera de trop chercher comme j'ai dû le faire ;-)

  12. #12
    Gourou Avatar de nikolas
    Date d'inscription
    novembre 2003
    C4D version
    R16 Studio
    OS
    Win10
    Messages
    4 911

    Re : Voilà un scanneur de Tag.

    merci steph
    Win 10 - R17 - www.nicolasverdon.fr

  13. #13
    Vieux Croûton Avatar de Sir Gong
    Date d'inscription
    juillet 2002
    C4D version
    R19 Studio
    OS
    10.13.4 High Sierra
    Messages
    10 353
    Billets dans le blog
    2

    Re : Voilà un scanneur de Tag.

    J'aimerais tellement comprendre tout ça.

    T'as entendu parler d'un plug qui s'apppelle Jean-Pierre.cof ?
    ÷ R19 Studio ÷ cacahuètes ÷

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