Jebus_kfc 发表于 2022-7-6 10:39:45

帮助进行是/否while循环。

我在运行lisp程序以实现结构节点板的自动化时遇到了一个问题。在我的程序中,我使用了一个带是/否条件的while循环。循环会询问您是否正确绘制了节点板,如果没有,它会循环并正确绘制,但它会询问您是否再次正确绘制。所以我想我的问题是,一旦你循环一次,问题解决了,有没有办法阻止循环再次问你。
程序还有更多内容,但这是循环:
(initget“Yes No”)
(setq yesno(getkword“\n是否正确绘制节点板?[是/否]:”)
(条件
((null yesno)(setq yesno“是”))
(=yesno“No”)(命令。擦除“HLINE line2 line3 gplate”“。反转“line1”)
);康德
(该部分位于while循环之间,因此会再次提示。)
抱歉,这让人困惑。

Lee Mac 发表于 2022-7-6 10:48:57

嗨,杰布斯,
 
欢迎来到论坛
 
有很多解决方案,但最直观的可能是:
 
记住定位变量“loop”。
 
询问是否需要更多帮助,
 

Jebus_kfc 发表于 2022-7-6 10:55:04

谢谢嗯,我不确定这是否有效。。。它一直在循环。如果你愿意的话,我可以复制整个文件,再解释一下。基本上,要想做我想做的事,你需要一个16“X16”的矩形,在45度左右有一条6”的线……如果你知道什么是节点板,这将有助于理解。。。
 
 
 
(defun dtr(a/)
(*pi(/a 180.0))
)
(除rtd(a/)
(*(/180.0 pi)a)
)
 
(defun c:节点板(/old\u os old\u layer line1 enttype p1 p2 p3 p4 p5 p6 sp ep dist)
ang ang2 hline sp2 ep2 line2 line3 gplate yesno)
(setvar“cmdecho”0);关闭命令回显
(setq old_os(getvar“osmode”);保存当前osnap设置
(setvar“osmode”0);关闭对象捕捉
(setq old_层(getvar“clayer”);检索当前层
 
 
(while(/=enttype“LINE”)
(setq LINE1(entsel“\n HSS的拾取线:”);获得HSS的第一点
(如果是第1行
(setq enttype(cdr(assoc 0(entget(car LINE1))));只允许选择一行
);setq公司
(警报“\n再次尝试。”)
 
);如果
);虽然
(setvar“osmode”32)
(setq p1(getpoint“\n支柱/底板的点击交点:”)
);setq公司
(setvar“osmode”0)
 
(while(/=是否“是”)
(setq sp(cdr(assoc 10(entget(car LINE1)))
ep(cdr(assoc 11(entget(car LINE1)))
dist(距离sp ep)
ang(角度sp ep)
ang2(角度p1 sp)
p2(极性p1 ang2 24)
 
);setq公司
 
(命令“.offset”6 LINE1 p2“”)
(setq HLINE(entlast));节点板隐藏线
(命令“.CHANGE”“LAST”“PROPERTIES”“LAYER”“HIDDEN”“))
 
(setq sp2(cdr(assoc 10(entget HLINE)))
(setq ep2(cdr(assoc 11(entget HLINE)))
 
 
(setq p3(极性sp2 ang-1.5)
p4(极性ep2(+ang(dtr 180))-1.5)
);setq公司
 
(setq p5(列表(车辆p4)(cadr p1))
p6(列表(车辆p1)(cadr p3))
);setq公司
(命令“.layer”“make”“D04”“color”“洋红”“D04”)
(命令.行“sp2 p3”)
(SETQ line2(ENTLAST));连接到节点板侧面的线
(命令行“ep2 p4”)
(SETQ line3(ENTLAST));连接到节点板侧面的线
(命令“.pline”p3 p6 p1 p5 p4“”)
(SETQ GPLATE(ENTLAST));节点板
 
 
(initget“Yes No”);循环点,循环程序
(setq yesno(getkword“\n是否正确绘制节点板?[是/否]:”)
(条件
((null yesno)(setq yesno“是”))
(=yesno“No”)(命令。擦除“HLINE line2 line3 gplate”“。反转“line1”)
 
);康德
);虽然
 
 
(setvar“osmode”old_os);启用“对象捕捉到上一个设置”
(setvar“cmdecho”1);重新打开命令回显
(setvar“clayer”old_层);将层设置回程序之前
 
);eop
 
;;;      
;;;

Lee Mac 发表于 2022-7-6 11:01:19

 
你试过了吗?我的逻辑没有缺陷。

Jebus_kfc 发表于 2022-7-6 11:03:30

我试过了。。。我并不是说你错了,只是当我试过的时候,我可能没有在某些方面试对。。。我会再试一次,然后再给你回复。谢谢你的帮助

Jebus_kfc 发表于 2022-7-6 11:11:55

好啊好吧,看起来你的“逻辑”和我的一样,也许它确实混淆了我的问题。。。循环是为了提示“扣板画得正确吗?”选择是或否。。如果是,则程序完成。。如果没有,则修复问题-然后提示“节点板绘制是否正确?”这也是我寻求帮助的原因。

Lee Mac 发表于 2022-7-6 11:14:07

所以你想让它退出?那么,为什么要使用循环呢?只要在末尾保留IF语句,以便在需要时修复它。

Jebus_kfc 发表于 2022-7-6 11:22:16

是的,我想过,但我已经写了程序,只是好奇是否有办法停止循环。。。但无论如何,非常感谢你的帮助

Jebus_kfc 发表于 2022-7-6 11:23:37

就像你说的那样,我用if语句替换while循环。我之所以不想这样做,是因为我基本上必须将整个程序复制到if语句下,但它可以工作!!!!

Lee Mac 发表于 2022-7-6 11:33:57

 
很高兴听到。
 
顺便说一句,你在使用什么编辑器来编写/编辑代码?
页: [1] 2
查看完整版本: 帮助进行是/否while循环。