Moon_LS Posté(e) le 28 janvier 2005 Posté(e) le 28 janvier 2005 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!
bonuscad Posté(e) le 28 janvier 2005 Posté(e) le 28 janvier 2005 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
Moon_LS Posté(e) le 28 janvier 2005 Auteur Posté(e) le 28 janvier 2005 je pense que ca m'aiderai beaucoup je te remerci mais je ne sais pas créer de routine!!!!désolé je débute vraiment en tout point!!
bonuscad Posté(e) le 28 janvier 2005 Posté(e) le 28 janvier 2005 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
Moon_LS Posté(e) le 28 janvier 2005 Auteur Posté(e) le 28 janvier 2005 ca marche !les calques se classent comme il faut mais juste à l'écran!!! quand tu fait un regen l'ordre se remet comme avant ... dommage
bonuscad Posté(e) le 28 janvier 2005 Posté(e) le 28 janvier 2005 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 dalSi 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
Patrick_35 Posté(e) le 28 janvier 2005 Posté(e) le 28 janvier 2005 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électioncommande _erase puis p ou _last et on valide Et tous nos objets sont passés en avant-plan @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Laurent_CAMPEDEL Posté(e) le 28 janvier 2005 Posté(e) le 28 janvier 2005 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 CAMPEDELDans l'usage des raccourcis clavier repensés tu trouveras la voie.
bonuscad Posté(e) le 28 janvier 2005 Posté(e) le 28 janvier 2005 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érieuresEt ç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
Moon_LS Posté(e) le 31 janvier 2005 Auteur Posté(e) le 31 janvier 2005 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" "
Moon_LS Posté(e) le 31 janvier 2005 Auteur Posté(e) le 31 janvier 2005 non c bon y a pas de problememais sa ne marche toujours pas après un regenmerci quand meme!!
bonuscad Posté(e) le 31 janvier 2005 Posté(e) le 31 janvier 2005 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
Moon_LS Posté(e) le 31 janvier 2005 Auteur Posté(e) le 31 janvier 2005 Non, il n'y a rien dans le repertoire Temp!Je te remerci quand même pour t'être pencher sur la question! merci et @+
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