PHILPHIL Posté(e) le 15 septembre Partager Posté(e) le 15 septembre 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 More sharing options...
GEGEMATIC Posté(e) le 20 septembre Partager Posté(e) le 20 septembre 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.frBlog: http://g-eaux.over-blog.com Lien vers le commentaire Partager sur d’autres sites More sharing options...
GEGEMATIC Posté(e) le 20 septembre Partager Posté(e) le 20 septembre 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.frBlog: http://g-eaux.over-blog.com Lien vers le commentaire Partager sur d’autres sites More sharing options...
PHILPHIL Posté(e) le 21 septembre Auteur Partager Posté(e) le 21 septembre 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 More sharing options...
GEGEMATIC Posté(e) le 21 septembre Partager Posté(e) le 21 septembre 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.frBlog: http://g-eaux.over-blog.com Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fraid Posté(e) le 22 septembre Partager Posté(e) le 22 septembre Bonjour, Il y a une solution en passant par la comparaison des états de calques. Enregistrer l'état de calque dans l'objet. Enregistrer l'état de calque dans ta fenêtre. Comparer les 2. Si j'ai le temps je me métrais dessus today. https://github.com/Fraiddd Lien vers le commentaire Partager sur d’autres sites More sharing options...
Olivier Eckmann Posté(e) le 22 septembre Partager Posté(e) le 22 septembre 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 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
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