乐筑天下

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

[编程交流] 在Lisp中循环。。。

[复制链接]

14

主题

59

帖子

45

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 17:04:43 | 显示全部楼层 |阅读模式
我有一个例程,它允许我在X和Y坐标系中测量设备之间的距离,并在总坐标系中增加下降和上升。它还可以在例程中跟踪我选择的设备数量。我的问题是,当我按enter键获取距离时,它会结束命令。我希望能够按enter键或右键单击,它会给我到第一个对象的距离,但然后我可以开始拾取到下一个设备的点,然后右键单击,获得到该设备的距离,从上一个设备开始,依此类推。在一个电路上的最后一个设备之后,我希望能够右键单击两次,一次获取到该设备与前一个设备的距离,然后再次获取整个电路的总距离。我需要包括什么才能做到这一点?谢谢
 
  1. (defun c:dis ()
  2.    (setvar "CMDECHO" 0)
  3.    (setq num 1) ;set starting segment value
  4.    (setq drop (getint "\nEnter drop distance to add to total length: ")) ;get drop distance
  5.    (setq drop (* 12 drop)) ;convert drop to feet
  6.    (setq pt (getpoint "\nSelect path to next device:")) ;get starting point
  7.    (setq x1 (car pt)) ;extract X value
  8.    (setq y1 (cadr pt)) ;extract Y value
  9.    (setq lensum 0)
  10.    (while
  11.      (setq pt (getpoint pt)) ;get next point
  12.      (setq x2 (car pt)) ;extract 2nd point X value
  13.      (setq y2 (cadr pt)) ;extract 2nd point Y value
  14.      (setq xdiff (abs (- x1 x2)))          ;calculate X plane distance
  15.      (setq ydiff (abs (- y1 y2)))          ;calculate Y plane distance
  16.      (setq len (+ xdiff ydiff))                 ;add X and Y to get total segment length
  17.      (setq lensum (+ len lensum drop))               ;add drop distance and variable to display running sum of segment lengths
  18.    )
  19.      (setq dist (strcat "------------------------: DEVICE " (itoa num) " DISTANCE: " (rtos (/ lensum 12) 2 0)))  ;create output text string
  20.      (princ "\n")(princ dist)                            ;print the output string
  21.      (setq x1 x2)(setq y1 y2) ;set next segment X,Y starting point to end of last segment
  22.      (setq num (1+ num)) ;incriment segment number value
  23. (princ)
  24. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 17:18:32 | 显示全部楼层
真的没有多少时间,但这可能会帮助你;
 
  1. (defun c:dis (/ drop pt1 lensum num pt2 len)
  2.    (setq drop (getreal "\nEnter drop distance to add to total length: "))
  3.    (setq drop (* 12 drop))
  4.    (setq pt1 (getpoint "\nSelect First Point: "))
  5.    (setq num 0)
  6.    (while
  7.    (setq pt2 (getpoint "\nSelect Second Point: "))
  8.       (setq len (distance pt1 pt2))
  9.       (setq lensum (+ len drop))
  10.       (princ (strcat "\nDevice " (itoa num) " Distance: " (rtos (/ lensum 12) 2 0)))
  11.       (setq num (1+ num))
  12.    ) ;_  end while
  13.    (princ)
  14. ) ;_  end defun

 
只是对你的原始帖子进行编辑
回复

使用道具 举报

14

主题

59

帖子

45

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 17:35:14 | 显示全部楼层
谢谢李,但这并没有完全实现我想要实现的目标。有时,当我测量从一个设备到下一个设备的路径时,导管中有几个弯曲,因此我不能直接从一个设备到下一个设备。我必须沿着路径选择几个点,然后才能获得到一个设备的总距离。
 
基本上,我希望例程收集信息,但只在按enter键或右键单击时显示,然后继续选择指向下一个设备的点,然后再次右键单击以获取到该设备的距离,等等。我知道一定有办法做到这一点,但我还没有找到一个直接的答案,它巡航在网上。我希望右键单击以显示结果,而不结束例程。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 17:42:43 | 显示全部楼层
我删除了“drop”,因为我不完全理解它,但它可以很容易地修改。
 
但是这个概念:
 
  1. (defun c:dis (/ pt1 num pt2 len)
  2.    (while
  3.    (setq pt1 (getpoint "\nSelect First Point: "))
  4.       (setq num 0)
  5.       (setq len 0)
  6.       (while
  7.           (setq pt2 (getpoint "\nSelect Second Point: "))
  8.          (setq len (+ (distance pt1 pt2) len))
  9.          (setq pt1 pt2)
  10.       ) ;_  end while
  11.       (princ (strcat "\nDevice " (itoa num) " Distance: " (rtos len)))
  12.       (setq num (1+ num))
  13.       (princ)
  14.    ) ;_  end while
  15. ) ;_  end defun
回复

使用道具 举报

14

主题

59

帖子

45

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 18:04:03 | 显示全部楼层
这更接近我所需要的。我包含的“下降”是下降和上升的距离,因为导管在天花板中运行,但随后必须下降到整个建筑的设备,所以我通常每个设备增加10英尺,5英尺。向下5英尺。回到导管。此外,我正在提取X和Y坐标,因为导管只在这些方向上运行,所以这就是为什么它在那里。
 
好的,在玩了一点代码之后,我几乎完全按照我想要的方式得到了它。现在,我需要它做的就是在我右键单击以获取最后一个设备的距离后,我希望它自动从我选择的最后一个点开始拾取,而无需再次单击最后一个点。
 
  1. (defun c:dis ()
  2. (setvar "CMDECHO" 0)
  3. (setq num 1) ;set starting segment value
  4. (setq drop (getint "\nEnter drop distance to add to total length:"))
  5. (setq drop (* 12 drop))
  6. (setq lensum 0)
  7. (princ "\nSelect path to next device:")
  8. (while
  9.    (setq pt (getpoint))
  10.    (setq x1 (car pt)) ;extract X value
  11.    (setq y1 (cadr pt)) ;extract Y value
  12.      (while
  13.        (setq pt (getpoint pt))
  14.        (setq x2 (car pt))
  15.        (setq y2 (cadr pt))
  16.        (setq xdiff (abs (- x1 x2)))
  17.        (setq ydiff (abs (- y1 y2)))
  18.        (setq len (+ xdiff ydiff))
  19.        (setq lensum (+ len drop))
  20.      )
  21.    (setq dist (strcat "---> DEVICE " (itoa num) " DISTANCE: " (rtos (/ lensum 12) 2 0)))
  22.    (princ "\n")(princ dist)
  23.    (setq num (1+ num))
  24.    (setq x1 x2)(setq y1 y2)
  25. )
  26. (princ setq total (strcat "---> TOTAL LENGTH: " (rtos dist 4 0)))
  27. (setq x1 x2)(setq y1 y2)
  28. (princ)
  29. )

 
我就快到了,只要最后一点,一切都会很完美。我把它设置好了,这样在最后,它应该显示之前setq“dist”值的总和,但我就是不能让它正常工作。我得到。。。
 
“错误:错误的参数类型:numberp:”-->设备2距离:21”
 
我错过了什么?
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 18:10:08 | 显示全部楼层
一种循环方式
 
(setq x 1)
(同时(=x 1)
 
(如果(=x1 x2)(退出))
选取同一点两次,然后测试是否为yes,然后退出,yes exit正好如此,否则x=2也将停止。
此处编码
)结束时
 
 
我使用的另一个方法是拾取对象,但要退出pick nothing并测试object=nil
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 19:38 , Processed in 0.445218 second(s), 64 queries .

© 2020-2025 乐筑天下

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