Aller au contenu

Filtre sur des Objects Data


bonuscad

Messages recommandés

Bonjour,

 

J'ai attaché des OD a des Mpolygon par une routine (environ 350)

 

Mon problème est de savoir si tous les Mpolygon ont été traités et qu'ils aient tous des OD, mais je ne vois pas comment ont peut faire un filtre de sélection.

 

Cela est-il possible? Faut-il procéder d'une autre manière pour pouvoir les recenser?

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Merci Patrick_35.

 

Ce ne sont pas pas des XData mais des Object Data d'Autocad Map.

Comme je ne connais pas bien ce dernier, je me demandais si Map n'avait pas un outil dédié.

 

Bien sur, je pourrais me faire quelque lignes de code, mais avant de réinventer la roue.... :P

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Il y a des moyens pour filtrer les objets liés avec des données d'objets ou Object Data in english spoken.

 

1 - Soit avec un projet et comme dessin associé ton dwg qui contient tes mpolygones et par une requête extraire les mpolygones qui correspond à tes critères de champs de table de données d'objet.

 

2 - Ou dans le gestionnaire d'affichage de la palette tâches d'AutoCAD MAP, faire une requête sur le dessin courant (ton dwg ouvert avec les mpolygones) qui correspond à tes critères de champs de table de données d'objet et décocher la ligne Base du dessin.

 

Voilà,

 

A+

 

[Edité le 30/3/2010 par fabcad]

Lien vers le commentaire
Partager sur d’autres sites

Merci bien Fabcad :)

 

Je crois que tes explications vont bien me servir. Je verrais ça après demain...

 

Je suis un complet néophyte sur Map et en SIG, mais cela ne me fait pas peur, je risque seulement de vous embêter avec des notions de base tant que je n'aurais pas fais une formation (Cela ne saurait trop tarder)

 

A+

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Map n'a aucun outil pour traiter par lot les données d'objet dans le dessin courant, à part la programmation

Pour faire ce que tu souhaite, sans programer, il faut que tu ouvre un dessin vierge

Dans ce dessin, tu associe et active le dessin que tu veux tester

tu fait un requête sur la valeur de DO que tu veux filtrer, en mode dessiner, avec transforamtion, par exemple colorier en jaune

tu enregistre vers le desin source, tu ferme ton dessin vierge, et tu rouvre celui qui contient les entités, et tu verra les entités filtrée en jaune.

 

Plus merdique, tu meurt, mais c'est comme ça.

 

 

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

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

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

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Bonjour,

 

Je reviens sur ce sujet car à ce jour j'avais besoin d'un outil. N'étant jamais mieux servi que par soi-même, je me suis pencher sur un code de filtrage sur OD.

 

Je le livre en version bêta si cela intéresse d'autre personnes pour effectuer des tests

 

(defun c:Sel_By_OD ( / js dxf_model all_fldnamelist all_fldtypelist all_vallist tbllist tbldef tblstr
                      fldnamelist fldtypelist fldnme fldtyp numrec ct cttemp vallist typ val
                      tmp_file dcl_file dcl_id indx Id_tbl Id_nam Id_val what_next js_sel n)
 (princ "\nSelection d'un objet modèle: ")
 (while
   (null
     (setq js
       (ssget "_+.:E:S:L:N" 
         (list
           (cons 0 "*")
           (cons 67 (if (eq (getvar "CVPORT") 2) 0 1))
           (cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB")))
         )
       )
     )
   )
 )
 (setq dxf_model (entget (ssname js 0)) all_fldnamelist () all_fldtypelist () all_vallist ())
 (if (null (setq tbllist (ade_odgettables (cdar dxf_model))))
   (princ "\nL'objet séléctionné ne contient pas de données d'objet.")
   (foreach tbl (reverse tbllist)
     (setq
       tbldef (ade_odtabledefn tbl)
       tblstr (cdr (nth 2 tbldef))
       fldnamelist ()
       fldtypelist ()
     )
     (foreach fld tblstr
       (setq
         fldnme (cdr (nth 0 fld))
         fldtyp (cdr (nth 2 fld))
         fldnamelist (append fldnamelist (list fldnme))
         fldtypelist (append fldtypelist (list fldtyp))
       )
     )
     (setq
       numrec (ade_odrecordqty (cdar dxf_model) tbl)
       ct 0
       all_fldnamelist (cons fldnamelist all_fldnamelist)
       all_fldtypelist (cons fldtypelist all_fldtypelist)
     )
     (while (< ct numrec)
       (setq cttemp 0 vallist ())
       (foreach fld fldnamelist
         (setq
           typ (nth cttemp fldtypelist)
           cttemp (+ cttemp 1)
           val (ade_odgetfield (cdar dxf_model) tbl fld ct)
         )
         (if (= typ "Integer")(setq val (fix val)))
         (setq vallist (append vallist (list val)))
       )
       (setq ct (+ ct 1))
     )
     (setq all_vallist (cons vallist all_vallist))
   )
 )
 (cond
   ((and tbllist all_fldnamelist all_fldtypelist all_vallist)
     (setq
       tmp_file (vl-filename-mktemp "sel_by_od.dcl")
       dcl_file (open tmp_file "w")
     )
     (write-line
       "Sel_By_OD : dialog {
         label = \"Choix des champs à filtrer\";
           :column {
             label = \"Application\";
             :popup_list {key=\"tbl\";edit_width=25;}
             }
           :column {
             label = \"Données d'objets\";
             :popup_list {key=\"nam\";edit_width=25;}
             :edit_box {
               label = \"Valeur du champ:\";
               mnemonic = \"V\";
               key = \"val\";
               edit_width = 15;
               edit_limit = 31;
               }
             }
           ok_cancel_err;
         }"
       dcl_file
     )
     (close dcl_file)
     (setq dcl_id (load_dialog tmp_file) indx (1- (length tbllist)) Id_tbl (nth indx tbllist) Id_nam (car (nth indx all_fldnamelist)) Id_val (car (nth indx all_vallist)))
     (setq what_next 2)
     (while (< 1 what_next)
       (if (not (new_dialog "Sel_By_OD" dcl_id)) (exit))
       (start_list "tbl")
       (mapcar 'add_list tbllist)
       (end_list)
       (set_tile "tbl" (itoa indx))
       (start_list "nam")
       (mapcar 'add_list (nth indx all_fldnamelist))
       (end_list)
       (set_tile "nam" (itoa (- (length (nth indx all_fldnamelist)) (length (member (car (nth indx all_fldnamelist)) (nth indx all_fldnamelist))))))
       (set_tile "val"
         (setq Id_val
           (car
             (mapcar
               '(lambda (x)
                 (cond
                   ((eq (type x) 'REAL) (rtos x))
                   ((eq (type x) 'INT) (itoa x))
                   (T x)
                 )
               )
               (nth indx all_vallist)
             )
           )
         )
       )
       (set_tile "error" "")
       (action_tile "tbl" "(setq Id_tbl (nth (setq indx (fix (atof (get_tile \"tbl\")))) tbllist))
       (start_list \"nam\")
       (mapcar 'add_list (nth indx all_fldnamelist))
       (end_list)
       (set_tile \"nam\" (setq Id_nam (nth (- (length (nth indx all_fldnamelist)) (length (member (car (nth indx all_fldnamelist)) (nth indx all_fldnamelist)))) (nth indx all_fldnamelist))))
       (set_tile \"val\"
         (setq Id_val
           (car
             (mapcar
               '(lambda (x)
                 (cond
                   ((eq (type x) 'REAL) (rtos x))
                   ((eq (type x) 'INT) (itoa x))
                   (T x)
                 )
               )
               (nth indx all_vallist)
             )
           )
         )
       )
       ")
       (action_tile "nam" "(setq Id_nam (nth (fix (atof (get_tile \"nam\"))) (nth indx all_fldnamelist)))
       (set_tile \"val\"
         (setq Id_val 
           (nth (vl-position Id_nam (nth indx all_fldnamelist))
             (mapcar
               '(lambda (x)
                 (cond
                   ((eq (type x) 'REAL) (rtos x))
                   ((eq (type x) 'INT) (itoa x))
                   (T x)
                 )
               )
               (nth indx all_vallist)
             )
           )
         )
       )
       ")
       (action_tile "val" "(setq Id_val $value)")
       (action_tile "accept" "(done_dialog 1)")
       (action_tile "cancel" "(done_dialog 0)")
       (setq what_next (start_dialog))
     )
     (unload_dialog dcl_id)
     (vl-file-delete tmp_file)
     (setq typ (nth (- (length (nth indx all_fldnamelist)) (length (member id_nam (nth indx all_fldnamelist)))) (nth indx all_fldtypelist)))
     (cond
       ((eq typ "Real") (setq Id_val (atof Id_val)))
       ((eq typ "Integer") (setq Id_val (atoi Id_val)))
     )
     (setq js
       (ssget "_X"
         (list
           (assoc 0 dxf_model)
           (assoc 8 dxf_model)
           (if (assoc 6 dxf_model) (assoc 6 dxf_model) '(6 . "BYLAYER"))
           (if (assoc 62 dxf_model) (assoc 62 dxf_model) '(62 . 256))
           (if (assoc 48 dxf_model) (assoc 48 dxf_model) '(48 . 1))
           (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
           (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
         )
       )
       js_sel (ssadd)
     )
     (cond
       (js
         (repeat (setq n (sslength js))
           (if (not (null (setq tbllist (ade_odgettables (setq ent (ssname js (setq n (1- n))))))))
             (foreach tbl tbllist
               (setq
                 tbldef (ade_odtabledefn tbl)
                 tblstr (cdr (nth 2 tbldef))
                 fldnamelist ()
                 fldtypelist ()
               )
               (foreach fld tblstr
                 (setq
                   fldnme (cdr (nth 0 fld))
                   fldtyp (cdr (nth 2 fld))
                   fldnamelist (append fldnamelist (list fldnme))
                   fldtypelist (append fldtypelist (list fldtyp))
                 )
               )
               (setq numrec (ade_odrecordqty ent tbl) ct 0)
               (while (< ct numrec)
                 (setq cttemp 0)
                 (foreach fld fldnamelist
                   (setq
                     typ (nth cttemp fldtypelist)
                     cttemp (+ cttemp 1)
                     val (ade_odgetfield ent tbl fld ct)
                   )
                   (if (= typ "Integer")(setq val (fix val)))
                   (if (and (eq tbl Id_tbl) (eq fld Id_nam) (equal val Id_val 0.00000001))
                     (setq js_sel (ssadd ent js_sel))
                   )
                 )
                 (setq ct (+ ct 1))
               )
             )
           )
         )
       )
     )
   )
 )
 (princ (strcat "\n" (itoa (sslength js_sel)) " trouvé(s)"))
 (sssetfirst nil js_sel)
 (prin1)
)

Modifié par bonuscad

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Youpee j'attendais depuis longtemps ce genre de routine

 

Cela semble bien marcher et je suggere qq petites ameliorations :

 

1) Pouvoir faire une selection classique

ou bien TOUS les objets ayant la table OD choisie (ce que fait aujourd'hui le programme)

 

2) Pour les champs de type caractere : une COCHE Minuscule/Majuscule

et aussi pouvoir faire DIFFERENT et non pas seulement EGAL

et voire meme le reve : utilisation possible des caracteres magiques * ?

 

3) Pour les champs de type Integer ou Real, svp qq options supplementaires du genre : =

et non pas seulement EGAL

 

Encore merci pour tes efforts

 

Je continue les tests ...

 

Le Decapode (lecrabe)

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

--- 1er bug ---

 

Sur un DWG avec de multiples tables OD par objet graphique,

je peux changer de table OD dans le 1er ascenseur

MAIS apres avoir selectionne une autre table OD

le 2eme ascenseur ne me presente pas les champs de la nouvelle table OD selectionnee !

 

Probleme de rafraichissement ? Snif, snif

 

Desires tu un DWG exemple ?

 

Le Decapode (lecrabe)

 

PS: je te previens, je suis un redoutable chasseur de bug !

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

--- 1er bug ---

 

Sur un DWG avec de multiples tables OD par objet graphique,

je peux changer de table OD dans le 1er ascenseur

MAIS apres avoir selectionne une autre table OD

le 2eme ascenseur ne me presente pas les champs de la nouvelle table OD selectionnee !

 

Probleme de rafraichissement ? Snif, snif

 

Desires tu un DWG exemple ?

 

Le Decapode (lecrabe)

 

PS: je te previens, je suis un redoutable chasseur de bug !

 

Salut,

 

Un DWG exemple ne serait pas de refus pour corriger le bug car je n'ai que peu (pour l'instant) de fichiers ayant des OD.

 

J'ai le sentiment d'avoir mis le doigt dans un engrenage, donc pour les améliorations cela peut être demain comme 2 ans (comme mon lancement du sujet en 2010), mais tes suggestions sont intéressantes et m'y pencherai peut être dessus...

L'ennui est qu'il y a peu de lispeur sous map, en tout cas je trouve très peu de code source sur le Net, donc j'avance très doucement. On avancerai tellement plus vite à plusieurs...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Hello Bruno

 

Voici un bon DWG MAP avec 3 tables OD par objet graphique

 

En esperant que tu puisses corriger ce petit bug

et implementer qq ameliorations !?

 

Encore MERCI pour ton boulot sur MAP

car ces truffes d'Autodesk n'envisagent pas d'ameliorer quoique ce soit du cote des ODs !

C Triste !!

 

Le Decapode (lecrabe)

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Hello Bruno

 

Voici un bon DWG MAP avec 3 tables OD par objet graphique

 

En esperant que tu puisses corriger ce petit bug

et implementer qq ameliorations !?

 

Encore MERCI pour ton boulot sur MAP

car ces truffes d'Autodesk n'envisagent pas d'ameliorer quoique ce soit du cote des ODs !

C Triste !!

 

Le Decapode (lecrabe)

 

Bonjour Patrice,

 

Bon, j'ai pas mal galéré avec la gestion des listes en DCL, je pense que mon code est encore un peu brouillon mais il à l'air de fonctionner.

J'ai éditer mon code précédent (bug vu par tes soins) et t'invite donc à tester de nouveau cette nouvelle mouture.

 

Pour les autres demandes, j'attends d'abord de voir que le code actuel fasse ses preuves. Si dans mon esprit les opérateurs semblent pouvoir être intégrés, ce n'est pas le cas (en tout cas d'une manière simple) pour l'utilisation des jokers. (il faut avoir à l'esprit que les données d'objet peuvent être des chaînes, entiers ou réels, donc difficile d'employer des jokers pour des substitutions)

 

Bon tests

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Hello Bruno

 

Merci, merci je vais essayer de tester aujourd'hui ...

 

Neanmoins SVP il y a une micro-amelioration qui serait fort sympa,

c'est d'avoir le test EGAL (ce que tu fais aujourd'hui) OU le test DIFFERENT ()

 

Les tests = ne concernent pour moi que les champs de type Integer et Real/Float

 

L'option Uppercase/Lowercase et la prise en compte des caracteres magiques * ?

ne concernent QUE les champs de type caractere !

Je croyais que la fonction WCMATCH (ou qq chose de ce genre) faisait presque tout au niveau de * ? ~ !!

 

Merci, Le Decapode (lecrabe)

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

La commande proposée par bonuscad est intéressante, elle ressemble assez à la sélection similaire.

 

N'y connaissant rien en DCL, je suis parti en .Net pour développer une fonction plus proche dans l'idée de la Sélection Rapide d'AutoCAD

 

Il est possible de sélectionner des objets avant de lancer la commande (sélection manuelle ou sélection rapide AutoCAD), sinon le test se fera sur tout le dessin.

Le dialogue affiche toutes les tables dispo, on peut en sélectionner une ou plusieurs (si plusieurs, seuls les champs communs apparaissent).

Ensuite on choisit le champ, l'opérateur et on tape la valeur, ou bien on clique sur Obtenir une valeur (bouton qui scrute le dessin et propose toutes les valeurs dispo)

Ensuite on clique Ajouter Condition, puis sur Exécuter.

 

Normalement la DLL doit fonctionner sur toutes les versions depuis la 2007.

 

Si quelqu'un veut la tester, et me remonter les commentaires.

 

Olivier

ObjectDataCS.zip

Lien vers le commentaire
Partager sur d’autres sites

Hello Olivier

 

Un seul mot : ENORME !

 

Le truc qu'Autodesk aurait du inclure dans MAP depuis longtemps !

 

Je te previens que je vais tester "a fond" ta DLL sur MAP 2009-2012

et des dessins varies avec de multiples tables OD parfois meme multiples tables OD par objet graphique

j'en ai des "tonnes" ... surtout avec la topologie ...

 

Ca me laisse un peu reveur que la meme DLL puisse fonctionner sur tout MAP depuis la 2007

car il y a des subtilites DOTNET v2/3/3.5/4 suivant les versions d'AutoCAD !?

Mais je te crois bien volontiers !

 

C'est l'arrivee en Ile de France, qui t'a booste !

 

MERCI, le Decapode (lecrabe)

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour les amis Mappiens,

 

Magnifique et merci pour l’intérêt que vous portez à développer les Données d'Objets car AutoDESK défend leur produit FDO mais les Données d'Objets sont plus faciles à traiter pour préparer justement des données géographiques.

 

Ceci étant dit, comment se nomme la fonction à écrire derrière la ligne de commande pour le dinosaure comme moi, car comme Lecrabe j'ai tout essayé mais rien, et c'est si facile dans les films de trouver la combinaison du coffre :-) .

 

Merci d'avance,

 

Cordialement,

 

Fabcad

 

Lecrabe m'a devancé quelle rapidité.

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

 

C'est surprenant, j'avais testé sur un MAP 2008, je vais voir sur une version plus récente. Normalement, les opérateurs AND OR et NOT devrait être grisés.

Pour info, le MAP 2011 c'est un 32 ou 64 bits?

 

Olivier

 

OK, j'ai trouvé, je ne l'avais pas compilé correctement en version Release.

Voilà la nouvelle DLL

ObjectDataCS.zip

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

En effet les operateurs AND OR NOT sont grises avec MAP 2010 ou MAP 2012

en version 32 bits sous Windows Seven ! Pourquoi sont ils grises ?

 

SNIF j'aurais bien aime faire au moins 2 tests avec MQSELECT !

 

Par exemple sur des Topologies de type Reseau :

SELECT * FROM 'Dessin Entier' (ou 'Selection Courante') WHERE START_NODE@TPMLINK_DEMO_RUES = 4

OR END_NODE@TPMLINK_DEMO_RUES = 4

Ce qui me permet de trouver tous les "fils/liens" (ou canalisations) qui sont connectes

sur le Noeud (Tampon-Regard) Numero 4

 

Le Decapode (lecrabe)

 

PS: tu peux recuperer mon DWG de test - Msg du 05 Mars 2012 15h08

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Sur un MAP 2011 en version 32 bits sous Windows XP, MQSELECT fonctionne à merveille :-).

 

Comment supprime t'on une requête erronée ?

 

Sinon j'essaierai sur un map 2007 au travail lundi.

 

Joli travail M. Olivier Eckmann.

 

Cordialement,

 

Fabcad

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Mes tests rapides sur mon DWG de test, montrent que cela fonctionne bien sous Windows Seven 32 bits

avec MAP 2010 / 2011 / 2012 et aussi avec CIVIL 2011 !

 

Qq micro-corrections :

- Le titre de la case de dialogue : Slection ...

- Si possible avoir acces (au moins une fois) a : AND OR NOT

- Case pour re-initialiser la requete en cas d'erreur ou supprimer la ligne courante

(un peu comme dans la gestion du groupe de dessins et les requetes associees)

 

Un seul mot : MAGNIFIQUE

 

La semaine prochaine, je vais tester avec des DWGs contenant des dizaines de milliers d'objets

et OD de MAP pour voir si ca tient la charge !

 

D'autre part je vais tester aussi avec MAP 201x en version 64 bits !

 

MERCI le Francilien (ex Brestois), Le Decapode de la Loire (lecrabe)

Autodesk Expert Elite Team

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é