Lee Mac 发表于 2022-7-6 17:24:05

需要快速回答!

我的Lisp程序看起来像这样
 
此时,如果用户在请求关键字时点击“回车”,程序将结束,什么也不做(这很好)。
 
我希望用户能够选择他或她想要的选项,AutoCAD执行该选项,然后返回到关键字菜单-然后如果用户按enter键(没有关键字),LISP例程将完成;或者(使用关键字)完成所选选项,然后再次返回菜单。
 
非常感谢您的帮助。

neekcotrack 发表于 2022-7-6 17:32:10

这是一个lisp,其中包含您想要的内容。你可以告诉我们你需要什么。
 
(defun c:setup ( / SHEET SCALE SF1)
(initget "1 2 3 4 Exit")
(setq SHEET (getkword "\nEnter Sheet 22X34,24X36,30X42,36X48/<Exit>: "))
(if (or (not SHEET) (= SHEET "Exit")) (exit))
(initget "1 2 3 4 5 6 7 8 9 Exit")
(setq SCALE (getkword "\nEnter Scale FULL,1/2,1/4,1/8,1/20,1/30,1/40,1/50,custom/<Exit>: "))
(if (or (not SCALE) (= SCALE "Exit")) (exit))

(setq SCALE
(cond
    ((= SCALE "1")   1.0)
    ((= SCALE "2")24.0)
    ((= SCALE "3")48.0)
    ((= SCALE "4")96.0)
    ((= SCALE "5") 240.0)
    ((= SCALE "6") 360.0)
    ((= SCALE "7") 480.0)
    ((= SCALE "8") 600.0)
    ((= SCALE "9")
      (initget "Exit")
      (setq SF1 (getreal "\nEnter the desired scale factor/<Exit>: "))
      (if (or (not SF1) (= SF1 "Exit")) (exit))
      SF1
    ) ;_ c9
) ;_ cond
) ;_ setq
(command ".DIMSCALE" SCALE ".LTSCALE" (/ SCALE 2.0))
(cond
   ((= SHEET "1")
    ;; 22X34
    ;; DO SOMETHING FOR THIS SHEET
   ) ;_ c1
   ((= SHEET "2")
    ;; 24X36
    ;; DO SOMETHING FOR THIS SHEET
   ) ;_ c2
   ((= SHEET "3")
    ;; 30X42
    ;; DO SOMETHING FOR THIS SHEET
   ) ;_ c3
   ((= SHEET "4")
    ;; 36X48
    ;; DO SOMETHING FOR THIS SHEET
   ) ;_ c4
) ;_ cond
(princ "\nDimscale = ") (princ (getvar "dimscale"))
(princ "\nLTscale = ") (princ (getvar "ltscale"))
(princ)
) ;_ defun c:setup
 
希望这有帮助!!!

ASMI 发表于 2022-7-6 17:37:46

例如:
 
(defun c:test(/ cFlag ans)
(while(not cFlag)
   (initget "Duplicate Move Rotate")
   (setq ans(getkword "\nAdjustment? : "))
   (cond
   ((= ans "Duplicate")
      (alert "You select Duplicate.\n\nPress Ok to return menu...")
      ); end condition #1
   ((= ans "Move")
      (alert "You select Move.\n\nPress Ok to return menu...")
      ); end condition #2
   ((= ans "Rotate")
      (alert "You select Rotate.\n\nPress Ok to return menu...")
      ); end condition #3
   (T
      (alert "You press Enter.\n\nGoodbuy Lee Mac guy:)")
      (setq cFlag T)
      ); end condition #3
   ); end cond
   ); end while
(princ)
); end of c:test
 
因为你不本地化你的变量吗?在这种情况下,您必须在程序开始时本地化“cFlag”变量或写入(setq cFlag nil)。本地化是正确的方式。。。

neekcotrack 发表于 2022-7-6 17:43:37

如果是我,我会使用这个lisp,只需在Righ-Click-Customization下设置默认模式,即重复最后一个命令。因此,当Lisp程序结束时,您可以右键单击再次开始,或者继续处理您的业务。我还更改了命令中的键,这样你就不必现在只需键入第一个字母就可以了。
 
(defun c:test ()
(initget "D M R")
(setq ans (getkword "\nAdjustment? uplicate,ove,otate]: "))
    (cond
   ((= ans "D")
       (command "_copy" pause pause)
       );end cond #1
   ((= ans "M")
       (command "_move" pause pause)
      );end cond #2
   ((= ans "R")
       (command "_rotate" pause pause pause)
      );end cond #3
    );end cond
(princ)
);end c:test

Lee Mac 发表于 2022-7-6 17:47:22

谢谢你的帮助,非常感谢。
 
我很可能会用你的方法,谢谢
 
 
我通常会本地化,但我很快就写出了LISP。

Lee Mac 发表于 2022-7-6 17:49:30

阿斯米,我使用了你的方法,并不断收到如下所示的错误:

error - syntax error
 
加载LISP例程时出错。有什么想法吗?

ASMI 发表于 2022-7-6 17:56:21

 
会是什么父母都丢了吗?或者错误在此代码之外?一切都对我有用。它太简单了,不能不工作。

Strix 发表于 2022-7-6 18:01:50

请记住使用描述性的线程标题,这有助于搜索功能的工作!

Lee Mac 发表于 2022-7-6 18:06:25

很多次道歉,不会再发生了

CAB 发表于 2022-7-6 18:13:53

这是ASMI示例的变体。它不使用标志变量,而是使用progn
包装代码。基本上,最后一个返回值被传递给progn,它反过来传递这个值
while循环的值。所以要退出循环,请通过nil。也就是说在循环中传递一个非零值。
优点是可以从cond调用例程,然后返回该例程
要退出或留在循环中的值。
5
页: [1] 2
查看完整版本: 需要快速回答!