danb Posté(e) le 18 février 2010 Posté(e) le 18 février 2010 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
(gile) Posté(e) le 18 février 2010 Posté(e) le 18 février 2010 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
Patrick_35 Posté(e) le 18 février 2010 Posté(e) le 18 février 2010 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
danb Posté(e) le 18 février 2010 Auteur Posté(e) le 18 février 2010 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
Patrick_35 Posté(e) le 18 février 2010 Posté(e) le 18 février 2010 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
danb Posté(e) le 18 février 2010 Auteur Posté(e) le 18 février 2010 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-promptstringmais rien a faire ..j'ai un mal fou avec le vlisp à piger.... :casstet: Pourrais tu m'aiguiller??? merci
Patrick_35 Posté(e) le 22 février 2010 Posté(e) le 22 février 2010 Salut Logiquement, les attributs d'un bloc sont à la même place que ceux dans la table des blocks.Regarde MAT ou PAT qui utilise les invites @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
danb Posté(e) le 23 février 2010 Auteur Posté(e) le 23 février 2010 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! ***|;
Patrick_35 Posté(e) le 23 février 2010 Posté(e) le 23 février 2010 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
danb Posté(e) le 24 février 2010 Auteur Posté(e) le 24 février 2010 merci ! petit a petit ça éclairci....merci pour les explications
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