明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1570|回复: 3

[已解答] 《菜鸟提问》函数调用多次command命令,如何实现一次后退操作,退回到没有调用函数前

  [复制链接]
发表于 2014-6-11 16:56 | 显示全部楼层 |阅读模式
5明经币
本帖最后由 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函数,即不调用原始命令,这是一种较好的方法,但必 ...
发表于 2014-6-11 16:56 | 显示全部楼层
下面是我很多年以前在晓东发表的《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)                                           ;取消程序返回值
)

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

评分

参与人数 1明经币 +1 收起 理由
edata + 1 很详细。。。。

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-6-11 17:14 | 显示全部楼层
ll_j 发表于 2014-6-11 16:56
下面是我很多年以前在晓东发表的《AutoLisp编程心得》的一部分,供参考。

9.Undo处理

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

使用道具 举报

发表于 2014-6-11 17:31 | 显示全部楼层
执行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 命令





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-17 20:26 , Processed in 0.203839 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表