Aller au contenu

Messages recommandés

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut,

As-tu le même soucis que celui décrit [url=http://cadxp.com/topic/42228-propriete-des-filtres-de-calques

je 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 dessin

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

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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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)

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é