VL - Types de données

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 i
l 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 i
l 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