brawleyman 发表于 2022-7-6 17:04:43

在Lisp中循环。。。

我有一个例程,它允许我在X和Y坐标系中测量设备之间的距离,并在总坐标系中增加下降和上升。它还可以在例程中跟踪我选择的设备数量。我的问题是,当我按enter键获取距离时,它会结束命令。我希望能够按enter键或右键单击,它会给我到第一个对象的距离,但然后我可以开始拾取到下一个设备的点,然后右键单击,获得到该设备的距离,从上一个设备开始,依此类推。在一个电路上的最后一个设备之后,我希望能够右键单击两次,一次获取到该设备与前一个设备的距离,然后再次获取整个电路的总距离。我需要包括什么才能做到这一点?谢谢
 

(defun c:dis ()
   (setvar "CMDECHO" 0)
   (setq num 1) ;set starting segment value
   (setq drop (getint "\nEnter drop distance to add to total length: ")) ;get drop distance
   (setq drop (* 12 drop)) ;convert drop to feet
   (setq pt (getpoint "\nSelect path to next device:")) ;get starting point
   (setq x1 (car pt)) ;extract X value
   (setq y1 (cadr pt)) ;extract Y value
   (setq lensum 0)
   (while
   (setq pt (getpoint pt)) ;get next point
   (setq x2 (car pt)) ;extract 2nd point X value
   (setq y2 (cadr pt)) ;extract 2nd point Y value
   (setq xdiff (abs (- x1 x2)))          ;calculate X plane distance
   (setq ydiff (abs (- y1 y2)))          ;calculate Y plane distance
   (setq len (+ xdiff ydiff))               ;add X and Y to get total segment length
   (setq lensum (+ len lensum drop))               ;add drop distance and variable to display running sum of segment lengths
   )
   (setq dist (strcat "------------------------: DEVICE " (itoa num) " DISTANCE: " (rtos (/ lensum 12) 2 0)));create output text string
   (princ "\n")(princ dist)                            ;print the output string
   (setq x1 x2)(setq y1 y2) ;set next segment X,Y starting point to end of last segment
   (setq num (1+ num)) ;incriment segment number value
(princ)
)

Lee Mac 发表于 2022-7-6 17:18:32

真的没有多少时间,但这可能会帮助你;
 


(defun c:dis (/ drop pt1 lensum num pt2 len)
   (setq drop (getreal "\nEnter drop distance to add to total length: "))
   (setq drop (* 12 drop))
   (setq pt1 (getpoint "\nSelect First Point: "))
   (setq num 0)
   (while
   (setq pt2 (getpoint "\nSelect Second Point: "))
      (setq len (distance pt1 pt2))
      (setq lensum (+ len drop))
      (princ (strcat "\nDevice " (itoa num) " Distance: " (rtos (/ lensum 12) 2 0)))
      (setq num (1+ num))
   ) ;_end while
   (princ)
) ;_end defun

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

brawleyman 发表于 2022-7-6 17:35:14

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

Lee Mac 发表于 2022-7-6 17:42:43

我删除了“drop”,因为我不完全理解它,但它可以很容易地修改。
 
但是这个概念:
 

(defun c:dis (/ pt1 num pt2 len)
   (while
   (setq pt1 (getpoint "\nSelect First Point: "))
      (setq num 0)
      (setq len 0)
      (while
          (setq pt2 (getpoint "\nSelect Second Point: "))
         (setq len (+ (distance pt1 pt2) len))
         (setq pt1 pt2)
      ) ;_end while
      (princ (strcat "\nDevice " (itoa num) " Distance: " (rtos len)))
      (setq num (1+ num))
      (princ)
   ) ;_end while
) ;_end defun

brawleyman 发表于 2022-7-6 18:04:03

这更接近我所需要的。我包含的“下降”是下降和上升的距离,因为导管在天花板中运行,但随后必须下降到整个建筑的设备,所以我通常每个设备增加10英尺,5英尺。向下5英尺。回到导管。此外,我正在提取X和Y坐标,因为导管只在这些方向上运行,所以这就是为什么它在那里。
 
好的,在玩了一点代码之后,我几乎完全按照我想要的方式得到了它。现在,我需要它做的就是在我右键单击以获取最后一个设备的距离后,我希望它自动从我选择的最后一个点开始拾取,而无需再次单击最后一个点。
 

(defun c:dis ()
(setvar "CMDECHO" 0)
(setq num 1) ;set starting segment value
(setq drop (getint "\nEnter drop distance to add to total length:"))
(setq drop (* 12 drop))
(setq lensum 0)
(princ "\nSelect path to next device:")
(while
   (setq pt (getpoint))
   (setq x1 (car pt)) ;extract X value
   (setq y1 (cadr pt)) ;extract Y value
   (while
       (setq pt (getpoint pt))
       (setq x2 (car pt))
       (setq y2 (cadr pt))
       (setq xdiff (abs (- x1 x2)))
       (setq ydiff (abs (- y1 y2)))
       (setq len (+ xdiff ydiff))
       (setq lensum (+ len drop))
   )
   (setq dist (strcat "---> DEVICE " (itoa num) " DISTANCE: " (rtos (/ lensum 12) 2 0)))
   (princ "\n")(princ dist)
   (setq num (1+ num))
   (setq x1 x2)(setq y1 y2)
)
(princ setq total (strcat "---> TOTAL LENGTH: " (rtos dist 4 0)))
(setq x1 x2)(setq y1 y2)
(princ)
)

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

BIGAL 发表于 2022-7-6 18:10:08

一种循环方式
 
(setq x 1)
(同时(=x 1)
 
(如果(=x1 x2)(退出))
选取同一点两次,然后测试是否为yes,然后退出,yes exit正好如此,否则x=2也将停止。
此处编码
)结束时
 
 
我使用的另一个方法是拾取对象,但要退出pick nothing并测试object=nil
页: [1]
查看完整版本: 在Lisp中循环。。。