Aller au contenu

Liste de point et barre


Messages recommandés

Posté(e)

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 lignes

utiliser la fonction nth pour obtenir la données

utiliser 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

Posté(e)

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

Posté(e)

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.

Posté(e)

Coucou

 

C'est voulu, certes, mais je ne te suis pas ( no comprendo)

 

Tu as un fichier texte

Dans ce fichier texte il y a des des lignes qui contiennent des champs avec séparateurs uniques

Qu'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

Posté(e)

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

Posté(e)

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

Posté(e)

(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 " " "," ";" etc

pos 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

Posté(e)

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.

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é