mit 发表于 2022-7-5 18:28:22

转换列表

大家好
云你能帮帮我吗?
我在转换以下列表坐标时遇到一些问题:
 
("102.614364152051,17.95733901085014,0" "102.6148784682264,17.95771822280192,0" "102.6142663942859,17.95835128371222,0" "102.6141224420007,17.95824935570436,0" "102.6137704879814,17.95798561968717,0" "102.614364152051,17.95733901085014,0")
 
我想转换为
 
((102.614364152051,17.95733901085014,0) (102.6148784682264,17.95771822280192,0) (102.6142663942859,17.95835128371222,0) (102.6141224420007,17.95824935570436,0) (102.6137704879814,17.95798561968717,0) (102.614364152051,17.95733901085014,0))
 

麻省理工学院

Hippe013 发表于 2022-7-5 18:38:58

您可能需要考虑下载Dos_Lib。
 
http://wiki.mcneel.com/developer/doslib
 
免费下载。它包含一个名为“Dos\u strokens”的lisp函数
 
dos\u Strokens公司
将令牌字符串转换为列表。
 
 
--------------------------------------------------------------------------------
 
语法
(dos\u strokens字符串令牌)
 
参数
一串
 
一根绳子。
 
代币
 
解释为一组分隔符的字符串。
 
T
 
如果指定,结果与strtok C/C++运行时库函数兼容。
 
退换商品
字符串列表(如果成功)。
 
无错误。
 
实例
指挥:(dos_strtokens)“曲棍球是最好的。”" ")
 
(“曲棍球”是“最好的”)
 
 
命令:(dos\u strokens“一个字符串\tof,,令牌\n和一些其他令牌”“,\t\n”t)
 
(“token”和“some”“more”“token”的“string”)
 
 
命令:(dos\u strokens“0,0,,0,0”“))
 
("0" "0" "" "0" "0")
 
 
命令:(dos\u strokens“0,0,0”,“0,0”,“t)
 
("0" "0" "0" "0")

satishrajdev 发表于 2022-7-5 18:44:44

这是我的做法。。。
 
对于
((102.614 17.9573 0)
(102.615 17.9577 0)
(102.614 17.9584 0)
(102.614 17.9582 0)
(102.614 17.958 0)
(102.614 17.9573 0)
)

(mapcar        '(lambda (x)
   (read (strcat "("
               (vl-string-translate "," " " x)
               ")"
       )
   )
)
list
)

BIGAL 发表于 2022-7-5 18:50:13

另一个

(setq lst (list "102.614364152051,17.95733901085014,0" "102.6148784682264,17.95771822280192,0" "102.6142663942859,17.95835128371222,0" "102.6141224420007,17.95824935570436,0" ))
(setq num (length lst))
(setq y num)
(repeat num (setq newlst (cons (list (nth (setq y (- y 1)) lst )) newlst)))

mit 发表于 2022-7-5 18:57:43

首先
谢谢Hippe013、satishrajdev和BIGAL
我对我的问题感到抱歉,它不清楚,而且它出了问题
 
我使用了Lee Mac的转换代码http://www.lee-mac.com/stringtolist.html
我的第一个清单是:
 
(defun c:coordformat ()
(setq coords   '("102.614364152051,17.95733901085014,0 102.6148784682264,17.95771822280192,0 102.6142663942859,17.95835128371222,0 102.6141224420007,17.95824935570436,0 102.6137704879814,17.95798561968717,0 102.614364152051,17.95733901085014,0"))

;and when I used this function

(setq coords (LM:str->lst coords " "))   ;It was not convert to list coordinate format

)
(defun LM:str->lst ( str del / len lst pos )
   (setq len (1+ (strlen del)))
   (while (setq pos (vl-string-search del str))
       (setq lst (cons (substr str 1 pos) lst)
             str (substr str (+ pos len))
       )
   )
   (reverse (cons str lst))
)。
 
当我使用这段代码时,它并没有将列表转换为坐标格式。它是:
 
("102.614364152051,17.95733901085014,0" "102.6148784682264,17.95771822280192,0" "102.6142663942859,17.95835128371222,0" "102.6141224420007,17.95824935570436,0" "102.6137704879814,17.95798561968717,0" "102.614364152051,17.95733901085014,0")
 
坐标列表格式应为:
 
((102.614364152051 17.95733901085014 0) (102.6148784682264 17.95771822280192 0) (102.6142663942859 17.95835128371222 0) (102.6141224420007 17.95824935570436 0) (102.6137704879814 17.95798561968717 0) (102.614364152051 17.95733901085014 0))
 
或者应该是:
 
((102.614364152051 17.95733901085014) (102.6148784682264 17.95771822280192) (102.6142663942859 17.95835128371222) (102.6141224420007 17.95824935570436) (102.6137704879814 17.95798561968717) (102.614364152051 17.95733901085014))
 
如果你还有别的事
请帮帮我
 
麻省理工学院

satishrajdev 发表于 2022-7-5 19:07:15

 
为此,请阅读我的帖子。。。但小数有变化。我不知道原因。明天会设法解决的

Lee Mac 发表于 2022-7-5 19:12:55

由于您的数据已经是文字字符串格式,我将遵循与上面文章中Satish相同的方法,使用读取表达式将值转换为AutoLISP数据类型,例如:

_$ (setq coords "102.614364152051,17.95733901085014,0 102.6148784682264,17.95771822280192,0 102.6142663942859,17.95835128371222,0 102.6141224420007,17.95824935570436,0 102.6137704879814,17.95798561968717,0 102.614364152051,17.95733901085014,0")
"102.614364152051,17.95733901085014,0 102.6148784682264,17.95771822280192,0 102.6142663942859,17.95835128371222,0 102.6141224420007,17.95824935570436,0 102.6137704879814,17.95798561968717,0 102.614364152051,17.95733901085014,0"

_$ (while (/= coords (setq coords (vl-string-subst ")(" " " coords))))
nil

_$ (read (strcat "((" (vl-string-translate "," " " coords) "))"))
((102.614 17.9573 0) (102.615 17.9577 0) (102.614 17.9584 0) (102.614 17.9582 0) (102.614 17.958 0) (102.614 17.9573 0))

请注意,控制台的输出不会丢失精度-坐标值仍以最高可用精度存储在内存中,但是,为了可读性,打印的值会被截断。

mit 发表于 2022-7-5 19:18:20

呼!很抱歉误码了
代码应与Lee Mac相同:
 
(defun c:coordformat ()
(setq coords "102.614364152051,17.95733901085014,0 102.6148784682264,17.95771822280192,0 102.6142663942859,17.95835128371222,0 102.6141224420007,17.95824935570436,0 102.6137704879814,17.95798561968717,0 102.614364152051,17.95733901085014,0)

;and when I used this function

(setq coords (LM:str->lst coords " "))   ;It was not convert to list coordinate format

)
(defun LM:str->lst ( str del / len lst pos )
   (setq len (1+ (strlen del)))
   (while (setq pos (vl-string-search del str))
       (setq lst (cons (substr str 1 pos) lst)
             str (substr str (+ pos len))
       )
   )
   (reverse (cons str lst))
)
 
 
非常感谢satishrajdev
 
谢谢你两次给李·麦克

satishrajdev 发表于 2022-7-5 19:26:13

 
著名的
 
欢迎:)

Lee Mac 发表于 2022-7-5 19:31:10

 
请注意,我的LM:str->lst函数的执行完全如所述:使用给定的分隔符将字符串分隔为项目列表,例如:
_$ (LM:str->lst "1,2,3 4,5,6 7,8,9" " ")
("1,2,3" "4,5,6" "7,8,9")
然而,上述格式不是AutoLISP解释器识别为三维点列表的格式-点列表必须是2或3个数值的列表,而上述只是字符串列表。
 
为了将来的参考,如果您能保留我网站上发布的函数附带的代码头,我将不胜感激。
 
 
不客气
页: [1]
查看完整版本: 转换列表