Aller au contenu

Syntaxe Visual LISP (vla, vlax ...)


(gile)

Messages recommandés

Ce sujet fait suite à celui-ci et va tenter d'expliquer la syntaxe utilisée en LISP pour l'interface COM/ActiveX.

 

L'interface COM a été conçue pour être utilisée avec des langages de type procédural comme le VB(A) ou orienté objet comme C++.

Sans être Orienté Objet stricto-sensu, elle est structurée en objets ayant des propriétés, des méthodes et parfois des évènements (tous les objets COM sont du type vla-object en LISP).

Dans ces langages, on accède aux propriétés et méthodes des objets en utilisant la syntaxe :

object.property

object.method([arguments ...])

C'est la syntaxe VBA qu'on retrouve dans l'Aide aux développeurs > ActiveX and VBA Reference.

 

Il a bien évidemment fallu adapter ça à la syntaxe spécifique du LISP (parenthèses et notation préfixée). Des fonctions spécifiques ont donc été définies :

vlax-get ou vlax-get-property pour l'accès en lecture aux propriétés.

vlax-put ou vlax-put-property pour l'accès en écriture aux propriétés.

vlax-invoke ou vlax-invoke-method pour l'appel des méthodes.

 

De plus, pour chaque propriété et méthode de l'API AutoCAD une fonction directe spécifique a été définie :

vla-get-, vla-put- et vla-

 

On peut donc, pour l'API AutoCAD utiliser indifféremment l'une ou l'autre de ces fonctions (à quelques différences près que nous verrons plus bas). par contre, pour les objets COM extérieurs à AutoCAD (excel ou autre) seule les fonctions vlax-get-property, vlax-put-property et vlax-invoke-method pourront être utilisées (la fonction vla-get-Workbooks, par exemple n'existe pas).

 

Voyons par quelques exemples simples, comment transcrire les expressions données dans l'aide VBA en Visual LISP.

 

À la racine de l'ObjectModel d'AutoCAD on trouve l'Application AutoCAD. Visual LISP fournit une fonction qui ne requiert aucun argument et retourne cet objet : vlax-get-acad-object.

Une des choses qu'on a le plus souvent à faire en Visual LISP est d'accéder au document actif. La propriété ActiveDocument de l'objet Application retourne un objet de type Document qui est le document actif.

 

Extrait de l'aide pour la propriété ActiveDocument :

Specifies the active document (drawing file).

Signature
object.ActiveDocument 

object
              Application
              The object this property applies to. 

ActiveDocument
              Document object; read-write
              The default is drawing.dwg. 

 

La signature nous montre la syntaxe VBA où object est une variable à laquelle est affectée l'Application AutoCAD et ActiveDocument le nom de la propriété.

 

En LISP, après avoir affecté l'application à la variable acadApp par exemple (plus explicite que object):

(setq acadApp (vlax-get-acad-object))

 

On obtient le document actif en utilisant la fonction spécifique :

(vla-get-ActiveDocument acadApp)

Mais on peut aussi utiliser les syntaxes génériques. Pour celles-ci on spécifie en premier argument l'objet sur lequel s'applique la propriété (ou la méthode) et en second argument le nom de la propriété (ou méthode) soit sous forme de chaîne, soit sous forme de symbole quoté.

Les syntaxes suivantes sont équivalentes :

(vlax-get acadApp "ActiveDocument")

(vlax-get acadApp 'ActiveDocument)

(vlax-get-property acadApp "ActiveDocument")

(vlax-get-property acadApp 'ActiveDocument)

 

L'objet Document retourné par les expressions ci-dessus a, lui aussi, des propriétés, ActiveLayer par exemple pour le calque courant.

Là où avec les syntaxes traditionnelles on utiliseraenit un "chaînage" pour obtenir directement le calque courant :

Application.ActiveDocument.ActiveLayer

on utilise en LISP des imbrication d'appels de fonctions :

(vla-get-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object)))

ou

(vlax-get-property (vlax-get-property (vlax-get-acad-object) 'ActiveDocument)'ActiveLayer)

 

Pour définir la valeur d'une propriété, on ajoute simplement la valeur à la suites des arguments utilisé précédemment.

Par exemple, pour définir le calque "0" comme calque courant dans le document actif :

(vla-put-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object)) "0")

ou

(vla-put-property (vla-get-property (vlax-get-acad-object) 'ActiveDocument) 'ActiveLayer "0")

 

 

Avec les méthodes qui requièrent des arguments on ajoute les arguments à la suite du premier argument : l'objet sur lequel est appliquée la méthode.

 

Extrait de l'aide pour la méthode AddCirle :

Creates a circle given a center point and radius.

Signature 
RetVal = object.AddCircle(Center, Radius) 

Object
              ModelSpace Collection, PaperSpace Collection, Block
              The objects this method applies to. 

Center
              Variant (three-element array of doubles); input-only
              The 3D WCS coordinates specifying the circle's center. 
Radius
              Double; input-only
              The radius of the circle. Must be a positive number. 
RetVal
              Circle object
              The newly created Circle object. 
Remarks 
This circle is created on the XY plane of the WCS. 

 

Les arguments pour la méthode AddCircle sont : le centre et le rayon. Le centre, comme tous les points en COM, doit être un variant (pour variants voir ce sujet).

En Visual LISP les arguments pour la fonction vla-AddCircle seront : d'abord l'objet auquel s'applique la méthode, puis les arguments de la méthode.

Exemple, ajouter un cercle de centre 10, 20 et de rayon 30.0 dans l'espace objet du document actif.

(setq circle
      (vla-AddCircle
 (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
 (vlax-3d-point '(10. 20. 0.))
 30.
      )
)

 

La règle pour transcrire la syntaxe VBA en Visual LISP est donc de passer en premier argument aux fonctions Visual LISP l'objet auquel s'applique la méthode ou la propriété et ensuite les éventuels arguments ou valeur de propriété.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

vla ou vlax ?

 

Si la plupart du temps on utilise plutôt les fonction directes vla-* qui permettent un code plus concis, les fonctions vlax-* peuvent parfois être intéressantes.

 

Comme le nom de la propriété est passé comme argument à vlax-get, vlax-get-property, vlax-put, vlax-put-property, plusieurs propriétés peuvent être passées dans une liste, par exemple pour les copier d'une entité à une autre.

 

Exemple avec deux entités de type vla-object (on convertit une entité AutoLISP, ENAME, en vla-object avec la fonction vlax-ename->vla-object et inversement avec vlax-vla-object->ename) pour copier les propriétés calque, couleur et type de ligne de obj1 sur obj2

(foreach prop '(Layer Color LineType)
 (vlax-put obj2 prop (vlax-get obj1 prop))
)

 

Pourquoi deux formes : vlax-get, vlax-put, vlax-invoke d'un côté et vlax-get-property, vlax-put-property, valx-invoke-method de l'autre puisque la syntaxe est la même ?

 

Les premières formes sont les plus anciennes et sont conservées, d'après l'aide, pour des raisons de compatibilité.

Néanmoins ces formes diffèrent parfois par les type de valeur qu'elles retournent ou qu'elles requièrent comme argument ou valeur de propriété.

Le plus souvent, là où les fonctions vla-* ou vlax-get-property, vlax-put-property, valx-invoke-method utilisent des valeurs de type safearray, les fonctions vlax-get, vlax-put, vlax-invoke utilisent des listes LISP.

 

Par exemple, pour récupérer le centre du cercle créé plus haut,

(vla-get-Center circle)

ou

(vlax-get-property circle center)

retournent un variant qui contient un safearray qui contient les coordonnées du centre de cercle.

Pour avoir ces coordonnées sous forme de liste il faut faire :

(vlax-safearray->list (vlax-variant-value (vla-get-Center circle)))

ou

(vlax-safearray->list (vlax-variant-value (vlax-get-property circle 'Center)))

Alors que :

(vlax-get circle 'Center) retourne directement une liste LISP.

 

De même, on aurait pu utiliser la méthode AddCircle directement avec une liste :

(setq circle
      (vlax-invoke
 (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
 'AddCircle
 '(10. 20. 0.)
 30.
      )
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile)

 

Sujet très interressant, mais je souhaiterai apporter une petite précision.

par contre, pour les objets COM extérieurs à AutoCAD (excel ou autre) seule les fonctions vlax-get-property, vlax-put-property et vlax-invoke-method pourront être utilisées (la fonction vla-get-Workbooks, par exemple n'existe pas).

On peut très bien utiliser (vlax-get (vlax-get-or-create-object "Excel.Application") 'Workbooks) à la place d'un vlax-get-property. Cela dépend du nombre d'arguments nécessaires.

Idem en ce qui concerne vlax-invoke.

 

Un exemple pour afficher un message via une boite de dialogue

  (defun MsgBox (Titre Bouttons Message / Reponse WshShell)
   (acad-push-dbmod)
   (setq WshShell (vlax-create-object "WScript.Shell"))
   (setq Reponse (vlax-invoke WshShell 'Popup Message 0 Titre (itoa Bouttons)))
   (vlax-release-object WshShell)
   (acad-pop-dbmod)
   Reponse
 )

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Salut,

 

Depuis la version 2011, l'aide d'AutoCAD a changé et notamment l'aide aux développeurs. Pire, les références ActiveX ont même disparu de l'aide de certaines versions !

 

Face à la grogne des utilisateurs, Autodesk a quand même fini par proposer en téléchargement une nouvelle version de l'aide sur ces références ActiveX (acadauto.chm). On la trouve ici (Documentation > ActiveX API), et elle contient désormais des exemple Visual LISP en plus des exemples VBA.

 

Pour les nostalgiques comme moi, on peut aussi continuer à utiliser la dernière version de l'aide aux développeurs au format CHM (2010) avec la nouvelle aide pour les références ActiveX.


     
  1. Télécharger acad_dev180.zip
  2. Extraire tous les fichiers dans un même répertoire
  3. Télécharger la nouvelle version de l'aide sur les références ActiveX
  4. Remplacer les fichiers acadauto.chm et acad_aag.chm par les nouveaux dans le répertoire d'extraction
  5. Créer un raccourci sur le bureau vers le fichier racine: acad_dev180.chm

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité