3DVL

Motion Inspector script

GUI






 

Cette extension est basée en partie sur la bibliothèque FLTK.


Création de boite de dialogue


La création de boites de dialogue se fait en utilisant les fonctions de type Udxxx :


Création et exécution

Long UdNew(Long X, Long Y, Long W, Long H, String Titre)

Bool UdCreate(Long Idd)

Bool UdDelete(Long Idd)

Long UdExecute(Long Idd)

UdSetBuffer(Long Idd, Array Buffer)


Ajout de contôle

Long UdAddStatic(Long Idd, Long X, Long Y, Long W, long H, String Titre)

Long UdAddUrl(Long Idd, Long X, Long Y, Long W, long H, String Titre, String Url)

Long UdAddEdit(Long Idd, Long X, Long Y, Long W, long H, String Titre)

Long UdAddNumber(Long Idd, Long X, Long Y, Long W, long H, Double Nombre, Long Min, Long Max)

Long UdAddDecoration(Long Idd, Long X, Long Y, Long W, long H, Long type)

Long UdAddCheckBox(Long Idd, Long X, Long Y, Long W, long H, String Titre, Bool Etat)

Long UdAddGroupBox(Long Idd, Long X, Long Y, Long W, long H, String Titre)

Long UdAddRadioButton(Long Idd, Long X, Long Y, Long W, long H, String Titre, Bool Etat, Long Group)

Long UdAddComboBox(Long Idd, Long X, Long Y, Long W, long H, Long type, Array List)

Long UdAddButton(Long Idd, Long X, Long Y, Long W, long H, String Titre, String Procedure)


Gestion des contrôles


Long UdGetNbItems(long idd)

UdEnableControl(long idd, long idc, bool enable)

UdShowControl(long idd, long idc, bool show)

UdSetControlCaption(long idd, long idc, variant caption)

String UdGetControlCaption(long idd, long idc)

UdSetTextControl(long idd, long idc, variant caption)

String UdSetTextControl(long idd, long idc)

UdSetItemControl(long idd, long idc, variant value)

UdOnChange(long idd, long idc, string proc)

UdInClick(long idd, long idc, string proc)



La création de la boite de dialogue se fait en 4 étapes


1 Création de la boite

2 Ajout des contrôle (Texte, légendes etc.)

3 Exécution

4 Destruction et récupération des valeurs



Etape 1 : Création de la boite : UdNew


Usage


Long Idd := UdNew(Long X, Long Y, Long W, Long H, String Titre)


Description

Cette fonction assure la création d’une boite de dialogue. X et Y spécifie la position (en pixel, relativement à l’écran), W et H la taille (Longueur et largeur) et titre correspond au titre de la boite. Cette fonction renvoie un identificateur (Idd) unique de la boite. Cet identificateur est utilisé pour accéder au fonctions de la boite de dialogue.



Exemple :


var Idd := UDNew(100, 100, 300, 130, "Textes et Légendes");

if (Idd <> -1) then // Si il existe un nouvel ID



Etape 2 : Création et Ajout des contrôles


Une fois la boite créée, il faut maintenant ajouter des contrôles. Lors de la création, le contrôle renvoie un numéro indiquant son ordre de création. En cas d’échec, la valeur renvoyée est –1.


Contrôle de type texte statique (Légende)


UdAddStatic(Long Idd, Long X, Long Y, Long W, Long H, String Texte)


Cette procédure ajoute une légende à la boite de dialogue désignée par l’identificateur Idd, à la postion X, Y (relative à la boite de dialogue), W et H correspond à la taille et Texte correspond à la légende.


Exemple :


Var ids1 := UDAddStatic(Idd, 10, 10, 70, 25, "Début");


Contrôle de type texte Url (Lien)


UdAddUrl(Long Idd, Long X, Long Y, Long W, Long H, String Texte, String Url)


Cette procédure ajoute une légende à la boite de dialogue désignée par l’identificateur Idd, à la postion X, Y (relative à la boite de dialogue), W et H correspond à la taille et Texte correspond à un lien vers un site web.


Exemple :


UdAddUrl(Idd, 10, 155, 70, 20, "Légo", "http://mindstorms.lego.com/");



Contrôle de texte Editable


UdAddEdit(Long Idd, Long X, Long Y, Long W, Long H, String Texte)


La syntaxe est exactement la même que pour le texte statique. La seule différence est que l’utilisateur peut modifier ce texte.



Long UdAddNumber(Long Idd, Long X, Long Y, Long W, Long H, Double Nombre, Long Min, Long Max)


Ce contrôle est utilisé uniquement pour des nombres (Entier ou Double). La syntaxe est proche de celle du contrôle de texte, mais ici Nombre correspond à un nombre réel ou entier, Min et Max correspondent aux valeurs minimale et maximal. Ces deux valeurs sont utilisées pour les deux boutons se trouvant à droite de ce contrôle (bouton d’incrémentation).


Exemple :


Var idn1 := UDAddNumber(Idd, 20, 20, 50, 25, 12, 0, 200);



Cases à cocher


Deux types de cases à cocher existent :


Les “ CheckBox ” et les “ Boutons Radio ”


UdAddCheckBox(Long Idd, Long X, Long Y, Long W, Long W, String Titre, Bool Etat)

Cette procédure ajoute à la boite de dialogue (identificateur Idd) une case à cocher indépendante. La position et la dimension sont données par X, Y, W et H. Titre correspond à la légende et Etat à la coche (True = cochée).


Exemple :


var PosY2 := 10;

var i;

for(i:= 0; i < 3; i++)

var cond := true;

if (i = 1) then cond := false; end;

UDAddCheckBox(Idd, PosX, PosY2, 120, 20, "Condition N°"+str(i+1), cond);

PosY2 := PosY2 + 25;

end;



UdAddRadioButton((Long Idd, Long X, Long Y, Long W, Long W, String Titre, Bool Etat, Long Group)

Cette procédure crée un bouton radio sur la boite de dialogue Idd, à la positin X, Y (et de taille W, H), avec une légende (Titre) et un état (Etat), associé à un groupe de boutons radio dont l’identificateur est donné par Group.

Il FAUT donc créer AVANT ce groupe, en utilisant la fonction :


Long UdAddGroup(Long Id, Long X, Long Y, Long W Long H, Long Titre)

Cette fonction crée un groupe (rectangle de position X, Y et de taille W, H) sur la boite de dialogue (Idd) avec un titre.

Cette fonction renvoie un identificateur de groupe (nombre). C’est ce nombre qui DOIT être utilisé par la procedure UdAddRadioButton


Exemple :


PosY2 := PosY2 + 20;

var Cd := true;

for(i:= 0; i < 4; i++)

UdAddRadioButton(Idd, PosX+10, PosY2, 80, 20," Filtre "+str(i+1),Cd, IdGroup);

Cd := false;

PosY2 := PosY2 + 25;

end;



Contrôle de type Liste


UdAddComboBox(Long Idd, Long X, Long Y, Long W, Long H, Long Type, Array List)

Cette procédure crée une boite de liste déroulante (de trois type 0, 1 2 suivant la variable Type) dans la boite de dialogue (Idd). Comme d’habitude, la position et la dimension sont données par X, Y et W, H. La liste à afficher se trouve dans le tableau (Array List). Celui-ci peut contenir des chaînes de caractères, des nombres ou des booléens.


UdAddListBox(Long Idd , Long X, Long Y, Long W, Long H, Bool Sort, Array List)

Cette procédure crée une boite de liste classique (triée par ordre alphabétique ou pas –variable sort-). Comme d’habitude, la position et la dimension sont données par X, Y et W, H. La liste à afficher se trouve dans le tableau (Array List). Celui-ci contient des chaînes de caractères.


Exemple :



var CurrentFolder := GetCurrentDirectory();

var List := GetDirectoryList(CurrentFolder, "*.*");

var i;

var PosY2 := 10;

UdAddComboBox(Idd, 10, PosY2, 140, 100, 0, List);

UdAddListBox(Idd, 200, PosY2, 140, 120, true, List);



Contrôle de type Bouton de commande


UdAddButton(Long Idd, Long X, Long Y, Long W, Long H, String Texte, String Proc)

Cette procédure ajoute à la boite de dialogue (Idd) un bouton de commande (de même type que le bouton OK, par exemple), à la position X, Y et de dimension W, Y. La légende du bouton est donnée par Texte. Lorsque l’on valide ce bouton, la procédure nommée par Proc est lancée. Cette procédure doit bien sur exister dans le programme. Cette procédure DOIT être du type : Procedure MaProc(), sans aucun paramètre.


Exemple :


Procedure TestButton()

MessageBeep(0);

var msg := "Le bouton 'MESSAGE' a été validé...." + endl+endl;

Message(msg);

end;


.


PosY2 := PosY2 + 25;

UdAddButton(Idd, 30, 120, 100, 25, "Message", "TestButton");





Etape 3 : Exécution de la boite de dialogue


Une fois que tous les élements sont en place, il est possible d’exécuter cette boite de dialogue. Il faut cependant, juste avant de lancer l’exécution, désigner un tableau où sera stocké les valeurs des différents contrôles. En effet, si l’utilisateur modifie un texte, sélectionne un item dans une liste, coche une case etc., il faut récuper cette information une fois l’exécution terminée.


UdSetBuffer(Long Idd, Array Buffer)

Cette procédure assigne à la boite de dialogue Idd un tableau utilisé pour connaître le résultat.

Ce tableau est automatiquement redimensionné par la boite de dialogue.


Exemple :


var DialBuffer := Array(0);

UDSetBuffer(Idd, DialBuffer);


Long UdExecute(Idd)

Cette fonction affiche et exécute la boite de dialogue. La valeur renvoyée est égale à 1 (IDOK) lorsque le bouton OK a été validé. Cette valeur est égale à 2 (IDCANCEL) lorsque le bouton Annuler a été validé.


Exemple :


var ret := UDExecute(Idd);



UdDelete(Long Idd)

Une fois l’exécution terminée, il est nécessaire de détruire la boite de dialogue. Cela permet de libérer l’espace mémoire occupé par les différents contôles.


Exemple :


UDDelete(Idd);




//------------------------------------------------

// Etape 3 : Exécution de la boite de dialogue

//------------------------------------------------

UDSetBuffer(Idd, DialBuffer);

var ret := UDExecute(Idd);

UDDelete(Idd);




Etape 4 : Récupération des valeurs


Certains contrôles vont permettre à l’utilisateur du programme de modifier une valeur (texte) , choisir une option (case à cocher), choisir un nom dans une liste. Il faut donc pouvoir récuper ces valeurs.


Par exemple, si dans une boite de dialogue, nous avons crée 4 contrôles du type :


UDAddStatic(Idd, 10, PosY, 70, 25, "Début");

UDAddEdit(Idd, Edx, PosY, 50, 20, "12");


PosY := PosY + 25;

UDAddStatic(Idd, 10, PosY, 70, 20, "Fin");

UDAddEdit(Idd, Edx, PosY, 50, 20, "200");


var DialBuffer := Array(0);

UDSetBuffer(Idd, DialBuffer);

var ret := UDExecute(Idd);

UDDelete(Idd);




Automatiquement, après exécution de la boite de dialogue, le tableau DialBuffer contiendra deux chaines de caractères, correspondant aux deux zone de texte. En effet, les textes statiques (Légendes), boutons et les décorations ne renvoient aucune valeur et donc le tableau ne contiendra pas de valeur pour ces contrôles.

Les valeurs sont rangées dans le tableau suivant l’ordre de création des contrôles.

Ainsi DialBuffer[0] contiendra le texte du premier contrôle (zone de texte, Edit). La valeur renvoyée est une chaîne de caractères. De même, DialBuffer[1] contiendra le texte de la deuxième zone de texte (Edit).


Donc, le nombre d’éléments (sizeof(Dialbuffer))du tableau correspond au nombre de contrôle (sauf statique, décoration et bouton) créés dans la boite de dialogue. Ce tableau est automatiquement redimensionné par la boite de dialogue (donc, il est possible de créer initialement un tableau de 0 élément).

L’ordre de ces valeurs corrrespond à l’ordre de création.

Le type de valeurs du tabkeau est le suivant :


Contrôle

Type de valeur

Zone de texte (Edit)

Chaîne de caractères

Nombre

double

Case à cocher (CheckBox)

Boolean

Case à cocher (Radio)

Boolean

Liste déroulante (ComboBox)

Chaîne de caractères

Liste (List Box)

Entier (indice de l'élément)


Exemple :


//------------------------------------------------

// Etape 4 : Récupération des valeurs

//------------------------------------------------

if (ret = 1) then

var i;

var si := sizeof(Dialbuffer);

var msg:= endl;

for(i:= 0; i < si; i++)

msg := msg + "Item N°" + str(i+1) + " : " + str(Dialbuffer[i])+endl;

end;

Message("Retour : "+msg);

end;




Gestion des évènements


Pendant l’exécution de la boite de dialogue, il est possible de modifier l’aspect d’un contrôle. Par exemple, suivant qu’une condition est vrai ou fausse, on veut modifier l’apparence d’une case à cocher.


var TestBool := true;

var InvalidItem := 0; // Numéro du contrôle à modifier


Procedure Invalide()

// Cette fonction va rendre valide/invalide un seul contrôle

TestBool := !TestBool;

UdEnableControl(Idd, InvalidItem, TestBool);

end;


Cette procédure, appelée lors de l’appui sur un bouton, va modifier un contrôle (dans cet exemple celui portant le numéro 0).



Procédures et fonctions



UdShowControl(Long Idd, Long Idc, Bool show)

Cette procédure fait apparaître (disparaître) un contrôle (portant le numéro Idc) de la boite de dialogue portant le numéro Idd.


UdEnableControl(Long Idd, Long Idc, Bool show)

Cette procédure rend valide (invalide) un contrôle (portant le numéro Idc) de la boite de dialogue portant le numéro Idd.


String GetControlCaption(Long Idd, Long Idc)

Cette fonction récupère le titre (si il existe) du contrôle (portant le numéro Idc) de la boite de dialogue portant le numéro Idd.


UdSetControlCaption(Long Idd, Long Idc, String Titre)

Cette procédure modifie le titre (si ce contrôle comporte un titre) du contrôle (portant le numéro Idc) de la boite de dialogue portant le numéro Idd.


String GetTextControl(Long Idd, Long Idc)

Cette fonction récupère le texte (si il existe) du contrôle (portant le numéro Idc) de la boite de dialogue portant le numéro Idd.


UdSetTextControl(Long Idd, Long Idc, String Titre)

Cette procédure modifie le texte (si ce contrôle comporte un texte) du contrôle (portant le numéro Idc) de la boite de dialogue portant le numéro Idd.


Gestion d’événements liés aux contrôles


Dans le langage 3DVL, deux types d’événement sont gérés par les contrôles : les modifications (OnChange) et les sélections (OnClick). Il est ainsi possible de déclencher une procédure lorsqu’une zone de texte à été modifiée, un bouton ou une case à cocher sélectionnés etc.

Il existe donc deux procédures :


UdOnChange(Long Idd, LongIdc, String Proc)

UdOnClick(Long Idd, LongIdc, String Proc)


Pour utiliser c’est événement, il suffit de déclarer la procédure à lancer (Proc), attachée à un contrôle particulier (Idc) et à une boite particulière (Idd). La procédure qui sera lancée ne doit pas posséder d’arguments.


Exemple :


Procedure OnEditChange()

var text1 := UdGetTextControl(Idd, Edit1); //Récupère le texte de Edit1

var text2 := UdGetTextControl(Idd, Edit2); //Récupère le texte de Edit2

var delta := atof(Text2)-atof(text1);

UdSetTextControl(Idd, Static, delta); // et le met dans Static

end;


// La même chose, mais en accèdant aux données par le buffer

Procedure OnEditChangeValue()

var delta := DialBuffer[1]-DialBuffer[0];

UdSetTextControl(Idd, Static, delta); // et le met dans Static

end;


.


Edit1 := UdAddNumber(Idd, Edx, PosY, 50, 24, 12, 0, 1000); // ajout d'un nombre

static := UdAddStatic(Idd, Edx+70, PosY+16, 40, 20, "188");

UdOnChange(Idd, Edit1, "OnEditChangeValue"); //Désigne la procédure OnChange


PosY := PosY + 28;

UDAddStatic(Idd, 10, PosY, 70, 24, "Fin"); // ajout d'un texte

Edit2 := UDAddNumber(Idd, Edx, PosY, 50, 24, 200, 0, 1000);

UdOnChange(Idd, Edit2, "OnEditChange"); //Désigne la procédure OnChange