FazBear 发表于 2022-7-6 14:34:18

foreach基础

大家好
 
谁能告诉我一些关于foreach函数的基础知识吗。
 
我只是想看看能不能让它发挥作用,但它没有达到我的预期。
 
我在模型空间中绘制了一个新的图形并绘制了一个圆,我切换到图纸空间并创建了一个vp和缩放的扩展项,然后复制了vp 5或6次。
 
我将圆放置在所有视口中冻结的新层上,然后尝试以下操作:
 
(定义C:VPT()
 
(setq VPLIST(ssget“x”((0。“viewport”)(8。“0”)))
 
(每个VPLIST
(命令“mspace”)
(命令“vplayer”“t”“**”“c”“))
(命令“pspace”“zoom”“e”)
);    结束foreach
);    结束defun
 
但它只解冻了我进入的最后一个vp层!
 
有人建议吗?

Freerefill 发表于 2022-7-6 14:52:25

Foreach很有趣。我可以马上看出你的问题,这是一个语法错误。不过,你的想法是对的。
 
我要告诉您的第一件事是,查看AutoCAD中的虚拟LISP帮助文件。知道他们在那里,我就省去了一个又一个小时在谷歌上无休止的搜索,也省去了我的脑袋撞在墙上的时间。
 
但是,既然我已经在做了,下面是Foreach的工作原理:
 
(foreach var list命令)
 
这意味着,对于列表中的每个项目,将其设置为var,然后发出一组命令。
 
让我试着把一个类比放在一起,同时向你们展示你们的问题。
 
(setq num 1)
(foreach var (list 1 1 1 1 1)
(setq num (+ 1 num))
)
 
本例中的“var”只是“var”,本例中的列表是(1)。你可以看到我在为一个命令做什么,我在增加“num”。所以你可能会问,如果我什么都不做,为什么我有“var”?嗯,那是因为我不必这样做。然而,如果我不打算用它做任何事情,我难道不能:
 
(setq num 1)
(repeat 5
(setq num (+ 1 num)
)
 
这就是Foreach的强大之处:Foreach将您选择的任何变量设置为等于列表中的每个项目,然后您可以将该变量传递给命令,如下所示:
 
(setq num 1)
(foreach var (list 1 1 1 1 1)
(setq num (+ var num)
)
 
我希望这能把事情弄清楚,哪怕只是一点点。^。^

Freerefill 发表于 2022-7-6 15:00:14

哦,我还要指出,(ssget)并没有返回列表,而Foreach只处理列表。要将更改应用于选择集中的所有内容,有一些VLA函数可以完成这项工作,或者您必须使用以下函数:
 

(setq ss (ssget))
(setq count 0)
(repeat (sslength ss)
(setq ent (ssname ss count))
; Do stuff with ent
)

 
如果您的代码无法工作,请尝试使用(type var)函数测试您的变量,看看您使用的是哪种类型的变量。许多函数只接受某一类型。

Lee Mac 发表于 2022-7-6 15:19:57

很好的解释Freerefill
 
如果您想继续在选择集上使用“foreach”,而不使用“repeat”方法(在选择集超过32767个元素时可能会遇到问题)。。。
 
那么这种方法可能适用于您:
 

(foreach ent (mapcar 'cadr (ssnamex VPLIST))
... do something

) ; end foreach

Commandobill 发表于 2022-7-6 15:31:21

如果你只是想打开/解冻所有视口中的所有图层,为什么不
 
(command "vplayer" "t" "**" "a" "")

FazBear 发表于 2022-7-6 15:36:42

谢谢大家的回复
 
我不知道foreach需要一个正确操作的列表,我会考虑一下你的建议
 
再次感谢
 
Commandobill,是的,这会做完全相同的事情,但我使用上面的一些简单的东西,所以我可以了解foreach。这是我的目标。
 
再次感谢
页: [1]
查看完整版本: foreach基础