在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)
)
真的没有多少时间,但这可能会帮助你;
(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
只是对你的原始帖子进行编辑 谢谢李,但这并没有完全实现我想要实现的目标。有时,当我测量从一个设备到下一个设备的路径时,导管中有几个弯曲,因此我不能直接从一个设备到下一个设备。我必须沿着路径选择几个点,然后才能获得到一个设备的总距离。
基本上,我希望例程收集信息,但只在按enter键或右键单击时显示,然后继续选择指向下一个设备的点,然后再次右键单击以获取到该设备的距离,等等。我知道一定有办法做到这一点,但我还没有找到一个直接的答案,它巡航在网上。我希望右键单击以显示结果,而不结束例程。 我删除了“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
这更接近我所需要的。我包含的“下降”是下降和上升的距离,因为导管在天花板中运行,但随后必须下降到整个建筑的设备,所以我通常每个设备增加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”
我错过了什么? 一种循环方式
(setq x 1)
(同时(=x 1)
(如果(=x1 x2)(退出))
选取同一点两次,然后测试是否为yes,然后退出,yes exit正好如此,否则x=2也将停止。
此处编码
)结束时
我使用的另一个方法是拾取对象,但要退出pick nothing并测试object=nil
页:
[1]