xbqbbl 发表于 2011-11-5 23:09:00

求助,怎样把list生产的列表转换成字符串

用list生成的列表包含多个坐标值,并想用strcat在前面加上注记,但老是提示参数缺陷,请高手解答一下

vormittag 发表于 2011-11-7 11:54:15

xbqbbl 发表于 2011-11-7 10:25 static/image/common/back.gif
谢谢,我是想实现选取一个封闭的区域,在文件里面写入封闭区域的面积及面积编号,后面为多段线各点坐标值, ...

粗粗看了一下,看到几个不太合适的地方:
1、尽量少用boundary, 如果封闭区域没有完全显示在图形屏幕中不能生成封闭多段线的。建议搜索Gu_xl版主的帖子,有形成封闭区域多段线的好算法。
2、(setq n (cdr (nth 9 endata))) 别这么写,你那么确认多段线的顶点数90组码出现在第10个列表元素么?如果多几个类似颜色、线型这样非缺省的特性,90组码未必是第10个列表元素。用(cdr (assoc 90 endata))更准确。后面取顶点也是一样的问题。
3、好像你在(command "area" "o" en) 前还没有 (close ff) , 为什么又要(setq ff (open data_file "a"))?
4、(rtos ptlist)是不正确的用法,rtos 后面的第一个参数需要是一个浮点数,而不是表。这是你这个程序最大的问题。

jack093 发表于 2020-9-30 18:57:32

用这样一行代码可以得到所有多段线顶点坐标,尽管效率可能不高。 (setq ptlist (apply 'append (mapcar '(lambda(x) (if (= 10 (car x)) (list (cdr x)))) endata)))用这样一行代码可以把ptlist转换成用制表符分隔开来的字符串,注意最前面的制表符没有去掉,可以根据程序需要进行处理。 (setq strlist (apply 'strcat (mapcar '(lambda(y) (strcat "\t(" (substr (apply 'strcat (mapcar '(lambda(x) (strcat "," (rtos x 2 3))) y)) 2) ")")) ptlist)))
请教vormittag版主如何将变量
(setq lst '("块名1" p1 p2 ang sc (list p3 p4) "string1"))转换成字符串保存到文件?

wyl219 发表于 2020-10-1 18:35:49

jack093 发表于 2020-9-30 18:57
请教vormittag版主如何将变量
(setq lst '("块名1" p1 p2 ang sc (list p3 p4) "string1"))转换成字符串 ...

(vl-princ-to-string lst)

if 发表于 2011-11-6 00:51:54

问题没问清楚,举个例子说明下

vormittag 发表于 2011-11-6 16:09:34

本帖最后由 vormittag 于 2011-11-7 12:16 编辑

你要把列表的结构特点以及你想转换的字符串的格式讲讲清楚。
如果是一个点pt(1.2 2.3 3.4)
可以用
(strcat "(" (substr (apply 'strcat (mapcar '(lambda(x) (strcat "," (rtos x 2 3))) pt)) 2) ")")
返回值为
"(1.200,2.300,3.400)"这样一个字符串

笔误:rtos误写作rots了,1 应为2, 已修正

Gu_xl 发表于 2011-11-6 16:22:27

要提高提问技巧,这样的提问一般是得不到你要的答案的!

校长 发表于 2011-11-6 16:23:27

xbqbbl 发表于 2011-11-7 10:25:50

谢谢,我是想实现选取一个封闭的区域,在文件里面写入封闭区域的面积及面积编号,后面为多段线各点坐标值,程序如下
(defun c:mianji ()
(setq data_file (getfiled "mianji" "e:\mianji" "txt" 2))
(setq ff (open data_file "a"))
(setq i 1)
(write-line "单元号   面积角点1    角点2    角点3    角点4" ff)
(setq pt (getpoint "/n选择区域内点"))
(while (/= pt nil)
    (command "BOUNDARY" pt "")
    (setq en (entlast))
    (command "text" "m" pt 2.5 "0" (strcat (itoa i) "#"))
    (setq endata (entget en))
    (setq n (cdr (nth 9 endata)))
    (setq j 0)
    (setq ptx '())
    (repeat n
      (setq ptn (cdr (nth (+ 14 (* j 4)) endata)))
      (setq ptlist (cons ptxptn))
      (setq ptx ptlist)
      (setq j (1+ j))
      )
    (command "area" "o" en)
    (setq aa (getvar "area"))
    (setq ff (open data_file "a"))
    (write-line (strcat (itoa i) "#" (rtos aa 2) )(rtos ptlist ) ff)
   (close ff)
    )
)
运行中出现参数缺陷,请高手指正

xianaihua 发表于 2011-11-7 12:15:53

你的源程序问题较多,以下是我给你改的:(defun c:mianji(/ data_file ff i pt en ptlist aa data_str)
(if (and (setq data_file (getfiled "选择数据保存文件" "e:\mianji" "txt" 1))
   (setq ff (open data_file "a"))
      ) ;_ 结束and
    (progn (setq i 1)
   (write-line
       "单元号\t面积\t\t角点1\t\t角点2\t\t角点3\t\t角点4"
       ff
   ) ;_ 结束write-line

   (while (setq pt (getpoint "\n点取区域内的点或右键退出:"))
       (command "BOUNDARY" pt "")
       (setq en (entlast))
       (command "text" "m" pt 2.5 "0" (strcat (itoa i) "#"))
       (setq ptlist (vertexs en))
       (command "area" "o" en)
       (setq aa      (getvar "area")
       data_str ""
       ) ;_ 结束setq
       (foreach xptlist
         (setq data_str (strcat data_str (_tostring x)))
       ) ;_ 结束foreach
       (write-line
         (strcat (itoa i)
         "#\t"
         (rtos aa 2)
         "\t"
         data_str
         ) ;_ 结束strcat

         ff
       ) ;_ 结束write-line

   ) ;_ 结束while
   (close ff)
    ) ;_ 结束progn
) ;_ 结束if
) ;_ 结束defun

;;;语法:
;;;(vertexs ename)
;;;说明:
;;;返回多段线的各顶点
;;;参数:
;;;ename:图元名
;;;返回值:
;;;各顶点形成的列表
(defun vertexs (ename / plist pp n)
(setq obj (vlax-ename->vla-object ename))
(setqplist (vlax-safearray->list
    (vlax-variant-value
      (vla-get-coordinates obj)
    ) ;_ 结束vlax-variant-value
      ) ;_ 结束vlax-safearray->list
) ;_ 结束setq
(setq n 0)
(repeat (/ (length plist) 2)
    (setq pp (append pp (list (list (nth n plist) (nth (1+ n) plist)))))
    (setq n (+ n 2))
) ;_ 结束repeat
pp
) ;_ 结束defun
(defun _tostring (x / dimzin)
(cond
    ((eq 'INT (type x))
   (itoa x)
    )
    ((eq 'REAL (type x))
   (setq dimzin (getvar 'DIMZIN))
   (setvar 'DIMZIN 0)
   (setq x (rtos x 2 8))
   (setvar 'DIMZIN dimzin)
   x
    )
    ((vl-prin1-to-string x))
) ;_ 结束cond
) ;_ 结束defun

vormittag 发表于 2011-11-7 12:23:19

用这样一行代码可以得到所有多段线顶点坐标,尽管效率可能不高。(setq ptlist (apply 'append (mapcar '(lambda(x) (if (= 10 (car x)) (list (cdr x)))) endata)))用这样一行代码可以把ptlist转换成用制表符分隔开来的字符串,注意最前面的制表符没有去掉,可以根据程序需要进行处理。(setq strlist (apply 'strcat (mapcar '(lambda(y) (strcat "\t(" (substr (apply 'strcat (mapcar '(lambda(x) (strcat "," (rtos x 2 3))) y)) 2) ")")) ptlist)))

xbqbbl 发表于 2011-11-7 12:46:55

谢谢了,我基础太差了,vlax函数我还没用过,消化不了啊
页: [1] 2
查看完整版本: 求助,怎样把list生产的列表转换成字符串