Aller au contenu

Comment utiliser les xData ?


DenisHen

Messages recommandés

Bonjour à tous.

 

Aujourd'hui, j'aimerai en savoir plus sur les xData, mais je n'ai rien trouvé (sauf en anglais).

 

Je tente déjà d'attacher des xdata à une entité, j'ai essayé ça (que j'ai trouvé ici) :

    (setq lastent (entget (entlast)))
   (setq xMatri (strcat PrefixIncrement (itoa ValIncrement)))
   (regapp "Matri")
   (setq exdata '((-3 ("Matri" (1000 . xMatri)))))
   (setq newent (append lastent exdata))
   (entmod newent)

mais AutoCAD me répond :

; erreur: groupe DXF incorrect: (-3 ("Matri" (1000 STRCAT PREFIXINCREMENT (ITOA VALINCREMENT))))

 

Dans la Console, j'ai bien :

$ xMatri

"13B18"

_$

Quelqu'un aurait des renseignements, des tutos...?

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,

 

Regardes bien ton code...

L'expression :

'((-3 ("Matri" (1000 . xMatri))))

retourne :

((-3 ("Matri" (1000 . XMATRI))))

sans évaluer XMATRI...

 

C'est l'apostrophe ('), qui est un raccourci pour la fonction quote qui empêche l'évaluation.

Pour que la variable XMATRI soit évaluée, il faut que toute l'expression soit évaluée :

(list (list -3 (cons "Matri" (cons 1000 xMatri))))

 

Je te propose deux petites routine qui facilitent les choses

 

EDIT: correction faite suite à la remarque pertinente de DenisHen.

;; GetXdataForApplication
;; Retourne la liste des données étendues pour l'application
;;
;; Arguments
;; ename   : nom d'entité de l'objet auquel les données sont attachées
;; appName : nom de l'application enregistrée
(defun GetXdataForApplication (ename appName)
 (cdadr (assoc -3 (entget ename (list appName))))
)

;; SetXdataForApplication
;; Affecte à l'objet la liste des données étendues pour l'application
;;
;; Arguments
;; ename   : nom d'entité de l'objet auquel les données sont attachées
;; appName : nom de l'application enregistrée
;; data    : liste de paires pointées contenant les données
(defun SetXdataForApplication (ename appName data)
 (or (tblsearch "APPID" appName) (regapp appName))
 (entmod (append (entget ename) (list (list -3 (cons appName data)))))
)

 

Une fois ces routines chargées, tu peux simplement faire :

(SetXdataForApplication (entlast) "Matri" (list (cons 1000 xMatri)))

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

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile), et merci pour ton aide...

 

Effectivement, c'est bien ça que je souhaitais faire, mais... Comment dire...

 

En 7 lignes de code, tu as réussi à me perdre... ;)

 

C'est avec les list, les évaluation, les cons, les apostrophes... Que j'ai encore beaucoup de mal.

 

J'ai réellement besoin d'une formation, car c'est la base ça...

 

En tous cas, encore merci... C'est génial ! ! !

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

Par contre, je me permet une petite correction, pour le cas ou d'autres seraient à la recherche de la même chose (remplacer "ent" par "ename" dans la deuxième ligne) :

(defun GetXdataForApplication (ename appName)
 (cdadr (assoc -3 (entget ename (list appName))))
)

Et encore merci pour ce code, que j'ai osé modifié pour répondre à mes souhaits :

(defun GetXdataForApplication (ename appName)
 (cdr (assoc 1000 (cdadr (assoc -3 (entget ename (list appName))))))
)

 

De cette façon, c'est bien la valeur cherchée qui est retournée...

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

Merci pour la correction, bien vu ;)

 

Sinon, la routine GetXdataForApplication comme je l'ai définie est plus générique et retourne la listes des données quelle que soit sa longueur (il peut y avoir plusieurs données) et quel que soit le type de donnée (pas forcément une chaîne).

 

Je pense qu'il est préférable que les routines soit génériques et qu'on adapte leur usage suivant les cas.

 

donc dans ton cas, plutôt que modifier la définition GetXdataForApplication , il vaudrait mieux faire :

(cdr (assoc 1000 (GetXdataForApplication (entlast) "Matri")))

comme ça, ailleurs, tu pourras aussi faire :

(cdr (assoc 1070 (GetXdataForApplication ...)))

pour récupérer un entier, etc.

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

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é