Squelet Posté(e) le 16 mai 2007 Posté(e) le 16 mai 2007 Bonjour, (Gile) avait créé un petit Lisp qui après sélection d'une Poly 3D, créait un bloc avec plusieurs attributs (voir code ci-dessous)Est-il possible de récuperer des données Xdatas contenu dans cette polyligne, et de les inclure aussi comme attribut dans ce bloc, toujours en Lisp, bien entendu ? ;;; Insère le bloc "aha_bloc_metre_long_3D" après sélection d'une polyligne ;;; Attribut 1 : Zone de pose ;;; Attribut 2 : Calque de la polyligne ;;; Attribut 3 : longueur 3D de la polyligne ;;; Attribut 4 : unité longueur (defun c:pml3d (/ AcDoc Space bloc nom ent long ins) (vl-load-com) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (cond ((tblsearch "BLOCK" (setq bloc "aha_bloc_metre_long_3D"))) ((findfile (setq bloc "aha_bloc_metre_long_3D.dwg"))) (T (setq bloc nil)) ) (if bloc (progn (while (not (setq ent (car (entsel))))) (if (and (= (cdr (assoc 0 (entget ent))) "POLYLINE") (= (logand (cdr (assoc 70 (entget ent)))8)8) ) (progn (setq obj (vlax-ename->vla-object ent) id (vla-get-ObjectID obj) long (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa id) ">%).Length \\f \"%lu2%pr2%ct8\">%" ) lay (vla-get-layer obj) ) (initget 1) (setq nom (getstring T "\nZone de pose: ")) (initget 1) (setq ins (trans (getpoint "\nPoint d'insertion: ") 1 0)) (setq ref (vla-InsertBlock Space (vlax-3d-point ins) bloc 1.0 1.0 1.0 0.0 ) ) (mapcar '(lambda (x y) (vla-put-TextString x y)) (vlax-invoke ref 'GetAttributes) (list nom lay long) ) (vla-regen AcDoc acActiveViewport) ) (alert "L'objet sélectionné n'est pas une polyligne.") ) ) (alert "Le bloc \"aha_bloc_metre_long_3D\" est introuvable.") ) (princ) ) Merci d'avance et bon appétit Sur Autocad Map 2005 "Un problème sans solution est un faux problème" Albert Einstein
zebulon_ Posté(e) le 16 mai 2007 Posté(e) le 16 mai 2007 Alfred Einstein, c'est un cousin d'Albert, le prix Nobel ? Plus sérieusement, il faut se demander s'il est opportun de copier dans des attributs, des données qui sont contenues dans des xdata. La redondance est à éviter le plus possible. Si tu mets des données dans les attributs, à quoi te servent les mêmes données en xdata ? Sinon, pour les xdata, regarde ici,tu y trouveras une bibliothèque de fonctions qui gèrent les xdatasTu peux aussi regarder là pour comprendre comment c'est foutu, les xdatas. AmicalementZebulon_ C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Squelet Posté(e) le 16 mai 2007 Auteur Posté(e) le 16 mai 2007 Alfred Einstein, c'est un cousin d'Albert, le prix Nobel ?Ouais, c'est cousin assez éloigné !!Tu parles d'une boulette, je ne m'étais jamais aperçu que j'avais fait une méprise sur son prénom.Il faut vraiment que j'arrête la moquette ... !! Si tu mets des données dans les attributs, à quoi te servent les mêmes données en xdata ?En fait, mes Xdatas sont générés par un applicatif (Covadis), pour la réalisation d'un métré.Mais le détail des calculs avec les xdatas n'apparait pas.Si je peux mettre les xdatas comme attribut, je peux faire ensuite une extraction, et apporter le détails des calculs aux clients. Est-ce que c'est plus clair ? Sur Autocad Map 2005 "Un problème sans solution est un faux problème" Albert Einstein
zebulon_ Posté(e) le 16 mai 2007 Posté(e) le 16 mai 2007 Alfred Einstein est un grand musicologue allemand et il est effectivement un cousin éloigné d'Albert (cousin du 6ème degré). C'est pas des vannes, en plus. pour ce qui est des xdatas, il faut d'abord regarder comment elles sont foutues. Là le plus simple c'est d'utiliser le menu express. Express/tools/list object xdata puis tu sélectionnes une polyligne avec xdata pour que cela t'affiche quelque chose comme ça Commande: xdlistChoix de l'objet:Enter application name <*>: * Registered Application Name: CADSYS* Code 1002, Starting or ending brace: {* Code 1000, ASCII string: var* Code 1000, ASCII string: 0* Code 1002, Starting or ending brace: }* Code 1002, Starting or ending brace: {* Code 1000, ASCII string: rep* Code 1000, ASCII string: 37* Code 1002, Starting or ending brace: }* Code 1002, Starting or ending brace: {* Code 1000, ASCII string: fac* Code 1000, ASCII string: BARRE* Code 1002, Starting or ending brace: } Object has 16316 bytes of Xdata space available. Dans ton cas, je pense que la "regapp" (registered application name) sera COVADIS et après une série de code dans lesquels il faudra que tu nous dises ce qu'il faut extraire. Le mieux c'est de coller cette liste dans ta réponse en spécifiant ce qui t'intéresse. AmicalementZebulon_ C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Squelet Posté(e) le 16 mai 2007 Auteur Posté(e) le 16 mai 2007 Alfred Einstein est un grand musicologue allemand et il est effectivement un cousin éloigné d'Albert (cousin du 6ème degré). C'est pas des vannes, en plus.Eh ben au moins, j'aurais appris quelque chose aujourd'hui. Pour ce qui est des express tools, je ne les ai pas encore installés !!Ca se trouve sur le CD d'install, non ? Sinon, est-ce qu'il y a un autre moyen de voir ce qu'il faut extraire ? Sur Autocad Map 2005 "Un problème sans solution est un faux problème" Albert Einstein
Squelet Posté(e) le 16 mai 2007 Auteur Posté(e) le 16 mai 2007 C'est bon, j'ai pris le taureau par les cornes et je viens d'installer les Express Tools. Et voilà ce que j'obtiens : Commande: XDLIST Choix de l'objet: Enter application name <*>: * Registered Application Name: COVAMETRE * Code 1000, ASCII string: La * Code 1040, Real number: 0.8 * Code 1000, ASCII string: Ht * Code 1040, Real number: 1 Object has 16354 bytes of Xdata space available. La=Largeur de tranchée0.8= 0.80 (la valeur que j'ai entré dans une boite de dialogue quand Covadis à calculer le métré)Ht=Hauteur de tranchée1=1.00m (la valeur que j'ai entré dans une boite de dialogue quand Covadis à calculer le métré) Et maintenant, qu'est-ce que je fais de tout ça ? Autre chose, i speak not very well english, et je me demandais si les express tools n'éxistaient pas en français ?Je suis un peu fainéant sur les bords Sur Autocad Map 2005 "Un problème sans solution est un faux problème" Albert Einstein
zebulon_ Posté(e) le 16 mai 2007 Posté(e) le 16 mai 2007 Ben voilà pour récupérer les données, tu peux essayer ceci. (setq elist (entget (car (entsel)) '("COVAMETRE"))) tu cliques sur une polyligne et cela t'affiche les données qui sont dedans. elle ressemblera à quelque chose comme ça ((-1 . ) (0 . "LWPOLYLINE") ...... (-3 ("COVAMETRE" (1000 . "La") (1040 . 0.8) (1000 . "Ht") (1040 . 1))))) C'est surtout la fin de la liste qui nous intéresse, après le -3 ("COVAMETRE" etc... Pour extraire de la liste uniquement les xdatas, tu fais (setq exlist (assoc -3 elist)) tu auras :(-3 ("COVAMETRE" (1000 . "La") (1040 . 0.8) (1000 . "Ht") (1040 . 1)) Puis pour virer le -3 (setq thexdata (car (cdr exlist))) pour obtenir("COVAMETRE" (1000 . "La") (1040 . 0.8) (1000 . "Ht") (1040 . 1) Maintenant, tout dépend de la logique de COVAMETRE. Est-ce que c'est toujours dans cet ordre ou de temps en temps ça peut être ("COVAMETRE" (1000 . "Ht") (1040 . 1) (1000 . "La") (1040 . 0.8) voire("COVAMETRE" (1000 . "Ph") (1040 . 2) (1000 . "La") (1040 . 0.8) (1000 . "Ht") (1040 . 1) Si c'est le premier cas, il suffit de piocher le 3 ème élément de la liste (plutôt le 2ème parce qu'on commence à compter à 0) pour avoir Largeur et le 4ème pour la hauteur. (setq LARGEUR (cdr (nth 2 thexdata)))(setq HAUTEUR (cdr (nth 4 thexdata))) S'il y a des chances que l'ordre soit différent, il faut être plus prudent. Si on regarde un peu de plus près, on s'aperçoit qu'il y a toujours une sorte de clé ("Ht" ou "La") immédiatement suivie de la valeur correspondante.L'idée est d'utiliser la fonction member (member '(1000 . "La") thexdata) donne((1000 . "La") (1040 . 0.8) (1000 . "Ht") (1040 . 1)) (member '(1000 . "Ht") thexdata) donne((1000 . "Ht") (1040 . 1)) et là on est sur que c'est toujours le 2ème de la liste qui nous intéresse (setq LARGEUR (cdr (car (cdr (member '(1000 . "La") thexdata))))) (setq HAUTEUR (cdr (car (cdr (member '(1000 . "Ht") thexdata))))) puis tu injectes ça dans le lisp de Giles. N'oublie pas de transformer les valeurs ci dessus en textes avec rtos avant de les balancer dans des attributs. AmicalementZebulon_ C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Squelet Posté(e) le 16 mai 2007 Auteur Posté(e) le 16 mai 2007 Houla, il va bien me falloir le week-end pour comprendre tout ça !!Heureusement que je fais le pont.Je te tiens au courant lundi. Merci et bon week-end pour ceux qui le sont déjà ... Sur Autocad Map 2005 "Un problème sans solution est un faux problème" Albert Einstein
lecrabe Posté(e) le 16 mai 2007 Posté(e) le 16 mai 2007 Bonsoir Attention: si vous "tripotez" ce genre de données XDATA vous risquez de mettre en danger l'application COVADIS ! :exclam: Soyez prudent, Le Decapode Autodesk Expert Elite Team
Didier-AD Posté(e) le 16 mai 2007 Posté(e) le 16 mai 2007 Zebulon a raison sur le fait que pour stocker et récupérer des données, les développeurs utilisent en général la concept "clef"- données "clef" - donnees ce qui parait compliqué ce sont tous ces chiffres supérieurs à 1000 qui permettent à autoCAD de connaitre le type de donnée à stocker en Xdatas l'idée que je te propose c'est de récupérer les données Xdatas et immédiatement "virer" ces codes 100? pour ne garder que les informations essentielles c'est à dire une liste du type (("Ph" 2) ("La" 0.8) ("Ht" 1)) d'abord elle paraitra plus lisible et il te sera facile d'extraire ce que tu veux avec la syntaxe (cadr (assoc clef la_liste)) ; exemple (cadr (assoc "La" '(("Ph" 2) ("La" 0.8) ("Ht" 1)))) te donnera 0.8 ci dessous une fonction qui compose une liste de ce genre ;;---Début---------------------------------------------------ExtractXdatas-------- ;; << extrait une liste lisible de xdatas à partir d'une entité >> ;; << devrait fonctionner avec des données COVADIS >> ;; ;; créée le : mercredi 16 mai 2007 à 21:52 ;; ;; Admet : ;; ======= ;; ent : Nom d'entité = entité contenant les xdatas à extraire ;; Appli : chaine = nom d'application ;; ;; Retourne : Liste = ((clef valeur) (cle valeur) (cle valeur)....) ;; ========== ;------------------------------------------------------------------------------- (Defun ExtractXdatas ( ent Appli / Infoent Lxdatas0 Lxdatas) (setq Infoent (entget (car (entsel)) (list Appli)) Lxdatas0 (cdadr (assoc -3 Infoent)) ) (while Lxdatas0 (setq Lxdatas (cons (list (cdr (car Lxdatas0)) (cdr (cadr Lxdatas0))) Lxdatas)) (setq Lxdatas0 (cddr Lxdatas0)) ) LxDatas ) ;;---fin-----------------------------------------------------ExtractXdatas-------- Charges cette fonction et Essaie sur une de tes polylignes COVADIS la syntaxe suivante (setq MaListe (ExtractXdatas (car (entsel)) "COVAMETRE")) tu devrais obtenir une liste de la forme (("Ph" 2) ("La" 0.8) ("Ht" 1)) pour récupérer la hauteur (clef "Ht"), il te suffit d'écrire (cadr (assoc "Ht" MaListe)) Je n'ai pas COVADIS, j'ai donc travaillé en aveugle ; il se peut qu'il y ait plusieurs applications (appartenant toutes à COVADIS, il me semble avoir un jour récupéré un dessin avec une multitude d'applications commençant par "COVA...) qui stockent chacune leurs informations sur une entité. La récupération de l'ensemble des données est alors un peu plus compliquée mais toujours possible.dans la manip que e te propose on essaie d'extraire uniquement les données de l'application "COVAMETRE" Pour répondre aux inquiétudes de "LeCrabe", il n'y a aucun danger à récupérer les informations Xdatas d'une entité ; par contre il n'est pas conseillé de tenter de les modifier. bon courage
lecrabe Posté(e) le 17 mai 2007 Posté(e) le 17 mai 2007 Bon Matin Oui bien sur, il n'y a aucun risque à lire les XDATAs (d'AutoCAD), Object Datas (de MAP), Liens ASE-SQL (d'AutoCAD), etc sur un objet graphique MAIS il n'est pas question de les modifier sinon les applis qui les utilisent risquent "de se casser la figure" ! Sorry, c'est ce que je voulais dire par le verbe "tripoter" !!! Le Decapode "qui s'exprime mal" Autodesk Expert Elite Team
Squelet Posté(e) le 17 mai 2007 Auteur Posté(e) le 17 mai 2007 Pour répondre aux inquiétudes de "LeCrabe", il n'y a aucun danger à récupérer les informations Xdatas d'une entité ; par contre il n'est pas conseillé de tenter de les modifier Non, je ne veux en aucun cas les modifier, simplement pour les exporter dans un attribut pour pouvoir faire une axtraction ensuite. bon courageIl va m'en falloir car j'avoue que je n'ai pas tout saisi. Mais je vais essayer de voir ça cette après-midi.D'ores et déjà, merci à tous pour vos réponses !!! Sur Autocad Map 2005 "Un problème sans solution est un faux problème" Albert Einstein
fabdo Posté(e) le 17 mai 2007 Posté(e) le 17 mai 2007 Bonjour, Pour Express Tools en français il y a un post réalisé par Eric Quelen (pour cadxp)mais je ne sais plus ou j'ai pu le trouver. (mais je sais qu'il existe).Bonne journée.
fabdo Posté(e) le 17 mai 2007 Posté(e) le 17 mai 2007 Yes, Le menu + le guide peuvent être téléchargés ICI. Mmmm.. ça marche, pas mais tu peux le trouver sur un post d'eric sur autocad 2006 à la page 51. Enjoy!
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