乐筑天下

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

[编程交流] 程序循环

[复制链接]

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-5 16:18:31 | 显示全部楼层 |阅读模式
我正在使用一个小的LISP程序来获取两个输入点并处理它们。
 
我希望代码一直重复,直到用户完成。我认为while循环是有序的,但当我将while放置在第一个输入点的上方或下方时,我没有得到预期的结果。我需要代码来重置OSMODE和PICKBOX变量,当它完成时,但按下escape不允许这样做,除非我做一些更多的错误捕捉。如果我将while放在第一个输入之后,代码会一直尝试获取第二个点。如果用户在第一次输入时按enter键,我希望代码能够干净地退出。
回复

使用道具 举报

17

主题

1274

帖子

25

银币

后起之秀

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

铜币
260
发表于 2022-7-5 16:37:56 | 显示全部楼层
错误捕捉对于任何需要用户输入的lisp都很有用。
 
我们需要看看其余的代码,看看如何最好地循环它,以及在一个*错误*局部函数中放入什么。
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-5 16:49:41 | 显示全部楼层
这是完整的代码。这是一个快速的工具,可以绘制围栏纠察桩,并沿给定长度的围栏等距分布。该代码工作正常,但现在它只工作一次,用户必须再次启动它才能执行另一段围栏。我想让它工作,让它运行,然后继续运行,只要用户选择一个新的第一点。如果他们按回车键,我希望它能干净地退出。我有一个*错误*捕获例程,它将处理用户按escape键。运行时很容易加载。我正在寻找的技巧是,当被要求输入点时,如何通过按Enter键完全退出。
 
  1. (vl-load-com)
  2. (defun C:pickets (/ picketthk picketoc)
  3. (setq *current_osmode (getvar 'OSMODE)
  4.    *current_pickbox (getvar 'PICKBOX)
  5.    )  
  6. ;;; Set up common variables
  7. (setq picketthk 0.75
  8.    picketoc 4.
  9.    )
  10. (prompt "\nSelect First Point\n")
  11. (setq p1 (getpoint))
  12. (prompt "\nSelect Second Point\n")
  13. (setq p2 (getpoint))
  14. (setvar 'OSMODE 0)
  15. (setvar 'PICKBOX 0)
  16. (setq    d (distance p1 p2)
  17.    numpickets (/  d picketoc)   
  18.    firstbay (+ (/ (- d (* (fix numpickets) picketoc)) 2.) (/ picketthk 2.))
  19.    )
  20. (if (< firstbay (+ (/ picketoc 2.) (/ picketthk 2.)))
  21.    (setq firstbay (+ firstbay (- (/ picketoc 2.) (/ picketthk 2.))))
  22.    )
  23. ;;; if the number pf pickets divided by picketoc is has no remainder subtract 1 picket and increase firstbay dimension
  24. (if (= (/ d (fix numpickets)) (fix (/ d (fix numpickets))))
  25.    (setq numpickets (1- numpickets)
  26.      firstbay (+ firstbay (- picketoc (/ picketthk 2.)))
  27.      )
  28.    )  
  29. (setq count 0)
  30. (repeat (fix numpickets)
  31.    (DrawPicket "picket" (polar p1 0 (+  firstbay (* picketoc count))))
  32.    (setq count (1+ count))
  33.    )  
  34. (setvar 'OSMODE *current_osmode)
  35. (setvar 'PICKBOX *current_pickbox)
  36. (princ)
  37. ); end pickets
  38. (defun DrawPicket (PicketBlk pt)
  39. (entmakex (list
  40.          (cons 0 "INSERT")
  41.          (cons 2 PicketBlk)
  42.          (cons 8 "Pickets")
  43.          (cons 10 pt)
  44.          (cons 41 1.0) ; Scale Factor
  45.          (cons 42 1.0) ; Scale Factor
  46.          (cons 43 1.0) ; Scale Factor
  47.          )
  48.        )
  49. (princ)
  50. ); end DrawPicket
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:16:35 | 显示全部楼层
我猜是这样的(很快修改):
 
  1. (vl-load-com)
  2. (defun C:pickets (/ *error* picketthk picketoc p1 p2 d numpickets firstbay count )
  3. (defun *error* ( m )
  4.    (and vars (mapcar 'setvar '(osmode pickbox) vars))
  5.    (princ m) (princ)
  6. )
  7. (setq vars (mapcar 'getvar '(osmode pickbox)))
  8. ;;; Set up common variables
  9. (setq
  10.    picketthk 0.75
  11.    picketoc 4.
  12. )
  13. (while
  14.    (and
  15.      (setq p1 (getpoint "\nSelect First Point: "))
  16.      (setq p2 (getpoint p1 "\nSelect Second Point: "))
  17.    )
  18.    (mapcar 'setvar '(osmode pickbox) '(0 0))
  19.    (setq
  20.      d (distance p1 p2)
  21.      numpickets (fix (/ d picketoc))
  22.      firstbay (+ (/ (- d (*  numpickets picketoc)) 2.) (/ picketthk 2.))
  23.    )
  24.    
  25.    (if (< firstbay (+ (/ picketoc 2.) (/ picketthk 2.)))
  26.      (setq firstbay (+ firstbay (- (/ picketoc 2.) (/ picketthk 2.))))
  27.    )
  28.    
  29.    ;;; if the number pf pickets divided by picketoc is has no remainder subtract 1 picket and increase firstbay dimension
  30.    (if (= (/ d (fix numpickets)) (fix (/ d numpickets)))
  31.      (setq numpickets (1- numpickets)
  32.        firstbay (+ firstbay (- picketoc (/ picketthk 2.)))
  33.      )
  34.    )  
  35.    
  36.    (repeat numpickets
  37.      (DrawPicket "picket" (polar p1 0 (+  firstbay (* picketoc numpickets))))
  38.      (setq numpickets (1- numpickets))
  39.    )  
  40.    
  41.    (mapcar 'setvar '(osmode pickbox) vars)
  42.    
  43. ); while
  44. (princ)
  45. ); end pickets
  46. (defun DrawPicket (PicketBlk pt)
  47. (entmakex
  48.    (list
  49.      (cons 0 "INSERT")
  50.      (cons 2 PicketBlk)
  51.      (cons 8 "Pickets")
  52.      (cons 10 pt)
  53.      (cons 41 1.0) ; Scale Factor
  54.      (cons 42 1.0) ; Scale Factor
  55.      (cons 43 1.0) ; Scale Factor
  56.    )
  57. )
  58. ); end DrawPicket
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:26:20 | 显示全部楼层
Grr打败了我我经常用这个
  1. 3
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 21:09 , Processed in 0.528114 second(s), 62 queries .

© 2020-2025 乐筑天下

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