乐筑天下

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

[编程交流] While循环中的While循环

[复制链接]

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 17:35:07 | 显示全部楼层 |阅读模式
我有一个快速的问题,关于编写代码的最有效方式是什么,该代码将不断向用户询问源对象和目标对象。我知道如何为以下单个选择编写此代码:
我的问题是如何有效地为两个对象编写此代码(即,您将获得两个对象的错过提示或无效对象,然后在选择每个对象后,一个代码将运行,然后重复,直到用户点击escape或空格键。我已经编写了所有代码,只是这个while循环我无法正常工作。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:41:31 | 显示全部楼层
可能有2个defuns,但使用和来确认两者都符合标准。
回复

使用道具 举报

6

主题

25

帖子

19

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 17:49:41 | 显示全部楼层
请看一下李的代码,这可能会有所帮助。我经常用它
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:51:11 | 显示全部楼层
我通常这样做:
  1. [b][color=BLACK]([/color][/b]defun *error* [b][color=FUCHSIA]([/color][/b] msg [b][color=FUCHSIA])[/color][/b] [color=#8b4513]; sometimes we need an error handler, for example the osmode variable[/color]
  2. [b][color=FUCHSIA]([/color][/b]if osm [b][color=NAVY]([/color][/b]setvar 'osmode osm[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  3. [b][color=FUCHSIA]([/color][/b]if [b][color=NAVY]([/color][/b]not [b][color=MAROON]([/color][/b]member msg '[b][color=GREEN]([/color][/b][color=#2f4f4f]"Function cancelled"[/color] [color=#2f4f4f]"quit / exit abort"[/color][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  4.         [b][color=NAVY]([/color][/b]princ [b][color=MAROON]([/color][/b]strcat [color=#2f4f4f]"\nError: "[/color] msg[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  5. [b][color=FUCHSIA])[/color][/b]
  6. [b][color=FUCHSIA]([/color][/b]princ[b][color=FUCHSIA])[/color][/b]
  7. [b][color=BLACK])[/color][/b]
  8. [b][color=BLACK]([/color][/b]setq osm [b][color=FUCHSIA]([/color][/b]getvar 'osmode[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]
  9. [b][color=BLACK]([/color][/b]setvar 'osmode 0[b][color=BLACK])[/color][/b]
  10. [b][color=BLACK]([/color][/b]while T [color=#8b4513]; start the overall loop[/color]
  11. [b][color=FUCHSIA]([/color][/b]setvar 'errno 0[b][color=FUCHSIA])[/color][/b]
  12. [b][color=FUCHSIA]([/color][/b]while [color=#8b4513]; source object loop[/color]
  13.         [b][color=NAVY]([/color][/b]not
  14.                 [b][color=MAROON]([/color][/b]and
  15.                         [b][color=GREEN]([/color][/b]setq ent1 [b][color=BLUE]([/color][/b]car [b][color=RED]([/color][/b]entsel [color=#2f4f4f]"\nSelect source object: "[/color][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  16.                         [b][color=GREEN]([/color][/b]eq [b][color=BLUE]([/color][/b]cdr [b][color=RED]([/color][/b]assoc 0 [b][color=PURPLE]([/color][/b]setq elist1 [b][color=TEAL]([/color][/b]entget ent1[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b] [color=#2f4f4f]"INSERT"[/color][b][color=GREEN])[/color][/b] [color=#8b4513]; optional filter[/color]
  17.                 [b][color=MAROON])[/color][/b]
  18.         [b][color=NAVY])[/color][/b]
  19.         [b][color=NAVY]([/color][/b]if [b][color=MAROON]([/color][/b]or [b][color=GREEN]([/color][/b]= [b][color=BLUE]([/color][/b]getvar 'errno[b][color=BLUE])[/color][/b] 7[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]null ent1[b][color=GREEN])[/color][/b] [b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]princ [color=#2f4f4f]"\nYou missed try again!"[/color][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  20. [b][color=FUCHSIA])[/color][/b]
  21. [b][color=FUCHSIA]([/color][/b]while [color=#8b4513]; destination object loop[/color]
  22.         [b][color=NAVY]([/color][/b]not
  23.                 [b][color=MAROON]([/color][/b]and
  24.                         [b][color=GREEN]([/color][/b]setq ent2 [b][color=BLUE]([/color][/b]car [b][color=RED]([/color][/b]entsel [color=#2f4f4f]"\nSelect destination object: "[/color][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  25.                         [b][color=GREEN]([/color][/b]eq [b][color=BLUE]([/color][/b]cdr [b][color=RED]([/color][/b]assoc 0 [b][color=PURPLE]([/color][/b]setq elist2 [b][color=TEAL]([/color][/b]entget ent2[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b] [color=#2f4f4f]"INSERT"[/color][b][color=GREEN])[/color][/b] [color=#8b4513]; optional filter[/color]
  26.                 [b][color=MAROON])[/color][/b]
  27.         [b][color=NAVY])[/color][/b]
  28.         [b][color=NAVY]([/color][/b]if [b][color=MAROON]([/color][/b]or [b][color=GREEN]([/color][/b]= [b][color=BLUE]([/color][/b]getvar 'errno[b][color=BLUE])[/color][/b] 7[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]null ent2[b][color=GREEN])[/color][/b] [b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]princ [color=#2f4f4f]"\nYou missed try again!"[/color][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  29. [b][color=FUCHSIA])[/color][/b]
  30. [b][color=FUCHSIA]([/color][/b]progn
  31.         [color=#8b4513]; [b][color=NAVY]([/color][/b]we got the source and destination objects, do the rest of your stuff here[b][color=NAVY])[/color][/b][/color]
  32. [b][color=FUCHSIA])[/color][/b]
  33. [b][color=BLACK])[/color][/b] [color=#8b4513]; end the overall loop[/color]
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 17:56:00 | 显示全部楼层
如果我理解正确,有很多方法可以处理这些类型的选择:
 
  1. [b][color=BLACK]([/color][/b]defun c:pick2 [b][color=FUCHSIA]([/color][/b]/ s1 e1 s2 e2[b][color=FUCHSIA])[/color][/b]
  2. [b][color=FUCHSIA]([/color][/b]and
  3.     [b][color=NAVY]([/color][/b]princ [color=#2f4f4f]"\nSelect Source INSERT"[/color][b][color=NAVY])[/color][/b]
  4.     [b][color=NAVY]([/color][/b]setq s1 [b][color=MAROON]([/color][/b]ssget [b][color=GREEN]([/color][/b]list [b][color=BLUE]([/color][/b]cons 0 [color=#2f4f4f]"INSERT"[/color][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  5.     [b][color=NAVY]([/color][/b]= [b][color=MAROON]([/color][/b]sslength s1[b][color=MAROON])[/color][/b] 1[b][color=NAVY])[/color][/b]
  6.     [b][color=NAVY]([/color][/b]setq e1 [b][color=MAROON]([/color][/b]ssname s1 0[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  7. [b][color=FUCHSIA]([/color][/b]redraw e1 3[b][color=FUCHSIA])[/color][/b]
  8. [b][color=FUCHSIA]([/color][/b]while
  9.    [b][color=NAVY]([/color][/b]and
  10.      [b][color=MAROON]([/color][/b]princ [color=#2f4f4f]"\nSelect 1 Target INSERT"[/color][b][color=MAROON])[/color][/b]
  11.      [b][color=MAROON]([/color][/b]setq s2 [b][color=GREEN]([/color][/b]ssget [b][color=BLUE]([/color][/b]list [b][color=RED]([/color][/b]cons 0 [color=#2f4f4f]"INSERT"[/color][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  12.      [b][color=MAROON]([/color][/b]= [b][color=GREEN]([/color][/b]sslength s1[b][color=GREEN])[/color][/b] 1[b][color=MAROON])[/color][/b]
  13.      [b][color=MAROON]([/color][/b]setq e2 [b][color=GREEN]([/color][/b]ssname s2 0[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  14.      [b][color=MAROON]([/color][/b]not [b][color=GREEN]([/color][/b]eq e1 e2[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  15.    [b][color=NAVY]([/color][/b]prin1 e2[b][color=NAVY])[/color][/b]
  16. [b][color=FUCHSIA])[/color][/b]
  17.    [b][color=FUCHSIA]([/color][/b]redraw[b][color=FUCHSIA])[/color][/b]
  18.    [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 
将(prin1 e2)调用替换为您想要完成的操作。
 
-大卫
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 18:00:51 | 显示全部楼层
Grr,这是另一个while循环的酷用法!我也在想如何通过按空格键退出,但我想不出来。我试着做一个条件,如果实体为null,那么我把它设为nil,但这不起作用。你能想到怎么做吗?David,我以前没有见过使用while循环的ssget,这非常灵活(不幸的是,我必须使用nentsel,因为我从外部参照中的对象获取信息)。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:09:30 | 显示全部楼层
我建议将选择操作划分为一个单独的功能,例如:
  1. (defun c:test ( / des prd src )
  2.    (setq prd
  3.       '(lambda ( x )
  4.            (wcmatch
  5.                (cdr (assoc 0 (entget x)))
  6.                "LINE,ARC,CIRCLE,LWPOLYLINE,POLYLINE,RAY,XLINE,AECC_FEATURE_LINE"
  7.            )
  8.        )
  9.    )
  10.    (if
  11.        (and
  12.            (setq src (selectif "\nSelect source object: "      prd))
  13.            (setq des (selectif "\nSelect destination object: " prd))
  14.        )
  15.        (princ "\nDo stuff.")
  16.    )
  17.    (princ)
  18. )
  19. (defun selectif ( msg prd / ent )
  20.    (while
  21.        (progn (setq ent (car (entsel msg)))
  22.            (cond
  23.                (   (= 7 (getvar 'errno))
  24.                    (princ "\nMissed, try again.")
  25.                )
  26.                (   (not ent) nil)
  27.                (   (not (apply prd (list ent)))
  28.                    (princ "\nInvalid object selected.")
  29.                )
  30.            )
  31.        )
  32.    )
  33.    ent
  34. )
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 18:15:06 | 显示全部楼层
李,非常感谢你的帮助!我现在遇到的问题是添加了另一个while循环,该循环将一直运行,直到空格键被击中或逃脱。例如,用户将选择源对象,然后选择目标对象,然后选择源对象,然后选择目标。。。直到他们做了他们想做的一切,然后他们就会击中空间或逃跑。
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 18:17:22 | 显示全部楼层
因此,我最终通过以下方式实现了这一点:
  1. (while
  2.      (and
  3. (setq sent (selectif "\nSelect source object: "))
  4. (setq dent (selectif "\nSelect destination object: "))
  5.      )
  6. ;...Rest of code
像这样使用and函数有什么问题吗?
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:22:46 | 显示全部楼层
通过阅读本文,我认为您必须使用其他方法-提示用户在循环中不断选择源和目标对象,并在这样做的同时构建一个assoc列表,如下所示:
  1. (<source ent1> . <destination ent1>) (<source ent2> . <destination ent2>) ... (<source entN> . <destination entN>)

然后为列表中的每一对做你的秘密工作。
不幸的是,我不知道如何编写这个代码(但我对此很感兴趣,因为我脑海中也有类似的想法)。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:18 , Processed in 0.475968 second(s), 72 queries .

© 2020-2025 乐筑天下

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