求助,怎样把list生产的列表转换成字符串
用list生成的列表包含多个坐标值,并想用strcat在前面加上注记,但老是提示参数缺陷,请高手解答一下 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 后面的第一个参数需要是一个浮点数,而不是表。这是你这个程序最大的问题。 用这样一行代码可以得到所有多段线顶点坐标,尽管效率可能不高。 (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"))转换成字符串保存到文件? jack093 发表于 2020-9-30 18:57
请教vormittag版主如何将变量
(setq lst '("块名1" p1 p2 ang sc (list p3 p4) "string1"))转换成字符串 ...
(vl-princ-to-string lst) 问题没问清楚,举个例子说明下 本帖最后由 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, 已修正
要提高提问技巧,这样的提问一般是得不到你要的答案的! 谢谢,我是想实现选取一个封闭的区域,在文件里面写入封闭区域的面积及面积编号,后面为多段线各点坐标值,程序如下
(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)
)
)
运行中出现参数缺陷,请高手指正 你的源程序问题较多,以下是我给你改的:(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
用这样一行代码可以得到所有多段线顶点坐标,尽管效率可能不高。(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))) 谢谢了,我基础太差了,vlax函数我还没用过,消化不了啊
页:
[1]
2