Aller au contenu

CHEMIN XREF


JAMESsirop

Messages recommandés

Bonjour,

J'aimerais savoir s'il existe un programme permettant d'afficher dans une présentation le chemin complet et le nom des XREF rattachés au fichier. J'utilise un Lisp ( Tampon.lsp) trouvé sur le Net qui me permet d'afficher l'arborescence la date, l'heure, ... du fichier et je le trouve bien pratique. J'aimerais pouvoir le compléter avec l'affichage des Xref.

D'avance merci.

Lien vers le commentaire
Partager sur d’autres sites

alut

 

Un truc vite fait dans ce style

(setq a (tblnext "block" t))
(setq liste_xref nil)
(while a
 (if (= (logand (cdr (assoc 70 a)) 4) 4)
   (progn
     (setq liste_xref (append liste_xref (list (cdr (assoc 1 a)))))
     (princ (strcat "\n\t\tXref trouvé ---> " (cdr (assoc 1 a))))
   )
 )
 (setq a (tblnext "block"))
)
(princ)

 

Nb : une variable liste_xref est créée afin de contenir tous les xref

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Je pensais que tu maîtrisais un peu le lisp. Cette routine est là pour te servir d’exemple, t’indiquer où chercher et c’est à toi de l’adapter en fonction de tes besoins comme d’indiquer les xrefs dans des attributs d’un bloc par exemple. Si tu ne connais pas trop la manière de faire, on veut bien t’aider à condition que tu nous indique ce que tu requières ( pour rependre l’exemple, nom du bloc, étiquette des attributs, etc...)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Mes besoins sont les suivants :

afficher l'arborescence des XREF chargés dans la ou les présentations du fichier de telle sorte qu'une personne n'ayant que le plan papier puisse retrouver facilement le chemin des xrefs.

Ce serait du style :

XREF1 : R:\affaire\plans\XREF\nom_XREF1.DWG

XREF2 : R:\affaire\plans\XREF\nom_XREF2.DWG

XREFn : R:\affaire\plans\XREF\nom_XREFn.DWG

 

Voici le lisp que j'utilise pour afficher le nom du fichier :

(defun c:tampon (/ bloc1 echo1 lup1 TouTampon Sub_InsertionBloc Sub_Misajour)

(setq echo1 (getvar "cmdecho")) ; svg cmdecho

(setvar "cmdecho" 0) ;

(setq lup1 (getvar "luprec")) ; svg luprec

(setvar "luprec" 6) ; nombre de décimales

;; ======================================================================

;; La suite de cette fonction se trouve à la fin de fichier

;;------------------------------------------------------------------

 

(defun Sub_InsertionBloc (/ Question1 AffBoite Echel1 pt1)

;; routine d'insertion du bloc contenant l'attribut

(setq Question1 (getvar "attreq")) ; svg attreq

(setvar "attreq" 1) ; pour utiliser la valeur par défaut de l'attribut

(setq AffBoite (getvar "attdia")) ; svg attdia

(setvar "attdia" 1) ; pour interdire affichage boîte de dialogue

; d'insertion des attributs

(setq Echel1 (getvar "dimscale")) ; facteur d'échelle global

(setq pt1 (getpoint "\nPoint d'insertion du tampon : "))

(if (= pt1 nil)

(exit)

)

;; 'pause' dans la ligne suivante permet de choisir l'angle d'insertion. Vous pouvez

;; remplacer par 0 pour mettre le bloc toujours horizontal ou 90 pour vertical

(command "_insert" "$tampon$" pt1 Echel1 Echel1 pause)

(setvar "attreq" Question1) ; restauration valeur attreq avant programme

(setvar "attdia" AffBoite) ; restauration valeur attdia avant programme

(princ)

)

(defun Sub_Misajour (/ Mois Jour Annee Texte1 Chemin LgNomDessin NomDessin

NomUser NbTampon Cpt1 EntTamp Ent_dansBloc NomEnt NomAtt

NewAtt ChgAtt

)

(setq NomDessin (getvar "dwgname") ; obtention du nom du dessin

LgNomDessin (strlen NomDessin) ; obtention longueur du nom du dessin

Chemin (getvar "dwgprefix") ; obtention chemin du répertoire de dessin

)

(if (<= LgNomDessin 80) ; si la longueur du nom est inférieure à 79

(setq NomDessin (strcat Chemin NomDessin)) ; on ajoute le chemin

)

(setq Mois (substr (rtos (getvar "cdate") 2) 5 2)

Jour (substr (rtos (getvar "cdate") 2) 7 2)

Annee (substr (rtos (getvar "cdate") 2) 3 2)

Heure (substr (rtos (getvar "cdate") 2) 10 2)

Minute (substr (rtos (getvar "cdate") 2) 12 2)

NomUser (getvar "loginname") ; obtention du nom d'utilisateur

)

(if (= "") ; s'il est vide, on le demande

(setq NomUser (getstring "\nNom dessinateur/Entreprise : "))

)

;; La ligne suivante donne la ligne qui sera affichée. Vous pouvez supprimez des infos.

(setq Texte1 (strcat NomDessin " " NomUser " " Jour "\\" Mois "\\" Annee " " Heure ":" Minute))

;; recherche de tous les blocs $tampon$ du dessin

(setq TouTampon (ssget "X" (cons (cons 410 (getvar "CTAB"))'((2 . "$tampon$"))))

NbTampon (sslength TouTampon) ; nbre de blocs $tampon$ dans le dessin

Cpt1 0 ; drapeau compteur de blocs $Tampon$)

)

(repeat NbTampon ; tant qu'il y a des $tampon$

;; retourne dans EntTamp la liste des données du numéro Cpt1 de TouTampon

(setq EntTamp (entget (ssname TouTampon Cpt1))

Cpt1 (+ Cpt1 1) ; incrémente le compteur de blocs $tampon$

) ; si l'entité est un bloc

(if (= (cdr (assoc 0 EntTamp)) "INSERT")

(progn

(setq Ent_dansBloc 1) ; Drapeau attribut

(while Ent_dansBloc ; tant qu'il y a des entités dans le bloc

;; Nom de l'entité suivante dans le bloc

(setq NomEnt (entget (entnext (cdr (assoc -1 EntTamp)))))

;; si cette entité est un attribut

(if (= (cdr (assoc 0 NomEnt)) "ATTRIB")

(progn

;; si le nom de l'étiquette de l'attribut est "DATE_TAMPON"

(if (= (cdr (assoc 2 NomEnt)) "DATE_TAMPON")

(progn

(setq NomAtt (assoc 1 NomEnt) ; valeur de l'attribut (associée à 1)

NewAtt (cons 1 Texte1) ; construction paire pointée)

ChgAtt (subst NewAtt NomAtt NomEnt) ; remplace les valeurs

)

;; modifie les données de l'attribut

(entmod ChgAtt)

) ; progn

) ; if

) ; progn

) ; if

;; si on atteint la fin du bloc

(if (= (cdr (assoc 0 NomEnt)) "SEQEND")

(setq Ent_dansBloc nil)

)

(setq EntTamp NomEnt)

) ; retour à while

) ; progn

) ; if retour s'il y a encore des blocs

) ; repeat

(princ)

(setvar "cmdecho" echo1)

(setvar "luprec" lup1) ; nombre de décimales

(command "_regen")

(princ)

)

;; gestion des erreurs

(defun BiE_Error (*msg)

(if (and (/= *msg "Fonction annulée")

(/= *msg "Fonction annul‚e")

(/= *msg "Function cancelled")

)

(princ (strcat "\nErreur : " *msg))

(princ)

)

(setq *error* $OldError)

(setvar "cmdecho" echo1)

(setvar "luprec" lup1) ; nombre de décimales

(princ)

)

;;--------------Suite fonction C:TAMPON ----

;;-------------------------------------------

;; Pour gestion des erreurs

(setq $OldError *error*

*error* BiE_Error)

;; Est ce que le bloc $tampon$ a déjà été inséré dans le dessin ?

(setq bloc1 (tblsearch "block" "$tampon$"))

(cond

((= bloc1 nil) (Sub_InsertionBloc) ; si non aller à Sub_InsertionBloc

(Sub_Misajour) ; puis à Sub_Misajour

)

((= (ssget "X" '((2 . "$tampon$"))) nil)

;; si le bloc existe dans la base de données du dessin mais a été effacé

(Sub_InsertionBloc)

(Sub_Misajour)

)

((/= bloc1 nil) (Sub_Misajour)) ; si le bloc existe, aller à Sub_Misajour

)

;; Force l'affichage de la boite de dialogue de la commande suivante (traceur)

(initdia)

;; la ligne suivante lance la commande traceur. Vous pouvez la supprimer sans problème.

(princ)

)

D'avance merci.

James

Lien vers le commentaire
Partager sur d’autres sites

En complétant le lisp de Patrick_35, on pourrait déjà faire ce qui suit:

 

(defun c:id_xref ( / a liste_xref)
(setq a (tblnext "block" t))
(setq liste_xref nil)
(while a
	(if (= (logand (cdr (assoc 70 a)) 4) 4)
		(progn
			(setq liste_xref (append liste_xref (list (cdr (assoc 1 a)))))
			(princ (strcat "\n\t\tXref trouvé ---> " (cdr (assoc 1 a))))
		)
	)
	(setq a (tblnext "block"))
)
(if liste_xref
	(progn
		(setvar "TEXTEVAL" 1)
		(command "_.-text" pause pause pause)
		(foreach n liste_xref (command (eval n) "_.-text" ""))
		(command "")
		(setvar "TEXTEVAL" 0)
	)
)
(princ)
)

 

Après il serait peut être interessant, si on veut sophistiquer, d'en faire un groupe nommé pour pouvoir le remanipuler lors de session ultérieure et le mettre à jour automatiquement.

 

Dans l'état; il faut effacer et relancer la routine pour tenir à jour, c'est déjà pas mal!

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

BonusCad te propose une solution, et comme j’ai travaillé dessus (sans vouloir faire de concurrence ;) ) , voici la mienne

 

Soit à partir de ton bloc $tampon$, tu ajoutes des attributs avec comme étiquette CHEMIN_XREF1, CHEMIN_XREF2, CHEMIN_XREF3, etc… depuis un autre bloc, mais toujours avec le même principe pour les étiquettes

En surligné, je t’ai indiqué où modifier les noms

 

Tu peux ajouter ce lisp à la suite du tien

 

@+

 

(defun c:cxref(/ bloc_xref boucle ent fin_ent js liste_xref nom_xref texte_xref systime_xref)

[surligneur]  (setq nom_bloc "$TAMPON$")    ; nom du bloc contenant les attributs [/surligneur] 
[surligneur]  (setq nom_xref "DATE_TAMPON") ; nom de l'étiquette pour le chemin des xrefs [/surligneur] 

 (setq js (ssget "x" (list (cons 0 "insert") (cons 2 nom_bloc))))
 (if js
   (progn
     (setq bloc_xref (tblnext "block" t))
     (while bloc_xref
       (if (= (logand (cdr (assoc 70 bloc_xref)) 4) 4)
         (progn
           (setq texte_xref (cdr (assoc 1 bloc_xref)))
           (if (not (vl-string-search ".DWG" (strcase texte_xref)))
             (setq texte_xref (findfile (strcat texte_xref ".dwg")))
             (setq texte_xref (findfile texte_xref))
           )
           (setq systime_xref (vl-file-systime texte_xref))
           (setq texte_xref (strcat texte_xref " "  (itoa (nth 2 systime_xref))
                                               "\\" (itoa (nth 1 systime_xref))
                                               "\\" (itoa (nth 0 systime_xref))
                                               " "  (itoa (nth 4 systime_xref))
                                               ":"  (itoa (nth 5 systime_xref))))
           (setq liste_xref (append liste_xref (list texte_xref)))
         )
       )
       (setq bloc_xref (tblnext "block"))
     )
     (setq boucle 0)
     (while (ssname js boucle)
       (setq ent (ssname js boucle))
       (while ent
         (setq ent (entget ent))
         (if (and (= (cdr (assoc 0 ent)) "ATTRIB") (vl-string-search (strcase nom_xref) (strcase (cdr (assoc 2 ent)))))
           (progn
             (setq fin_ent (vl-string-subst "" (strcase nom_xref) (strcase (cdr (assoc 2 ent)))))
             (if fin_ent
               (if (not (zerop (atoi fin_ent)))
                 (if (nth (1- (atoi fin_ent)) liste_xref)
                   (progn
                     (setq ent (subst (cons 1 (nth (1- (atoi fin_ent)) liste_xref)) (assoc 1 ent) ent))
                     (entmod ent)
                     (entupd (cdr (assoc -1 ent)))
                   )
                 )
               )
             )
           )
         )
         (setq ent (entnext (cdr (assoc -1 ent))))
       )
       (setq boucle (1+ boucle))
     )
   )
   (princ (strcat "\nLe bloc " nom_bloc " n'est pas dans le dessin"))
 )
 (princ)
)

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Patrick_35

 

Je ne vois aucune concurrence :)

Il est toujours bon de voir ce que peuvent faire les autres, la manière dont ils abordent le problème.

 

Ca ne peut être qu'enrichissant et formateur.

 

Je m'interesse a ce sujet de renseigner le chemin des Xrefs.

Je ne sais pas encore si je vais compléter mon cartourche automatique ou faire une fonction indépendante. (fonction similaire à tampon de jsirop avec en plus quelques renseignements complémentaires):

 

*date de création, de modification, de tracage

*nom du fichier

*nom du dossier

*nom de la présentation

*auteur

*n° classement

*échelle (qui est liée à une fenêtre de présentation pour le calcul de l'échelle, dans le cas d'insertion dans l'espace papier)

*la version d'autocad

*La version de windows

 

Si ça interesse quelqu'un, je peux mettre le code en ligne, dans le forum approprié, de ce cartouche automatique (assez volumineux LSP +DCL)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Je n'ai pas encore la 2005 :mad:

 

Pour l'instant toujours en 2002

 

Mai tu as raison de me rappeler ces nouvelles fonctionnalités, je crois que je vais abandonner l'évolution de mon cartouche (on va pas perdre du temps pour rien ;) ) car le saut ne saurait tarder... peut être pour la 2006??

 

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

pourquoi faire compliqué ?? si tu as otocad 2004

 

En lisp je ne sait pas, mais en diesel

il y a les RTEXT des express tools !

 

Daniel

 

C'est pas pour dénigrer les pros du lisp, bien au contraire :hallucine:

 

mais quand je vois (((((( ou )))))

ou encore

)

)

)

)

 

ça me décourage.

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

mais quand je vois (((((( ou )))))

ou encore

)

)

)

)

 

ça me décourage.

Ce n'est qu'une question d'habitude, après on n'y pense même plus

il y a les RTEXT des express tools !

Et oui, exact, et en diesel avec la fonction (xrefs,3) par exemple. Comme quoi, on ne pense pas à tout..

Pourquoi faire simple quand.... ;)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour à tous,

Etant parti 1 semaine en vacances, je découvre que le sujet intéresse du monde.

Patrick_35 : comme tu as été le premier à t'intéresser au sujet et à me proposer une solution, j'ai intégré ton lisp à la suite du mien et j'ai rajouté dans mon bloc des étiquettes XREF. Quant j'essaye sur une présentation ou le bloc n'a pas été inséré, j'obtiens ce message :

Erreur : type d'argument incorrect: lselsetp nil

Par contre dans une présentation ou le bloc était déjà inséré, il ne se passe rien si ce n'est qu'il m'affiche comme avant le nom et l'arborescence du fichier.

Je vois les points d'insertion des étiquettes situés sous le nom du fichier.

Je continue à essayer de comprendre.

@+

Lien vers le commentaire
Partager sur d’autres sites

c'est juste un complément par rapport à ton lisp

Dans ton bloc $TAMPON$, il faut lui rajouter des attributs nommés par exemple CHEMIN1,CHEMIN2,etc... et à la place de DATE_TAMPON dans la variable xref_nom indique que les attributs se nomment CHEMIN (sans l'incrément)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Il me semble que c'est ce que j'ai fait:

(setq nom_xref " [surligneur] CHEMIN_XREF[/surligneur]") ; nom de l'étiquette pour le chemin des xrefs.

Mon bloc $tampon$.dwg comporte des attributs dont le nom des étiquettes est DATE_TAMPON, CHEMIN_XREF1, CHEMIN_XREF2, ....

Quand je réinsère mon bloc celui me propose d'entrer des valeurs pour mes différents attributs. Je ne rentre rien à ce moment.

Quant je tape tampon, je peux indiquer mon nom et ma société mais il n'insère pas le chemin des xref.

Est-ce que normalement cela doit se faire automatiquement ou j'ai loupé une opération ?

Le type d'insertion des xref a-t'il une importance ? ( superposition ou attachement, avec ou sans le chemin d'accès ).

Je précise aussi que j'ai rechargé tampon.lsp.

Désolé si je parais être long à comprendre. En tout cas merci de rester à mon écoute.

@+

Lien vers le commentaire
Partager sur d’autres sites

Ah oui, le bloc est redéfini (graphiquement), mais pas ses attributs.

Il faut donc, soit effacer le bloc $Tampon$ puis purger le dessin afin qu'il disparaisse complètement puis le réinsérer et ça devrait fonctionner

Ou utiliser la commande battman des express tolls afin de synchroniser les attributs avec le bloc

Mais, autrement, la démarche est bonne

 

(ps: evite l'espace devant " CHEMIN_XREF")

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité