AutoLISP : le guide complet — Chapitre 4 / 16

Les opérations mathématiques

Les opérations mathématiques sont parmi les premières choses qu'on utilise dans un langage de programmation. En AutoLISP, elles suivent la même syntaxe préfixée que toutes les autres fonctions — et elles réservent quelques particularités intéressantes.

Les quatre opérations de base

Addition : +

(+ 2 3)       ; → 5
(+ 10 20 30)  ; → 60 (on peut additionner plus de 2 nombres !)
(+ 1.5 2.3)   ; → 3.8

Un avantage de la notation préfixée : la fonction + accepte autant d'arguments que vous le souhaitez. Pas besoin d'écrire (+ (+ 10 20) 30) : un simple (+ 10 20 30) suffit.

Soustraction : -

(- 10 3)      ; → 7
(- 100 20 30) ; → 50 (100 - 20 - 30)
(- 5)         ; → -5 (avec un seul argument, retourne l'opposé)

Multiplication : *

(* 3 4)       ; → 12
(* 2 3 4)     ; → 24
(* 1.5 2)     ; → 3.0

Division : /

(/ 20 4)      ; → 5
(/ 7 2)       ; → 3 (division entière !)
(/ 7.0 2)     ; → 3.5 (division réelle)
(/ 7 2.0)     ; → 3.5 (division réelle aussi)

Calculs de division dans la ligne de commande AutoCAD

Attention : la division entière

C'est un piège classique en AutoLISP (et dans beaucoup d'autres langages). Quand les deux opérandes sont des entiers, la division retourne un entier — la partie décimale est tronquée :

(/ 7 2)     ; → 3 (et non 3.5 !)
(/ 1 3)     ; → 0 (et non 0.333... !)

Pour obtenir un résultat décimal, il suffit qu'au moins un des opérandes soit un nombre réel (avec un point décimal) :

(/ 7.0 2)   ; → 3.5
(/ 7 2.0)   ; → 3.5

Vous pouvez aussi utiliser la fonction float pour convertir un entier en réel :

(/ (float 7) 2)  ; → 3.5

Le reste de la division : rem

La fonction rem (remainder) retourne le reste de la division entière :

(rem 7 2)    ; → 1 (7 = 2×3 + 1)
(rem 10 3)   ; → 1 (10 = 3×3 + 1)
(rem 8 4)    ; → 0 (division exacte)

C'est utile pour vérifier si un nombre est pair :

(rem 6 2)    ; → 0 (pair)
(rem 7 2)    ; → 1 (impair)

Fonctions mathématiques avancées

AutoLISP propose de nombreuses fonctions mathématiques supplémentaires :

Valeur absolue : abs

(abs -5)     ; → 5
(abs 3)      ; → 3
(abs -3.14)  ; → 3.14

Puissance : expt

(expt 2 3)   ; → 8 (2³)
(expt 5 2)   ; → 25 (5²)
(expt 9 0.5) ; → 3.0 (racine carrée de 9)

Racine carrée : sqrt

(sqrt 16)    ; → 4.0
(sqrt 2)     ; → 1.41421

Minimum et maximum : min, max

(min 3 7 1 9)  ; → 1
(max 3 7 1 9)  ; → 9

Fonctions trigonométriques

AutoLISP travaille en radians, pas en degrés :

(sin 0)            ; → 0.0 (sinus)
(cos 0)            ; → 1.0 (cosinus)
(atan 1)           ; → 0.785398 (arc tangente, soit π/4)

Pour convertir des degrés en radians, utilisez cette formule :

;; Conversion de 90° en radians
(* (/ 90.0 180) pi)  ; → 1.5708 (π/2)

La constante pi est prédéfinie en AutoLISP et vaut environ 3.14159.

Logarithmes et exponentielle

(log 1)       ; → 0.0 (logarithme naturel)
(log 2.718)   ; → 0.999896
(exp 1)       ; → 2.71828 (e¹)
(exp 0)       ; → 1.0 (e⁰)

Conversions de types

Quand vous mélangez des entiers et des réels, il est parfois utile de convertir explicitement :

(float 5)    ; → 5.0 (entier → réel)
(fix 3.7)    ; → 3 (réel → entier, tronque la partie décimale)
(fix 3.2)    ; → 3
(fix -3.7)   ; → -3

La fonction fix tronque (elle ne fait pas d'arrondi). Pour arrondir au plus proche, vous pouvez combiner fix et + :

;; Arrondi au plus proche
(fix (+ 3.7 0.5))   ; → 4
(fix (+ 3.2 0.5))   ; → 3

Un exemple pratique : aire d'un cercle

Calculons l'aire d'un cercle de rayon 5 :

;; Aire = π × r²
(* pi (expt 5.0 2))  ; → 78.5398

Affichons le résultat dans une boîte de dialogue :

(alert
  (strcat "L'aire du cercle est : "
    (rtos (* pi (expt 5.0 2)) 2 2)
  )
)

Boite de message affichée par la commande

Décortiquons cette expression :

  1. (expt 5.0 2)25.0 (5²)
  2. (* pi 25.0)78.5398 (π × 25)
  3. (rtos 78.5398 2 2)"78.54" (convertit le nombre en chaîne avec 2 décimales)
  4. (strcat "L'aire du cercle est : " "78.54") → concatène les deux chaînes
  5. (alert ...) → affiche le résultat

La fonction rtos (real to string) et strcat (string concatenate) seront détaillées plus tard. Pour l'instant, retenez simplement qu'on peut combiner des calculs et de l'affichage en imbriquant les expressions.

Résumé

Fonction Description Exemple
+ Addition (+ 2 3)5
- Soustraction (- 10 3)7
* Multiplication (* 3 4)12
/ Division (/ 7.0 2)3.5
rem Reste (modulo) (rem 7 2)1
abs Valeur absolue (abs -5)5
expt Puissance (expt 2 3)8
sqrt Racine carrée (sqrt 16)4.0
min / max Minimum / Maximum (max 3 7)7
float Entier → Réel (float 5)5.0
fix Réel → Entier (fix 3.7)3

Dans le prochain chapitre, nous verrons comment stocker des valeurs dans des variables et manipuler les différents types de données d'AutoLISP.


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