Aller au contenu

changement nom etiquette attribut


danb

Messages recommandés

Bonjour

 

j'ai récupéré le code ci dessous sur un site anglais dans le but de renommer automatiquement les étiquettes de mes attributs de blocs.

 

 

 (defun changeTags (/ BLK DOC I TAGLST SS)
 (vl-load-com)
 (setq blk "demo_block")
 (setq tagLst '(
        ;"Old Tag"    "New Tag"
        ("a"     "anew")
        ("b"    "bnew")
 ("c"    "cnew")

	 
        )
   i -1
   doc (vla-get-activedocument (vlax-get-acad-object))
   )
 (if (ssget "_X" (list (cons 0 "INSERT")(cons 2 blk)))
   (vlax-for bl (setq ss (vla-get-activeselectionset doc))
     (foreach att (vlax-invoke bl 'getAttributes)
   (If (assoc (vla-get-tagstring att) tagLst)
     (vla-put-tagstring att (cadr (assoc (vla-get-tagstring att) tagLst)))
     )))
   (princ "\nNo Selection Set Found."))
 (princ))

;; Run program manually with this:
(defun c:demo_chgtag () (changeTags))

;; Uncomment this to run when lisp loaded
;(changeTags)

 

 

 

A première vue il fonctionne très bien mais je me suis aperçu qu'il y avait un soucis .....les changements ne sont pas pris en compte lorsque j'exécute Battman ou encore Attsync ....ni dans la définition du bloc

 

Par contre si j'évite la synchro...les nouvelles etiquettes sont bien prise en compte lors de l'extraction d'attributs....

 

 

Comment résoudre ce problème?????

(problème sous autocad 2008 et 2010)

 

merci !!!

 

voici qques impression d'écran....

 

 

etat initial

 

http://img709.imageshack.us/img709/4364/etatinitial.jpg

 

 

etat final apres avoir executer "demo_chgtag"

 

http://img8.imageshack.us/img8/7915/etatfinal.jpg

 

http://img519.imageshack.us/img519/3434/editeurapreslisp.jpg

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Le LISP que tu as modifie les étiquettes dans les références sélectionnées et pas dans la définition (!?)

 

Un petit truc vite fait, qui modifie la définition du bloc et mets les références à jour (attsync).

Il faut modifier ce qui est [surligneur]surligné[/surligneur] suivant tes besoins.

 

(defun changeTagString (blkName tagList / blk tag)
 (vl-load-com)
 (not
   (or	(vl-catch-all-error-p
  (setq	blk
	 (vl-catch-all-apply
	   'vla-Item
	   (list (vla-get-Blocks
		   (vla-get-Activedocument (vlax-get-acad-object))
		 )
		 blkName
	   )
	 )
  )
)
(vlax-for obj blk
  (and (= (vla-get-ObjectName obj) "AcDbAttributeDefinition")
       (setq tag (assoc (vla-get-TagString obj) tagList))
       (vla-put-TagString obj (cdr tag))
  )
)
   )
 )
)

(defun c:CHTAG ()
 (if
   (changeTagString
     [surligneur]"NomDuBloc"[/surligneur]
     '(([surligneur]"OLD1"[/surligneur] . [surligneur]"NEW1"[/surligneur])
([surligneur]"OLD2"[/surligneur] . [surligneur]"NEW2"[/surligneur])
      )
   )
   (vl-cmdf "_.attsync" "_name" [surligneur]"NomDuBloc"[/surligneur])
   (princ "\nBloc introuvable")
 )
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Lucky est de retour ;)

 

Comme l'indique (gile), Il faut aller dans la définition du block

 

(defun changeTags(blk tagLst / att bl blk doc evi new lstbl old ss tagLst)
 (vl-load-com)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (if (ssget "_X" (list (cons 0 "INSERT")(cons 2 blk)))
   (progn
     (vlax-for bl (setq ss (vla-get-activeselectionset doc))
(foreach att (vlax-invoke bl 'getAttributes)
  (and (setq old (assoc (vla-get-tagstring att) tagLst))
    (progn
      (vla-put-tagstring att (setq new (cadr (assoc (vla-get-tagstring att) tagLst))))
      (or evi
	(vlax-for ent (vla-item (vla-get-blocks doc) blk)
	  (and (eq (vla-get-objectname ent) "AcDbAttributeDefinition")
	       (eq (vla-get-tagstring ent) (car old))
	    (vla-put-tagstring ent new)
	  )
	)
      )
    )
  )
)
(setq evi T)
     )
     (vla-delete ss)
   )
 )
 (princ)
)

(changeTags	"demo_block"
	'(
	;"Old Tag"	"New Tag"
	("a"		"anew")
	("b"		"bnew")
	("c"		"cnew")
	)
)

 

@+

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

et bien déjà merci a vous pour ces réponses rapides (et pour toutes vos autres contrinutions qui me sont souvent utiles !!!!!).

 

J'ai testé rapidement les deux...

Il y a une chose que je n'avais pas signalé dans le message initial: mes blocs sont liés entre eux par un attribut (dont l'étiquette, elle, n'est pas modifiée) qui s'incrémente automatiquement grâce au lisp LATT de patrick ....

Malheureusement cette liaison est cassée lorsque j'applique les lisps de changement de nom d'étiquette...

Y a t il une solution pour conserver cette liaison intacte?

 

Autre petite question qui ne m'est pas forcement utile à moi mais qui peut etre utile pour d'autre: comment répercuter le changement de nom d'étiquette dans l' INVITE de l'attribut????

 

 

merci

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Il n'y a pas de raison qu'un lisp "casse" la liaison avec latt, surtout pour renommer une étiquette.

Par contre, un battman ou attsync oui, car latt utilise la position de l'attribut depuis le bloc de base. Si l'ordre change, latt est perdu.

 

Autre petite question qui ne m'est pas forcement utile à moi mais qui peut etre utile pour d'autre: comment répercuter le changement de nom d'étiquette dans l' INVITE de l'attribut????

Depuis la table des blocks

 

(vla-get-promptstring ...)

 

@+

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

effectivement la chaine n'etait pas cassée...j'avais fait une mauvaise manip auparavant :mad2:

 

 

en ce qui concerne le changement d'invite, je "bricole" (vu mon niveau) a partir de tes conseil avec vla-get-promptstring

mais rien a faire ..j'ai un mal fou avec le vlisp à piger.... :casstet:

Pourrais tu m'aiguiller???

 

merci

Lien vers le commentaire
Partager sur d’autres sites

bonjour,,

 

 

j'ai jeté un oeil sur mat et pat

 

puis je suis parti du code ci dessus pour obtenir ceci:

 

; erreur: Le serveur ActiveX a renvoyé l'erreur: nom inconnu: PromptString

je ne trouve pas pourquoi.????

:casstet:

:casstet:

 

 (defun modif_inv (nom invlst / at bl nom invLst neweti oldeti)
 (vl-load-com)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (if (ssget "_X" (list (cons 0 "INSERT") (cons 2 nom)))
   (progn (setq ss (vla-get-activeselectionset doc))
   (vlax-for bl	ss
     (foreach at (vlax-invoke bl 'getAttributes)
       (and (setq oldeti (assoc (vla-get-promptstring at) invlst))
	    (progn (vla-put-promptstring
		     at
		     (setq neweti (cadr (assoc (vla-get-promptstring at) invlst)))
		   ) ;_ Fin de vla-put-promptstring
		   (or evi
		       (vlax-for at (vla-item (vla-get-blocks doc) nom)
			 (and (eq (vla-get-objectname at) "AcDbAttributeDefinition")
			      (eq (vla-get-promptstring at) (car oldeti))
			      (vla-put-promptstring at neweti)
			 ) ;_ Fin de and
		       ) ;_ Fin de vlax-for
		   ) ;_ Fin de or
	    ) ;_ Fin de progn
       ) ;_ Fin de and
     ) ;_ Fin de foreach
     (setq evi T)
   ) ;_ Fin de vlax-for
   (vla-delete ss)
   ) ;_ Fin de progn
 ) ;_ Fin de if
 (princ)
) ;_ Fin de defun


(defun c:CH1 ()
 (modif_inv "BLOC A"
     '( ;"Old Tag"	"New Tag"
       ("o" "nouvelo")
       ("p" "nouveaup")
      )
 ) ;_ Fin de modif_inv
) ;_ Fin de defun
;|«Visual LISP© Format Options»
(150 2 1 2 T "Fin de " 80 9 0 0 1 T nil T T)
;*** NE PAS AJOUTER de texte au-dessous du commentaire! ***|;

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Tu as juste besoin d'aller dans la table des blocks

 

(defun modif_inv(nom invlst / at doc neweti)
 (vl-load-com)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vlax-for at (vla-item (vla-get-blocks doc) nom)
   (and (eq (vla-get-objectname at) "AcDbAttributeDefinition")
 (setq neweti (assoc (vla-get-promptstring at) invlst))
     (vla-put-promptstring at (cadr neweti))
   ) ;_ Fin de and
 ) ;_ Fin de vlax-for
)

 

@+

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é