Aller au contenu

xdata


lili2006

Messages recommandés

Bonjour Bred,

 

Je suis en train de m'intérresser au XDATA et je suis en train d'appliquer ton lisp du 27/12/2007 sur un des projets qui va me permettre de faciliter énormément mon travail.

J'ai un problème avec la ligne

 (setq s (ssget "_X" (list (list -3 (list (car lst)))))
s-t (ssadd))

car s me retourne nil et donc le lisp s'arrête à cet endroit.

 

J'ai modifié l'intitulé des champs à renseigner.

La première partie du lisp marche nickel. C'est bien d'avoir fait un label pour chaque champ à renseigner mais je ne vois ou est l'erreur et surtout à quoi correspond le -3.

Si tu peux y jeter un oeil, merci par avance.

 

John.

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 112
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Meilleurs contributeurs dans ce sujet

Salut,

 

Je te recommande de consulter l'aide aux développeurs > Recherche > xdata.

 

Les données étendues sont liées à un objet (graphique ou non) et à une application enregistrée.

 

L'application enregistrée est une sorte de clé qui permet de retrouver les données étendues, étant donné qu'une entité peut avoir des données pour plusieurs applications.

 

Petit exemple à essayer pour comprendre la structure des données étendues avec les listes DXF :

 

Si l'application "App_1" n'existe pas déjà, on la crée.

On crée un cercle et on lui ajoute une donnée de type string : "Texte"

(if (not (tblsearch "APPID" "App_1"))
 (regapp "App_1")
)
(entmake
 '((0 . "CIRCLE")
   (10 0. 0. 0.)
   (40 . 10.)
   (-3 ("App_1" (1000 . "Texte")))
  )
)

On fait une sélection dans tout le dessin en filtrant sur l'application : seuls les entités ayant des données étendues pour cette application seront sélectionnés.

(setq ss (ssget "_X" '((-3 ("App_1")))))

On récupère la première entité du jeu de sélection et sa liste DXF avec les données étendues pour "App_1"

(setq ent (ssname ss 0))
(setq elst (entget ent '("App_1")))

Les données étendues :

(setq datas (cdadr (assoc -3 elst)))

 

On crée, si elle n'existe pas déjà, une nouvelle application enregistrée "App_2" et on ajoute des données à notre cercle (ent) pour cette application

(if (not (tblsearch "APPID" "App_2"))
 (regapp "App_2")
)
(entmod
 (append
   (entget ent)
   '((-3 ("App_2" (1070 . 1) (1040 . 25.4))))
 )
)

On récupère la liste des données étendues toutes applications confondues*

(setq elst (entget ent '("*")))
(setq datas (cdr (assoc -3 elst)))

Pour avoir les listes de données par application, on peut utiliser assoc:

(setq App_1-datas (cdr (assoc "App_1" datas)))
(setq App_2-datas (cdr (assoc "App_2" datas)))

 

On peut modifier ou supprimer les données étendues pour une application :

(entmod
 (append
   (entget ent)
   '((-3 ("App_1") ("App_2" (1000 . "Nouvelle donnée"))))
 )
)

 

* pour les filtres de sélection avec plusieurs applications :

les objets ayant des données pour App_1 ou App_2 : (-3 ("App_1,App_2"))

les objets ayant des données pour App_1 et App_2 : (-3 ("App_1") ("App_2"))

 

PS : le traitement des données étendues avec Visual LISP nécessite l'utilisation de variants et de safearrays. J'avais donné ici quelques routines pour utiliser les fonctions vla* avec des données de type liste AutoLISP.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

j'ai posté un message concernant une bibliothèque de fonctions concernant les xdata, mais ce message n'a eu que très peu de "succès" et j'en suis fort triste. Cela devrait intéresser les personnes que rebutent les lignes de code du genre (-3 ("Mon_App" (1000 . "Texte")) et autres joyeusetés du même tonneau.

 

Amicalement

Vincent

 

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)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

(gile) à comme d'habitude pris le temps de te renseigner.

Merci à lui, je n'aurais pas eu le courage de t'en expliquer plus, les xdata sont pas très sympa à programmer...

par contre, si tu est sur Autocad, tu as beaucoup plus "simple" à programmer je trouve que les xdata, se sont les ldata....

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous,

 

Merci pour ces explications, je vai y jeter un oeil ce soir en rentrant mais j'ai une question dans ce cas,

pourquoi j'ai le retour nil avec le lisp de Bred sur la variable s définit par

(setq s (ssget "_X" (list (list -3 (list (car lst)))))) si l'application existe dans le dessin.

Je travaille sur Autocad 2010 full peut être est ce ppur çà ? NOn ??

Merci par avance de votre aide.

 

John

Lien vers le commentaire
Partager sur d’autres sites

Salut,

C'est difficile de te réponsre sans avoir ton plan.

Car si nil, cela veux dire qu'il n'y a rien.....

 

Si l'erreur arrive lors de la recherche d'élément (commande R-Xdata), je viens de le vérifier et ça fonctionne sur 2010 et 2011.

 

pour vérifier et être sûr que tu demandes des éléments déjà existant, fait une sortie en csv (XdataXL)

et lors de la commande R-Xdata, vérifie avec le tableau csv si tu ne te trompes pas en tapant.

 

Mais peut-être pourrais-tu nous expliquer ce que tu cherchez vraiment à faire, pour qu'on t'offres des solutions plus simple que les xdata ?

 

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

J'ai pu me faire une petite application personnalisé avec les lisp de Gile idata ddata et rdata mais je ne comprend toujours pas pourquoi le lisp de BRed ne marche pas et même avec vos explications.

 

Mon but Bred est de renseigner des entités type Conduites téléphoniques et Electriques représenté par des polylignes 3D pour constituer un mini-SIG et faire un export vers Excel pour intégrer ensuite ces données vers ArcMap dans une table attributaire. Je vais maintenant faire un lisp pour un export formaté vers Excel à partir des données entrées sous Autocad.

 

Avant, je dessinai toutes mes entités graphiques sous Autocad et les renseigner ensuite sous ArcMap mais maitenant je peux les tracer sous Autocad et de suite après les avoir crées les renseigner les unes après les autres, plus simple et plus sûr.

 

De même, pour les blocs, ca va me faciliter la vie car avant j'avais un bloc avec uen quinzaine d'attributs alors que maintenant, je me suis fait une boite de dialogue où l'utilisateur entre les données et le tour est joué....

 

Merci encore de votre aide et de vos explications.

John.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Bred,

 

Non et pourtant j'ai tout essayé, sur un dessin vierge, sur un dessin avec des entités, j'ai essayé de modifié ton code, rien à faire.

Mais en ce moment, je me concentre sur l'export d'excel.

Ensuite je reviendrai te dire où j'en suis concernant ton lisp.

 

John

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Bred,

 

J'ai testé ton fichier et le lisp en conséquence et j'ai une erreur sur la sélection de l'objet en entrant les données.

Je lance le lisp, je rentre les données et j'ai dans la barre des commandes le retour aucun objet sélectionné. De même, si je sélectionne un objet avant de lancer le lisp, je rentre les données et j'ai encore le retour aucun objet sélectionné. Il doit y avoir un problème avec le ssadd,ce qui expliquerai aussi que sur mon fichier ca ne marche pas. J'ai essayé de modifier ton code en intégrant un

(car (entsel)) mais en vain. Ce qui expliquerai aussi le retour de s à nil dans mes réponses d'avant.

C'est dommage car ton code a l'air pas mal et surtout facile à manipuler, il suffit de modifier la liste des informations à demander par l'utilisateur et c'est bon.

J'ai du programmer un truc bien spécifique pour mon chantier car les données sont rentrées dans un textmult (voir lisp de Gile idata) et ensuite je dois les réorganiser pour faire l'export vers Excel.

 

Si tu pouvais jeter un oeil, merci par avance.

 

John

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

- Vérifie que c'est bien, comme tu les dis plus haut, le lisp de mon message du 27/12 que tu utilises (et refais un copier coller, peut-être qu'il y a une erreur de selection)

 

Je lance le lisp, je rentre les données

Quel commande lances-tu ?

 

Tu as bien changer la liste lstR ?

 

Exemple de données à rentrer pour la commande R-Xdata (copie de ma ligne de commande)

ici, je ne cherche que les taille = grand (j'ai remplis les autres demendes forme et couleur avec n'importe quoi, mais tu peux ne rien mettre si tu le veux en simplement validant)

Commande: R-Xdata

Recherches des Renseignements :

FORME : losange

COULEUR : orange

TAILLE : grand

2 objets sélectionnés.

Commande:

 

... donc ça fonctionnes pour moi (pour ça en tous cas), mais peut-être est-ce une autre commande que tu lances ?

 

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Bred

 

C'est moi qui déraille, je pensais que la fonction R-xdata servait à renseigner les entités alors que c'est la commande l-xdata qu'il faut utiliser.

Désolé de t'avoir fait perdre ton temps sérieux.....

 

C'est pas mal quand même ton code car les possibilités de renseigner des entités sont étendues.

 

Merci encore de ton aide.

John

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é