• Ce forum est la traduction générée par la machine de www.cad3d.it/forum1 - la communauté italienne du design. Plusieurs termes ne sont pas traduits correctement.

attribut bloc de renommer l'étiquette (TAG)

  • Auteur du sujet Auteur du sujet 77marco77
  • Date de début Date de début

77marco77

Guest
Bonsoir.
pour changer le nom de l'étiquette de l'attribut J'ai trouvé ce lisp
HTML:
(defun c:c1 ( / oldtagname newtagname tagname ss x n blk att atts )
(vl-load-com)
(setq oldtagname "aukstis")
(setq newtagname "ag")
(setq ss nill)
(prompt "\npick tous les blocs à changer: ")
(setq ss)
(si (et (/= oldtagname "")(/= newtagname "")(/= ss zéro))
(progrès
(setq x 0 n 0)
(répéter (longueur ss)
(setq blk (vlax-ename->vla-objet (ssname ss x))
(si (valeur sûre (valeur variable vlax (vla-getattributes blk)))
(progrès
(setq atts (vlax-safearray->list (valeur vlax-variant-variante (vla-getattributes blk))))
(pour chaque att.
(setq tagname (strcase (vla-get-tagstring att))); tagname
(si (et (/= newtagname "")(= tagname oldtagname))
(progrès
(vla-put-tagstring att newtagname)
(setq n (+ n 1))
); pronostic
); si
); pour chaque
); pronostic
); si
(setq x (+ x 1))
); longueur de répétition ss
(noms d ' étiquette " changés " (itoa n) " à " newtagname ")
); pronostic
); si
(principal)
); fonction
pour block attribut tag renommeret faire ce qu'il devrait.
Je voudrais pouvoir le modifier pour qu'il complète les instructions même lorsqu'ils choisissent entre les autres un bloc ou un élément qui ne contient pas l'étiquette (au moment par erreur et sort de la commande).
si vous pouviez également demander à l'attribut de changer et le nouveau nom sans avoir à changer à chaque fois le lisp serait le maximum, mais je serais ravi d'une aide même pour la première partie:)
 
Code:
(défun c:c1 (/oldtagname newtagname ss x n blk atts)
(vl-load-com)
(setq oldtagname (strcase (geste))
Nouveau nom (strcase (getstring "\nunova etichetta:")
n 0
)
(Probablement tous les blocs à changer)
(setq ss))
(et ss)
(progrès
(répéter (setq x)
(setq blk (vlax-ename->vla-objet))
(si (vla-get-hasattributes :vlax-true)
(progrès
(setq lance (vlax-safearray->list (valeur de la variante vlax (vla-getattributes blk)))
(Pour chaque Elem Atts
(si (vla-get-tagstring elem) oldtagname
(progrès
(vla-put-tagstring elem newtagname)
(Setq n (1+ n))
)
)
)
)
)
)
)
)
(alert (strcat "changement" (itoa n)" pris des noms à: "newtagname")
(Principaux)
)
 
Bonjour confutatis, avec cela nous sommes trois que dans un temps très court m'aider!
le code fait exactement ce que je voulais (j'imagine la scène où vous l'avez écrite avec la main gauche tandis que la bonne boisson le café et/ou parcourir le journal. . )

Merci beaucoup !
 
Bonjour confutatis,
J'ai seulement réalisé maintenant que le code ci-dessus fait ce que j'ai demandé en son temps, mais pas tout ce dont j'aurais besoin aujourd'hui. . . .
Je dois traduire les balises d'attributs donc je dois changer les balises dans les définitions de blocs et je cherche la façon de changer simultanément le nom d'un attribut de blocs multiples.
la modification devrait avoir lieu dans la définition de l'attribut (et non seulement dans la référence), c'est-à-dire si j'ouvre le bloc avec l'éditeur de blocs après avoir lancé la lisp au-dessus de la balise devrait avoir le nouveau nom, mais malheureusement ce n'est pas le cas.
De plus, si je fais sincatt supprime les modifications et signale les balises et attributs au nom et à la définition d'origine du bloc, puis perd les informations placées dans l'attribut.

J'aurais trouvé ce code (je ne sais pas où...):
Code:
;;; renommer les attributs
(défun renattrib (blk $old $new / blocs bo eo ao)
;; obtenir la collecte des blocs dans le dessin courant
(setq blocs (vla-get-blocs (vla-get-document actif (vlax-get-acad-object))))
;; pas à travers tous les blocs
(vlax pour blocs de bo)
;; pas à travers toutes les entités à l'intérieur du bloc
(pour
(cond
;; si attdef & dans le bloc cible & ancien tag
(et (= (vla-get-objectname eo) "acdbattributedefinition")
(= (strcase (vla-get-name bo)) (strcase $blk))
(= (vla-get-tagstring eo) $old)
) ;_ fin et
(vla-put-tagstring eo $new) ; passage au nouveau nom
)

;; si bloc référence & bloc cible
(et (= (vla-get-objectname eo) "acdblockreference")
(= (strcase (vla-get-effectivename eo)) (strcase $blk))
) ;_ fin et
;; pas à travers tous les attributs
(pour chaque ao (vlax-safearray->list (valeur vlax-variant-variante (vla-getattributes eo)))
;; vérifier si l'attrib cible
(si (= (strcase (vla-get-tagstring ao)) (strcase $old))
(vla-put-tagstring ao $new) ; passage au nouveau nom
) ;_ fin de
) ;_ fin de chaque année
)
) ;_ fin de la période
) ;_ fin de vlax-pour
) ;_ fin de vlax-pour
) ;_ fin du délai
;;;;;;; comando (renattrib "testblk" "oldtag" "newtag")
Cela fait ce dont j'aurais besoin mais pour le faire, je dois donner la commande à l'invite pour chaque bloc et pour chaque attribut.
Y aurait-il un moyen d'accélérer la procédure ?
merci d'avance
 
Oui, il y a au total 6358 blocs, avec un nombre variable d'attributs entre 6 et 28. tous les blocs ont ces 6 tags toujours égaux, environ 80% des blocs ont 6 attributs supplémentaires égaux et les 20% restants ont un nombre supplémentaire variant entre 2 et 14 (également égaux).
 
Je ne sais pas si c'est ce que tu voulais...
Code:
;;; renommer les attributs
(défun c:renatt (/ blocs bo eo ao)
;; obtenir la collecte des blocs dans le dessin courant
(setq oldtag (strcase (getstring "\nold tag: ")))
(setq newtag (strcase (getstring "\new tag: ")))
(setq blocs (vla-get-blocs (vla-get-document actif (vlax-get-acad-object))))
;; pas à travers tous les blocs
(vlax pour blocs de bo)
;; pas à travers toutes les entités à l'intérieur du bloc
(pour
(cond
;; si attdef & dans le bloc cible & ancien tag
(et (= (vla-get-objectname eo) "acdbattributedefinition")
(= (vla-get-tagstring eo) oldtag)
) ;_ fin et
(vla-put-tagstring eo newtag) ; passage au nouveau nom
)
) ;_ fin de la période
) ;_ fin de vlax-pour
) ;_ fin de vlax-pour
(vl-cmdf "_attsync" "n" "*")
(principal)
) ;_ fin du délai
 
Dernière édition:
code fait exactement ce qu'il devrait (et à la vitesse de la lumière!).

Ce que j'aime vraiment dans vos codes est la "simplicité" et l'élégance qui les font regarder (et malheureusement seulement regarder) un petit jeu.

Merci beaucoup !
 

Statistiques du forum

Sujets
58 521
Messages
499 056
Membres
104 110
Dernier membre
ChristianR

Membres en ligne

Aucun membre en ligne actuellement.
Retour
Haut