《菜鸟提问》函数调用多次command命令,如何实现一次后退操作,退回到没有调用函数前
本帖最后由 HGHG011 于 2014-6-11 16:55 编辑(defun c:cx()
(command "pline" '(0 0) '(10 10) "")
(command "pline" '(10 10) '(100 100) "")
(command "pline" '(100 100) '(1000 1000) "")
)
比如上面程序 一个程序我调用了n个command命令,能不能实现我用一次ctrl+z来实现退回3个command指令发出之前
下面是我很多年以前在晓东发表的《AutoLisp编程心得》的一部分,供参考。
9.Undo处理
一个完善的程序应该有较好的出错处理,这是在所有Lisp教材上都提及的,但程序的Undo处理就说得很少或没有提及。
其实Undo处理对程序来说也是非常重要的,尤其对有较多输出的复杂程序而言,不能解决Undo问题,使用起来会极不方便。
对于Undo问题的解决,一种方法是尽量少用或不用command函数,即不调用原始命令,这是一种较好的方法,但必须注意的是,一段程序必须至少有一次调用command函数,否则Undo命令将取消程序运行前的前一次命令,解决的方法是在程序运行的起始位置加一个无谓的command,如“(command "color" "")”。
有时不使用command函数不能达到我们要求的一些功能,或使得程序过于复杂,我们可能需要使用一些command函数(原始命令),这是就应该在程序中进行Undo处理,即使用Undo命令的编组功能。
例五是一段程序出错函数与Undo处理的示例。
************************************************
;;例五
(defun newerr (s) ;出错函数
(if s
(progn
(term_dialog) ;使用对话框时使用
(if olderr (setq *error* olderr)) ;出错函数恢复
(if oldvar (setvar ... oldvar)) ;系统变量恢复
(if olderr (setq *error* olderr)) ;出错函数恢复
(command "_.undo" "_e") ;Undo编组结束
)
)
(princ)
)
(defun c:my(/ ...) ;主程序(主函数)
(setvar "cmdecho" 0) ;取消命令回显提示
(command "_.undo" "_BE") ;Undo编组开始
(setq olderr *error* *error* newerr) ;调用自定义出错函数
(setq oldvar (getvar ...)) ;保存相关系统变量
(setvar ... ;设置系统变量
... ;程序段
...
(setvar ... oldvar) ;恢复系统变量
(setq *error* olderr) ;恢复出错函数
(command "_.undo" "_E") ;结束Undo命令编组
(princ) ;取消程序返回值
)
另外,这种学习探讨的帖子是不需要悬赏的,论坛不欢迎伸手纯要程序,很欢迎学习讨论。
ll_j 发表于 2014-6-11 16:56 static/image/common/back.gif
下面是我很多年以前在晓东发表的《AutoLisp编程心得》的一部分,供参考。
9.Undo处理
哥们好人啊,主要我是个菜鸟,问的问题比较菜,有些浅显没有太多时间深入研究,也算另类的伸手党了,所以就加点悬赏,略表心意而已啦 执行command之前用了(command "color" "")会取消预选对象,等同于用(command),也就是取消正在执行的命令。
undo有个变量UNDOCTL可以查询是否一个编组是否结束。
(logand 8 (getvar 'undoctl)) = 8则表示有编组激活
用(> (getvar 'cmdactive) 0) 判断是否有command 未结束。
UNDOCTL 系统变量
指示 UNDO 命令的“自动”、“控制”和“编组”选项的状态。 系统将使用下列位码值之和将该设置存储为一个位码:
0
UNDO 关闭
1
UNDO 打开
2
只能放弃一条命令
4
打开“自动”
8
一个编组处于当前活动状态
16
将缩放和平移操作编组为单个操作
CMDACTIVE 系统变量
指示激活的是普通命令、透明命令、脚本还是对话框。 系统将使用下列位码值之和将该设置存储为一个位码:
1
激活普通命令
2
激活普通命令和透明命令
4
激活脚本
8
激活对话框
16
激活 DDE
32
激活 AutoLISP(仅对 ObjectARX定义的命令可见)
64
激活 ObjectARX 命令
页:
[1]