Aller au contenu

Info bulle sur des Objects Data


bonuscad

Messages recommandés

Bonjour,

 

J'étais tombé sur un sujet sur theswamp

J'avais trouvé l'idée intéressante, cela évite d'activer les grips pour avoir les infos des données d'objet. On a, à la place, en dynamique une info bulle donnant ces renseignements quand on survole celle-ci.

 

Ci le post original, fonctionnait bien pour une seule table, ce n'était pas le cas quand plusieurs tables étaient affecté à un objet.

 

J'ai essayé d'améliorer le truc, voici ce que ça donne:

 (defun c:rod (/ )(c:readobjectdata))

 (vl-load-com)

 (defun c:readobjectdata (/ count *error* ename textename fieldnames fieldstring input strcatlst tablelist usercmdecho)

   (defun *error* ( msg )
     (princ (strcat "\n<" msg ">\n"))
     (progn
       (and TextENAME (entdel TextENAME))
       ;(vl-cmdf "_.usc" "_previous")
       (setvar "cmdecho" usercmdecho)
     );progn
     (princ)
   );defun

   (setq usercmdecho (getvar "cmdecho"))
   (setvar "cmdecho" 0)
   ;(vl-cmdf "_.ucs" "_world")
   (while (and (setq Input (grread T 4 2)) (= (car Input) 5))
     (if TextENAME
       (progn (entdel TextENAME) (setq TextENAME nil))
     );if
     (if
       (and (setq ename (car (nentselp (cadr Input))))
         (not (eq TextENAME ename))
       );and

       (if (setq tablelist (ade_odgettables ename))
         (progn
           (setq count 0 fieldnames nil)
           (repeat (length tablelist)
             (foreach x (cdr (assoc "Columns" (ade_odtabledefn (nth count tablelist))))
               (if (not (member (cdr (assoc "ColName" x)) fieldnames))
                 (setq fieldnames (cons (cons (cons (1+ count) (nth count tablelist)) (cdr (assoc "ColName" x))) fieldnames))
               )
             )
             (setq count (1+ count))
           )
           (if fieldnames 
             (progn
               (setq fieldnames (reverse fieldnames))
               (setq strcatlst
                 (apply 'strcat
                   (mapcar
                     (function
                       (lambda (x)
                         (strcat "{\\C" (itoa (caar x)) ";" (cdar x) "} - " (cdr x) " : "
                           (if (/= (type (setq fieldstring (ade_odgetfield ename (cdar x) (cdr x) 0))) 'STR)
                             (if (eq (type fieldstring) 'INT)
                               (itoa fieldstring)
                               (rtos fieldstring 2 2)
                             )
                             fieldstring
                           )
                         "\n")
                       )
                     );fin function
                     fieldnames
                   );fin mapcar
                 );fin apply
               );fin setq
               (setq TextENAME
                 (entmakex
                   (list
                     (cons 0 "MTEXT")
                     (cons 100 "AcDbEntity")
                     (cons 100 "AcDbMText")
                     (cons 1
                       (strcat "{\\fArial;" strcatlst "}" );strcat
                     );cons 1
                     (cons 10
                       (polar (cadr Input) 0 (/ (getvar "VIEWSIZE") 50.0))
                     )
                     (cons 40 (/ (getvar "VIEWSIZE") 75.0));
                     (cons 50 (- 0 (getvar "VIEWTWIST")))
                     (cons 62 250)
                     (cons 71 1)
                     (cons 72 5)
                     (cons 90 1)
                     (cons 63 255)
                     (cons 45 1.2)
                   );list
                 );entmakex
               );setq
             )
           )
         )
       )

     );if
   );fin while
   (and TextENAME (entdel TextENAME))
   ;(vl-cmdf "_.ucs" "_previous")
   (setvar "cmdecho" usercmdecho)
   (princ)
 )

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

 

1) Je connaissais ton ancien ROD de Novembre 2012 , et en effet ses limitations faisaient que je ne l'utilisais pas !

 

2) BRAVO / MAGNIFIQUE / SUPERBE pour ton nouveau ROD !!

Qui presente "joliment" le contenu des multi-tables OD de MAP (ou CIVIL) lors du survol des entites concernees ...

 

MERCI, Bye, Bon WE, Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Hello Bruno

 

Comme tu le sais sur un objet de MAP (ou CIVIL) on peut attacher N tables OD

et par table, on peut avoir N records attaches sur un objet ...

 

Ta routine ROD (comme la case de dialogue des proprietes) montre seulement le 1er record d'une table OD : C NORMAL !

A mon avis il n'est pas necessaire de faire PLUS avec ROD !!

 

Aujourd'hui le SEUL moyen de voir qu'un objet MAP possede une table OD attache en multi-record,

c la commande ADEEDITDATA sur l'objet concerne ...

 

SVP j'aimerais bien avoir qq routines permettant de retrouver facilement ces objets speciaux (rien a voir avec ROD) ?

Pour moi ces objets speciaux : objets avec UNE table OD, objets avec N (N>1) tables OD, objets avec UNE ou N tables OD MAIS avec au moins 2 (ou plus) records sur l'une quelconque des tables OD ..

 

*** Routine FOD (Find OD) : dans la selection classique AutoCAD, ne garder que les objets ayant au moins UNE (ou plus) table OD attachee

Ainsi on a les objets de MAP (ou CIVIL) avec OD ...

 

*** Routine FODMT (Find OD Multiple Table): dans la selection classique AutoCAD, ne garder que les objets ayant au moins DEUX tables OD attachees

Ainsi on a les objets de MAP (ou CIVIL) avec multi-tables OD ... C RARE !

 

*** Routine FODMR (Find OD Multiple Record) : dans la selection classique AutoCAD, ne garder que les objets ayant sur l'une de leur tables OD (si multi-tables) au moins 2 records OD (ou plus)

Ainsi on a les objets de MAP (ou CIVIL) avec du multi-record OD ... C TRES RARE !

 

Et enfin une routine pour eliminer les multiples records (qui sont souvent inutils)

sur les objets selectionnes ... On ne garde que le 1er record de chaque table OD attachee en fait celui que l'on voit avec ROD ou les proprietes ...

*** Routine FODMRDELR (Find OD Multiple Record DELete Records 2/3/4/etc)

 

Merci d'avance, Bon WE, Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut Patrice,

 

Dans l'immédiat je ne peut répondre qu'au dernier souhait.

Suite à une mauvaise programmation de ma part, j'avais attribué n records (souvent identiques) à mes objets, voulant m'en débarraser, j'avais écrit ceci (je ne sais pas si cela te conviendra)

 

(defun c:del_record_other0 ( / js n obj tbllist numrec ct lst)
(setq js
	(ssget "_X"
		(list
			(cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
			(cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
		)
	)
	lst nil
)
(cond
	(js
		(repeat (setq n (sslength js))
			(setq obj (ssname js (setq n (1- n))))
			(setq tbllist (ade_odgettables obj))
			(cond
				(tbllist
					(foreach tbl tbllist
						(setq numrec (ade_odrecordqty obj tbl))
						(cond
							((> numrec 1)
								(setq ct (1- numrec))
								(while (not (zerop ct))
									(ade_oddelrecord obj tbl ct)
									(setq ct (- ct 1))
								)
								(if (not (member tbl lst))
									(setq lst (cons tbl lst))
								)
							)
						)
					)
				)
			)
		)
	)
)
(if lst
	(mapcar '(lambda  (x) (princ (strcat "\nLa table " x " à été nettoyée"))) lst)
	(princ "\nAucune table à nettoyer.")
)
(prin1)
)

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 pour le rappel sur del_record_other0 ! ... qui fonctionne tres bien ...

 

SVP serait il possile d'avoir la Modif (ou une nouvelle version) pour ne traiter que une selection classique AutoCAD

et non automatiquement TOUT le DWG !?

 

MERCI encore pour toutes tes contributions sur cadxp.com & sur georezo.net !

 

Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour lecrabe,

SVP serait il possile d'avoir la Modif (ou une nouvelle version) pour ne traiter que une selection classique AutoCAD

et non automatiquement TOUT le DWG !?

 

Peut-être en supprimant simplement l'expression "_X" du code..

 

A+

(Ps: Non testé,n'ayant pas (ne connaissant pas) Map)

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Hello Bruno

 

SVP si tu as qq instants a consacrer a ceux qui galerent un peu avec les ODs de MAP (ou CIVIL) !?

 

*** Routine FOD (Find OD) : dans la selection classique AutoCAD, ne garder que les objets ayant au moins UNE (ou plus) table OD attachee

Ainsi on a les objets de MAP (ou CIVIL) avec OD ...

 

*** Routine FODMT (Find OD Multiple Table): dans la selection classique AutoCAD, ne garder que les objets ayant au moins DEUX tables OD attachees

Ainsi on a les objets de MAP (ou CIVIL) avec multi-tables OD ... C RARE !

 

*** Routine FODMR (Find OD Multiple Record) : dans la selection classique AutoCAD, ne garder que les objets ayant sur l'une de leur tables OD (si multi-tables) au moins 2 records OD (ou plus)

Ainsi on a les objets de MAP (ou CIVIL) avec du multi-record OD ... C TRES RARE !

 

Merci d'avance, Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Pourquoi je ne me précipite pas?

 

Les sélections filtrées par OD sont problématiques, alors qu'avec les XData ce n'est pas le cas: on peut inclure ceux-ci dans la liste de filtre à fournir à (ssget)

Avec les OD, en lisp, je suis obligé de tout sélectionner et d'éplucher la sélection un à un, ce qui en terme de réactivité est franchement bof...

 

La preuve pour moi flagrante est la fonction Sel_By_OD que j'avais écrite en lisp avec la fonction MQSelect écrite en Net par Olivier. C'est le jour et la nuit...

 

Donc bien que ça reste faisable en lisp, pour moi la solution serait plutôt en Net; chose que je pratique pas.

 

Si AutoDesk pouvait directement inclure les OD dans les filtres, ça serait l'idéal.

Fais remonter la doléance, tu t'exprime mieux que moi en anglais. ;)

 

PS:Je n'ai aucune idée de comment a procédé Olivier en NET, mais en tout cas c'est TOP!

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

 

OK : no problem !

 

C SUR que la vitesse de traitement de la routine en Dotnet de Olivier est incomparable !

et en Lisp/VLisp si tu dois parcourir la selection AutoCAD "entite par entite" pour voir

si il y a (ou pas) des tables ODs attachees, c la galere en terme de vitesse !

 

Sniff, Sniff, Bye, lecrabe

 

PS: cette doleance a ete remontee au niveau du "MAP Team" depuis tres longtemps

et avec malheureusement aucun resultat !

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous,

 

Je me pose aussi beaucoup de questions sur les OD, notamment lors de la lecture du post n°9 de BonusCAD :

 

Peut-on remplacer les OD par des XDATAs, surtout si on en fait un export en SHAPEFILE...(ou un tableau EXCEL par exemple) ?

 

Car, si les OD sont plus "lents" à la fouille du DWG, les XDATAs sont-ils plus rapides et efficaces, et surtout, peut-on, plus facilement, exploiter les XDATAs que les OD ?

 

C'est une question que je me pose, car j'ai des dessins avec 4000 points (dont j'insert un bloc pour chaque) que j'exporte facilement en SHAPEFILE (car j'ai fais un Lisp pour remplir la valeur des attributs), mais j'ai aussi des centaines de polylignes que je traite avec des OD...

 

Mais c'est super lourd à mettre en oeuvre avec des OD... Vu tous les attributs (6 à 9) dans différentes tables (3)... Et surtout, je ne sais pas comment automatiser ces attributions en LiSP...

 

Les XDATAs seraient-ils plus faciles, surtout à "automatiser" en LiSP ? Et à exporter ?

 

Je me questionne...

 

Denis...

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)

Lien vers le commentaire
Partager sur d’autres sites

Hello Bruno

 

SVP je reviens a la charge pour UNE des 3 routines demandees :

 

*** Routine FODMR (Find OD Multiple Record) : dans la selection classique AutoCAD, ne garder que les objets ayant sur l'une de leur tables OD (si multi-tables) au moins 2 records OD (ou plus)

Ainsi on a les objets de MAP (ou CIVIL) avec du multi-record OD ... C TRES RARE !

 

Je pense (Mais j'ai peut etre TORT !?) que tu pourrais fournir "facilement" cette routine

en la derivant de ta routine "del_record_other0" (sans le "_X") afin d'avoir une selection classique

et bien sur AUCUNE suppression de quoique ce soit !

 

FODMR : Seulement creer (en sortie) un jeu de selection de toutes les entites

ayant au moins UNE (ou plus) table OD avec au moins UN multi-record (ou PLUS) ...

 

Merci d'avance pour ton eventuelle routine, Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Peut-on remplacer les OD par des XDATAs

A DenisH

 

La réponse est oui.

J'ai repris la routine d'Olivier, car celle-ci avait à mon goût quelque défauts (cela veut pas dire que la mienne n'en a pas!).

En effet; elle ne traitait qu'une seule table et les valeurs étaient toutes des chaines.

J'ai simplement amélioré ce point.

Voici ma version.

(defun C:OD2XD ( / LstTable Jeu I iNbJeu Elt EltLstTable iEltLst iNbEltLst EltTable oTableDef sNomTable exdata oLstChamp iChamp
                 iNbChamp sNomChamp sTypeChamp sValChamp exdata newent)
 (setq LstTable (ade_odtablelist))
 (setq Jeu (ssget))
 (setq I 0 iNbJeu (sslength JEU))
 (repeat iNbJeu
   (setq Elt (ssname Jeu I))
   (setq I (1+ I))
   (if (setq EltLstTable (ade_odgettables Elt))
     (progn
     (setq iEltLst 0 iNbEltLst (length EltLstTable))
     (repeat iNbEltLst
       (setq EltTable (nth iEltLst EltLstTable))
       (setq iEltLst (1+ iEltLst))
       (setq oTableDef (ade_odtabledefn EltTable))
       (setq sNomTable (cdr (assoc "Tablename" oTableDef)))
       (regapp sNomTable)
       (setq exdata (list sNomTable))
       (setq oLstChamp (cdr (assoc "Columns" oTableDef)))
       (setq iChamp 0 iNbChamp (length oLstChamp))
       (repeat iNbChamp
         (setq sNomChamp (cdr (assoc "ColName" (nth iChamp oLstChamp))))
         (setq sTypeChamp (cdr (assoc "ColType" (nth iChamp oLstChamp))))
         (setq sValChamp (ade_odgetfield Elt EltTable sNomChamp 0))
         (setq iChamp (1+ iChamp))
         (setq exdata
           (append exdata
             (list
               (cond
                 ((eq sTypeChamp "Real") (cons 1040 sValChamp ))
                 ((eq sTypeChamp "Integer") (cons 1070 sValChamp ))
                 ((eq sTypeChamp "Point") (cons 1010 sValChamp ))
                 ((eq sTypeChamp "Character") (cons 1000 sValChamp ))
               )
             )
           )
         )
       )
       (setq exdata (list (list -3 exdata)))
       (setq newent (append (entget Elt) exdata))
       (entmod newent)
     )
     )
   )
 )
)

 

Car, si les OD sont plus "lents" à la fouille du DWG, les XDATAs sont-ils plus rapides et efficaces, et surtout, peut-on, plus facilement, exploiter les XDATAs que les OD ?

 

Oui les XDATA sont plus facilement filtrable avec (ssget (liste de filtre)).

Quand à exploiter les Xdatas! Elles ne le sont que par la programmation, donc facile si on manie au moins le lisp comme son vélo.

 

Fais tu du vélo? ;)

 

A Lecrabe

 

Je pourrais éventuellement regarder ta demande pendant du temps libre.

Par contre cela serait bien que tu me fournisse un extrait de DWG ayant ces particularités (cela m'éviterais d'en construire un, je n'ai pas d'OD multiples, vu que je purge avec ma routine)

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

Bonjour à tous,

 

Oui BonusCAD, j'ai un bon fichier en exemple à te fournir, mais je ne serais à mon bureau que lundi.

 

Et oui, je faisais du vélo, dans ma jeunesse...

 

Denis...

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)

Lien vers le commentaire
Partager sur d’autres sites

Salut Bonus,

 

La preuve pour moi flagrante est la fonction Sel_By_OD que j'avais écrite en lisp avec la fonction MQSelect écrite en Net par Olivier. C'est le jour et la nuit...

 

Donc bien que ça reste faisable en lisp, pour moi la solution serait plutôt en Net; chose que je pratique pas.

 

Si AutoDesk pouvait directement inclure les OD dans les filtres, ça serait l'idéal.

Fais remonter la doléance, tu t'exprime mieux que moi en anglais. ;)

 

PS:Je n'ai aucune idée de comment a procédé Olivier en NET, mais en tout cas c'est TOP!

C'est tout à fait vrai, c'est d'ailleurs le genre de choses qui font que je n'abandonne pas complètement le .net

(car sinon les commandes setpropertyvalue et getpropertyvalue font presque tout ce que je faisais auparavant avec .net)

 

je te joins une dll qui ne marche bien que jusqu'a la version 2012, (en tout cas elle merde avec la version 2015)

Elle contient 2 commandes, odselect et odmerge

 

odselect se contente de sélectionner par table, mais elle le fait très rapidement, je viens de la retester sur une vieille machine, ça ne traine pas pour sélectionner 20000 parcelles.

l'avantage, c'est qu'elle retourne un jeu de sélection lisp, odsset.

on peut donc l'intégrer dans un lisp en l'appelant simplement par (command "odselect ") puis en lisant le js odsset.

cette commande peut également être utilisée par le crabe, c'est une commande tout ce qu'il y a de normale !

 

avec la 2015, elle fonctionne, sélection et grip des objets, mais elle affiche un message d'erreur, c'est l'export vers le js lisp qui ne marche plus.

 

Odmerge sert à fusionner 2 tables, j'ai le souvenir de m'en être servi beaucoup à une époque, mais j'ai refait un test aujourd'hui, ça n'a pas été concluant ...

je pense qu'elle ne marche que si les 2 tables ont des champs différents, il faudrait que je refasse des tests.

 

Quand Olivier à fait son MqSelect, j'ai délaissé ces fonctions car la version d'Olivier était beaucoup plus avancée.

je vois bien qu'il y aurai un intérêt à reprendre ce travail en déclinant des fonctions lisp simple genre (odselect "table" "champ" (val)), ça aurait été facile en 2011 ... mais ce qui me gonfle avec .net, c'est les migrations:

or je suis passé de Visual Studio 2010 / autocad 2012 à visual studio 2013 / autocad 2015, et l'export vers des symboles lisp ne marche plus ! et je n'y comprends pas grand chose !

 

a+

Gégé

OdSelect.zip

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

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

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Pour la fonction MQSelect, je dois aussi balayer toute la base de données, mais c'est beaucoup plus rapide en .Net qu'en Lisp.

Au vu de cet article et de celui-ci des développeurs Autodesk, même si ce n'est pas spécifique pour les OD, on voit que l'accès aux objets est beaucoup plus rapide en .Net qu'en Lisp.

 

Ceci dit, sur les gros dessin, le temps de réponse de la fonction MQSelect est quand même non négligeable

 

J'utilise Lisp aussi bien que .Net, mais si il y a une case de dialogue à gérer, pour moi c'est forcément .Net.

Mais c'est vrai que le portage et les différentes versions sont un peu plus compliquées à gérer.

Personnellement, j'utilise VS2010 pour toutes mes versions 2007 à 2014 (pas tester encore sur 2016), mais je me contente de gérer les propriétés/méthodes simples.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Salut Gégé,

 

je te joins une dll qui ne marche bien que jusqu'a la version 2012, (en tout cas elle merde avec la version 2015)

Elle contient 2 commandes, odselect et odmerge

 

Merci, mais j'ai essayé de tester sur Map 2014. Si pas de refus de chargement par NetLoad, ODSelect reste commande inconnue...

 

@ Olivier

Personnellement, j'utilise VS2010 pour toutes mes versions 2007 à 2014 (pas tester encore sur 2016)

 

A priori lili2006 à le même problème que moi avec MQSelect (je pense qu'il est sous la version Map2016 ou 2015).

 

Je pense que tu vas être solicité pour un portage sous 2015 ou + :rolleyes:

 

Mais c'est vrai que le portage et les différentes versions sont un peu plus compliquées à gérer.

Hé oui il ne pas y avoir que des avantages à utiliser .NEt, c'est ce côté sombre qui me rebute pour me tourner vers ce language ET surtout le partager dans toutes ses déclinaisons possibles.

Celà doit être un gros investissement pour le programmeur ?!

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

salut

Salut Gégé,

Merci, mais j'ai essayé de tester sur Map 2014. Si pas de refus de chargement par NetLoad, ODSelect reste commande inconnue...

du coup j'ai mis un version plus aboutie ici mais uniquement pour Autocad 2012 à 2016 (ça devrait passer en 2016, pas testé)

Si tu veux bien refaire un test, ça m'interresse, car ça marche très bien sur mon poste avec Civil 2015 ou map 2015.

je soupçonne un problème de références non trouvées, c'est quelque chose que je maitrise assez mal.

 

 

le développement de cette routine s'est plutôt faite sur le fil de discussion suivant ICI

Les DLL sont téléchargeables dans le message #38 du 16 juin.

Je confirme que tout marche très bien avec la 2015 et la version 19 !

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

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

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

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é