CadFr
 
Faq_VLISP

F.A.Q. Visual LISP

Bienvenue dans la FAQ Visual LISP. Vous trouverez ici des réponses à des questions fréquemment posées à propos des extensions AutoLISP fournies avec Visual LISP pour créer des automatisations ActiveX.
La FAQ est une section en évolution constante. Si votre question ne trouve pas de réponse dans cette section, vous pouvez nous contacter via la rubrique contact du site.


Comment transformer une entité AutoLISP classique en un objet Visual LISP (vla)

Utilisez la fonction (vlax-ename->vla-object nom_entite) pour transformer une entité AUTOLISP en un objet Visual LISP (VLA).

Exemple : Saisissez le code suivant dans la fenêtre de la Console Visual LISP

_1$ (setq Ccercle (vlax-ename->vla-object (car (entsel))))
Sélection d'un cercle.
#<VLA-OBJECT IAcadCircle 0d0e06b4>

_1$ (setq Ray_Ccercle (vla-get-radius Ccercle))
1.00586

▲haut de page

Comment transformer un objet Visual LISP (vla) en une entité AutoLISP classique

Utilisez la fonction (vlax-vla-object->ename objet_vla) pour transformer un objet Visual LISP en une entité AUTOLISP.

Exemple:

_1$ (vlax-vla-object->ename Ccercle)
<Nom d'entité: 7ef68f78>

▲haut de page

Autre façon que entsel pour demander à l'utilisateur de sélectionner un objet unique.

Utilisez la méthode vla-Getentity pour sélectionner un objet unique.

Exemple :

(vl-load-com)
(if (not CadUtil)
    (setq CadUtil (vla-get-utility (vla-get-ActiveDocument(vlax-get-acad-object))))
)
(vla-getentity CadUtil 'Objet_Vla 'Pt_Sel "\nSélectionnez un Objet unique :")

L'objet sélectionné est placé dans la variable Objet_Vla.

▲haut de page

Comment peut-on savoir si un objet sélectionné est une référence externe.

Utilisez la propriété IsXRef du bloc.

Exemple de code:

(vl-load-com)

(if (not   CadUtil)
    (setq CadUtil (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object)))))

(if (not  CadBlocs)
    (setq CadBlocs (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)))))

(vla-getentity CadUtil 'Bloc_Xref 'Pt_Sel "\nSélectionnez une Xréf :")

(if (and (= (vla-get-objectname Bloc_Xref) "AcDbBlockReference")
            (= :vlax-true (vla-get-IsXRef (vla-item CadBlocs (vla-get-name Bloc_Xref))))
    )
    (alert "L'objet sélectionné est une Référence externe")
    (alert "L'objet sélectionné n'est pas une Référence externe")
) ▲haut de page

Comment récupérer le rayon de la courbure entre deux sommets d'une polyligne.

La courbure est la tangente du 1/4 de l'angle de l'arc entre le sommet choisi et le prochain sommet dans la liste des sommets de la polyline.

Cette fonction retourne le rayon de la courbure (Courbure) entre les deux sommets (Sommet et Sommet_Suiv)

(defun Rayon_de_Courbure(Sommet   Sommet_Suiv   Courbure)
    (* 0.25 (distance Sommet Sommet_Suiv) (/ (+ Courbure 1) Courbure))
)

▲haut de page

Comment obtenir la liste des présentations en espace papier.

La fonction AutoLISP (LAYOUTLIST) retourne une liste de toutes les présentations en espace papier du document (dessin) en cours.

Exemple :

(setq liste_Presentations (layoutlist)) retourne ("PLAN" "FACADES" "PERSPECTIVE")
▲haut de page

Comment récupérer une présentation donnée.

La collection Layouts, contient toutes les présentations du dessin. Pour sélectionner un membre donné d'un objet Collection, utilisez la méthode Item .

(setq Ppresentations (vla-get-layouts (vla-get-ActiveDocument (vlax-get-Acad-Object))))

En supposant qu’une présentation nommée "PLAN" existe dans le document en cours, le fragment de code suivant définit une variable Ep_Plan et l’attribue à cette présentation :

(setq Ep_Plan (vla-item Ppresentations "PLAN")) ▲haut de page

Comment récupérer la liste des blocs du dessin courant ?

La collection Blocks, Contient tous les blocs du dessin.

La fonction suivante retourne la liste des blocs du dessin courant :

(defun CF:LISTE-DES-BLOCS (/ Blocs_Collection Blocs_Liste)
   (setq Blocs_Collection (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))))
   (setq Blocs_Liste nil)
   (vlax-for Element Blocs_Collection
     (if (and (= :vlax-false (vla-get-islayout Element))
                (= :vlax-false (vla-get-isxref Element))
                (/= (substr (vla-get-name Element) 1 1) "*"))

         (setq Blocs_Liste (append Blocs_Liste (list (vla-get-name Element))))
     )
   )
   Blocs_Liste
)

▲haut de page

Comment récupérer l’aire d’un objet ?

La fonction suivante retourne l'aire d'un objet :

(defun c:AireObjet (/ Entite courbe Aire)
   (if (setq Entite (entsel "\Sélectionnez un Objet :"))
      (progn
         (setq courbe (vlax-ename->vla-object (car Entite)))
         (if
              (vl-catch-all-error-p
              (setq Aire (vl-catch-all-apply 'vlax-curve-getArea (list courbe)))
              )
              nil
              Aire
         )
      )
   )
)

▲haut de page

Comment faire en Visual LISP pour tester l’existence d’un bloc ?

Exemple de fonction qui teste l'existence d'un bloc dans le dessin.
Retourne T si un bloc ou une xref de nom 'Nom_Bloc' existe dans le dessin courant.
nil sinon.

(defun CF_BlocExiste (Nom_Bloc / Collection Occur existe)
    (vl-load-com)
    (setq existe nil)
    (vlax-for Collection (vla-get-layouts (vla-get-ActiveDocument (vlax-get-acad-object)))
           (vlax-for Occur (vla-get-block Collection)
                 ( if   ( and
                              ( = (vla-get-objectname Occur) "AcDbBlockReference")
                              ( = (strcase (vla-get-name Occur)) (strcase Nom_Bloc))
                        )
                   (setq existe T)
                )
          )
    )
existe
)

Exemple d'appel :
(CF:BlocExiste "CARTOUCHE")

▲haut de page

Comment faire en Visual LISP pour renommer un bloc ?

Cette fonction change le nom bloc nommé 'AncienNom' par 'NouveauNom'.

(defun CF_RenomBloc (AncienNom NouveauNom / LeBloc)
        (setq LeBloc (vla-Item  (vla-get-blocks  (vla-get-ActiveDocument ( vlax-get-acad-object))) AncienNom))
        (if ( vl-catch-all-error-p  ( vl-catch-all-apply 'vla-put-Name (list LeBloc NouveauNom)))
              (princ "\n... Impossible de renommer le bloc! ...")
              (princ (strcat "\nLe bloc '" AncienNom "' renommé en '" NouveauNom "' avec succès."))
        )
(princ)
)

Exemple d'appel :
(CF_RenomBloc "PORTE_90" "PORTE_110")

▲haut de page

Comment ouvrir un fichier sans avoir à spécifier l'application qui l'a créé ?

Cet exemple ouvre un document de type Word se trouvant à la racine du disque principal :

(vl-load-com)
(setq shell (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application" ))
(vlax-invoke-method shell
                                 'OPEN
                                 "C:\\RAPPORT.DOC"
)
(vlax-release-object shell)

Vous pouvez utiliser aussi la fonction ShellExecute de l'API Windows.

(setq shell (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application"))
(vlax-invoke-method shell 'ShellExecute
                                        "C:\\RAPPORT.DOC"
                                        nil
                                        nil
                                        nil
                                        nil
)
(vlax-release-object shell)

Cet exemple lance le navigateur Internet par défaut sur le site de CADFR :

(setq shell (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application"))
(vlax-invoke-method shell 'ShellExecute
                                 "www.cadfr.com"
                                 nil
                                 nil
                                 nil
                                 nil
)
(vlax-release-object shell)

▲haut de page
 

© tous droits réservés, CadFr 2007 - 2010 | Accueil | Contact | Confidentialité
5 visiteurs connectés