AutoLISP : le guide complet — Chapitre 5 / 16

Variables et types de données

Jusqu'ici, nous avons calculé des résultats qui disparaissaient immédiatement après leur affichage. Pour écrire des programmes utiles, il faut pouvoir stocker des valeurs et les réutiliser. C'est le rôle des variables.

Créer une variable avec setq

En AutoLISP, on crée (ou modifie) une variable avec la fonction setq (set quote) :

(setq rayon 5)

Cette expression crée une variable nommée rayon et lui attribue la valeur 5. Vous pouvez ensuite utiliser cette variable dans d'autres expressions :

(setq rayon 5)
(* pi (expt rayon 2))  ; → 78.5398

Création de la variable rayon et utilisation dans un calcul

Affecter plusieurs variables en une seule fois

setq permet d'affecter plusieurs variables dans un seul appel :

(setq
  largeur 10
  hauteur 5
  profondeur 3
)

C'est équivalent à trois appels séparés, mais plus concis :

(setq largeur 10)
(setq hauteur 5)
(setq profondeur 3)

Le point d'exclamation !

Dans la ligne de commande d'AutoCAD, vous pouvez consulter la valeur d'une variable en la préfixant d'un point d'exclamation :

!rayon

AutoCAD affiche : 5

C'est très pratique pour le débogage. Notez que cette syntaxe avec ! est spécifique à la ligne de commande d'AutoCAD et ne fonctionne pas à l'intérieur d'un fichier .lsp.

Valeur de la variable rayon affichée par !rayon

Les noms de variables

Les noms de variables en AutoLISP peuvent contenir :

  • Des lettres (a-z, A-Z)
  • Des chiffres (0-9)
  • Des caractères spéciaux comme -, _, ?, !, *

Quelques conventions courantes :

(setq nombre-de-cotes 12)     ; Tirets pour séparer les mots
(setq point_depart '(0 0 0)) ; Underscores aussi acceptés
(setq estValide T)             ; camelCase utilisé parfois

Les noms de variables ne sont pas sensibles à la casse : Rayon, rayon et RAYON désignent la même variable.

Les types de données en détail

AutoLISP est un langage à typage dynamique : vous n'avez pas besoin de déclarer le type d'une variable. Le type est déterminé automatiquement par la valeur affectée.

Entiers (INT)

Les nombres entiers, positifs ou négatifs, sans point décimal :

(setq compteur 0)
(setq age 42)
(setq temperature -5)

Les entiers AutoLISP sont limités à la plage -2 147 483 648 à 2 147 483 647 (entiers signés 32 bits).

Vous pouvez vérifier le type d'une valeur avec la fonction type :

(type 42)    ; → INT

Réels (REAL)

Les nombres à virgule flottante :

(setq pi-approx 3.14159)
(setq tolerance 0.001)
(setq ratio -2.5)

Attention : utilisez toujours un point comme séparateur décimal, jamais une virgule.

(type 3.14)  ; → REAL

Chaînes de caractères (STR)

Du texte entouré de guillemets doubles :

(setq nom "AutoLISP")
(setq message "Bonjour le monde !")

Pour inclure un guillemet dans une chaîne, échappez-le avec un antislash :

(setq citation "Il a dit \"bonjour\"")

Caractères spéciaux dans les chaînes :

Séquence Signification
\n Retour à la ligne
\\ Antislash littéral
\" Guillemet littéral
\t Tabulation
(type "texte")  ; → STR

Opérations sur les chaînes

(strlen "Bonjour")              ; → 7 (longueur)
(strcat "Bon" "jour")           ; → "Bonjour" (concaténation)
(strcase "bonjour")             ; → "BONJOUR" (majuscules)
(strcase "BONJOUR" T)           ; → "bonjour" (minuscules)
(substr "Bonjour" 1 3)          ; → "Bon" (sous-chaîne)

Listes (LIST)

Les listes sont la structure de données fondamentale de LISP (c'est dans le nom !). Nous les étudierons en détail dans un chapitre dédié, mais voici un aperçu :

(setq point '(10.0 20.0 0.0))   ; Un point 3D
(setq couleurs '("rouge" "vert" "bleu"))

L'apostrophe ' devant la parenthèse empêche AutoLISP d'essayer d'évaluer la liste comme une expression. Nous reviendrons sur ce mécanisme essentiel.

(type '(1 2 3))  ; → LIST

nil et T

nil représente l'absence de valeur, le faux, ou une liste vide. T représente le vrai.

(setq resultat nil)
(setq estOuvert T)

Vérifier le type d'une valeur

La fonction type retourne le type d'une valeur :

(type 42)        ; → INT
(type 3.14)      ; → REAL
(type "texte")   ; → STR
(type '(1 2))    ; → LIST
(type nil)       ; → nil
(type T)         ; → SYM
(type +)         ; → SUBR (fonction native)

Appels à (type ...) dans la ligne de commande

Conversions entre types

AutoLISP propose des fonctions pour convertir d'un type à l'autre :

Conversion Fonction Exemple
Entier → Réel float (float 5)5.0
Réel → Entier fix (fix 3.7)3
Entier → Chaîne itoa (itoa 42)"42"
Chaîne → Entier atoi (atoi "42")42
Réel → Chaîne rtos (rtos 3.14 2 2)"3.14"
Chaîne → Réel atof (atof "3.14")3.14

Les noms de ces fonctions viennent du langage C :

  • itoa = integer to ASCII
  • atoi = ASCII to integer
  • atof = ASCII to float
  • rtos = real to string

La fonction rtos en détail

rtos est particulièrement utile, car elle permet de contrôler le format de sortie :

(rtos 3.14159 2 2)   ; → "3.14" (mode décimal, 2 décimales)
(rtos 3.14159 2 4)   ; → "3.1416" (mode décimal, 4 décimales)

Le deuxième argument est le mode (2 = décimal) et le troisième est la précision (nombre de décimales).

Les variables système d'AutoCAD

AutoLISP peut lire et modifier les variables système d'AutoCAD avec getvar et setvar :

(getvar "OSMODE")     ; Lit le mode d'accrochage aux objets
(setvar "OSMODE" 0)   ; Désactive les accrochages
(getvar "DWGNAME")    ; Nom du dessin courant

Un exemple pratique : calcul de volume

Calculons et affichons le volume d'un parallélépipède :

(setq
  longueur 10.0
  largeur 5.0
  hauteur 3.0
)

(setq volume (* longueur largeur hauteur))

(alert
  (strcat
    "Dimensions : "
    (rtos longueur 2 1) " x "
    (rtos largeur 2 1) " x "
    (rtos hauteur 2 1)
    "\nVolume : "
    (rtos volume 2 2)
    " unités³"
  )
)

Boite de dialogue affichant les dimensions et le volume

Résumé

Concept Syntaxe Exemple
Créer une variable setq (setq x 10)
Lire une variable Utiliser son nom (+ x 5)
Inspecter (ligne de commande) ! !x
Vérifier le type type (type x)INT
Entier → Réel float (float 5)5.0
Entier → Chaîne itoa (itoa 42)"42"
Réel → Chaîne rtos (rtos 3.14 2 2)"3.14"

Dans le prochain chapitre, nous allons apprendre à créer nos propres fonctions avec defun — c'est là que la programmation AutoLISP devient vraiment puissante.


Coup de pouce Besoin d'un développement AutoCAD (AutoLISP, ObjectARX, .NET, VBA) ? Contactez-moi pour un devis gratuit.