定制Lee Mac';s LM:wr
你好我试图使用LM:writecsv函数将数据从块导出到csv文件。
我制作了一个lisp,可以选择所有的块,并且我能够生成一个包含我需要的数据的列表。我遇到的问题是制作LM:writecsv函数所需的列表列表。
到目前为止,我有:
(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
列表“listacsv”包含每个块所需的所有数据。
那么,我如何制作一个循环,从选择集中提取每个块,制作一个包含数据的列表,然后将该列表附加到一个列表列表中,然后我可以使用LM:writecsv函数。
我希望我是清楚的。
所以我需要每个块的列表,该列表应该是csv文件中的一行。
这是李·麦克的LM:writecsv函数的链接http://www.lee-mac.com/writecsv.html 未经测试,但请尝试。。。
(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"))
谢谢你,马尔科,我试试看。
实际上,通过添加这行代码,我成功地获得了正确的列表。
(setq lst (conslistacsv3 lst))
所以,现在我有了
(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 (conslistacsv3 lst))
)
)
!lst返回:
((1“点(24.6153-2.2945)”“CFE8C2DD-8F7F-444D-A00F-A883EB319757”0.0“1”“1”“2”“250”“36”)(1“点(24.6153-2.2945)”“CFE8C2DD-8F7F-444D-A00F-A883EB319757”0.0“1”“2”“250”“36”)(1“点(24.6153-2.2945)”“CFE8C2DD-8F7F-444D-A00F-A883EB319757“0.0”1“1”“2”“250”“36”))
现在我有另一个问题。当我尝试将LM:writecsv函数与“lst”一起使用时,出现以下错误:
命令:EXPORTCSV
LM:CSV-ADDQUOTES
这是我使用的代码
(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 )
)
)
)
我认为问题是我的列表中有些元素有引号,有些没有。我不知道怎么解决这个问题。 我使用
(mapcar '(lambda (x) (mapcar '(lambda (x) (cond ((= (type x) 'int) (itoa x)) ((= (type x) 'real) (rtos x)) (T x))) x)) lst)
在列表的所有元素上加引号。
我使用
(LM:writecsv LST (GETFILED "" "" "" 1))
调用函数。
Hvala Marko,ti si se jedini javio。Ne znam u cemu je problem sa ovim forumom ali ljudi ili Ne odgovaraju ili su nadrndani。
页:
[1]