Aller au contenu

Création de Filtre Automatique


Messages recommandés

Posté(e)

Bonjour les forumeurs et les forumeuses :P ,

 

J'utilise le lisp suivant afin de me créer un filtre de propriete :

 

(defun c:FILTRE_FX_PLAF (/ dict xdic)

 ;(setq nom_filtre (getstring "\nEntrer le nom des éléments à filtrer :"))

 (setq xdic (vlax-vla-object->ename (vla-getextensiondictionary (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))))
 (if (setq dict (dictsearch xdic "ACAD_LAYERFILTERS"))
   (setq dict (cdr (assoc -1 dict)))
   (setq dict (dictadd xdic "ACAD_LAYERFILTERS" (entmakex '((0 . "dictionary")
                                                            (100 . "AcDbDictionary")
                                                            (280 . 0)
                                                            (281 . 1)
                                                           )
                                                )
              )
   )
 )
 (dictadd dict "DenisH" (entmakex '((0 . "xrecord")
                                    (100 . "AcDbXrecord")
                                    (280 . 1)
                                    (1 . "FX_PLAFOND")
(1 . "*PLAF*")
                                    (1 . "*")
                                    (1 . "*")
                                    (70 . 0)
                                    (1 . "*")
                                    (1 . "*")
(-3 (   "ACAD" (1000 . "( NAME== \"*PLAF*\" )")))

                                   )
                        )
 )
 (princ)
)

 

Mais j'aimerais pouvoir en créer plusieurs en une seul fois.

 

Merci de votre aide.

Posté(e)

Coucou

 

C'est un filtre de sélection par calque ?

Pourquoi passer par un lisp pour faire ça ?

Tu t'en sers dans un programme ou c'est pour la ligne de commande ? si c'est dans un programme je comprends

C'est tellement simple de faire la même chose en ligne de commande que je ne comprends pas ta question et encore moins l'utilisation d'un "programme"!

La roue a déjà été inventée, il faut utiliser le natif avant de programmer

 

Amicalement

 

Posté(e)

Bonjour,

 

En fait, quand j'ouvre mes plans clients, je peux avoir plusieurs calques de type Faux Plafond, mais également poutres ainsi que les calques de l'entreprise qui m'emploie qui commence tous par CSN_xxx

 

Du coup, j'ai un lisp qui me permet de filtrer les calques FX PLAFOND, un pour les poutres et un pour les calques de l'entreprise.

 

Du coup je lance 1 première ligne de commande FILTRE_FX_PLAF

Puis FILTRE_POUTRE

Et pour finir FILTRE_ENT

 

Le but final c'est qu'avec une commande lisp (ex FILTRES_PERSO) je puisse générer les 3 d'un coup.

 

Ensuite, il me reste à les transformer en filtre de propriété en faisant clic droit dessus et convertir en filtre de groupe (je ne sais pas le faire en lisp)

 

Merci de ton aide

Posté(e)

salut,

il faut sortir les nom "en dur" pour le mettre en argument.

dans ce cas, ce n'est pas si simple, car on est en plein dans le mélange des listes normales et "paire pointées"

la je crée la routine avec les arguments;

(defun creeFiltreProprCalque (nomFiltre propFiltre / dict xdic)

 ;(setq nom_filtre (getstring "\nEntrer le nom des éléments à filtrer :"))

 (setq xdic (vlax-vla-object->ename (vla-getextensiondictionary (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))))
 (if (setq dict (dictsearch xdic "ACAD_LAYERFILTERS"))
   (setq dict (cdr (assoc -1 dict)))
   (setq dict (dictadd xdic "ACAD_LAYERFILTERS" (entmakex '((0 . "dictionary")
                                                            (100 . "AcDbDictionary")
                                                            (280 . 0)
                                                            (281 . 1)
                                                           )
                                                )
              )
   )
 )
 (dictadd dict "DenisH" (entmakex (list '(0 . "xrecord")
                                    '(100 . "AcDbXrecord")
                                    '(280 . 1)
                                    (cons 1  nomFiltre)
(cons 1 propFiltre)
                                    '(1 . "*")
                                    '(1 . "*")
                                    '(70 . 0)
                                    '(1 . "*")
                                    '(1 . "*")
;;(-3 (   "ACAD" (1000 . "( NAME== \"*PLAF*\" )")))
				 (list -3 (list    "ACAD" (cons 1000 (strcat "( NAME== \\" propFiltre "\\" ))))
				 

                                   )
                        )
 )
 (princ)
)

la je crée la fonction qui en fait plusieurs (a adapter)

(defun c:MesFiltre ()
(creeFiltreProprCalque "plafond" "*PLAF*")
(creeFiltreProprCalque "mur" "*MUR*")
)


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

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

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

Posté(e)

Bonsoir,

 

ça ne marche pas :(

 

ça me crée un seul filtre (le premier dans defun c:MesFiltre)

 

J'ai modifier dans la "routine"

;;(-3 ( "ACAD" (1000 . "( NAME== \"*PLAF*\" )")))

par

;;(-3 ( "ACAD" (1000 . "( NAME== \"*propFiltre*\" )")))

pour récupérer le nom du filtre

 

Je ne suis pas très fort en lisp, peut être une fausse manip de ma aprt.

 

Une idée ?

 

Merci de votre aide.

Posté(e)

Salut,

Bonsoir,

ça ne marche pas :(

Une idée ?

en fait, j'avais lu en diagonale, et pas du tout analysé le lisp de Denis ...

je pensais que tu avais adapté 3 fois ce lisp, que j'ai vu cette ligne,

(dictadd dict "DenisH"

j'ai pensé que les filtre pouvaient être regroupé sur DenisH, mais il n'en est rien.

 

Donc ce coup ci j'ai testé ça marche chez moi...

(defun creeFiltreProprCalque ( nomFiltre propFiltre / dict xdic)

 ;(setq nom_filtre (getstring "\nEntrer le nom des éléments à filtrer :"))

 (setq xdic (vlax-vla-object->ename (vla-getextensiondictionary (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))))
 (if (setq dict (dictsearch xdic "ACAD_LAYERFILTERS"))
   (setq dict (cdr (assoc -1 dict)))
   (setq dict (dictadd xdic "ACAD_LAYERFILTERS" (entmakex '((0 . "dictionary")
                                                            (100 . "AcDbDictionary")
                                                            (280 . 0)
                                                            (281 . 1)
                                                           )
                                                )
              )
   )
 )
 (dictadd dict nomFiltre (entmakex (list '(0 . "xrecord")
                                    '(100 . "AcDbXrecord")
                                    '(280 . 1)
                                    (cons 1  nomFiltre)
(cons 1 propFiltre)
;;					 1 . "FX_PLAFOND")
;;(1 . "*PLAF*")

                                    '(1 . "*")
                                    '(1 . "*")
                                    '(70 . 0)
                                    '(1 . "*")
                                    '(1 . "*")
;;(-3 (   "ACAD" (1000 . "( NAME== \"*PLAF*\" )")))
                                        (list -3 (list    "ACAD" (cons 1000 (strcat "( NAME== \"" propFiltre "\"" ))))
                                        

                                   )
                        )
 )
 (princ)
)

(defun c:MesFiltre ()
(creeFiltreProprCalque "plafond" "*PLAF*")
(creeFiltreProprCalque "mur" "*MUR*")
)

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

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

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

Posté(e)

Salut,

 

en fait, j'avais lu en diagonale, et pas du tout analysé le lisp de Denis ...

je pensais que tu avais adapté 3 fois ce lisp, que j'ai vu cette ligne,

(dictadd dict "DenisH"

j'ai pensé que les filtre pouvaient être regroupé sur DenisH, mais il n'en est rien.

 

Donc ce coup ci j'ai testé ça marche chez moi...

(defun creeFiltreProprCalque ( nomFiltre propFiltre / dict xdic)

 ;(setq nom_filtre (getstring "\nEntrer le nom des éléments à filtrer :"))

 (setq xdic (vlax-vla-object->ename (vla-getextensiondictionary (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))))
 (if (setq dict (dictsearch xdic "ACAD_LAYERFILTERS"))
   (setq dict (cdr (assoc -1 dict)))
   (setq dict (dictadd xdic "ACAD_LAYERFILTERS" (entmakex '((0 . "dictionary")
                                                            (100 . "AcDbDictionary")
                                                            (280 . 0)
                                                            (281 . 1)
                                                           )
                                                )
              )
   )
 )
 (dictadd dict nomFiltre (entmakex (list '(0 . "xrecord")
                                    '(100 . "AcDbXrecord")
                                    '(280 . 1)
                                    (cons 1  nomFiltre)
(cons 1 propFiltre)
;;					 1 . "FX_PLAFOND")
;;(1 . "*PLAF*")

                                    '(1 . "*")
                                    '(1 . "*")
                                    '(70 . 0)
                                    '(1 . "*")
                                    '(1 . "*")
;;(-3 (   "ACAD" (1000 . "( NAME== \"*PLAF*\" )")))
                                        (list -3 (list    "ACAD" (cons 1000 (strcat "( NAME== \"" propFiltre "\"" ))))
                                        

                                   )
                        )
 )
 (princ)
)

(defun c:MesFiltre ()
(creeFiltreProprCalque "plafond" "*PLAF*")
(creeFiltreProprCalque "mur" "*MUR*")
)

 

 

C'est parfais, c'est exactement se que je cherche !!!

 

Allez j'abuse encore un peu, peut on convertir ces même filtres en filtres de groupe ? :P

Posté(e)

Salut,

Allez j'abuse encore un peu, peut on convertir ces même filtres en filtres de groupe ? :P

je n'utilise pas/peu les filtres de groupes, donc je ne connais rien à leur programmation.

En tout cas je ne vois pas l’intérêt de transformer un filtre de propriété en filtre de groupes par la programmation ?

car si on a besoin de le faire, c'est pour ajouter manuellement des calque qui sont en dehors des propriétés,

et dans ce cas, l'interface permet de créer le filtre de groupe, puis d'ajouter des objets.

ci dessou un vielle discussion sur le sujet:

Sujet ancien

a+

gégé

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

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

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

Posté(e)

Salut,

 

je n'utilise pas/peu les filtres de groupes, donc je ne connais rien à leur programmation.

En tout cas je ne vois pas l’intérêt de transformer un filtre de propriété en filtre de groupes par la programmation ?

car si on a besoin de le faire, c'est pour ajouter manuellement des calque qui sont en dehors des propriétés,

et dans ce cas, l'interface permet de créer le filtre de groupe, puis d'ajouter des objets.

ci dessou un vielle discussion sur le sujet:

Sujet ancien

a+

gégé

 

Tous d'abord (re) merci pour le lisp qui fonctionne parfaitement.

 

je ne vois pas l’intérêt de transformer un filtre de propriété en filtre de groupes par la programmation ?

car si on a besoin de le faire, c'est pour ajouter manuellement des calque qui sont en dehors des propriétés,

 

Eh bien non, le lisp précédent ajoute tous les calques nécessaires pour mon filtre de groupe.

Je crée des filtres de groupes pour n'afficher que les calques dont j'ai besoins en fonction des cas.

Mais se n'est pas grave, le lisp précédent me fais gagner un temps fou.

 

Merci à toi de ton aide.

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é