La validation stricte des nombres (DISTOF vs ATOF) en AutoLISP

Beaucoup utilisent atof (Ascii TO Float) pour convertir du texte en nombre. C’est dangereux car (atof "bonjour") renvoie 0.0.

L’expert utilise distof. Si la conversion échoue, il renvoie nil. C’est le seul moyen de distinguer une erreur d’une vraie valeur 0.

;; Mauvaise pratique
(if (= (atof saisie) 0.0) ... ) ;; Est-ce 0 ou une erreur ? On ne sait pas.

;; Bonne pratique
(if (distof saisie)
    (alert "C'est un nombre valide")
    (alert "Ceci n'est pas un nombre !")
)

La fonction distof signifie DIStance TO Float.

C’est la version « intelligente » et « architecturale » de la conversion de texte en nombre. Contrairement à atof qui est une fonction mathématique brute (C standard), distof est une fonction purement AutoCAD® qui comprend les unités de dessin.

Voici pourquoi elle est indispensable.

1. La Syntaxe

(distof "chaine_texte" [mode])
  • « chaine_texte » : Le texte à convertir.

  • [mode] (Optionnel) : Un entier de 1 à 5 qui indique le format des unités (correspond à la variable système LUNITS).

2. Les deux super-pouvoirs de DISTOF

A. La validation d’entrée (Le retour nil)

C’est sa fonction principale pour un programmeur.

  • atof renvoie 0.0 si le texte n’est pas un nombre (ex: « Bonjour »). C’est dangereux car on ne sait pas si l’utilisateur a tapé « 0 » ou une bêtise.

  • distof renvoie nil si la conversion échoue.

(distof "12.5")   ; Renvoie 12.5
(distof "Bonjour") ; Renvoie nil (Erreur détectée !)

B. La compréhension des formats impériaux (Pieds et Pouces)

Si vous travaillez avec des dessins anglo-saxons ou architecturaux, atof est inutile car il ne comprend pas les symboles ' (pieds) et " (pouces). distof les calcule.

Exemple avec le mode 4 (Architectural) :

;; Convertit 1 pied et 6 pouces en unités décimales (18.0 pouces)
(distof "1'6\"" 4) ; Renvoie 18.0

3. Les Modes (Codes LUNITS)

Si vous ne spécifiez pas le mode, distof essaie d’interpréter le texte selon le réglage actuel du dessin. Pour forcer l’interprétation :

  • 1 : Scientifique (ex: « 1.55E+01 »)

  • 2 : Décimal (Le standard métrique)

  • 3 : Ingénierie (Pieds/Pouces décimaux)

  • 4 : Architectural (Pieds/Pouces fractionnaires ex: 1’-2 1/2")

  • 5 : Fractionnaire (ex: 12 1/2)

4. Exemple concret de validation

Voici comment on l’utilise typiquement pour vérifier une saisie utilisateur :

(defun c:TestSaisie (/ saisie val)
  (setq saisie (getstring "\nEntrez une largeur : "))
  
  (if (setq val (distof saisie 2)) ;; On tente la conversion en décimal
    (alert (strcat "Validé ! La valeur est : " (rtos val)))
    (alert "Erreur : Ce n'est pas un nombre valide.")
  )
  (princ)
)