Auto Lisp
Auto Lisp
Auto Lisp
Programmation d'AutoCAD®
Commentez
Introduction à AutoLISP® par Gilles Chanteau
I - Généralités.............................................................................................................................................................. 4
I-A - Types d'expressions, types de données........................................................................................................4
I-A-1 - Les atomes............................................................................................................................................ 4
I-A-2 - Les listes................................................................................................................................................4
I-A-3 - nil........................................................................................................................................................... 4
I-B - Syntaxe et évaluation (quote type)................................................................................................................ 5
I-B-1 - Évaluation des applications de fonction................................................................................................5
I-B-2 - Données sous forme de listes (quote).................................................................................................. 6
I-B-3 - Fonction type......................................................................................................................................... 7
II - Saisie directe..........................................................................................................................................................7
II-A - Opérateurs arithmétiques (+ - * / sqrt rem expt exp log)..............................................................................7
II-A-1 - Opérateurs logiques binaires (Boole logand logior)............................................................................. 8
II-B - Variables (setq eval set)............................................................................................................................... 9
II-B-1 - Fonction setq........................................................................................................................................ 9
II-B-2 - Fonction eval...................................................................................................................................... 10
II-B-3 - Fonction set........................................................................................................................................ 10
III - Programmes........................................................................................................................................................ 11
III-A - Chargement de fichiers (load appload)..................................................................................................... 11
III-A-1 - Fonction load..................................................................................................................................... 11
III-A-2 - Commande charger une application (APPLOAD)............................................................................. 11
III-A-3 - Cliquer/déposer..................................................................................................................................12
III-B - Chargement automatique (autoload S::STARTUP)................................................................................... 12
III-B-1 - Fonction autoload.............................................................................................................................. 13
III-B-2 - Fonction S::STARTUP....................................................................................................................... 13
IV - Éditeur Visual LISP®.......................................................................................................................................... 13
IV-A - Présentation............................................................................................................................................... 13
IV-B - Les fenêtres............................................................................................................................................... 14
IV-C - Mise en forme........................................................................................................................................... 14
IV-D - Sélection par double clic........................................................................................................................... 15
IV-E - Aperçu des fonctions de débogage...........................................................................................................16
V - Commandes AutoCAD® (command pause vl-cmdf)...........................................................................................16
VI - Définitions de fonctions (defun defun-q)............................................................................................................ 18
VI-A - (defun c:symbole …) vs (defun symbole …).............................................................................................18
VII - Entrées utilisateur (getint getreal getstring getkword getangle getcorner getdist getorient getpoint)................ 19
VII-A - Initialisation (initget).................................................................................................................................. 20
VII-B - Boites de dialogue (getfiled acad_colordlg acad_truecolordlg)................................................................ 21
VIII - Listes et points................................................................................................................................................. 21
VIII-A - Construction des listes (quote list cons)................................................................................................. 21
VIII-B - Accès aux éléments (car cdr last nth member vl-position)..................................................................... 22
VIII-C - Manipulation des listes (append reverse subst vl-remove)..................................................................... 23
VIII-D - Listes d'association et paires pointées (assoc).......................................................................................23
IX - Variables système (getvar setvar)...................................................................................................................... 24
IX-A - Variables d'environnement (getenv setenv)...............................................................................................24
X - Fonctions géométriques (distance angle polar inters sin cos atan trans)........................................................... 24
XI - Affichage de texte (prompt prin1 princ print alert textscr graphscr)................................................................... 26
XII - Décisions conditionnelles (if cond progn)..........................................................................................................27
XII-A - Comparaisons (= /= < > eq equal zerop minusp wcmatch)..................................................................... 27
XII-B - Opérateurs logiques (and or not)............................................................................................................. 29
XII-C - Types de données (atom listp null vl-consp numberp)............................................................................ 29
XIII - Procédures itératives et récursives.................................................................................................................. 29
XIII-A - Boucles et incrémentation (repeat while 1+ 1-)...................................................................................... 30
XIII-B - Traitements de listes (foreach mapcar lambda apply vl-every vl-some vl-member-if(-not) vl-remove-if(-
not) vl-sort)............................................................................................................................................................30
XIII-C - Fonctions récursives................................................................................................................................32
XIV - Chaînes de caractères et fichiers ASCII..........................................................................................................34
XIV-A - Chaînes de caractères (strcat strlen strcase substr vl-string* read)....................................................... 34
XIV-B - Conversions (itoa atoi rtos atof distof angtos angtof ascii chr vl-string->list vl-list->string float fix
cvunit)....................................................................................................................................................................35
-2-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
XIV-C - Fichiers ASCII (findfile open close read-char read-line write-char write-line)......................................... 36
XV - Gestion des erreurs (*error* vl-catch-all-apply …)............................................................................................37
XVI - Accès aux objets du dessin............................................................................................................................. 39
XVI-A - Entité unique........................................................................................................................................... 39
XVI-B - Données DXF des objets (entget entmake entmakex entmod entupd).................................................. 40
XVI-C - Jeu de sélection (ssget ssadd ssdel sslength ssmemb ssname ssnamex ssgetfirst sssetfirst).............. 42
XVI-D - Filtre de sélection....................................................................................................................................44
XVI-E - Tables (tblnext tblsearch tblobjname)..................................................................................................... 45
XVI-F - Données étendues, dictionnaires (regapp, xdroom, xdsize, dictnext dictsearch dictadd dictremove
dictrename namedobjdict).................................................................................................................................... 46
XVI-F-1 - Données étendues.......................................................................................................................... 46
XVI-F-2 - Dictionnaires....................................................................................................................................47
Remerciements.......................................................................................................................................................... 48
-3-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
I - Généralités
Inventé par John McCarthy en 1958 au Massachusetts Institute of Technology, le LISP, acronyme de List Processing
est le deuxième plus vieux langage de programmation. Langage de haut niveau, il est généralement classé parmi
les langages fonctionnels. Il a été très en vogue dans les années 1970/80 dans les domaines de la recherche et
de l'intelligence artificielle.
AutoLISP® est un dialecte du LISP spécialement implémenté pour fonctionner avec AutoCAD®.
Tout ce qui n'est pas une liste est un atome (excepté nil).
• les nombres entiers, sans séparateur décimal : 1, -27, 23504… (compris entre -2147483648 et 2147483647)
• les nombres réels, avec séparateur décimal, 1.0, 0.05, 3.375…
• les chaînes, ensembles de caractères contenus entre des guillemets : "a", "Le résultat est : 128.5".
• les symboles, qui sont des suites de caractères (exceptés parenthèses, guillemets, apostrophes, points et
points virgules) non exclusivement constituées de chiffres.
Les symboles peuvent être affectés à des fonctions (prédéfinies ou définies par l'utilisateur), ou à des données,
dans ce cas, on parle de variables, les données stockées dans les variables peuvent être des expressions LISP et
aussi des pointeurs vers des objets spécifiques (jeux de sélection, noms d'entités, descripteurs de fichiers…).
Certains symboles sont protégés, outre les fonctions LISP prédéfinies, il s'agit de T et pi.
Une liste commence avec une parenthèse ouvrante et se termine avec une parenthèse fermante, entre ces
parenthèses, chaque élément est séparé par une espace. Les éléments constituant les listes sont des expressions
LISP de tout type y compris des listes. Ces imbrications multiples expliquent la multiplication des parenthèses
caractéristique à ce langage.
Un programme LISP est une liste d'expressions qui peuvent être elles-mêmes des listes. Ce qui fait dire que LISP
est défini récursivement.
I-A-3 - nil
nil est une expression atypique en ce sens qu'elle exprime plusieurs concepts.
-4-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Elle exprime la notion de vide : un symbole auquel aucune valeur n'est affectée est nil, une liste qui ne contient
aucun élément est nil aussi.
nil sert aussi pour exprimer le résultat Booléen faux (false) opposé à T vrai (true).
Bien que son type soit nil, elle est considérée à la fois comme un atome et comme une liste.
Un programme LISP (langage dit « fonctionnel ») est essentiellement constitué d'appels de fonction.
Une fonction, en informatique comme en mathématique est un ensemble d'instructions qui retourne un résultat
dépendant des arguments (paramètres) qui lui sont passés, les mêmes arguments passés à une fonction retournent
toujours le même résultat.
Une expression LISP retourne toujours un résultat (fût-il nil), il n'existe pas en LISP d'instruction qui ne retourne rien.
Le résultat de l'évaluation d'un appel de fonction est retourné à l'endroit même de cet appel.
La programmation LISP consiste à définir de nouvelles fonctions en utilisant les fonctions préexistantes, qu'elles
soient natives ou définies par l'utilisateur.
Les expressions de type liste destinées à être évaluées sont appelées des appels de fonction (ou applications
de fonction).
La Notation dite « préfixe » du LISP en détermine la structure : le premier élément est une fonction (opérateur), les
suivants les arguments requis par cette fonction.
Suivant les fonctions les arguments peuvent être optionnels et leur nombre variable.
Commande: (+ 2 3)
5
L'évaluation d'une expression LISP commence par le contrôle de l'appariement des parenthèses.
Commande: (+ 2 3))
; erreur: parenthèse fermante supplémentaire en entrée
S'il manque une (ou des) parenthèse(s) fermantes, il est demandé à l'utilisateur de corriger :
Commande: (+ 2 3
(_>
-5-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Commande: (+ 2 3
(_> )
5
Ensuite l'interpréteur recherche la définition de la fonction (premier terme de la liste). Si cette définition n'est pas
trouvée, un message d'erreur est retourné :
Commande: (toto)
; erreur: no function definition: TOTO
Si la fonction est définie, la validité de chaque argument (termes suivants) est évaluée, au premier argument incorrect
trouvé, un message d'erreur est retourné :
Les arguments pouvant être aussi des applications de fonction, celles-ci seront évaluées tour à tour et les résultats
retournés à l'endroit même de chaque expression.
L'évaluation procède de façon récursive en réduisant chaque appel de fonction à une expression autoévaluante à
partir des expressions les plus imbriquées.
Saisie : (* 4 4)
Résultat : 16
Saisie : (* 3 3)
Résultat : 9
Saisie : (+ 16 9)
Résultat : 25
Saisie : (SQRT 25)
Résultat : 5.0
AutoLISP® intègre de nombreuses fonctions qui requièrent comme argument une (ou des) liste(s), voir chapitre 8.
Ce type de liste est considéré comme une donnée unique, par exemple, un point se définit comme la liste de ses
coordonnées (x y [z]).
Ces listes n'étant pas des applications de fonction, il faut empêcher leur évaluation.
On utilise pour cela la fonction quote.
(quote expression)
-6-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
La fonction type retourne le type de donnée de l'expression qui lui est passée comme argument.
II - Saisie directe
Les expressions LISP pouvant être entrées directement à la ligne de commande, toute expression qui débute par
une parenthèse est interprétée comme une expression LISP.
Il est donc possible d'utiliser AutoLISP® comme une calculatrice, directement à la ligne de commande, avec les
opérateurs numériques.
Ces expressions peuvent être utilisées pour répondre à une invite dans une commande.
Les fonctions +, -, *, /, rem et expt retournent un entier si tous leurs arguments sont entiers,
un réel si au moins un des arguments est réel.
(+ 3 4 2) retourne : 9
(+ 5 9.0) retourne : 14.0
-7-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
(- 9 4 2) retourne : 3
(- 5.2 6) retourne : -0.8
(/ 20 3) retourne : 6
(/ 20.0 3) retourne : 6.66667
(rem 20 3) retourne : 2
(rem 55 7 3) => (rem (rem 55 7) 3) => (rem 6 3) retourne : 0
C'est l'opérateur générique de comparaison « bit à bit ». Il requiert au moins deux arguments mais est généralement
utilisé avec trois : un entier définissant l'opérateur et deux entiers à comparer.
L'argument operateur est un entier de 0 à 15 représentant une des seize fonctions booléennes possibles avec deux
variables.
Les arguments int1 et int2 sont comparés bit à bit (logiquement) sur la base de la « table de vérité » ci-dessous en
fonction des combinaisons de bit d'opérateur.
Si le résultat de la comparaison est VRAI, la valeur décimale du bit est ajoutée au résultat retourné.
-8-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Table de vérité
bit opérateur int1 int2
1 1 1
2 1 0
4 0 1
8 0 0
Les fonctions logand et logior acceptent un nombre indéterminé de nombres entiers comme arguments et retournent
respectivement le AND et le OR logique d'une comparaison bit à bit de ces entiers.
(logand 2 7) retourne : 2
(logior 3 5) retourne : 7
Il est possible de stocker des données (résultat d'expression) dans des symboles ; la variable ainsi définie conserve
sa valeur dans le dessin pendant toute la session tant qu'elle n'est pas redéfinie.
La fonction setq sert à définir des variables en affectant à un symbole (premier argument), une expression (second
argument).
Il est possible dans la même expression de faire passer plusieurs paires d'arguments. L'expression retourne le résultat
de la dernière expression.
Pour faire afficher la valeur d'une variable à la ligne de commande, il suffit d'entrer le nom de la variable précédé
d'un point d'exclamation (!).
Commande: !a
10
Commande: !b
0.333333
La valeur stockée dans la variable pourra être réutilisée pour répondre à l'invite d'une commande ou dans une autre
expression.
Commande: cercle
Spécifiez le centre du cercle ou [3P/2P/Ttr (tangente tangente rayon)]: 10,20
-9-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Commande: (* 2 pi a)
62.8319
(eval expr)
La fonction eval retourne le résultat de l'évaluation de l'expression qui lui est passée comme argument.
Commande: (eval c)
10
Commande: (eval d)
100
(eval d)
=> (eval '(* A A))
=> (eval (quote (* 10 10)))
=> (* 10 10)
=> 100
La fonction set est équivalente à la fonction setq à ceci près qu'elle évalue les deux arguments qui lui sont passés.
On peut l'employer à la place de setq à condition de « quoter » le symbole.
Commande: !c
A
Commande: !a
"test"
Commande: !b
10
La fonction set est surtout utilisée associée à la fonction read (voir chapitre 14.1).
Commande: !d
2.5
- 10 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
III - Programmes
Pour éviter de saisir les expressions une à une, on préfèrera les regrouper dans un programme.
Un programme AutoLISP® est un fichier ASCII (fichier texte) avec l'extension .lsp. Il peut être écrit dans un éditeur de
texte tel que le bloc-notes. Il est préférable de ne pas utiliser de traitement de textes trop sophistiqué tel que Word®
qui ajoute des caractères de mise en page. Il existe de nombreux éditeurs plus ou moins spécialisés dans l'édition
de programmes, AutoCAD® intègre l'éditeur Visual LISP® (voir chapitre 4).
Comme dit plus haut, un programme LISP peut être directement collé sur la ligne de commande, la validation entraîne
son chargement dans le dessin.
La fonction LISP load permet de charger un fichier LISP (extension .lsp) dans le dessin courant.
Si le fichier est dans un répertoire du chemin de recherche des fichiers de support (menu Outils > Options… > onglet
Fichiers), il n'est pas nécessaire d'entrer le chemin complet du fichier, le nom sans l'extension suffit :
La commande AutoCAD® pour charger un fichier LISP se nomme APPLOAD, accessible aussi par le menu Outils
> Charger une application…
Si le fichier est dans un répertoire du chemin de recherche des fichiers de support (menu Outils > Options… > onglet
Fichiers), il n'est pas nécessaire d'entrer le chemin complet du fichier, le nom sans l'extension suffit.
Pour que le fichier soit chargé automatiquement à chaque démarrage d'AutoCAD® ou ouverture d'un dessin, il suffit
de l'ajouter à la liste dans la boite de dialogue Contenu… (valise).
- 11 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
III-A-3 - Cliquer/déposer
Il est aussi possible de charger un fichier LISP dans le dessin courant en effectuant un « cliquer/déposer » depuis
l'explorateur Windows ou le bureau dans la fenêtre d'AutoCAD®.
Trois fichiers définis par l'utilisateur : acad.lsp, acaddoc.lsp et le fichier MNL du même nom que le fichier de
personnalisation courant (.CUI ou .MNS), sont chargés automatiquement par AutoCAD®.
Ces fichiers peuvent contenir des expressions LISP : routines et expressions de chargement de fichiers LISP. Ces
expressions peuvent utiliser les fonctions load (voir ci-dessus) ou autoload.
Les fichiers acad.lsp et acaddoc.lsp ou MNL autre que acad.mnl n'existent pas par défaut, il appartient à l'utilisateur
de les créer dans un répertoire du chemin de recherche.
Au démarrage d'une session, AutoCAD® cherche un fichier acad.lsp et l'exécute s'il le trouve.
Ce comportement est celui par défaut et peut être modifié avec la variable système ACADLSPASDOC.
Au chargement de chaque fichier de personnalisation (CUI ou MNS) AutoCAD® recherche un fichier MNL de même
nom et l'exécute s'il le trouve. Le fichier MNL est exécuté après le fichier acaddoc.lsp. On place dans ce fichier les
expressions et routines LISP nécessaires à ce fichier de personnalisation.
- 12 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Par ailleurs, AutoCAD® fournit deux fichiers : acad20XX.lsp et acad20XXdoc.lsp ayant le même comportement
que les fichiers décrits ci-dessus. Ces fichiers contiennent des instructions LISP nécessaires au fonctionnement
d'AutoCAD®. Il convient de ne pas modifier ces fichiers.
Pour de plus amples renseignements sur l'utilisation de ces fichiers, voir dans l'aide : Guide de personnalisation >
Introduction aux interfaces de programmation > AutoLISP® et Visual LISP® > Chargement et exécution automatique
des routines AutoLISP®.
La fonction autoload permet de charger un fichier LISP seulement quand un appel à une commande définie dans
le fichier est exécuté.
Si les commandes cmd1 cmd2 sont définies dans toto.lsp, l'expression suivante dans un fichier de chargement
automatique entraînera le chargement de toto.lsp au premier appel de cmd1 ou cmd2.
Les fichiers de démarrage acad.lsp, acaddoc.lsp et MNL sont chargés avant que le dessin ne soit complètement
initialisé. Ils ne peuvent donc contenir d'expressions utilisant la fonction command (qui n'est opérationnelle qu'après
initialisation.
Il est possible d'inclure dans un des fichiers de démarrage une fonction S::STARTUP qui ne sera exécutée qu'après
l'initialisation du dessin.
Généralement la fonction S::STARTUP est définie avec la fonction defun-q. Ceci permet de l'amender facilement
avec append.
(defun-q zext ()
(command "_zoom" "_extent")
(princ)
)
(setq S::STARTUP (append S::STARTUP zext))
Si aucune fonction S::STARTUP n'existe, elle est créée avec le contenu de zext.
S'il existait déjà une fonction S::STARTUP, le contenu de zext lui est ajouté.
S'il est possible d'entrer des expressions LISP à la ligne de commande, et d'écrire le code de routines dans un
éditeur de texte type bloc-notes, AutoCAD® fournit un éditeur de LISP, puissant outil de création et de modification
de routines LISP.
IV-A - Présentation
On accède à l'éditeur Visual LISP® depuis AutoCAD®, par le menu Outils > AutoLISP® > Editeur Visual LISP® ou
par les commandes VLIDE ou VLISP.
On retrouve dans l'éditeur Visual LISP® les outils communs à tous les éditeurs de texte : Nouveau (Ctrl-N), Ouvrir
(Ctrl-O), Enregistrer (Ctrl-S), Imprimer (Ctrl-P), Couper (Ctrl-X), Copier (Ctrl-C), Coller (Ctrl-V), Rechercher (Ctrl-F),
Remplacer (Ctrl-H).
- 13 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Il est aussi doté d'outils spécifiques pour faciliter la mise en forme, charger et évaluer des expressions ou des routines,
ainsi que d'outils de débogage.
Comme dans n'importe quel éditeur, il est possible d'ouvrir des fichiers existants (Ctrl-O), ou des nouvelles fenêtres
(Ctrl-N).
La console Visual LISP® (F6) est une fenêtre spéciale de l'éditeur dans laquelle on peut évaluer directement des
expressions ou des symboles. C'est aussi dans la console que sont retournés les résultats des évaluations faites
depuis les autres fenêtres avec Charger la sélection (Ctrl-Maj-E).
Pour une meilleure lisibilité du code, les données apparaissent de différentes couleurs suivant leur type et le code
est mis en forme.
- 14 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Le formatage du code (paramétrable) consiste principalement à donner un retrait à chaque ligne correspondant à
l'imbrication de la ligne au sein des parenthèses (indentation). On peut formater toute la fenêtre (Ctrl-Alt-F) ou une
sélection (Ctrl-Maj-F).
Sur une ligne, tout ce qui est derrière un point-virgule n'est pas interprété, c'est un commentaire.
Suivant le nombre de points-virgules devant la ligne de commentaire, le formatage du code dans l'éditeur Visual
LISP® placera différemment la ligne de commentaire :
- 15 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Un symbole (variable) ou une expression sélectionnée dans une fenêtre peut être évalué directement (Ctrl-Maj-E),
le résultat est retourné dans la console.
Si après avoir sélectionné le symbole d'une fonction prédéfinie (bleu), on clique sur l'icône de l'aide [?] (Ctrl-F1), l'aide
s'ouvre directement à la page de cette fonction.
Pour suivre le déroulement de l'interprétation des expressions pendant l'exécution d'une routine, il est possible de
placer un, ou plusieurs, points d'arrêt dans le code.
À tout moment, il est possible d'utiliser la console pour évaluer des variables ou des expressions.
Si le déroulement d'une routine génère une erreur, on peut déterminer l'expression en cause en activant Arrêt
sur erreur (Menu Débogage), puis en utilisant l'outil : Source de la dernière interruption (Ctrl-F9). Une fois l'erreur
localisée, on doit Réinitialiser (Ctrl-Q).
- 16 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
La fonction command permet d'appeler depuis une expression LISP les commandes natives d'AutoCAD®. Les
arguments pour la fonction command sont le nom de la commande suivi des options et entrées nécessaires à son
exécution.
Pour les commandes ayant une version « ligne de commande » et une version « boîte de dialogue », c'est la première
qui est utilisée par défaut. Pour forcer l'ouverture de la boite de dialogue, il faut faire précéder l'appel à command
par l'expression : (initdia)
pause utilisé comme argument interrompt l'exécution pour permettre une entrée par l'utilisateur.
Lorsque l'argument requis pour la fonction command est un nombre, il peut être spécifié indifféremment sous la
forme d'un entier, d'un réel ou d'une chaîne de caractères.
Plusieurs commandes AutoCAD® peuvent être appelées successivement dans la même expression, exemple pour
dessiner un point en 0,0 et un cercle de centre 0,0 et de rayon 10.0 :
(command "_point" '(0.0 0.0 0.0) "_circle" '(0.0 0.0 0.0) 10.0)
De même que l'appel à une commande peut être décomposé en plusieurs expressions, ceci sert, par exemple à faire
passer une liste de points (pt_lst) comme argument :
(command "_pline")
(foreach p pt_lst (command p))
(command "")
Ou encore, pour laisser la main à l'utilisateur tant que la commande est active :
(command "_line")
(while (not (zerop (getvar "CMDACTIVE")))
(command pause)
)
Les fonctions foreach, while, not, zerop, getvar sont expliquées plus loin.
Il est important de noter que lors de l'exécution de la fonction command, les accrochages aux objets permanents sont
actifs. Il est donc prudent de les désactiver temporairement pour s'assurer que les entités seront créées précisément
sur les points spécifiés. Une méthode consiste à utiliser l'option "auc" ou de préférence "non" avant de spécifier le
point pour forcer l'accrochage à "aucun".
Par ailleurs, les paramètres requis par la fonction command sont les mêmes que ceux entrés à la ligne de commande :
les points sont exprimés en coordonnées SCU courant, les angles dans le système d'unité courant, etc.
La fonction vl-cmdf s'utilise comme command, mais évalue les arguments avant d'exécuter la commande.
Si command retourne toujours nil, vl-cmdf retourne T si tous les arguments sont valides, nil sinon.
- 17 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Pour une meilleure compatibilité entre les différentes versions d'AutoCAD®, il est préférable
d'utiliser, pour les noms de commande et leurs options, les noms en langage international. Ces
noms sont précédés d'un tiret bas (underscore). La fonction AutoLISP® getcname traduit les
noms de commande exprimés dans la langue de la version courante en langage international
et vice-versa :
Le premier argument est un symbole décrivant le nom de la fonction, le second une expression contenant les
arguments requis par la fonction et les variables locales (arguments et variables sont séparés par une barre oblique
(/)).
Si la fonction ne requiert ni argument ni variable, l'expression doit quand même être présente : liste vide ().
En faisant précéder le nom de la fonction par c: la fonction est définie comme une commande AutoCAD® qu'il sera
possible de lancer depuis la ligne de commande (ou d'un menu) en tapant directement le nom de la fonction. Dans
l'autre cas, la fonction ne peut être lancée que dans une expression AutoLISP®. C'est l'équivalent d'une nouvelle
fonction LISP utilisable comme les fonctions prédéfinies.
arg1 et arg2 sont les arguments (non optionnels) de Fonction, ils doivent être spécifiés conformément aux besoins
de Fonction.
var1 et var2 sont des variables définies dans Fonction (avec setq par exemple).
Si elles sont déclarées, comme dans l'exemple, on les appelle des variables locales.
Les valeurs qui leur sont affectées dans Fonction ne le seront que pendant la durée de son exécution, elles
reprendront ensuite la valeur qu'elles avaient avant l'appel à Fonction (nil ou autre).
Si au sein de Fonction, une valeur est attribuée à var3 avec setq, et qu'elle n'a pas été déclarée, on l'appelle variable
globale, elle conserve sa valeur dans le dessin pendant toute la session.
Il peut être intéressant de conserver une valeur dans une variable globale pour la récupérer lors d'une autre exécution
de routine, dans ce cas, une convention consiste à écrire le nom de la variable entre astérisques, il est aussi prudent
de choisir un nom qui a peu de chance d'être utilisé par une autre fonction :
- 18 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
*Fonction1_var3*
Cette fonction est conservée surtout pour assurer la compatibilité avec les versions antérieures.
Si la syntaxe est la même qu'avec la fonction defun, la différence est le type de donnée retournée.
defun crée des objets de type USUBR quand defun-q retourne une liste.
Ceci peut présenter un intérêt dans certains cas (fort peu nombreux, en fait). La structure de la fonction étant une
liste, elle peut aisément être redéfinie « programmatiquement » avec les fonctions de manipulation des listes.
AutoLISP® offre aussi la possibilité de définir des fonctions anonymes. L'utilisation de lambda est expliquée au
chapitre 13.2.
VII - Entrées utilisateur (getint getreal getstring getkword getangle getcorner getdist getorient
getpoint)
De nombreuses fonctions permettent de suspendre l'exécution du programme afin que l'utilisateur puisse entrer une
donnée. Le nom de ces fonctions commence par « get ».
Toutes ces fonctions acceptent un argument (optionnel) : une chaîne qui correspond à l'invite qui sera affichée en
ligne de commande.
getstring accepte un autre argument (optionnel) : esp. Si celui-ci est spécifié et non nil, la chaîne entrée pourra
contenir des espaces, sinon la touche espace sera considérée comme une validation de l'entrée.
getkword est utilisée pour spécifier des « mots clés » (options), son utilisation est liée à celle de la fonction initget
(voir ci-dessous)
Toutes ces fonctions permettent indifféremment une entrée au clavier ou une saisie à l'aide du périphérique de
pointage.
Elles acceptent un argument (optionnel) : pt, un point à partir duquel s'affiche une ligne élastique jusqu'au pointeur
(avec getcorner la ligne élastique est remplacée par un rectangle).
- 19 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
getangle, getdist et getorient retournent un nombre réel. getangle et getorient acceptent les entrées au clavier
dans l'unité angulaire courante, mais retournent un angle exprimé en radians croissant en sens trigonométrique.
getorient retourne l'angle « absolu » (0.0 à l'Est), getangle l'angle « relatif » qui tient compte d'un éventuel
paramétrage de l'angle de base 0.0 (variable système ANGBASE).
Les fonctions getXXX contrôlent le type de donnée entré et affichent un message si le type n'est pas valide :
La fonction initget permet d'initialiser les valeurs « autorisées » pour les fonctions getXXX (excepté getstring) ainsi
que pour les fonctions entsel, nentsel et nenselp (voir chapitre 16.1).
Un appel initget n'affecte que l'appel à la fonction getXXX ou *entsel* qui lui succède.
Exemples :
(initget 7)
(setq dist (getdist "\nSpécifiez la distance: "))
Avec getkword :
L'utilisateur ne peut entrer que oui, non, o ou n (les lettres en capitales dans l'argument chaîne sont des raccourcis).
Le fait de spécifier les mots clés sous la forme : [Oui/Non] dans l'invite de la fonction getkword
les fait apparaître dans le menu contextuel.
- 20 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Pour certaines données, AutoLISP® fournit des fonctions qui utilisent les boites dialogue standard.
• 1 Créer un nouveau fichier (ne pas utiliser pour sélectionner un fichier déjà existant),
• 4 Permet à l'utilisateur d'entrer une extension arbitraire (ou pas d'extension),
• 8 Si 1 n'est pas spécifié, ouvre directement sur le fichier par défaut si celui-ci est dans un répertoire du
chemin de recherche,
• 16 Si ce bit est spécifié ou si l'argument défaut se termine par un délimiteur de chemin (\\ ou /). La case
« Nom du fichier » est vide et la recherche commence au chemin spécifié,
• 32 Si 1 est spécifié (création d'un nouveau fichier), n'affiche pas la boite de dialogue « Ce fichier existe
déjà, voulez-vous l'écraser ? »,
• 64 Ne transfère pas les fichiers à distance si l'utilisateur spécifie une URL,
• 128 N'accepte aucune URL.
acad_colordlg et acad_truecolordlg pour les boites dialogue de choix de couleur respectivement de l'index et
« couleurs vraies » (versions 2004 et postérieures).
(acad_colordlg 1)
acad_truecolordlg fonctionne comme acad_colordlg en remplaçant l'index par une paire pointée (groupes DXF
62, 420 ou 430).
Les listes étant des éléments fondamentaux dans le langage LISP, il existe de nombreuses fonctions pour les
construire, accéder à leurs éléments, les manipuler.
Pour construire une liste dont on connaît, à priori, tous les éléments et l'attribuer à une variable, le plus simple est
d'utiliser la fonction quote (ou son abréviation : ').
- 21 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Si la liste contient des expressions nécessitant une évaluation (appels de fonctions ou variables), la fonction quote
empêchera ces évaluations, on utilise alors la fonction list.
(setq a 12)
(setq lst '((+ 2 3) a)) retourne : ((+ 2 3) a)
(setq lst (list (+ 2 3) a)) retourne : (5 12)
Une autre fonction fondamentale du LISP est la fonction cons utilisée pour construire une liste. cons requiert deux
arguments : élément et une liste et retourne la liste avec le nouvel élément ajouté au début.
nil étant considéré comme une liste vide, (cons 1 nil) retourne : (1)
VIII-B - Accès aux éléments (car cdr last nth member vl-position)
Les premières fonctions LISP sont car et cdr. Elles sont présentes dans tous les langages LISP.
car retourne le premier élément d'une liste et cdr la liste privée du premier élément.
(car (cdr '(6 1 8)) s'écrit : (cadr '(6 1 8)) et retourne : 1, soit le premier élément de la liste privée du premier élément
(soit le second élément de la liste).
Ces trois premières combinaisons sont très utilisées pour accéder aux coordonnées des points. En LISP un point est
défini comme une liste de deux ou trois nombres (selon si c'est un point 2d ou 3d) : les coordonnées du point. car
retourne la coordonnée X, cadr le Y et caddr le Z.
AutoLISP® permet ce type de combinaison jusqu'à quatre niveaux d'imbrication, ceci permet d'accéder aux éléments
des listes imbriquées.
On peut aussi accéder aux éléments d'une liste avec la fonction nth qui retourne l'élément de la liste à l'indice spécifié.
La fonction inverse : vl-position retourne l'indice de l'élément. L'indice du premier élément est toujours 0.
La fonction member requiert deux arguments : une expression et une liste. Elle parcourt la liste en cherchant une
occurrence de l'expression et retourne la liste à partir de cette première occurrence.
- 22 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
append fusionne en une liste unique les listes qui lui sont passées comme argument.
La fonction subst sert à substituer toutes les occurrences d'un élément par un nouvel élément. Elle requiert trois
arguments : le nouvel élément, l'élément à substituer et la liste à traiter.
Pour supprimer toutes les occurrences d'un élément dans une liste on utilise la fonction vl-remove.
Une paire pointée est une liste particulière, elle ne contient que deux éléments et ceux-ci sont séparés par un point :
(1 . "test"), (40 . 25.4)…
On construit une paire pointée avec quote (') ou avec cons. Dans ce cas, le second argument est un atome et non
une liste comme montré plus haut.
- 23 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Les paires pointées servent à la constitution de listes d'association (ou liste associative). Il s'agit de liste dont les
éléments sont des listes et/ou des paires pointées. Le premier élément de chaque sous-liste servant de clé pour le
localiser sans se soucier de sa position dans la liste.
La fonction assoc permet de retrouver un élément d'une liste d'association grâce à sa clé (si dans la liste plusieurs
éléments ont la même clé, seul le premier est retourné).
(assoc 40 '((1 . "test") (40 . 25.4) (70 . 3))) retourne : (40 . 25.4)
Les paires pointées permettent un fonctionnement cohérent tant pour créer un élément dans liste d'association avec
cons que pour récupérer une valeur d'élément avec cdr et assoc, que cette valeur soit un atome ou une liste.
(setq a_lst (cons 1 "test") (cons 10 '(20.0 30.0 0.0))) retourne : ((1 . "test") (10 20.0 30.0 0.0))
(cdr (assoc 1 a_lst)) retourne : "test"
(cdr (assoc 10 a_lst)) retourne : (20.0 30.0 0.0)
Les fonctions getvar et setvar permettent, respectivement, de récupérer ou de modifier la valeur d'une variable
système. Toutes deux requièrent comme argument le nom de la variable système (chaîne ou symbole quoté). setvar
requiert en plus la nouvelle valeur à affecter.
Souvent on modifie la valeur d'une variable système pour les besoins de la bonne exécution d'un programme. Dans
ce cas, le programme devra restaurer la valeur initiale de la (ou des) variable(s) système modifiée(s).
Pour ce faire, on affecte la valeur initiale de la variable système à une variable, puis on change la valeur et, à la fin
du programme, on restaure la valeur initiale.
Les variables d'environnement ressemblent aux variables système. Elles permettent de stocker des informations en
dehors de l'application. Les valeurs des variables d'environnement sont écrites sous forme de chaînes dans la base
de registre. Comme les variables système, beaucoup servent à conserver des paramètres personnalisables.
L'utilisation des fonctions getenv et setenv est semblable à celle getvar et setvar à ceci près que les valeurs sont
toujours de type STRING (chaîne) et qu'il est possible, avec setenv de créer ses propres variables d'environnement.
On retrouve les variables créées avec setenv dans la clé du registre suivante (1) :
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R17.0\ACAD-5001:40C\FixedProfile\General
X - Fonctions géométriques (distance angle polar inters sin cos atan trans)
Il est logique qu'un langage dédié à un logiciel de DAO fournisse des fonctions géométriques.
- 24 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Retourne l'angle entre la droite définie par les deux points qui lui sont passés comme arguments et l'axe X du SCU
courant. L'angle est retourné en radians et est mesuré dans le sens trigonométrique. Si les points n'appartiennent
pas au plan XY du SCU courant, ils sont projetés sur ce plan.
cos, sin implémentent les fonctions trigonométriques cosinus et sinus. Elles requièrent un nombre comme argument
exprimant un angle en radians.
Les arguments depuis et vers peuvent être : un nombre entier (code), un nom d'entité (ENAME) ou un vecteur 3d
(direction d'extrusion).
Si un nom d'entité est utilisé comme argument, il doit être de type ENAME (tel que retourné par les fonctions entlast,
entnext, entsel, nentsel ou ssname). Il exprime alors le Système de Coordonnées Objet (SCO ou OCS) de l'entité.
Ce format ne sert que pour certaines entités créées ou insérées dans un Système de Coordonnées dont le plan XY
n'est pas parallèle à celui du SCG.
L'argument depl, s'il est spécifié et non nil spécifie que pt doit être considéré comme un vecteur (déplacement).
Dans un SCU ayant subi une rotation de 90° sur l'axe Z (sens trigonométrique) :
- 25 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
prin1, princ et print requièrent les mêmes arguments : une expression et, optionnellement, un descripteur de ficher.
Les trois fonctions affichent sur la ligne de commande le résultat de l'évaluation de l'expression et retournent ce même
résultat. Si le second argument est présent et représente un descripteur de fichier ouvert en écriture, ce résultat est
écrit dans le fichier (voir chapitre 14).
Les différences entre ces trois fonctions concernent l'affichage dans les cas où l'argument est une chaîne :
De plus ces fonctions n'ont pas le même comportement si la chaîne contient des caractères de contrôle (2) : prin1
et print affichent les caractères de contrôle, princ et prompt affichent leur évaluation.
On remarque aussi que le texte affiché est immédiatement suivi du résultat de l'évaluation de l'expression. Comme
dit plus haut, une expression LISP retourne toujours un résultat et ce résultat s'affiche sur la ligne de commande.
Un programme LISP étant une expression (parfois très longue), il retournera sur la ligne de commande le résultat
de la dernière expression. Pour éviter ceci et sortir « silencieusement » du programme, on utilise comme dernière
expression un appel à princ ou prin1 sans argument : (princ) ou (prin1).
La fonction alert permet d'afficher un message dans une petite boite de dialogue.
Les fonctions textscr et graphscr permettent, respectivement d'ouvrir et de fermer la fenêtre de texte d'AutoCAD.
Caractères de contrôle :
• \\ : anti-slash ;
• \" : guillemet ;
• \n : saut de ligne ;
• \r : retour chariot ;
• \e : Echap ;
• \nnn : caractère dont le code octal est « nnn ».
- 26 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
On ne fait pas de programmation « intelligente » sans fonctions conditionnelles permettant d'établir des structures
décisionnelles.
En LISP, il n'est pas demandé à l'expression de test (expr_test) de retourner une valeur purement booléenne : vrai ou
faux (T ou nil) mais est considéré comme « vrai » tout ce qui est non nil, autrement dit, si l'expression test retourne
une valeur quelconque autre que nil le test est considéré comme « vrai » et l'expression alors est évaluée. Si expr_test
retourne nil et que l'expression sinon est présente, c'est elle qui sera évaluée.
Comme if n'accepte qu'une seule expression alors (et une seule sinon) et qu'il peut être nécessaire d'évaluer plusieurs
expressions, on les regroupe avec la fonction progn. Cette fonction évalue séquentiellement les expressions qu'elle
contient et retourne le résultat de la dernière.
cond accepte un nombre indéterminé de listes comme arguments. Le premier élément de chaque liste est évalué
tour à tour jusqu'à ce qu'un de ces éléments retourne un résultat non nil. Le reste des expressions contenues dans
cette liste est alors évalué.
Il est courant d'utiliser T comme dernière expression test (défaut). Si tous les tests précédents ont échoué, les
expressions de cette dernière liste seront évaluées.
Les expressions de test peuvent utiliser nombre de fonctions AutoLISP® qui retournent un résultat de type booléen (T
ou nil). Ces fonctions peuvent être des prédicats de comparaison ou de type de données ou des opérateurs logiques.
= accepte un nombre indéfini d'arguments, mais uniquement des nombres ou des chaînes.
(= 2.0 2 2) retourne : T
(= 3 12) retourne : nil
- 27 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
eq et equal n'acceptent que deux arguments à comparer qui peuvent être des expressions LISP de tous types.
Pour les nombres (ou listes de nombres), equal accepte un troisième argument (optionnel) : une tolérance dans la
comparaison.
Petite subtilité dans la comparaison de listes affectées à des variables : eq évalue si le même objet est affecté aux
variables, equal compare le contenu des variables.
• /= : différent de
• < : inférieur à
• <= : inférieur ou égal à
• > : supérieur à
• >= : supérieur ou égal à
• zerop évalue si le nombre qui lui est passé comme argument est égal à 0.
• minusp évalue si le nombre qui lui est passé comme argument est strictement inférieur à 0.
• wcmatch compare une chaîne à un modèle contenant des caractères génériques.
Exemples
- 28 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
(listp a) retourne : T
(listp b) retourne : nil
(listp c) retourne : T
(vl-consp a) retourne : T
(vl-consp b) retourne : nil
(vl-consp c) retourne : nil
Comme il n'existe pas de fonction prédicat pour tous les types de données, on peut utiliser la fonction type avec
une fonction de comparaison.
Un des buts de la programmation étant de simplifier les taches répétitives, tous les langages de programmation
fournissent des fonctions permettant de répéter des instructions en boucle.
- 29 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
On appelle boucle ou itération le fait de répéter un processus (évaluation d'une ou plusieurs expressions).
Lorsque le nombre de fois que le processus doit se répéter est déterminé par avance, on peut utiliser la fonction
repeat :
Cette fonction évalue chaque expression le nombre de fois spécifié et retourne le résultat de la dernière évaluation.
Souvent, le nombre d'itérations dépend d'une condition et ne peut être déterminé, on utilise alors la fonction while :
Chaque expression est évaluée tant que l'expression test ne retourne pas nil. Il est donc impératif qu'à un moment
ou à un autre cette expression retourne nil, sinon on entre dans une boucle sans fin (3) . C'est à l'intérieur même
du processus itéré que des changements de données doivent permettre la condition d'arrêt (que l'expression test
retourne nil).
Tant que l'utilisateur spécifie un point (pt est non nil), un cercle de centre pt et de rayon 10.0 est dessiné. Si l'utilisateur
fait Entrée, Espace ou clic droit, pt sera nil et la boucle s'arrêtera.
Les processus itératifs nécessitent souvent l'incrémentation d'un nombre entier (un indice par exemple). Deux
opérateurs AutoLISP® sont prévus pour incrémenter ou décrémenter une valeur entière : 1+ et 1-.
Retourne :
(0 1 2 3 4 5 6 7 8 9)
XIII-B - Traitements de listes (foreach mapcar lambda apply vl-every vl-some vl-member-if(-
not) vl-remove-if(-not) vl-sort)
AutoLISP® fournit bien sûr des fonctions pour traiter tous les éléments d'une liste. À part foreach, il ne s'agit pas
à proprement parler de fonctions itératives.
nom est la variable à laquelle seront affectés tour à tour chaque élément de liste. foreach retourne le résultat de
la dernière évaluation.
- 30 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
écrit : « Ceci est un test » sur la ligne commande et retourne : " ".
Une des fonctions LISP les plus puissantes est la fonction mapcar.
Elle retourne la liste qui est le résultat de l'application de la fonction à chacun des éléments de la (ou des) liste(s).
(mapcar '1+ '(10 20 30)) retourne : (11 21 31) comme (list (1+ 10) (1+ 20) (1+ 30))
(mapcar '+ '(1 2 3) '(4 5 6) retourne : (5 7 9) comme (list (+ 1 4) (+ 2 5) (+ 3 6))
La fonction requise comme argument peut être une fonction prédéfinie (comme ci-dessus), une fonction définie avec
defun ou une fonction anonyme (lambda).
Si, par exemple, on veut convertir une liste de nombres en les multipliant par 10, il n'existe pas de fonction prédéfinie
qui le fasse. On peut donc définir cette fonction avec defun et l'utiliser ensuite avec mapcar.
La fonction x10 ne présente que peu d'intérêt en dehors de cette utilisation. Quand la création d'une fonction avec
defun ne se justifie pas, on peut définir une fonction anonyme avec lambda.
Une fonction lambda est semblable à une fonction définie avec defun à ceci près qu'elle n'a pas de nom (et donc,
ne peut pas être appelée), qu'elle est exécutée et retourne son résultat à l'endroit même de sa définition.
(mapcar '(lambda (x) (* x 10)) '(10 20 30) retourne : (100 200 300)
On peut noter que la fonction lambda ci-dessus, est construite comme la fonction x10.
Plusieurs autres fonctions de traitement des listes requièrent une fonction comme argument.
Toutes peuvent utiliser indifféremment le nom d'une fonction prédéfinie ou définie avec defun ou encore une fonction
lambda.
apply passe une liste d'arguments à une fonction et retourne le résultat de l'évaluation
vl-every et vl-some sont des fonctions prédicat (elles retournent T ou nil) qui requièrent comme arguments une
fonction prédicat et une liste.
(vl-every 'numberp '(1 25.4 256)) retourne : T (tous les éléments de la liste sont des nombres).
(vl-some '(lambda (x) (= (type x) 'REAL)) '(1 25.4 256)) retourne : T (au moins un élément de la liste est un nombre
réel).
- 31 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
retourne : ((20 12) (13 85) (7 25)) la liste triée suivant ordre décroissant des premiers éléments.
vl-member-if (ou vl-member-if-not) fonctionne un peu comme member, mais au lieu de comparer chaque élément
de la liste avec une expression, elle évalue si chaque élément retourne T (ou nil) lorsqu'il est passé comme argument
à la fonction prédicat.
( vl-member-if
'(lambda (x) (= (car x) 5))
'((1 . "test") (40 . 25.4) (5 . "1D9") (70 . 4))
)
vl-remove-if (ou vl-remove-if-not) retourne la liste après avoir supprimé les éléments qui retourne T (ou nil) quand
ils sont passés à la fonction prédicat.
retourne : (1 256)
Une fonction récursive est une fonction qui fait appel à elle-même dans sa propre définition.
Ce type de procédure permet souvent d'écrire un code plus concis et de résoudre simplement certains problèmes
complexes (imbrications multiples dans une arborescence, par exemple). Ceci nécessite forcément la définition d'une
fonction dans laquelle on trouvera un (ou plusieurs) appel(s) à cette même fonction.
L'exemple classique pour illustrer la récursivité est la fonction fact qui retourne la factorielle d'un nombre :
Une fonction récursive doit toujours contenir au moins une condition d'arrêt, ici : (zerop n) qui permet de sortir des
appels récursifs : (* n (fact (1- n))).
À chaque appel récursif, au moins un des arguments passés à la fonction est modifié de telle sorte qu'à un moment
la condition d'arrêt soit remplie. Ici, n est décrémenté de 1.
L'évaluation d'une fonction récursive se fait en deux phases appelées « empilement » (jusqu'à ce que la condition
d'arrêt soit atteinte et « dépilement » (jusqu'au résultat final).
Les procédures récursives peuvent aussi être utilisées dans le traitement des listes (mapcar, par exemple est définie
récursivement).
- 32 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
La condition d'arrêt est ici implicite : si lst est non nil, un appel récursif survient, sinon la fonction retourne nil. La
condition d'arrêt est donc : lst égal nil.
Soit : ajouter le premier élément de lst à la liste retournée par le résultat de l'évaluation de la fonction
remove_doubles avec comme argument la liste lst de laquelle on aura supprimé toutes les occurrences du premier
élément.
Si on décompose l'évaluation de l'expression (remove_doubles '(1 2 1 3 3)), on fera apparaître les phases
d'empilement et de dépilement.
Empilement :
Dépilement :
La fonction LISP trace permet de suivre ce processus dans la fenêtre de texte d'AutoCAD® et dans la fenêtre de
Suivi de l'éditeur Visual LISP.
(trace remove_doubles)
;;; TRUNC
;;; Retourne la liste tronquée à partir de la première occurrence
- 33 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
;;; BITSLIST
;;; Retourne la liste des codes binaires dont un nombre entier est la somme
(defun BitsList (n / b)
(if (/= 0 n)
(cons (setq b (expt 2 (fix (/ (log n) (log 2)))))
(BitsList (- n b))
)
)
)
AutoLISP® permet de manipuler les chaînes, et de lire et écrire des fichiers texte.
De nombreuses fonctions commençant par « vl-string » ont été ajoutées aux fonctions AutoLISP® originelles, en
voici quelques exemples.
• vl-string-position, vl-string-search retourne la position d'un caractère ou d'un modèle dans la chaîne.
• vl-string-left-trim, vl-string- right-trim, vl-string-trim suppriment les caractères spécifiés respectivement au
début de la chaîne, à la fin de la chaîne ou les deux.
• vl-string-subst substitue une chaîne par une autre à l'intérieur d'une chaîne.
• vl-string-translate remplace les caractères dans une chaîne par ceux spécifiés.
• vl-princ-to-string et vl-prin1-to-string retournent la représentation sous forme de chaîne des données LISP
telles qu'affichées par les fonctions princ et prin1.
Une autre fonction fondamentale des langages LISP est la fonction read. Cette fonction retourne le premier atome
ou la première liste contenue dans la chaîne qui lui est passée comme argument.
- 34 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
XIV-B - Conversions (itoa atoi rtos atof distof angtos angtof ascii chr vl-string->list vl-list->string
float fix cvunit)
Il est souvent nécessaire de convertir des données numériques en données alphabétiques ou inversement.
itoa convertit un nombre entier en son équivalent en chaîne atoi est la fonction inverse.
La fonction ascii retourne le code ASCII (nombre entier) du caractère qui lui est passé comme argument. La fonction
inverse est chr.
La fonction vl-string->list retourne la liste des codes ascii de tous les caractères d'une chaîne. La fonction inverse
est : vl-list->string.
D'autres fonctions de conversion ne concernant pas les chaînes de caractères existent aussi.
float convertit un nombre entier en nombre réel, fix retourne la partie entière d'un nombre réel.
cvunit permet de convertir des valeurs d'un système d'unité à un autre. Les arguments requis pour les systèmes
d'unités sont réunis dans le fichier personnalisable acad.unt (dossier Support courant).
- 35 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
XIV-C - Fichiers ASCII (findfile open close read-char read-line write-char write-line)
AutoLISP® offre la possibilité de lire et écrire des fichiers texte ou fichiers ascii (.txt, .csv, .lsp…)
Avant d'essayer d'ouvrir un fichier, on peut s'assurer qu'il existe sur le poste. La fonction findfile retourne le chemin
complet d'un fichier si le fichier est trouvé, nil sinon.
L'argument requis est le nom du fichier à ouvrir, si le chemin complet n'est pas spécifié, la recherche se limite aux
répertoires du chemin de recherche, s'il est spécifié, la recherche est limitée à ce chemin.
(findfile "3darray.lsp")
Pour ouvrir le fichier, on utilise la fonction open qui requiert, outre le chemin complet du fichier, un argument mode
d'ouverture. Cet argument peut avoir les valeurs suivantes :
open retourne un pointeur vers le fichier, s'il n'existe pas, il est créé. Il est impératif de refermer le fichier après
utilisation avec la fonction close.
Une fois le fichier ouvert, on peut le lire avec la fonction read-line. Cette fonction retourne successivement chaque
ligne du fichier jusqu'à ce qu'il n'y en ait plus. On l'utilise généralement dans une boucle avec while.
La fonction write-line permet d'écrire une ligne dans un fichier ouvert en écriture.
Les fonctions write-char et read-char fonctionnent comme write-line et read-line mais au lieu d'écrire ou de
retourner une chaîne par ligne, elles écrivent ou retournent un code ascii par caractère.
• GetpointToFile qui demande à l'utilisateur de spécifier des points et les écrit dans le fichier C:\Points.txt sous
le format : « x,y,z » (cette commande appelle la routine lst2str ci-dessus) ;
• DrawFromFile qui lit le fichier C:\Points.txt et dessine chaque point.
;; GetPointToFile
- 36 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
;; DrawFromFile
;; Dessine les points à partir du fichier Points.txt
(defun c:DrawFromFile (/ file line)
(if (findfile "C:\\Points.txt")
(progn
(setq file (open "C:\\Points.txt" "r"))
(while (setq line (read-line file))
(command "_point" "_non" line)
)
(close file)
)
(princ "\nLe fichier \"C:\\Points.txt\" est introuvable")
)
(princ)
)
Durant l'exécution d'un programme LISP, des erreurs peuvent survenir du fait d'un manque de contrôle sur le type
de certaines valeurs, par exemple, ou plus simplement, si l'utilisateur quitte le programme prématurément avec la
touche Echap.
Suivant le moment où survient l'erreur dans l'exécution du programme, certaines variables système ont pu être
modifiées, un ficher peut être ouvert, etc.
Pour pouvoir restaurer l'environnement initial avant le lancement du programme, AutoLISP® fournit une fonction :
*error* qui peut être redéfinie. Il est impératif de limiter la portée de la redéfinition de *error* à la fonction à laquelle
elle s'applique afin que celle-ci retrouve aussi sa définition initiale si elle a été lancée.
*error* requiert un argument : le message affiché en cas d'erreur. La fonction *error* redéfinie peut décider de
l'affichage ou non de ce message.
Par exemple, dans la commande GetpointToFile (ci-dessus), l'auteur a pris la précaution de faire une première boucle
pour récupérer les points et les stocker dans une liste, avant d'ouvrir le fichier, traiter la liste et refermer le fichier.
Si l'utilisateur quittait la commande pendant la saisie des points, cela n'aurait pas d'incidence puisque le fichier ne
serait pas encore ouvert.
Mais on pourrait préférer tout faire dans la même boucle et écrire les points au fur et à mesure qu'ils sont saisis.
Il faudrait alors pouvoir refermer le fichier au cas où l'utilisateur annule la commande. Ce que nous allons faire en
redéfinissant la fonction *error*.
Dans les deux cas, la redéfinition de *error* n'affichera le message que s'il est différent de « Fonction annulée » et
fermera le fichier s'il est ouvert.
- 37 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
La première consiste à définir une fonction de gestion des erreurs à l'extérieur de la routine principale et à affecter
cette définition à *error* après avoir sauvegardé la définition initiale dans une variable globale. La définition initiale
sera restaurée en fin de routine ainsi qu'à la fin de la fonction de gestion des erreurs.
;; Fonction principale
(defun c:GetPointToFile (/ file pt lst)
(setq m:err *error* ; sauvegarde de *error*
*error* GPTF_err ; nouvelle affectation
)
(setq file (open "C:\\Points.txt" "w"))
(while (setq pt (getpoint "\nSpécifiez un point: "))
(write-line (lst2str pt ",") file)
)
(close file)
(setq *error* m:err ; restauration de *error*
m:err nil
)
(princ)
)
La seconde méthode (préférable, à mon avis) consiste à redéfinir *error* localement, c'est-à-dire à l'intérieur de la
fonction principale en ayant soin de déclarer *error* comme une variable locale.
AutoLISP® fournit un autre moyen de gérer les erreurs. La fonction vl-catch-all-apply permet de capturer une erreur
sans interrompre le processus en cours.
Comme pour la fonction apply, l'argument fonction peut être une fonction prédéfinie, définie avec defun ou une
fonction lambda. L'argument liste étant la liste des arguments à passer à fonction.
- 38 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
vl-catch-all-apply retourne le résultat de l'appel de fonction ou, si une erreur survient, un objet de type VL-CATCH-
ALL-APPLY-ERROR.
La fonction prédicat vl-catch-all-error-p retourne T si l'argument qui lui est passé est une erreur survenue dans un
appel vl-catch-all-apply.
Un fichier dwg est une base de données constituée d'entités graphiques (lignes, cercles, références de bloc, etc.) et
d'objets non graphiques (calques, styles de texte ou de cote, définitions de bloc, etc.).
AutoLISP® fournit des fonctions permettant d'accéder à ces objets pour les lire ou les modifier.
retourne <Nom d'entité: 7efa1648> ou nil si aucun objet n'a été sélectionné.
Certaines entités graphiques sont dites « complexes » parce qu'elles sont composées de sous-entités (références
de bloc, polylignes 3d…), les fonctions nentsel et nentselp permettent de sélectionner ces sous-entités.
Si l'entité sélectionnée par ces fonctions est une entité simple, la liste retournée est la même qu'avec entsel.
Si l'entité est un segment de polyligne 3d ou une référence d'attribut, la liste est semblable à celle retournée par
entsel, mais le nom d'entité retourné est celui du sommet (VERTEX) de départ du segment de polyligne 3d ou de
la référence d'attribut (ATTRIB).
- 39 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
S'il s'agit d'un composant de bloc autre qu'un attribut, ces fonctions retournent une liste constituée de :
entlast (entlast)
Retourne le nom d'entité de la dernière entité créée dans le dessin.
XVI-B - Données DXF des objets (entget entmake entmakex entmod entupd)
Avec AutoLISP®, la base de données des objets est accessible via les données DXF.
Si on ouvre un fichier DXF avec un éditeur de texte, on peut voir que chaque donnée est précédée d'un nombre
entier : le code groupe.
Pour pouvoir accéder aisément aux données, AutoLISP organise les données DXF en liste d'association dont le
premier élément de chaque paire pointée (ou liste) est un code de groupe. Ainsi certains codes de groupes sont
valables pour tous les types d'objets : -1 (nom d'entité de l'objet), 0 (type d'objet), 5 (maintien -handle-), etc. D'autres
sont spécifiques à un type d'entité ou ont une signification différente suivant les types d'objets.
Toutes les références DXF sont décrites dans l'aide aux développeurs d'AutoCAD®, rubrique « Référence DXF » (en
français pour les versions françaises).
L'argument facultatif app est une liste de noms d'applications enregistrées (clés pour les données étendues -xdata-).
Si cet argument est spécifié, la liste retournée contiendra les données étendues pour ces applications (spécifier '("*")
pour toutes les applications).
Exemple :
- 40 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
L'argument dxflst est une liste du type de celle retournée par entget. La liste doit contenir toutes les données
nécessaires pour créer l'objet. Si des données optionnelles ne sont pas spécifiées, l'objet prendra les propriétés
courantes.
Suivant le type d'entité, certains groupes (groupe 100 par exemple) peuvent être requis ou optionnels.
Si la liste ne contient pas toutes les données nécessaires, entmake retourne nil et l'objet n'est pas créé, sinon
entmake retourne dxflst.
L'utilisation de entmake à la place de command pour créer des entités présente plusieurs avantages. entmake est
plus rapide, est insensible aux accrochages aux objets et permet de spécifier directement des propriétés autres que
les propriétés courantes.
Pour créer le même cercle que ci-dessus sur le calque « TEST » (si le calque n'existe pas, il est créé avec les
paramètres par défaut), on aurait pu faire :
(entmake '((0 . "CIRCLE") (8 . "TEST") (10 5.0 8.0 0.0) (40 . 10.0)))
retourne : ((0 . "CIRCLE") (8 . "TEST") (10 5.0 8.0 0.0) (40 . 10.0)))
entmakex fonctionne comme entmake, mais retourne le nom de l'entité crée ou nil.
(setq line (entmakex '((0 . "LINE") (10 -5.0 8.0 0.0) (11 15.0 8.0 0.0))))
L'argument dxflst est la liste DXF de l'objet modifiée. Pratiquement, on récupère la liste DXF avec entget, on la
modifie avec les fonctions de traitement de listes (notamment la fonction subst) et on passe la liste modifiée comme
argument à entmod.
Par exemple, pour mettre la ligne line précédemment créée avec entmakex sur le calque « TEST ».
On peut faire :
- 41 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
(entmod elst)
XVI-C - Jeu de sélection (ssget ssadd ssdel sslength ssmemb ssname ssnamex ssgetfirst
sssetfirst)
Un jeu de sélection est un objet AutoCAD® (type PICKSET) qui contient des entités graphiques.
Ce type d'objet peut être passé comme argument de certaines commandes d'édition. Le plus souvent il doit être
parcouru avec la fonction ssname (voir ci-dessous) pour obtenir les noms d'entité (type ENAME) des éléments qui
le composent.
Le nombre de jeux de sélection ouverts est limité à 128. Il est donc important d'affecter les jeux de sélection à des
variables et de veiller à ce que ces variables retournent à nil après utilisation.
Il est possible d'inviter l'utilisateur à sélectionner plusieurs entités en une seule fois (ou de faire une sélection sans
son intervention) avec la fonction ssget.
Utilisé sans argument, ssget affiche le message « Choix des objets : » et invite l'utilisateur à faire une sélection
classique (comme la commande SELECT). L'utilisateur peut utiliser les options de modes de sélection (CP, SP, T,
P, etc.).
L'argument mode est utilisé pour forcer un mode de sélection, la plupart de ces modes permettent de faire des
sélections sans intervention de l'utilisateur (4) .
• "_A" : toute la base de données (excepté les entités sur les calques gelés, comme l'option « TOUT ») ;
• "_C" : capture, les arguments pt1 et pt2 (2 points) sont requis ;
• "_CP" : capture polygonale, l'argument pt-lst (liste de points) est requis ;
• "_F" : trajet, l'argument pt-lst (liste de points) est requis ;
• "_I" : implicite (les objets sélectionnés si PICKFIRST = 1) ;
• "_L" : dernier objet visible ajouté à la base de données ;
• "_P" : précédent ;
• "_W" : fenêtre, les arguments pt1 et pt2 (2 points) sont requis ;
• "_WP" : fenêtre polygonale, l'argument pt-lst (liste de points) est requis ;
• "_X" : toute la base de données (y compris les objets sur des calques gelés).
Exemple :
(ssget "_W" '(2 5) '(30 18)) sélection par fenêtre du point (2 5) au point (30 18)
• "_:E" : tous les objets situés sous la cible de sélection (ni fenêtre, ni capture) ;
• "_:S" : sélection unique (une seule fenêtre ou capture) ;
• "_:L" : exclusion des objets sur les calques verrouillés.
- 42 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Si l'argument pt1 est utilisé sans mode de sélection, la sélection est faite comme si l'utilisateur cliquait un seul point.
L'argument filtre permet de filtrer la sélection (mêmes possibilités qu'avec la commande FILTER). Il s'agit d'une liste
d'association stipulant les propriétés des objets que doivent posséder les objets pour pouvoir être sélectionnés (voir
16.4).
Exemple :
(ssget "_X" '((0 . "LINE"))) sélection de toutes les lignes de la base de données.
ssgetfirst (ssgetfirst)
Retourne une liste dont le premier élément (obsolète) est toujours nil et le second est un jeu de sélection contenant
tous les objets actuellement sélectionnés dont les « grips » sont activés.
Un jeu de sélection (type PICKSET) peut être utilisé directement avec certaines commandes, mais souvent il est
nécessaire de le parcourir pour accéder à chacune des entités qu'il contient.
Pour ce faire, on utilise la fonction ssname en incrémentant l'argument indice dans une boucle avec repeat ou while.
Exemple
- 43 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Les filtres de sélection sont des listes d'association utilisant les codes de groupe DXF à l'exception des groupes -1
(nom d'entité), 5 (maintien), et des codes de groupe supérieurs à 1000 (données étendues).
Les groupes utilisant des chaînes : 0 (type d'entité), 8 (calque), etc. acceptent les caractères génériques et peuvent
contenir plusieurs données séparées par des virgules.
(ssget '((0 . "*TEXT,DIMENSION"))) filtre les objets TEXT, MTEXT, RTEXT et DIMENSION.
Les groupes utilisant de données numériques (entiers, réels, points, vecteurs) supportent des tests relationnels. Les
opérateurs relationnels sont utilisés avec le code groupe -4 :
(ssget "_X" '((0 . "CIRCLE") (-4 . "=") (40 . 20.0))) sélectionne tous les cercle dont de rayon (code de groupe 40)
est égal à 20.0.
(ssget "_X" '((0 . "POINT") (-4 . "*,*,!=") (10 0.0 0.0 0.0))) sélectionne tous les points dont le Z est différent de 0.
(ssget "_X" '((0 . "POLYLINE") (-4 . "&=") (70 . 9))) sélectionne toutes les polylignes 3d fermées (8 = polyligne 3d
et 1 = fermée).
Les filtres peuvent aussi contenir des groupes logiques imbriqués construits avec les opérateurs AND, OR, XOR et
NOT de la manière suivante :
(ssget (list
'(-4 . "<OR")
'(0 . "CIRCLE")
'(-4 . "<AND")
'(0 . "ELLIPSE")
'(41 . 0.0)
(cons 42 (* 2 pi))
'(-4 . "AND>")
'(-4 . "<AND")
'(0 . "LWPOLYLINE")
'(-4 . "&")
- 44 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
'(70 . 1)
'(-4 . "AND>")
'(-4 . "OR>")
)
)
Les tables regroupent des objets non graphiques en fonction de leur type. Les entrées des différentes tables sont
manipulables avec les fonctions entdel, entmake, handent et entmod (sauf les entités VPORT pour cette dernière).
Chaque table a un nom. Ce nom est utilisé comme argument avec les fonctions tblnext, tblsearch et tblobjname.
• LAYER : calques
• LTYPE : types de lignes
• VIEW : vues enregistrées
• STYLE : styles de texte
• BLOCK : définitions de blocs
• UCS : systèmes de coordonnées utilisateur enregistrés
• APPID : applications enregistrées (xdata)
• DIMSTYLE : styles de cote
• VPORT : fenêtres de présentation
Si l'argument setnext est spécifié et non nil et si une entrée est trouvée, le compteur pour tnblnext est réinitialisé
à partir de cette entrée.
((0 . "LTYPE") (2 . "Continuous") (70 . 0) (3 . "Solid line") (72 . 65) (73 . 0) (40 . 0.0))
On obtient la liste DXF complète d'une entrée avec : (entget (tblobjname nom_table sym))
- 45 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
XVI-F - Données étendues, dictionnaires (regapp, xdroom, xdsize, dictnext dictsearch dictadd
dictremove dictrename namedobjdict)
Les données étendues (xdatas) sont un moyen pour lier des données à un objet. Par exemple, AutoCAD® les utilise
pour conserver la liste des calques gelés uniquement dans une fenêtre de présentation.
Ces données appartiennent toujours à une application enregistrée qui sert aussi de clé pour y accéder. Avant
d'affecter des xdatas à un objet, il faut enregistrer l'application à laquelle elles appartiendront. La fonction LISP regapp
sert à créer une nouvelle application enregistrée.
(regapp application)
L'argument application est le nom donné à l'application, ce nom doit être unique. S'il est valide regapp retourne le
nom, sinon nil.
Les xdatas sont ajoutés en fin de liste DXF dans une liste unique dont le code de groupe est -3 (sentinelle). Cette
liste contient une sous-liste par application dont le premier élément est le nom de l'application et suivant des paires
pointées contenant les données.
Ces paires pointées utilisent des codes de groupe supérieurs ou égaux à 1000.
Comme la taille de la mémoire des données étendues affectée à une entité est limitée à 16 ko, il existe une fonction
qui retourne la mémoire disponible dans une entité : xdroom. Une autre fonction : xdsize retourne la mémoire
nécessaire pour une liste.
Exemple :
;; créer un cercle
(setq circle (entmakex '((0 . "CIRCLE") (10 20.0 15.0 0.0) (40 . 10.0))))
- 46 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
XVI-F-2 - Dictionnaires
Les dictionnaires fournissent un autre moyen de lier des données au dessin ou à des entités graphiques.
Ils peuvent contenir des données arbitraires et leur taille n'est pas limitée.
Les données dans un dictionnaire sont stockées dans un objet XRECORD sous forme de paires pointées, les codes
de groupes étant les mêmes que pour les données DXF.
Un dictionnaire peut contenir plusieurs entrées XRECORD mais aussi d'autres dictionnaires.
Tout fichier DWG possède un « dictionnaire des objets nommés » qui est la racine de tous les objets non graphiques
du dessin.
Par ailleurs tout objet graphique ou non peut avoir un « dictionnaire des extensions ».
AutoLISP® fournit des fonctions qui permettent d'accéder à ces dictionnaires et à leurs données, mais aussi d'en
créer de nouveaux.
namedobjdict ne requiert aucun argument et retourne le nom d'entité du dictionnaire d'objets nommés du dessin
courant. Ce dictionnaire est la racine de tous les objets non graphiques du dessin.
;; retrouver le dictionnaire
(setq dict(dictsearch (namedobjdict) "MON_SUPER_DICO"))
- 47 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
Tout objet AutoCAD® peut avoir un dictionnaire qui lui est lié : son dictionnaire d'extensions. Ce dictionnaire est
unique et peut avoir été créé par AutoCAD ou une autre application.
Comme la fonction dictadd ne peut ajouter des entrées qu'à un dictionnaire existant, si un objet n'a pas de dictionnaire
d'extensions, on l'ajoute en modifiant les données de l'objet avec la fonction entmod.
Remerciements
Toute l'équipe de Developpez.com remercie sincèrement Gilles Chanteau qui nous a aimablement permis de publier
son tutoriel sur notre site. Nous tenons également à remercier Winjerome pour la gabarisation et f-leb pour la
relecture orthographique.
- 48 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/
Introduction à AutoLISP® par Gilles Chanteau
- 49 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 Gilles Chanteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/