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]