Aller au contenu

Transformer l'invite d'un attribut en son etiquette.


zza427

Messages recommandés

Bonjour, j' ai un cartouche qui a été mal fait, plusieurs attributs ont la même étiquette, par contre tous ont une invite exacte.

Je cherche à savoir si il y a un moyen de "récupérer" l'invite et de la "mettre" en valeur d'étiquette pour ensuite pouvoir synchroniser les attributs dans les 170 fichiers où le cartouche est inséré en présentation (si je modifie les étiquettes des attributs dans un bloc, lorsque je redéfinit le bloc dans un autre fichier, il ne met pas forcement les attributs à la même place).

 

Si quelqu'un a la moindre idée, je suis preneur.

 

Merci.

post-62320-0-26344800-1474982819_thumb.png

Lien vers le commentaire
Partager sur d’autres sites

salut,

et bien tu es tombé pile sur un truc à la con !

j'ai des tas de routine qui bidouille des attributs, ça j'avais pas,

j'ai pensé te bidouiller un truc en deux deux, mais non:

l' invite est présente dans le code 3 de l'ATTDEF, mais elle n'est plus dans le ATTRIB

donc ça complique, il faut aller se référer à la définition du bloc

(mais peut être est-ce ce que tu veux ?)

a+

gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

voilà un code qui change la définition du bloc,

et curieusement, les espace et la ponctuation sont acceptés comme etiquette

; ****************************************************************************
;;§/dxf/passe les définition d'atribut d'invite vers étiquette/nombl
;; exemple : (pw_blockDefAttribInv2Eti "tcpoint")


(defun pw_blockDefAttribInv2Eti ( nombl / debut res extrait ent lent acinv acEti)
(setq debut 't)
 
(defun extrait ( / )
 (while (setq ent (entnext ent))
(setq res (entget ent))
       (if (=  "ATTDEF" (cdr (assoc 0 res)))
  (progn
    (if (and
	  (setq acInv (cdr (assoc 3 res)))
	  (setq acEti (assoc 2 res))
	  )
      (progn
	(setq res (subst (cons 2 acInv) acEti res))
	(entmod res)
      )
     )
  )
 )
   
 )
)
 
(while (setq lent (tblnext "block" debut))
 (setq debut nil)
 (if (= nombl (cdr (assoc 2 lent)));;si c'est la definition qu'on cherche
   (progn
     (setq res (cons lent res));; le debut de la def
     (setq res (cons (entget (setq ent (cdr (assoc -2 lent)))) res));;l'entget du 1er -2
     (extrait)
   )
  )
)
 
)

 

mais si c'est pour modifier des occurences de blocs existantes, j'avoue que je ne sais pas où cette info est stockée

a+

gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

bon ben finalement la voilà (pour modifier une occurence existante) sous forme de plug-in powerClic, à adapter

; ****************************************************************************
;;§/plugg/  "définit les attributs avec comme etiquette leur invite"/none
;
(pw_pluggin_register '( "attrib_NOM_INVITE" ( "INSERT" )("définit les attributs avec comme etiquette leur invite" )))

(defun attrib_NOM_INVITE ( / fin  ent tp tmp sel ldefatt  lblsel l )

(defun modif ( ent / tmp tp )
 (setq fin nil)
 (while (not fin)
   (setq tp (cdr (assoc 0 (setq eg (entget ent)))))
   

   (if (= "INSERT" tp )
    (progn
      (setq nbl (cdr (assoc 2 eg)))
      (setq ldefatt (pw_blockDefRetEtiInv nbl))
    )
   )

   (if (= "ATTRIB" tp )	
  (progn
    (setq acEti (cdr (assoc 2 eg)))
    (setq nEti (cadr (assoc acEti ldefatt)))
    (setq eg (subst (cons 2 nEti) (cons 2 acEti) eg))
    (entmod eg)	    
 )
 
    )
    (if (=	"SEQEND" tp )
  (setq fin 't)
    )
      (setq ent (entnext ent))

 )
)

(setq sel (ssget "_p"))
(setq lblsel (pw_LISTSEL sel))
(foreach l lblsel
 (if	 (= (cdr (assoc 66 (entget l))) 1 )
(modif l)
 )
)
)
; ****************************************************************************
;;§/dxf/retourne une liste de définition d'atribut ( étiquette invite) du bloc spécifié/nombl
;;(pw_blockDefRetEtiInv "tcpoint") -> (("COD" "Valeur de COD :") ("ALT" "Valeur de ALT :") ("MAT" "Valeur de MAT :"))


(defun pw_blockDefRetEtiInv ( nombl / eg res extrait ent lent acInv acEti )
 
(defun extrait ( / res )
 (while (setq ent (entnext ent))
(setq eg (entget ent))
       (if (=  "ATTDEF" (cdr (assoc 0 eg)))
  (progn
    (if (and
	  (setq acInv (cdr (assoc 3 eg)))
	  (setq acEti (cdr (assoc 2 eg)))
	  )
     
	(setq res (cons (list  acEti acInv) res))
	
     )
  )
 )
   
 )
  res
)
 

 (if (setq lent (tblsearch "block" nombl))
   (progn
     (setq ent (cdr (assoc -2 lent)));;le 1er -2
     (extrait)
   )
  )
)

le piège, c'est que si tu as lancé la commande précédente dans ton dessin, celle ci ne marchera plus, car la définition du bloc ne correspondra plus à l'occurence d'attributs !

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

et au final la version non plug:

a noter, je découvre qu'une fois les occurrences passées à la moulinette,

lea attributs n'ont plus d'invite.

puis si on utilise pw_blockDefRetEtiInv,

les invites reviennent, identiques à l'étiquette, bien sur

je ne savais pas que les attributs, bien que menant une vie distincte des blocs,

se référaient à la définition de bloc pour l'invite.

a savoir si on veut traduire des attributs ...

a+

Gégé

 

 

 

;;****************************************************************************
;;§/blocs/  redéfinit les attributs avec comme etiquette leur invite/none
;

(defun c:attrib_NOM_INVITE
      (/ fin ent tp tmp sel ldefatt lblsel l acEti nEti)

 (defun modif (ent / tmp tp)
   (setq fin nil)
   (while (not fin)
     (setq tp (cdr (assoc 0 (setq eg (entget ent)))))


     (if (= "INSERT" tp)
(progn
  (setq nbl (cdr (assoc 2 eg)))
  (setq ldefatt (pw_blockDefRetEtiInv nbl))
)
     )

     (if (= "ATTRIB" tp)
(progn
  (setq acEti (cdr (assoc 2 eg)))
  (setq nEti (cadr (assoc acEti ldefatt)))
  (setq eg (subst (cons 2 nEti) (cons 2 acEti) eg))
  (entmod eg)
)

     )
     (if (= "SEQEND" tp)
(setq fin 't)
     )
     (setq ent (entnext ent))

   )
 )

 (setq sel (ssget "_:S" '((0 . "INSERT"))))

 (setq l (ssname sel 0))
 (if (= (cdr (assoc 66 (entget l))) 1)
   (modif l)
 )
)

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

J'ai de petites difficultés:

 

Pour la version plugin, je ne sais pas quoi faire du texte pour créer le plugin:

 

Commande: APPLOAD

attrib_NOM_INVITE2.lsp correctement chargé(s)

Commande: ; erreur: no function definition: PW_PLUGGIN_REGISTER

 

 

Pour la version lisp, autocad me renvoi cette erreur:

 

Commande: ATTRIB_NOM_INVITE

; erreur: no function definition: PW_BLOCKDEFRETETIINV

Commande:

 

Par contre, merci pour le temps consacré a faire le programme.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Pour la version plugin, je ne sais pas quoi faire du texte pour créer le plugin:

 

c'est un plug-in pour Powerclic, il faut avoir powerclic installé, c'est pourquoi j'ai fait une autre version

en gros, il faut entièrement charger ce qui suit, et lancer la commande "attrib_NOM_INVITE"

 

 

Par contre, merci pour le temps consacré a faire le programme.

je ne pensais pas y passer plus de 10mn, sinon je n'aurais même pas répondu ...

mais finalement j'ai vu que je tombais sur qq chose que je ne connaissais pas, et là ça agace ...

 

 

; ****************************************************************************
;;§/dxf/passe les définition d'atribut d'invite vers étiquette/nombl
;; exemple : (pw_blockDefAttribInv2Eti "tcpoint")


(defun pw_blockDefAttribInv2Eti ( nombl / debut res extrait ent lent acinv acEti)
(setq debut 't)
 
(defun extrait ( / )
 (while (setq ent (entnext ent))
       (setq res (entget ent))
       (if (=  "ATTDEF" (cdr (assoc 0 res)))
         (progn
           (if (and
                 (setq acInv (cdr (assoc 3 res)))
                 (setq acEti (assoc 2 res))
                 )
             (progn
               (setq res (subst (cons 2 acInv) acEti res))
               (entmod res)
             )
            )
         )
        )
   
 )
)
 
(while (setq lent (tblnext "block" debut))
 (setq debut nil)
 (if (= nombl (cdr (assoc 2 lent)));;si c'est la definition qu'on cherche
   (progn
     (setq res (cons lent res));; le debut de la def
     (setq res (cons (entget (setq ent (cdr (assoc -2 lent)))) res));;l'entget du 1er -2
     (extrait)
   )
  )
)
 
)

; ****************************************************************************
;;§/dxf/retourne une liste de définition d'atribut ( étiquette invite) du bloc spécifié/nombl
;;(pw_blockDefRetEtiInv "tcpoint") -> (("COD" "Valeur de COD :") ("ALT" "Valeur de ALT :") ("MAT" "Valeur de MAT :"))


(defun pw_blockDefRetEtiInv ( nombl / eg res extrait ent lent acInv acEti )
 
(defun extrait ( / res )
 (while (setq ent (entnext ent))
       (setq eg (entget ent))
       (if (=  "ATTDEF" (cdr (assoc 0 eg)))
         (progn
           (if (and
                 (setq acInv (cdr (assoc 3 eg)))
                 (setq acEti (cdr (assoc 2 eg)))
                 )
            
               (setq res (cons (list  acEti acInv) res))
               
            )
         )
        )
   
 )
  res
)
 

 (if (setq lent (tblsearch "block" nombl))
   (progn
     (setq ent (cdr (assoc -2 lent)));;le 1er -2
     (extrait)
   )
  )
)

;;****************************************************************************
;;§/blocs/  redéfinit les attributs avec comme etiquette leur invite/none
;

(defun c:attrib_NOM_INVITE
      (/ fin ent tp tmp sel ldefatt lblsel l acEti nEti)

 (defun modif (ent / tmp tp)
   (setq fin nil)
   (while (not fin)
     (setq tp (cdr (assoc 0 (setq eg (entget ent)))))


     (if (= "INSERT" tp)
       (progn
         (setq nbl (cdr (assoc 2 eg)))
         (setq ldefatt (pw_blockDefRetEtiInv nbl))
       )
     )

     (if (= "ATTRIB" tp)
       (progn
         (setq acEti (cdr (assoc 2 eg)))
         (setq nEti (cadr (assoc acEti ldefatt)))
         (setq eg (subst (cons 2 nEti) (cons 2 acEti) eg))
         (entmod eg)
       )

     )
     (if (= "SEQEND" tp)
       (setq fin 't)
     )
     (setq ent (entnext ent))

   )
 )

 (setq sel (ssget "_:S" '((0 . "INSERT"))))

 (setq l (ssname sel 0))
 (if (= (cdr (assoc 66 (entget l))) 1)
   (modif l)
 )
)

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Alors, le programme fonctionne... mais il ne fais pas tout a fait ce que je voulais.

 

Voici les attributs tels qu'ils sont à l'origine.

post-62320-0-55425400-1475224198_thumb.png

 

Pour info dans le fichier ci-joint j'ai enregistré-sous le bloc cartouche afin de faire la modif sans transformer les deux.

 

Et voici les attributs aprés le passage de ton Lisp:

 

post-62320-0-59094500-1475224207_thumb.png

 

Le petit problème est qu'il prend le premier attribut nommé " - " qu'il trouve et il change tous les attributs nommés " - " avec le même nom.

 

Donc mon problème n'est pas résolu.

Lien vers le commentaire
Partager sur d’autres sites

c'est normal, le lien entre le l'invite et l'attribut se fait par l'etiquette, qui est la même pour tous les attributs

donc il faut passer par l'ordre des attribut, ou donner un nom incrémenté

.

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

re salut,

un nouveau code qui marche très bien,

puisque toutes les étiquettes reprennent un ordre cohérent,

mais il n'y a plus d'invite, (c'est pas grave puisque les étiquettes ont le nom de l'invite)

et il ne faut surtout pas utiliser pw_blockDefAttribInv2Eti,

qui remet les invites, car en fait, si tu fait un attsync de ton bloc, tu verra qu'il n'est pas en accord avec sa définition

puisque tu es a toulouse, je compte sur toi pour une bonne bouteille de buzet !

a+

gégé

 

; ****************************************************************************
;;§/dxf/passe les définition d'atribut d'invite vers étiquette/nombl
;; exemple : (pw_blockDefAttribInv2Eti "tcpoint")
;; ou (pw_blockDefAttribInv2Eti (cdr (assoc 2 (entget (car (nentsel))))))


(defun pw_blockDefAttribInv2Eti ( nombl / debut res extrait ent lent acinv acEti)
(setq debut 't)
 
(defun extrait ( / )
 (while (setq ent (entnext ent))
       (setq res (entget ent))
       (if (=  "ATTDEF" (cdr (assoc 0 res)))
         (progn
           (if (and
                 (setq acInv (cdr (assoc 3 res)))
                 (setq acEti (assoc 2 res))
                 )
             (progn
               (setq res (subst (cons 2 acInv) acEti res))
               (entmod res)
             )
            )
         )
        )
   
 )
)
 
(while (setq lent (tblnext "block" debut))
 (setq debut nil)
 (if (= nombl (cdr (assoc 2 lent)));;si c'est la definition qu'on cherche
   (progn
     (setq res (cons lent res));; le debut de la def
     (setq res (cons (entget (setq ent (cdr (assoc -2 lent)))) res));;l'entget du 1er -2
     (extrait)
   )
  )
)
 
)

; ****************************************************************************
;;§/dxf/retourne une liste de définition d'atribut ( étiquette invite) du bloc spécifié/nombl
;;(pw_blockDefRetEtiInv "tcpoint") -> (("COD" "Valeur de COD :") ("ALT" "Valeur de ALT :") ("MAT" "Valeur de MAT :"))


(defun pw_blockDefRetEtiInv ( nombl / eg res extrait ent lent acInv acEti )
 
(defun extrait ( / res )
 (while (setq ent (entnext ent))
       (setq eg (entget ent))
       (if (=  "ATTDEF" (cdr (assoc 0 eg)))
         (progn
           (if (and
                 (setq acInv (cdr (assoc 3 eg)))
                 (setq acEti (cdr (assoc 2 eg)))
                 )
            
               (setq res (cons (list  acEti acInv) res))
               
            )
         )
        )
   
 )
  res
)
 

 (if (setq lent (tblsearch "block" nombl))
   (progn
     (setq ent (cdr (assoc -2 lent)));;le 1er -2
     (extrait)
   )
  )
)

;;****************************************************************************
;;§/blocs/  redéfinit les attributs avec comme etiquette leur invite/none
;

(defun c:attrib_NOM_INVITE
      (/ fin ent tp tmp sel ldefatt lblsel l acEti nEti)

 (defun modif (ent / tmp tp i)
   (setq fin nil)
   (setq i 0)
   (while (not fin)
     (setq tp (cdr (assoc 0 (setq eg (entget ent)))))
     


     (if (= "INSERT" tp)
       (progn
         (setq nbl (cdr (assoc 2 eg)))
         (setq ldefatt (reverse (pw_blockDefRetEtiInv nbl)))
       )
     )

     (if (= "ATTRIB" tp)
       (progn
         (setq acEti (cdr (assoc 2 eg)))
         ;;(setq nEti (cadr (assoc acEti ldefatt)))
  (setq nEti (cadr (nth i ldefatt)))
         (setq eg (subst (cons 2 nEti) (cons 2 acEti) eg))
         (entmod eg)
  (setq i (+ 1 i))
       )

     )
     (if (= "SEQEND" tp)
       (setq fin 't)
     )
     (setq ent (entnext ent))

   )
 )

 (setq sel (ssget "_:S" '((0 . "INSERT"))))

 (setq l (ssname sel 0))
 (if (= (cdr (assoc 66 (entget l))) 1)
   (modif l)
 )
)

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Après, ça n'est pas grave, j'ai surtout pris cette histoire comme une bonne leçon...

170 documents dans lesquels est inséré le cartouche concerné...

La prochaine fois qu'on commence une grosse affaire, je vérifierais bien que les éléments de base des dessins soient propres et bien configurés.

 

En attendant je modifie tout à la main à chaque changement d'indice.

Lien vers le commentaire
Partager sur d’autres sites

salut,

En attendant je modifie tout à la main à chaque changement d'indice.

je ne comprends pas, pour moi une fois le traitement fait, les attributs sont dans le bon ordre,et ont le nom de leur invite

 

 

Ton bloc est bien synchro avec la base ?

 

salut Patrick,

si je fais un attsync du bloc d'origine, l'ordre reste, mais les attributs d'indice se déplacent de la case 1 vers la cas 4

d'ailleurs sur la capture d'écran, on voit bien le 1er attribut d'indice est le 4, pas le 1

je trouve tout ça bien compliqué, et je ne comprend pas pourquoi mon traitement remet tout dans l'ordre.

a+

gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Si je fais un attsync les attributs se déplacent.

La définition dans le bloc n'est pas la même que dans tous les dessins.

Le bloc à été modifié plusieurs fois par plusieurs personnes.

 

Du coup je pense que c'est complexe pour vous.

 

Pour la modif, je connais par cœur l'ordre des attributs et donc je sais ou modifier les attributs pour remplir mes lignes de modifications. J'aurais aimé pouvoir automatiser une partie du boulot (vu la quantité de fichiers) mais voila...

 

D’où l'importance de commencer proprement un projet.

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é