乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 70|回复: 5

[编程交流] foreach基础

[复制链接]

17

主题

34

帖子

17

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
90
发表于 2022-7-6 14:34:18 | 显示全部楼层 |阅读模式
大家好
 
谁能告诉我一些关于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层!
 
有人建议吗?
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 14:52:25 | 显示全部楼层
Foreach很有趣。我可以马上看出你的问题,这是一个语法错误。不过,你的想法是对的。
 
我要告诉您的第一件事是,查看AutoCAD中的虚拟LISP帮助文件。知道他们在那里,我就省去了一个又一个小时在谷歌上无休止的搜索,也省去了我的脑袋撞在墙上的时间。
 
但是,既然我已经在做了,下面是Foreach的工作原理:
 
(foreach var list命令)
 
这意味着,对于列表中的每个项目,将其设置为var,然后发出一组命令。
 
让我试着把一个类比放在一起,同时向你们展示你们的问题。
 
  1. (setq num 1)
  2. (foreach var (list 1 1 1 1 1)
  3. (setq num (+ 1 num))
  4. )

 
本例中的“var”只是“var”,本例中的列表是(1)。你可以看到我在为一个命令做什么,我在增加“num”。所以你可能会问,如果我什么都不做,为什么我有“var”?嗯,那是因为我不必这样做。然而,如果我不打算用它做任何事情,我难道不能:
 
  1. (setq num 1)
  2. (repeat 5
  3. (setq num (+ 1 num)
  4. )

 
这就是Foreach的强大之处:Foreach将您选择的任何变量设置为等于列表中的每个项目,然后您可以将该变量传递给命令,如下所示:
 
  1. (setq num 1)
  2. (foreach var (list 1 1 1 1 1)
  3. (setq num (+ var num)
  4. )

 
我希望这能把事情弄清楚,哪怕只是一点点。^。^
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 15:00:14 | 显示全部楼层
哦,我还要指出,(ssget)并没有返回列表,而Foreach只处理列表。要将更改应用于选择集中的所有内容,有一些VLA函数可以完成这项工作,或者您必须使用以下函数:
 
  1. (setq ss (ssget))
  2. (setq count 0)
  3. (repeat (sslength ss)
  4. (setq ent (ssname ss count))
  5. ; Do stuff with ent
  6. )

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

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:19:57 | 显示全部楼层
很好的解释Freerefill
 
如果您想继续在选择集上使用“foreach”,而不使用“repeat”方法(在选择集超过32767个元素时可能会遇到问题)。。。
 
那么这种方法可能适用于您:
 
  1. (foreach ent (mapcar 'cadr (ssnamex VPLIST))
  2.   ... do something
  3. ) ; end foreach
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 15:31:21 | 显示全部楼层
如果你只是想打开/解冻所有视口中的所有图层,为什么不
 
  1. (command "vplayer" "t" "**" "a" "")
回复

使用道具 举报

17

主题

34

帖子

17

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
90
发表于 2022-7-6 15:36:42 | 显示全部楼层
谢谢大家的回复
 
我不知道foreach需要一个正确操作的列表,我会考虑一下你的建议
 
再次感谢
 
Commandobill,是的,这会做完全相同的事情,但我使用上面的一些简单的东西,所以我可以了解foreach。这是我的目标。
 
再次感谢
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 00:19 , Processed in 0.876365 second(s), 64 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表