Aller au contenu

Liste des calques visibles d'une VIEWPORT définie


Messages recommandés

Posté(e)

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

Posté(e)

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.fr

Blog: http://g-eaux.over-blog.com

Posté(e)

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

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é