PDA

Voir la version complète : C++ : boîte de dialogue



Glloq
29/03/2011, 20h27
Bonjour,


Dans main.cpp :

#include "c4d.h"
#include <string.h>

C4D_CrashHandler old_handler;

Bool RgsFonction(void);

Bool PluginStart(void)
{
old_handler = C4DOS.CrashHandler;

if (!RgsFonction()) return FALSE;
return TRUE;
}

void PluginEnd(void)
{}

Bool PluginMessage(LONG id, void *data)
{
switch (id)
{
case C4DPL_INIT_SYS:
if (!resource.Init()) return FALSE;
return TRUE;

case C4DMSG_PRIORITY:
return TRUE;
}
return FALSE;
}



Dans fenetre.cpp :

#include "c4d.h"

#include "c4d_symbols.h"
#include "c4d_gui.h"


class Fenetre : public GeModalDialog
{
public:
Fenetre();
virtual Bool CreateLayout();
};


Bool RgsFonction(void)
{
GePrint("La fonction !");

Fenetre dial;

return FALSE;
}
J'utilise l'exemple de SDK mais la ligne de la déclaration de l'objet (Fenetre dial; ) m'empêche de compiler.


Quelqu'un saurait d'où vient ce blocage ?

valkaari
30/03/2011, 00h56
tout simplement parce qu'il manque les 3/4 du code nécessaire.

Je t'invite à aller sur ce post http://frenchcinema4d.fr/showthread.php?72155-D%E9velopper-un-plugin-en-C

Il y a les bases pour créer une interface. Je te conseille aussi de compiler le SDK (dans le répertoire plugins de C4D) et de regarder un peu plus les exemples des fichiers en essayant de faire ressortir l'essentiel. (les fonctions de bases obligatoires)

Faire un petit tour pas là-bas aussi http://www.microbion.co.uk/graphics/c4d/create_plugins5.htm
(que je n'ai pas pris le temps de vérifier s'il était bien à jour pour la R12 donc attention aux changements de fonctions)

C'est un peu hardcore au début de s'y mettre mais après, c'est pire ne t'inquiètes pas. (c'est ce qui est drôle)

Glloq
30/03/2011, 01h15
Déjà vu ça et SDK, sinon j'aurais jamais su comment compilé main.cpp (d'ailleurs, le code de ton sujet ne compile pas chez moi).


Mais je comptais sur des gars qui auraient déjà fait ça avant moi pour éviter de réinventer la roue.


Ça m'emmerde de devoir faire du décryptage alors que des gens qui y sont passés avant moi peuvent me répondre en deux secondes.

Imaginons si Champollion avait gardé la pierre de Rosette pour lui.


Là, je ne comprends pas pourquoi je ne peux pas simplement déclarer l'objet tel que c'est écrit dans l'exemple de la doc SDK.



Comment ça, c'est pire après ?

Riwall
30/03/2011, 22h20
tout simplement parce qu'il manque les 3/4 du code nécessaire.

Je t'invite à aller sur ce post http://frenchcinema4d.fr/showthread.php?72155-D%E9velopper-un-plugin-en-C

Il y a les bases pour créer une interface. Je te conseille aussi de compiler le SDK (dans le répertoire plugins de C4D) et de regarder un peu plus les exemples des fichiers en essayant de faire ressortir l'essentiel. (les fonctions de bases obligatoires)

Rooooh, mon topic en tant qu'exemple, :icon_eek:


C'est un peu hardcore au début de s'y mettre mais après, c'est pire ne t'inquiètes pas. (c'est ce qui est drôle)

Je confirme ^^

Pour répondre à ta question, et partir du code que tu as déjà, je dirais (sans pouvoir le vérifier dans l'instant) qu'il te manque les fonctions:


virtual Bool CreateLayout(void);
virtual Bool Command(LONG id,const BaseContainer &msg);

C'est nécessaire, puisque "CreateLayout" permet de créer (comme son nom l'indique) le "cadre" de la boîte de dialogue, à savoir tout son contenu, menu, nom, etc., c'est une sorte de constructeur, et la fonction "Command" regroupe les choses à faire lorsque qu'une action (event) est repéré, genre clic de souris, bouton appuyé, menu etc.

Déjà sans overrider ces deux fonctions, tu n'iras pas bien loin je crois. Ensuite le constructeur par défaut n'est pas utile ici, surtout s'il ne fait rien du tout.

Enfin, la fin du cpp de la fenêtre pose un gros problème, tu oublies "la classe" du plugin. Pour rappel, tu écris ceci:


Bool RgsFonction(void)
{
GePrint("La fonction !");

Fenetre dial;

return FALSE;
}

Selon moi, ça devrait ressembler à ça:


class Plug : public CommandData // la classe pour la commande
{
private:
Fenetre fen; // c'est ici que la fenêtre est créée

public:
virtual Bool Execute(BaseDocument *doc);
virtual LONG GetState(BaseDocument *doc);
virtual Bool RestoreLayout(void *secret);
};

LONG Plug::GetState(BaseDocument *doc)
{
return CMD_ENABLED;
}

Bool Plug::Execute(BaseDocument *doc) // qui ouvre le dialogue lorsque elle est executee
{
return fen.Open(TRUE, ID_PLUG, -1, -1) ;
}

Bool Plug::RestoreLayout(void *secret)
{
return fen.RestoreLayout(ID_PLUG, 0, secret);
}

Bool RgsFonction(void)
{
return RegisterCommandPlugin(ID_PLUG, String("Fenêtre !"), 0, NULL, String("blabla"), gNew Plug);
}

Avec bien sûr, en en-tête quelque part entre les include et la classe Fenetre par exemple, "#define ID_PLUG ton_id_de_plugin"

édit: et surtout éviter les copier/coller, c'est mal x)

valkaari
30/03/2011, 23h45
C'est tout à fait ça.

Attention dans la fonction d'enregistrement, tu as mis gNew Plugin alors que ta class s'appel Plug.

et surtout éviter les copier/coller, c'est mal x) :biggrin:

et surtout ce code est pour la version R11.5 et avant, pour la R12, ça change un peu (voir les fonctions du SDK pour adapter)

Riwall
30/03/2011, 23h57
Je vois pas de quoi tu parles :whistling:

et encore, t'as pas vu quand j'avais mis "LONG Face::GetState(BaseDocument *doc) " etc. la honte :D

Dis moi val, tu sais comment ouvrir un fichier C4D avec un plugin? Il faut instancier un "objet" avec comme filename le path du fichier? je bloque un peu là dessus (gros squattage de sujet, mais comme j'édite mon dernier message dans le mien, personne ne vois les modifs ^^)

édit en passant: en C++ je crois qu'on écrit #include <string>, pas de .h, je sais pas si les deux marchent ou quoi

valkaari
31/03/2011, 00h10
(
à froid :

Dans c4d_basedocument.h
tu as les fonctions LoadFile, InsertBaseDocument, SetActiveDocument, MergeDocument

mais j'utiliserais plutôt le LoadDocument qui renvoie un pointeur de type BaseDocument.

)