Aller au contenu

RECUPERER LA LISTE DES CALQUES DONT LA COULEUR A ETE FORCE DANS UNE FENETRE DE PRESENTATION


PHILPHIL

Messages recommandés

Bonjour

suite a ce LISP ou je propage dans les fenetres de présentation les calques FREEZE d'une fenetre de présentation.

 j'aimerai en faire autant avec les calques dont la couleur a été changée / forcée.

 

comment récupérer en lisp la liste des calques de couleurs forcée dans une fenetre et la couleur qui va avec ??

 

Merci

Phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Salut,

en tous cas ça a pas l'air d'être dans les xdata

je vois bien des codes 331 dans le entget de la fenêtre, ces codes 331 contiennent une description dxf des calques, mais je trouve pas le changement de couleur.

je me demandes si j'avais pas été obligé de passer par des vues nommées pour propager autre chose que l'état gelé/libéré.

(ça me dit qq chose mais c'est vieux ...)

a+

gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

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

Lien vers le commentaire
Partager sur d’autres sites

Tiens, une piste, avec en plus un vieux lien cadxp:

;;**************************************************************************
;§/Calques/propage à la 1ère active fenêtre des présentation sélectionnées un état de calque en utilisant les vues/none
;;demande d'aide: http://cadxp.com/topic/48468-assigner-un-etat-de-calque-a-un-viewport/page__pid__289778#entry289778
;;technique alternative : PickReferenceViewport, PickTargetViewport

(defun c:propage_etat_calque (/ bl lpres l eg)
 ;;etat de calque (optionnel)
 (if (setq letatcalq (pw_liste_layerState))
  (progn

   (pw_bydefault "pw-ac-layerstate" '("aucun"))
   (setq pw-ac-layerstate
	 (pw_s_lchaines3
	  "Choisissez un état de calque à restaurer: "
	  (cons "aucun" letatcalq)
	  nil
	  pw-ac-layerstate
	 )
   )


  )
 )

 (setq lpres (layoutlist))
 (pw_bydefault "masq-calq" "*")
 (pw_getstringmem "\nMasque de calque pour la sélection de la fenêtre ?" "masq-calq")
 (pw_bydefault "l-pres" lpres)
 (setq l-pres (pw_s_lchaines3 "Choisir les présentations auxquelles propager l'état de calque" lpres T l-pres))
 (setq colViews (vla-get-views pw-acaddocument))
 (command "_pspace")
 (foreach l l-pres
  (command "_layout" "_set" l)
  (command "_pspace")

  (if (setq sel (ssget "x" (list '(0 . "viewport") (cons 8 masq-calq) (cons 410 (getvar "CTAB")))))
   (progn
					;(setq lvp (pw_listsel sel))
					;(foreach vp lvp
					; (setq vobj (pw_to_object vp))
    (command "_mspace")
    ;;ci dessous plante si la vue existe déjà
    (command "_view" "_save" l)
    (setq vobj (vla-item colViews l))
    ;;(setq vobj (vla-add colViews l))_ne arche pas dans l'espace paier
    (vlax-put-property vobj 'LayerState (car pw-ac-layerstate))

    ;;(vla-SetView	  (vla-get-ActivePViewport  pw-acaddocument)  vobj);_ne marche pas pour le pviwport

    (command "_view" "_restore" l)
    ;;(vla-delete  vobj);_ne marche pas : si je supprime la vue, je perds l'état de calque

    (command "_pspace")
					;)
   )
  )
 ) ;_foreach
)
;;*****************************************************************
;;§/calques/liste les états de calque du dessin/none

(DEFUN pw_liste_layerState ( / res )
(setq res (mapcar 'vla-get-name (PW_VLAX_LIST_ITEMS (pw_to_object 
(pw_eLayerStateDic)))))
  (setq res (vl-remove-if '(lambda (x) (wcmatch x "*__*")) res));_les layerstate des xref ont __ à la place de |
 res
)

;;**************************************************************************
;;§/calques/retourne le ename du dictionaire des filtres de calques simple/none
;
(defun pw_eLayerStateDic ( / dict dic cur )
 
  (setq	dict	(vlax-vla-object->ename (vla-GetExtensionDictionary (vla-get-layers pw-acaddocument )))
	dic	(cdar (dictsearch dict "ACAD_LAYERSTATES"))
  )
  ;(print "************")

  ; check to see if "ACAD_LAYERFILTERS" exists. if not, make it
  (if (not dic)
    (progn (setq cur '((0 . "DICTIONARY") (100 . "AcDbDictionary")))
	   (setq dic (dictadd dict "ACAD_LAYERSTATES" (entmakex cur)))
    )
  )
  dic
)
;;**************************************************************************
;;§/vlax/retourne tous les items d'un objet si applicable / objet
;;si c'est possible, sinon retourne nil
;;;peut être avantageusement remplacé en utilisant vlax-for
;;;par exemple lister les calques:
;;;(vlax-for lay (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (setq llay (cons lay llay)))
;;;ex: (pw_vlax_list_items (pw_get_dictionaries))
;;;   ->(#<VLA-OBJECT IAcadDictionary 19aacbc4> #<VLA-OBJECT IAcadGroups 19aaa3b4> ...)
;;;pw_vlax_list_items liste les éléments d'une collection, peut être avntageuesement remplacé en utilisant 
;;;vlax-for
;;;par exemple lister les calques:
;;;(vlax-for lay (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (setq llay (cons lay llay)))

(defun pw_vlax_list_items (objet / i nb res collection)
  (if (= (type objet) 'ENAME)
    (setq objet (vlax-ename->vla-object objet))
  )
  
  (if (vlax-property-available-p objet 'count)
    (progn (setq nb (vlax-get-property objet 'Count))
	   ;;parcours les items pour retourne leur vla-ename
	   (setq i 0)
	   (while (< i nb)
	     (setq id (vlax-invoke-method objet 'Item i))
	     (setq res (cons id res))
	     (setq i (+ 1 i))
	   )
	   (reverse res)
    )
  )
)

 

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

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

Lien vers le commentaire
Partager sur d’autres sites

hello

GEGEMATIC  merci.

passer par les etats de calques, n'est plus vraiment ma priorité, pas assez fiable je pense, je trouve que ca bug.

dans mon LISP précédent j'avais piquer un bout de code de ton lisp pour  le FREEZE des calques. 

je cherche toujours ou trouver la liste des calques dans une fenetre avec leurs modifications : gel, couleur et autres ......

dans quel dictionnaire c'est planqué ?

ca doit bien etre rangé quelque part.

 

Phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Oui c'est bizarre, dans le dictionnaire de l'entité, il y a rien de tangible.

j'avais présenté un vieil outil qui peut t'aider :

https://cadxp.com/topic/15169-handle_explorer/?do=findComment&comment=79234

je l'ai fait évoluer, il peut servir car certaines infos sont dispo en dxf pur, mais pas en .com, (incompréhensible avec edict de Gille, mais claires en dxf)

j'espère que j'ai mis toutes les dépendances ...

a+

Gégé

; ****************************************************************************
;;§/dxf/Exploration autour d'un handle vers les entités présentes /none
;;les code rechercés sont 330 331 340 345 346 347 348 349 350 360 390

;;;330  ID/identificateur pointeur logiciel du dictionnaire propriétaire (facultatif)
;;; 
;;;360  ID/identificateur de propriétés matérielles du dictionnaire propriétaire (facultatif)
;;; 
;;;330 ID/identificateur pointeur logiciel de l'objet propriétaire
;;;
;;;350  ID/identificateur propriétaire logiciel de l'objet entrée (un pour chaque entrée) (facultatif)
;;autres codes :
;;;331 ID/identificateur de la dernière fenêtre active dans la présentation lorsque celle-ci était la présentation courante.
;;; 
;;;345 ID/identificateur de l'énumération AcDbUCSTableRecord s'il s'agit d'un SCU nommé. En cas d'absence, le SCU n'est pas nommé
;;; 
;;;346 ID/identificateur de l'énumération AcDbUCSTableRecord du SCU de base s'il s'agit d'un SCU orthogonal (code 76 différent de 0). En cas d'absence et si le code 76 est différent de 0, le SCU de base est du type GENERAL

 
(defun c:handle_explorer (/ eg i cont eg2 dxf id prec lid)
  (if (not HDE-ident)
    (if	(= "Oui"
	   (pw_getkwordmem
	     "\nCommencer l'exploration par AcadDictionaries ?/Oui Non"
	     "HDE-App"
	   )
	)
      (setq
	HDE-ident (vla-get-handle
		    (vla-get-dictionaries
		      (vla-get-ActiveDocument (vlax-get-acad-object))
		    )
		  )
      )
    )
  )

  (pw_getstringmem "\nMaintien de l'entité ? * pour saisir à l'écran" "HDE-ident")
  (if (= "*" HDE-ident)
    (setq HDE-ident (eid))
  )
  (setq eg (entget (handent HDE-ident)))
  (foreach l eg
		     (print l)
		   )
  (prompt
    "\n - * - *  - * - * - * - * - * - * - * - * - * - * - *"
  )
  (setq	i    0
	cont "Oui"
  )
  (setq prec "")
  (while (setq dxf (nth i eg))
    (if	(member	(car dxf)
		'(330 331 340 341 342 343 344 345 346 347 348 349 350 360 390 1005 )
	)
      (if (and
	    (/= (cdr dxf) "0")
	    (setq eg2 (entget (pw_to_ename (cdr dxf)))))
	(progn (setq id (cdr (assoc 5 eg2)))
	       (prompt
		 (strcat "\n Code " (itoa (car dxf)) " trouvé: " id " ")
	       )
	       (prin1 (cdr dxf))
	       (pw_getkwordmem
		 "\nAfficher l'entget entité ?/Oui Non"
		 "cont"
	       )
	       (if (= "Oui" cont)
		 (progn
		   (prompt (strcat "\n Ligne précédent l'entité (parfois étiquette: "
				   ;;(pw_fab_chaine prec)
				   (vl-princ-to-string prec)
			   )
		   )
		   (setq lid (cons (list (cdr (assoc 5 eg2)) (cdr (assoc 0 eg2))) lid))
		   (foreach l eg2
		     (prompt  "\n    ")
		     (princ l)
		   )
		   (prompt "\n- - - - - - - - - - - - - -")
		 )
	       )
	)
	(prompt "\nEntité sans entget: ename = 0")
      )
    )
    (setq prec dxf)
    (setq i (+ 1 i))
  )
  (print lid)
  (princ)
)
; ****************************************************************************
;;§/dxf/Exploration des dictionnaiores du dessin /none

(defun c:Dic_explorer ( / odics lnoms odict eg2 cont odump l)
  (setq odics (vla-get-dictionaries pw-acaddocument))
  (setq lnoms (PW_VLAX_LIST_NOM_ITEMS odics))
  (pw_bydefault "aff-dic" '(""))
  (setq	aff-dic
	 (pw_s_lchaines3
	   "Choisissez le dictionnaire à afficher : "
	   lnoms
	   nil
	   aff-dic
	 )
  )
  
(setq odict (vla-item odics (car aff-dic)))
  (setq HDE-ident (vla-get-handle odict))
  (pw_getkwordmem
		 "\nAfficher l'entget entité ?/Oui Non"
		 "cont"
	       )
	       (if (= "Oui" cont)
		 (progn
		   (setq eg2 (entget (pw_to_ename odict)))
		   (foreach l eg2
		     (prompt  "\n    ")
		     (princ l)
		   )
		   (prompt "\n- - - - - - - - - - - - - -")
		 )
	       )
    (pw_getkwordmem
		 "\nAfficher l'object-dump de entité ?/Oui Non"
		 "odump"
	       )
	       (if (= "Oui" odump)
		 (progn
		   (vlax-dump-object odict T)
		   (prompt "\n- - - - - - - - - - - - - -")
		 )
	       )
  (prompt "\nLe dictionnaire est disponible pour handle_explorer")

)
;****************************************************************************
;§**/divers/ getkword modifié pour garder en memoire la derniere valeur et la proposer/msg var
;** argument : "message" "nomvar"
;si message de type "Alors ?/Oui Non", oui et non sont des mots clef,
;;retourne toujours l'entrée utilisateur
;;ex (pw_getkwordmem "Alors ?/Oui Non/Oui" "myvar")
;;( pw_ext_keyword "Alors ?/Oui Non/Oui") -> ("Alors ?Oui/Non<Oui>" "Oui Non" "Oui")

(defun pw_getkwordmem (msg var / tmp iget strdef liget mots defaut)
  (pw_getmemlvar var msg "STR")
  (setq liget (pw_ext_keyword msg))
  (setq msg (car liget))
  (setq mots (cadr liget))
  (setq defaut (last liget))

  (if (wcmatch mots "*_*")
    (alert "\nUn mot clef de initget contient _, erreur !")
    (setq iget (list mots))
  )
  (cond
    ((eval (read var))			; si valeur présente
     (setq strdef (eval (read var))) ;_permet le return
     (setq msg (strcat msg "<" strdef "> :"))
    )
    (defaut
     (setq strdef defaut)
     (setq msg (strcat msg "<" strdef "> :"))
    )
    (t
     (setq strdef ""
	   iget	  (cons 1 iget)
     ) ;_valeur 1 empeche le return
     (setq msg (strcat msg " :"))
    )
  )
  ;;initget
  (eval (cons 'initget iget))
  ;;(setq msg (strcat msg "<" strdef "> :"))
  ;;(setq msg (strcat msg " :"))
  (setq tmp (getkword msg))
  (if (= 'STR (type tmp))
    (set (read var) tmp)
  )
  (if tmp
    tmp
    (eval (read var))
  )
)
  ;****************************************************************************
;§**/divers/ place la variable var dans la liste des variables à mémoire pw-getmemlvar/var msg tp
(defun pw_getmemlvar ( var msg tp  )
  (setq var (strcase var))
  (if (not (assoc var pw-getmemlvar))
    (setq pw-getmemlvar (cons (list var msg tp) pw-getmemlvar))
  )
)
;****************************************************************************
;;§/divers/extrait les mots clef pour un getKword à partir du message /msg
;;exemple :
;;à partir d'un message type:"Alors ?/Oui Non/Non" ->'("Alors ?/Oui/Non<Non>" "Oui Non" "Non")
;; une liste avec le message, l'initget, et la valeur par defaut
;;n'accepte pas les _ dans la liste des keyword
;;(pw_ext_keyword "Alors ?/Oui Non/Non") ->("Alors ?Oui/Non" "Oui Non" "Non")
;
(defun pw_ext_keyword2 (msg / lval valdef lms iget)
 (setq lms (pw_lst_de_ch msg "/"))
 (setq valdef (caddr lms))
 (if (setq iget (cadr lms))
  (progn
   (setq lval (strcat " [" (pw_ch_de_lst (pw_lst_de_ch iget " ") "/") "]"))
   (setq msg (strcat (car lms) lval))
  )
 )
 (list msg iget valdef)
)
;;**************************************************************************
;;§/vlax/retourne la liste des noms des items d'un objet si applicable / objet
;;si c'est possible, sinon retourne nil
;;ex: (pw_vlax_list_nom_items (pw_get_dictionaries))
;;;   ->("ACAD_COLOR" "ACAD_IMAGE_DICT" "ACAD_MATERIAL" "ACAD_MLINESTYLE" "ACAD_OC" 
;;;     "ACAD_PLOTSTYLENAME" "ACAD_TABLESTYLE" ...)

(defun pw_vlax_list_nom_items (objet / x)
(mapcar	'vla-get-name
	(vl-remove-if-not
	'(lambda (x)
	   (vlax-property-available-p x 'name)
	 )
	(pw_vlax_list_items
	  objet
	)
	)
)
  )
;;**************************************************************************
;;§/vlax/retourne tous les items d'un objet si applicable / objet
;;si c'est possible, sinon retourne nil
;;;peut être avntageuesement remplacé en utilisant vlax-for
;;;par exemple lister les calques:
;;;(vlax-for lay (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (setq llay (cons lay llay)))
;;;ex: (pw_vlax_list_items (pw_get_dictionaries))
;;;   ->(#<VLA-OBJECT IAcadDictionary 19aacbc4> #<VLA-OBJECT IAcadGroups 19aaa3b4> ...)
;;;pw_vlax_list_items liste les éléments d'une collection, peut être avntageuesement remplacé en utilisant 
;;;vlax-for
;;;par exemple lister les calques:
;;;(vlax-for lay (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (setq llay (cons lay llay)))

(defun pw_vlax_list_items (objet / i nb res collection)
  (if (= (type objet) 'ENAME)
    (setq objet (vlax-ename->vla-object objet))
  )
  
  (if (vlax-property-available-p objet 'count)
    (progn (setq nb (vlax-get-property objet 'Count))
	   ;;parcours les items pour retourne leur vla-ename
	   (setq i 0)
	   (while (< i nb)
	     (setq id (vlax-invoke-method objet 'Item i))
	     (setq res (cons id res))
	     (setq i (+ 1 i))
	   )
	   (reverse res)
    )
  )
)
         ;****************************************************************************
;;§**/divers/Assigne un valeur à var si var = nil /var defval
;;var est une chaine représentant la variable

(defun pw_bydefault ( var defval  /  )
 (if (eval (read var))
  nil ;; valeur 0 change rien
  (set (read var) defval)
 )
)
         ;***************************************************************************
;§/dcl/permet la saisie multiple dans la list_box pw_s_nlist de pw_util.dcl/titre lchaines mode cpl
;l'arg mode permet de choisir plusieur elements si 't, 1 seul si nil
;place pas le focus sur le-les courants
;(pw_s_lchaines3 "titre" '("un" "deux" "trois") 1 '("deux" "un"))->("un" "deux" "trois")
;
(defun pw_s_lchaines3 (titre lchaines mode cpl / lchoix sortie ok dcl_id)

  (defun ok ()
    (setq lchoix (get_tile "cle"));;lchoix de la forme "0 2 3"
    (done_dialog)
  )

  (setq dcl_id pw-dcl-util)
  (if mode
    (if (not (new_dialog "pw_s_nlist" dcl_id)) (exit))
    (progn
    (if (not (new_dialog "pw_s_1list" dcl_id)) (exit))
    (setq cpl (list (car cpl)));;un seul préchoix
    )
  )

  (setq lchoix "");;signifie aucun choix
  (pw_init_lbox "cle" lchaines);;rempli les lignes
  (set_tile "titre" titre)     ;;affiche le titre
  (foreach r cpl ;;préselection
   (setq r (pw_rang r  lchaines))
   (if r
    (set_tile "cle" (itoa r))
   )
  )

  (action_tile  "accept" "(setq sortie $key) (ok)")
  (action_tile  "cancel" "(setq sortie $key) (done_dialog)")
  (start_dialog)
  (cond ( (= sortie "accept") (pw_lst_select lchaines lchoix))
        (t nil)
  )
)

         
         

 

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Tu as essayé de ce côté : https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/get-list-of-layer-names-with-color-overrides-in-viewport/td-p/10676936

A priori pour chaque calque, tu as un dictionnaire ADSK_XREC_LAYER_COLOR_OVR qui pointe vers un autre dictionnaire ADSK_LYR_COLOR_OVERRIDE qui contient les infos code 335 : handle de la viewport, puis 420 couleur vraie du calque concerné dans cette viewport.

 

Olivier

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

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é