
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).
- Comment transformer un objet Visual LISP (vla) en une entité AutoLISP classique
- Autre façon que entsel pour demander à l'utilisateur de sélectionner un objet unique
- Comment peut-on savoir si un objet sélectionné est une référence externe
- Comment récupérer le rayon de la courbure entre deux sommets d'une polyligne
- Comment obtenir la liste des présentations en espace papier.
- Comment récupérer une présentation donnée.
- Comment récupérer la liste des blocs du dessin courant.
- vla-sendCommand ?
- Comment obtenir la valeur actuelle d´une variable système AutoCAD ?
- Comment récupérer l’aire d’un objet ?
- Comment faire en Visual LISP pour tester l’existence d’un bloc ?
- Comment faire en Visual LISP pour renommer un bloc ?
- Comment ouvrir un fichier sans avoir à spécifier l´application qui l´a créé ?
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
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>
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 pageComment 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))
)
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 pageComment 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
)
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
)
)
)
)
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")
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")
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)
