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层!
有人建议吗? 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)
)
我希望这能把事情弄清楚,哪怕只是一点点。^。^ 哦,我还要指出,(ssget)并没有返回列表,而Foreach只处理列表。要将更改应用于选择集中的所有内容,有一些VLA函数可以完成这项工作,或者您必须使用以下函数:
(setq ss (ssget))
(setq count 0)
(repeat (sslength ss)
(setq ent (ssname ss count))
; Do stuff with ent
)
如果您的代码无法工作,请尝试使用(type var)函数测试您的变量,看看您使用的是哪种类型的变量。许多函数只接受某一类型。 很好的解释Freerefill
如果您想继续在选择集上使用“foreach”,而不使用“repeat”方法(在选择集超过32767个元素时可能会遇到问题)。。。
那么这种方法可能适用于您:
(foreach ent (mapcar 'cadr (ssnamex VPLIST))
... do something
) ; end foreach
如果你只是想打开/解冻所有视口中的所有图层,为什么不
(command "vplayer" "t" "**" "a" "") 谢谢大家的回复
我不知道foreach需要一个正确操作的列表,我会考虑一下你的建议
再次感谢
Commandobill,是的,这会做完全相同的事情,但我使用上面的一些简单的东西,所以我可以了解foreach。这是我的目标。
再次感谢
页:
[1]