PDA

Voir la version complète : Norris-expérimentations diverses



norris
08/07/2007, 19h34
Bonjour tout le monde :odile:!

Je me lance enfin dans la programmation plugin en COFFEE.

Le but de mon premier plug est de créer des objets neutres placés automatiquement dans une hiérarchie et position donnée.
Ceci dans le but de me faciliter la construction de mon système de pied clampé avec reverse foot.

Pour créer l'objet en tant qu'enfant d'un autre, pas de soucis. Par contre, je galère comme pas possible pour gérer la position GLOBALE.
Avec "GetPosition" et "SetPositon", j'ai l'impession qu'on ne peut gérer que les positions locales :cry2: !
J'essaye avec "SetMg" (qui correspond à matrice globale ??),mais je ne veux transmettre que la position et non pas l'échelle.
Même en lisant le SDK ,je n'arrive pas à construire une matrice.

Voici mon code...


/// Based on original code found at http://www.nthd.org/article/articleview/14
// Original author _cory, real name unknown
// Extended by Crew Reynolds 3DCrew http://www.c4dcafe.com

// Be sure to use a unique ID obtained from www.plugincafe.com
// This one was allocated specifically to this plugin "StairMaster"
var PLUGIN_ID = 1016467;

CreerInclinAuto3() {
var doc = GetActiveDocument();
var ObjActif = GetActiveObject(GetActiveDocument());
var PosObj;
var px,py,pz;
var NullInclinAuto3 = new(NullObject);
var Nom = "Neutre Inclin.Auto (3)";
var MonSuffixe = " D";
var NomEtSuff = stradd(Nom,MonSuffixe);
NullInclinAuto3->SetName(NomEtSuff);
PosObj=ObjActif->GetPosition();
px=PosObj.x;
py=PosObj.y;
pz=PosObj.z;
NullInclinAuto3->SetPosition( vector(px,py,pz));
doc->InsertObject(NullInclinAuto3,NULL,NULL);
}
CreerCibleYOrteils() {
var doc = GetActiveDocument();
var ObjActif = GetActiveObject(GetActiveDocument());
var ObjEnfantActif = ObjActif->GetDown();
var InsertHierarchie = doc->FindObject("Neutre Inclin.Auto (3) D");
var CibleYOrteils = new(NullObject);
var Nom = "Cible Y Os Orteils";
var MonSuffixe = " D";
var NomEtSuff = stradd(Nom,MonSuffixe);
CibleYOrteils->SetName(NomEtSuff);
var MatriceObjEnfant= ObjActif->GetDown()->GetMg();
doc->InsertObject(CibleYOrteils,InsertHierarchie,NULL);
CibleYOrteils->SetMg(MatriceObjEnfant);

}

CreerPivotTalon() {
var doc = GetActiveDocument();
var ObjActif = GetActiveObject(GetActiveDocument());
var InsertHierarchie = doc->FindObject("Cible Y Os Orteils D");
var PosObj;
var px,pz;
var NullPivotTalon = new(NullObject);
var Nom = "Pivot Talon";
var MonSuffixe = " D";
var NomEtSuff = stradd(Nom,MonSuffixe);
NullPivotTalon->SetName(NomEtSuff);
PosObj=ObjActif->GetPosition();
px=PosObj.x;
pz=PosObj.z;

doc->InsertObject(NullPivotTalon,InsertHierarchie,NULL) ;
NullPivotTalon->SetMg( (vector(px,0,pz)), (vector(0,0,0)), (vector(0,0,0)), (vector(0,0,0)));
}

//______________________________________Définition de la classe pour la fenêtre de dialogue ____________________________
class MyDialog:GeModalDialog {
public:
MyDialog();
CreateLayout();
Command(id,msg);
}

MyDialog::MyDialog() { super(); }

MyDialog::CreateLayout() {
SetTitle("Foots Nulls Creator");//Titre de la fenêtre de dialogue

//Là on commence à créer Un 1er groupe qui contiendra tous les autres
AddGroupBeginV(100010,BFV_CENTER,1,"Boutons",0);//id,flags,rows,title,groupflags
AddGroupBorder(BORDER_OUT2);
AddGroupSpace( 20, 10 ); //Réglage de l'interlignage
AddGroupBorderSpace(10,5,10,5);
{//Là on commence à créer les "sous groupes"...un pour chaque bouton ici
AddGroupBeginH(100011,BFH_SCALEFIT,1,"",0);
AddButton(100012, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100013, 0, 0, 0, "--------------- Neutre Inclin.auto (3)", 0);
AddGroupEnd();

AddGroupBeginH(100014,BFH_SCALEFIT,1,"",0);
AddButton(100015, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100016, 0, 0, 0, "--------------- Cible Y Os Orteils", 0);
AddGroupEnd();

AddGroupBeginH(100017,BFH_SCALEFIT,1,"",0);
AddButton(100018, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100019, 0, 0, 0, "--------------- Pivot Talon", 0);
AddGroupEnd();

AddGroupBeginH(100020,BFH_SCALEFIT,1,"",0);
AddButton(100021, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100022, 0, 0, 0, "--------------- Cible Os Orteils", 0);
AddGroupEnd();

AddGroupBeginH(100023,BFH_SCALEFIT,1,"",0);
AddButton(100024, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100025, 0, 0, 0, "--------------- Cible Os Pied", 0);
AddGroupEnd();

AddGroupBeginH(100026,BFH_SCALEFIT,1,"",0);
AddButton(100027, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100028, 0, 0, 0, "--------------- Effecteur d’Extrémité Orteils", 0);
AddGroupEnd();

AddGroupBeginH(100029,BFH_SCALEFIT,1,"",0);
AddButton(100030, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100031, 0, 0, 0, "--------------- Neutre Cible Inclin.auto (1)", 0);
AddGroupEnd();

AddGroupBeginH(100032,BFH_SCALEFIT,1,"",0);
AddButton(100033, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100034, 0, 0, 0, "--------------- Cible Neutre Inclin.auto (2)", 0);
AddGroupEnd();

AddGroupBeginH(100035,BFH_SCALEFIT,1,"",0);
AddButton(100036, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100037, 0, 0, 0, "--------------- Cible Y Neutre Inclin.auto (4)", 0);
AddGroupEnd();

}AddGroupEnd();//On termine le groupe qui contient tous les autres.

//__________________________On recommence un nouveau groupe pour le champ "suffixe"_____________________________________
AddGroupBeginV(100040,BFV_SCALE,1,"SUFFIXE",0);//id,flags,rows,title,groupflags
AddGroupBorder(BORDER_OUT2);
AddGroupSpace( 20, 10 ); //Réglage de l'interlignage
AddGroupBorderSpace(10,5,10,5);
{
AddGroupBeginH(100041,BFH_SCALEFIT,1,"SUFFIXE",0);
AddStaticText(100042, 0, 0, 0, "Suffixe", 0);
AddEditText(100043, BFH_RIGHT, 50, 0);
SetString(100043," D");
AddGroupEnd();

}AddGroupEnd();

return TRUE;
}

MyDialog::Command(id,msg) {

switch(id) {
case 100012:
CreerInclinAuto3();
GeEventAdd(DOCUMENT_CHANGED);
GeEventAdd(REDRAW_ALL);
println("Inclin.Auto 3 Créé");
}

switch(id) {
case 100015:
CreerCibleYOrteils();
GeEventAdd(DOCUMENT_CHANGED);
GeEventAdd(REDRAW_ALL);
println("Cible Y Os Orteils Créé");
}

switch(id) {
case 100018:
CreerPivotTalon();
GeEventAdd(DOCUMENT_CHANGED);
GeEventAdd(REDRAW_ALL);
println("Pivot Talon Créé");
}

return TRUE;
}

//Define plugin and register in plugins pull-down menu
class MyMenuPlugin : MenuPlugin {
public:
MyMenuPlugin();
GetID();
GetName();
GetHelp();
Execute(doc);
}

//Reference super class of MyMenuPlugin
MyMenuPlugin::MyMenuPlugin() { super(); }

//Get ID for registered plugin
MyMenuPlugin::GetID() { return PLUGIN_ID; }

//Get Name. Function called my C4d to display name in pulldown
MyMenuPlugin::GetName() {
//Define name and return
var name = "Foots Null Creator";
return name;
}

//Get Help: Function defined for help.
MyMenuPlugin::GetHelp() {
var help = "Get some help!";
return help;
}

//Main function of plugin. This is executed when the plugin is selected.
MyMenuPlugin::Execute(doc) {
//When plugin is selected, pop-up dialog box.
var d = new(MyDialog);
d->Open(-1,-1);
}


// Big difference here. The main() function for a plugin only
// executes at load time -not- on every refresh like a C.O.F.F.E.E.
// expression does.
main() {
//Register plugin in pull-down menu
Register(MyMenuPlugin);
println("Creasean-Créer Nulls pied");
}



Je cherche aussi à transmettre le contenu d'un champ de texte éditable au nom d'un objet....(pour ajouter un suffixe).

J'ai encore une tonne de questions, mais déjà, gérer les positions globales serait bien !

Sinon, j'avance bien aussi en XPRESSO !
J'ai réalisé plusieurs xpresso que voici

Un tag pour gérer la distance mini et maxi entre deux objets.
http://creasean.free.fr/creasean-limit-distance-v1.c4d

Un tag pour gérer les position/rotation/échelle entre deux objets.
http://creasean.free.fr/mytag-psr.c4d

Un essai pour un système d'arc électrique
http://creasean.free.fr/xpresso-eclairs.c4d

J'ai bien l'intention de transformer tout ça en COFFEE et en plug par la suite, mais si ça peut déjà servir en l'état ,j'en serait ravi :wink:

Sur ce, à plus :odile: (le temps de retrouver une connection) !

mamy
09/07/2007, 10h34
je suis pas programmeur pour COFFEE mais je pense a peu près avoir compris les concepts donc essaye ca

var matrice = objet->GetMg(); //tu recupere la matrice globale de ton objet

matrice->SetV0(pos); // tu en modifie juste la position en gardant les axes

objet->SetMg(matrice)// tu remets la matrice modifiée

je pense que ca devrait marcher comme ca...après je ne suis sur de rien donc si les habitués peuvent se manifester ce serait cool pour lui :poucehaut:

xs_yann
09/07/2007, 12h23
Salut norris :D,
Voici ton code un peu modifié :


var PLUGIN_ID = 1000004; //fausse ID
var suffixe; //variable qui va servir à stocker le suffixe
class MyDialog : GeDialog { // GeDialog c'est une boite de dialogue qui permet d'agir dans c4d même la boîte ouverte, il permet aussi de pouvoir fermer la boîte de dial sans bouton ok/cancel
private:
CreerInclinAuto3(suffixe); //Je déclare mes fonctions (j'ai rajouter un paramètre pour le suffixe)
CreerCibleYOrteils(suffixe);
CreerPivotTalon(suffixe);
public:
MyDialog();

CreateLayout();
Init();
Command(id,msg);
Message(msg);
}
MyDialog::MyDialog() {
super(PLUGIN_ID);
}
MyDialog::Message(msg) {
return super::Message(msg);
}

MyDialog::CreateLayout() {
SetTitle("Foots Nulls Creator");

AddGroupBeginV(100010,BFV_CENTER,1,"Boutons",0);
{
AddGroupBeginH(100011,BFH_SCALEFIT,1,"",0);
AddButton(100012, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100013, 0, 0, 0, "--------------- Neutre Inclin.auto (3)", 0);
AddGroupEnd();

AddGroupBeginH(100014,BFH_SCALEFIT,1,"",0);
AddButton(100015, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100016, 0, 0, 0, "--------------- Cible Y Os Orteils", 0);
AddGroupEnd();

AddGroupBeginH(100017,BFH_SCALEFIT,1,"",0);
AddButton(100018, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100019, 0, 0, 0, "--------------- Pivot Talon", 0);
AddGroupEnd();

AddGroupBeginH(100020,BFH_SCALEFIT,1,"",0);
AddButton(100021, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100022, 0, 0, 0, "--------------- Cible Os Orteils", 0);
AddGroupEnd();

AddGroupBeginH(100023,BFH_SCALEFIT,1,"",0);
AddButton(100024, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100025, 0, 0, 0, "--------------- Cible Os Pied", 0);
AddGroupEnd();

AddGroupBeginH(100026,BFH_SCALEFIT,1,"",0);
AddButton(100027, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100028, 0, 0, 0, "--------------- Effecteur d’Extrémité Orteils", 0);
AddGroupEnd();

AddGroupBeginH(100029,BFH_SCALEFIT,1,"",0);
AddButton(100030, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100031, 0, 0, 0, "--------------- Neutre Cible Inclin.auto (1)", 0);
AddGroupEnd();

AddGroupBeginH(100032,BFH_SCALEFIT,1,"",0);
AddButton(100033, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100034, 0, 0, 0, "--------------- Cible Neutre Inclin.auto (2)", 0);
AddGroupEnd();

AddGroupBeginH(100035,BFH_SCALEFIT,1,"",0);
AddButton(100036, BFH_CENTER, 45, 10, "Créer");
AddStaticText(100037, 0, 0, 0, "--------------- Cible Y Neutre Inclin.auto (4)", 0);
AddGroupEnd();
}
AddGroupBorder(BORDER_OUT2);
AddGroupSpace( 20, 10 );
AddGroupBorderSpace(10,5,10,5);
AddGroupEnd();

AddGroupBeginV(100040,BFV_SCALE,1,"SUFFIXE",0);
{
AddGroupBeginH(100041,BFH_SCALEFIT,1,"SUFFIXE",0);
AddStaticText(100042, 0, 0, 0, "Suffixe", 0);
AddEditText(100043, BFH_RIGHT, 50, 0);
SetString(100043,suffixe);
AddGroupEnd();
}
AddGroupBorder(BORDER_OUT2);
AddGroupSpace( 20, 10 );
AddGroupBorderSpace(10,5,10,5);

AddGroupEnd();
return TRUE;
}

MyDialog::Init() {
SetString(100043,suffixe); // A l'ouverture le text va afficher le suffixe tel qu'il était à la fermeture
}
MyDialog::CreerInclinAuto3(suffixe) { //fonction un tout petit peu modifiée, je ne sais pas trop ce que tu veux faire ;--)
var doc = GetActiveDocument();
var objActif = doc->GetActiveObject();
var nullInclinAuto3 = AllocObject(Onull);
var nom = "Neutre Inclin.Auto (3)";
var nomEtSuff = stradd(nom,suffixe);
nullInclinAuto3->SetName(nomEtSuff);
var posObj = objActif->GetPosition();
nullInclinAuto3->SetPosition(vector(posObj.x,posObj.y,posObj.z));
doc->InsertObject(nullInclinAuto3,NULL,NULL);
return nullInclinAuto3;
}
MyDialog::CreerCibleYOrteils(suffixe) { //fonction un tout petit peu modifiée, je ne sais pas trop ce que tu veux faire ;--)
var doc = GetActiveDocument();
var objActif = doc->GetActiveObject();
var objEnfantActif = objActif->GetDown();
if(!objEnfantActif)return;
var insertHierarchie = doc->FindObject("Neutre Inclin.Auto (3) D"); //problème si on change le suffixe ??
var cibleYOrteils = AllocObject(Onull);
var nom = "Cible Y Os Orteils";
var nomEtSuff = stradd(nom,suffixe);
cibleYOrteils->SetName(nomEtSuff);
var matriceObjEnfant= objEnfantActif->GetMg();
doc->InsertObject(cibleYOrteils,insertHierarchie,NULL);
cibleYOrteils->SetMg(matriceObjEnfant);
}

MyDialog::CreerPivotTalon(suffixe) { //fonction un tout petit peu modifiée, je ne sais pas trop ce que tu veux faire ;--)
var doc = GetActiveDocument();
var objActif = doc->GetActiveObject();
var insertHierarchie = doc->FindObject("Cible Y Os Orteils D"); //problème si on change le suffixe ??
var nullPivotTalon = AllocObject(Onull);
var nom = "Pivot Talon";
var nomEtSuff = stradd(nom,suffixe);
nullPivotTalon->SetName(nomEtSuff);
var posObj=objActif->GetPosition();
doc->InsertObject(nullPivotTalon,insertHierarchie,NULL) ;
var mg = nullPivotTalon->GetMg();
mg->SetV0(vector(posObj.x,0,posObj.z));
nullPivotTalon->SetMg(mg);
}


MyDialog::Command(id,msg) {
var doc = GetActiveDocument();
suffixe = GetString(100043); // je récupère la valeur actuelle du suffixe
switch(id) {
case 100012:
CreerInclinAuto3(suffixe); //J'appelle la fonction avec comme paramètre le suffixe (pour le SetName)
println("Inclin.Auto 3 Créé");
break;
case 100015:
CreerCibleYOrteils(suffixe);
println("Cible Y Os Orteils Créé");
break;
case 100018:
CreerPivotTalon(suffixe);
println("Pivot Talon Créé");
break;
}
EventAdd(MSG_UPDATE); //Un rafraichissement ici suffit ;--)
return TRUE;
}


class MyMenuPlugin : MenuPlugin { // A partir de là le code ne change pas pour tout les plugs (pas besoin de tout comprendre)
public:
MyMenuPlugin();

GetID();
GetName();
GetHelp();
Execute(doc);

RestoreLayout(secret);
}

MyMenuPlugin::MyMenuPlugin() {
super();
}

MyMenuPlugin::GetID() {
return PLUGIN_ID;
}

MyMenuPlugin::GetName() {
return "norris";
}

MyMenuPlugin::GetHelp() {
return "norris";
}

var d;

MyMenuPlugin::Execute(doc) {
d->Open(TRUE,-1,-1);
}

MyMenuPlugin::RestoreLayout(secret) {
if (!d) d = new(MyDialog);
d->RestoreLayout(secret);
}

main() {
suffixe = "D"; // ici on défini juste la valeure du suffixe la première fois que le plugin sera utilisé
d = new(MyDialog);

Register(MyMenuPlugin);
}


Voilà le code tel que je l'aurai écrit, mis à part les fonctions.
J'ai un peu commenté les changements.
J'ai essayer de ne pas trop te changer les noms de variables :wink:
En esperant que ça puisse t'aider, n'hésite pas à nous dire ce que tu veux faire si tu veux qu'on t'aide pour le "corps" de tes fonctions :wink:
Bon courage :odile:

paspas
09/07/2007, 19h24
salut norris et bien venue dans le coté obscur de C4D .

pour convertir une position locale en global c'est le fonction

roulement de tambour .......................

[vector] GetMulP([vector] p); ou [vector] GetMulV([vector] v);

GetMulP sert a placer une COORDONNEE local en COORDONNE parent


M = matrice du parent

et P = coordonnée de p

var point = m ->GetMulP(P); // point serra ta coordonne par rapport au parent

GetMulP ; pareil mais c' est pour un vecteur direction et non plus une coordonnée


pour info la matrice du monde est

v0 = (0,0,0)
v1 = (1,0,0)
v2 = (0,1,0)
v3 = (0,0,1)

xs_yann
09/07/2007, 19h51
J'ai eu plusieurs fois des problèmes concernant les coordonnées parent/enfant, peut-être était-ce la clé.
En tout cas merci paspas :prie:

norris
21/07/2007, 18h13
Bonjour tout l'monde ! :odile:

Aaahhh ca fait deux semaines que je n'avais pas accès au net et que je cassais les neurones sur le SDK à n'y comprendre que la moitié :coup: !
Du coup ,ça fait plaisir de lire vos messages les gars :prie:
En plus j'avais vraiment la solution sous les yeux :wip: !

Déjà je ne savais pas qu'après un SetV0, il fallait refaire un SetMg.


En esperant que ça puisse t'aider, n'hésite pas à nous dire ce que tu veux faire si tu veux qu'on t'aide pour le "corps" de tes fonctions

Bein en fait, j'ai réussi à recréer un système de contrôleur pour mes pieds.Ca les clampe au sol ,et il y a aussi un système de reverse foot.
Mais pour ça, je dois créer une dizaine d'objets neutres avec des positions et rotation bien précises.La hiérarchie aussi est à respecter.
Mon petit plug doit juste avoir pour fonction de créer ces objets neutres ,les renommer,les placer comme il faut par rapport à l'os pied, et pour finir, il place ces objets selon une hiérarchie bien définie.
Comme c'est assez long à faire à la main, le plug le fera à ma place....Faut juste sélectionner le premier os pied et lancer le plug.
Par contre, les os du pied et de la jambe doivent déjà être bien placés, sinon ça ne marchera pas.

Pour ce qui est de récupérer les valeurs d'un champ texte, ça y est j'ai trouvé comme un grand :grin: !
Pour ce qui est du suffixe, c'est juste pour rajouter D ou G au bout du nom de mes objets pour chaque pied.De plus, je me sert du nom des objets pour insérer les autres en tant qu'enfant...donc si on change le suffixe pendant la création des objets, ça ne fonctionnera plus.

Bon...j'ai bien galéré, mais j'ai quand même réussi à faire ce que je voulais pour l'instant.
Voici le fichier rar avec le plug........Fichier RAR (http://creasean.free.fr/footnullcreator.rar)

Le code est sûrement très lourd et mal fait, mais ça marche....

Merci à vous les gars pour vos explications !je vais décortiquer ça avec intéret ce soir :prie: !

Bon sinon, j'ai encore un gros soucis.
A un moment, j'ai besoin de récupérer la longueur d'un os, mais impossible de trouver dans le SDK la partie où tous les objets sont listés, et leurs attributs /container que l'on peut régler.
Du coup, j'ai du créer un champ "edit number" pour rentrer manuellement la longueur de mon os.
J'ai beau chercher partout dans le SDK, je n'arrive pas à trouver.

Voilà voilà pour les news...Je vous remercie beaucoup pour le coup de pouce :wink:
A plus !...quand je retaxerais une connection....

EDIT:
Je cherche aussi à effacer un objet, mais je trouve pas :cry2:

paspas
23/07/2007, 14h23
salut norris



1)A un moment, j'ai besoin de récupérer la longueur d'un os,

tu doit utiliser le container de l'os
voilas la méthode simplifier pour les container ,

var ma_DU4 = objet #ID_USERDATA:4; remplace var ma_DU4 = container_objet ->GetData(ID_USERDATA:4);
objet#ID_USERDATA:1=ma_variable ; remplace container_objet->SetData(ID_USERDATA:4,ma_variable);

en gros ma_DU4 = la variable qui contiendra la longueur de l os
objet = ta variable qui ici serra celle de ton os
#ID_USERDATA:1 = est id pour récupère la valeur du container

attention dans l exemple c'est l' ID pour pour les DU personnelle pour la trouver celle la longueur de l' os

tu sélectionne l'os tu prend la console et tu glisse dans la fenêtre blanche de la console le non longueur os ou toute autre variable dont tu veut connaître l' id et cette ID apparaît dans la console l ID et c 'est cette ID que tu remplace dans mon code simplifier


2) c'est la fonction Remove() pour effacer un objet dans le sdk y a l' exemple attention y a une astuce mais je sait plus laquelle de mémoire ( mais c 'est dans le sdk ) sinon c4d plante :mrgreen:


paspas

norris
04/08/2007, 17h53
et tu glisse dans la fenêtre blanche de la console le non longueur os ou toute autre variable dont tu veut connaître l' id

Ahh ! je savais pas du tout ça ! excellent !
Merci bien pour l'info :poucehaut: !
Ceci dit, il doit bien y avoir dans le SDK une section avec les ID de tous les objets et leurs containers,
mais je ne l'ai toujours pas trouvée :cry2:

Maintenant, je découvre la class UserData, et je voudrais m'en servir pur afficher un icone.
Le problème, c'est que ça ne veut pas m'afficher mon icone, mais juste c qu'il y a derrière la fenêtre de dialogue,
dans la fenêtre 3D :o
Je vous aurais bien montré le code que j'ai écrit, mais je ne l'ai pas avec moi.

Pourtant, xs_yann m'a passé son plugin "ZeroPolygon" où il y en a un exemple, mais je n'arrive pas à faire marcher le plug pour une raison inconnue.
Même en testant avec un autre ID....... :(

J'ai aussi cherché un exemple de plugin simple avec la fenêtre de dialogue contenue dans le gestionnaire d'objets, mais le peu qui est expliqué est bien trop obscur pour moi :cry2:

norris
20/05/2008, 07h05
Bonjour les programmeux !! :D

Je reviens avec questions diverses en programmation.
J'ai toujours mon projet de plugin pour créer mes objets neutres, mais là j'essayais de me lancer dans un autre truc...
Me bricoler un plug qui ferait office de Visual Selector.et vi...j'ai pô la R10 :cry2:

Déjà ,je tiens à dire que j'ai réussi l'exploit d'afficher une image dans ma fenêtre de dialogue ! :lol:
Grâce à tes explications sur ton blog xs-yann !Un grand merci ! (si tu passes dans le coin..)

J'ai créé un bouton sur mon interface, et je voudrais qu'en cliquant, il me sélectionne un objet dont j'aurais au préalable rentré le nom dans un FindObject ou autre.
Ca parait tout c** comme ça, mais je n'y arrive pas....


SelectObjet() {
var doc = GetActiveDocument(); if(!doc) return;
var mon_cube = doc->FindObject("cube") ;
if (!mon_cube) return ;
var MyObj = mon_cube->GetObject() ;
if (!MyObj) return ;
}

et pour le bouton qui va apeller cette fonction:

switch(id) {
case 100012:
SelectObjet();
println("l'objet est sélectionné");
}

et dans la console, ca me dit "Member not found" et erreur sur la ligne "var MyObj = mon_cube->GetObject();"

J'ai testé plusieurs trucs, mais sans succès... :coup:

xs_yann
20/05/2008, 13h51
Grâce à tes explications sur ton blog xs-yann !Un grand merci ! (si tu passes dans le coin..)

Content que ça serve. :wink:



SelectObjet() {
var doc = GetActiveDocument(); if(!doc) return;
var mon_cube = doc->FindObject("cube") ;
if (!mon_cube) return ;
var MyObj = mon_cube->GetObject() ;
if (!MyObj) return ;
}


Je ne sais pas d'où viens ton GetObject(), mais pour séléctionner un objet il faut utiliser les bits (regarde dans le SDK à la page BaseList2D). :wink:

Ce qui te donnerais une fonction dans ce style :


SelectObjet() {
var doc = GetActiveDocument(); if(!doc) return;
var mon_cube = doc->FindObject("cube");
if (!mon_cube) return ;
if(!mon_cube->SetBit(BIT_AOBJ) return;
}


Bon courage :odile:

norris
21/05/2008, 20h08
Salut Yann.


Je ne sais pas d'où viens ton GetObject()...

:lol: bah...on fait bien des GetActiveObject ! alors moi je teste tout ce qui me passe par la tête :mrgreen:

Merci pour les infos ! J'ai testé et réussi à sélectionner un objet par le code, mais il gardait sélectionné l'objet qui y était avant d'appuyer sur mon bouton...
Du coup je suis reparti dans l'exploration du SDK et l'invention de fonctions qui n'existent pas pour trouver un truc, et je suis tomber sur le "SetActiveObject" . Ce qui me donne ça...

SelectObjet() {
var doc=GetActiveDocument(); if(!doc) return;
var mon_cube = doc->FindObject("Cube");
doc->SetActiveObject(mon_cube);
//mon_cube->SetBit(BIT_AOBJ);
return;
}

Et là ça a l'air de marcher.Il me sélectionne bien mon objet et désélectionne l'autre.Mais je n'ai pas trouvé de fonction pour désélectionner un objet.

Maintenant je me penche du côté des interfaces et des groupes.
J'arrive à peu près à comprendre, mais j'aimerais savoir si c'est possible de positionner mes boutons en en X et Y où je veux dans mon groupe ?
A part les "Flags" gauche ;droite ou centré, je n'est pas trouvé ce que je cherchais :| ...moi qui voulais carrément pouvoir faire du drag&drop avec mes boutons ,je ne suis pas près d'y arriver :lol:

Je me suis aussi procuré les sources du super petit plug que je ne connaissais pas ..."QuickSelect" de Fabian Rosenkranz que je remercie d'ailleurs.
Cette source va bien m'aider aussi dans mon apprentissage.Puis je bricole un peu en Visual Basic depuis peu...donc les grands principes commencent à rentrer :wip:

xs_yann
21/05/2008, 20h55
Mais je n'ai pas trouvé de fonction pour désélectionner un objet.


Toujours du côté des bits.


op->SetBit(BIT_AOBJ); // Tu t'assur que l'objet est bien séléctionné
op->ToggleBit(BIT_AOBJ); // Tu inverse l'état

:wink:

norris
21/05/2008, 21h14
Tout simplement....merci pour ta rapidité et ton aide!

norris
24/05/2008, 00h56
Je continue mes essais de placements d'éléments de l'interface.

Et moi qui trouvais le css parfois difficile :coup: :lol: !
Bon j'ai compris la base des groupes et tout ça.
Dans un onglet de mon interface, je veux afficher une image (ça c'est bon) et PAR DESSUS mes boutons.

J'ai cherché toute la soirée, et je n'y arrive pas. Impossible de superposer plusieurs groupes :cry2:
J'ai essayé de différentes façons; en imbriquant ma UserArea dans différents groupes ou en dehors, en jouant sur les Flags...rien n'y fait.

Quelqu'un aurait-il une solution ou une piste que je pourrais explorer ?

edit:
Ahh j'ai réussi à faire passer un groupe par dessus ma UserArea :nono: !
Reste maintenant à trouver comment positionner en absolu ces groupes, autrement qu'avec les Flags LEFT/CENTER/RIGHT.
J'ai réussi à feinter en plaçant un "GroupBorderSpace"...ce qui écarte mes boutons,mais du coup, rend le fond du groupe visible.
Et vu qu'il est par dessus mon image, il la cache :cry:

...peut-être une fonction pour rendre le fond d'un groupe transparent ?..je trouve jamais rien dans le SDK

Jean-Laurent
24/05/2008, 14h44
Pour les groupes ils faut avoir une idée bien précise de ce que l'on veut faire dès le départ pour décomposer ça en groupes cohérents.
Ce n'est pas toujours évident.

Je ne sais pas si il y a un moyen de positionner un groupe de manière absolu. Je ne pense pas. Car comme tu le soulignes des groupes ne peuvent pas se chevaucher.

Il faut donc jouer avec les GroupBorderSpace comme tu le fais mais également avec GroupSpace qui ne joue que sur l'espace entre les éléments du groupe.

Pour le SDK pense à télécharger le SDK pour C++ qui est valable même si tu n'utilise que le coffee.
Il est bien plus complet.

Un petite image de ce que tu fais pourrais permettre d'être plus précis. :wink:

norris
24/05/2008, 17h46
Salut Jean-Laurent :odile: !

Merci de venir m'aider dans mes expérimentations :wink:

Voici une image de ce que j'arrive à faire pour l'instant.

http://creasean.free.fr/images/prog/creaseanselector-posbtn.jpg

J'ai donc réussi à placer mes boutons par dessus l'image en les mettant dans le même groupe que celle-ci.
Les groupes de boutons (un gros avec chiffre et un petit avec flèche) ont un "GroupSpace(0,0) pour que le tour de ce bloc colle aux boutons sans laisser d'espace autour.

Maintenant je voudrais décaller un groupe de boutons vers le centre de l'image (comme pour le deuxième groupe), mais je me retrouve toujours à voir le fond de mon bloc alors que je voudrais voir l'image derrière.

J'ai vu qu'on pouvait ajouter des UserArea pour les transformer en boutons personnalisés, mais je voudrais rester simple pour l'instant.

Biensûr je pourrais positionner mes boutons tout autour de l'image. Ce serait toujours bien plus simple pour sélectionner mes contrôleurs que le gestionnaire d'objets, mais bon....je voudrais faire ça bien moi :) !

Jean-Laurent
24/05/2008, 19h34
Pourrais-tu préciser la manière dont tu as mis ton image en arrière plan.

C'est une user area? Dont la taille occupe tout le groupe?

Je sais que les user area peuvent dépasser de la taille qui leur est assignée.
As-tu essayé des groupes vides mais occupant de la place pour voir si ils apparaissent en grisés (en principe oui).

Le fait que tu ais les boutons par dessus l'image représente déjà une curiosité.
L'idéal serait de pouvoir mettre une image comme fond de groupe mais je n'ai jamais rien trouvé de tel.

J'ai peur que pour quelque chose d'aussi personnalisé tu ne sois obligé de passer par la méthode que tu décris, utiliser des users aréas.
J'espère me tromper.

norris
25/05/2008, 01h00
Oui l'image est bien une User Area.
Voici mon code



MyDialog::CreateLayout()
{

var i;
SetTitle("Creasean Selector");
AddTabGroupBegin(4001,BFH_SCALEFIT |BFV_SCALEFIT,TAB_TABS); //--------------------------------------------ONGLET QUI CONTIENT TOUT
{

//--------------------------------------# ONGLET 1----------------------------------------------------------------------------------------
AddGroupBeginV(2001,BFH_SCALEFIT |BFV_SCALEFIT,17," Corps ",BFV_CENTER);
{

}
AddGroupEnd();// FIN DE L'ONGLET 1

//---################################################## ######---------MON ONGLET 2 A MOI ----------------------------------
AddGroupBeginH(7001,BFV_TOP|BFH_SCALEFIT,1," test ",0);
{

//------Début du groupe qui entoure tout dans cet onglet
AddGroupBeginH(7002,BFV_TOP|BFH_LEFT,10,"",0);
{
AddUserArea(9989,BFV_TOP |BFH_LEFT,0,0);
AddGroupSpace(0,0);
AddGroupBorderSpace(0,0,0,0);

//ligne 1 - 1er groupe horizontal---------------------------------------------------------
AddGroupBeginV(1000,BFV_CENTER,6,"groupebtn",0);
{
//1er btn du 1er groupe
AddGroupBeginV(1000,BFV_CENTER |BFH_CENTER,2,"groupe btn1",0);
AddGroupSpace(0,0);
{
AddButton(8000,BFV_CENTER |BFH_CENTER,10,8,"1");
AddArrowButton(8050,BFH_CENTER,0,0,ARROW_DOWN);
}AddGroupEnd();



}AddGroupEnd();



}AddGroupEnd();//------le 1er groupe horizontal H1 fini ici
}AddGroupEnd();//--------------FIN DE MON ONGLET 2 A MOI


//DEBUT ONGLET 3
//################################################## ################################################## ###############################
AddGroupBeginV(2002,BFH_SCALEFIT|BFV_SCALEFIT,1," Face ",0);
{

}
AddTabGroupEnd();
ua = new(MyUserArea,9989,this);
return TRUE;
}


En plaçant cette UserArea juste derrière l'accolade de début du groupe, et les groupes de boutons après, ça a l'air de fonctionner.
J'ai aussi pensé à la feinte de créer des groupes ne contenant rien pour écarter virtuellement les autres visibles du bord, mais les groupes vides laissent voir leur fond gris effectivement.

Je vais essayer de jouer sur les valeurs de lignes et de colonnes disponibles dans le "AddGroupBegin" pour créer comme un tableau...
je verrais bien...... :roll:

Pour le coup des User Area, le problème est qu'il va falloir trouver comment les rendre réactifs :cry2:
J'ai déjà du mal à comprendre comment le faire sur des boutons normaux :lol:

De plus je ne comprnd strictement rien à l'architecture du SDK. Si seuleument il était aussi bien foutu que le MSDN de VB :roll:.
Du coup, il n'y a quand épluchant le peu de plugs open-source disponibles que j'arrive à comprendre petit à petit.

norris
25/05/2008, 12h40
Fiiouuuu !! J'ai vaincu :twisted: !

J'y ai passé une bonne partie de la nuit, usé quelques neurones et litres de café, mais j'ai réussi à écarter mes boutons du bord et à laisser l'image visible derrière.

J'avais oublié de préciser que, quand je défini ma classe UserArea, sa taille est à zéro

MyUserArea::GetUserWidth() {
return 0;
}

MyUserArea::GetUserHeight() {
return 0;
}

Voici donc ce que j'obtiens .

http://creasean.free.fr/images/prog/creaseanselector-shot2.jpg

Je construit en fait comme un tableau de boutons, mais les espaces en X et Y restent les mêmes et je ne peux donc pas placer mes boutons exactement où je voudrais.
J'avais pensé au départ séparer la partie visage dans un autre onglet, mais quand j'ai compris que sur des scènes avec plusieurs persos je serais embêté avec l'impossibilité de créer "plusieurs fenêtres" du même plug avec des sélections différentes,
j'ai décidé de mettre un perso par onglet.
D'ailleurs, je viens aussi de comprendre que dans ma source modèle, Fabian Rosenkranz enregistre tout ça dans un tag placé sur un nouveau neutre.....
Peut-être qu'en créant plusieurs de ces tags.....

Quand j'aurais bien nettoyé mon fichier, je peux mettre la source dispo pour ceux qui sont intéressés par l'interface :wink:

Bon je suis encore à mille lieux de faire la même chose que le vrai Visual Selector (boutons personnalisables; drag&drop...), mais ca va déjà bien m'aider comme ça :bounce:

Jean-Laurent
25/05/2008, 15h53
:efface:

J'avoue que je séchais totalement sur ton dernier message.

C'est bien ce qui me semblait. En mettant la taille de l'User Area à 0, tu la fais "déborder", sans qu'elle chasse les autres boutons.
C'est astucieux mais il reste à voir si ça ne pose pas de problèmes.

Je suis d'accord avec toi, le SDK est très loin d'être ce qui se fait de mieux et de plus clair en la matière.
En particulier celui du coffee. (N'oublie pas de regarder celui du C++ qui est plus complet et marche également en coffee).

Et avec ton tableau de bouton l'alignement gauche et droite des boutons ne marche pas ?

En tout cas, joli travail.

Itsmil
25/05/2008, 16h08
bon, je vais faire mon ch*eur, de plus je comprends rien de ce que vous dites

mais juste comme ça...

pour le fun...

...

il n'y a pas une faute dans le titre ? :nono:

bon, bon :arrow:

norris
25/05/2008, 17h05
Ohhh bien vu Itsmil :wink:

Bein en fait si je me met à toucher au "GroupBorderSpace" des groupes entourant directement mes deux boutons, on revient avec le problème de fond gris...logique :cry2:

Le seul endroit où je peux changer les écarts entre boutons sans voir leur fond, c'est dans un "GroupSpace" placé sur un bloc qui entoure tout....celui qui définit mon tableau quoi.

Quoique en rajoutant encore des blocs pour faire des lignes comme je l'ai fait pour l'image du visage, j'arriverais à jouer sur l'écart des boutons quand même, mais alors là j'y comprend plus grand chose dans l'imbrication de tous mes blocs :lol:

Voilà à quoi j'arrive ...

http://creasean.free.fr/images/prog/selector-shot3.jpg

Puis maintenant que j'ai bien foutu le bazard dans les ID des boutons je vais bien galérer à leur réattribuer leur fonctions pour que tout fonctionne :cry2:
Mais c'est comme ça que je comprendrais :twisted: !

Je tiens à dire encore merci à Fabian pour sa source :prie:

oli_d
26/05/2008, 21h38
Salut Norris,

Désolé de ne pas pouvoir t'aider sur ce coup là, mais je n'ai pas beaucoup d'expérience dans les interfaces.

En tout cas bravo pour tes avancées, et merci de les partager.