MiniMinus Posté(e) le 21 juin 2006 Posté(e) le 21 juin 2006 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 5IPE100 100 55 4.1 5.7 7IPE120 120 64 4.4 6.3 7IPE140 140 73 4.7 6.9 7IPE160 160 82 5.0 7.4 9
Tramber Posté(e) le 21 juin 2006 Posté(e) le 21 juin 2006 (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 ./__\. (.°=°.)
Tramber Posté(e) le 21 juin 2006 Posté(e) le 21 juin 2006 (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)____ LISTIPE120 120 64 4.4 6.3 7____ SYMIPE140 140 73 4.7 6.9 7____ SYMIPE160 160 82 5.0 7.4 9____ SYM Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 21 juin 2006 Posté(e) le 21 juin 2006 SalutLe 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 texteIPE80 80 46 3.8 5.25IPE100 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 21 juin 2006 Posté(e) le 21 juin 2006 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 ceciIPE80 (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
MiniMinus Posté(e) le 22 juin 2006 Auteur Posté(e) le 22 juin 2006 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
CDL Posté(e) le 22 juin 2006 Posté(e) le 22 juin 2006 En général un fichier contient de enregistrements et chaque enregistrements contient des champsUn champs peut etre alphas (texte) ou numérique, de longeur et de position fixe dans chaque enregistrementsvoila ce que j'aurais fait012345678901234567890123456789012345678901234567890123456789 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 Zque 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]
x13 Posté(e) le 22 juin 2006 Posté(e) le 22 juin 2006 Si c'est pour l'insertion de profil tu peux jeter un oeil sur le programme profil à cette adresse http://www.ploetzl.at/tools/autocad/fr_2_02.htm salut.
Tramber Posté(e) le 22 juin 2006 Posté(e) le 22 juin 2006 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 :IPE14023 123 344 3444IPE160........ Mais des solutions, y'en a. Faut juste se méfier des textes. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 22 juin 2006 Posté(e) le 22 juin 2006 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
MiniMinus Posté(e) le 23 juin 2006 Auteur Posté(e) le 23 juin 2006 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
Patrick_35 Posté(e) le 23 juin 2006 Posté(e) le 23 juin 2006 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
retyu Posté(e) le 17 octobre 2006 Posté(e) le 17 octobre 2006 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
Patrick_35 Posté(e) le 17 octobre 2006 Posté(e) le 17 octobre 2006 SalutJe 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
retyu Posté(e) le 18 octobre 2006 Posté(e) le 18 octobre 2006 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant