Draugnim Posted October 20, 2016 Posted October 20, 2016 Hi, I'm trying to use the LM:writecsv function to export data from blocks to a csv file. I have made a lisp that selects all the blocks and I'm able to generate a list that has the data I need. What I'm having trouble with is making a list of lists that is needed for the LM:writecsv function. So far I have this: (defun C:expcsv() (setq ssnsccsv (ssget "X" '((0 . "INSERT") (-3 ("vs_carrier*"))))) (setq sscnt 0 sslist nil) (repeat (sslength ssnsccsv)(setq sslist (cons (ssname ssnsccsv sscnt) sslist)) (setq sscnt (1+ sscnt)) ) (princ) ;(while (/= sslist nil) (setq a (car sslist)) (setq b (cdr sslist)) (setq varcsv1 1) (setq ssa (ssadd)) ;block ename (ssadd a ssa) ;to selection set 'ssa' (setq koordinatea (cdr (assoc 10 (entget (ssname ssa 0))))) (setq xkoora (rtos (car koordinatea))) ;x coordinate (setq ykoora (rtos (cadr koordinatea)));y coordinate (setq varcsv2 (strcat "POINT (" xkoora " " ykoora ")")) (setq lista1csv (list varcsv1 varcsv2)) (setq dada (cdr(car(cdr(assoc -3 (entget a '("vs_carrier*"))))))) (setq data1 (cdr (nth 0 dada))) (setq data2 (cdr (nth 1 dada))) (setq data3 (cdr (nth 2 dada))) (setq data4 (cdr (nth 3 dada))) (setq data5 (cdr (nth 4 dada))) (setq data6 (cdr (nth 5 dada))) (setq data7 (cdr (nth 6 dada))) (setq lista2csv (list data1 data2 data3 data4 data5 data6 data7)) (setq listacsv (append lista1csv lista2csv)) );end of defun The list 'listacsv' contains all the data I need for each block. So how could I make a loop that takes each block from the selection set, makes a list with the data and then appends the list to a list of lists that I can then use with the LM:writecsv function. I hope I was clear. So I need a list for each block and that list should be a row in the csv file. Here is the link to Lee Mac's LM:writecsv function http://www.lee-mac.com/writecsv.html Quote
marko_ribar Posted October 20, 2016 Posted October 20, 2016 (edited) Untested, but try... (defun expcsv ( / ssnsccsv sscnt sslist k a varcsv1 koordinatea xkoora ykoora varcsv2 lista1csv dada data1 data2 data3 data4 data5 data6 data7 lista2csv listacsvrow listacsv ) (setq ssnsccsv (ssget "X" '((0 . "INSERT") (-3 ("vs_carrier*"))))) (setq sscnt 0 sslist nil) (repeat (sslength ssnsccsv) (setq sslist (cons (ssname ssnsccsv sscnt) sslist)) (setq sscnt (1+ sscnt)) ) (setq k 0) (while (setq a (car sslist)) (setq sslist (cdr sslist)) (setq varcsv1 (itoa (setq k (1+ k)))) (setq koordinatea (cdr (assoc 10 (entget a)))) (setq xkoora (rtos (car koordinatea))) ;x coordinate (setq ykoora (rtos (cadr koordinatea)));y coordinate (setq varcsv2 (strcat "POINT (" xkoora " " ykoora ")")) (setq lista1csv (list varcsv1 varcsv2)) (setq dada (cdr (car (cdr (assoc -3 (entget a '("vs_carrier*"))))))) (setq data1 (cdr (nth 0 dada))) (setq data2 (cdr (nth 1 dada))) (setq data3 (cdr (nth 2 dada))) (setq data4 (cdr (nth 3 dada))) (setq data5 (cdr (nth 4 dada))) (setq data6 (cdr (nth 5 dada))) (setq data7 (cdr (nth 6 dada))) (setq lista2csv (list data1 data2 data3 data4 data5 data6 data7)) (setq listacsvrow (append lista1csv lista2csv)) (setq listacsv (cons listacsvrow listacsv)) );end while (reverse listacsv) );end of defun (LM:writecsv (expcsv) (strcat (getvar 'dwgprefix) (vl-filename-base (getvar 'dwgname)) ".csv")) Edited October 21, 2016 by marko_ribar Quote
Draugnim Posted October 20, 2016 Author Posted October 20, 2016 Thank you Marko, I'll try that. I actually managed to get the list right by adding this line of code. (setq lst (cons listacsv3 lst)) So, now i have (defun C:expcsv() (setq ssnsccsv (ssget "X" '((0 . "INSERT") (-3 ("vs_carrier*"))))) (setq sscnt 0 sslist nil) (repeat (sslength ssnsccsv)(setq sslist (cons (ssname ssnsccsv sscnt) sslist)) (setq sscnt (1+ sscnt)) ) (princ) ;(while (/= sslist nil) (repeat (setq in (sslength ssnsccsv)) (setq a (car sslist)) (setq b (cdr sslist)) (setq varcsv1 1) (setq ssa (ssadd)) ;dodaj ename (ssadd a ssa);nosaca u ss ssa (setq koordinatea (cdr (assoc 10 (entget (ssname ssa 0))))) (setq xkoora (rtos (car koordinatea))) ;x koordinata (setq ykoora (rtos (cadr koordinatea)));y koordinata (setq varcsv2 (strcat "POINT (" xkoora " " ykoora ")")) (setq lista1csv (list varcsv1 varcsv2)) (setq dada (cdr(car(cdr(assoc -3 (entget a '("vs_carrier*"))))))) (setq data1 (cdr (nth 0 dada))) (setq data2 (cdr (nth 1 dada))) (setq data3 (cdr (nth 2 dada))) (setq data4 (cdr (nth 3 dada))) (setq data5 (cdr (nth 4 dada))) (setq data6 (cdr (nth 5 dada))) (setq data7 (cdr (nth 6 dada))) (setq lista2csv (list data1 data2 data3 data4 data5 data6 data7)) (setq listacsv3 (append lista1csv lista2csv)) (setq lst (cons listacsv3 lst)) ) ) !lst returns: ((1 "POINT (24.6153 -2.2945)" "CFE8C2DD-8F7F-444D-A00F-A883EB319757" 0.0 "1" "1" "2" " 250" "36") (1 "POINT (24.6153 -2.2945)" "CFE8C2DD-8F7F-444D-A00F-A883EB319757" 0.0 "1" "1" "2" " 250" "36") (1 "POINT (24.6153 -2.2945)" "CFE8C2DD-8F7F-444D-A00F-A883EB319757" 0.0 "1" "1" "2" " 250" "36")) Now I have another problem. When I try to use the LM:writecsv function with 'lst' I get the following error: Command: EXPORTCSV LM:CSV-ADDQUOTES Here is the code I use (defun c:exportcsv ( / fn in lst ss ) (defun LM:writecsv ( lst csv / des sep ) (if (setq des (open csv "w")) (progn (setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")) (","))) (foreach row lst (write-line (LM:lst->csv row sep) des)) (close des) t ) ) ) (defun LM:lst->csv ( lst sep ) (if (cdr lst) (strcat (LM:csv-addquotes (car lst) sep) sep (LM:lst->csv (cdr lst) sep)) (LM:csv-addquotes (car lst) sep) ) ) (defun LM:csv-addquotes ( str sep / pos ) (cond ( (wcmatch str (strcat "*[`" sep "\"]*")) (setq pos 0) (while (setq pos (vl-string-position 34 str pos)) (setq str (vl-string-subst "\"\"" "\"" str pos) pos (+ pos 2) ) ) (strcat "\"" str "\"") ) ( str ) ) ) ) I think the problem is that some elements of my list have quotes and some dont. I dont know how to solve that. Quote
Draugnim Posted October 20, 2016 Author Posted October 20, 2016 I use (mapcar '(lambda (x) (mapcar '(lambda (x) (cond ((= (type x) 'int) (itoa x)) ((= (type x) 'real) (rtos x)) (T x))) x)) lst) to put quotes on all elements of the list. And I use (LM:writecsv LST (GETFILED "" "" "" 1)) to call the function. Hvala Marko, ti si se jedini javio. Ne znam u cemu je problem sa ovim forumom ali ljudi ili ne odgovaraju ili su nadrndani. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.