Aller au contenu

Changer le calque d'un objet dans un bloc


Messages recommandés

Posté(e)

Bonjour,

J'ai un plan avec des centaines de blocs. Chacun de ces blocs contient des lignes, hachures et textes.

Le souci est que toutes les entités de chaque bloc se trouvent sur un même calque.

J'aimerais pouvoir mettre tous les textes dans un calque différent afin de geler ce dernier MAIS sans être obligé d'éditer chaque bloc.

Y a t'il une commande pour ça ou Lisp qui va bien ? (j'ai rien trouvé sur ce forum)

 

D'avance merci de vos lumières ! Vince cool.gif

Posté(e)

Hello

 

RAPPEL : je suis au niveau 0.1 en Lisp/VLisp !

 

Donc j'ai repris une excellente routine de notre Grand Maitre Gilles

Que j'ai tres legerement modifiee ... Cela semble OK ! ... En fait presque !!

 

Je l'ai modifiee pour qu'elle traite les TEXTs simples ("AcDbText") !

Et non pas les MTEXTs ("AcDbMText") ...

 

Par contre, je ne sais pas faire le BATTMAN ou ATTSYNC

au coeur de la routine pour synchroniser les Blocs a chaque Modif !!

 

Donc je suis oblige de faire le BATTMAN ou ATTSYNC manuellement a la fin !!

Et ce N fois sur les N Blocs ...

 

MAIS un Pro va realiser la petite Modif necessaire dans la routine de Gilles !?

 

------------------------------

Au fait DEJA est ce que la routine fonctionne sur ton antique AutoCAD 2007 ??

------------------------------

 

Merci d'avance ...

 

Routine : "Norm_Text_in_Block"

 

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

 

 


;; 
;; http://cadxp.com/topic/44644-subtilite-lisp-bloc/page__pid__257099
;;
;; Routine par GC
;; 
;; Micro-Micro Modif par Patrice : Norm_Text_in_Block (Pour TEXTs simples)
;; 
;; Zara >>> J'utilise le Lisp suivant pour Editer les blocs d'un dessin 
;; Cela fonctionne très bien mais je souhaiterai ne pas toucher aux hachures des blocs 
;; juste les lignes concernant le changement de couleur 
;;
;; Auriez-vous une idée pour modifier le Lisp pour que cela fonctionne?
;; 
;; --- Interrogation Entite/Objet en Lisp ---
;; (entget (car (entsel)) '("*"))
;; 
;; (command "_layer" "_m" "TEXT_BLOCK" "")
;; (command "_layerp")
;; 

(vl-load-com)

(defun c:Norm_Text_in_Block (/ *error* adoc lst_layer layer_for_text func_restore-layers) 

;;;;;;;;;;;; Micro-Micro-Modif par Patrice ;;;;;;;;;;;; 

;;;;;; Nom du Calque des Textes simples ;;;;;; 
(setq layer_for_text "TEXT_BLOCK") 

;;;;;; Creation du calque VOULU ;;;;;; 
(command "_layer" "_m" layer_for_text "") 
(command "_layerp")


 (defun *error* (msg)
   (func_restore-layers)
   (vla-endundomark adoc)
   (princ msg)
   (princ)
   ) ;_ end of defun

 (defun func_restore-layers ()
   (foreach item lst_layer
     (vla-put-lock (car item) (cdr (assoc "lock" (cdr item))))
     (vl-catch-all-apply
       '(lambda ()
          (vla-put-freeze (car item) (cdr (assoc "freeze" (cdr item))))
          ) ;_ end of lambda
       ) ;_ end of vl-catch-all-apply
     ) ;_ end of foreach
   ) ;_ end of defun


 (vla-startundomark
   (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
   ) ;_ end of vla-startundomark
 (vlax-for item (vla-get-layers adoc)
   (setq lst_layer (cons (list item
                               (cons "lock" (vla-get-lock item))
                               (cons "freeze" (vla-get-freeze item))
                               ) ;_ end of list
                         lst_layer
                         ) ;_ end of cons
         ) ;_ end of setq
   (vla-put-lock item :vlax-false)
   (vl-catch-all-apply '(lambda () (vla-put-freeze item :vlax-false)))
   ) ;_ end of vlax-for
 (vlax-for blk (vla-get-blocks adoc)
   (if (and (equal (vla-get-islayout blk) :vlax-false)
            (equal (vla-get-isxref blk) :vlax-false)
            ) ;_ end of and
     (progn
       (vlax-for subent blk 

;;;;;; Pour TOUT sauf les Hachures ;;;;;; 
;;        (if (/= (vla-get-ObjectName subent) "AcDbHatch") 

;;;;;; Pour QUE les Textes simples / multiples ;;;;;;
         (if ( = (vla-get-ObjectName subent) "AcDbText") 
;;        (if ( = (vla-get-ObjectName subent) "AcDbMText") 

           (progn 

;;            (vla-put-layer subent "0") 
;;            (vla-put-layer subent "Text_Block") 
             (vla-put-layer subent layer_for_text) 

;;;;;; Suppression des 3 Modes ByBlock ;;;;;; 
;;            (vla-put-color subent 0)
;;            (vla-put-lineweight subent aclnwtbyblock)
;;            (vla-put-linetype subent "byblock") 

           );_ end of progn
         );_ end of if
       ) ;_ end of vlax-for
     ) ;_ end of progn
   ) ;_ end of if
 ) ;_ end of vlax-for
 (func_restore-layers)
 (vla-endundomark adoc) 

 (princ) 
) ;_ end of defun 

Autodesk Expert Elite Team

Posté(e)

Merci pour ce Lisp qui fonctionne bien sur mon AutoCAD 2017 svp ! biggrin.gif

 

Donc c'est ok mais le souci est que les blocs sont sans attribut (donc BATTMAN et ATTSYNC ne fonctionnent pas) et le texte en MTEXT.

Est-il possible de rajouter une commande qui puisse en même temps convertir les MTEXT des blocs en TEXT ?

Posté(e)

Hello

 

1) RIEN compris ! ... Tu as quelle version de AutoCAD ??

Si ZERO attribut A Priori, tu n'as pas besoin de BATTMAN / ATTSYNC !?

 

2) DEJA SVP est ce que le Lisp est OK pour toi avec les TEXTs simples dans les Blocs ??

 

3) Veux tu en plus une version qui traite les MTEXTs ??

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

Autodesk Expert Elite Team

Posté(e)

Hello

 

1) RIEN compris ! ... Tu as quelle version de AutoCAD ??

Je me suis trompé de forum, je suis sur une 2017 full, désolé.

 

Si ZERO attribut A Priori, tu n'as pas besoin de BATTMAN / ATTSYNC !? En effet.

 

2) DEJA SVP est ce que le Lisp est OK pour toi avec les TEXTs simples dans les Blocs ??Comme le l'ai dit précédemment, oui il fonctionne sur des TEXTs. Mais dans mon cas tous les textes contenus dans les blocs sont en MTEXT.

 

3) Veux tu en plus une version qui traite les MTEXTs ?? Oui et idéalement qui traite aussi bien les TEXTs que les MTEXTs

 

Merci

 

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"Automne 2020, la retraite

Posté(e)

Bonjour à toutes et tous,

 

En les décomposant ils deviennent des textes "simples",..

 

 

Oui bien sûr mais il y a des centaines de blocs différents et je ne me vois pas éditer les bloc un par un pour décomposer le MTEXT à l'intérieur.

Posté(e)

Hello

 

1) SVP tu essayes cette version "Norm_MText_in_Block" ci-dessous (NON TESTEE !) ...

 

2) Tu peux changer CETTE ligne : (setq layer_for_text "TEXTMULT_BLOCK")

Si tu desires un AUTRE Nom de Calque !?

 

3) Tu nous diras ...

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

 

 


;; 
;; http://cadxp.com/topic/44644-subtilite-lisp-bloc/page__pid__257099
;;
;; Routine par GC
;; 
;; Micro-Micro Modif par Patrice : Norm_MText_in_Block (Pour MTEXTs Multiples)
;; 
;; Zara >>> J'utilise le Lisp suivant pour Editer les blocs d'un dessin 
;; Cela fonctionne très bien mais je souhaiterai ne pas toucher aux hachures des blocs 
;; juste les lignes concernant le changement de couleur 
;;
;; Auriez-vous une idée pour modifier le Lisp pour que cela fonctionne?
;; 
;; --- Interrogation Entite/Objet en Lisp ---
;; (entget (car (entsel)) '("*"))
;; 
;; (command "_layer" "_m" "TEXT_BLOCK" "")
;; (command "_layer" "_m" "TEXTMULT_BLOCK" "")
;; (command "_layerp")
;; 

(vl-load-com)

(defun c:Norm_MText_in_Block (/ *error* adoc lst_layer layer_for_text func_restore-layers) 

;;;;;;;;;;;; Micro-Micro-Modif par Patrice ;;;;;;;;;;;; 

;;;;;; Nom du Calque des Textes Multiples ;;;;;; 
(setq layer_for_text "TEXTMULT_BLOCK") 

;;;;;; Creation du calque VOULU ;;;;;; 
(command "_layer" "_m" layer_for_text "") 
(command "_layerp")


 (defun *error* (msg)
   (func_restore-layers)
   (vla-endundomark adoc)
   (princ msg)
   (princ)
   ) ;_ end of defun

 (defun func_restore-layers ()
   (foreach item lst_layer
     (vla-put-lock (car item) (cdr (assoc "lock" (cdr item))))
     (vl-catch-all-apply
       '(lambda ()
          (vla-put-freeze (car item) (cdr (assoc "freeze" (cdr item))))
          ) ;_ end of lambda
       ) ;_ end of vl-catch-all-apply
     ) ;_ end of foreach
   ) ;_ end of defun


 (vla-startundomark
   (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
   ) ;_ end of vla-startundomark
 (vlax-for item (vla-get-layers adoc)
   (setq lst_layer (cons (list item
                               (cons "lock" (vla-get-lock item))
                               (cons "freeze" (vla-get-freeze item))
                               ) ;_ end of list
                         lst_layer
                         ) ;_ end of cons
         ) ;_ end of setq
   (vla-put-lock item :vlax-false)
   (vl-catch-all-apply '(lambda () (vla-put-freeze item :vlax-false)))
   ) ;_ end of vlax-for
 (vlax-for blk (vla-get-blocks adoc)
   (if (and (equal (vla-get-islayout blk) :vlax-false)
            (equal (vla-get-isxref blk) :vlax-false)
            ) ;_ end of and
     (progn
       (vlax-for subent blk 

;;;;;; Pour TOUT sauf les Hachures ;;;;;; 
;;        (if (/= (vla-get-ObjectName subent) "AcDbHatch") 

;;;;;; Pour QUE les Textes simples / multiples ;;;;;;
;;        (if ( = (vla-get-ObjectName subent) "AcDbText") 
         (if ( = (vla-get-ObjectName subent) "AcDbMText") 

           (progn 

;;            (vla-put-layer subent "0") 
;;            (vla-put-layer subent "Text_Block") 
             (vla-put-layer subent layer_for_text) 

;;;;;; Suppression des 3 Modes ByBlock ;;;;;; 
;;            (vla-put-color subent 0)
;;            (vla-put-lineweight subent aclnwtbyblock)
;;            (vla-put-linetype subent "byblock") 

           );_ end of progn
         );_ end of if
       ) ;_ end of vlax-for
     ) ;_ end of progn
   ) ;_ end of if
 ) ;_ end of vlax-for
 (func_restore-layers)
 (vla-endundomark adoc) 

 (princ) 
) ;_ end of defun 

Autodesk Expert Elite Team

Posté(e)

Merci Lecrabe, ça fonctionne !

 

Pour plus de précision, est-il possible d'ajouter une sélection des blocs par FENETRE ou CAPTURE ?

(désolé, j'y connais rien en Lisp :-/ )

Posté(e)

Hello Gilles

 

0) Si tu passes par LA, SVP peux tu aider ?

 

1) Pour les 2 routines LSP - Passer par une selection CLASSIQUE et non pas TOUT le DWG !?

 

2) Ajouter en fin de boucle pour chaque Bloc traite un ATTSYNC

Ainsi si il y a des Attributs, c OK !!

 

Merci d'avance ...

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

Autodesk Expert Elite Team

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é