Patrick_35 Posté(e) le 7 janvier 2016 Posté(e) le 7 janvier 2016 Bonjour Sur ce message, je vois que MP enregistre les filtres de calques dans le dictionnaire et dans les xdatas (choses que je retrouvre en interrogeant les filtres)Sur ce même message, je vois que T.Willey n'utilise pas les xdatas et que ça fonctionne.Sur un autre message, je vois que (gile) propose un lisp LayerFilter pour importer/exporter des filtres, qu'il n'utilise pas les xdatas mais une autre bibliothèque qui est ACLYDICTIONARY et dont je retrouve aussi des données sur des filtres créés manuellement mais pas avec le lisp du type de T.Willey ? Quid des données à écrire ??? Sur ce message, je décris un disfonctionnement d'autocad pour la création d'un filtre à la méthode de T.Willey (et j'ai retrouvé d'autres lisps sur le net fonctionnant de la même manière). Bug d'Autocad ? @+ ps : (gile) ton lisp bug si on écrit par prog un filtre en utilisant uniquement l'enregistrement du dictionnaire dans ACAD_LAYERFILTERS Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
GEGEMATIC Posté(e) le 7 janvier 2016 Posté(e) le 7 janvier 2016 Salut Patrick, meilleurs voeux ...dans tes recherches, tu aurais dû trouver un sujet préhistorique,qui renvoyait au site du crétacé planetar ... Moi j'utilise la méthode dictionnaire, et j'arrive à créer des filtres jusqu'a 3 niveaux d'imbrications.ma technique est de stocker la description de filtre dans un fichier ini, et de créer les filtre à l'ouverture du dessin. mais c'est très imbriqué, je ne peux pas en faire un package. de mémoire, la structure n'est pas strictement répétitive, le filtre de 1er niveau ne s'écrie pas comme les suivantségalement, le gros piège à éviter, c'est que chaque sous filtre se comporte comme si il était un filtre de 1er niveau:donc il faut incrementer les noms de filtre identiques pour les répeter:je m'explique: si j'ai un filtre "STRUCTURE" qui a un sous filtre "AXES"et que je veux avoir la m^me chose avec "TOITURE" et un sous filtre "AXES"il faut que j'appelle le 2eme AXES AXES1, sinon c'est le bordel voici un exemple de représentation de la commande LayerFiltersTree que j'ai joint : NADIAA- - - - NADIAA_AEP- - - - > - - - -TRO- - - - > - - - -NA_TEXTE- - - - > - - - -NOD- - - - > - - - -ACC- - - - > - - - -SUR- - - - > - - - -NA-BRA- - - - > - - - -REEL- - - - > - - - -DETAIL- - - - > - - - -FICTIF- - - - > - - - -ANNOTATION- - - - NADIAA_ASS- - - - > - - - -TRO0- - - - > - - - -NA_TEXTE0- - - - > - - - -NOD0- - - - > - - - -ACC0- - - - > - - - -SUR0- - - - > - - - -NA-BRA0- - - - > - - - -REEL0- - - - > - - - -DETAIL0- - - - > - - - -FICTIF0- - - - > - - - -ANNOTATION0 on voit que j'ai un sous filtre NOD et un sous filtre NOD0 ci dessous en vrac des lisp pour les filtres, il marcheront en chargeant powerclic.vlx Gégé ;;************************************************************************** ;;§/calques/affiche la strucure d'un filtres de calques /none ; (defun C:LayerFiltersExplorer () ;(setq varval (vlax-make-variant vlax-vbArray)) ;(setq vartyp (vlax-make-variant vlax-vbArray)) (foreach itm (pw_vlax_list_items (vla-GetObject (vla-GetExtensionDictionary (vla-Get-Layers pw-AcadDocument)) "ACAD_LAYERFILTERS" ) ) (print itm) (print (vlax-dump-object itm)) (vla-GetXRecordData itm 'varval 'vartyp) (print (vlax-safearray->list varval)) (print (vlax-safearray->list vartyp)) (setq varval nil vartype nil) (if (vla-get-HasExtensionDictionary itm) (progn (setq varval nil vartype nil) (print "coucocu") (print (setq sousdic (vla-GetExtensionDictionary itm))) (foreach xitm (pw_vlax_list_items sousdic) (print (vlax-dump-object xitm)) (vla-GetXRecordData sousdic 'varval 'vartyp) (print (vlax-safearray->list varval)) (print (vlax-safearray->list vartyp)) ) ) ) ) (princ "\nAll layer filters have been listed") (princ) ) ;;************************************************************************** ;;§/calques/affiche les filtres de calques /none ; (defun C:LayerFiltersDisplay () ;; (vlax-dump-object (vla-GetExtensionDictionary (vla-Get-Layers pw-AcadDocument))) (mapcar 'vlax-dump-object (pw_vlax_list_items (vla-GetObject (vla-GetExtensionDictionary (vla-Get-Layers pw-AcadDocument)) "ACAD_LAYERFILTERS" ) ) ) (princ "\nAll layer filters have been listed") (princ) ) ;;************************************************************************** ;;§/calques/Affiche la hierarchie de filtre de calques imbriqués / none (defun c:LayerFiltersTree ( / ) ;;1er niveau (setq eg1 (entget (PW_ELAYERFILTERDIC))) (setq ldics1 (cdr (assoc 3 (pw_regroup_assoc eg1)))) ;;2eme niveau (foreach nomfiltre1 ldics1 (prompt (strcat "\n " nomfiltre1)) (setq dic3 (pw_eLayerFilterByName nomfiltre1)) (setq eg2 (entget (setq dic5 (pw_eLayerFilterAclyDictionary5 dic3)))) (setq l-350-2 (cdr (assoc 350 (pw_regroup_assoc eg2)))) (setq ldics2 (mapcar '(lambda (x) (cdr (assoc 300 (entget x)))) l-350-2)) ;;3eme niveau (foreach nomfiltre2 ldics2 (prompt (strcat "\n- - - - " nomfiltre2)) (setq dic5 (pw_eSousLayerFilterByName dic3 nomfiltre2)) (setq dic8 (pw_eLayerFilterAclyDictionary5 dic5)) (setq eg3 (entget dic8)) (setq l-350-3 (cdr (assoc 350 (pw_regroup_assoc eg3)))) (setq ldics3 (mapcar '(lambda (x) (cdr (assoc 300 (entget x)))) l-350-3)) (foreach nomfiltr3 ldics3 (prompt (strcat "\n- - - - > - - - -" nomfiltr3)) ) ) ) ) ;;************************************************************************** ;;§/calques/liste tous les noms de filtres acly sur 3 niveaux / none ;; (pw_listAllaAclyFilterName) -> ("NADIAA_AEP" "TRO" "NA-BRA" "REEL" "DETAIL" "FICTIF" "ANNOTATION" "NA_TEXTE" "NOD" "ACC" "SUR") (defun pw_listAllaAclyFilterName ( / eg1 eg2 eg3 ldics1 ldics2 ldics3 ldics dic3 dic5 dic8 l-350-2 l-350-3) ;;1er niveau (setq eg1 (entget (PW_ELAYERFILTERDIC))) (setq ldics1 (cdr (assoc 3 (pw_regroup_assoc eg1)))) (setq ldics lidsc1) ;;2eme niveau (foreach nomfiltre1 ldics1 (if (setq dic3 (pw_eLayerFilterByName nomfiltre1)) (progn (setq eg2 (entget (setq dic5 (pw_eLayerFilterAclyDictionary5 dic3)))) (setq l-350-2 (cdr (assoc 350 (pw_regroup_assoc eg2)))) (setq ldics2 (mapcar '(lambda (x) (cdr (assoc 300 (entget x)))) l-350-2)) (setq ldics (append ldics ldics2)) ;;3eme niveau (foreach nomfiltre2 ldics2 (setq dic5 (pw_eSousLayerFilterByName dic3 nomfiltre2)) (setq dic8 (pw_eLayerFilterAclyDictionary5 dic5)) (setq eg3 (entget dic8)) (setq l-350-3 (cdr (assoc 350 (pw_regroup_assoc eg3)))) (setq ldics3 (mapcar '(lambda (x) (cdr (assoc 300 (entget x)))) l-350-3)) (setq ldics (append ldics ldics3)) ) ) ) ) ldics ) ;;************************************************************************** ;;§/calques/retourne le ename du dictionaire des filtres de calques simple/none ; (defun pw_eLayerFilterDic ( / dict dic cur ) (setq dict (vlax-vla-object->ename (vla-GetExtensionDictionary (vla-get-layers pw-acaddocument ))) dic (cdar (dictsearch dict "ACAD_LAYERFILTERS")) ) ;(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_LAYERFILTERS" (entmakex cur))) ) ) dic ) ;;************************************************************************** ;;§/calques/retourne le ename du dictionaire des filtres de calques Acly = avec sous filtre en cascade /none ; (defun pw_eLayerFilterAclyDic ( / dict aclydic cur ) (setq dict (vlax-vla-object->ename (vla-GetExtensionDictionary (vla-get-layers pw-acaddocument ))) aclydic (cdar (dictsearch dict "ACLYDICTIONARY")) ) ;(print "************") ; check to see if "ACAD_LAYERFILTERS" exists. if not, make it (if (not aclydic) (progn (setq cur '((0 . "DICTIONARY") (100 . "AcDbDictionary"))) (setq aclydic (dictadd dict "ACLYDICTIONARY" (entmakex cur))) ) ) aclydic ) ;;************************************************************************** ;;§/calques/retourne le ename du dictionaire du filtres de calques nomfiltre /nomfiltre ;;retourne le niveau 3: ;;; 3 XRECORD du 1er filtre ; (defun pw_eLayerFilterByName (nomfiltre / 2dic lsousdic leg nom eg res ) ;;accede au dictionaire de niveau 2 (setq 2dic (pw_eLayerFilterAclyDic)) ;;cherche un nom anonyme (if (setq lsousdic (pw_vlax_list_items (vlax-ename->vla-object 2dic))) (progn ;;ci dessous methode pour acceder au xrecordata en vba: un dump ne donne rien ! ;;; (foreach l lsousdic ;;; ;;verification de ce qui a été écrit ;;; (vla-GetXRecordData ;;; l ;;; 'ArrayType ;;; 'ArrayValue ;;; ) ;;; (print (mapcar 'vlax-variant-value (vlax-safearray->list ArrayValue))) ;;; ) (setq leg (mapcar 'entget (mapcar 'vlax-vla-object->ename lsousdic))) (foreach eg leg (setq nom (cdr (assoc 300 eg))) (if (= (strcase nom )(strcase nomfiltre)) (setq res (cdr (assoc -1 eg))) ) ) ) ) res ) ;;************************************************************************** ;;§/calques/retourne le ename du sous dictionaire du filtres de calques nomfiltre /baseDic nomfiltre ;;retourne le niveau 5: ;;; 5 DICTIONARY ; (defun pw_eSousLayerFilterByName (baseDic nomfiltre / 2dic lsousdic leg nom eg res ) ;; niveau 4 (setq objxdic (vla-GetExtensionDictionary (vlax-ename->vla-object baseDic))) ;; (print (vlax-get-property objxdic 'Count)) (if (setq itm (vlax-invoke-method objxdic 'Item 0)) (progn (setq litm (pw_vlax_list_items itm)) (setq leg (mapcar 'entget (mapcar 'vlax-vla-object->ename litm))) (foreach eg leg (setq nom (cdr (assoc 300 eg))) (if (= (strcase nom )(strcase nomfiltre)) (setq res (cdr (assoc -1 eg))) ) ) ) ) res ) ;;************************************************************************** ;;§/calques/retourne le ename du dictionaire de niveau 5 à partir d'un dic niveau 3/edic3 ;; 5 DICTIONARY ;;utile pour ajouter un sous filtre à un filtre existant ; (defun pw_eLayerFilterAclyDictionary5 ( 3dic / objxdic exdic xdlist xname ) ;; niveau 4 (setq objxdic (vla-GetExtensionDictionary (vlax-ename->vla-object 3dic))) ;; (print (vlax-get-property objxdic 'Count)) (if ;; (setq itm (vlax-invoke-method objxdic 'Item 0)) (setq itm (car (pw_vlax_list_items objxdic))) ;; niveau 5 existe (vlax-vla-object->ename itm) (progn ;; niveau 5 créé (setq xdlist (list '(0 . "DICTIONARY") '(100 . "AcDbDictionary") '(280 . 0) '(281 . 1)) xname (entmakex xdlist)) (dictadd (vlax-vla-object->ename objxdic) "ACLYDICTIONARY" xname) ) ) ) ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
Patrick_35 Posté(e) le 7 janvier 2016 Auteur Posté(e) le 7 janvier 2016 Salut Merci pour ta réponse et tous mes voeux pour cette nouvelle année. Je n'avais pas vu ce sujet, mais j'ai fait une recherche sur le net et non sur cadxp. As-tu le même soucis que celui décrit ici ?Car ce n'est pas de créer le filtre qui pose problème, mais l'actualisation de la liste des calques selon le filtre à partir du 2em filtre créé bien que le filtre soit correct. ps : les liens dans le lien sont mort. Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
GEGEMATIC Posté(e) le 7 janvier 2016 Posté(e) le 7 janvier 2016 Salut,As-tu le même soucis que celui décrit [url=http://cadxp.com/topic/42228-propriete-des-filtres-de-calquesje ne sais pas si c'est le même bug, mais en tous cas j'ai eu les même symptômes lorsque j'ai développé la création de filtres:un affichage aléatoire, inopérant et différent après ouverture-fermeture du dessinje pense que ça cache soit:- un bug dans l'écriture des filtre (j'en avais)- Un problème de doublon de nom de filtre (ça arrive très vites, puisqu'on aura souvent un sous filtre type "texte"présent dans plusieurs filtres, d'où la nécessité de renommer les filtres avec une incrémentation (texte, tetxe0, texte1 etc ...)Une fois mon code débogué et les doublons supprimés, je n'ai plus eu aucun problème de fonctionnement, alors que je crée 15 filtres allant jusqu'a 3 niveaux de sous filtre. comme tout ce qui est basé sur des dictionnaire, c'est assez peu intuitif, les commandes d'exploration que j'ai posté peuvent aider. bon courage,Gégé ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
Patrick_35 Posté(e) le 7 janvier 2016 Auteur Posté(e) le 7 janvier 2016 Merci pour ces éclaircissements. Je pense que je ne dois pas tout écrire dans les dictionnaires car je fais mes tests que sur un seul, voir deux filtres. Ce qui me surprend, c'est que j'ai essayé le lisp de (gile) pour import/export des filtres et j'ai les mêmes symptômes. Je vais éplucher ce tu m'as donné. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
DenisHen Posté(e) le 7 janvier 2016 Posté(e) le 7 janvier 2016 Effectivement Patrick_35, j'avais oublié mais j'ai aussi ce problème avec le LiSP de (gile)... Mais en "pire"... Dans ton LiSP, les filtres apparaissent immédiatement mais ne sont pas "actifs". Dans la routine de (gile), ils n'apparaissent pas tout de suite et ne sont "actif" que si on ferme le gestionnaire des calques et qu'on l'affiche à nouveau... A+ Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
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