Aller au contenu

[Résolu] Modifier des attributs de blocs dans les espaces papiers


zza427

Messages recommandés

Bonjour, je cherche à savoir si quelqu'un a une idée de comment modifier plusieurs attributs d'un même bloc inséré dans l'espace papier de plusieurs présentations?

 

 

J'ai un fichier avec une dizaine de présentations avec le cartouche de chaque présentation en bloc inséré directement dans l'espace papier. Je cherche a modifier certains des attributs du cartouche dans toutes les présentations.

 

Je n'arrive pas a faire ATTOUT sur l'ensemble des présentations, je n'arrive à le faire qu'une présentation après l'autre (dans ce cas autant modifier directement à la main dans les propriétés).

 

Les attributs ont déjà une valeur, aussi je n'arrives pas en modifiant la définition des blocs à modifier les valeurs des attributs.

 

J'imagine que je pourrais le faire avec rbloc mais je serais obligé de le faire présentation par présentation.

 

Est ce que quelqu'un aurais une idée pour le faire rapidement?

 

En sachant qu'un petit gain de temps serait déjà bien car je vais faire ça pendant quinze jours...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

à partir de mat de Patrick_35 j'ai fait ceci pour que l'outil ressemble à la commande BATTMAN

 

Le lien vers le dcl et le lisp n'est plus actif dans la discussion ci-dessus.

 

le fichier battval.dcl :

 

battval : dialog {
           label = "Battval 1.00";
           : row {
             : column {
               : row {
                 : button {
                   label = "...";
                   fixed_width = true;
                   key = battval_pick;
                 }
                 : text {
                   label = "sélectionner bloc";
                 }
                 : popup_list {
                   edit_width = 15;
                   label = "blocs";
                   key = battval_blist;
                 }
               }
               : list_box {
                 width = 50;
                 allow_accept = true;
                 tabs = "10 30";
                 tab_truncate = true;
                 key = battval_attlist;
               }
               : text {
                 key = battval_nbbl;
               }
             }
             : column {
               fixed_height = true;
               : button {
                 label = "Editer";
                 is_default = true;
                 key = battval_mod;
               }
             }
           }
           : row {
             fixed_width = true;
             alignment = centered;
             : button {
               key = "accept";
               label = "OK";
               fixed_width = true;
               alignment = centered;
             }
             : button {
               key = "cancel";
               label = "Annuler";
               fixed_width = true;
               alignment = centered;
               is_cancel = true;
             }
           }
         }

battmod : dialog {
           label = "Valeur à propager";
           initial_focus = battval_prop;
           : edit_box {
             key = battval_prop;
           }
           ok_cancel;
         }

 

Le fichier battval.lsp

(defun extract_attrib (E ETIQ / LATT ATT REP)
 (setq REP "")
 (if (= (type E) 'ENAME)
   (setq E (vlax-ename->vla-object E))
 )
 (setq LATT (vlax-invoke E 'getAttributes))
 (foreach ATT LATT
   (if (= (vla-get-TagString ATT) ETIQ)
     (setq REP (vla-get-TextString ATT))
   )
 )
 REP
)

(defun modif_attrib (E ETIQ VALEUR / LATT ATT)
 (if (= (type E) 'ENAME)
   (setq E (vlax-ename->vla-object E))
 )
 (setq LATT (vlax-invoke E 'getAttributes))
 (foreach ATT LATT
   (if (= (strcase (vla-get-TagString ATT)) (strcase ETIQ))
     (vla-put-TextString ATT VALEUR)
   )
 )
)

(defun get_AttributList (nom / at bl tb)
 (setq bl (vla-item (vla-get-blocks AcDoc) nom))
 (vlax-for at bl
   (and (eq (vla-get-objectname at) "AcDbAttributeDefinition")
(if (eq (vla-get-constant at) :vlax-true)
  (setq tb (cons (list (vla-get-tagstring at)) tb))
  (setq tb (cons
	     (cons (vla-get-tagstring at)
		   (if (eq (vla-get-promptstring at) "")
		     (vla-get-tagstring at)
		     (vla-get-promptstring at)
		   )
	     )
	     tb
	   )
  )
)
   )
 )
 (reverse tb)
)


(defun get_blocklist (/ liste_bl bl)
 (vlax-for bl (vla-get-blocks AcDoc)
(or (wcmatch (vla-get-name bl) "`**,*|*")
  (eq (vla-get-isxref bl) :vlax-true)
         (not (ssget "_X" (list '(0 . "INSERT") (cons 2 (vla-get-name bl)))))
         (not (get_AttributList (vla-get-name bl)))
  (setq liste_bl (cons (vla-get-name bl) liste_bl))
)
 )
 (if liste_bl
   (acad_strlsort liste_bl)
 )
)

(defun do_battval_pick (/ lst nom sel)
 (defun nom(val)
   (setq val (vlax-ename->vla-object val))
   (if (vlax-property-available-p val 'effectivename)
(vla-get-effectivename val)
(vla-get-name val)
   )
 )
 (and (setq sel (entsel "\nVeuillez sélectionner un bloc : "))
 (eq (cdr (assoc 0 (entget (car sel)))) "INSERT")
 (setq lst (member (nom (car sel)) liste_bl))
 (setq
          BATTVAL_BLIST (itoa (- (length liste_bl) (length lst)))
          BATTVAL_ATTLIST "0"
        )
 )
)


(defun do_battval_nbbl (/ nb)
 (if ss
   (setq nb (sslength ss))
   (setq nb 0)
 )
 (strcat "Trouvés dans le dessin : " (itoa nb))
)



(defun do_battval_attlist (/ atl ent at ETIQ INV VAL LISTVAL)
 (setq ATTLIST nil)
 (setq atl (get_attributlist (nth (atoi BATTVAL_BLIST) liste_bl)))
 (foreach at atl
   (setq ETIQ (car at))
   (if (not (setq INV (cdr at)))
     (progn
       (setq INV "<--CONSTANT-->")
       (setq VAL "<--NON MODIFIABLE-->")
     )
     (progn
       (setq LISTVAL nil)
       (vlax-for ent (vla-get-activeselectionset AcDoc)
         (setq LISTVAL (cons (extract_attrib ent ETIQ) LISTVAL))
       )
       (if (vl-remove (car LISTVAL) LISTVAL)
         (setq VAL "*varie*")
         (setq VAL (car LISTVAL))
       )
     )
   )
   (setq ATTLIST (cons (list ETIQ INV VAL) ATTLIST))
 )
 (setq ATTLIST (reverse ATTLIST))
 (start_list "battval_attlist")
   (mapcar 'add_list (mapcar '(lambda (x) (strcat (car x) "\t" (cadr x) "\t" (caddr x))) ATTLIST))
 (end_list) 
)


(defun do_battval_blist ()
 (setq BATTVAL_BLIST $value)
 (setq ss (do_battval_ss))
 (set_tile "battval_nbbl" (do_battval_nbbl))
 (do_battval_attlist)
 (setq BATTVAL_ATTLIST "0")
 (set_tile "battval_attlist" BATTVAL_ATTLIST)
)


(defun do_battval_mod (/ what_next BATTVAL_PROP ETIQ ent)
 (setq BATTVAL_PROP (caddr (nth (atoi BATTVAL_ATTLIST) ATTLIST)))
 (if (= BATTVAL_PROP "*varie*")
   (setq BATTVAL_PROP "")
 )
 (if (= BATTVAL_PROP "<--NON MODIFIABLE-->")
   (alert "Attribut constant non modifiable")
   (progn
     (setq what_next 5)
     (while (< 1 what_next)
       (if (not (new_dialog "battmod" dcl_id)) (exit))
       (set_tile "battval_prop" BATTVAL_PROP)
       (action_tile "battval_prop" "(setq BATTVAL_PROP $value)")
       (action_tile "battval_champ" "(done_dialog 2)")
       (action_tile "accept" "(done_dialog 1)")
       (action_tile "cancel" "(done_dialog 0)")
       (setq What_next (start_dialog))
       (cond
         ((= what_next 2) (do_battval_champ))
       )
     )
     (if (= what_next 1)  ;  OK
       (progn
         (setq ETIQ (car (nth (atoi BATTVAL_ATTLIST) ATTLIST)))
         (vlax-for ent (vla-get-activeselectionset AcDoc)
           (modif_attrib ent ETIQ BATTVAL_PROP)
         )
         (do_battval_attlist)
         (set_tile "battval_attlist" BATTVAL_ATTLIST)
       )
     )  
   )
 )
)

(defun do_battval_ss ()
 (ssget "_x" (list '(0 . "INSERT") (cons 2 (nth (atoi BATTVAL_BLIST) liste_bl))))
)


(defun battval_dialog (/ BATTVAL_BLIST BATTVAL_ATTLIST dcl_id what_next ATTLIST ss)
 ;; initialisation
 (vla-StartUndoMark AcDoc)
 (setq BATTVAL_BLIST "0")
 (setq BATTVAL_ATTLIST "0")
 ;ouverture de la boîte de dialogue
 (setq dcl_id (load_dialog "battval.dcl"))
 (setq what_next 5)
 (while (< 1 what_next)
   (if (not (new_dialog "battval" dcl_id)) (exit))
   (setq ss (do_battval_ss))
   (start_list "battval_blist")
     (mapcar 'add_list liste_bl)
   (end_list)
   
   (set_tile "battval_blist" BATTVAL_BLIST)
   (set_tile "battval_nbbl" (do_battval_nbbl))
   (do_battval_attlist)
   (set_tile "battval_attlist" BATTVAL_ATTLIST)
       
   (action_tile "battval_attlist" "(setq BATTVAL_ATTLIST $value)")
   (action_tile "battval_blist" "(do_battval_blist)")
   (action_tile "battval_mod" "(do_battval_mod)")
   (action_tile "battval_pick" "(done_dialog 2)")
   (action_tile "accept" "(done_dialog 1)")
   (action_tile "cancel" "(done_dialog 0)")

   (setq What_next (start_dialog))
   (cond
     ((= what_next 2) (do_battval_pick))
   )
 )
 (unload_dialog dcl_id)
 (vla-EndUndoMark AcDoc)
 (if (= what_next 0)  ;  Annuler
   (progn
     (vl-cmdf "_undo" 1) 
     (alert "Tout a été annulé")
   )
 )
)


(defun c:battval (/ AcDoc liste_bl)
 (vl-load-com)
 ;; initialisations
 (setq AcDoc (vla-get-activeDocument (vlax-get-acad-object)))
 ;;
 (setq liste_bl (get_blocklist))
 (if liste_bl
   (battval_dialog)
   (alert "Pas de bloc avec attributs\ndans le dessin")
 )
 (princ) 
)

 

Amicalement

Vincent

  • Upvote 1

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

Bonjour,

 

j'ai également besoin de faire ce genre de manip avec mes cartouches. Toutes les entrées sont basées sur des attributs, ce qui me permets grâce à l'extraction d'attributs de générer des listes de plans (couplé aux jeux de feuille c'est royal). Je peux également facilement modifier des cartouches par lots.

 

J'utilise les lisp suivants :

 

- Pat, le plus simple qui permet de traiter attribut par attribut sur le dessin courant ou un répertoire complet.

 

- Batch Attribute editor de Lee Mac, outil plus complet que pat avec la possibilité de modifier plusieurs attributs simultanément, de choisir les fichiers concernés et d'enregistrer des listes de modification.

 

- Global attribute editor de Lee Mac, Extraction et édition d'attributs.

 

- SheetSet Publisher Plus (6.5$) Un plug in AutoCAD à partir de jeux de feuilles

 

Voilou

Lien vers le commentaire
Partager sur d’autres sites

...des heures de travail répétitif.

 

Des heures ? C'est vrai qu'on a vite fait de perdre du temps à passer d'une présentation à l'autre et ce pour faire 15x la même chose. Il faut s'estimer heureux, cependant, que tes cartouches aient été conçus avec des attributs, sinon cela aurait été encore plus la galère !

 

On peut aussi y arriver sans le lisp : on va directement dans la commande PROPRIETES, on clique sur le bouton sélection rapide (en haut à droite). La sélection rapide s'ouvre puis on clique sur le bouton "Choix des objets" (en haut à droite aussi) et à l'invite "choix des objets" on répond TOUT puis <┘(pour faire le filtre sur tous les objets de toutes les présentations, et pas seulement sur le "dessin entier" qui porte mal son nom car cela ne représente que la présentation courante). Puis à la ligne "type d'objet" on choisit "référence de bloc", dans les propriétés on choisit "nom", dans l'opérateur on prend "égal à" et dans la valeur on indique le nom du bloc concerné. Puis, après avoir validé la sélection rapide par un clic sur OK, on revient dans la liste des propriétés où on peut changer les attributs globalement.

 

Cela permettrait de faire la manip sur une LT ?

 

Amicalement

Vincent

  • Upvote 1

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

 

On peut aussi y arriver sans le lisp : on va directement dans la commande PROPRIETES, on clique sur le bouton sélection rapide (en haut à droite). La sélection rapide s'ouvre puis on clique sur le bouton "Choix des objets" (en haut à droite aussi) et à l'invite "choix des objets" on répond TOUT puis <┘(pour faire le filtre sur tous les objets de toutes les présentations, et pas seulement sur le "dessin entier" qui porte mal son nom car cela ne représente que la présentation courante). Puis à la ligne "type d'objet" on choisit "référence de bloc", dans les propriétés on choisit "nom", dans l'opérateur on prend "égal à" et dans la valeur on indique le nom du bloc concerné. Puis, après avoir validé la sélection rapide par un clic sur OK, on revient dans la liste des propriétés où on peut changer les attributs globalement.

 

Cela permettrait de faire la manip sur une LT ?

 

Amicalement

Vincent

Je viens de le tenter en étant sur l'espace objet, sur une présentation, ou sur une présentation en ayant sélectionné toutes les présentations, mais je n'arrive pas a faire fonctionner ta méthode... à chaque fois ça ne change au mieux que dans une seule présentation. J'ai du rater quelque chose ou avoir une variable qui n'est pas bonne.

 

Je vais aussi essayer les LISP de LeeMac.

Lien vers le commentaire
Partager sur d’autres sites

Je viens de le tenter en étant sur l'espace objet, sur une présentation, ou sur une présentation en ayant sélectionné toutes les présentations, mais je n'arrive pas a faire fonctionner ta méthode... à chaque fois ça ne change au mieux que dans une seule présentation. J'ai du rater quelque chose ou avoir une variable qui n'est pas bonne.

 

Je vais aussi essayer les LISP de LeeMac.

 

je pense qu'il manque l'étape "choix des objets" "TOUT" qui est équivalent au lisp (ssget "_X")

 

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

hello _zebulon,

marrant cette histoire je ne peux pas modifier mon bloc... car il ne le trouve aps... il me trouve plein d'autres blocs mais aps celui que je souhaiterai modifier!!

Phil

 

on peut disposer du fichier ? et du nom du bloc en question ?

 

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

Bonjour,

 

Je ne pense pas dire de bêtises, mais par la sélection rapide, même l'option TOUT ou (ssget "x") se limite seulement aux objets de l'espace courant, soit l'espace objet, soit la présentation courante, mais on ne pourra jamais agir sur les propriétés des objets des autres espaces.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Je ne pense pas dire de bêtises, mais par la sélection rapide, même l'option TOUT ou (ssget "x") se limite seulement aux objets de l'espace courant, soit l'espace objet, soit la présentation courante, mais on ne pourra jamais agir sur les propriétés des objets des autres espaces.

 

Olivier

 

Bonjour,

 

je ne peux dire qu'une chose : fait l'essai !

 

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

Bonjour

 

La manip qu'indique zebulon_ fonctionne, mais avec la commande _filter (ou filtrer en français).

Par contre, avec _selectrap, cela ne fonctionne que sur l'espace courant.

 

@+

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

Bonjour,

 

Autant pour moi, la méthode de Zebulon fonctionne parfaitement. Je n'avais jamais réussi à afficher d'autres objets que ceux de l'espace courant car les sélections d'objets étaient filtrés pour ne garder que ceux de l'espace courant, mais effectivement en utilisant le bouton en haut à droite ça fonctionne bien.

 

On en apprend tous les jours et c'est tant mieux. Merci pour cette astuce.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Bonjour

 

La manip qu'indique zebulon_ fonctionne, mais avec la commande _filter (ou filtrer en français).

Par contre, avec _selectrap, cela ne fonctionne que sur l'espace courant.

 

@+

 

Bonjour,

 

effectivement, _qselect ne fonctionne qu'avec la présentation courante lorsqu'on applique une commande à la sélection, comme EFFACER ou autre. Mais, lorsqu'on est dans la fenêtre PROPRIETES, on peut agir sur les propriétés de tous les objets qu'ils soient en espace objet ou sur n'importe quel onglet.

Bien sûr, cela fonctionne d'autant plus finement avec la commande FILTRER.

 

J'ai fait l'essai avec un bloc inséré dans l'espace objet et dans deux présentations de l'espace papier. Il existe donc trois fois dans le fichier.

Avant la manip, la vue de la présentation 1

post-358-0-55266200-1472719759_thumb.jpg

Avant la manip, la vue de la présentation 2

post-358-0-77084200-1472719823_thumb.jpg

 

Après la manip, on voit que l'attribut est changé dans l'espace objet ainsi que dans la présentation 1

post-358-0-18847700-1472719904_thumb.jpg

et dans la présentation 2

post-358-0-15132800-1472719936_thumb.jpg

 

le tout avec la fenêtre PROPRIETES et son bouton _qselect. L'intérêt est qu'on évite le lisp, sans que cela deviennent une usine à gaz et ma question est de savoir si ça fonctionne aussi bien avec une LT ?

 

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

Salut zebulon_

 

Ta manip' est excellente :)

Toutefois il y a une précision à apporter.

Si le cartouche ou autre bloc avec attributs à modifier n'est que dans les espaces papier, il faut être dans une présentation (n'importe laquelle) pour pouvoir trouver le nom du bloc dans la liste de la sélection rapide. Si on est dans l'onglet "Objet", il n'y a pas le nom du bloc dans la liste des noms de la sélection rapide, sauf si le bloc en question est aussi dans l'espace objet de l'onglet "Objet".

Aussi, pour pouvoir avoir accès au bouton du choix des objet, dans la fenêtre de la sélection rapide, il faut décocher Ajouter au jeu de sélection courant.

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

Cette manip peut être réaliser également avec la commande GATTE des express Tools.

 

En effet mais les Express Tools ne sont pas toujours installés.

L'avantage de la manip' avec la sélection rapide est qu'elle peut fonctionner sans les Express Tools ni lisps. Donc, elle fonctionne aussi avec une version LT, normalement.

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

Oui en effet. Je me place dans le cadre d'une gestion de projets avec une centaine de plans à modifier, dans ce cas, les jeux de feuilles, et lisp énoncés plus haut pour automatiser ce genre de modifications sont indispensables pour une bonne productivité et limiter les tâches fastidieuses.

Lien vers le commentaire
Partager sur d’autres sites

L'avantage de la manip' avec la sélection rapide est qu'elle peut fonctionner sans les Express Tools ni lisps. Donc, elle fonctionne aussi avec une version LT, normalement.

c'était le but de mon complément.

 

Si le cartouche ou autre bloc avec attributs à modifier n'est que dans les espaces papier, il faut être dans une présentation (n'importe laquelle) pour pouvoir trouver le nom du bloc dans la liste de la sélection rapide. Si on est dans l'onglet "Objet", il n'y a pas le nom du bloc dans la liste des noms de la sélection rapide, sauf si le bloc en question est aussi dans l'espace objet de l'onglet "Objet".

ce qui répond à la question de Philsogood. Dans le cas présent, on a des cartouches à modifier qui en principe sont dans l'espace papier et il faudra faire la manip à partir de l'espace papier.

 

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é