Aller au contenu

Messages recommandés

Posté(e)

Bonsoir à toutes et à tous

 

Quelqu'un peut-il me dire comment écrire un fichier avec le bloc-note pour que le petit programme ci-dessous puisse le lire ? Je n'arrive pas à séparer le nom du profil de ses mensurations. Le programme me met l'erreur suivante : ; erreur: type d'argument incorrect: consp "IPE80 80 46 3.8 5.2 5". J'ai essayé en mettant des parenthèses, des apostrophes, des virgules mais rien n'y fait.

 

Merci

 

MiniMinus

 

Routine :

(defun c:LireFic ()

(setq MonFic "C:/Documents and Settings/Manuel/Application Data/Autodesk/AutoCAD 2004/R16.0/fra/Support/Fichier_Profils.txt")

(setq x (open MonFic "r") ct 0)

(while (< ct 43)

(setq Profil (read-line x))

(princ Profil)

(princ "\n")

(setq debut (car Profil))

(princ debut)

(setq ct (1+ ct))

)

(close x)

(princ)

)

 

Fichier : (du moins quelques lignes seulement mais il en compte 42)

IPE80 80 46 3.8 5.2 5

IPE100 100 55 4.1 5.7 7

IPE120 120 64 4.4 6.3 7

IPE140 140 73 4.7 6.9 7

IPE160 160 82 5.0 7.4 9

Posté(e)

(setq debut (car Profil))

 

ne marchera que si la ligne représente une liste or ca n'est pas le cas.

 

Essaie ce code :

 

(defun c:LireFic ()

(setq MonFic "C:/01.txt")

(setq x (open MonFic "r") ct 0)

(while

(setq Profil (read-line x))

(princ(strcat Profil "____\t "(VL-PRINC-TO-STRING (type Profil))))

 

(princ "\n")

 

(setq ct (1+ ct))

)

(close x)

(princ)

)

 

Tes textes ne sont.... que des textes

 

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

(defun c:LireFic ()
 (setq MonFic "C:/01.txt")
 (setq x (open MonFic "r"))
 (while
   (setq Profil (read-line x))
   (princ(strcat Profil "____\t  "(VL-PRINC-TO-STRING (type(read Profil)))))    
   (princ "\n")    
   )
 (close x)
 (princ)
 )

 

Grace à ce code là, tu vas trouver une piste, moi je te conseille d'essayer d'obtenir ca :

 

IPE80 80 46 3.8 5.2 5____ SYM

(IPE100 100 55 4.1 5.7 7)____ LIST

IPE120 120 64 4.4 6.3 7____ SYM

IPE140 140 73 4.7 6.9 7____ SYM

IPE160 160 82 5.0 7.4 9____ SYM

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Salut

Le lisp corrigé non testé

defun c:LireFic ()
(setq MonFic "C:/Documents and Settings/Manuel/Application Data/Autodesk/AutoCAD 2004/R16.0/fra/Support/Fichier_Profils.txt")
(setq x (open MonFic "r"))
(while (setq Profil (read-line x))
 (princ (strcat "\n" Profil))
 (setq val1 (atoi (read-line x)))
 (setq val2 (atoi (read-line x)))
 (setq val3 (atof (read-line x)))
 (setq val4 (atof (read-line x)))
 (setq val5 (atoi (read-line x)))
)
(close x)
(princ)
)

Et le fichier texte

IPE80

80

46

3.8

5.2

5

IPE100

100

55

4.1

5.7

7

 

Mais si tu souhaites conserver ta structure, il faut dans ce cas utiliser la fonction read sur la variable Profil, ce qui est plus complexe à mettre en place

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Un truc qui pourrait être interressant de faire, suivant si tu désire exploiter les données par la suite, est d'affecter des variables du nom de l' IPE à une liste.

Par exemple avec l'extrait de fichier que tu as donné:

 

(defun c:lirefic ( / MonFic x Profil typ_prof)
(defun espa (chn / )
(while (eq (substr chn 1 1) " ")
	(setq chn (substr chn 2))
)
(while (/= (substr chn 1 1) " ")
	(if (eq (substr chn 1 1) "")
		(setq chn '" ")
		(setq chn (substr chn 2))
	)
)
)
(setq MonFic "C:/Documents and Settings/Manuel/Application Data/Autodesk/AutoCAD 2004/R16.0/fra/Support/Fichier_Profils.txt")
(setq x (open MonFic "r"))
(while (setq Profil (read-line x))
	(cond
		((eq (type (read profil)) 'SYM)
			(setq typ_prof (list (read profil)))
			(while (read (setq profil (espa profil)))
				(setq typ_prof (append typ_prof (list (read profil))))
			)
			(print (car typ_prof)) (princ (cdr typ_prof))
			(set (car typ_prof) (cdr typ_prof))
		)
	)
)
(close x)
(princ)
)

 

Ainsi tu devrais obtenir ceci

IPE80 (80 46 3.8 5.2 5)

IPE100 (100 55 4.1 5.7 7)

IPE120 (120 64 4.4 6.3 7)

IPE140 (140 73 4.7 6.9 7)

IPE160 (160 82 5.0 7.4 9)

 

un (car IPE80) retournera 80, un (cadr IPE80) -> 46 , (caddr IPE80) -> 3.8 etc...

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

Posté(e)

Merci à tous pour vos différentes réponses.

 

l faut maintenant que j'étudie tout cela (des maux de tête en perspective !!!). Hier, j'avais retenu la solution de Patrick_35 (qui marche très bien) mais seulement il me faut lire 6 lignes par profil or je ne voudrais en lire qu'une seule par profil.

 

La solution de BonusCad me semble prometteuse car je me retrouve alors avec le nom du profil puis une liste avec ses caractéristiques. Pour une recherche avant extraction, cela devrait être plus rapide.

 

Une petite question subsidiaire : quelles sont les limites d'un programme pour qu'il puisse tourner sous LT ? En effet, je crée mes routines sous version complète (ce qui est évident !! loll) mais elles devront principalement tourner sous version LT.

 

MiniMinus

Posté(e)

En général un fichier contient de enregistrements et chaque enregistrements contient des champs

Un champs peut etre alphas (texte) ou numérique, de longeur et de position fixe dans chaque enregistrements

voila ce que j'aurais fait

012345678901234567890123456789012345678901234567890123456789

 

IPE80 00000000800000000046000000003.800000005.20000000005

 

domage dans le message ça passe pas comme dans fichier un texte

 

un petit bout de programme comme exemple :

a réadapter pour ton cas ici les champs font 10, en position 20, 35 et 48 j'ai X Yet Z

que je converti en numerique puis en points :casstet:

	(setq fic (open f "r"))
(while (setq enrg (read-line fic))
	(setq atr (substr enrg 1 10))
	(setq x (atof(substr enrg 20 10)))
	(setq y (atof(substr enrg 35 10)))
	(setq z (atof(substr enrg 48 10)))

	(setq pt1 (list x y z))

	(command "TEXTE" "C" pt1 h ang atr)
)
(close fic) 

 

Pour utiliser le LISP sous LT il te faut LT-EXTENDER

ça marche trés bien [Edité le 22/6/2006 par CDL]

 

[Edité le 22/6/2006 par CDL]

Posté(e)

Avec ma solution, qui consiste à mettre des parenthèses, comme je te l'ai montré sur la 2ème ligne du fichier, tu obtiens direct une liste. Pas très orthodoxe mais diablement rapide à exploiter. Quoi de mieux qu'une liste ?

 

De façon générale il faut t'exercer et te fixer des objectifs. La convertion est plus facile si tu n'as que des chiffres dans le fichier, c'est juste un peu plus délicat avec du texte inclut, à un endroit ou à un aute, sur la même ligne ou sur une autre.

 

Une autre solution élégante est de faire alterner une ligne de titre, une ligne de donnée.

Cela diminue les risques d'erreurs :

IPE140

23 123 344 3444

IPE160

........

 

Mais des solutions, y'en a. Faut juste se méfier des textes.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

La solution que j'avais donnée est la plus simple, mais il est vrai que l'on peut dfaire beaucoup plus complexe. Reste à savoir comment on veut se servir de ces valeurs dans le lisp afin d'organiser au mieux son fichier

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci à tous

 

Pour ma part, j'ai choisi pour le moment la solution à Patrick_35 qui est la plus simple pour moi qui veut me contenter pour l'instant d'AutoLISP. J'ai mis le mot "fin" à la fin de mon fichier pour le tester même quand je rajoute des profils. Ce ne doit pas être la méthode la plus orthodoxe mais pour l'instant j'en suis encore aux balbutiements.

 

MiniMinus

Posté(e)

Du moment que tu trouves ton bonheur, c'est le principal ;)

 

J'ai mis le mot "fin" à la fin de mon fichier pour le tester

Le (while (setq Profil (read-line x)) permet de tester que ce n'est pas vide et donc que la fin de fichier n'est pas atteinte, et puis, rien n'interdit de mettre un compteur pour connaitre le nombre de profil et voir si tu dépasses

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

  • 3 mois après...
Posté(e)

AU SECOUR,

 

Ces postes sont vieux mais j'ai besoin d'un petit coup de main pour lire un fichier et integrer ces element a une liste...

j'ai essayé la technique du dessus mais G toujours une erreur...

 

je veux juste un petit script pour lire les fichier et apres je me debrouille...

Merci

Posté(e)

Salut

Je ne sais pas ce que tu veux lire mais voici un exemple

 

@+

(setq f (open "mon_fichier.txt" "r")) ; <-- Ouverture du fichier affecté à la variable f
(while (setq lec (read-line f)) ; <-- Lectuire du fichier tant qu'il n'est pas vide avec la variable lec
(setq lst (append lst (list lec))) ; <-- Contitution de la liste lst
) ; <-- Fin du while
(close f) ; <-- Fermeture du fichier

 

nb : non testé

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci bcp, ca devrait deja bcp m'aider...

La seul question que j eme pose c'est :

sous linux le chemin du fichier doit se faire a partir d'ou? de la racine ou de l'emplacement de lisp???

merci d'avance

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é