bonuscad Posté(e) le 18 juillet 2006 Posté(e) le 18 juillet 2006 Pour m'aguerrir avec les fonctions Vlax, je me suis lancer dans une routine pour "Allumer/Dégeler" des calques par pointage façon ExpressTools. Cela peut être pratique quand les noms de calques ne sont pas "parlants", qu'il y a une liste interminable de calques et qu'on voudrait réactiver un/des calques par visualisations de ce qu'il y a dans les calques éteints ou gelés. Il suffit alors de pointer un objet pour réactiver le calque. Voici le code (defun c:layer_on-thaw ( / tbl_lay lst_lay lst_frz lst_thw lst_off lst_on key msg mod_sel ent name lst_sel) (vl-load-com) (vla-startundomark (vla-get-activedocument (vlax-get-acad-object))) (defun switch_lay (l_lay action table_lay statut / why) (setq why (if statut ':vlax-true ':vlax-false)) (foreach n l_lay (cond ((eq action "Freeze") (vla-put-Freeze (vla-item table_lay n) why) ) ((eq action "Off") (vla-put-Layeron (vla-item table_lay n) why) ) ) ) ) (setq tbl_lay (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object)))) (vlax-for x tbl_lay (setq lst_lay (cons (vla-get-name x) lst_lay)) ) (setq lst_lay (reverse lst_lay)) (foreach n lst_lay (if (eq (vla-get-Freeze (vla-item tbl_lay n)) ':vlax-true) (setq lst_frz (cons n lst_frz)) (setq lst_thw (cons n lst_thw)) ) (if (eq (vla-get-Layeron (vla-item tbl_lay n)) ':vlax-false) (setq lst_off (cons n lst_off)) (setq lst_on (cons n lst_on)) ) ) (switch_lay lst_frz "Freeze" tbl_lay nil) (switch_lay lst_on "Off" tbl_lay nil) (initget "Allumer Libérer 2actions _On Thaw 2actions") (setq key (getkword "\nVoulez vous [Allumer/Libérer/2actions] les calques? < 2actions > : ")) (cond ((eq key "On") (switch_lay lst_off "Off" tbl_lay T) (setq msg "Allumer") ) ((eq key "Thaw") (switch_lay lst_frz "Off" tbl_lay T) (setq msg "Libérer") ) (T (switch_lay lst_off "Off" tbl_lay T) (switch_lay lst_frz "Off" tbl_lay T) (setq msg "Allumer & Libérer") ) ) (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acAllViewports) (setq mod_sel '(entsel (strcat "\nSélectionnez une entité sur le calque à " msg " [Option/Annuler]: "))) (initget "Option Annuler U _Set Undo U") (while (setq ent (eval mod_sel)) (cond ((eq ent "Set") (initget "Entité Imbriqué _Entity Nested") (if (eq (getkword "\nChoix par du calque par [Entité/Imbriqué]? < Entité > : ") "Nested") (setq mod_sel '(nentsel (strcat "\nSélectionnez une entité imbriqué sur le calque à " msg " [Option/Annuler]: "))) (setq mod_sel '(entsel (strcat "\nSélectionnez une entité sur le calque à " msg " [Option/Annuler]: "))) ) ) ((or (eq ent "Undo") (eq ent "U")) (if lst_sel (setq lst_sel (cdr lst_sel)) (princ "\nRien à annuler.") ) ) (T (setq lst_sel (cons (setq name (cdr (assoc 8 (entget (car ent))))) lst_sel)) (princ (strcat "\nLe calque " name " sera réactivé.")) ) ) (initget "Option Annuler U _Set Undo U") ) (cond ((eq key "On") (foreach n lst_sel (setq lst_off (vl-remove n lst_off)) ) ) ((eq key "Thaw") (foreach n lst_sel (setq lst_frz (vl-remove n lst_frz)) ) ) (T (foreach n lst_sel (setq lst_off (vl-remove n lst_off)) (setq lst_frz (vl-remove n lst_frz)) ) ) ) (switch_lay lst_on "Off" tbl_lay T) (switch_lay lst_frz "Freeze" tbl_lay T) (switch_lay lst_off "Off" tbl_lay nil) (vla-endundomark (vla-get-activedocument (vlax-get-acad-object))) (prin1) ) Appels à (command) modifiés avec les remarques de Patrick_35 et variable prompt changé en msg [Edité le 18/7/2006 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 18 juillet 2006 Posté(e) le 18 juillet 2006 Salut bonusJ'ai essayé ton lisp et j'ai juste trois ou quatre remarques1) Je suis surpris que le dessin soit complètement dégelé, même pour les xrefs2) Impossible de geler une entité sur un xref3) Pour éviter un (command "_.regenall"), tu peux utiliser (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acAllViewports) ou son équivalent (vla-regen (vla-get-activedocument (vlax-get-acad-object)) 1)4) Pour éviter un (command "_.undo" "_begin") et un (command "_.undo" "_end"), tu peux utiliser un (vla-startundomark (vla-get-activedocument (vlax-get-acad-object))) et un (vla-endundomark (vla-get-activedocument (vlax-get-acad-object))) Mais ça fait plaisir de te voir enfin franchir le pas. :) Je sens que bientôt tes lisps vont décoiffer un peu plus @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 18 juillet 2006 Auteur Posté(e) le 18 juillet 2006 Merci pour tes encouragements, 1) Ben..., pour pouvoir pointer les entités, je suis bien obligé de dégeler tous les calques gelés.Mais ceci est temporaire pour l'action de la commande. Les calques sont remis à l'état initial, sauf bien sûr ceux qui ont été selectionnés. 2) Je supose que tu voulais dire "Dégeler" une entité d'un Xref. Si c'est possible, mais il faut passer par les options d'abords et choisir "Imbriqué". Nota; cette option N'EST PAS conservé lors d'une utilisation suivante, toujours l'option simple utilisé par défaut. 3) Bien noté chef ;) par encore tous les réflexes ! 4) idem Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 18 juillet 2006 Posté(e) le 18 juillet 2006 2) La fonction layfrz gèle les entités dans les xrefs3&4) C'est le commencement et c'est pour t'indiquer où ça se trouve, mais je ne doute pas que tu t'en serviras et que tu les aurais trouvé d’une manière ou d’une autre ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 18 juillet 2006 Posté(e) le 18 juillet 2006 Salut, Comme Patrick_35, je dirais que si tu te mets au vlisp, ÇA VA FAIRE MAL !!! ;) Je n'aurais qu'une autre petite remarque, tu utilise comme varaiable locale un symbole protégé : prompt. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 18 juillet 2006 Auteur Posté(e) le 18 juillet 2006 tu utilise comme varaiable locale un symbole protégé : prompt. J'ai vraiment fait une erreur de débutant, merci pour la remarque. La fonction layfrz gèle les entités dans les xrefs Là je ne saisi pas trop car la fonction dégéle aussi les entités dans les xrefs, mais il faut passer systématiquement par Option et Imbriqué. Il faudrait peut être que l'option soit conservée d'une utilisation à l'autre ou alors ma démarche n'est pas claire... Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 18 juillet 2006 Posté(e) le 18 juillet 2006 Tu n'utilises pas l'éditeur VisualLISP ? Les symboles protégés y apparaissent en bleu, les autres -fontions (defun), variables- en noir. http://img134.imageshack.us/img134/5573/promptxw2.png [Edité le 18/7/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 18 juillet 2006 Posté(e) le 18 juillet 2006 Là je ne saisi pas trop car la fonction dégéle aussi les entités dans les xrefs Oui, oui, c'est moi qui n'est pas bien saisi sur le moment @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Messages recommandé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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant