Pour un vétéran de l’AutoLISP classique (celui qui jongle avec entget, assoc, cons et les codes DXF), passer au Visual LISP (VL) représente un changement de paradigme majeur : on passe de la manipulation de listes de données à la Programmation Orientée Objet (POO).
Voici une explication détaillée conçue pour faire le pont entre vos connaissances actuelles et ce nouvel univers.
---1. L’Origine : De Vital LISP à Visual LISP
Historiquement, AutoLISP était un langage purement interprété et limité à l’environnement interne d’AutoCAD®. Dans les années 90, une société tierce (Basis Software) a créé « Vital LISP », un environnement de développement et un moteur plus puissant pour AutoLISP.
Autodesk® a été tellement impressionné qu’ils ont racheté le produit, l’ont renommé Visual LISP, et l’ont intégré nativement à partir d’AutoCAD® 2000. C’est pour cela que toutes les fonctions commencent par vl (pour Vital Lisp).
2. La différence fondamentale : DXF vs Objets (COM)
C’est le point le plus important à comprendre.
-
AutoLISP « Vanilla » (Classique) : Vous travaillez directement sur la base de données brute.
-
Analogie : C’est de la chirurgie. Pour changer la couleur d’une ligne, vous ouvrez le patient (
entget), vous trouvez l’organe code 62 (assoc), vous le remplacez (subst), et vous refermez le patient (entmod). -
Visual LISP (ActiveX/COM) : Vous communiquez avec des Objets.
-
Analogie : C’est comme utiliser une télécommande. L’objet « Ligne » possède une Propriété appelée « Color ». Vous dites simplement à l’objet : « Change ta propriété Color en Rouge ». L’objet s’occupe de la mise à jour de la base de données pour vous.
[!Note]
L’objet dans la « programmation orientée objet » est une manière d’organiser le code en regroupant ce qui est (données) avec ce qui agit (fonctions). Il peut représenter un objet du monde réel (une voiture, un chat). Il peut représenter un concept imaginaire ou technique (une connexion, une erreur, une session). L’objectif final n’est pas de copier la réalité, mais de rendre le code plus facile à gérer, à réutiliser et à comprendre pour les humains. En résumé, dans l’expression programmation orientée objet, le mot objet ne désigne pas nécessairement une représentation d’un objet du monde réel.
3. Le décodage des préfixes (« La soupe à l’alphabet »)
Visual LISP introduit plusieurs familles de fonctions. Voici comment les lire :
| Préfixe | Signification | Description |
|---|---|---|
vl- |
Visual Lisp | Fonctions génériques qui étendent le langage LISP lui-même (gestion de fichiers, registres, traitement de listes avancé). |
vla- |
Visual Lisp ActiveX | Fonctions qui manipulent les objets AutoCAD®. Ce sont des méthodes ou des propriétés (ex: vla-put-layer). |
vlax- |
Visual Lisp ActiveX Extensions | Fonctions pour gérer le moteur ActiveX lui-même (créer des objets, convertir des données, importer des applis externes). |
vlr- |
Visual Lisp Reactors | Fonctions pour créer des Réacteurs (gestionnaires d’événements). |
Note cruciale : Pour utiliser ces fonctions, vous devez toujours inclure
(vl-load-com)au début de votre script.
4. Ce que Visual LISP permet (et que l’AutoLISP ne peut pas faire)
Au-delà de la syntaxe, VL ouvre des portes qui étaient fermées à clé pour l’AutoLISP classique :
A. Accès aux applications externes (Excel, Word, Outlook)
Avec l’AutoLISP classique, écrire dans Excel nécessitait de générer des fichiers CSV. Avec Visual LISP, vous pouvez piloter Excel directement via COM (Component Object Model). Vous pouvez ouvrir une feuille, formater des cellules en gras, insérer des formules, le tout depuis AutoCAD®.
B. Les Réacteurs (Event Listeners)
En AutoLISP, un programme ne s’exécute que lorsque l’utilisateur tape une commande.
Avec les vlr-, vous pouvez déclencher du code quand un événement se produit, par exemple :
- Quand l’utilisateur change de dessin.
- Quand une entité est modifiée (ex: forcer un texte à se mettre à jour si la ligne qu’il décrit change de longueur).
- Avant ou après une commande AutoCAD®.
C. Accès aux objets « non-graphiques » profonds
Visual LISP permet de manipuler facilement les configurations de traceurs, les préférences de l’application (Options), ou les dictionnaires et Xrecords de manière plus structurée.
5. Exemples Concrets : Le Choc des Cultures
Pour bien comprendre, comparons le code pour une tâche simple : Changer le calque d’une entité.
Méthode 1 : AutoLISP Classique (La voie DXF)
(defun c:ChangeLayerDXF ( / ename elist oldLayer newLayer)
(setq ename (car (entsel "\nSélectionnez un objet : ")))
(if ename
(progn
(setq elist (entget ename)) ; Récupérer la liste DXF
(setq oldLayer (assoc 8 elist)) ; Trouver la paire pointée du calque
(setq newLayer (cons 8 "MUR")) ; Créer la nouvelle paire
(setq elist (subst newLayer oldLayer elist)) ; Remplacer dans la liste
(entmod elist) ; Mettre à jour la base de données
(entupd ename) ; Rafraîchir l'écran (parfois nécessaire)
)
)
(princ)
)
Méthode 2 : Visual LISP (La voie Objet)
(defun c:ChangeLayerVL ( / ename vla-obj)
(vl-load-com) ; Toujours charger les extensions
(setq ename (car (entsel "\nSélectionnez un objet : ")))
(if ename
(progn
;; Conversion de l'entité (ename) en Objet VLA
(setq vla-obj (vlax-ename->vla-object ename))
;; Modification directe de la propriété 'Layer'
(vla-put-Layer vla-obj "MUR")
;; Pas besoin de entmod ou entupd, l'objet est "vivant"
;; On peut aussi lire la propriété facilement :
;; (alert (vla-get-Layer vla-obj))
)
)
(princ)
)
Pourquoi la version VL est-elle souvent préférée par les experts ?
- Lisibilité :
vla-put-Layerest plus clair quesubst (cons 8 .... - Robustesse : Pas besoin de se soucier si le code DXF est 8, 6 ou 62. Vous appelez la propriété par son nom.
- Performance : Sur des milliers d’objets, les fonctions VLA sont souvent plus rapides que les manipulations de listes DXF géantes.
6. La contrainte : Les types de données (Variants & Safearrays)
C’est le seul point « douloureux » pour les habitués du LISP (qui est un langage faiblement typé).
ActiveX (technologie Microsoft) est très strict sur les types (Entier, Double, Chaîne).
- AutoLISP :
(setq a 10)ou(setq a "dix"). Il s’en fiche. - Visual LISP : Parfois, vous devrez convertir vos listes Lisp en « tableaux sécurisés » (
Safearrays) ou en « Variants » pour que les fonctionsvla-ouvlax-les acceptent.
Exemple : Pour définir un point en VL, on ne donne pas juste une liste '(0 0 0), on doit souvent la convertir en tableau de doubles (vlax-3d-point).
Résumé pour l’expert
Le Visual LISP n’est pas un nouveau langage, c’est une extension qui transforme AutoCAD® en serveur d’automatisation.
- Gardez l’AutoLISP classique pour les sélections simples (
ssget) et les petits scripts rapides. - Passez au Visual LISP dès que vous devez modifier beaucoup de propriétés, interagir avec l’interface Windows, utiliser Excel/Word, ou créer des réacteurs automatiques.
Voici une FAQ structurée pour répondre précisément à vos interrogations sur la pratique du Visual Lisp.
FAQ : Passer à Visual Lisp (VL)
1. Comment puis-je programmer en Visual Lisp ?
C’est beaucoup plus simple que vous ne le pensez, car vous avez déjà tout ce qu’il faut.
- L’environnement : Visual Lisp n’est pas un logiciel à installer. Il est intégré nativement dans AutoCAD®.
- L’éditeur : Vous pouvez utiliser l’éditeur historique (commande
VLIDEouVLISPsur les anciennes versions) ou, sur les versions récentes (2021+), l’extension officielle Autodesk® pour VS Code. - La clé de démarrage : Pour utiliser les fonctions VL, vous devez simplement ajouter cette ligne au tout début de votre code :
(vl-load-com)
Cela charge les bibliothèques d’extensions ActiveX qui ne sont pas chargées par défaut pour économiser de la mémoire.
2. Visual Lisp est-il réservé aux programmeurs expérimentés ?
Oui et non.
- Non, car la syntaxe reste du LISP (parenthèses, logique).
- Oui, dans le sens où il demande une compréhension de la structure « Objet » d’AutoCAD®. Au lieu de penser « Liste de données » (DXF), vous devez penser « Hiérarchie d’objets » (L’Application > Le Document > L’Espace Objet > La Ligne > La Propriété Couleur).
- Conseil : Si vous maîtrisez déjà
car,cdretforeach, vous avez les bases logiques suffisantes. Le reste n’est que de l’apprentissage de vocabulaire (le nom des propriétés).
3. Peut-on mélanger de l’AutoLISP avec du Visual Lisp ?
Absolument, et c’est même recommandé ! C’est la grande force de ce langage.
Les meilleurs programmes sont souvent des hybrides :
- On utilise AutoLISP pour l’interaction utilisateur et la sélection (car
ssgetetgetpointsont imbattables en efficacité). - On convertit les entités sélectionnées en objets Visual Lisp.
- On utilise Visual Lisp pour modifier les propriétés ou faire des calculs complexes.
- Exemple : Sélectionner avec
(ssget)→ Convertir en VLA-Object → Changer la couleur avec(vla-put-color).
4. Puis-je programmer en Visual Lisp avec AutoCAD LT® ?
En grande partie, Non.
C’est une nuance importante :
- Depuis la version 2024, AutoCAD LT® supporte enfin l’AutoLISP.
- Cependant, AutoCAD LT® ne supporte pas les fonctions
vla-etvlax-(ActiveX/COM). Ces fonctions dépendent d’une technologie d’automatisation bridée dans la version LT. - Verdict : Si votre script contient
(vl-load-com)et des fonctions manipulant des objets VLA, il ne fonctionnera pas sur LT.
5. Puis-je programmer en Visual Lisp sur Macintosh ?
Attention, c’est un piège.
- Les fonctions génériques
(vl-...)(commevl-file-copyou manipulation de listes) fonctionnent généralement sur Mac. - Les fonctions ActiveX
(vla-...)et(vlax-...)ne fonctionnent pas sur Mac. - Pourquoi ? Visual Lisp (la partie Objet) repose sur la technologie COM (Component Object Model), qui est une technologie exclusive à Microsoft Windows. Sur Mac, il faut passer par d’autres méthodes (souvent revenir au DXF classique) pour être compatible.
6. L’exécution d’un programme en Visual Lisp est-elle plus rapide que l’exécution d’un programme en AutoLISP ?
Oui, dans la majorité des cas.
- Modification : VL est plus rapide car il communique directement avec l’objet en mémoire. AutoLISP (DXF) oblige AutoCAD® à reconstruire des listes, chercher des codes, substituer et régénérer l’entité.
- Lecture : Lire une propriété (ex: le nom d’un calque) est quasi instantané en VL (
vla-get-layer). En DXF, il faut extraire toute la liste de définition de l’objet juste pour trouver un élément. - Grands ensembles : Sur des traitements de milliers d’objets (ex: remettre à 0 l’élévation de tout un plan), Visual Lisp est nettement plus performant.
[!Note] Citation du guide du développeur ActiveX Autodesk®
Dans de nombreux cas, ActiveX fonctionne plus rapidement que les fonctions AutoLISP traditionnelles pour manipuler les objets de dessin AutoCAD®. L’interface de programmation ActiveX est utilisable dans plusieurs langages et environnements. Lorsque vous travaillez avec des objets ActiveX dans AutoLISP, vous utilisez le même modèle d’objet, les mêmes propriétés et les mêmes méthodes que ceux qui peuvent être manipulés à partir d’autres environnements de programmation.
