HGHG011 发表于 2014-6-11 16:56:01

《菜鸟提问》函数调用多次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指令发出之前


ll_j 发表于 2014-6-11 16:56:02

下面是我很多年以前在晓东发表的《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)                                           ;取消程序返回值
)

另外,这种学习探讨的帖子是不需要悬赏的,论坛不欢迎伸手纯要程序,很欢迎学习讨论。

HGHG011 发表于 2014-6-11 17:14:22

ll_j 发表于 2014-6-11 16:56 static/image/common/back.gif
下面是我很多年以前在晓东发表的《AutoLisp编程心得》的一部分,供参考。

9.Undo处理


哥们好人啊,主要我是个菜鸟,问的问题比较菜,有些浅显没有太多时间深入研究,也算另类的伸手党了,所以就加点悬赏,略表心意而已啦

edata 发表于 2014-6-11 17:31:56

执行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]
查看完整版本: 《菜鸟提问》函数调用多次command命令,如何实现一次后退操作,退回到没有调用函数前