Aller au contenu

modification de force8 en forcebylayer


sechanbask

Messages recommandés

Bonjour,

 

J’utilise le lisp force8 depuis quelque temps déjà car il est extrêmement efficace. J'aimerais ajouter quelques fonctions mais j'aurais besoin d'explication sur son fonctionnement. Je l'ai volontairement renommé pour qu'il corresponde à mes besoins. En effet, je souhaite passer toutes les entités en bylayer, et toutes les entités des blocs sur le calque 0 pour pouvoir purger un maximum de calque. je souhaite également changer tous les calques d'une certaine couleur, puis lancer la commande c_txt, mais ça c'est pour plus tard.

 

(defun c:FORCEBYLAYER (/ doc)
(vl-load-com)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vlax-map-collection
 (vla-get-blocks doc)
 '(lambda (x)
   (vlax-for item x
; Mettre toutes les entités en couleur DUCALQUE
     (vla-put-color item 256)
  
  ; Mettre toutes les entités du bloc sur le calque 0
  (vla-put-layer item 0)
   )
 )
)
(vla-regen doc acAllViewports)
(princ)
)

 

J'ai rajouté la ligne (vla-put-layer item 0), en pensant que seul les entités du bloc serait affecté mais ce n'est pas le cas pourquoi ? Comment faire pour que seul les entités du bloc passe sur le calque 0 ?

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

L'espace Objet et les espaces Papier sont eux-même des blocs, il faut donc tester le nom du bloc en cours de modification pour les ignorer:

 

(defun c:FORCEBYLAYER (/ doc)
(vl-load-com)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vlax-map-collection
 (vla-get-blocks doc)
 '(lambda (x)
   (setq bname (strcase (vla-get-Name x)))
   (if (not (or (= bname "*MODEL_SPACE") (wcmatch bname "\*PAPER_SPACE*")))
     (progn
       (vlax-for item x
           ; Mettre toutes les entités en couleur DUCALQUE
         (vla-put-color item 256)
             
             ; Mettre toutes les entités du bloc sur le calque 0
             (vla-put-layer item 0)
       )
     )
   )
 )
)
(vla-regen doc acAllViewports)
(princ)
)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Il me semble que sechenbask veut mettre tous les objets en couleur ByLayer et uniquement ceux dans les blocs sur le calque "0" (

 

PS1 : pour tester si le bloc est un espace, la propriété IsLayout est plus pratique que les test sur le nom du bloc.

PS2 : j'ai tout passé en 'vlax-for', je trouvais inélégant ce mélange de 'vlax-map' et 'vlax-for'.

 

(defun c:FORCEBYLAYER (/ doc)
 (vl-load-com)
 (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
 ;; pour chaque bloc du document
 (vlax-for block (vla-get-Blocks doc)
   ;; pour chaque objet du bloc
   (vlax-for obj block
     ;; si le bloc n'est pas un Layout...
     (if (= (vla-get-IsLayout block) :vlax-false)
       ;; ...on met l'objet sur le calque "0"
(vla-put-Layer obj "0")
     )
     ;; dans tous les cas on met l'objet en couleur ByLayer
     (vla-put-Color obj 256)
   )
 )
 (vla-regen doc acAllViewports)
 (princ)
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

notez les guillemets, les noms de calques sont de chaînes de caractères !

Tu as bien sûr raison. Je n'y ai pas prêté attention, car manifestement ça fonctionne sans les guillemets quand le nom du calque est un nombre. :mellow:

 

PS1 : pour tester si le bloc est un espace, la propriété IsLayout est plus pratique que les test sur le nom du bloc.

C'est bien mieux en effet.

 

PS2 : j'ai tout passé en 'vlax-for', je trouvais inélégant ce mélange de 'vlax-map' et 'vlax-for'.

Gnagnagna... :P

Lien vers le commentaire
Partager sur d’autres sites

merci à vous deux, ce que vous avez modifier marche à la perfection,

 

comment savoir quel type d'entité je suis en train de traiter ? car si c'est un texte, il faudrait que lance la commande c_txt pour déforcer le texte, si c'est une cote, la supprimer, etc...

 

Encore merci !!

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

Bonjour,

 

j'ai pas encore compris comment intégrer certaine chose mais j'ai ajouté quelques fonction pour me rapporcher de mon feu nettoyeur en VBA.

 

(defun c:FORCEBYLAYER (/ doc)
 ;; todo
 ;; dévérouiller les calques
 ;; mettre tous les calques en couleur 8
 ;; supprimer toutes les cotations
 ;; traiter les textes pour supprimer le forçage
   
 (vl-load-com)
 (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
 ;; pour chaque bloc du document
 (vlax-for block (vla-get-Blocks doc)
   ;; pour chaque objet du bloc
   (vlax-for obj block
     ;; si le bloc n'est pas un Layout...
     (if (= (vla-get-IsLayout block) :vlax-false)
       ;; ...on met l'objet sur le calque "0"
       (vla-put-Layer obj "0")
     )
     ;; dans tous les cas on met l'objet en couleur ByLayer
     (vla-put-Color obj 256)
   )
 )
 (vla-regen doc acAllViewports)
 
 ;; Mettre à jour les modification apporté aux attributs
 
 (command "attsync" "N" "*")
 
 ;; Changer le style de point en invisible
 
 (command "pdmode" "0")
 
 ;; Mettre à jour l'affiche pour voir les modifications apportées
 
 (command "regen")
 
 (princ)
)

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Lien vers le commentaire
Partager sur d’autres sites

  • 4 mois après...

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é