Elun Posté(e) le 15 octobre 2019 Posté(e) le 15 octobre 2019 Bonjour à tous, J'ai un petit souci sur un de mes programmes. Je ne sais pas vraiment comment m'y prendre pour récupérer la liste des calques visibles dans une VIEWPORT (sélectionnée par l'utilisateur via (entsel) par exemple). Dans mon programme actuel, je récupère la liste des calques gelés (en général) et je passe cette liste pour la commande -SUPCALQUE. Le but de la manip' c'est lorsqu'on travaille sur des fichiers et que l'on souhaite purger un dessin pour un prestataire, on conserve généralement les données présentes dans un plan particulier. Pour le moment j'ai trouvé la combine de créer un filtre de propriété en rendant la VIEWPORT active basé sur le gel des calques dans la fenêtre, dégeler tous les calques (hors X-ref), puis geler tous les calques appartenant au filtre de propriété. Suite à cette manip' ma commande fonctionne mais c'est un peu triste de ne pas automatiser le processus. Je n'ai pas trouvé de résultats concluant dans les propriétés de la VIEWPORT mais j'avoue commencer à peine le visual lisp donc je m'en tiens aux routines basiques ^^'Donc si vous avez des idées sur une méthode, cela m'aiderait beaucoup :P Elun
GEGEMATIC Posté(e) le 15 octobre 2019 Posté(e) le 15 octobre 2019 salut,J'ai un vieux code bricolé qui me sert encore a faire un "pasteEtatCalque" d'un fenêtre à l'autre. ;;************************************************************************** ;§/calques/ lit l'état gelé-libéré fen courante d'un viewport et génere la chaine layer-string-state/none ;;inspiré de Paul Turvill (defun c:PickReferenceViewport (/ v2 frz flist l1 n is-viewport) (command "_pspace") (while (not is-viewport) (prompt "\nSelectionnez la fenêtre de référence pour l'état de calques" ) (setq v2 (ssname (ssget ":s" '((0 . "viewport"))) 0) ;;; (car ;;; (entsel ;;; "\nSelectionnez la fenêtre de référence pour l'état de calques" ;;; ) ;;; ) ) ;;pick the viewport (if (= "VIEWPORT" (cdr (assoc 0 (entget v2)))) (setq is-viewport T) (prompt "\nNot a viewport, please select a viewport") ) ) (setq frz (cdadr (assoc -3 (entget v2 (list "acad"))))) ;;...and frz will contain the viewport's extended data, with each frozen ;;viewport as the argument of a different "1003" code group. ;;To get a comma-delimited list of the frozen viewports, use: (setq flist nil) (foreach n frz (if (= (car n) 1003) (setq L1 (cdr n) ;; flist (strcat flist L1 ",") flist (cons L1 flist) ) ) ;;if ) ;;flist ;;Any layer not contained in flist is thawed in the selected viewport. (setq layer-string-state flist) (vl-propagate 'layer-string-state) ) ;;************************************************************************** ;§/calques/ restaure l'état gelé-libéré fen courante à un autre viewport à partir de la chaine layer-string-state/none (defun c:PickTargetViewport (/ v2 nvport is-viewport) (while (not is-viewport) (prompt "\nSelectionnez la fenêtre cible pour l'état de calques") (setq v2 (ssname (ssget ":s" '((0 . "viewport"))) 0) ;;; (car ;;; (entsel ;;; "\nSelectionnez la fenêtre cible pour l'état de calques" ;;; ) ;;; ) ) ;;pick the viewport (if (= "VIEWPORT" (cdr (assoc 0 (setq eg (entget v2))))) (setq is-viewport T) (prompt "\nNot a viewport, please select a viewport") ) ) (setq nvport (cdr (assoc 69 eg))) (command "_mspace") ;;(pw_setvar "cvport" nvport) (setvar "cvport" nvport) (command "_VPLAYER" "_thaw" "*" "" "") (command "_VPLAYER") (foreach l layer-string-state (if (tblsearch "LAYER" l) (command "_freeze" l "") ) ) (command "") (command "_pspace") ) ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
Elun Posté(e) le 16 octobre 2019 Auteur Posté(e) le 16 octobre 2019 Merci beaucoup pour ta réponse ! Décidément les listes DXF sont pleines de surprises !!!La méthode fonctionne parfaitement ;p J'avais une autre question cependant : concernant la commande -SUPCALQUE, je ne vois pas d'autres moyen d'invoquer la commande dans une boucle pour lui spécifier le nom de chaque calque un par un. Or je sais qu'un appel de commande "ralenti" un peu le processus. Donc avons-nous moyen (au même titre que la commande SUPCALQUE, qui en choisissant l'option "Nommer" fait apparaître une listbox avec sélection multiple des calques) de rentrer une liste de calque ? J'ai remarqué que l'on pouvait en faisant n fois (n, le nombre de calque) la saisie : "N" "nomcalque1" "N" "Nomcalque2" ... "N" "Nomcalquen".Or une boucle ne permet pas de renvoyer deux valeurs (ici "N" et "nomcalquei"). J'avais déjà utilisé une méthode pour valider n fois une certaines commande tant qu'elle pose des questions (avec la variable système "CMDACTIVE") mais ici, cela ne semble pas fonctionner non plus. En soit le programme fonctionne très bien autrement mais il est vrai que cela peut être amélioré du point de vue du temps d'exécution. Et encore merci pour ta réponse GEGEMATIC ! Elun
didier Posté(e) le 16 octobre 2019 Posté(e) le 16 octobre 2019 Coucou Pour le moins surprenant de lire :Décidément les listes DXF sont pleines de surprisesC'est tout simplement LA base de tout Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
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