(gile) Posté(e) le 14 janvier 2012 Posté(e) le 14 janvier 2012 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.propertyobject.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.ActiveLayeron 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 - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 14 janvier 2012 Auteur Posté(e) le 14 janvier 2012 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 - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 15 janvier 2012 Posté(e) le 15 janvier 2012 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
CadFrank Posté(e) le 19 janvier 2012 Posté(e) le 19 janvier 2012 Bonjour, Non, Mais ou est la suite.... Je suis affamé d'information... non je rigole mais comme il est précisé plus au très intéressant le sujet. Très hate a la suite. Salutations !
(gile) Posté(e) le 28 juin 2013 Auteur Posté(e) le 28 juin 2013 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. Télécharger acad_dev180.zipExtraire tous les fichiers dans un même répertoireTélécharger la nouvelle version de l'aide sur les références ActiveXRemplacer les fichiers acadauto.chm et acad_aag.chm par les nouveaux dans le répertoire d'extractionCréer un raccourci sur le bureau vers le fichier racine: acad_dev180.chm Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant