RemyT Posté(e) le 22 septembre 2016 Posté(e) le 22 septembre 2016 Bonjour à tous, Tout d'abord merci à Gilles pour son super travail sur le lisp, j'ai beaucoup appris sur ce langage en peu de temps. :) Je suis totalement nouveau sur le forum ainsi qu'en langage lisp.Du coup, je ne sais pas si je suis dans le bon sujet et si je dois me présenter avant dans une certaine partie, si besoin je le ferai évidemment. ;) Donc je vais exposer mon souci. :mellow: J'essai de coder en lisp ce programme : D is diameter of wire for each line in elements.txt ID element = first cell start node = second cell end node = third cell define start point define end point found = 0 for each line in nodes.txt ID node = first cell node coord = (second cell, third cell, fourth cell) if ID node == start node start point = node coord found += 1 else if ID node == end node end point = node coord found += 2 end if end if if found == 3 break for end end for draw cylinder in Autodesk of diameter D between start point and end point end for Pour explication : J'ai un fichier contenant une liste de nœuds avec leurs ID et leurs coordonnées et un fichier contenant les barres : le numéro de la barre et les ID des nœuds reliés. J'ai donc commencé mes recherches sur les lips et j'ai du mal à trouver une formulation pour des itérations style de I à N etc,je pensais utilisé la fonction while mais j'ai du mal à comprend la notion de "nil" J'ai également du mal à savoir comment la fonction read-line fonction. Elle ne retourne que la ligne ? Peut on aller chercher des infos dans lignes colonnes ? <_< J'ai essayé de trouver des bribs un peu partout sur le net et sur le forum mais bon pas trop concluant. Pour la liaison entre les points je pensais à : (defun c:cyl() (command "_cylinder" pt1 "diametre" "_c"pt2)) utiliser la fonction read-line pour la lecture des données des lignesutiliser la fonction nth pour obtenir la donnéesutiliser la fonction command "_point" "_non" Voilà je sais, c'est mince niveau travail personnel mais bon.. J'espère que j'ai été clair, si besoin je reprécise ! N’hésitez pas à réagir et à m'éclairer ! Merci d'avance. Rem
didier Posté(e) le 22 septembre 2016 Posté(e) le 22 septembre 2016 Coucou Le texte que tu nous montre n'est pas du lisp, c'est voulu ? La fonction "read-line", comme son nom l'indique, lit une ligne du fichier texte et stocke le contenu de la ligne entière dans une variable du style : (setq ligne_lue (read-line f)) où f est le descripteur du fichier Ensuite il faut savoir comment sont séparées les données dans cette ligne, est-ce une virgule qui sépare les champs ?Quand tu sais ça tu peux initialiser chaque variable (début, fin,...) en piochant dans les champs, des routines existent pour les séparateurs de champs si tu ne sais pas comment faire. Mais je reviens sur ton apprentissage, ne fais pas de copier-coller tu n'y arriveras jamais, et quand tu croiras y être arrivé ce sera une illusion.Les aides sur le lisp sont légion sur le net, à commencer par ce site sur lequel on parle... Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
RemyT Posté(e) le 22 septembre 2016 Auteur Posté(e) le 22 septembre 2016 Oui en effet c'est voulu, c'est disons le formalisme que je connais dans les autres programmations c'est pour disons expliquer le raisonnement du programme. Le fichier peut être transformé pour avoir tout en ligne et avec les séparateurs voulu entre chaque données x,y,z,id noeud,id barre etc. Disons que je ne fais pas du copier coller, je recherche l'inspiration et je cherche surtout à comprendre le fonctionnement c'est pour moi le plus important.
didier Posté(e) le 22 septembre 2016 Posté(e) le 22 septembre 2016 Coucou C'est voulu, certes, mais je ne te suis pas ( no comprendo) Tu as un fichier texteDans ce fichier texte il y a des des lignes qui contiennent des champs avec séparateurs uniquesQu'est-ce que tu nommes ID ?Tu as dans trois champs les x y et z de départ puis ailleurs (sur la ligne) les x y et z d'arrivée ? c'est bien ça ?Le diamètre est aussi sur la même ligne dans un autre champs ? c'est bien ça ?Donc c'est bien read-line qui va te solutionner ton problème en lisant séquentiellement chaque champs et en renseignant à la volée les variables qui vont bien.Fais passer un exemple de fichier texte pour être plus précis dans les réponses. Je maintiens (et je maintiendrai) mon propos sur l'apprentissage qui doit se faire pas à pas et non en global sur une solution Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Olivier Eckmann Posté(e) le 22 septembre 2016 Posté(e) le 22 septembre 2016 Bonjour, Voilà déjà le lien pour les fonctions Lisp Le plus simple consiste à lire ton fichier des noeuds et à le convertir en liste:exemple de code pour lire un fichier texte séquentiellement (if (setq f (open fname "r")) ;open the file in read mode (while (setq txtLine(read-line f)) ;while lines of text exist in file (princ txtLine) ;print the text string to the command line ) ;close the while statement Voilà une fonction développée par Gilles qui permet de transformer une chaine de valeur avec séparateur en liste ;; STR2LST ;; Transforme un chaine avec séparateur en liste de chaines ;; ;; Arguments ;; str : la chaine à transformer en liste ;; sep : le séparateur ;; ;; Exemples ;; (str2lst "a b c" " ") -> ("a" "b" "c") ;; (str2lst "1,2,3" ",") -> ("1" "2" "3") ;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) )Attention, dans le fichier texte tu lis des caractères qu'il faudra transformer en réel pour pouvoir les utiliser comme coordonnées : voir la fonction atof Ensuite tu fais la même chose pour ton fichier de noeuds, mais pour chaque id de noeud amont/aval tu cherches dans l'autre liste les valeurs X,Y,Z correspondantes.Pour parcourir une liste, regarde du côté de foreach ou repeat, pour accéder au i ème élément d'une liste c'est la fonction nth Olivier
RemyT Posté(e) le 23 septembre 2016 Auteur Posté(e) le 23 septembre 2016 Bonjour, Merci Olivier pour ta réponse. (if (setq f (open fname "r")) ;open the file in read mode (while (setq txtLine(read-line f)) ;while lines of text exist in file (princ txtLine) ;print the text string to the command line ) ;close the while statement Du coup la boucle while va s’arrêter quand il n'y aura plus de ligne ? (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) Au niveau des arguments je ne comprend pas quoi mettre pour str et pos !Je pense comprend que sep sera remplacé par par exemple " " "," ";" etc Pour te répondre Didier : Fichier 1 des noeuds: ID du Noeud / x /y /z 1 / 0.0 / 0.0 / 0.0 2 / 0.1 / 0.2 / 0.3 3 / 0.3 / 0.2 / 0.3 etc Fichier 2 des barres : ID des barres / Id du noeud de départ / Id du noeud d'arrivé 1 / 1 / 3 (La barre 1 relie la barre 1 et 3) 2 / 2 / 3 (La barre 2 relie la barre 2 et 3) etc J'espère avoir été plus claire :/ En tout cas merci pour déjà les aides trouvés sur tout le forum ainsi que les réponses ici
(gile) Posté(e) le 23 septembre 2016 Posté(e) le 23 septembre 2016 (if (setq f (open fname "r")) ;open the file in read mode (while (setq txtLine(read-line f)) ;while lines of text exist in file (princ txtLine) ;print the text string to the command line ) ;close the while statement Du coup la boucle while va s’arrêter quand il n'y aura plus de ligne ? Oui, dès que (read-line f) ne trouve plus de ligne, elle retourne nil, donc (setq txtLine ...) retourne nil et la boucle (while ...) s'arrête. Au niveau des arguments je ne comprend pas quoi mettre pour str et pos !Je pense comprend que sep sera remplacé par par exemple " " "," ";" etcpos n'est pas un argument, c'est une variable locale de la fonction.Les arguments sont str (la chaîne de caractères à "splitter") et sep : le séparateur. Regarde les exemples dans les commentaires en en-tête de la routine. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
RemyT Posté(e) le 27 septembre 2016 Auteur Posté(e) le 27 septembre 2016 Bonjour, je vous tiens informer de mon avancé, j'ai trouvé une autre méthode pour effectuer le travail que je voulais. En passant sous CATIAv5 et en utilisant les macros intégrés a celui ci (voir la méthode ci dessous) Une simple mise en page d'un Excel suffit. https://d2t1xqejof9utc.cloudfront.net/files/23155/Excel_to_CATIA.pdf?1371318453 http://sti-beziers.fr/tsipm/spip_tsipm/IMG/pdf/IMPORT_EXCEL_CATIA.pdf J'obtiens alors mon maillage représenté et utilisable en step. Bon aller je n'ai plus qu'à rajouter du volume et de la matière ! :) En tout cas merci pour vos réponses.
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