AutoLISP : Valider strictement les nombres avec DISTOF plutôt qu'ATOF

En AutoLISP, j’ai besoin de convertir des chaînes de texte en nombres. Je cherche une méthode fiable pour valider les entrées utilisateur et distinguer une valeur zéro d’une erreur de saisie, surtout avec les formats architecturaux.

Pour une conversion robuste de texte en nombre en AutoLISP, la fonction DISTOF est la méthode privilégiée. Contrairement à ATOF, elle offre une validation stricte des entrées et comprend les formats d’unités spécifiques à AutoCAD, y compris les unités impériales.

Voici pourquoi et comment l’utiliser :

  1. Comprendre la limite d’ATOF :

    • La fonction ATOF (Ascii TO Float) est une fonction mathématique brute qui convertit une chaîne en nombre. Son principal défaut est qu’elle renvoie 0 si la conversion échoue (par exemple, si l’utilisateur saisit « Bonjour »). Il est donc impossible de distinguer une saisie valide de 0 d’une erreur de conversion.
  2. Les avantages de DISTOF :

    • Validation d’entrée stricte : DISTOF renvoie nil si la chaîne de texte n’est pas un nombre valide ou si la conversion échoue. Cela permet de détecter clairement les erreurs de saisie et de les différencier d’une valeur 0 légitime.
    • Compréhension des unités de dessin : DISTOF (DIS tance TO F loat) est une fonction spécifique à AutoCAD qui interprète les chaînes de texte en tenant compte des unités de dessin configurées. Elle est capable de comprendre les formats impériaux (pieds et pouces, par exemple 1'-2 1/2"), ce que ATOF ne fait pas.
  3. Syntaxe de DISTOF :

    • (DISTOF "chaine_texte" [mode])
      • "chaine_texte" : La chaîne de caractères à convertir en nombre.
      • [mode] : (Optionnel) Un entier de 1 à 5 qui indique le format des unités à utiliser pour l’interprétation. Ce mode correspond aux valeurs de la variable système LUNITS.
  4. Les modes de DISTOF (Codes LUNITS) :

    • Si le mode n’est pas spécifié, DISTOF utilise le réglage actuel du dessin.
    • 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)
  5. Exemple concret de validation d’une saisie utilisateur :

    • Pour vérifier si une saisie est un nombre valide, utilisez DISTOF et testez si le résultat est nil :
    (defun C:GETNUMVALID (/ user_input numeric_value)
      (setq user_input (getstring T "\nEntrez une valeur numérique (ex: 12.5 ou 1'-2 1/2\") : "))
      (setq numeric_value (distof user_input))
      (if numeric_value
        (progn
          (princ (strcat "\nValeur numérique valide : " (rtos numeric_value)))
          numeric_value ; Retourne la valeur numérique convertie
        )
        (progn
          (princ "\nErreur : La saisie n'est pas un nombre valide ou est vide.")
          nil ; Retourne nil en cas d'erreur
        )
      )
    )
    

    Cet exemple montre comment DISTOF permet de valider efficacement les entrées et de réagir en conséquence, assurant la robustesse de vos scripts AutoLISP.