Utilisation de l'Automation ActiveX avec des objets AutoCAD

Introduction

L'Automation ActiveX est une nouvelle façon de travailler avec les commandes de dessin AutoCAD. Dans plusieurs situations, ActiveX travaille plus rapidement que les fonctions traditionnelles AutoLISP dans la manipulation des commandes de dessin AutoCAD.


ActiveX est une interface de programmation qui est utilisable par plusieurs langages et environnements, tel que le C++, Visual Basic(R), et Delphi(TM). Lorsque vous travaillez avec ActiveX dans Visual LISP, vous travaillez avec le même modèle de l'objet, les mêmes propriétés et méthodes, ce qui permet une manipulation à partir d'autres environnements de programmation.


Objet
   Entité contenant du code (méthodes, procédures, fonctions) et des données (propriétés) ainsi qu'une liste d'événements.

Propriété
   Données d'un objet (aspect visuel, valeur...).

Evénement
   Action utilisateur ou système agissant sur un objet et déclanchant le code correspondant.

Méthode
   Code prédéfini se rapportant à un type d'objet.

Les objets sont les blocs d'une construction principale d'une application ActiveX. Par exemple, un dessin AutoCAD tel que les lignes, arcs, polylignes, et cercles ont longtemps été considérés comme des objets. Mais dans le schéma d'ActiveX, beaucoup d'autres éléments d'AutoCAD sont considérés comme des objets. Par exemple, tous les éléments suivants sont représentés comme des objets :


     Le style, comme les types de lignes et leur dimension.
     Les structures d'organisations, comme l'épaisseur, les groupes, et les blocs.
     L'afficheur de dessin, tel que le view et le viewport.
     L'espace objet et espace papier.

Même le dessin et l'application AutoCAD elle-même sont considérés comme des objets.

En Visual LISP, l'Automation ActiveX inclus plus de fonctions que celles fournis par les fonctions LISP tels que entget, entmod, et setvar. Comparés aux fonctions standards AutoLISP, ActiveX fonctionne plus vite, fournit un accès plus facile aux propriétés des objets, et d'une manière plus lisible. Par exemple, pour accéder au rayon d'un cercle avec les fonctions traditionnelles AutoLISP, vous devez utiliser [entget] pour obtenir une liste d'entités, et [assoc] pour trouver la propriété que vous cherchez. En outre, vous devez connaître le code DXF associé à cette propriété, on l'obtient en utilisant [assoc] :



(setq rayon (cdr (assoc 40 (entget entité_cercle))))

Avec une fonction ActiveX, vous demandez simplement le rayon du cercle :

(setq rayon (vla-get-radius objet_cercle))

Il y a des éléments que vous pouvez utiliser seulement avec ActiveX. Par exemple, accéder à un objet à partir d'un reacteur callback functions, vous devrez utiliser ActiveX. Voir la rubrique "Attacher des réacteurs à un dessin AutoCAD"


Accès aux objets AutoCAD

L'objet Application est la racine du model objet de l'Automation ActiveX d'AutoCAD. A partir de l'objet Application, vous pouvez accéder à tous les autres objets, ainsi que les propriétés ou méthodes assignées a ces objets.


La première chose que vous avez besoin de faire pour accéder aux objets AutoCAD avec ActiveX est d'établir une connexion avec l'objet Application d'AutoCAD. Utiliser la fonction vlax-get-acad-object
pour établir cette connexion, comme l'exemple suivant :


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

La fonction vlax-get-acad-object retourne un pointeur sur l'objet Application d'AutoCAD. Dans l'exemple précédent, le pointeur est mémorisé dans une variable CadApplication. Cette valeur retournée existe comme un unique type de donnée Visual LISP appelé VLA object (Visual LISP ActiveX object). Lorsque vous vous référez aux objets AutoCAD avec les fonctions ActiveX, vous devez spécifier un type d'objet VLA. C'est pour cette raison, que vous ne pouvez pas utiliser entget pour accéder à un objet et ensuite se référer à cet objet comme une fonction ActiveX.


Remarque :
Bien que vous ne puissiez pas utiliser l'objet, retourné par entget, directement avec une fonction ActiveX, vous pouvez le convertir en un objet VLA en utilisant la fonction : vlax-ename->vla-object.


Exemple :
Dessinez un cercle dans AutoCAD, ensuite Entrez ce qui suit sur la ligne de commande de la fenêtre Console de Visual LISP (Touche F6) :
_$(setq rayon (cdr (assoc 40 (entget (car (entsel))))))
Sélectionnez le cercle, l'écran affiche (Ex):
25.5738


Maintenant entrez ce qui suit :
_$(setq rayon (vla-get-radius (car (entsel))))

Le message d'erreur suivant s'affiche (Ex): ; erreur: type d'argument incorrect: VLA-OBJECT <Nom d'entité: 7ef66ef0>

Maintenant on va convertir l'objet cercle en un objet VLA :

_$(setq rayon (vla-get-radius (vlax-ename->vla-object (car (entsel)))))

Sélectionnez maintenant le même cercle précédent, l'écran affiche alors la bonne réponse :
25.5738

Visualisation des propriétés associées à un Objet

Pour connaître les propriétés associées a un objet Application, vous pouvez sélectionner la variable qui pointe sur l'objet (CadApplication, dans l'exemple précédent), et cliquez sur le bouton Inspecter... de la barre d'outils Affichage de Visual LISP (ou dans le menu Vue de Visual LISP, choisissez Inspecter... ou cliquez sur le bouton droit de la souris puis choisir Inspecter...):



Vous pouvez identifier beaucoup de propriétés inscrites dans la fenêtre de l'inspecteur d'objets VLA. Par exemple, "FullName" est le nom de fichier exécutable d'AutoCAD, "Version" la version d'AutoCAD , et "Caption" est le contenu de la barre de titre de la fenêtre AutoCAD. Une propriété identifiée comme un #<VLA OBJECT...> renvoie à un autre objet AutoCAD ActiveX. L'objet Application a deux propriétés similaires, "ActiveDocument" et "Preferences". Si vous regardez le diagramme du model objet d'AutoCAD, vous verrez que ces deux objets sont justes en dessous de l'objet Application dans le model hiérarchique. Pour connaître les propriétés associées à un objet, double cliquez sur la ligne de l'objet dans la fenêtre de l'Inspecteur (ou cliquez sur le bouton droit de la souris puis choisir Inspect).


Voici la fenêtre de l'Inspecteur pour l'objet Preferences :


Le dessin Courant d'AutoCAD

En suivant la hiérarchie du model objet d'AutoCAD, la propriété ActiveDocument de l'objet Application vous mène à l'objet Document. Qui représente le dessin courant d'AutoCAD :


   (setq CadDessin (vla-get-ActiveDocument CadApplication))

L'objet Document possède de nombreuses propriétés. L'accès aux objets non-graphiques (épaisseurs, groupes, et types de ligne par exemple) est fourni par les propriétés telles que Layers, Groups, et Linetypes. Pour accéder aux objets graphiques dans un dessin AutoCAD, vous aurez besoin d'accéder ou à l'espace objet du dessin (à travers la propriété ModelSpace), ou bien à l'espace papier (à travers la propriété PaperSpace). Par exemple :


   (setq Espace_Obj (vla-get-ModelSpace CadDessin))

A ce moment là, vous avez accès au dessin AutoCAD et vous pouvez y ajouter des objets. Par exemple, vous pouvez ajouter un cercle à l'espace objet à l'aide de la méthode vla-AddCircle.


L'exemple suivant ajoute à l'espace objet d'AutoCAD un cercle de centre le point '(10.0 10.0 0.0) et de rayon 2.5:

(defun C:MonCercle()
  (vl-load-com)
  (setq CadApplication (vlax-get-acad-object ))
  (setq CadDessin       (vla-get-ActiveDocument CadApplication))
  (setq Espace_Obj     (vla-get-ModelSpace CadDessin))
  (setq Ccercle            (vla-addCircle Espace_Obj (vlax-3d-Point 10.0 10.0 0.0) 2.5))
  (princ)
)

Ouvrez un nouveau fichier dans Visual LISP : Exemple Ccercle.lsp.
Entrez le code précédent.
Dans le menu Outils (Anglais : Load) de Visual LISP, choisissez Charger le texte dans l'édieur (Anglais : Load Text in Editor).
Dans la fenêtre Visual LISP Console, Tapez (c:moncercle) ensuite appuyez sur la touche Entrée.
AutoCAD dessine alors un cercle de centre le point de coordonnées 10.0,10.0,0.0 et de rayon 2.5.