Bonjour à Toutes et à Tous,
Je suis en train de tester le LISP de la LT 2024 et j'essaye de trouver comment accéder aux infos d'un fichier inséré en XREF, comme la date, sa taille, son chemin, etc.
Si je fais un ENTGET, je constate des entités imbriquées !
((-1 . <Nom d'entité: 23b2f2482f0>) (0 . "INSERT") (330 . <Nom d'entité: 23b0dd2e280>) (5 . "A0E7") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (2 . "TEST LDATA - XDATA") (10 0.0 0.0 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Dans un DXF je trouve bien le chemin de la XREF, derrière un code : 100 et AcDbBlockBegin
Mais comment on y arrive via le LISP ?
Je vous remercie.
Christian
Christian REB
Résolu ! Accéder à la solution.
Résolu par -didier-. Accéder à la solution.
Résolu par reb_c2. Accéder à la solution.
Résolu par _gile. Accéder à la solution.
Je suis en train de tester le LISP de la LT 2024 et j'essaye de trouver comment accéder aux infos d'un fichier inséré en XREF, comme la date, sa taille, son chemin, etc.
Bonjour @reb_c2
Au cas ou ...il y a ce Lisp (je ne l'ai pas testé sur LT 2024) :
Xref Stamp - créez une liste dynamique de Xréfs dans votre dessin DWG . |
Avec l' utilitaire gratuit LISP ( reactor ) Xref Stamp, vous pouvez créer une liste dynamique et configurable de toutes les xréfs référencées à partir de votre dessin principal. Cette liste peut être affichée dans les Commentaires et dans un bloc d'étiquette. La liste peut inclure les chemins complets, les tailles et les dates des différents dessins externes. Téléchargez le fichier Xref Stamp VLX à partir de Download , chargez-le dans votre AutoCAD avec APPLOAD (vous souhaiterez peut-être le charger automatiquement, alors faites-le glisser vers l'icône du bloc-notes) et tapez la commande XREF STAMP pour le lancer. Spécifiez les options : la liste Format, le nom du bloc d'étiquette (le cas échéant) avec un attribut multiligne, s'il faut mettre à jour les commentaires dans les propriétés DWG et s'il faut démarrer un réacteur pour les mises à jour futures. Ou utilisez simplement [apply] pour créer la liste. Il sera affiché dans la ligne de commande, éventuellement mis à jour dans les commentaires de votre dessin et étiqueté dans votre(vos) bloc(s) d'étiquette. Si le réacteur est activé, toute mise à jour future des xréfs sera reflétée dans votre bloc d'étiquette et/ou dans les commentaires DWG . Le format d'affichage des lignes de xréf individuelles peut être spécifié par une chaîne de format dans laquelle les propriétés de xréf individuelles sont codées sous la forme $X ( nom de la xréf ), $N (nom de fichier), $P (chemin), $S (taille en octets ou $KS taille en kilo-octets), $T (horodatage) ou composants individuels de la date et de l'heure. La chaîne de format par défaut est : "\r\n[$X] = $P | $KSkB @ $D.$M.$Y $H:$M" Le nom du bloc d'étiquette par défaut est " XREF STAMPBLOCK" (créez n'importe quel bloc avec un attribut multiligne). Les valeurs par défaut sont Commentaires activés et Réacteur activé. Les Xréfs déchargées ne sont pas répertoriées. Tous les paramètres sont stockés dans le registre afin qu'ils soient enregistrés entre les sessions. Vous pouvez également les modifier dans le Registre (voir HKCU\SOFTWARE\Arkance Systems\ Xref Stamp ). Pour une simple liste de xréfs , utilisez RText - voir Astuce 2513 . (Traduit par Google) Source : https://www.cadforum.cz/
|
Salut Dominique,
Je te remercie, pour le lien, par contre, lorsque je teste le .VLX, il affiche une erreur ! ; erreur: type d'argument incorrect: numberp: nil
Peut-être parce que c'est un version LT ?
Mais comme c'est un .VLX, je n'ai pas accès au source pour comprendre la fonction qui permet d'accéder au chemin d'une XREF ?
Christian
Christian REB
J'ai retrouvé ce sujet... comme d'hab ! Il y a du Gilles la dessous... 😊
Christian
Christian REB
Salut,
Une xref est une référence de bloc (INSERT en DXF),
Il faut donc aller inspecter la définition du bloc qui se trouve dans la table des blocs.
;; Nom de la référence de bloc de la référence externe
(setq nomXref (cdr (assoc 2 (entget xref))))
;; Données DXF de la définition de bloc de la référence externe
(entget (tblobjname "block" nomXref))
Ne pas oublier les fonctions getpropertyvalue / setpropertyvalue et dumpallproperties qui permettent d'accéder aux propriétés des entités et objets AutoCAD.
(dumpallproperties xref) renvoie toutes les propriétés dans la fenêtre de texte.
(getpropertyvalue xref "BlockTablerecord") renvoie le nom d'entité (ENAME) de la définiton du bloc.
(getpropertyvalue (getpropertyvalue xref "BlockTablerecord") "PathName") renvoie le chemin du fichier.
J'ai trouvé, ma réponse dans le sujet avec le CODE à Gilles...
Christian
Christian REB
Merci Gilles, nos messages se sont croisés...
Christian
Christian REB
Hello, Gilles @_gile
Crois-tu qu'un jour la commande APPLOAD sera modernisée ????????
Elle est toujours aussi laborieuse à utiliser !!!
Christian
Christian REB
Bonjour Christian @reb_c2
Edit : Oops ! pendant que je préparais ma réponse, tu es intervenu à nouveau et Gilles aussi, pardon...
Je travaille un peu sur le lisp pour LT et du coup, je viens te répondre, car j'ai écrit ça pour tester.
J'ai choisi de sélectionner une entité à l'écran, mais c'est une hypothèse, pas une obligation.
Voici ce que je te propose :
;sélection de l'entité
(setq xref (car (entsel "\cliquez une entité de l'xref ...")))
;test si c'est une xref
(if (= (getpropertyvalue xref "LocalizedName") "Référence externe")
(progn
(setq cheminxref (getpropertyvalue xref "ExternalPath")
datexref (vl-file-systime cheminxref)
taillexref (vl-file-size cheminxref)
)
)
(alert "l'entité sélectionnée n'est pas une xref")
)
;affichage du résultat
(alert (strcat "le fichier en xref est : " cheminxref
"\nIl fait " (itoa taillexref) " octets"
"\n il date du : "
(strcat
(itoa (nth 4 datexref))"-"(itoa (nth 1 datexref))"-"(itoa (nth 0 datexref))
)
)
)
En souhaitant que ça fonctionne aussi chez toi.
Amicalement
DA
Je te remercie Didier.
Oui pour l'instant je suis agréablement surpris, 😊 pas mal de LISPs fonctionnent avec LT 2024... On va bien tomber sur un os un jour... 😅
Christian
Christian REB
Ne regarde pas ce qui ne fonctionne pas, c'est trop négatif comme approche.
Utilise ce qui fonctionne, il faut bien qu'il reste des différences Full/Lite.
Amicalement
DA
Mouais, le LISP est un plus pour les versions LT, mais avant de l'utiliser réellement, comme j'ai de nombreux clients qui ne souhaitent pas pour l'instant passer à la LT 2024... ce n'est pas essentiel pour moi !
J'aurais préféré quelques réponses à mes 112 Questions ! Sujet que tu avais d'ailleurs commenté de manière constructif et je te remercie...
Christian
Christian REB
Merci Didier @-didier-
Marche très bien ton CODE avec LT 2024 😍
Christian
Christian REB
En faisant quelques TESTS, il n'aime pas si la XREF est en CHEMIN RELATIF !
Christian
Christian REB
J'ai ajouté une fonction FINDFILE qui règle le problème du CHEMIN RELATIF !
;;; -------------------------
;;; NEW informations XREF
;;; -------------------------
(defun C:XREFinfoNEW()
(setq SELXREF ( car (entsel "\nSélectionner une XREF...") ) )
;test si c'est une xref
(if (= ( getpropertyvalue SELXREF "LocalizedName") "Référence externe")
(progn
(setq XREF_DIR ( getpropertyvalue SELXREF "ExternalPath" )
XREF_DATE ( vl-file-systime ( findfile XREF_DIR ) )
XREF_NAME ( getpropertyvalue SELXREF "BlockTableRecord/Name")
XREF_DIMFILE (/ ( vl-file-size ( findfile XREF_DIR ) ) 1000000.0 )
DATEXREF ( strcat ( itoa (nth 4 XREF_DATE ) ) "/"
( itoa (nth 1 XREF_DATE ) ) "/"
( itoa (nth 0 XREF_DATE ) )
);strcat
);setq
( prompt "\nXREF Name : ") ( princ XREF_NAME )
( prompt "\nXREF Path : ") ( princ XREF_DIR )
( prompt "\nXREF Path Abs : ") ( princ ( findfile XREF_DIR ) )
( prompt "\nXREF Date : ") ( princ DATEXREF )
( prompt "\nXREF Taille : ") ( princ ( rtos XREF_DIMFILE 2 2 ) ) (prompt " Mo")
;;; ------------------------------------
;;; Affiche TOUTES les propriétés XREF
;;; ------------------------------------
(defun C:XREFHELP()
(dumpallproperties SELXREF )
(princ)
);defun
);progn
(alert "Didier a dit ☺ ☺ ☺ : \nl'entité sélectionnée n'est pas une xref")
);if
(princ)
);defun
Christian
Christian REB
Petite remarque :
(= ( getpropertyvalue SELXREF "LocalizedName") "Référence externe")
ne fonctionnera que sur une version française ("LocalizedName").
Pour un fonctionnement quelle que soit la version (toujours préférable), il vaut mieux faire :
(= (getpropertyvalue (getpropertyvalue SELXREF "BlockTableRecord") "IsFromExternalReference") 1)
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.