Aller au contenu

Modifier la valeur d\'un xdata


Messages recommandés

Posté(e)

Bonjour

 

J'ai une entité avec des Xdata de type ascii :

 

 ((-1 . ) (0 . "LINE") (330 . ) 
(5 . "307") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . 
"AcDbLine") (10 30.5609 19.9631 0.0) (11 16.4007 17.6765 0.0) (210 0.0 0.0 1.0) 
[b] (-3 ("SAF_ID" (1002 . "{")  [u] (1000 . "5")[/u] (1002 . "}"))) [/b])

 

J'eessaye d'en modifié la valeur pour incrémenter la valeur et que l'entité devienne :

 

 ((-1 . ) (0 . "LINE") (330 . ) 
(5 . "307") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . 
"AcDbLine") (10 30.5609 19.9631 0.0) (11 16.4007 17.6765 0.0) (210 0.0 0.0 1.0) 
[b] (-3 ("SAF_ID" (1002 . "{")  [u] (1000 .  [surligneur] "10"[/surligneur] )[/u] (1002 . "}"))) [/b])

 

J'ai essayé ça :

 

 (setq entite (subst (cons 1000 safid) (itoa (+ increment (atoi SAFID))) entite))

(avec "increment" un entier que je passe en argument de mon lisp)

 

Mais cela ne fonctionne pas, je n'atteints pas les xdata avec cette commande... Comment dois-je procéder ? Existe-t'il un moyen plus facile pour manipuler les Xdata ?

 

Merci d'avance

Autocad 2021 - Revit 2022 - Windows 10

Posté(e)

Salut,

 

Je ne suis pas sûr d'avoir bien compris mais avec :

 

(setq safid (caddr (cadr (assoc -3 entite)))) 

et

 

(setq
 entite (subst (cons -3
	   (list "SAF_ID"
		 '(1002 . "{")
		 (cons 1000 (itoa (+ increment (atoi (cdr safid)))))
		 '(1002 . "}")
	   )
     )
     (assoc -3 entite)
     entite
     )
) 

 

çà semble marcher.

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

Posté(e)

Bonjour Ludwig

 

Si tu as les expresstools, tu pourrais t'inspirer du programme "XDATA.lsp"

 

Xdata permet de rajouter des données, mais pas de substituer des données. Cependant tu doit pouvoir l'adapter.

 

Un autre conseil, pour une valeur entière utilise plutot le code "1070" que le code "1000" qui est plutot destiné aux chaines de caractères.

 

ce qui pourrait donné en code (pas achevé, j'ai fais la substitution mais je n'ais pas reconstruis la liste pour la mise à jour)

Attention l'ordre des xdata est TRES important, si tu as plusieurs fois le même code par exemple 1070, assure toi de bien extraire celui qui t'interesse et de le remettre dans le même ordre.

 

(defun c:test ( / )
(while
	(not (setq e_sel (entsel)))
)
(setq e_name (car e_sel))
(setq increment 10)
(setq e_list (entget e_name (list "SAF_ID")))
(cond
	((setq xd_list (assoc -3 e_list))
		(setq xd_list (cdadr xd_list))
(print (assoc 1070 xd_list))
		(setq xd_list (subst (cons 1070 (+ increment (cdr (assoc 1070 xd_list)))) (assoc 1070 xd_list) xd_list)) 
(print (assoc 1070 xd_list))
	)
	(T
		(princ "\nAucune donnée d'objet étendue n'est associée à cet objet.")
	)
)
(prin1)
)

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

Posté(e)

Merci les amis !

 

Vous m'avez déjà permis de voir que j'avais inverser les arguments de SUBST :red:

 

Ensuite effectivement, je ne fais pas mon SUBST directement dans la liste de l'entité mais juste dans la liste de l'xdata, puis je reconstruis l'entité.

 

Maintenant ça fonctionne.

 

A+

Autocad 2021 - Revit 2022 - Windows 10

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é