Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

[AUTOCAD] [LISP] Récupérer le nom d'un xref

15 RÉPONSES 15
RÉSOLU
Répondre
Message 1 sur 16
SET040
623 Visites, 15 Réponses

[AUTOCAD] [LISP] Récupérer le nom d'un xref

Bonjour à tous,

 

Existe-il un moyen sous lisp de récupérer (et de stocker sous forme de variable) le nom d'un Xref ?

 

Je ne cherche pas un nom de ce style <Nom d'entité: 1fb66edbc90> mais bien le vrai nom du Xref.

 

Par exemple : toto.pdf ou tata.jpg

 

Et si possible sans l'extension 🙂

 

D'avance un tout grand merci 

15 RÉPONSES 15
Message 2 sur 16
_gile
en réponse à: SET040

Salut,

 

Depuis l'arrivée des objets "fond de plan" (PDF, DWF, DGN) et de la palette "Références externes", il règne une grande confusion avec l'appellation "xref" dans laquelle on a tendance à regrouper les "xrefs" stricto-sensu, les images raster et les "fonds de plans".

 

Or en programmation on a besoin d'une plus grande rigueur.

Au sens strict, une "xref" est un fichier DWG insérés dans le dessin comme référence externe, c'est une variété de référence de bloc (nom DXF : "INSERT").

Une image est une "image raster" (nom DXF : "IMAGE").

Un fichier PDF, DWF, DGN inséré est appelé un fond de plan ou underlay (noms DXF "PDFUNDERLAY", "DWFUNDERLAY", "DGNUNDERLAY").

 

Ce sachant, on peut récupérer le "nom" de la "référence externe" en fonction de son type :

 

(defun xrefName	(ename / elst dxfName)
  (setq	elst	(entget ename)
	dxfName	(cdr (assoc 0 elst))
  )
  (cond
    ((= dxfName "INSERT")
     (getpropertyvalue ename "BlockTableRecord/Name")
    )
    ((= dxfName "IMAGE")
     (getpropertyvalue ename "ImageName")
    )
    ((member dxfName
	     '("PDFUNDERLAY" "DWFUNDERLAY" "DGNUNDERLAY")
     )
     (getpropertyvalue ename "DefinitionId/Name")
    )
  )
)

 

 Exemple d'utilisation :

 

(defun c:test (/ ent name)
  (if (setq ent (car (entsel)))
    (if	(setq name (xrefName ent))
      (alert name)
      (alert "Pas une xref")
    )
  )
  (princ)
)

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 3 sur 16
_gile
en réponse à: _gile

La routine 'xrefName' ci-dessus renvoie le nom de la "référence externe" tel qu'affiché dans la palette.

Pour avoir juste le nom du fichier source sans l'extension on peut utiliser celle-ci :

(defun xrefName	(ename / elst dxfName)
  (setq	elst	(entget ename)
	dxfName	(cdr (assoc 0 elst))
  )
  (cond
    ((= dxfName "INSERT")
     (vl-filename-base (cdr (assoc 1 (tblsearch "block" (cdr (assoc 2 elst))))))
    )
    ((member dxfName '("IMAGE" "PDFUNDERLAY" "DWFUNDERLAY" "DGNUNDERLAY"))
     (vl-filename-base (cdr (assoc 1 (entget (cdr (assoc 340 elst))))))
    )
  )
)

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 4 sur 16
SET040
en réponse à: _gile

Merci pour toutes ces précisions Giles, en effet je mettais tout dans le même panier.

 

A partir du moment où un objet n'appartenait pas au dessin, je le catégorisais automatiquement de "xref", sans distinction.

 

Ton code marche impeccable, un grand merci !

Message 5 sur 16
reb_c2
en réponse à: _gile

Hello Gilles, @_gile,

 

Super, le CODE, par contre comment récupérer d'autres PROPRIETES de la XREF, comme son CHEMIN ?

 

Je suppose qu'il faut attaquer avec :     (getpropertyvalue   ename   "XXX")     où peut-on trouver toutes les syntaxes possibles pour "XXX" ?

 

J'ai trouvé la fonction (dumpallproperties ...  ... ) mais il m'affiche une erreur :  Demande ADS erronée

 

Encore et toujours une histoire de syntaxe...

 

Je te remercie, pour info j'avais lancé ce sujet...

 

Christian


Formateur Indépendant, Consultant, AutoCAD, AutoCAD LT, REVIT MEP, INVENTOR -
www.rebcao.fr

Christian REB

Message 6 sur 16
_gile
en réponse à: reb_c2

La fonction dumpallproperties affiche, dans la fenêtre de texte, toutes les propriétés pour l'entité/object (ENAME)qui lui est passé en argument.



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 7 sur 16
reb_c2
en réponse à: reb_c2

Merci Gilles, je l'avais trouvé en farfouillant l'aide LISP...

 

Finalement, ça marche :

 

  (dumpallproperties e1 ) me donne bien toute la liste des PROPRIETES de mon OBJET ici e1 (= ma XREF)

 

Du coup, le chemin de ma XREF sera :

 

  (getpropertyvalue   e1   "BlockTableRecord/PathName"  )

 

Je fais de l'AUTO REPONSE à mon sujet...  😄

 

Christian


Formateur Indépendant, Consultant, AutoCAD, AutoCAD LT, REVIT MEP, INVENTOR -
www.rebcao.fr

Christian REB

Message 8 sur 16
Luna1
en réponse à: SET040

Coucou @reb_c2 
Si tu veux accéder au chemin de ton XREF, tu peux passer par les propriétés Visual ou bien DXF.
En Visual LISP par exemple, si tu sélectionnes ton objet :

 

command: (setq XREF (vlax-ename->vla-object (car (entsel "\nSélectionner une référence externe : "))))
command: (vlax-dump-object XREF)
; IAcadExternalReference: Interface IAcadExternalReference
; Valeurs de propriétés:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 00007ff76b526d40>
;   Document (RO) = #<VLA-OBJECT IAcadDocument 000001a5a60148a8>
;   EffectiveName (RO) = "XREF_C3744_CHARME_2021041_plan topo_LAMBERT CC46 (ID 206032)"
;   EntityTransparency = "DuCalque"
;   Handle (RO) = "2F33AE"
;   HasAttributes (RO) = 0
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 000001a5d37410e8>
;   InsertionPoint = (0.0 0.0 0.0)
;   InsUnits (RO) = "Mètres"
;   InsUnitsFactor (RO) = 1.0
;   IsDynamicBlock (RO) = 0
;   Layer = "UBS-900-XREF TOPO"
;   LayerPropertyOverrides (RO) = -1
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "ByLayer"
;   Name = "XREF_C3744_CHARME_2021041_plan topo_LAMBERT CC46 (ID 206032)"
;   Normal = (0.0 0.0 1.0)
;   ObjectID (RO) = 46
;   ObjectName (RO) = "AcDbBlockReference"
;   OwnerID (RO) = 47
;   Path = "..\\..\\..\\206032\\L\\L\\XREF_C3744_CHARME_2021041_plan topo_LAMBERT CC46 (ID 206032).dwg"
;   PlotStyleName = "ByLayer"
;   Rotation = 0.0
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 000001a5d37402a0>
;   Visible = -1
;   XEffectiveScaleFactor = 1.0
;   XScaleFactor = 1.0
;   YEffectiveScaleFactor = 1.0
;   YScaleFactor = 1.0
;   ZEffectiveScaleFactor = 1.0
;   ZScaleFactor = 1.0
T

 

Avec la listes des propriétés Visual LISP de ta référence ci-dessus, on peut remarquer la propriété 'Path', qui correspond au chemin pour ton dessin DWG. Ainsi tu peux récupérer son chemin via

 

command: (vla-get-Path XREF)
"..\\..\\..\\206032\\L\\L\\XREF_C3744_CHARME_2021041_plan topo_LAMBERT CC46 (ID 206032).dwg"

 

Je t'ai affiché la liste de l'ensemble des propriétés Visual LISP de l'objet XREF afin de voir que la date par exemple n'ai pas visible ici.

 

En LISP vanilla, tu peux y accéder à partir de la définition de bloc de ta référence externe, comme ceci :

 

command: (setq XREF (car (entsel "\nSélectionner une référence externe : ")))
<Nom d'entité: 1a5b1e56ae0>
command: (setq NAME (cdr (assoc 2 (entget XREF))))
"XREF_C3744_CHARME_2021041_plan topo_LAMBERT CC46 (ID 206032)"
command: (setq XREF (tblsearch "BLOCK" NAME))
((0 . "BLOCK") (2 . "XREF_C3744_CHARME_2021041_plan topo_LAMBERT CC46 (ID 206032)") (70 . 36) (4 . "") (10 0.0 0.0 0.0) (1 . "..\\..\\..\\206032\\L\\L\\XREF_C3744_CHARME_2021041_plan topo_LAMBERT CC46 (ID 206032).dwg") (-2 . <Nom d'entité: 1a59c4a0e60>))
command: (setq PATH (cdr (assoc 1 XREF)))
"..\\..\\..\\206032\\L\\L\\XREF_C3744_CHARME_2021041_plan topo_LAMBERT CC46 (ID 206032).dwg"

 

Donc ici aussi, la date n'est pas visible dans la liste DXF de ta référence externe.

 

Je continue de creuser pour voir comment accéder aux propriétés que tu as énuméré mais pour l'instant, à part son chemin je ne trouve pas. Très certainement contenu dans un dictionnaire ou une extension de dictionnaire, à voir.

 

PS: Ou bien en effet en passant par la fonction (getpropertyvalue) avec les propriétés "External Path" et "BlockTableRecord/PathName" comme suggéré par @_gile 🙂

Bisous,
Luna

Message 9 sur 16
_gile
en réponse à: reb_c2


@reb_c2 wrote:

Du coup, le chemin de ma XREF est : 

  (getpropertyvalue   e1   "BlockTableRecord/PathName"  )


Tu peux faire plus simple encore :

(getpropertyvalue e1 "ExternalPath")

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 10 sur 16
reb_c2
en réponse à: _gile

Voila, sans prétention, mon Ch'Tit CODE :

 

;;; -------------------------
;;; informations XREF
;;; -------------------------
(defun C:XREFINFO()

       (setq ENT nil);setq

       (while (= ENT nil)
            (setq ENT (entsel "\Sélectionnez une XREF...")
             );setq
       (if ENT
              (setq ENT00 (car ENT) )
       );if
       );while

       (setq  XREFPATH (getpropertyvalue   ENT00   "BlockTableRecord/PathName" )
              XREFNAME  (getpropertyvalue   ENT00   "BlockTableRecord/Name" )
              XREFLAYER (cdr (assoc 8 (entget ENT00) ) )  NBCARPATH (- (strlen XREFPATH) (strlen XREFNAME) )
              XREFDIR   (substr XREFPATH   1 (- NBCARPATH 4 ) ) ;;; -4 --> .DWG !)
       );setq
       (prompt "\nNom XREF     : ") (princ XREFNAME)
       (prompt "\nDossier XREF : ") (princ XREFDIR)
       (prompt "\nCalque XREF  : ") (princ XREFLAYER)
       ;;; -------------------------
       ;;; HELP propriétés XREF
       ;;; -------------------------
       (defun C:XREFHELP()
              (dumpallproperties ENT00 )
       (princ)
);defun
;;; -------------------------
(princ)
);defun
;;; ----- fin PROGRAMME ------
(prompt "\n\nTaper   XREFINFO   pour obtenir les informations d'une XREF...")
(prompt "\n\nTaper   XREFHELP   après avoir utilisé XREFINFO, donne les infos sur la XREF...")
(princ)
 
Par contre, il n'y a pas de PARAMETRE qui correspond au nom du  .DWG sans le CHEMIN (PATH) ?
 
Christian

Formateur Indépendant, Consultant, AutoCAD, AutoCAD LT, REVIT MEP, INVENTOR -
www.rebcao.fr

Christian REB

Message 11 sur 16
_gile
en réponse à: reb_c2


@reb_c2 wrote:
Par contre, il n'y a pas de PARAMETRE qui correspond au nom du  .DWG sans le CHEMIN (PATH) ?

(vl-filename-base path)

 

PS : quand tu poste du code, utilise ce bouton :

_gile_0-1702316324611.png

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 12 sur 16
reb_c2
en réponse à: Luna1

Merci Luna, @Luna1  pour ton CODE,

 

Effectivement, on ne trouve rien sur la date de la XREF.

 

Je remarque aussi que l'on a plusieurs syntaxes différentes pour obtenir plus ou moins les mêmes informations ?

 

Christian


Formateur Indépendant, Consultant, AutoCAD, AutoCAD LT, REVIT MEP, INVENTOR -
www.rebcao.fr

Christian REB

Message 13 sur 16
reb_c2
en réponse à: _gile

Oui PapaLisp @_gile  😊

 

Merci, c'est fait. Je me suis toujours demandé où il était ce bouton ???   🙄

 

Christian


Formateur Indépendant, Consultant, AutoCAD, AutoCAD LT, REVIT MEP, INVENTOR -
www.rebcao.fr

Christian REB

Message 14 sur 16
reb_c2
en réponse à: reb_c2

Il reste à trouver une astuce pour obtenir la DATE du Fichier XREF ?   🙄

 

Christian


Formateur Indépendant, Consultant, AutoCAD, AutoCAD LT, REVIT MEP, INVENTOR -
www.rebcao.fr

Christian REB

Message 15 sur 16
_gile
en réponse à: reb_c2


@reb_c2 wrote:

Il reste à trouver une astuce pour obtenir la DATE du Fichier XREF ?   🙄


La réponse a été donnée par @-didier- ici : vl-file-systime.



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 16 sur 16
reb_c2
en réponse à: _gile

Effectivement, je n'avais pas creusé son Source à Didier !  Pas bien !!!  Merci @-didier- 

 

Mille excuses... on va mettre ça sur le compte de l'Age...  🙄  et en plus comme ça fait 2 sujets qui se croisent pour les différentes solutions, pas évident ! 

 

Encore merci à Tous. 😍

 

Christian


Formateur Indépendant, Consultant, AutoCAD, AutoCAD LT, REVIT MEP, INVENTOR -
www.rebcao.fr

Christian REB

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report