Types de données
Les types de données qu'on va que vous allez rencontrer en VLAX
diffèrent considérablement de l'AutoLISP
Pour mémoire il faut "transformer" le type renvoyé par AutoLISP en type reconnu par VLISP.
La première transformation va s'appliquer au type (ename) qui doit devenir un "object" par la fonction (vlax-ename->vla-object).
FONCTION | MÉMENTO |
---|---|
VLAX-MAKE-SAFEARRAY | Création de tableau (array) |
VLAX-MAKE-VARIANT | Création de "variant" |
VLAX-VARIANT-TYPE | quel type contient le variant |
VLAX-VARIANT-VALUE | valeur contenue dans variant |
VLAX-VARIANT-CHANGE-TYPE | modifier type dans variant |
Haut de page | Retour menu Fonctions VL |
VLAX-MAKE-SAFEARRAY
Création d'un tableau (array)
Si vous avez déjà programmé en VBA ou dans d'autres langages, vous connaissez probablement le concept de tableaux (array).
Le type de données du tableau ActiveX est quelque peu similaire à une liste dans AutoLISP.
Ils contiennent plusieurs éléments qui représentent différentes structures de données.
Une utilisation courante pour un tableau est de représenter une valeur de coordonnée.
Vous pouvez utiliser (vlax-safearray-> list) pour convertir un tableau en liste. La conversion d'une liste en tableau nécessite de définir le type de données et le nombre d'éléments que le tableau doit avoir avec (vlax-make-safearray), et d'affecter les valeurs de la liste aux éléments du tableau en utilisant le remplissage (vlax-safearray).
Un tableau est une "collection" de variables du même type de données.
Chaque élément d'un tableau peut être distingué des autres éléments par un ou plusieurs index entiers.
Les tableaux permettent de regrouper les variables associées et d'accéder à chaque variable individuellement.
Il est possible de configurer des boucles en utilisant des numéros d'index pour gérer efficacement un nombre quelconque de cas.
À la création d'un tableau, il faut lui donner une taille, elle est déterminée par le nombre de dimensions qu'il possède et par les limites supérieure et inférieure des numéros d'index dans chaque dimension.
En langage naturel on dirait nombre de trois lignes et nombre de colonnes, pour visualiser un tableau pensez à Excel et à ses cases nommées colonne puis lignes.
Syntaxe : (vlax-make-safearray type '(LimiteInf . LimiteSup))
Arguments :
La fonction "vlax-make-safearray" nécessite au minimum deux arguments.
Le premier argument type identifie le type de données qui seront stockées dans le tableau.
Ci-après les différents types de données à spécifier :
Type | Description | Valeur |
---|---|---|
vlax-vbInteger | Integer | 2 |
vlax-vbLong | Long Integer | 3 |
vlax-vbSingle | Single-precision floating point number | 4 |
vlax-vbDouble | Double-precision floating point number | 5 |
vlax-vbString | String | 8 |
vlax-vbObject | Object | 9 |
vlax-vbBoolean | Boolean | 11 |
vlax-vbVariant | Variant | 12 |
Les arguments restants à "vlax-make-safearray" spécifient les limites supérieure et inférieure de chaque dimension du tableau.
La limite inférieure d'un indice peut être zéro ou tout autre nombre entier (positif ou négatif).
Le nombre entier (integer) indiqué dans la troisième colonne indique la valeur de remplacement de la valeur littérale.
Toutefois il est recommandé de spécifier la constante en toutes lettres dans votre argument au cas où la valeur changerait dans les versions ultérieures d'AutoCAD.
Valeur retournée : le tableau (safearray) si réussite
Un maximum de 16 dimensions peut être défini pour un tableau.
Les éléments du tableau sont initialisés comme suit :
- Nombres : 0 (zéro)
- Chaînes de caractères (string) : une chaîne vide (de longueur 0 (zéro)
- Booléen : vlax-false
- Objet (object) : nil
- Variant : vlax-vbEmpty
Exemples :
Définition d'un tableau pour recevoir les coordonnées d'un point :
( setq point ( vlax-make-safearray vlax-vbDouble '( 0 . 3) ))
ce qui renvoie un safearray <safearray...>
Pour "voir" ce qu'il contient, dans la console de l'I.D.E. (F6) taper :
( vlax-safearray->list point )
point étant un nom de variable par la commande point je préfère préciser
Valeur renvoyée : (0.0 0.0 0.0 0.0) (tableau initialisé avec des valeurs 0 (zéro)
Ou bien mettre le curseur sur le mot "point" toujours dans l'I.D.E. et bouton droit > Inspecter va renvoyer ceci :
Création d'un tableau qui contiendra des chaînes de caractères (string) dont les index commencent à 1.
Le numéro 1 est le premier élément de la chaîre (string)
( setq tableau-string ( vlax-make-safearray vlax-vbString '( 1 . 2 ) ' ( 1 . 2 ) ))
( setq liste-string ( vlax-safearray->list tableau-string ))
Renvoie : (("" "") ("" ""))
Inspecter :
Attention à bien donner des paires pointées (dotted pair) en arguments
Haut de page | Retour menu Fonctions VL |
VLAX-MAKE-VARIANT
Création d'un type de donnée "variant"
Syntaxe : (vlax-make-variant [valeur [type]])
Arguments : facultatifs
si l'argument valeur est renseigné il peut prendre les valeurs suivantes :
Constante | Description | Valeur |
vlax-vbEmpty | non initialisé (valeur par défaut) | 0 |
vlax-vbNull | 1 | |
vlax-vbInteger | nombre entier (integer) | 2 |
vlax-vbLong | nombre entier long (long integer) | 3 |
vlax-vbSingle | Réel simple précision | 4 |
vlax-vbDouble | Réel double précision | 5 |
vlax-vbString | Chaîne de caractères (string) | 8 |
vlax-vbObject | Objet (object) | 9 |
vlax-vbBoolean | Valeur booléenne | 11 |
vlax-vbArray | Tableau (array) | 8192 |
Le nombre entier (integer) indiqué dans la troisième colonne indique la valeur de remplacement de la valeur littérale.
Toutefois il est recommandé de spécifier la constante en toutes lettres dans votre argument au cas où la valeur changerait dans les versions ultérieures d'AutoCAD.
Si vous n'indiquez pas de type type, (vlax-make-variant) affecte un type de données par défaut en fonction du type de données de la valeur qu'il a reçu dans l'argument valeur.
La liste suivante identifie le type de données variant par défaut affecté à chaque type de données LISP.
nil ........................................ vlax-vbEmpty
vlax-null............................ vlax-vbNull
integer ............................... vlax-vbLong
real ...................................... vlax-vbDouble
string ................................. vlax-vbString
VLA-object......................... vlax-vbObject
vlax-true/:vlax-false ...... vlax-vbBoolean
variant .............................. type de la l'argument valeur
vlax-make-safearray ..... vlax-vbArray
Exemples :
( setq var-int ( vlax-make-variant 10 vlax-vbinteger ))
Renvoie : #<variant 2 10>
sans préciser les arguments :
( setq var-str ( vlax-make-variant "je suis un texte" ))
Renvoie : #<variant 8 je suis un texte>
Haut de page | Retour menu Fonctions VL |
VLAX-VARIANT-TYPE
Détermination du type de données
d'un variant
Syntaxe : (vlax-variant-type var)
Argument : var une variable contenant un variant
Valeur renvoyée : un nombre entier (integer) qui signifiera suivant sa valeur :
0 ⇒ vide Uninitialized (vlax-vbEmpty)
1 ⇒ Données invalides (vlax-vbNull)
2 ⇒ Nombre entier Integer (vlax-vbInteger)
3 ⇒ Long integer (vlax-vbLong)
4 ⇒ Réel simple précision Single-precision floating-point number (vlax-vbSingle)
5 ⇒ Réel double précision Double-precision floating-point number (vlax-vbDouble)
8 ⇒ Chaîne de caractères String (vlax-vbString)
9 ⇒ Objet Object (vlax-vbObject)
11 ⇒ Booléen Boolean (vlax-vbBoolean)
8192+n ⇒ Tableau Safearray (vlax-vbArray).
Si var ne contient pas un variant une erreur est renvoyée
Exemples :
( setq var-int ( vlax-make-variant 5 vlax-vbInteger ))
( vlax-variant-type var-int ) renvoie #<variant 2 5>
Notons que si le type n'est pas annoncé explicitement lors de la création ça fonctionne aussi :
( setq var-int ( vlax-make-variant 8 ))
( vlax-variant-type var-int ) renvoie #<variant 3 8>
Mais l'entier "8" est considéré comme un Long integer (vlax-vbLong) comme expliqué plus haut au sujet des valeurs par défaut.
( setq variable-pas-vla 1.234 ) renvoie : 1.234
( vlax-variant-type variable-pas-vla )
Renvoie : ; erreur: type d'argument incorrect: variantp 1.234
Haut de page | Retour menu Fonctions VL |
VLAX-VARIANT-VALUE
Valeur contenue dans un variant
Syntaxe : (vlax-variant-value var)
Argument : var,une variable contenant un variant.
Valeur renvoyée : la valeur de la variable var sous forme de nombre entier (integer), nombre réel (real), chaîne de caractères (string), Objet VLA (VLA-object), Tableau (Safearray), T, ou nil .
Si var ne contient pas un variant, une erreur est renvoyée.
Exemples :
( setq varint ( vlax-make-variant 8 ))
( vlax-variant-value varint )
Renvoie : 8 (le contenu de la variable "varint")
( setq variable-pas-vla 1.234 )
( vlax-variant-value variable-pas-vla )
Renvoie : ; erreur: type d'argument incorrect: variantp 1.234
Haut de page | Retour menu Fonctions VL |
VLAX-VARIANT-CHANGE-TYPE
Modification de type dans variant
Syntaxe : (vlax-variant-change-type var type)
Arguments :
var, une variable contenant un variant.
type, pour connaître le type supporté voir tableau de VLAX-MAKE-VARIANT
Valeur renvoyée :
La valeur de var, après la conversion au type de variante spécifié
nil si var n'a pas pu être convertie en type spécifié.
Exemples :
( setq var-variant-int ( vlax-make-variant 2018 ))
( setq var-variant-str ( vlax-variant-change-type var-variant-int vlax-vbstring ))
Pour vérifier si la nouvelle variable est bien une chaîne de caractères (string) :
( vlax-variant-value var-variant-str ) renvoie : "2018"
et pour se rassurer :
( vlax-variant-type var-variant-str )
Renvoie : 8
comme décrit dans le tableau de VLAX-VARIANT-TYPE
8 ⇒ Chaîne de caractères String (vlax-vbString)
je conçois que ces notions soient nouvelles et déroutantes pour l'habitué de l'AutoLISP, mais il faut s'y faire, et on va s'y faire...
11 mai 2018, un peu de mise en forme le 25 avril 2020