Exercices

Développement ObjectARX AutoCAD :
Module de conception de façades (mur Bois/Bloc)

Exercices

Exercices

Evaluez vos connaissances sur AutoCAD :
Questionnaires sur les Xréfs et sur les Blocs.

Exercices ActiveX et Réacteurs pour Visual LISP

ActiveX : 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.

Réacteur : Un réacteur est un objet que vous attachez aux objets dans les dessins d'AutoCAD afin d'avoir un message qui prévient votre application lorsqu'un événement qui vous intéresse se produit.
Par exemple, si un utilisateur déplace une entité à laquelle votre application a attaché un réacteur, votre application recevra un message qui préviendra du déplacement de cette entité.


   Utilisation de l'Automation ActiveX avec des objets AutoCAD
   Utilisation des fonctions Visual LISP avec les méthodes ActiveX
   Lire et mettre à jour des propriétés d'objets
   Attacher des réacteurs à un dessin AutoCAD

Exemple d'utilisation d'un réacteur d'objet : vlr-Object-reactor.

Description :
  Dessine un cercle.
  Ajoute un texte au centre pour afficher l'aire du cercle.
  Attache un réacteur d'objet au cercle et un au texte.

Fonctionnement :
  Si vous modifiez le rayon du cercle, le texte est mis à jour (affiche la nouvelle valeur du rayon).
  Si vous déplacez le cercle, le texte suit le déplacement.
  Si vous déplacez le texte, le cercle suit le déplacement.

;;;--------------------------------------------------------------------
;;; Fonction: C:SYMBOLE()
;;;
;;; Description: Dessine le symbole et attache les réacteurs
;;; aux objets (le cercle et le texte).
;;;
;;; Arguments: Rien
;;;
;;; Retourne : Rien
;;;--------------------------------------------------------------------;

(defun C:SYMBOLE()
   (vl-load-com)
   ;- Accès à l'espace Objet du dessin en cours d'AutoCAD.
   (setq Espace_Obj (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
   ;- Lecture des informations requises :
   (setq Ccentre (getpoint "\nCentre du cercle:"))
   (setq Rrayon (getdist Ccentre "\nRayon du cercle :"))

   (setq Ccercle (vla-AddCircle Espace_Obj (vlax-3d-point Ccentre) Rrayon))
   (vla-put-Color Ccercle 1)
   (setq Mmtexte (vla-addMtext Espace_Obj
                                                 (vlax-3d-point Ccentre)
                                                 (* Rrayon 2)
                                                 (strcat "Aire = " (rtos (vla-get-area Ccercle) 2 2 ))
                          )
    )

    (vla-put-AttachmentPoint Mmtexte acAttachmentPointMiddleCenter)
    (vla-put-InsertionPoint Mmtexte (vlax-3d-point Ccentre))
    (vla-update Mmtexte)

    ;- Attacher des réacteurs persistants aux objets cercle et texte.
    (setq Reac_Cercle   (vlr-Object-reactor
                                          (list Ccercle)
                                           Mmtexte
                                          '(( :vlr-modified . REACTION))
                                    )
    )
    (setq Reac_Texte (vlr-Object-reactor
                                          (list Mmtexte)
                                          Ccercle
                                          '(( :vlr-modified . REACTION))
                                )
    )
    (vlr-pers Reac_Cercle)
    (vlr-pers Reac_Texte)
    (princ)
)

;;;--------------------------------------------------------------------
;;; Fonction: MISAJOUR
;;;
;;; Description: Cette fonction met à jour les objets.
;;;
;;; Arguments :
;;; obj1 = un vla-cercle ou un vla-Mtext
;;; obj2 = un vla-cercle ou un vla-Mtext
;;;
;;; Retourne : Rien.
;;;
;;; Usage: (MISAJOUR vla-object1 vla-object2 )
;;;--------------------------------------------------------------------;

(defun MISAJOUR (obj1 obj2)
   (if (and
          obj2
          (vlax-write-enabled-p obj2) ;; teste si un objet peut être modifié.
          (vlax-read-enabled-p obj1) ;; teste si un objet peut être lu.
       )

      (if (= (vla-get-objectname obj1) "AcDbCircle")
         (progn
           (vla-put-width obj2 (* (vla-get-radius obj1) 2 ))
           (setq TxtAire (strcat "Aire = " (rtos (vla-get-area obj1) 2 2 )))
           (vla-put-textstring obj2 TxtAire)
           (vla-put-insertionpoint obj2 (vla-get-center obj1))
         )
         (progn
           (vla-put-center obj2 (vla-get-insertionpoint obj1))
         )
      )
  )
)

;;;--------------------------------------------------------------------
;;; Function: REACTION
;;;
;;; Description: Fonction rétro-appel (callback) appelée par le réacteur.
;;;
;;; Utilise la fonction: MISAJOUR()
;;;
;;; Arguments:
;;; notifier = Un objet vla. Mis en place par le récteur.
;;; reacteur = Un objet réacteur. Mis en place par l'appel du réacteur.
;;; arg-list = Dans notre cas elle est vide.
;;;
;;; Appel : (REACTION notifier reacteur arg-list)
;;;--------------------------------------------------------------------

(defun REACTION (notifier reacteur arg-list)
   (MISAJOUR notifier (vlr-Data reacteur))
)


Chargement d'une application sous AutoCAD

Usage: Au niveau de la ligne de commande d'AutoCAD, Tapez SYMBOLE