zebzeb Posté(e) le 17 juin 2014 Posté(e) le 17 juin 2014 Bonjour, Je cherche à inserer des plusieurs blocs avec un lisp qui charge un fichier CSV Mon CVS à le format suivant:TITRE;BLOC1;BLOC2;BLOC3; etc...Local1;Qantité1;Qantité2;Qantité3; etc...Local2;Qantité1;Qantité2;Qantité3; etc... Mon soucis est que j'avance à tâton donc pas très vite, , mais je me heurte à ce message continuellement: erreur: fonction incorrecte: "" (defun c:go (/) (setq dataCSV (getfiled "Selection du fichier" "" "CSV" 0)) (setq openCSV (open dataCSV "r")) (setq lireL (read-line openCSV)) (setq Titre (gc:str2lst (read-line openCSV) ";")) (setq LongueurL (length Titre)) (setq echelle 1 angle 0) (setq dataL " ") (setq Lpt ("" "0.5,-0.5" "1,-0.5" "0.5,-1" "1,-1" "1.5,-1")) (while (/= lig nil) (setq DataL (gc:str2lst (read-line openCSV) ";")) (setq pt (Getpoint (strcat "\nPoint d'insertion: " (nth x DataL)))) (setq x 2) (while (> LongueurL x) (command "inserer" (nth x Titre) (nth x pt) echelle echelle angle (nth x DataL)) (setq x (+ x 1)) ) ) (princ) ) (defun gc:str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (gc:str2lst (substr str (+ (strlen sep) pos 1)) sep) )(list str)) ) Merci pour votre aide
Maxence DELANNOY Posté(e) le 17 juin 2014 Posté(e) le 17 juin 2014 Tu utilises une variable nommée angle qui écrase la fonction angle d'AutoLISP. Renomme la ang par exemple. Et quand tu fais : (setq Lpt ("" "0.5,-0.5" "1,-0.5" "0.5,-1" "1,-1" "1.5,-1")) Il faut préfixer ta liste d'un guillemet simple (') car sinon elle est évaluée directement. Donc : (setq Lpt '("" "0.5,-0.5" "1,-0.5" "0.5,-1" "1,-1" "1.5,-1")) Et quantité, il y a un u entre le q et le a... ;) Maxence DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
zebzeb Posté(e) le 17 juin 2014 Auteur Posté(e) le 17 juin 2014 Oups! en effet impardonnable le ' pour les listes, je n'ai plus l'erreur mais ça ne marche toujours pas grrr, j'vais quand même pouvoir avancer Merci Maxence
bonuscad Posté(e) le 18 juin 2014 Posté(e) le 18 juin 2014 Bonjour, Juste à la lecture (pas de test) de ton code, deux choses me chagrine... (while (/= lig nil)lig est une variable qui n'est pas définie, donc déjà ton code n'exécutera jamais ta boucle while. (setq pt (Getpoint (strcat "\nPoint d'insertion: " (nth x DataL)))) (setq x 2) Pareil tu définis ta variable x après l'usage de celle-ci, donc à la première évaluation x est à nil (donc (nth x DataL) va échouer)ou une valeur erronée sera retourné car tes variables ne sont pas définie en local.(defun c:go (/) devrait être (defun c:go (/ dataCSV openCSV etc...) Et dernier point tu ne ferme pas le fichier CSV ouvert par (close openCSV) Peut être qu'avec ces incohérences corrigées, cela fonctionnera...NB: Pour info (nth 0 liste) renvoie le 1er élément de la liste, donc (nth 2 DataL) renvoie le 3eme élément. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Olivier Eckmann Posté(e) le 18 juin 2014 Posté(e) le 18 juin 2014 Bonjour tu as le programme de Lee Mac pour lire un CSV et récupérer une liste de liste.ReadCsv Ca sera plus simple à manipuler, et comprendre le fonctionnement du lisp pour lire le fichier CSV permet de progresser plus vite. Olivier
zebzeb Posté(e) le 18 juin 2014 Auteur Posté(e) le 18 juin 2014 Bonjour, Oui en effet hier soir, j'ai pu constater ces problèmes et d'autre d'ailleurs!! Par contre(defun c:go (/) devrait être(defun c:go (/ dataCSV openCSV etc...) Je crois que c'est le chargement des variables (?) un peu comme "Option Explicit" en VBAMais en lisp je n'ai jamais vu de différence les programmes fonctionnent avec et sans (?) J'en profite également pour soliciter une explication (avec un exemple simple si possible) de la fonction polar car je ne m'en sort pas !Je chercher à faire des pas de 1 horizontal vers la droite mais le "retour à la ligne" pas de 1 je galère Merci à vous
zebzeb Posté(e) le 19 juin 2014 Auteur Posté(e) le 19 juin 2014 Bonjour, Enfin ça fonctionne ... Donc si ça peut intéresser quelqu'un d'autre, même je sais que l'on peut faire mieux en moins brouillon ;) (defun gc:str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (gc:str2lst (substr str (+ (strlen sep) pos 1)) sep) )(list str)) ) (defun c:goCSV (/ dataCSV openCSV lireL Titre LongueurL echelle ang DataL ptOrigine pt x) (setq dataCSV (getfiled "Selection du fichier" "" "CSV" 0)) (setq CoefEch (getint "\nCoef (1|mm, 10|cm, 1000|m etc...),: ")) (setq openCSV (open dataCSV "r")) (setq lireL (read-line openCSV)) (setq Titre (gc:str2lst lireL ";")) (setq LongueurL (length Titre)) (setq d2r90 (* Pi (/ 90.0 180.0))) (setq d2r180 (* Pi (/ 180.0 180.0))) (setq echelle (* CoefEch 1)) (setq ang 0 ) (setq dataL " ") (while (/= DataL nil) (setq lireL (read-line openCSV)) (setq DataL (gc:str2lst lireL ";")) (setq ptOrigine (Getpoint (strcat "\nPoint d'insertion du local: " (nth 0 DataL)))) (command "_TEXT" "S" "SB_TITRE" ptOrigine "0.15" 0 "%%UCourants forts:"); "" "") (setq x 1) (while (> LongueurL x) (setq Bloc (nth x Titre)) (setq ValAtt (strcat "x" (nth x DataL))) (if (/= Bloc "") (progn (if (= x 1) (setq pt (polar ptOrigine d2r90 -0.4)) (setq pt (polar pt d2r180 -0.8)) ) (if (/= CFA "on") (command "inserer" Bloc pt echelle echelle ang ValAtt ) (command "inserer" Bloc pt echelle echelle ang ValAtt ) ) ) (progn (setq CFA "on") (setq pt (polar ptOrigine d2r90 -0.8)) (command "_TEXT" "S" "SB_TITRE" pt "0.15" 0 "%%UCourants faibles:" "" "") (setq pt (polar ptOrigine d2r90 -1.2)) (setq pt (polar pt d2r180 0.8)) ) ) (setq x (+ x 1)) (princ (strcat "\nX + 1 = " (itoa x) "\n")) ) (setq CFA "off") ) (close openCSV) (princ) ) Type de fichier CSV extrait d'une base excel après un filtre: NOM DE ZONE;NOM-BLOC-CFO1;NOM-BLOC-CFO2;NOM-BLOC-CFO.etc;;NOM-BLOC-CFA1;NOM-BLOC-CFA.etc ZONE 1 ;1;2;3;;4;5 ZONE 2;1;0;3;;1;9 ZONE Etc...;7;2;?;;4;8 Les chiffres sont des quantitésLe double ;; permet de différencier le CFO du CFALes blocs son prévu avec un seul attribut Bonne journée et merci pour votre aide
bonuscad Posté(e) le 19 juin 2014 Posté(e) le 19 juin 2014 Bravo, On a une certaine satisfaction quand on y arrive de par soi même ;) Et en plus on progresse plus vite dans l'apprentissage du langage.En dernier point: On a envie d'aider les personnes qui s'investissent... Bonne continuation. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
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