VISUAL LISP - VLISP

VISUAL LISP -VLISP

avant-propos


AutoLISP est à la base pour le traitement des listes je vous l'ai assez dit et redit dans la partie AutoLISP mais une nouvelle forme de stockage des données est apparue avec les fonctions VL, les vlax plus précisément.
Pour un "habitué" de l'AutoLISP c'est quelque peu déroutant au début (et encore après quelques temps d'utilisation), toutefois il va falloir se relever les manches pour mettre les mains dans le cambouis du VLISP (je vais l'appeler comme ça), pas sympa de parler de cambouis pour ce langage.

Pour commencer à "faire du code" en utilisant VLISP vous devez d'abord avoir une bonne compréhension de l'AutoLisp car VLISP n'est pas un remplacement d'AutoLisp, c'est une extension (c'est d'ailleurs la dernière extension du LISP pour AutoCAD).
AutoLisp "standard" est largement utilisé concomitamment avec VLISP, c'est pourquoi une bonne connaissance est un prérequis fondamental et c'est aussi pour ça que j'ai commencé les explications sur ce site par l'AutoLISP.


Une bonne idée, du moins à mes yeux, serait de commencer à écrire en VLISP une de vos routines précédemment écrite en AutoLISP.

Personnellement je ne suis pas en mesure de faire beaucoup de théorie sur le VLISP, ma seule intention est de vous donner une base dans ce que VLISP peut faire et comment s'y prendre.

Il est possible que certaines de mes "explications" ne soient pas "techniquement correcte" car j'ai tendance à expliquer en termes simples en souhaitant faciliter la compréhension.


Depuis la version 2000 d'AutoCAD on a le moyen d'utiliser certaines nouvelles fonctions ayant de nouvelles capacités par rapport à l'AutoLISP, on se rapproche de la programmation "objet"avec VLISP

Le mot est lâché … OBJET

Prenons l'exemple d'un objet de la vie courante, l'objet "voiture", ses propriétés peuvent être (entre autres) couleur, marque, puissance, nombre de roues motrices et elle peut exécuter des actions rouler, klaxonner, démarrer le moteur, reculer…
En effet les entités AutoCAD peuvent être considérées comme des objets et comme un objet elles ont des particularités, calque, point de début, point de fin, longueur, et elles peuvent exécuter (recevoir) des actions : se faire copier (copy), subir une rotation (rotate)…
Mais dans l’acception "objet" de langage "objet" une entité est quelque chose quelque peu différent.

Avec l'AutoLISP nous nous sommes habitués à travailler avec des codes DXF dans des listes, en les interrogeant on obtenait des informations et en modifiant certains codes on exerçait des actions sur les entités (entmod par exemple), avec le VLISP on va travailler sur des "méthodes" dont l'appel aura le mérite d'être assez clair, du moins plus clair que les codes DXF.

Soit dit en passant, ces "nouvelles" fonctions sont d'une puissance sans égale avec l'AutoLISP, du moins à mes yeux mais je sais que dans la communauté mon sentiment est partagé.


Voici la "cartographie" du modèle "OBJET" d'AutoCAD :

Cliquez pour voir "autocad-object-model" ...

Ça y est, vous avez vu ?


Typiquement l'idée qui vient à l'esprit en regardant cette figure, ce dessin, est l'image d'un arbre, que ce soit un arbre végétal avec un tronc des branches puis des feuilles ou un arbre généalogique décrivant un patriarche et ses enfants puis des petits-enfants c'est un bien un arbre dans tous les cas.
Le tronc donne naissance à de grosses branches qui donnent naissance à des branches plus fines et ainsi de suite et la plus fine dépend de la plus grosse, ou l'enfant dépend du parent, la notion d'enfant et de parent est souvent utilisée aussi.
Pour continuer avec parent/enfant, le dessin courant est un enfant de l'objet AutoCAD (l'application) et ce dessina des enfants, les entités, les menus, les calques...


Il y a aussi des formes et des couleurs dans cet arbre, ouah que c'est beau !
De l'orange du vert du bleu clair pour les couleurs
et pour les formes des rectangles aux angles arrondis et des rectangles aux angles droits.

Pour les couleurs,

Orange : ce sont les "choses" qui ne sont ni l’un ni l’autre : la configuration, les menus, traçage, ensembles de sélection, etc.

Vert : ce sont les objets non graphiques (principalement le contenu de tableaux tels que la table des calques, mais aussi les dictionnaires, groupes, présentations, etc.).

Bleu : ce sont  les objets géométriques (c’est-à-dire ce que nous appelons habituellement des "éléments de dessin", les "entités").

Pour les formes :

Rectangulaire à angles droits : ce sont les "objets de collection" – disons que ce sont des conteneurs (pour des objets individuels).
Rectangulaire à angles arrondis : ce sont les objets individuels.

Ainsi, un calque unique a des angles arrondis, quant à la table des calques dans son ensemble elle a des angles droits.

Que sont donc ces objets qui constituent le modèle objet?
Je ne suis pas un grand théoricien toutefois je vais tenter :
Dans le sens de la programmation orientée objet, les objets ne sont que des données composées.
Tel objet représente quelque chose, par exemple un calque, et il a des propriétés telles que son nom ou sa couleur ainsi que des méthodes.
Un objet est une instance d'une classe.
Une classe décrit les règles pour ce qu'un objet doit supporter pour être l'un de ses membres.
Un objet a des propriétés inhérentes et peut également avoir des méthodes et des événements inhérents.

Une collection est un groupe d'objets similaires ayant un conteneur parent commun.
Ce conteneur a un nom unique et, dans la plupart des cas, fournira ses propres méthodes pour accéder aux objets qu'il contient.
Un dictionnaire est un type spécial de collection qui vous permet d’étendre vos propres collections avec des noms.
Visual LISP ne permet pas de créer ou de faire beaucoup avec les collections, il vous permet de les parcourir, de modifier les membres, d’ajouter et de supprimer des membres.
Un dictionnaire vous permet d'ajouter vos propres dictionnaires, de les renseigner, d'ajouter, de modifier et de supprimer leurs membres, ainsi que d'ajouter, de modifier et de supprimer les dictionnaires eux-mêmes.

Les collections courantes dans AutoCAD sont les suivantes : Documents, Calques, Styles de cote, Types de ligne, Blocs.

Les dictionnaires courants dans AutoCAD sont les Layouts (oui ! stockés sous forme de dictionnaire), les états des calques et les objets Xrecord.
Les fonctions de dictionnaire AutoLISP sont dictadd, dictnext, dictremove, dictrename, dictsearch et namedobjdict.

Les propriétés sont simplement des attributs qui définissent le comportement d'un objet, ils sont associés à un objet ou à une collection.
Exemples : nom, hauteur, largeur, angle de rotation, échelle, couleur, calque, type de ligne, etc.

Les propriétés varient en fonction du type d'objet auquel elles sont associées, mais certaines propriétés sont communes à tous les objets et collections.
Collections et dictionnaires fournissent généralement les propriétés Count et Name, ainsi que les méthodes Item et Add.
Seuls les dictionnaires fournissent une méthode de suppression, car vous ne pouvez pas supprimer des collections de Visual LISP.

Les méthodes sont des fonctions intégrées qu'un objet fournit pour accéder à des propriétés spéciales, les modifier ou effectuer des actions spéciales sur l'objet lui-même.
Exemples de méthodes courantes : la rotation, l'effacement, la copie, l'échelle et le décalage.
Vous remarquerez peut-être que ces commandes ressemblent aux commandes AutoCAD Modify. Et bien, en substance, ils ne sont que cela, mais avec une légère différence.
Alors que les commandes AutoCAD Modify sont de nature générale, elles doivent valider l'utilisation de l'objet pour chaque exécution.
Les méthodes sont fournies par leur objet hôte et, par conséquent, seules les méthodes prises en charge sont fournies par chaque objet.
Cela paraît confus?
En d’autres termes, la commande OFFSET peut être utilisée à tout moment, mais si vous essayez de décaler un objet TEXT, un message d’erreur AutoCAD s’affiche. Cependant, l'objet TEXT lui-même fournit diverses méthodes, telles que copier, faire pivoter, mettre à l'échelle et déplacer, mais pas le décalage.
Vous pouvez donc "invoquer" une méthode à partir d'un objet et vous assurer qu'elle est valide pour une utilisation avec cet objet.

En aucun cas, je répète, il ne faut confondre ces "objets" avec les entités AutoCAD c'est la nuance exprimée par la programmation orientée "objet".
Les objets de cet "arbre" vont au-delà de la notion d'entité.
Les menus par exemple sont des objets ainsi que d'autres objets dans cet arbre comme les réglages de configuration ou même le dessin entier (et tous les autres dessins ouverts en même temps).
De ce fait, l'objet "le plus haut" (le tronc)(la racine) est l'application AutoCAD elle-même.

Tout d'abord, je vais tenter de clarifier comment accéder à ces objets et en extraire certaines valeurs.
Je garde l'exemple des calques : sur le graphique (l'arbre), on peut voir que le chemin commence par "Application".
À partir de là, il faut passer à "Documents"(notez le pluriel), puis à un "document"(singulier) spécifique et enfin à "layers".
Pour ne pas faire trop de tests dans cet exemple je vais demander la couleur du calque 0 (zéro) car je suis certain de trouver un tel calque dans n'importe quel dessin AutoCAD et je n'ai pas besoin d'en vérifier l'existence.
Ce chemin est compréhensible : dans la session AutoCAD (Application), plusieurs dessins (Documents) sont ouverts, et dans l’un d’eux, celui en cours de modification (Document), on trouve la table des calques qui est le sujet à traiter.

Pour mémoire : il faut en premier lieu faire un appel à (vl-load-com).
Cet appel charge le support ActiveX complet et est donc absolument nécessaire dans chaque programme ActiveX.

Faisons donc ce petit test pour connaître la couleur du calque 0 (zéro) du dessin courant et voyons ce qui en ressort :

( defun test ( )
     ( vl-load-com )
     ( setq AcadObj ( vlax-get-acad-object ) )
     ( setq AcadDoc ( vla-get-ActiveDocument acadObj ) )
     ( vlax-get-property
          ( vlax-invoke-method
               ( vlax-get-property AcadDoc "Layers" )
               "Item"
                "0"
          ) ;_ Fin de vlax-invoke-method
         "Color"
      ) ;_ Fin de vlax-get-property
) ;_ Fin de defun

Ça change de l'AutoLisp?, non ? on s'y fait je vous rassure…

Si vous lancez cette fonction (test) il vous est répondu la couleur du calque 0 (zéro) sous forme de nombre entier (integer) utilisant la définiton classique d'AutoCAD, 1 pour rouge, 2 pour jaune....

C'est bien le cas chez vous aussi ?

Haut de pageRetour menu Fonctions VL

à suivre..


18 avril 2018,
mise à jour et compléments le 15 décembre 2018.