Qqs trucs sur Autocad et d'autres logiciels DAO...
Accueil Initiation Méthodologie Variables Comment faire ? Lisps Sommaire
Soft & liens Revit 2020 CVC sur autocad Linux CloudCompare Initiation à Autolisp Blog
(Page en cours de rédaction)

Initiation à Autolisp

 

la récursivité en lisp...

 

Documentation

Une fois n'est pas coutume, on commence le dossier par des liens vers une documentation indispensable pour bricoler son code.

Tout seigneur tout honneur, le pape du lisp en France l'introduction à Autolisp de (gile) puis les pages de CadXp ou vous trouverez pas mal de conseils pour débutants.
J'ai chercher longtemps un bouquin car c'est sympa d'avoir cet objet étrange ou on ne clique pas pour tourner les pages. La littérature en français sur le sujet est souvent soit trop pointue pour un débutant soit trop inconsistante pour donner des bases solides. J'ai fini par trouver Introduction concise à Autolisp de Benjamin Torno. il commence par les bases et va à l'essentiel Franchement 20euro payé directement à l'auteur, c'est du commerce de proximité 2.0. Un bon investissement.

Ensuite les PDF d'Autodesk qu'il est indispensable d'avoir à portée de clic c'est en anglais.. et oui il va falloir s'y mettre mais c'est pas trop compliqué à comprendre généralement. Au pire un coup de Googletrad et ça repart !

Avertissement

Bon, comme d'ab, les chapitres suivent sont les notes personnelles d'un débutant. et encore plus que pour d'autres chapitres de ce site ne les prenez pas pour argent contant ! Parcourez le forum pour débutants lisez des codes ect...
Je vais essayer de m'adresser à ceux qui n'ont jamais fait de programmation, ceux qui n'ont qu'une vague idée de ce que c'est et qui veulent faire leur tout premiers programmes.

Je travaille en ce moment avec un Autocad 2013. Les programmes que je proposent ont été testé avec cette version il peut y avoir des soucis avec les appels de (command suivant les cas quand totodesk s'amuse à changer les paramètres de fonctions Autocad. C'est le cas pour -tracer par exemple... je décris ici comment on fait pour construire un appel, il vous faudra vous adapter si ça plante sur votre version...

 

La programmation

On prend souvent les programmeurs pour des magiciens, ou des geeks pisseur de code. On se dit que cet art est réservé aux forts en math qui sont nés avec un gène hexadécimal sous le signe de la Ram ascendant 64 bits. Trop dur, impossible, inaccessible au commun des mortels !
C'est pas tout a fait faux. Les génies sont des génies et si vous n'êtes pas un génie, vous ne serez jamais un génie !
Mais il y a des nuances entre le hacker surdoué et le mouton décérébré. On ne va pas forcément devenir tous des Mozart du codage, mais tout le monde peu programmer. Pourquoi?

D'une part car ce serai dommage de s'en privé. Utiliser un ordinateur sans jamais programmer c'est un peu comme faire faire du VTT avec des roulettes. C'est sans risque, mais question délire, c'est plutôt limité. Impossible de sortir de la route pour couper à travers champs. Dans le cas qui nous intéresse on est condamner à utiliser les commandes existantes sans possibilités d'automatiser les taches répétitives et déprimantes.

D'autre part, c'est prendre le pouvoir sur la machine. Arrêter de considérer l'ordinateur comme une entité toute puissante pour comprendre enfin qu'il n'y a rien de plus couillon qu'un vulgaire assemblage de matière inerte qui ne sait compter que des zéro et des un et qui ne supporte pas les fautes d'orthographe !
Vous avez déja dû comprendre que pour moi, c'est un vrai problème.

Qu'est ce qu'un programme

Un programme est une suite d'instructions qui sont lues les unes après les autres et interprétées par un autre programme ou directement par le processeur (pour simplifier). On écrit un programme pour répondre à un problème précis. La première des chose à faire c'est de définir précisément ce que l'on veux que la machine fasse les paramètres à entrer, les sorties à obtenir.
Puis viennent les étapes par les quelles on va passer pour arriver au résultat attendu, On peut comparer ça à une recette de cuisine, une notice de montage Ikéa ou un protocole médical. Bref une description étapes par étapes détaillant les outils, l'ordre des opérations, et d'éventuels test qui vont conditionner la suite des opérations.

Bien sur si on veux que la machine fasse le café, nous calcule les résultats du loto ou nous arrange en rendez vous avec l'âme soeur, il va pas être facile de déterminer les étapes ou les paramètres d'entrée.
A notre petit niveau, on va se contenter de faire des choses simples. Des choses qu'Autocad sait faire, tracer des lignes ou d'autres entités Autocad, faire des maths ou plutôt calculer des formules, exécuter des commandes Autocad comme PURGER, TRACER DECALER...

Puisque L'Autolisp est un langage interprété, on va parler d'interpréteur. Il faut voir l'interpréteur comme un petit esclave, à la fois stupide, très (trop ?) discipliné et qui à beaucoup de mémoire. C'est ce bon petit soldat très rapide, qui lit les instructions les une après les autres les exécute ou les mémorise pour plus tard, et prend la main sur Autocad pour faire notre boulot.

Pour écrire un programme, il faut se mettre à la place de ce petit bonhomme et détailler tout ce qu'il doit faire. Si on lui dit de tourner sur lui même sans jamais s'arrêter, il le fera,... et plantera Autocad!
Ben oui, il est pas très malin... Donc c'est à nous de l'être pour lui. C'est pour ça que c'est passionnant... comme un jeux vidéo.
Il est tout de même indispensable de conaitre plutot bien Autocad avant de se lancer dans l'aventure... Et être familier de sa ligne de commande.

Le langage

L'ordinateur est tellement stupide que discuter avec lui est pas une mince affaire. En effet, si on se sent une âme de poète qu'on veux utiliser des métaphores ou un langage familier, nada! il va froncer ses sourcils virtuels, et répondre invariablement erreur machin ou incorrect type ou autres remarques pas très spirituelles dont la signification est:

Mais heu... je comprend pas !!!

Quel con non mais quel con!!!
Il va donc falloir apprendre sa langue et sa langue (entre autres ) c'est l'Autolisp.

Néanmoins comme avec tout langage, il y a des artistes, de ceux qui maîtrisent suffisamment celle là pour trouver des tournures élégantes, économe en lignes de code et plus efficaces.
Pour être clair, je ne suis pas un artiste. Les codes et fonctions que je vais donner en exemple sont dépourvu de brillot pauvre en syntaxe pauvre en style... mais elles seront peut etre plus accessibles aux débutants car plus littérale. Pour voir du beau code et récupérer quelques programmes bien utiles, on peu examiner les routines de (gile) ici, de Patrick_35 là ou encore celles de Lee Mac et Le forum en anglais theswamp.org. (L'image en haut de la page est tirée de ce site)

L'Autolisp

Je ne m'étendrais pas sur les origines, la pertinence ou les surnoms rigolos du Lisp, pour aller à l'essentiel. Lisp fait parti des langages dit fonctionnel de la vielle école, du temps ou les ordinateurs étaient plus simple qu'aujourd'hui. Et même si la syntaxe est déroutante, le lisp est un langage relativement simple, avec peu de fonctions et pas compliqué à apprendre une fois qu'on a assimilé les bases.

Le Lisp est un langage de traitement des listes. Une liste est délimitée par deux parenthèses. Derrière un dessin Autocad, il y a une base de donnée qui regroupe les informations de chaque entités. L'Autolisp est une variante du lisp car ses propriétés des traitement des liste sont particulièrement adaptés au parcours à la modification ou à l'ajout d'entrée dans cette base de données. En Autolisp, tout peut y etre considéré comme une liste, ou une suite de liste, ou des listes de listes, des listes imbriquées ... .... .....

Un langage, c'est un vocabulaire et une grammaire.
Pour le vocabulaire, je vous renvoie aux doc indiquées en début de page, et tout particulièrement au guide de référence, à toujours avoir sous la main car les commandes y sont regroupées par ordre alphabétique avec des exemples de syntaxe qui aide à comprendre. On peu aussi s'imprimer les quatre pages de synthèse ou elle sont regroupées par thème... 4 pages, ça fait finalement pas un gros vocabulaire...
Pour compléter ce vocabulaire, on sera amené à écrire des fonctions. Pour plus de clarté je vais essayer de parler de commande pour les commandes native et de fonction pour les commandes que l'on crée. Mais ces deux termes sont équivalents et je m'embrouille parfois les pinceaux.

Pour la grammaire, c'est un peu plus compliqué, enfin inhabituel voire incongru. Pour les plus anciens qui ont connu sur les bancs du lycée la gué guère entre les pro Texas instrument et les pro HP, il y avait pour les HP une drôle de formulation des calculs appelée "Notation polonaise inverse"
C'est étrange que le Lisp éveille à mon souvenir cette notation mathématique destinée à supprimer l'usage de parenthèse, car le Lisp abuse des parenthèses. Mais, la place des opérateurs, les imbrication de fonctions.... J'ai l'impression que dans l'esprits, les deux langages ont des similitudes. Ou en tout cas une certaine proximité philosophique.

Les commandes se trouvent donc toujours entre 2 parenthèses sous la forme: (NomComande Arguments Options ou Paramètres) en fait c'est une liste qui commence par un mot clef puis d'autres éléments dont elle a besoin pour etre évaluée par l'interpréteur.

Par exemple l'addition: (+ 1 1)
qui retourne ?

2 !! bravo yana encore qui suivent !!!
+ est la fonction appelée, 1 et 1 deux paramètres.

On peu dors et déjà remarquer qu'une fonction retourne quelque chose. C'est a dire qu'il y a un résultat et que ce résultat peut etre utilisé.
Certaines fonctions retournent "nil" qui veux dire rien, mais nil est finalement quand même un résultat qui est retourné (et puis, rien ce n'est pas rien). Mais dans la plus part des cas on a un résultat plus tangible que l'on utilise immédiatement
Par exemple : (+ 1 (+ 1 1 )) Qui retourne.... ..... .... 3.

Dans cet exemple on commence à voir l'originalité de la grammaire. On peut imbriquer les fonctions les unes dans les autres. La 1ere à etre interprétée étant celle le plus au centre des parenthèses. Et ce jusqu'a la notion de récursivité limite psychologiquement infranchissable pour mon cerveau atrophié.

Variables

Pour stoker les résultats, faire des calculs tester une possibilité, on va avoir besoin de containers. En informatique on appelle ça des variables, on peu les voir comme des boites qui peuvent mémoriser toute sorte de choses. Autolisp est pas un langage trop tatillon avec les variables. Il n'empêche que la gestion de ces cases mémoire fera partie de nos préoccupations. Et si elle n'est pas obligatoire, initialiser ses variables avant de travailler avec est une bonne habitude.
Il existe plusieurs type de données et les fonctions ne sont généralement valide que pour certain type de donnée. On peu faire des multiplication de nombres, mais pas de chaînes de caractères. Idem pour les retours de fonction ils ont aussi un type. Si on veux enchaîner des fonctions il faut y faire attention.

(re) Lisez la bible (même si vous ne comprenez pas tout)

Ceci posé, je vous réinvite à lire l'introduction à Autolisp de Gilles Chanteau car je ne voudrais pas dire trop de boulettes. L'essentiel de la grammaire et de la syntaxe tient dans cette petite quarantaine de pages. Je vais essayer pour ma part de donner quelques exemples, de détailler quelques techniques et vous parler d'algorithmes et de certaines spécificités rencontrées pour des problèmes courant de vos premiers programmes. Après cette lecture vous serez à même de comprendre comment passer d'une formulation littérale à son implémentation en Lisp. Je ne vous lâche pas encore, mais ça va me permettre d'aller plus vite sans rentrer dans le détail de la syntaxe.

Algorithmes

En introduction, je parlais de recette de cuisine. L'algorithme c'est le nom savant de la recette de cuisine. On trouve des tournures utilisables dans tous les programmes et avec tous les laquages. Par exemple les boucles, les test, les invites à une entrée de l'utilisateur, les messages de sortie ou encore les appels de fonctions Autocad. Avant de commencer à écrire en Autolisp, on va écrire dans un langage plus familier, en français par exemple, mais si le serbo-crohate vous est plus naturel, je vous laisse vous exprimer librement :)

Il y a un moyen d'expression particulièrement adapté, c'est les logigramme ou organigramme logiques voici au passage un petit logiciel adapté au leur dessin, un site pour les faire en ligne (inscription nécessaire), mais bon j'aime autant Autocad pour aider j'ai fini par faire qqs blocs ici.

Prenons un exemple qui pour être classique n'est pas à priori habituellement traité avec Autocad. La résolution d'une équation du second degrés. du type: Ax²+Bx+C=0

Rappel (source: de vieux souvenir et une page perso qui à tous mes remerciements car ma mémoire était défaillante)

D=B²-4AC

si D<0 pas de solutions
si D=0 X1=X2= -B/2A
si D>0 X1= (-B + √D) /2A et X2 = (-B - √D) /2A

On va rajouter une micro difficultés en demandant à l'utilisateur s'il veux s'arrêter ou résoudre une autre équation.

 

Expression littérale   Logigramme
  • On va dire bonjour et rappeler ce qu'on va faire.
  • Demander à l'utilisateur de rentrer A,B,C
  • vérifier que A est différent de 0 si oui sortir
  • Calculer D
  • Suivant le cas
    D < 0 ou D=0 ou D>0 calculer la ou les solutions
  • Afficher le résultat
  • Demander si on veux recommencer
  • si oui on recommence on remonte au moment ou on demande A,B,C
  • Si non on sort.
 

 

Voila une recette bien ficelée on va passer à la traduction. Examinons de quelle commandes on va avoir besoin.
Je vous invite a jeter un coup d'oeil au guide de référence quand je signale ces fonctions en gras (dépliez les signets pour avoir accès directement à la liste alphabétique)

Afficher un message (princ ou (alert
demander une entrée de réel (getreal et de (setq pour stocker l'entrée dans une variable
pour calculer D on va avoir besoin de (expt pour faire le carré et de (- et (*
les test sont réalisés par la fonction (if on aura aussi besoin de (progn
Pour choisir entre 3 options on aurait pu encore se servir de 3(if mais (cond va nous faire voir une autre commande
Pour calculer les résultats il nous faut la racine carrée c'est (sqrt
Recommencer... harf ça sent la boucle... donc (while . En regardant l'utilisation de cette fonction on se rend compte qu'il faut la placer au début car ce qui est répété c'est que qu'il y a l'intérieur de la fonction. Et qu'il va falloir initialiser un test qu'on changera à la fin si l'utilisateur désire sortir du programme.

Finalement, ce petit exercice fait déjà voir pas mal de chose pour un premier programme.

Un autre truc auquel on aura souvent recours, c'est les imbrications de boucle, de test, de conditions...
On peu remarqué sur la version graphique que notre petit bonhomme ne déroule pas sont programme de façon toute linéaire. Il y a des tours de manège, et des aiguillages pour le guider. IL faut bien choisir la structure de son programme et voir ou on met les un par rapport aux autres, faire les chemins comme si on jouait le rôle du pointeur en vérifiant qu'on couvre bien tous les cas de figure.

Les boucles.

On vient de voir le (While. Il en existe d'autres. En Autolisp il y a (foreach et (repeat... Quand le pointeur (notre petit bonhomme) arrive sur la parenthèse qui ferme la fonction, il se pose la question: la condition de sortie est elle remplie?
Si oui il passe à la suite, Si non, il remonte vers le début des instructions de la boucle. Il faudra faire attention de toujours avoir une porte de sortie pour ne pas tourner en rond indéfiniment. Même si (foreach et (repeat sont plus sure de par leur structure, méfiance ...

les tests

Les tests sont des évaluations d'expressions logiques on vient de les voir (if et (cond

Avec if on à deux possibilités soit oui soit non.
Avec cond on peu évaluer autant de possibilités que l'on veux

La difficulté sera de trouver des tests pertinents, et de réviser un peu sa logique booléenne car ça peu devenir compliqué quand plusieurs paramètres interviennent avec des opérateurs logiques comme (or, (and , (not...
Voici qqs exemples et un petit rappel de l'algèbre de Boole.

Écriture du code

Comme le préconise M. Chanteau, même si un fichier lisp est un fichier texte et pourrait etre écrit dans n'importe quel éditeur de texte y compris le plus mauvais qu'est le Notepad de windows. Je vous conseille vivement l'utilisation de l'éditeur Autolisp intégré à Autocad pour ses fonctions d'indentation et de débugage et de coloration syntaxique. De plus on peu lancer directement le code depuis l'éditeur pour le tester en temps réel (voir page 11).

Voici ma solution ax2.lsp (pour l'affichage, le fichier s'ouvre dans un nouvel onglet faites "enregistrer sous" pour le tester)

puisque c'est le 1er programme, j'ai fait beaucoup de commentaires, pour rappel les commentaires sont précédés d'un ";" mais on va encore détailler quelques ficelles.

D= B²-4AC

Si on regarde cette formule on a D= il va falloir faire une assignation. Une assignation c'est (setq sym expr [sym expr] ...). J'ai marqué en rouge les parenthèses qui délimite la liste des éléments du setq.
Le 1er terme du setq, c'est le symbole, la variable à affecter donc D, pas de problème...
Pour le 2eme terme, est une expression, c'est notre formule. Mathématiquement parlant, il y a des priorités. La puissance et la multiplication sont prioritaire sur la soustraction. On l'a vu, Lisp évalue les fonctions au centre en premier. Donc, B²-4AC est une soustraction de B² par 4 A C.
Formulé comme ça l'expression entourée en vert devient plus facile à lire.

(setq D (- (expt B 2) (* 4 A C) ) )

Mise en forme avec princ

Sortir proprement les résultats n'est pas si simple quand on débarque, print, prin1et princ sont proche mas pas tant que ça. on va faire une expérience.
En préalable il faut parler des caractères d'échappement.
Suivant cas et ce que l'on veut faire avec un texte on va utiliser des codes qui seront interprété par les fonctions (prin... différemment. Dans le cas présent, on souhaite sauter une ligne, c'est donc \n. Autre subtilité on voudrait enchaîner X1= et le résultat. Résultat qui va etre un réel.
Hors dans les références des (prin.. on a :

(princ [expr [file-desc]] ) avec expr qui doit etre une string.

Notre mission pour écrire cette ligne, si vous l'acceptez, sera de faire passer une chaîne à (princ ) à partir d'une chaîne "X1= " et du résultat contenu dans une variable X1 réelle .Le tout en sautant une ligne.
Le tout sur un pied,... en sifflant la Traviata.... non je décone... le pied c'est pas la peine... la Traviata oui ça va vous détendre!

Pour cela on va utiliser 2 fonctions très pratique: (strcat qui permet de chaîner des chaînes et (rtos à prononcer real to string qui sans un gros niveau d'anglais nous apprend qu'il passe un réel en string c'est à dire une chaîne de caractères. Notre expression complète est donc:

(princ "Deux solutions : ")
(princ (strcat "\nX1 = " (rtos x1)))

Voyons voir ce qui se passe avec (princ, (prin1 et (print pour tester ça chargez ce petit lisp dans un dessin. Agrandissez la ligne de commande ou tapez F2 dans Autocad pour voir les différents comportements des (prin... il faut lancer ce micro lisp en tapant TMP


Celui qui va nous satisfaire est donc (princ ). Mais les autres peuvent avoir leur utilités... on y reviendra... ou pas...

 

TP

Bon cette page commence à être un peu longue, si vous avez envie d'aller plus loin je note qqs travaux pratique sur d'autres entrées. J'essaye de doser la difficulté, mais peut etre, si vous débutez vraiment, un coup d'oeil sur le débugage vous permettra d'écrire plus facilement vos codes, enfin, de les débugger ;)
Car il est important de se défriser le poil dans sa main morte sur le clavier si vous voulez que ça rentre... Lire sans coder soit même c'est un peu comme se faire conduire en voiture, on a vaguement une idée du chemin, mais on ne saurai pas y retourner tout seul...

Les fonctions

Quelques notes sur ce qui se passe avec (defun (/) ...) Le lisp fait partie des laquages dit fonctionnels, si un bout de code est utile à plusieurs endroit dans notre programme, on en fait une fonction. Le programme en lui même est une fonction, il est donc important de comprendre comment elles marchent, comment elles se passent des informations et pourquoi il est important de maîtriser ses variables pour ne pas avoir d'effet de bord ...
DXF petit exemple utile ou on crée un jeu de sélection, ou on le parcours, et ou on extrait le code dxf des entités On a pas fini de parler des codes dxf...

Les SCU et introduction aux paires pointées

Quand on regarde les propriété des entités telles quelles sont enregistrées dans la base de donnée du dessin grâce à leur code dxf, on remarque que les points sont noté par rapport au SCG. On va regarder comment faire pour qu'un programme fonctionne quel que soit le Système de Coordonnée Utilisateur... L'occasion de rentrer dans les dxf avec (assoc
Un exemple bidon DC.lsp ou on va apprendre à créer une entité avec (entmake
Et un autre avec l'appel de commande Autocad avec (command DC2.lsp

Manipulations simple d'entités (en cours)

Je me suis peut être un peu emballé dans ma progression d'exercices aussi j'insère ce chapitre.  Je vous propose d'essayer de faire de petites fonctions qui ont été demandées sur le site CadXp ou dont j'ai eu besoins moi même pour mon boulot. Ce sont là plus des macro que de vrai lisp, mais on va pouvoir aborder plusieurs concepts et d'utiliser les commandes Autocad (méfiance suivant vos version). Au programme Copie multiple, Enchainer des rotations (rtf), Décalage fixe de polylignes.

Débugage

Si c'est votre 1ere expérience avec la programmation, les explications de (gile) sur l'éditeur Autolisp d'Autocad (page 11) sont peut etre un peu courtes. Les fonctions de débugage de cet éditeur sont classique, mais vous ne connaissez peut etre pas les classiques. Au programme pas à pas espions, inspection et console.
On va debuger un programme qui fait la somme des longueurs de lignes par calque.. pas facile... Si vous êtes débutant, lisez la suite pour voir les fonctions de débugage, mais vous reviendrez sur le programme plus tard. On verra à cette occasion les commandes pour la manipulation des listes, leur parcours et leur modification. LGL.lsp

Les blocs

Les blocs sont parmi les outils les plus puissants d'Autocad. Quand on regarde un peu la littérature sur ces objets dans les ref Dxf, les blocs sont qualifiés d'entités complexes. Il ne faut pas avoir peur de ce terme. Cela signifie seulement que l'entité Bloc contient des sous entités qui sont les éléments qui le compostent. On va dans ce chapitre apprendre à les parcourir et à les modifier. Ascu0.lsp

2 mots de Visual lisp

Vlisp ou visual lisp est une extension vers VBA du langage Autolisp. On vient de voir avec les blocs que les codes dxf accessibles par Autolisp, s'ils permettent de voir les propriétés des sous objets ont leur limites. D'une part parcourir les sous objets et chercher le code dxf est un peu lourd, d'autre part, à cause de nouvelles fonctionnalité, certaines propriétés peuvent simplement ne pas etre accessible. C'est le cas des blocs dynamiques par exemple. Pour modifier ou lire ces propriétés il faut passer par Visual lisp même si avec Vlisp on à aussi accès aux propriété de tous les autres objets.

Pour voir un 1er code Vlixp, on va refaire le coup de l'exemple qui liste les propriétés DXF en y ajoutant les propriétés VBA d'un objet Dump.lsp

Les blocs dynamiques

L'exemple précédent est un amélioration des blocs présenté sur cette page. Mais pour améliorer le comportement dans les SCU, on a perdu le coté dynamique des blocs. Car comme on vient de le voir, les propriétés des blocs dynamiques ne sont pas accessible en Autolisp. Voici donc notre 1ere utilisation de Visual lisp Ascu.lsp

Polylignes

Autre entité incontournable d'Autocad, les polylignes. On va explorer un peu les polylignes 2d, puis 3d au cours de qqs exercices.
Polylignes 1
insérer des blocs sur les sommets d'une poly2d
Polyligne 2 Discrétiser les arcs de poly2d

un truc

 

 

lien vers cadXP