JUJUZAZA Posté(e) le 18 avril 2007 Posté(e) le 18 avril 2007 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
BIM G CO Posté(e) le 18 avril 2007 Posté(e) le 18 avril 2007 Une vieille commande : _-attedit Attention cette commande est différente de ATTEDIT ou de EATTEDITCe 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
(gile) Posté(e) le 18 avril 2007 Posté(e) le 18 avril 2007 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
Patrick_35 Posté(e) le 18 avril 2007 Posté(e) le 18 avril 2007 SalutTu as aussi le lisp MAT sur cette page @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
JUJUZAZA Posté(e) le 18 avril 2007 Auteur Posté(e) le 18 avril 2007 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]
JUJUZAZA Posté(e) le 18 avril 2007 Auteur Posté(e) le 18 avril 2007 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: VTEntrez le nouveau texte: SR[/surligneur en gros , ancienne chaine de caractères à modifieret puis donner la nouvelle Valaur à propager mais uniquement aux anciennes valeur Merci
(gile) Posté(e) le 18 avril 2007 Posté(e) le 18 avril 2007 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
JUJUZAZA Posté(e) le 18 avril 2007 Auteur Posté(e) le 18 avril 2007 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
Patrick_35 Posté(e) le 18 avril 2007 Posté(e) le 18 avril 2007 (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 JUJUZAZALe 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 besoinsMaintenant, l'idée de substituer qu'une partie du texte va être reprise dans MAT. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 18 avril 2007 Posté(e) le 18 avril 2007 (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
Patrick_35 Posté(e) le 18 avril 2007 Posté(e) le 18 avril 2007 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
JUJUZAZA Posté(e) le 18 avril 2007 Auteur Posté(e) le 18 avril 2007 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant