drafter_joe 发表于 2022-7-5 16:46:26

将不同的变量分配给

大家好!
 
我已经搜索了一些关于这方面的信息,但没有什么非常接近我要找的。如果您有一个未知数量的元素列表,那么有人会如何为该列表中的每个元素分配不同的变量?比如说,你希望变量是p1,p2,p3。。。p(#列表的总元素)。有没有办法增加p并将其分配给列表中的下一个元素?
 
感谢您在advanced中的帮助!
 
起草人Joe

David Bethel 发表于 2022-7-5 16:51:42

这是可行的,但有很多缺点:
 
 

(setq i 0)
(setq lst '("a" "b" "d" "e"))
(foreach v lst
(set (read (strcat "P" (itoa i))) v)
(setq i (1+ i)))

 
 
[列表]
[*]几乎不可能本地化这些变量
[*]检索数据也很困难:(eval(读取(strcat“P”(itoa i)))
[*]列表中不同的数据类型可能会造成严重破坏
[/列表]
 
首先
 
HTH-David

drafter_joe 发表于 2022-7-5 16:55:22

谢谢大卫!
 
我会试试你的代码。使用的数据类型是带有倒角的矩形多段线的坐标。
 
我会把发生的事情报告给你。
 

drafter_joe 发表于 2022-7-5 16:56:21

我试过代码,只是有点不同,
(setq z 0)
   (foreach v coords
   (set (read (strcat "P" (itoa z)) v)
   (setq z (1+ z)))
   )
 
返回的内容如下:
; error: too many arguments
_$
 
我应该提到列表中的数据是第1个帖子中的点坐标。我猜想这一事实使这一点更加困难。
 
谢谢你的努力,大卫,我很感激!
 

Grrr 发表于 2022-7-5 17:00:14

基于afralisp教程中的这一部分:
 
您可以这样做:

(defun test ( / args n vals a b c d e f )
(setq args '(a b c d e f))
(setq n 0)
(repeat (length args)
   (setq vals (cons n vals))
   (setq n (1+ n))
)
(mapcar 'set args (reverse vals))
(list a b c d e f)
)

_$ (test)
(0 1 2 3 4 5)
_$
 
编辑:
顺便考虑一下:
 

(defun test ( / coords i p1 p2 p3 p4 p5 p6 p7 p8 p9)
(setq coords '("First" "Second" "Third" "Fourth" "Fifth" "Sixth" "Seventh" "Eighth?" "Ninth?"))
(repeat (setq i (length coords))
   (set (read (strcat "P" (itoa i))) (nth (setq i (1- i)) coords))
)
(foreach x (list p1 p2 p3 p4 p5 p6 p7 p8 p9)
   (print x)
)
(princ)
)

_$ (test)

"First"
"Second"
"Third"
"Fourth"
"Fifth"
"Sixth"
"Seventh"
"Eighth?"
"Ninth?"
_$
但我同意D.Bethel的观点,即几乎不可能定位这些变量。

Tharwat 发表于 2022-7-5 17:03:25

仔细查看以下内容:
 

(set (read (strcat "P" (itoa z))) v)

drafter_joe 发表于 2022-7-5 17:07:30

谢谢你看我的问题Grrr&Thwart!我感谢你的意见。
 
但是,由于我的列表由一个pline矩形的坐标组成,为了使用“read”函数,在我看来,我必须解构坐标列表,将每个元素的每个原子转化为字符串,然后用这些字符串重构元素,然后用新元素完成列表。从这里,我想另一个“foreach”函数将允许我处理坐标列表的解构和重建?我想我以前见过这么做。
 
或者,在构造原始列表之前,将每个元素转换为字符串?
 
我的想法正确吗?
 
再次感谢各位!

David Bethel 发表于 2022-7-5 17:09:16

 
 
现在试试修改后的代码。它缺少1个括号(我应该测试最后一个片段)

Tharwat 发表于 2022-7-5 17:13:04

试着这样做:
 

(defun SetvariableToEachCoordinate (s / e i l)
(if (and (eq (type s) 'ENAME)
          (= (cdr (assoc 0 (setq e (entget s)))) "LWPOLYLINE")
          (setq i 0)
          )
   (mapcar '(lambda (x) (set (read (strcat "P" (itoa (setq i (1+ i))))) x)
            (setq l (cons (read (strcat "P" (itoa i))) l))
            )
         (mapcar 'cdr (vl-remove-if-not '(lambda (q) (= (car q) 10)) e))
         )
   )
(reverse l)
)

 
(SetvariableToEachCoordinate(car (entsel "\nSelect polyline :")))

Lee Mac 发表于 2022-7-5 17:17:56

我强烈建议以列表格式保留和操作数据——毕竟,LISP是为列表处理而设计的。
 
正如David在上文中所概述的,为每个项目元素使用单独的变量可能会导致几个问题。
页: [1] 2
查看完整版本: 将不同的变量分配给