shailujp 发表于 2022-7-5 23:12:49

需要“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是云,这样我就可以在不再次选择相同项目的情况下调整其大小?

cwake 发表于 2022-7-5 23:19:46

如果这是您想要实现的,那么将所有代码放入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中仍然可用,尽管使用(命令…)有时会导致不想要的结果。

shailujp 发表于 2022-7-5 23:22:25

第一个问题已解决。非常感谢你,克林特。
你的意思是说,如果我取消了云层,那么我也可以使用SS而不是再次重新选择?你能解释一下在命令提示符下写什么吗?我试着输入SS而不是选择,但没有成功。
 
编辑:你有比我现在使用的更好的想法吗?有没有可能一直调整弧的大小,直到它给我什么我什么(没有重做整个事情了)。是否有任何变量可以捕捉作为参考,以便在此基础上调整弧度?
 
编辑:可以是dimscale,与云的弧度成一定比例?因此,当图形较大时,云也会相应调整。

shailujp 发表于 2022-7-5 23:26:06

任何关于这方面的建议对我来说都是一个很好的开始。非常感谢。

cwake 发表于 2022-7-5 23:29:11

我真的不喜欢使用命令,除非我别无选择。但是althernative需要更多的时间。但这里有一种方法可以使用命令实现。
如果您将绿线作为另一个例程中的子功能运行,则可能不需要绿线。

shailujp 发表于 2022-7-5 23:32:12

嗨,克林特,
 
这真是太棒了,正是我想要的。
 
是的,这是主例程的一个子函数,所以我没有像你提到的那样使用绿色的行。主例程有另一个子功能,称为Draw,它允许用户绘制矩形、Pline、圆形和椭圆,因此这是一个完整的云彩例程,在该lisp中使用鼠标可以完成所有操作(弧长除外)。但在大多数情况下,这是一个基本的Lisp程序,不像你们这样进步。在你的帮助下,它变成了一个基本+半高级的lisp。
 
看看代码,我不会更接近你写的东西。
 
非常感谢你的帮助。

cwake 发表于 2022-7-5 23:37:27

谢谢shailujp。很高兴我能帮忙。

shailujp 发表于 2022-7-5 23:39:30

嗨,克林特
 
我有一个小要求。是否可以动态获取弧长(al)而不进行硬编码?在图形上,默认值为0.5。根据图形大小将其更改为3后,默认情况下不应返回到0.5。这样,我就不必每次都输入尺寸,也不必记住活动图形中的弧长值。
 
我用李的“默认选项提示”做了几次尝试,但都没有成功。
 
谢谢

dbroada 发表于 2022-7-5 23:45:09

我不是在看你的程序,因为我不是在LISP中编程,但对于我的云例程(VBA),我使用用户*变量。您可以为它们指定一个值,稍后再检索。它们只会持续到图纸打开的时候,因此可能对您没有帮助,但值得一看。

cwake 发表于 2022-7-5 23:50:03

试试这个

(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
查看完整版本: 需要“IF”功能的帮助o