Aller au contenu

(résolu) liste dans un fichier


Messages recommandés

Posté(e)

bonjour

 

je voudrai écrire des listes dans un fichier. Mes listes sont définies par exemple

 

	(setq ent  (car lsel)
 	name (cdr (assoc -1 (entget ent)))
 	PB   (cdr (assoc 10 (Att-lst ent "PB")))
 	PH   (cdr (assoc 10 (Att-lst ent "PH")))
 	Num  (cdr (assoc 1 (Att-lst ent "NUM")))
)
(setq toto (list name PB PH Num))

 

ce qui me donne

toto = (<Nom d'entité: 7ffff7a0510> (54.5 -66.6833 0.0) (83.3997 -46.5496 0.0) 2)

 

je fait naïvement

 

	(setq file	(open  "D:\\test.txt" "w" ) )
(write-line toto file)
(close file)

 

 

et je me fait bien sur jeter à cause de l'argument toto qui n'est pas une string

 

comment faire pour obtenir un fichier avec les lignes ?

 

(<Nom d'entité: 7ffff7a0510> (54.5 -66.6833 0.0) (83.3997 -46.5496 0.0) 2)

(<Nom d'entité: 7ffff7a0640> (16.0 -67.4833 0.0) (44.8997 -47.3496 0.0) 0)

(<Nom d'entité: 7ffff7a0690> (142.5 -66.8833 0.0) (171.4 -46.7496 0.0) 6)

(<Nom d'entité: 7ffff7a06e0> (94.8 -65.9833 0.0) (123.7 -45.8496 0.0) 6)

 

 

si vous avez la solution, merci d'avance...

Posté(e)

Salut,

 

Tout d'abord : correspond à un nom d'entité (ENAME en LISP) ce qui est équivalent à un ObjectId dans d'autres environnements (COM, .NET). Cet identifiant est unique dans la session (pour tous les dessins ouverts) mais il n'est pas pérenne : il est reconstruit à chaque nouvelle ouverture du dessin et peut être différent d'une fois sur l'autre.

De toutes façon, un ename sous la forme "" est inexploitable (on ne peut pas s'en servir pour retrouver l'entité.

Je te conseillerais donc plutôt d'utiliser le "handle" (ou maintien) de l'entité (cdr (assoc 5 (entget ent))). Cet identifiant est unique dans le dessin et il est pérenne. La fonction handent permet de retrouver le ename d'une entité à partir de son handle.

 

Ensuite, tu peux utiliser la fonction vl-prin1-to-string pour convertir tout type de donnée AutoLISP, y compris des listes, en une chaîne de caractère. La fonction read permet le processus inverse.

 

(vl-prin1-to-string '("1E56" (54.5 -66.6833 0.0) (83.3997 -46.5496 0.0) 2))

retourne : "(\"1E56\" (54.5 -66.6833 0.0) (83.3997 -46.5496 0.0) 2)"

et

(read "(\"1E56\" (54.5 -66.6833 0.0) (83.3997 -46.5496 0.0) 2)")

retourne : ("1E56" (54.5 -66.6833 0.0) (83.3997 -46.5496 0.0) 2)

 

L'inconvénient de la méthode est une perte de précision pour les nombres réels qui ne conserve que la précision affichée.

Si tu as besoin de conserver un maximum de précision, il faut utiliser un autre format de stockage des données et traiter séparément chaque coordonnée.

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

Posté(e)

Merci beaucoup

Tes réponses sont toujours des plus précises et éclairantes.

Je me posait effectivement la question de la lecture, car j'allais me faire jeter pareillement dans l'autre sens.

Pour l'utilisation du handle, j'avais noté qu'il était spécifique à la cession, mais je croyais pouvoir m'en servir. Ton conseil va m'éviter pas mal d'errance :)

 

Je cherche à classer et à numéroter des blocs qui vont délimiter des cadres pour imprimer une mosaïque sur plusieurs feuillets. Les blocs ne sont pas forcément créer dans le bon ordre et pas forcément bien alignés. Il va donc faloir que je les classe par rangées puis l'ordre dans ces rangées. J'ai encore pas mal de boulot sur les fonctions de trie. Mais la précision de devrai pas être un problème

 

Pour que ma routine soit exploitable sur des ZWcad et autres clones, j'aurai préférer le faire un pur autolisp. du coup je vais peut être abandonner l'idée de passer par des fichiers temporaire pour stoker mes résultats. On abandonner l'idée du tout autolisp ... surtout si je trouve des fonctions pour faciliter le trie en autolisp vl-sort à l'air fait pour ça

 

Mais merci encore de répondre en ce début de Week end

Posté(e)

Salut,

 

ZWCAD supporte la plupart des fonctions Visual LISP, d'ailleurs, je ne considère les fonctions vl-* plutôt comme des extensions d'AutoLISP que comme du Visual LISP (je préfère réserver ce qualificatif aux fonctions faisant appel à COM, ActiveX ou aux réacteurs).

AutoCAD MAC, par contre, supporte les fonction vl-* mais pas les fonctions vla-*, vlax-* ou vlr-*.

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

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é