Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

Salut bonus

J'ai essayé ton lisp et j'ai juste trois ou quatre remarques

1) Je suis surpris que le dessin soit complètement dégelé, même pour les xrefs

2) Impossible de geler une entité sur un xref

3) 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

2) La fonction layfrz gèle les entités dans les xrefs

3&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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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

Posté(e)

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

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é