Aller au contenu

Changer le calque d'un objet dans un bloc


Vince-34
 Partager

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Partager

×
×
  • Créer...