Aller au contenu

changer les attributs de plusieurs blocs


lolb75

Messages recommandés

Bonjour a tous, :)

 

Je fais encore appel a vous....

 

Voici mon problème:

 

J'ai besoin de traiter beaucoup de blocs avec attribut, notamment changer (un des attributs du bloc) de calque mais pas l'autre attribut, je n'ai trouvé qu'une manière la commande BATTMAN mais il faut les changer un par un ... :( je souhaiterais pouvoir en sélectionner plusieurs.

 

Si une âme charitable a la solution, merci d'avance

Cordialement

 

Lolb75

Lien vers le commentaire
Partager sur d’autres sites

re:

 

Ok, mais j'ai oublié de dire que c'est le même bloc mais les attributs ne vont pas dans les mêmes calques,

c'est à dire, le même attribut de ce bloc sera dans des calques différents, je ne sais pas si je m'explique bien...

 

Cordialement

 

Lolb75

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

de temps en temps je viens mettre mon grain de sel (hihi)

 

le souci avec cette solution proposée c'est que si les attributs sont déplacés avant la synchronisation ils perdent cette définition et reviennent aux positions "théoriques".

par contre c'est une solution en natif

il reste à faire un lisp (quelques lignes) pour gérer ce changement de calque aisément en gardant les modifications de position des attributs.

 

amicalement

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Au fait il me semble avoir vu passer un Lisp/VLisp de Gilles ou Bruno

qui faisait une resynchronisation (un peu comme BATTMAN/ATTSYNC) des Blocs

mais en gardant la position modifiee des attributs !

 

C'est CE genre de programme qui serait la base depart d'un dev specifique a ton besoin !?

 

Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut, voici deux ptits lisp rapide qui te permttent de changer le calque d'un attribut :

 

- Le premier : tu saisi le nom du nouveau claque et ensuite tu sélectionne tes attributs.

(defun c:layatt ( / newcal selatt objatt)

 (vl-load-com)
 (setq newcal (getstring "\nNom du nouveau calque : "))
 (while (/= (setq selatt (nentsel "\nSélectionner l'attribut à changer de calque:")) nil)
   (setq objatt (vlax-ename->vla-object (car selatt)))
   (if (= (vla-get-ObjectName objatt) "AcDbAttribute")
     (progn
       (vla-put-layer objatt newcal)
     )
   )
 )
 (princ)
)

 

- Le deuxième : Tu sélectionne un attribut et ensuite tu applique le calque de ce dernier a tous les nouveaux attributs sélectionnés.

(defun c:coplayatt ( / selattsource objattsource newcal selatt objatt)

 (vl-load-com)
 (setq selattsource (nentsel "\nSélectionner l'attribut source:"))
 (setq objattsource (vlax-ename->vla-object (car selattsource)))
 (setq newcal (vla-get-layer objattsource))
 (while (/= (setq selatt (nentsel "\nSélectionner l'attribut à changer de calque:")) nil)
   (setq objatt (vlax-ename->vla-object (car selatt)))
   (if (= (vla-get-ObjectName objatt) "AcDbAttribute")
     (progn
       (vla-put-layer objatt newcal)
     )
   )
 )
 (princ)
)

 

Ces lisps sont une base rapide largement améliorable.

PIRO Charles

Developpeur Revit, RV/RA - Formateur Revit

PIRO CIE

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Si j'ai bien compris la demande (changer le calque d'un attribut dans certains blocs), voilà un petit LISP.

Commande : LOLB75 (modifiable dans le code), l'utilisateur est invité à entrer le nom du calque, puis à sélectionner un attribut cible, puis à sélectionner les blocs à traiter.

Attention, toute synchronisation après exécution du LISP restaurerait les propriétés définies dans les définitions d'attribut.

 

(defun c:LOLB75	(/ getLayer getAttrib tryFindAttrib layer attrib tag blockName selSet i	elst)

 (defun getLayer (/ str)
   (while
     (not
(and
  (setq str (getstring "\nEntrez le nom du calque: "))
  (tblsearch "layer" str)
)
     )
      (prompt (strcat "\nle calque '" str "' n'existe pas."))
   )
   str
 )

 (defun getAttrib (/ ent elst)
   (while
     (not
(and
  (setq ent (car (nentsel "\nSélectionnez un attribut cible: ")))
  (= (cdr (assoc 0 (setq elst (entget ent)))) "ATTRIB")
)
     )
      (prompt "\nL'objet sélectionné n'est pas un attribut.")
   )
   elst
 )

 (defun tryFindAttrib (ent tag / found ent elst)
   (while
     (and
(setq ent (entnext ent))
(= (cdr (assoc 0 (setq elst (entget ent)))) "ATTRIB")
       (not (setq found (= tag (cdr (assoc 2 elst)))))
     )
   )
   (if	found
     elst
   )
 )

 (setq	layer	  (getLayer)
attrib	  (getattrib)
tag	  (cdr (assoc 2 attrib))
blockName (cdr (assoc 2 (entget (cdr (assoc 330 attrib)))))
 )
 (if (setq selSet (ssget (list '(0 . "INSERT") (cons 2 blockName))))
   (repeat (setq i (sslength selSet))
     (if (setq elst (tryFindAttrib (ssname selSet (setq i (1- i))) tag))
(entmod (subst (cons 8 layer) (assoc 8 elst) elst))
     )
   )
 )
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Goldorak44

Pour ton lsp layatt j'ai ce message quand je le charge :(

 

; erreur: type d'argument incorrect: numberp: nil

 

Cordialement

 

Salut, voici deux ptits lisp rapide qui te permttent de changer le calque d'un attribut :

 

- Le premier : tu saisi le nom du nouveau claque et ensuite tu sélectionne tes attributs.

(defun c:layatt ( / newcal selatt objatt)

 (vl-load-com)
 (setq newcal (getstring "\nNom du nouveau calque : "))
 (while (/= (setq selatt (nentsel "\nSélectionner l'attribut à changer de calque:")) nil)
   (setq objatt (vlax-ename->vla-object (car selatt)))
   (if (= (vla-get-ObjectName objatt) "AcDbAttribute")
     (progn
       (vla-put-layer objatt newcal)
     )
   )
 )
 (princ)
)

 

- Le deuxième : Tu sélectionne un attribut et ensuite tu applique le calque de ce dernier a tous les nouveaux attributs sélectionnés.

(defun c:coplayatt ( / selattsource objattsource newcal selatt objatt)

 (vl-load-com)
 (setq selattsource (nentsel "\nSélectionner l'attribut source:"))
 (setq objattsource (vlax-ename->vla-object (car selattsource)))
 (setq newcal (vla-get-layer objattsource))
 (while (/= (setq selatt (nentsel "\nSélectionner l'attribut à changer de calque:")) nil)
   (setq objatt (vlax-ename->vla-object (car selatt)))
   (if (= (vla-get-ObjectName objatt) "AcDbAttribute")
     (progn
       (vla-put-layer objatt newcal)
     )
   )
 )
 (princ)
)

 

Ces lisps sont une base rapide largement améliorable.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Bonjour à tous,

 

J'ai lu ce post avec intérêt car je suis confronté à un problème récurrent et consommateur de temps.

Je fais joujou avec des fichiers à multiples présentations (des cahiers d'isométries de tuyauterie) et qui ont été tripoté par une multitude de projeteur plus ou moins à l'aise avec Totocad. Résultat : Pour une même instance de bloc (le cartouche), j'ai souvent les mêmes attributs mais ayant propriétés forcées (tailles de textes, police, calque différent, orientations) différentes d'un onglet à l'autre (et souvent le tout en même temps...) Et pour recaler le tout dans un but d'harmonisation et de standardisation, cela peut prendre un temps... certains. <_< (J'ai pas le choix, c'est une question d'image de marque !).

 

Question @ Gile : Est-ce que ton lisp synchronise tous les instances d'un bloc quelque soit son emplacement (espace objet et présentations multiples) ? A lire le code (en diagonale je l'avoue) j'ai l'impression qu'on ne peut le faire que dans un espace (objet) à la fois.

 

L'Idée sous-jacente : ¨pouvoir synchroniser les propriétés d'attribut de toutes les instances d'un bloc du dessin (ceux en espace objet ainsi que ceux qui se trouverait en espace papier sur différentes présentations ) ? :)

 

Bien à vous,

""Nous avons un avenir et il sera fait de nos rêves si nous avons le courage de bousculer les idées reçues" - S. HONDA

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Tu peux faire une synchro (battman ou attsync).

Mais si tu veux conserver certaines choses, avec SYN

 

@+

 

Merci Patrick pour ta réactivité et Lili qui a amorcé sur cette "bonne pratique" !

 

Je viens de réaliser que je me suis paluché 45 folios en 8h au lieu de 5 secondes. :angry: Je hais les dessins multifolios.

Je m'en vais rédiger une fiche "trucs et astuces" pour les collègues et vous fait un retour ASAP (comme disent les English !)

 

Bien à vous,

""Nous avons un avenir et il sera fait de nos rêves si nous avons le courage de bousculer les idées reçues" - S. HONDA

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é