需要快速回答!
我的Lisp程序看起来像这样此时,如果用户在请求关键字时点击“回车”,程序将结束,什么也不做(这很好)。
我希望用户能够选择他或她想要的选项,AutoCAD执行该选项,然后返回到关键字菜单-然后如果用户按enter键(没有关键字),LISP例程将完成;或者(使用关键字)完成所选选项,然后再次返回菜单。
非常感谢您的帮助。 这是一个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
希望这有帮助!!! 例如:
(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)。本地化是正确的方式。。。 如果是我,我会使用这个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 谢谢你的帮助,非常感谢。
我很可能会用你的方法,谢谢
我通常会本地化,但我很快就写出了LISP。 阿斯米,我使用了你的方法,并不断收到如下所示的错误:
error - syntax error
加载LISP例程时出错。有什么想法吗?
会是什么父母都丢了吗?或者错误在此代码之外?一切都对我有用。它太简单了,不能不工作。 请记住使用描述性的线程标题,这有助于搜索功能的工作! 很多次道歉,不会再发生了 这是ASMI示例的变体。它不使用标志变量,而是使用progn
包装代码。基本上,最后一个返回值被传递给progn,它反过来传递这个值
while循环的值。所以要退出循环,请通过nil。也就是说在循环中传递一个非零值。
优点是可以从cond调用例程,然后返回该例程
要退出或留在循环中的值。
5
页:
[1]
2