Boutique Cinema 4D
Page 2 sur 2 PremièrePremière 12
Affichage des résultats 31 à 40 sur 40

Discussion: Créez vos propres plug-ins*!

  1. #31
    Gourou Avatar de Daubermman
    Date d'inscription
    août 2003
    Messages
    2 798

    Re: Créez vos propres plug-ins !

    Ah oui oui il l'est sans problème, j'ai repris de ton code et des exemples de la doc, donc j'ai bien fait gaffe à ca mais rien à faire. Enfin merci quand même pour l'aide :wink:.
    Dauby pour les intimes !

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

    Re : Créez vos propres plug-ins !

    Le champ pour la cible est nommé IDC_NAME_TARGET dans le Res, j'pige pas ou tu sors le ID_CIBLE = 100 que je ne retrouve nulle part pendant la création de l'interface. J'arrive à exploiter des interfaces par la méthode classique, mais bien lourde et pénible à mettre en place, par contre pour exploiter ceux générés par Resedit je nage comme un poisson dans le sable :arg: heu... c'est du gros sable même :mrgreen: vite ! vite ! mon tube d'aspirine :cry2:


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

    Re*: Créez vos propres plug-ins*!

    IDC_NAME_TARGET c’est l’id cadget (le champ texte que tu a défini dans le resedit) cet id est attribuer (enum) dans le fichier « c4d_symbols.h »

    ID_CIBLE c’est l’id de la variable string du container du tag , je l’ai attribué au début du code
    Code:
    enum
    {
     ID_CIBLE = 100 ,
     ID_DISTANCE = 101 ,
    etc ….
     _Dummy
    }
    donc

    Code:
    var bc = tag->GetContainer() ;
    var name = bc->GetData(ID_CIBLE) ;
    Ce sont deux id distincts.

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

    Re : Créez vos propres plug-ins !

    Ah ok, on accède donc bien aux variables par les IDC_* , ton code m'avait mis dans l'erreur, car je connais pas le principe des enum :oops:
    C'est bon :bounce: j'ai réussi à programmer une interface qui fonctionne avec mon code au bout de 2 jours sous aspirine :mrgreen: La 1er fois, j'ai l'impression de me péter du C++ quand je monte l'interface :arg:

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

    Re : Créez vos propres plug-ins !

    Bon j'ai retenté la méthode de resedit, j'ai passé des heures à tout décoder :oops: J'ai enfin pigé les enum et cette histoire d'ID, de container, etc...
    J'ai donc refait un code de plugintag, tout fonctionne, l'interface se lance... mais malheureusement les variables ne semblent pas se mémoriser une fois qu'on quitte l'interface :o
    J'ai pourtant suivi la même méthode que toi, sauf avec plus de boutons :? ça fait 4 heures que je tourne en rond :coup: :coup: :coup: :cry2: :cry2: :cry2:

    Faut vraiment s'accrocher pour ne pas devenir chèvre avec la prog :mrgreen: Bon une aspirine et un petit somme....

    Code:
    var PLUGIN_ID =1000021;
    var PLUGIN_NAME = "Test d'interface";
    var PLUGIN_HELP = "MonTag";
    var PLUGIN_ICON = "IcoTag.tif";
    
    enum //  on enum les ids du container du tag
    {
     ID_XML = 100 ,
     ID_RENDER = 101 ,
     ID_TEXTURE = 102 ,
     ID_LIGHT = 103 ,
     ID_SHADOW = 104 ,
     _Dummy
    }
    
    //////////////////////////////////////////
    var resource,obj;
    var RENDU,TEXTURE,LIGHT,SHADOW,XML;
    
    
    
    // debug -------------------------------------------------------------------------------------------------------------------------
    DeBug(c,msg,on) { 
      println("------------------------------------------------------ "+msg );
     RENDU = c->GetData(ID_RENDER) ;
     println("RENDU = "+ tostring(RENDU) ); 
     TEXTURE = c->GetData(ID_LIGHT) ; 
     println("TEXTURE = "+ tostring(TEXTURE) ); 
     LIGHT = c->GetData(ID_TEXTURE) ; 
     println("LIGHT = "+ tostring(LIGHT) ); 
     SHADOW = c->GetData(ID_SHADOW) ; 
     println("SHADOW = "+ tostring(RENDU) );
     XML = c->GetData(ID_XML) ; 
     if (on==1) println("XML = "+XML);
     println("------------------------------------------------------" );
    
    }
    
    //************************************************************************
    //     definition de la class du dialogue
    //************************************************************************
    
    include "c4d_symbols.h";
    
    class Dialog : GeModalDialog
    {  
      private:
       var Bc ; // Variable pour le container
    	 
      public: // ici on déclare public toutes les fonctions qui suivent, hériter a là class GeModalDialog  
       Dialog();
       CreateLayout();
    	 GetContainer() ;
       SetContainer(bc);
    	 Init();  // fonction qui détermine ce qui se passe à l'ouverture du dialogue (donc de l'interface) 
       Command(id, msg); // "enregistre" les changements de l'interface (comme le déplacement d'un slider ou un bouton cliqué etc...).
      
    }
    
    Dialog::Dialog() // ici on déclare toutes nos variables locales de notre interface
    {
    super(); // Appele le constructeur parent
    }
    
    Dialog::CreateLayout()// La on va créé notre code d'interface, création des boutons, textes, etc...
    {
     LoadDialogResource(IDD_DIALOG1, resource, 0) ;
    }
    
    Dialog::GetContainer()
    {
     return Bc ; // avec cette fontion on renvoit le container au tag
    }
    
    Dialog::SetContainer(bc)
    {
     Bc = bc ; // avec cette fonction on reçoit le container du tag
    }
    
    Dialog::Init() // On détermine ce qui se passe à l'ouverture de l'interface) 
    {
    
    SetString(IDC_XML, Bc->GetData(ID_XML));
    SetCheckbox(IDC_RENDER, Bc->GetData(ID_RENDER));
    SetCheckbox(IDC_LIGHT, Bc->GetData(ID_LIGHT));
    SetCheckbox(IDC_TXT, Bc->GetData(ID_TEXTURE));
    SetCheckbox(IDC_SHADOW, Bc->GetData(ID_SHADOW));
    
    // code debug
     DeBug(Bc,"Init",1);
    }
    
    Dialog::Command(id, msg){ // on change les valeurs des variables quand on touche commande de l'interface
    
     
     switch (id) // switch selon le numéro ID de l'objet qu'on touche dans l'interface
    	{	
    	 // ici on reçoit les valeurs du dialogue et on les Stockes dans le container Bc
      case IDC_RENDER : Bc->SetData(ID_RENDER, GetCheckbox(id)) ; break ;
    	case IDC_LIGHT : Bc->SetData(ID_LIGHT, GetCheckbox(id)) ; break ;
    	case IDC_TXT : Bc->SetData(ID_TEXTURE, GetCheckbox(id)) ; break ;
    	case IDC_SHADOW : Bc->SetData(ID_SHADOW, GetCheckbox(id)) ; break ;
    	case IDC_XML : Bc->SetData(ID_XML, GetString(id)) ; break ;
    	} 
    	
    	Init() ; // avec la fonction Init() on retransmet les valeurs du container Bc au dialogue
    	
     // code debug
     DeBug(Bc,"Command",1);
     
    }
    
    //************************************************************************
    //     definition de la class de l'ExpressionPluginTag
    //************************************************************************
    
    class MonTag : ExpressionPluginTag
    {
    private:
     GetNewContainer() ;
     
    public: // ici on déclare public toutes les fonctions qui suivent, héritées de la class ExpressionPluginTag
     MonTag();
     GetID(); 
     MultipleAllowed(); 
     DisplayAllowed();
     GetIcon();
     GetHelpText();
     UseMenu(); 
     GetName();
     
     Edit(); // ouverture du menu
     Execute(doc, op); // code principal
    }
    
    MonTag::MonTag() { super(); } // Appelle le constructeur parent . ici on déclare aussi toutes nos variables locales, etc...
    MonTag::GetID() { return PLUGIN_ID; } // Renvoie l'identification unique de notre plug-in qu'il faut obtenir sur http://www.plugincafe.com Faut un ID unique par plug-in, sinon il peut avoir des conflits !       
    MonTag::MultipleAllowed() { return FALSE; } // Faut renvoyé TRUE si on permet de mettre plusieurs Tag de ce type sur un meme objet. Mettre FALSE on n'autorise qu'un seul Tag par objet
    MonTag::DisplayAllowed() { return TRUE; } // Renvoyez TRUE si le Tag montre une icône sur l'objet dans la liste de la scene. Mettre FALSE si on veux faire un Tag invisible
    MonTag::GetHelpText() { return PLUGIN_HELP; } // Permets de renvoyer une bulle d'aide avec un texte quand on passe avec la souris sur le Tag
    MonTag::UseMenu() { return TRUE; } // Renvoyez TRUE si le Tag doit etre énumérée dans le nouveau Tag menu. 
    MonTag::GetName() { return PLUGIN_NAME; } // Pour renvoyer le nom du menu 
    
    MonTag::GetIcon()       
    { // Ici on va faire un script pour chercher le fichier image en tif qui va nous servir d'icône pour le Tag 
       // Création des variables fichier et bitmap
       var Bitmap = new(BaseBitmap,1,1);
       var File = new(Filename); 
       // Lecture/Chargement du fichier ico.tif ...
       File = GeGetRootFilename(); // ...dans le répertoire ou se trouve notre plug-in
       File->RemoveLast();
       File->AddLast(PLUGIN_ICON);
       Bitmap->Load(File);
       // Renvoie l'icône à afficher  
       return Bitmap;
    }
    
    MonTag::GetNewContainer()
    {
     var bc = new(BaseContainer) ;
     bc->SetData(ID_RENDER,true) ;
     bc->SetData(ID_LIGHT,true) ;
     bc->SetData(ID_TEXTURE,false) ;
     bc->SetData(ID_SHADOW,false) ;
     
     bc->SetData(ID_XML, "Hello World !") ;
     
     return bc ;
    }
    
    MonTag::Edit() // ----------------------------------------------------------------------------------------------------------------------------------->>> interface
    { 
     var bc = GetContainer() ; // on prend le container du tag
     // on verifi si les container existe, sinon on affecte des nouveaux container 
     
     DeBug(bc,"edit",0); // code debug
     
     if(!bc->FindIndex(ID_XML)) bc = GetNewContainer() ; 
     
    // Le code a renvoyer quand l'utilisateur double clique sur le Tag (pour créer la boite de dialogue)
    var Interface = new(Dialog); // on creer un dialogue de la class Dialog defini un peut plus haut
    Interface->SetContainer(bc) ; // on transmet le container au dialogue par le fonction SetContainer() de cette class
    Interface->Open(-1,-1); // on ouvre le dialogue
    
    // si le resultat est validé alors on transmet le container du dialogue au Tag
    if (Interface->GetResult()) SetContainer(Interface>GetContainer()) ;
    }
    
    
    
    MonTag::Execute(doc, op) { // Script appelé à chaque redraw, donc exécuté en permanence.
    
     // code debug
     var bc = GetContainer();
     DeBug(bc,"exec",0);
     
    }
    
    main()
    {
     // Enregistrement de l'expression plug-in tag
     Register(MonTag);
     
     // Pour pouvoir accéder au fichier de ressource de l'interface
     var file = GeGetRootFilename(); if (!file) return;
     file->RemoveLast();
     resource = new(GeResource,file);
    
    }
    [Fichier joint supprimé par l'administrateur]

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

    Re*: Créez vos propres plug-ins*!

    true et false c'est en majuscule TRUE FALSE
    Code:
    MonTag::GetNewContainer()
    {
     var bc = new(BaseContainer) ;
     bc->SetData(ID_RENDER,TRUE) ;
     bc->SetData(ID_LIGHT, TRUE) ;
     bc->SetData(ID_TEXTURE, FALSE) ;
     bc->SetData(ID_SHADOW, FALSE) ;
     
     bc->SetData(ID_XML, "Hello World !") ;
     
     return bc ;
    }

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

    Re : Créez vos propres plug-ins !

    Merci, mais d'après mes tests en coffee, que tu écrives TRUE ou true, ben visiblement ça marche pareil.
    Enfin, j'ai quand meme changé pour voir, et cela ne change rien au problème j'ai pourtant relu au moins 50 x le code :oops: :oops: mais je ne vois toujours pas se qui cloche :shock:

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

    Re*: Créez vos propres plug-ins*!

    c'est qu'il y a toujours une erreur qui traîne

    if (Interface->GetResult()) SetContainer(Interface->GetContainer()) ;

    -> et non >





    [Fichier joint supprimé par l'administrateur]

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

    Re : Créez vos propres plug-ins !

    Merci ! ça marche enfin !!! je vais pouvoir un peu dormir :bounce:

    J'ai aussi ajouté à ton code >

    MonTag::Save(hf)
    {
    var bc = GetContainer();
    hf->WriteContainer(bc);
    }
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    MonTag::Load(hf)
    {
    var bc = hf->ReadContainer();
    SetContainer(bc);
    }
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    MonTag::Copy(dest)
    {
    var bc = GetContainer();
    dest->SetContainer(bc->GetClone());
    }
    Sinon ça ne garde pas la mémoire des contenaires quand on sauvegarde la scène et qu'on quitte C4D, donc la ça permet de l'ecrire en dur dans notre fichier de scene C4D
    Quand j'ai le temps, je posterai une version au propre pour boucler le pseudo wip/tutoriel du pluginTag :mrgreen:

    Mais sinon il me reste encor des énigmes à résoudre :roll: comment faire pour que C4D tourne derrière, voir exécuter tout le script en permanence avec l'interface ouverte ?
    Par ce que là, quand j'entre dans l'interface, C4D se met en pause et attend la fermeture du dialogue.

    De plus, je me demande si on peu pas créer des interfaces resizable avec une taille par défaut ? par ce que la elle se ressert comme un élastique sur les gadgets.

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

    Re : Créez vos propres plug-ins !

    Petite astuce, si on veux reprendre ou écrire des infos du tag personalisé avec nos expressions, il suffit d'ecrire un truc du style...

    enum // enum les ID du container
    {
    ID_XML = 100 ,
    ID_RENDER ,
    ID_TEXTURE ,
    ID_LIGHT ,
    ID_SHADOW
    }

    main(doc,op)
    {
    var mon_tag = op->GetFirstTag(); // je prends le 1er tag de la liste (ou j'ai mis le tag perso)
    var container=mon_tag->GetContainer();
    var test = container->GetData(ID_XML);
    println(test);
    }

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