Aller au contenu

Modifier un Texte d\'un bloc avec attributs


Messages recommandés

Posté(e)

Bonjour à tous :)

 

j'aimerai changer ou modifier la valeur d'une étiquette d'attribut .

 

je m'explique:

j'ai plusieurs blocs de même nom, portant plusieurs étiquettes (attributs)

et j'ai une chaine de caractères à changer.

 

Actuellement je suis obligé de le faire en sélectionnant bloc par bloc, sachant que j'en ai 200 à 300 blocs par plans !!! ça me prend presque 2 journées de travail !!

 

Ma question: Y a-t-il un LISP qui va me permettre de choisir et de sélectionner certain blocs et de modifier une des étiquettes d'attribut en précisant l'ancienne chaine de caractères à modifier et puis donner la nouvelle chaine de caractères

 

Merci

Posté(e)

Une vieille commande : _-attedit

 

Attention cette commande est différente de ATTEDIT ou de EATTEDIT

Ce qui est en jaune c'est que j'ai tapé au clavier

 

 Commande:  [surligneur] _-ATTEDIT[/surligneur]

Edition des attributs un par un ? [Oui/Non] :  [surligneur] _no[/surligneur]

Exécution d'une édition globale des valeurs d'attributs.
Edition des attributs visibles à l'écran seulement ? [Oui/Non] :  [surligneur] _yes[/surligneur]
Entrez la spécification du nom de bloc <*>:  [surligneur] ref_radiateurs[/surligneur]

Entrez spécification étiquette d'attribut <*>:  [surligneur] *[/surligneur]

Entrez spécification valeur de l'attribut <*>:  [surligneur] *[/surligneur]
Attend un point ou Fenêtre/Dernier/Capture/BOîte/Trajet/SPolygone/CPolygone
Sélection des attributs:

Entrez le texte à modifier:  [surligneur] VT[/surligneur]
Entrez le nouveau texte:  [surligneur] SR[/surligneur

 

Certes tu dois faire une capture mais au moins cela ne te nécessite pas de créer un lisp

Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier

Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To

GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office

 

PlaquetteDeplianteMars2024.pdf

Posté(e)

En LISP quand même

 

Pour changer l'étiquette (c'est bien la demande ?) dans la définition du bloc :

 

((lambda (/ bl old new)
  (and
    (setq bl (getstring T "\nNom du bloc: "))
    (tblsearch "BLOCK" bl)
    (setq old (getstring "\nNom de l'étiquette à changer: "))
    (setq new (getstring "\nNouvelle étiqutte: "))
    (vlax-for ent
       (vla-item (vla-get-Blocks
		   (vla-get-ActiveDocument (vlax-get-acad-object))
		 )
		 bl
       )
      (and (= (vla-get-ObjectName ent) "AcDbAttributeDefinition")
    (= (strcase (vla-get-TagString ent)) (strcase old))
    (vla-put-TagString ent (strcase new))
      )
    )
  )
)
) 

 

Pour changer l'étquette dans toutes le références insérées :

 

((lambda (/ bl old new ss)
  (and
    (setq bl (getstring T "\nNom du bloc: "))
    (tblsearch "BLOCK" bl)
    (setq old (getstring "\nNom de l'étiquette à changer: "))
    (setq new (getstring "\nNouvelle étiqutte: "))
    (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 bl))))
    (vlax-map-collection
      (vla-get-ActiveSelectionSet
 (vla-get-ActiveDocument (vlax-get-acad-object))
      )
      '(lambda	(b)
  (foreach e (vlax-invoke b 'getAttributes)
    (and
      (= (strcase (vla-get-TagString e)) (strcase old))
      (vla-put-TagString e (strcase new))
    )
  )
)
    )
  )
)
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re et merci de vos reponces

 

C'est bien ce que je voulais Maximilien, seul hic je veux que ça soit en lisp, mais c'est déjà enorme tu me fais gagner 1 tps bien précieux .

 

Gille désolais je me suis peut-étre mal expliqué, ma demande est de modifier uniquement la valeur d'une etiquette et non pas l'etiquette en elle même, c'est vrais que je ne suis pas vraiment 1 pro. je tacherer de detailler au maxi. la prochaine fois Merci

 

Je vais essayer ton lisp Patrick

 

Merci à vous

 

[Edité le 18/4/2007 par JUJUZAZA]

Posté(e)

Patrick

 

Je viens d'essayer ton lisp, C'EST Génial !!!!!

 

Seul probleme, bien sur pour moi , c'est qu'il modifie toutes les valeurs.

 

Je voulais savoir si tu pouvais ajouter ou le personnaliser en ajoutant ceque Maximilien me propose:

 

Entrez le texte à modifier: VT

Entrez le nouveau texte: SR[/surligneur

 

en gros , ancienne chaine de caractères à modifier

et puis donner la nouvelle Valaur à propager mais uniquement aux anciennes valeur

 

Merci

 

Posté(e)

Re,

 

Je trouvais aussi curieux de vouloir changer des étiquettes ;)

 

Voilà pour changer les valeurs, le bloc est sélectionné à l'écran toutes les références du même bloc qui ont la même ancienne valeur seront modifiées. Si tu préfères faire une sélection, supprime le "_X" dans l'expression :

 

(setq ss (ssget "_X" (list '(0 . "INSERT") (assoc 2 (entget bl)))))

 

(defun c:eva (/ bl old new ss)
 (and
   (setq bl (car (entsel "\Sélectionner un bloc:")))
   (= "INSERT" (cdr (assoc 0 (entget bl))))
   (setq old (getstring T "\nNom de la valeur à changer: "))
   (setq new (getstring T "\nNouvelle valeur: "))
   (setq ss (ssget "_X" (list '(0 . "INSERT") (assoc 2 (entget bl)))))
   (vlax-map-collection
     (vla-get-ActiveSelectionSet
(vla-get-ActiveDocument (vlax-get-acad-object))
     )
     '(lambda (b)
 (foreach e (vlax-invoke b 'getAttributes)
   (and
     (= (strcase (vla-get-TextString e)) (strcase old))
     (vla-put-TextString e (strcase new))
   )
 )
      )
   )
 )
 (princ)
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci Bcp. GILE

 

C'est vraiment ce que je voulais

 

Patrick pourrais peut-étre l'ajouter à son lisp MAT (c'est juste 1 suggestion), le lisp c'est vraiment pas mon fort !

 

Merci

 

 

Posté(e)

(gile) vient de me faire découvrir ActiveSelectionSet :)

Juste une petite amélioration pour permettre de changer qu'une partie du texte

 

(defun c:eva (/ bl old new ss)
 (and
   (setq bl (car (entsel "\Sélectionner un bloc:")))
   (= "INSERT" (cdr (assoc 0 (entget bl))))
   (setq old (getstring T "\nNom de la valeur à changer: ")
  new (getstring T "\nNouvelle valeur: ")
  ss  (ssget "_X" (list '(0 . "INSERT") (assoc 2 (entget bl))))
   )
   (vlax-map-collection
     (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))
     '(lambda (b)
(foreach e (vlax-invoke b 'getAttributes)
  (vla-put-textstring e (vl-string-subst new old (vla-get-textString e)))
)
     )
   )
 )
 (princ)
)

 

Pour JUJUZAZA

Le lisp de (gile) est très bien et peut servir dans des scripts mais pas le mien. Par contre, MAT fonctionne que pour une seule étiquette alors que celui de (gile) les traitent toutes. C'est selon les besoins

Maintenant, l'idée de substituer qu'une partie du texte va être reprise dans MAT.

 

@+

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

Posté(e)

(gile) vient de me faire découvrir ActiveSelectionSet

 

Pourtant on traine sur les mêmes forums ;)

 

Je l'ai découvert il y a peu sur TheSwamp, je cois. Bien pratique pour traiter les jeux de sélections avec (vlax-map-collection ...).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)
Pourtant on traine sur les mêmes forums ;)

Oui, sauf qu'en ce moment, je n'ai pas trop le temps. Juste un peu pour Cadxp et Autodesk et à l'occasion sur theswamp.

 

Mais cette fonction avec un vlax-map-collection, ça va décoiffer :cool:

 

@+

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

Posté(e)

Pour le moment ,

le LISP de gile me convient parfaitement ,

mais je pense certainement un jour utiliser le LISP Patrick pour modifier la valeur d'une seule étiquette de ++ blocs .

 

 

 

Merci à vous

 

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é