Aller au contenu

POSITION ATTRIBUT BLOC ET CHANGEMENT DE CALQUE


fabichou

Messages recommandés

Bonjour à tous,

 

Voici mon problème:

 

J'ai 1 bloc avec un texte comme attribut (dont je peux changer la position).

J'ai inséré x bloc dans mon dessin et ai changé la position de tous (suivant la place que j'ai dans mon dessin). Maintenant je m'aperçois que je voudrais changer de calque l'attribut texte de mon bloc. Mais voilà lorsque je change de calque (avec le gestionnaire des attributs de bloc), il me change la position de mon texte qu'il replace tel qu'inséré.

 

Peut être que quelqu'un a une solution à mon problème ou bien il va falloir que je replace 1 par 1 la position de tous mes textes.

 

MERCI D'AVANCE :(

Lien vers le commentaire
Partager sur d’autres sites

Bonjour fabichou,

 

Effectivement, que ce soit avec battman ou attsync, une synchronisation replace les attributs à leur position d'origine.

Pour palier à ce problème, l'idée, qui n'est sans doute pas la meilleure, est de lancer un premier lisp qui construit une liste contenant l'adresse de l'attribut et le point qui correspond à son TextAlignmentPoint.

 

Ensuite tu procèdes à la synchronisation qui change le TextAlignmentPoint.

 

Pour terminer, tu exécutes un second lisp qui remet le TextAlignmentPoint tel que sauvegardé dans la liste construite par le premier lisp.

 

(vl-load-com)

;; construire liste LSTPT
(defun c:getpos (/ AcDoc eobj sel latt att)
 (setq AcDoc (vla-get-activeDocument (vlax-get-acad-object)))
 (setq LSTPT nil)
 (ssget "_X" '((0 . "INSERT") (2 . "NOM_DU_BLOC")))
 (vlax-for eobj (setq sel (vla-get-ActiveSelectionSet AcDoc))
   (if (= (vlax-get-property eobj 'HasAttributes) :vlax-true)
     (progn
       (setq LATT (vlax-invoke eobj 'getAttributes))
       (foreach ATT LATT
         (if (= (vla-get-TagString ATT) "NOM_ETIQUETTE")
           (setq LSTPT (cons (list ATT (vla-get-TextAlignmentPoint ATT)) LSTPT))
         )
       )
     )
   )
 )
 (vla-delete sel)
 (princ)
)


;; remettre les attributs à leur place d'origine contenue dans LSTPT
(defun c:putpos (/ PT)
 (foreach PT LSTPT
   (vla-put-TextAlignmentPoint (car PT) (cadr PT))
 )
 (princ)
) 

 

Bien sûr il faut changer NOM_DU_BLOC et NOM_ETIQUETTE pour que ça corresponde à ton cas.

 

Amicalement

Vincent

 

[Edité le 22/4/2010 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Zebulon_

C'est une solution.

Une autre en regardant directement dans la table des blocs

 

Version avec nom étiquettes différentes

(defun c:cla(/ bl doc ent lst)
 (vl-load-com)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (and (ssget "x" (list (cons 0 "insert") (cons 66 1)))
   (progn
     (vlax-for bl (setq sel (vla-get-activeselectionset doc))
(setq lst nil)
(vlax-for ent (vla-item (vla-get-blocks doc) (vla-get-name bl))
  (and (eq (vla-get-objectname ent) "AcDbAttributeDefinition")
    (setq lst (cons (cons (vla-get-tagstring ent) (vla-get-layer ent)) lst))
  )
)
(mapcar '(lambda(x)
	  (and (setq lay (cdr (assoc (vla-get-tagstring x) lst)))
	    (vla-put-layer x lay)
	  )
	)
	(vlax-invoke bl 'getattributes)
)
     )
     (vla-delete sel)
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

Version avec nom étiquettes parfois identiques

(defun c:cla(/ bl doc ent lst)
 (vl-load-com)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (and (ssget "x" (list (cons 0 "insert") (cons 66 1)))
   (progn
     (vlax-for bl (setq sel (vla-get-activeselectionset doc))
(setq lst nil)
(vlax-for ent (vla-item (vla-get-blocks doc) (vla-get-name bl))
  (and (eq (vla-get-objectname ent) "AcDbAttributeDefinition")
    (setq lst (cons (cons (vla-get-tagstring ent) (vla-get-layer ent)) lst))
  )
)
(mapcar '(lambda(a b) (vla-put-layer a (cdr b))) (vlax-invoke bl 'getattributes) (reverse lst))
     )
     (vla-delete sel)
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

@+

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

J'ai essayé et ça bloque au 2ème lisp:

 

je t'ai envoyé mon adresse par message privé. Si cela ne pose pas de problème de confidentialité, tu peux me faire parvenir le fichier dwg concerné, ou le déposer quelque part sur un site FTP ?

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

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é