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 332 333  334 335 336 337 338 339 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

  • 4 mois après...

Coucou @Olivier Eckmann,
Je m'intéresse justement à ce sujet, mais j'ai beau chercher et tester, je ne suis pas en mesure d'accéder à ces dictionnaires ci-dessous...

Le 22/09/2023 à 12:29, Olivier Eckmann a dit :

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.

Comment dois-je m'y prendre pour y accéder ? Car on parle ici de dictionnaire d'extension, or j'ai bien ceci :

Explore-DXF in progress from "LAYER" (<Nom d'entité: 1c40c063900>) :
|      (-1 . <Nom d'entité: 1c40c063900>)
|      (0 . "LAYER")
|      (5 . "10")
|      (102 . "{ACAD_XDICTIONARY")
|      (360 . <Nom d'entité: 1c40c0609e0>)
|      (102 . "}")
|      (330 . <Nom d'entité: 1c40c063820>)
|      (100 . "AcDbSymbolTableRecord")
|      (100 . "AcDbLayerTableRecord")
|      (2 . "0")
|      (70 . 0)
|      (62 . 7)
|      (6 . "Continuous")
|      (290 . 1)
|      (370 . 0)
|      (390 . <Nom d'entité: 1c40c0638f0>)
|      (347 . <Nom d'entité: 1c40c063e00>)
|      (348 . <Nom d'entité: 0>)
|
End of exploration...

à partir de

(entget (tblobjname "LAYER" "0"))

Donc j'ai bien un dictionnaire d'extension mais si je récupère ensuite les infos du dictionnaire d'extension, il est vide :

Explore-DXF in progress from "DICTIONARY" (<Nom d'entité: 1c40c0609e0>) :
|      (-1 . <Nom d'entité: 1c40c0609e0>)
|      (0 . "DICTIONARY")
|      (330 . <Nom d'entité: 1c40c063900>)
|      (5 . "E6")
|      (100 . "AcDbDictionary")
|      (280 . 1)
|      (281 . 1)
|
End of exploration...

J'ai essayé de voir via les fonctions de giles concernant les dictionnaires (depuis ce >>post<<) mais évidemment, cela me retourne nil à chaque fois.
Je suppose que je m'y prend mal, mais je n'arrive pas à retrouver la démarche complète... Aurais-tu quelques infos sur comment accéder à ces dictionnaires d'extension pour chaque calque ?
Sommes-nous d'accord que ces dictionnaires existent peu importe si le calque possède oui ou non des propriétés forcées dans des fenêtres ?

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Salut Luna,

avec Handle_explorer, que j'ai posté plus haut:

je commence par chercher le "handle" d'entrée, à savoir le handle du calque 0

(entget (tblobjname "LAYER" "0"))

->

((-1 . <Nom d'entité: 26c5056c900>) (0 . "LAYER") (5 . "10") (102 . "{ACAD_XDICTIONARY") (360 . <Nom d'entité: 26c6eb75c90>) (102 . "}") (330 . <Nom d'entité: 26c5056c820>) (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "0") (70 . 0) (62 . 7) (6 . "Continuous") (290 . 1) (370 . -3) (390 . <Nom d'entité: 26c5056c8f0>) (347 . <Nom d'entité: 26c50555ea0>) (348 . <Nom d'entité: 0>))

le handle est "10": (5 . "10")

Commande: HANDLE_EXPLORER

Maintien de l'entité ? * pour saisir à l'écran<10> :

je parcours toutes les entités, est dès le code 360, j'a:

 Code 360 trouvé: 185E9 <Nom d'entité: 26c6eb75c90>
Afficher l'entget entité ?Oui/Non<Oui> :

 Ligne précédent l'entité (parfois étiquette: (102 . {ACAD_XDICTIONARY)
    (-1 . <Nom d'entité: 26c6eb75c90>)
    (0 . DICTIONARY)
    (330 . <Nom d'entité: 26c5056c900>)
    (5 . 185E9)
    (100 . AcDbDictionary)
    (280 . 1)
    (281 . 1)
    (3 . ADSK_XREC_LAYER_COLOR_OVR)
    (360 . <Nom d'entité: 26c6eb75ca0>)

J'ai trouvé mon  (3 . ADSK_XREC_LAYER_COLOR_OVR)

du coup je relance Handle_explorer avec "185E9"

 

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

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

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

Lien vers le commentaire
Partager sur d’autres sites

Quelque chose comme ça ?

Edit : ajout de commentaires (entêtes)

;; Obtient les remplacements de couleur par fenêtre pour le calque spécifié.
;;
;; Argument
;; layer : ename du calque
;;
;; Valeur renvoyée
;; une liste de paires pointées : (<ename de la fenêtre> . <couleur de remplacement>) ou nil.

(defun getColorOverrides (layer / xdict data lst)
  (if
    (and
      (setq xdict (cdadr (member '(102 . "{ACAD_XDICTIONARY") (entget layer))))
      (setq data (dictsearch xdict "ADSK_XREC_LAYER_COLOR_OVR"))
    )
     (while (setq data (member '(102 . "{ADSK_LYR_COLOR_OVERRIDE") data))
       (setq lst  (cons	(cons (cdr (assoc 335 data))
			      (cdr (assoc 420 data))
			)
			lst
		  )
	     data (cdr data)
       )
     )
  )
  lst
)

;; Obtient les calques aux couleurs remplacées pour la fenêtre flottante spécifiée.
;;
;; Argument
;; viewport : ename de la fenetre
;;
;; Valeur renvoyée
;; une liste de paires pointées : (<ename du calque> . <couleur de remplacement>) ou nil.

(defun getViewportLayerColorOverrides (viewport / layer override lst)
  (while (setq layer (tblnext "LAYER" (not layer)))
    (setq layer (tblobjname "LAYER" (cdr (assoc 2 layer))))
    (if	(setq override (assoc viewport (getColorOverrides layer)))
      (setq lst (cons (cons layer (cdr override)) lst))
    )
  )
  lst
)

;; Convertit la valeur négative d'un groupe DXF 420 (telle que celle des remplacement de couleur de calque) en couleur de l'index ou couleur vraie.
;;
;; Argument
;; dxf420 : valeur d'un groupe DXF 420 négatif.
;;
;; Valeur renvoyée
;; une paire pointée dont le premier terme est "ColorIndex" ou "TrueColor" et le second la valeur.

(defun dxf420->color (dxf420)
  (if (zerop (logand dxf420 (lsh 1 24)))
    (cons "TrueColor" (boole 2 dxf420 (lsh 194 24)))
    (cons "ColorIndex" (boole 2 dxf420 (lsh 195 24))) 
  )
)

(defun c:test (/ vp color)
  (if (and
	(setq vp (car (entsel "\nSélectionnez une fenêtre flottante: ")))
	(= (cdr (assoc 0 (entget vp))) "VIEWPORT")
      )
    (foreach l (getViewportLayerColorOverrides vp)
      (setq color (dxf420->color (cdr l)))
      (prompt
	(strcat
	  "\nCalque : "
	    (getpropertyvalue (car l) "Name")
	  " "
	  (car color)
	  " : "
	  (itoa (cdr color))
	)
      )
    )
  )
  (princ)
)

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

je trouve mon  (102 . {ADSK_LYR_COLOR_OVERRIDE)

- - - - - - - - - - - - - -
 Code 360 trouvé: 185EA <Nom d'entité: 26c6eb75ca0>
Afficher l'entget entité ?Oui/Non<Oui> :

 Ligne précédent l'entité (parfois étiquette: (3 . ADSK_XREC_LAYER_COLOR_OVR)
    (-1 . <Nom d'entité: 26c6eb75ca0>)
    (0 . XRECORD)
    (5 . 185EA)
    (102 . {ACAD_REACTORS)
    (330 . <Nom d'entité: 26c6eb75c90>)
    (102 . })
    (330 . <Nom d'entité: 26c6eb75c90>)
    (100 . AcDbXrecord)
    (280 . 1)
    (102 . {ADSK_LYR_COLOR_OVERRIDE)
    (335 . <Nom d'entité: 26c5223ebb0>)
    (420 . -1023410175)
    (102 . })
- - - - - - - - - - - - - -
(("185EA" "XRECORD") ("10" "LAYER"))

Je relance mon handle_explorer avec "185EA", je trouve mon calque override:

 - - - - - - - - - - - - -
 Code 335 trouvé: DC63 <Nom d'entité: 26c5223ebb0>
Afficher l'entget entité ?Oui/Non<Oui> :

 Ligne précédent l'entité (parfois étiquette: (102 . {ADSK_LYR_COLOR_OVERRIDE)
    (-1 . <Nom d'entité: 26c5223ebb0>)
    (0 . VIEWPORT)
    (5 . DC63)
    (102 . {ACAD_XDICTIONARY)
    (360 . <Nom d'entité: 26c5223ebc0>)
    (102 . })
    (330 . <Nom d'entité: 26c5210de00>)
    (100 . AcDbEntity)
    (67 . 1)
    (410 . PROJET)
    (8 . 0)
    (100 . AcDbViewport)
    (10 179.131 223.307 0.0)
    (40 . 480.0)
    (41 . 431.698)
    (68 . 1)
    (69 . 4)
    (12 1.98282e+06 5.19567e+06 0.0)
    (13 0.0 0.0 0.0)
    (14 1.0 1.0 0.0)
    (15 10.0 10.0 0.0)
    (16 0.0 0.0 1.0)
    (17 0.0 0.0 0.0)
    (42 . 50.0)
    (43 . 0.0)
    (44 . 0.0)
    (45 . 902.315)
    (50 . 0.0)
    (51 . 0.0)
    (72 . 100)
    
    (331 . <Nom d'entité: 26c52133c40>)
    (331 . <Nom d'entité: 26c5222fb20>)
    (331 . <Nom d'entité: 26c5222fbe0>)
    (331 . <Nom d'entité: 26c5222fc40>)
    (331 . <Nom d'entité: 26c5222feb0>)
    (331 . <Nom d'entité: 26c5222ff70>)
    (90 . 823392)
    (1 . )
    (281 . 0)
    (71 . 1)
    (74 . 0)
    (110 0.0 0.0 0.0)
    (111 1.0 0.0 0.0)
    (112 0.0 1.0 0.0)
    (79 . 0)
    (146 . 0.0)
    (170 . 0)
    (61 . 5)
    (348 . <Nom d'entité: 26c52134800>)
    (292 . 1)
    (282 . 1)
    (141 . 0.0)
    (142 . 0.0)
    (63 . 250)
    (421 . 3355443)
- - - - - - - - - - - - - -
(("DC63" "VIEWPORT") ("185E9" "DICTIONARY") ("185E9" "DICTIONARY"))

tu n'a qu'a suivre la séquence des "assoc code" sur  des entget pour retrouver le chemin lisp vers ton dictionnaire

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

Oki, donc j'avais bon, juste que mon calque 0 n'avait aucun remplacement de fenêtre. Ce qui répond donc à ma question

Il y a 2 heures, Luna a dit :

Sommes-nous d'accord que ces dictionnaires existent peu importe si le calque possède oui ou non des propriétés forcées dans des fenêtres ?

La réponse est non, donc si l'on veut créer un remplacement de fenêtre, il nous faut créer ces dictionnaires ADSK ? Je sens que je me prends la tête pour rien et je vais finir par utiliser _VPLAYER ^^"

Désolée du dérangement 🙂

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Sur ce dessin, j'ai modifié la couleur du calque 0 dans la fenêtre de la 1ère présentation.

Avec ce code, je suis les dictionnaires

(defun C:TEST ( / oLyrInfo xDictOvr xDictInfo oViewport oColor)
  (setq oLyrInfo (entget (tblobjname "LAYER" "0")))
  (setq xDictOvr (entget (cdr (assoc 360 oLyrInfo))))
  (setq xDictInfo (entget (cdr (assoc 360 xDictOvr))))
  (setq oViewport (cdr (assoc 335 xDictInfo)))      ; viewport concernée
  (setq oColor (cdr (assoc 420 xDictInfo)))         ; Truecolor de substitution du calque
)

C'est beaucoup moins fun que ce que propose les autres utilisateurs 😄

Très souvent j'exporte en DXF que j'ouvre sous Notepad++ pour suivre les enchaînements.

TEST_CALQUE.dwg

Lien vers le commentaire
Partager sur d’autres sites

il y a 2 minutes, Luna a dit :

si l'on veut créer un remplacement de fenêtre, il nous faut créer ces dictionnaires ADSK ? Je sens que je me prends la tête pour rien et je vais finir par utiliser _VPLAYER ^^"

Il faut que tu utilises VPLAYER (ou les fonction vla*), parce qu'on ne peut pas modifier une fenêtre flottante avec entmod.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Ahah, ne vous en faites pas, j'ai mon propre outil pour creuser les listes DXF ^^
Mon problème était juste que mon cerveau n'était pas branché pour tester avec ou sans remplacement de fenêtre ...

il y a 3 minutes, (gile) a dit :

Il faut que tu utilises VPLAYER (ou les fonction vla*), parce qu'on ne peut pas modifier une fenêtre flottante avec entmod.

Yes, je suis au courant que les VIEWPORT sont des entités pénibles et nécessitent une manipulation particulière pour être modifiées. Le problème de la commande VPLAYER c'est que c'est une commande donc...mes tests de programmes ne sont pas fructueux à mes yeux car le temps d'exécution est beaucoup trop long
Mais je pense que je vais passer par _VPLAYER malgré tout car chat me paraît trop complexe pour rien.

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Salut Olivier

il y a 36 minutes, Olivier Eckmann a dit :

Avec ce code, je suis les dictionnaires

C'est exactement le code résultant de mon exploration à l'aveugle ...

il y a 36 minutes, Olivier Eckmann a dit :

C'est beaucoup moins fun que ce que propose les autres utilisateurs 😄

je me suis souvent retrouvé devants des cas ou il n'y a aucune doc pour comprendre, pas une piste, c'est pour ça que j'ai fait handle_explrorer,

 dont le seul but est de naviguer à l'aveugle, de parcourir les liens.

dans un dxf, pour moi c'est difficile de suivre les liens entre les objets, je n'ai aucun outil..

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

@GEGEMATIC,

Quand je parle d'outil je parle de lisp 🙂 Au même titre que ton (handent_explorer). J'ai juste un programme un peu différent pour ne pas avoir à le relancer à chaque fois justement. Il a quelques soucis mais c'est du détails en soit ^^
C'est la fonction (explore-dxf).

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Une commande pour copier les remplacements de couleur d'une fenêtre à une autre qui utilise les fonctions données plus haut.

(defun c:MatchLayerColorOverride (/ source data target)
  (if (and
	(setq source (car (entsel "\nSélectionnez la fenêtre source: ")))
	(= (cdr (assoc 0 (entget source))) "VIEWPORT")
	(setq data (getViewportLayerColorOverrides source))
	(setq target (car (entsel "\nSélectionnez la fenêtre cible: ")))
	(= (cdr (assoc 0 (entget target))) "VIEWPORT")
      )
    (foreach pair data
      (command-s "_.VPLAYER"
	       "_Color"
	       (cdr pair)
	       (getpropertyvalue (car pair) "Name")
	       "_Select"
	       target
	       ""
	       ""
      )
    )
  )
  (princ)
)

 

  • Upvote 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é