Aller au contenu

ordre d\'affichage des calques


Messages recommandés

Posté(e)

Salut à tous!

 

voila, je débute en autocad et j'ai un petit soucis.

Je voudrai pouvoir régler l'ordre d'affichage des calques dans mon fichier.

Je connais l'option ordre d'affichage (avant, arrière,...) mais je voudrais savoir si il n'y a pas une méthode plus rapide pour définir un ordre d'afichage des calques sous forme d'un gestionnaire ou quelquechose comme ça!

 

merci!

 

Posté(e)

Salut,

 

Une ébauche de routine qui peut comporter des imperfections, mais qui réalise ton souhait (enfin devrait)

Le lisp: OrdreCalque.lsp

(defun ordclqerr (ch)
(cond
	((eq ch "Function cancelled") nil)
	((eq ch "quit / exit abort") nil)
	((eq ch "console break") nil)
	(T (princ ch))
)
(command "_.undo" "_end")
(if (<= sv_und 3) (command "_.undo" "_control" "_one"))
(command "_.undo" "1")
(setq *error* olderr)
(setvar "cmdecho" 1)
(princ)
)
(defun lst2listbox ( lststr lstbox / )
(start_list lstbox)
(mapcar 'add_list lststr)
(end_list)
)
(defun lay_add ( lstlay lstlf / lstnum)
(setq lstnum (read (strcat "(" (get_tile "lst_all_lay") ")")))
(foreach num lstnum
	(if (not (member (nth num lstlay) lstlf))
		(setq lstlf (cons (nth num lstlay) lstlf))
	)
)
(lst2listbox lstlf "lst_sel_lay")
lstlf
)
(defun lay_sub ( lstlf / lstnum lstote)
(setq lstnum (read (strcat "(" (get_tile "lst_sel_lay") ")")))
(setq lstote (mapcar '(lambda (num) (nth num lstlf)) lstnum))
(foreach layername lstote
	(setq lstlf
		(append (reverse (cdr (member layername (reverse lstlf))))
			(cdr (member layername lstlf))
		)
	)
)
(lst2listbox lstlf "lst_sel_lay")
lstlf
)
(defun makelaylists (/ layname ss cvpname xdlist vpldata sortlist name templist)
(if (= (setq tilemode (getvar "tilemode")) 0)
	(progn
		(setq ss
			(ssget "_x"
				(list (cons 0 "VIEWPORT")
					(cons 69 (getvar "CVPORT"))
				)
			)
		) 
		(setq cvpname (ssname ss 0))
		(setq xdlist (assoc -3 (entget cvpname '("acad"))))
		(setq vpldata (cdadr xdlist))
	)
)
(setq sortlist nil)
(setq templist (tblnext "LAYER" T))
(while templist
	(setq name (cdr (assoc 2 templist)))
	(setq sortlist (cons name sortlist))
	(setq templist (tblnext "LAYER"))
) 
(if (>= (getvar "maxsort") (length sortlist))
	(setq sortlist (acad_strlsort sortlist))
	(setq sortlist (reverse sortlist))
)
)
(defun c:ordrecalque ( / sv_und olderr dcl_id lstlay lstlf t_xwt ok_cmd lst_order dxf_67 jss)
(setvar "CMDECHO" 0)
(if (<= (setq sv_und (getvar "undoctl")) 3)
	(command "_.undo" "_control" "_all")
)
(command "_.undo" "_group")
(setq olderr *error* *error* ordclqerr)
(setq dcl_id (load_dialog "ordrecalque.dcl"))
(if (new_dialog "ordrecalque" dcl_id)
	(progn
		(setq lstlay (makelaylists) lstlf '())
		(lst2listbox lstlay "lst_all_lay")
		(lst2listbox lstlf "lst_sel_lay")
		(action_tile "pick_add" "(setq lstlf (lay_add lstlay lstlf))")
		(action_tile "pick_sub" "(setq lstlf (lay_sub lstlf))")
		(action_tile "xwt_frt" "(setq t_xwt $value)")
		(action_tile "accept" "(done_dialog 1)")
		(setq ok_cmd (start_dialog))
		(if (= ok_cmd 1)
			(progn
				(setq lst_order (reverse lstlf))
				(if (eq (getvar "CVPORT") 1)
					(setq dxf_67 '(67 . 1))
					(setq dxf_67 '(67 . 0))
				)
;					(setq dxf_69 (cons 69 (getvar "CVPORT")))
				(while lst_order
					(setq js (ssget "_X" (list dxf_67 (cons 8 (car  lst_order)))))
					(if (not (null js))
						(command "_.draworder" js "" "_front")
					)
					(setq lst_order (cdr lst_order))
				)
			)
		)
		(cond
			(t_xwt
				(setq js (ssget "_X" (list dxf_67 '(0 . "WIPEOUT"))))
				(if (not (null js))
					(command "_.draworder" js "" "_front")
				)
				(setq js (ssget "_X" (list dxf_67 '(0 . "TEXT"))))
				(if (not (null js))
					(command "_.draworder" js "" "_front")
				)
				(setq js (ssget "_X" (list dxf_67 '(0 . "MTEXT"))))
				(if (not (null js))
					(command "_.draworder" js "" "_front")
				)
			)
		)
	)
)
(command "_.undo" "_end")
(if (<= sv_und 3) (command "_.undo" "_control" "_one"))
(command "_.undo" "1")
(setq *error* olderr)
(setvar "CMDECHO" 1)
(princ)
)

et le DCL: OrdreCalque.dcl

ordrecalque : dialog {
 label= "Sélection des calques à ordonner pour l'affichage";
 : column {
   : row {
     : list_box {
       label = "Liste des Calques";
       key = "lst_all_lay";
       width = 25;
       multiple_select = true;
     }
     : column {
         fixed_height = true;
         : button {key = "pick_add"; label = ">";}
         : button {key = "pick_sub"; label = "<";}
     }
     : list_box {
       label = "Calques ordonnés à sousmettre";
       key = "lst_sel_lay";
       width = 25;
       multiple_select = true;
     }
     : column {
       :text {
  label = "Priorité +";
       }
       :text {
  label = "Priorité -";
       }
     }
   }
   : toggle {
label    = "Placer les Textes et Masques au dessus de tout en dernier";
mnemonic = "T";
key      = "xwt_frt";
   }
   ok_cancel;
 }
}

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Tu n'a pas de routine à créer ?!?! .

 

Tu fais simplement un copier-coller dans le bloc-note que tu enregistreras dans un fichier.

Dans ce cas ici présent choirsir comme nom "Ordrecalque.lsp " pour la première partie et "Odrecalque.dcl" pour la deuxième.

 

Ces fichiers DOIVENT (ici à cause du DCL qui est necessaire à la routine) être enregistrés dans un chemin de recherche d'AutoCAD. (ceux déclaré dans les options)

 

Tape la commande "APPLOAD" et sélectionne ton fichier .lsp

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

En effet :mad:

 

J'avais bien dis que c'était une ébauche (Je n'ai pas fait de tests approfondis)

Désolé :exclam:

 

En tout cas je ne comprends pas pourquoi tout est perdu après un REGEN.

Manuellement la commande "_.draworder" fonctionne et une régénération n'affecte pas le résultat.

 

Tout ce que je sais, c'est que la commande fixe systématiquement la variable "SORTENTS" à 127.

J'ai essayé auusi d'appeler la fonction en changeant ma ligne:

(command "_.draworder" js "" "_front")

par:

(progn

(sssetfirst nil js)

(ai_draworder "_front")

)

Mais nibe, que dal

Si quelqu'un trouve le pourquoi du comment .....

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

J'ai bien une solution qui pourrait convenir, elle ne vaut pas la commande _draworder, mais enfin...

Il suffit de faire une copie des objets que l'on veut mettre en avant-plan puis d'effacer la sélection

 

commande _copy --> sélection puis un clic sur l'écran en point de base (qu'importe la localisation) puis @

 

Ensuite on efface la sélection

commande _erase puis p ou _last et on valide

 

Et tous nos objets sont passés en avant-plan

 

@+

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)

Sur la 2004, cela fonctionne encore, mais sur la 2005 ?

Si j'ai bien vu, la variable sortens a été supprimée ?

Y a-t-il encore une gestion de l'ordre d'affichage en fonction de l'ordre de création des entités ?

 

Déjà sur la 2004, le tri par ordre de création des entités pour les accrochages aux objets ne fonctionnait plus. Cette récession, couplé au bug d'accrochage sur les entités des blocs et xref, rend moins rapide et productif les accrochages, même si l'on a gagné le passage en revue des accrochages via la touche tabulation...

 

Quoiqu'il en soit, dans ce cas précis d'ordre à gérer par couche, la recopie puis effaçage du jeu de sélection n'est pas envisageable.

Laurent CAMPEDEL

Dans l'usage des raccourcis clavier repensés tu trouveras la voie.

Posté(e)

Je crois avoir compris ce qui bloque.

En fait, je pense que la fautive est la case de dialogue car j'ai essayer de faire fonctionner la routine sans la boite de dialogue et la régénération n'a plus d'incidence sur l'appel de la commande "_draworder".

Pour pouvoir utiliser malgré tout la boite de dialogue, c'est quand même plus pratique pour classer, j'ai fait une routine indépendante qui récupère la liste des calques dans un fichier.

En tout cas sous 2002 c'est OK, a voir avec les versions supérieures

Et ça reste encore en évaluation ...

 

Donc voici les 2 routines lisp, le DCL ne change pas par rapport au précédent.

 

OrdreCalque.lsp (remplace le précédent)

(defun ordclqerr (ch)
(cond
	((eq ch "Function cancelled") nil)
	((eq ch "quit / exit abort") nil)
	((eq ch "console break") nil)
	(T (princ ch))
)
(command "_.undo" "_end")
(if (<= sv_und 3) (command "_.undo" "_control" "_one"))
(command "_.undo" "1")
(setq *error* olderr)
(setvar "cmdecho" 1)
(princ)
)
(defun lst2listbox ( lststr lstbox / )
(start_list lstbox)
(mapcar 'add_list lststr)
(end_list)
)
(defun lay_add ( lstlay lstlf / lstnum)
(setq lstnum (read (strcat "(" (get_tile "lst_all_lay") ")")))
(foreach num lstnum
	(if (not (member (nth num lstlay) lstlf))
		(setq lstlf (cons (nth num lstlay) lstlf))
	)
)
(lst2listbox lstlf "lst_sel_lay")
lstlf
)
(defun lay_sub ( lstlf / lstnum lstote)
(setq lstnum (read (strcat "(" (get_tile "lst_sel_lay") ")")))
(setq lstote (mapcar '(lambda (num) (nth num lstlf)) lstnum))
(foreach layername lstote
	(setq lstlf
		(append (reverse (cdr (member layername (reverse lstlf))))
			(cdr (member layername lstlf))
		)
	)
)
(lst2listbox lstlf "lst_sel_lay")
lstlf
)
(defun makelaylists (/ layname ss cvpname xdlist vpldata sortlist name templist)
(if (= (setq tilemode (getvar "tilemode")) 0)
	(progn
		(setq ss
			(ssget "_x"
				(list (cons 0 "VIEWPORT")
					(cons 69 (getvar "CVPORT"))
				)
			)
		) 
		(setq cvpname (ssname ss 0))
		(setq xdlist (assoc -3 (entget cvpname '("acad"))))
		(setq vpldata (cdadr xdlist))
	)
)
(setq sortlist nil)
(setq templist (tblnext "LAYER" T))
(while templist
	(setq name (cdr (assoc 2 templist)))
	(setq sortlist (cons name sortlist))
	(setq templist (tblnext "LAYER"))
) 
(if (>= (getvar "maxsort") (length sortlist))
	(setq sortlist (acad_strlsort sortlist))
	(setq sortlist (reverse sortlist))
)
)
(defun c:ordrecalque ( / sv_und olderr dcl_id lstlay lstlf t_xwt ok_cmd lst_order file_o)
(setvar "CMDECHO" 0)
(if (<= (setq sv_und (getvar "undoctl")) 3)
	(command "_.undo" "_control" "_all")
)
(command "_.undo" "_group")
(setq olderr *error* *error* ordclqerr)
(setq dcl_id (load_dialog "ordrecalque.dcl"))
(if (new_dialog "ordrecalque" dcl_id)
	(progn
		(setq lstlay (makelaylists) lstlf '())
		(lst2listbox lstlay "lst_all_lay")
		(lst2listbox lstlf "lst_sel_lay")
		(action_tile "pick_add" "(setq lstlf (lay_add lstlay lstlf))")
		(action_tile "pick_sub" "(setq lstlf (lay_sub lstlf))")
		(action_tile "xwt_frt" "(setq t_xwt $value)")
		(action_tile "accept" "(done_dialog 1)")
		(setq ok_cmd (start_dialog))
		(if (= ok_cmd 1)
			(setq lst_order lstlf)
		)
	)
)
(cond
	(lst_order
		(setq file_o (open (strcat (getvar "TEMPPREFIX") "$ordrecalque.txt") "w"))
		(if t_xwt (write-line "T" file_o) (write-line "nil" file_o))
		(foreach n lst_order (write-line n file_o))
		(close file_o)
	)
	(T (princ "\nLa commande a échouée."))
)
(command "_.undo" "_end")
(if (<= sv_und 3) (command "_.undo" "_control" "_one"))
(command "_.undo" "1")
(setq *error* olderr)
(if (not go_ordlay) (load "go_ordlay.lsp"))
(go_ordlay)
(setvar "CMDECHO" 1)
(princ)
)

 

Et le nouveau go_ordlay.lsp

(defun go_ordlay ( / file_o file_ini lay lst_order t_xwt dxf_67 js)
(cond
	((findfile (setq file_o (strcat (getvar "TEMPPREFIX") "$ordrecalque.txt")))
		(setq file_ini (open file_o "r") lst_order (list))
		(while (setq lay (read-line file_ini))
			(setq lst_order (cons lay lst_order))
		)
		(if (read (car lst_order))
			(setq t_xwt T)
			(setq t_xwt nil)
		)
		(close file_ini)
		(if (eq (getvar "CVPORT") 1)
			(setq dxf_67 '(67 . 1))
			(setq dxf_67 '(67 . 0))
		)
		(while lst_order
			(setq js (ssget "_X" (list dxf_67 (cons 8 (car  lst_order)))))
			(if (not (null js))
				(progn
					(sssetfirst nil js)
					(ai_draworder "_front")
				)
			)
			(setq lst_order (cdr lst_order))
		)
		(cond
			(t_xwt
				(setq js (ssget "_X" (list dxf_67 '(0 . "WIPEOUT"))))
				(if (not (null js))
					(progn
						(sssetfirst nil js)
						(ai_draworder "_front")
					)
				)
				(setq js (ssget "_X" (list dxf_67 '(0 . "TEXT"))))
				(if (not (null js))
					(progn
						(sssetfirst nil js)
						(ai_draworder "_front")
					)
				)
				(setq js (ssget "_X" (list dxf_67 '(0 . "MTEXT"))))
				(if (not (null js))
					(progn
						(sssetfirst nil js)
						(ai_draworder "_front")
					)
				)
			)
		)
	)
	(T (princ "\nIl n'y a pas de liste de calques."))
)
(prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

un tou petit problème avec la nouvelle vesion que tu viens de donner,

 

" La commande a échouée.; erreur: La commande CHARGER n'a pas abouti:

"go_ordlay.lsp" "

 

 

Posté(e)

Bon ben 2002 c'est OK (enfin pour moi), 2004 ca vas pas. C'est bien 2004 que tu utilise?

 

Tu peux regarder quand même (pour info) si le fichier "$ordrecalque.txt" a été écrit dans le dossier temporaire de ta machine ("TEMP").

Si oui essaye , après avoir chargé (load"go_ordlay") de taper (go_ordlay) au message commande. Dans ton dessin concerné bien sur.

 

Si non, j'ai pas de suite à donner a ton problème. pour l'instant.

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

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é