乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 20|回复: 3

[编程交流] 定制Lee Mac';s LM:wr

[复制链接]

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 17:05:30 | 显示全部楼层 |阅读模式
你好
我试图使用LM:writecsv函数将数据从块导出到csv文件。
我制作了一个lisp,可以选择所有的块,并且我能够生成一个包含我需要的数据的列表。我遇到的问题是制作LM:writecsv函数所需的列表列表。
 
到目前为止,我有:
  1. (defun C:expcsv()
  2. (setq ssnsccsv (ssget "X" '((0 . "INSERT") (-3 ("vs_carrier*")))))
  3. (setq sscnt 0 sslist nil)
  4. (repeat (sslength ssnsccsv)(setq sslist (cons (ssname ssnsccsv sscnt) sslist))
  5. (setq sscnt (1+ sscnt))
  6. )
  7. (princ)
  8. ;(while (/= sslist nil)
  9. (setq a (car sslist))
  10. (setq b (cdr sslist))
  11. (setq varcsv1 1)
  12. (setq ssa (ssadd)) ;block ename
  13. (ssadd a ssa)       ;to selection set 'ssa'
  14. (setq koordinatea (cdr (assoc 10 (entget (ssname ssa 0)))))
  15. (setq xkoora (rtos (car koordinatea))) ;x coordinate
  16. (setq ykoora (rtos (cadr koordinatea)));y coordinate
  17. (setq varcsv2 (strcat "POINT (" xkoora " " ykoora ")"))
  18. (setq lista1csv (list varcsv1 varcsv2))
  19.         (setq dada (cdr(car(cdr(assoc -3 (entget a '("vs_carrier*")))))))
  20.                 (setq data1 (cdr (nth 0 dada)))
  21.                 (setq data2 (cdr (nth 1 dada)))
  22.                 (setq data3 (cdr (nth 2 dada)))
  23.                 (setq data4 (cdr (nth 3 dada)))
  24.                 (setq data5 (cdr (nth 4 dada)))
  25.                 (setq data6 (cdr (nth 5 dada)))
  26.                 (setq data7 (cdr (nth 6 dada)))
  27. (setq lista2csv (list data1 data2 data3 data4 data5 data6 data7))
  28. (setq listacsv (append lista1csv lista2csv))
  29. );end of defun

 
列表“listacsv”包含每个块所需的所有数据。
 
那么,我如何制作一个循环,从选择集中提取每个块,制作一个包含数据的列表,然后将该列表附加到一个列表列表中,然后我可以使用LM:writecsv函数。
 
我希望我是清楚的。
所以我需要每个块的列表,该列表应该是csv文件中的一行。
 
这是李·麦克的LM:writecsv函数的链接http://www.lee-mac.com/writecsv.html
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:42:37 | 显示全部楼层
未经测试,但请尝试。。。
 
  1. (defun expcsv ( / ssnsccsv sscnt sslist k a varcsv1 koordinatea xkoora ykoora varcsv2 lista1csv dada data1 data2 data3 data4 data5 data6 data7 lista2csv listacsvrow listacsv )
  2. (setq ssnsccsv (ssget "X" '((0 . "INSERT") (-3 ("vs_carrier*")))))
  3. (setq sscnt 0 sslist nil)
  4. (repeat (sslength ssnsccsv)
  5.    (setq sslist (cons (ssname ssnsccsv sscnt) sslist))
  6.    (setq sscnt (1+ sscnt))
  7. )
  8. (setq k 0)
  9. (while (setq a (car sslist))
  10.    (setq sslist (cdr sslist))
  11.    (setq varcsv1 (itoa (setq k (1+ k))))
  12.    (setq koordinatea (cdr (assoc 10 (entget a))))
  13.    (setq xkoora (rtos (car koordinatea))) ;x coordinate
  14.    (setq ykoora (rtos (cadr koordinatea)));y coordinate
  15.    (setq varcsv2 (strcat "POINT (" xkoora " " ykoora ")"))
  16.    (setq lista1csv (list varcsv1 varcsv2))
  17.    (setq dada (cdr (car (cdr (assoc -3 (entget a '("vs_carrier*")))))))
  18.    (setq data1 (cdr (nth 0 dada)))
  19.    (setq data2 (cdr (nth 1 dada)))
  20.    (setq data3 (cdr (nth 2 dada)))
  21.    (setq data4 (cdr (nth 3 dada)))
  22.    (setq data5 (cdr (nth 4 dada)))
  23.    (setq data6 (cdr (nth 5 dada)))
  24.    (setq data7 (cdr (nth 6 dada)))
  25.    (setq lista2csv (list data1 data2 data3 data4 data5 data6 data7))
  26.    (setq listacsvrow (append lista1csv lista2csv))
  27.    (setq listacsv (cons listacsvrow listacsv))
  28. );end while
  29. (reverse listacsv)
  30. );end of defun
  1. (LM:writecsv (expcsv) (strcat (getvar 'dwgprefix) (vl-filename-base (getvar 'dwgname)) ".csv"))
回复

使用道具 举报

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 17:57:42 | 显示全部楼层
谢谢你,马尔科,我试试看。
 
实际上,通过添加这行代码,我成功地获得了正确的列表。
  1. (setq lst (cons  listacsv3 lst))

 
所以,现在我有了
  1. (defun C:expcsv()
  2. (setq ssnsccsv (ssget "X" '((0 . "INSERT") (-3 ("vs_carrier*")))))
  3. (setq sscnt 0 sslist nil)
  4. (repeat (sslength ssnsccsv)(setq sslist (cons (ssname ssnsccsv sscnt) sslist))
  5. (setq sscnt (1+ sscnt))
  6. )
  7. (princ)
  8. ;(while (/= sslist nil)
  9. (repeat (setq in (sslength ssnsccsv))
  10. (setq a (car sslist))
  11. (setq b (cdr sslist))
  12. (setq varcsv1 1)
  13. (setq ssa (ssadd))  ;dodaj ename
  14. (ssadd a ssa);nosaca u ss ssa
  15. (setq koordinatea (cdr (assoc 10 (entget (ssname ssa 0)))))
  16. (setq xkoora (rtos (car koordinatea))) ;x koordinata
  17. (setq ykoora (rtos (cadr koordinatea)));y koordinata
  18. (setq varcsv2 (strcat "POINT (" xkoora " " ykoora ")"))
  19. (setq lista1csv (list varcsv1 varcsv2))
  20.         (setq dada (cdr(car(cdr(assoc -3 (entget a '("vs_carrier*")))))))
  21.                 (setq data1 (cdr (nth 0 dada)))
  22.                 (setq data2 (cdr (nth 1 dada)))
  23.                 (setq data3 (cdr (nth 2 dada)))
  24.                 (setq data4 (cdr (nth 3 dada)))
  25.                 (setq data5 (cdr (nth 4 dada)))
  26.                 (setq data6 (cdr (nth 5 dada)))
  27.                 (setq data7 (cdr (nth 6 dada)))
  28. (setq lista2csv (list data1 data2 data3 data4 data5 data6 data7))
  29. (setq listacsv3 (append lista1csv lista2csv))
  30. (setq lst (cons  listacsv3 lst))
  31. )
  32. )

 
!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
 
这是我使用的代码
  1. (defun c:exportcsv ( / fn in lst ss )
  2. (defun LM:writecsv ( lst csv / des sep )
  3.    (if (setq des (open csv "w"))
  4.        (progn
  5.            (setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")) (",")))
  6.            (foreach row lst (write-line (LM:lst->csv row sep) des))
  7.            (close des)
  8.            t
  9.        )
  10.    )
  11. )
  12. (defun LM:lst->csv ( lst sep )
  13.    (if (cdr lst)
  14.        (strcat (LM:csv-addquotes (car lst) sep) sep (LM:lst->csv (cdr lst) sep))
  15.        (LM:csv-addquotes (car lst) sep)
  16.    )
  17. )
  18. (defun LM:csv-addquotes ( str sep / pos )
  19.    (cond
  20.        (   (wcmatch str (strcat "*[`" sep ""]*"))
  21.            (setq pos 0)   
  22.            (while (setq pos (vl-string-position 34 str pos))
  23.                (setq str (vl-string-subst """" """ str pos)
  24.                      pos (+ pos 2)
  25.                )
  26.            )
  27.            (strcat """ str """)
  28.        )
  29.        (   str   )
  30.    )
  31. )
  32.    
  33. )

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

使用道具 举报

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 18:09:58 | 显示全部楼层
我使用
  1. (mapcar '(lambda (x) (mapcar '(lambda (x) (cond ((= (type x) 'int) (itoa x)) ((= (type x) 'real) (rtos x)) (T x))) x)) lst)

在列表的所有元素上加引号。
 
我使用
  1. (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。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 09:35 , Processed in 0.489211 second(s), 71 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表