L'AutoLISP est-il encore utile ?

Un titre en forme de gentille provocation… :blush: Mais surtout un clin d’œil :wink: à ces dizaines de milliers (millions?) d’AutoCADiens au cours des âges farouches qui ont écrit des routines LISP (de petits programmes utilitaires, pas de véritables applications), pour principalement palier au manque de fonctionnalités des AutoCAD® de l’époque.

Gageons que la plupart de ces routines n’ont plus leur utilité de nos jours parce qu’AutoCAD® a progressivement intégré ces fonctionnalités soit sous forme de commandes natives, soit d’Express Tools.

Voici un exemple que j’avais écrit en 1999 (je ne garanti pas son fonctionnement…):

;|
Programme :	SAME.LSP
Fonction :	Lance la commande qui a permis de créer l'objet sélectionné (Run the command which created the chosen object)
Auteur :	Patrick EMIN
Version : 	1.01 par Richard TRIBES
Date :		13/03/2000
Version 1.00 :	14/06/1999
|;

(defun c:SAME (/ entite data commande couleur type_ent calque typeligne textestyle cotstyle blocname type_cote largeur_poly country bylayer_property)
   (setvar "cmdecho" 0)
   (setq country (if (wcmatch (strcase (getvar "LOCALE")) "*FR*") 0 1));	0=francais 1=anglais
   (setq entite (car (entsel (if (= country 0) "\nSélectionner un objet :" "\nSelect an object:")))
      data (entget entite)
      type_ent (cdr (assoc 0 data))
      calque (cdr (assoc 8 data))
      couleur (cdr (assoc 62 data))
      typeligne (cdr (assoc 6 data))
      v_celtscale (cdr (assoc 48 data))
      textestyle (cdr (assoc 7 data))
      v_cotstyle (cdr (assoc 3 data))
      blocname (cdr (assoc 2 data))
      hauteur (cdr (assoc 40 data))
      largeur_poly (cdr (assoc 43 data))
      type_cote  (cdr (assoc 70 data))
      bylayer_property (if (= country 0) "BYLAYER" "BYLAYER")
   );end setq
      
   (setvar "CLAYER" calque)
   (if v_celtscale (setvar "CELTSCALE" v_celtscale) (setvar "CELTSCALE" 1))
   (if couleur (setvar "CECOLOR" (itoa couleur)) (setvar "CECOLOR" bylayer_property))
   (if v_celtscale (alert (if (= country 0) "Attention, la variable CELTSCALE a été modifié,\nremettez la à 1 après la fin de la commande" "Warning: CELTSCALE has been changed!")))
   (if typeligne (setvar "CELTYPE" typeligne) (setvar "CELTYPE" bylayer_property))
   
   (cond
      ((= type_ent "TEXT")
         (progn
            (setq commande "DTEXT")
            (setvar "TEXTSIZE" hauteur)
            (setvar "TEXTSTYLE" textestyle)
         );end progn
      );end cond=TEXT
      ((= type_ent "CIRCLE")
          (progn       
            (setvar "CIRCLERAD" hauteur)
            (setq commande "CIRCLE")
          );end progn
      );end cond=CIRCLE
      ((= type_ent "LWPOLYLINE")
            (progn
               (setq commande "PLINE")
               (setvar "PLINEWID" largeur_poly)
            );end progn
      );end cond=LWPOLYLINE
      ((= type_ent "DIMENSION")
         (progn
            (cond
               ((= (logand type_cote 5) 5) (setq commande "DIMANGULAR"))
               ((= (logand type_cote 4) 4) (setq commande "DIMRADIUS"))
               ((= (logand type_cote 3) 3) (setq commande "DIMDIAMETER"))
               ((= (logand type_cote 2) 2) (setq commande "DIMANGULAR"))
               ((= (logand type_cote 1) 1) (setq commande "DIMALIGNED"))
               ((= (logand type_cote 0) 0)  (setq commande "DIMLINEAR"))
            );end cond
         );end progn
      );end cond=DIMENSION
      ((= type_ent "HATCH")
         (progn
            (setvar "HPNAME" (cdr (assoc 2 data)))
            (if (cdr (assoc 52 data)) (setvar "HPANG" (cdr (assoc 52 data))))
            (if (cdr (assoc 77 data)) (setvar "HPDOUBLE" (cdr (assoc 77 data))))
            (if (cdr (assoc 41 data)) (setvar "HPSCALE" (cdr (assoc 41 data))))
            (if (cdr (assoc 41 data)) (setvar "HPSPACE" (cdr (assoc 41 data))))
            (setq commande "BHATCH")
         );end progn
      );end cond=HATCH
      (T (setq commande type_ent))
   );end cond
   (cond
      ((or (= type_ent "INSERT") (= type_ent "MINSERT")) (command "_INSERT" blocname))
      (T (command (getcname (strcat "_" commande))))
   );end cond
   
   (princ)
); end defun same
(princ)

Salut Patrick,

Effectivement, certaines routines ont pu tomber en désuétude au fil des ans pour les raisons citées. Mais AutoLISP demeure pleinement utiles malgré la disponibilité de langages plus modernes qu’on dit managés (DotNet), par exemple VB et C#. Ils se complémentent.

On a souvent tendance à croire avec DotNet que parce qu’on produit des DLL que notre code est en sécurité. Il n’y a rien de plus faux. On peut extraire le code natif, comme lorsque qu’on lit le JavaScript d’une page web.

Les fichiers à extensions FAS et VLX sont quant à eux pleinement sécuritaire, en plus de ne pas demander d’être recompilés en changeant de version d’AutoCAD®.

1 Like