需要“IF”功能的帮助o
你好这是我模糊的Lisp程序。到目前为止,它运行良好,但有一个小问题。唯一的问题是,当我错过选择时,它会根据我设置的内容显示“未选择对象”。但随后它继续并提示我Arcok YES NO,我无法解决这个问题。如果选择有效,则它应该继续执行Arcok。
请帮忙。
(defun convcloudnew (/ al ss arcok)
(command "undo" "m")
(initget (+ 2 4))
(setq al (getreal "Specify Arc length <0.5>:"))
(if (= al nil) ;If user do not input a value here
(setq al 0.5) ;Consider "Enter" as 0.5
) ; end if
(if (setq ss (ssget '((0 . "LINE,*POLYLINE,CIRCLE,ELLIPSE,SPLINE,ARC"))))
(progn
(repeat (setq i (sslength ss))
(command "_.revcloud" "a" al al "" (ssname ss (setq i (1- i))) "")
)
);end progn
(princ "\nNo objects selected.")
) ;end if
(initget (+ 2 4) "Y N")
(setq arcok (getkword "\nArc size look ok? :"))
(if (= arcok nil) ;If user do not input a value here
(setq arcok "Y")
) ; end if
(Cond
( (= arcok "Y")
(princ "\nProceeding to next function")
(princ)
)
( (= arcok "N")
(command "undo" "b")
(princ "\nClouding undone")
(Princ)
)
) ; end cond
);end defun
非常感谢。
编辑:还有一期。如果选择了带有NO的ArcOK,那么是否可以保留选择?哪个undo是云,这样我就可以在不再次选择相同项目的情况下调整其大小? 如果这是您想要实现的,那么将所有代码放入If语句progn中,如
(defun convcloudnew (/ al ss arcok)
(command "undo" "m")
(initget (+ 2 4))
(setq al (getreal "Specify Arc length <0.5>:"))
(if (= al nil) ;If user do not input a value here
(setq al 0.5) ;Consider "Enter" as 0.5
) ; end if
(if (setq ss (ssget '((0 . "LINE,*POLYLINE,CIRCLE,ELLIPSE,SPLINE,ARC"))))
(progn
(repeat (setq i (sslength ss))
(command "_.revcloud" "a" al al "" (ssname ss (setq i (1- i))) "")
)
(initget (+ 2 4) "Y N")
(setq arcok (getkword "\nArc size look ok? :"))
(if (= arcok nil) ;If user do not input a value here
(setq arcok "Y")
) ; end if
(Cond
( (= arcok "Y")
(princ "\nProceeding to next function")
(princ)
)
( (= arcok "N")
(command "undo" "b")
(princ "\nClouding undone")
(Princ)
)
) ; end cond
);end progn
(princ "\nNo objects selected.")
) ;end if
);end defun
是的,选择集在变量ss中仍然可用,尽管使用(命令…)有时会导致不想要的结果。 第一个问题已解决。非常感谢你,克林特。
你的意思是说,如果我取消了云层,那么我也可以使用SS而不是再次重新选择?你能解释一下在命令提示符下写什么吗?我试着输入SS而不是选择,但没有成功。
编辑:你有比我现在使用的更好的想法吗?有没有可能一直调整弧的大小,直到它给我什么我什么(没有重做整个事情了)。是否有任何变量可以捕捉作为参考,以便在此基础上调整弧度?
编辑:可以是dimscale,与云的弧度成一定比例?因此,当图形较大时,云也会相应调整。 任何关于这方面的建议对我来说都是一个很好的开始。非常感谢。 我真的不喜欢使用命令,除非我别无选择。但是althernative需要更多的时间。但这里有一种方法可以使用命令实现。
如果您将绿线作为另一个例程中的子功能运行,则可能不需要绿线。 嗨,克林特,
这真是太棒了,正是我想要的。
是的,这是主例程的一个子函数,所以我没有像你提到的那样使用绿色的行。主例程有另一个子功能,称为Draw,它允许用户绘制矩形、Pline、圆形和椭圆,因此这是一个完整的云彩例程,在该lisp中使用鼠标可以完成所有操作(弧长除外)。但在大多数情况下,这是一个基本的Lisp程序,不像你们这样进步。在你的帮助下,它变成了一个基本+半高级的lisp。
看看代码,我不会更接近你写的东西。
非常感谢你的帮助。 谢谢shailujp。很高兴我能帮忙。 嗨,克林特
我有一个小要求。是否可以动态获取弧长(al)而不进行硬编码?在图形上,默认值为0.5。根据图形大小将其更改为3后,默认情况下不应返回到0.5。这样,我就不必每次都输入尺寸,也不必记住活动图形中的弧长值。
我用李的“默认选项提示”做了几次尝试,但都没有成功。
谢谢 我不是在看你的程序,因为我不是在LISP中编程,但对于我的云例程(VBA),我使用用户*变量。您可以为它们指定一个值,稍后再检索。它们只会持续到图纸打开的时候,因此可能对您没有帮助,但值得一看。 试试这个
(defun convcloudnew ( / al i ss sse )
(if (setq ss (ssget '((0 . "LINE,*POLYLINE,CIRCLE,ELLIPSE,SPLINE,ARC"))))
(progn
(repeat (setq i (sslength ss))
(setq sse (cons (cdr (entget (ssname ss (setq i (1- i))))) sse))
)
(setq al (getvar "*REVCLOUDMAXARCLENGTH"))
(while al
(command "_.erase" ss "")
(setq ss (ssadd))
(foreach x sse
(command "_.revcloud" "arc" al al "object" (entmakex x) "")
(ssadd (entlast) ss)
)
(initget 6)
(setq al (getreal (strcat "\nSpecify a different arc length or ENTER to accept the current value < " (rtos al 2 2) " >: ")))
)
)
(princ "\nNo objects selected.")
)
)
页:
[1]
2