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
Résolu ! Accéder à la solution.
Résolu par Luna1. Accéder à la solution.
Résolu par _gile. Accéder à la solution.
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)
)
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))))))
)
)
)
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 !
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
Christian REB
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.
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
Christian REB
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
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)
Christian REB
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
Christian REB
Oui PapaLisp @_gile 😊
Merci, c'est fait. Je me suis toujours demandé où il était ce bouton ??? 🙄
Christian
Christian REB
Il reste à trouver une astuce pour obtenir la DATE du Fichier XREF ? 🙄
Christian
Christian REB
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
Christian REB
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.