Draugnim 发表于 2022-7-5 17:05:30

定制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

marko_ribar 发表于 2022-7-5 17:42:37

未经测试,但请尝试。。。
 

(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"))

Draugnim 发表于 2022-7-5 17:57:42

谢谢你,马尔科,我试试看。
 
实际上,通过添加这行代码,我成功地获得了正确的列表。

(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   )
   )
)

   
)

 
 
 
我认为问题是我的列表中有些元素有引号,有些没有。我不知道怎么解决这个问题。

Draugnim 发表于 2022-7-5 18:09:58

我使用

(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]
查看完整版本: 定制Lee Mac';s LM:wr