lostbalance 发表于 2015-1-24 20:01:03

讨论setvar的undo编组问题

本帖最后由 lostbalance 于 2015-1-24 23:24 编辑

前几天把编的程序发给同事用,然后他说遇到几次小数精度出现问题,也就是dimzin参数没有正常恢复初始值。
因为程序总数也不算少,具体是哪里出问题还无法辨别出来。但初步看了下涉及到dimzin参数的代码,有修改代码,有恢复代码,error里也有恢复代码,所以考虑是不是和undo、error里的代码顺序有关系。
以下是编了一个测试的代码,比较了下正常运行和esc退出两种方式下,用u命令撤销操作的dimzin值变化(初始设置为8),发现如下:
正常运行后,值为4,u一次后变为1,u两次后变为8;
esc退出后,值为8,u一次后变为1,u两次后变为8;
初始值为8,dimzin命令后改为0,再运行代码,上述两种方式,u两次都值都变为8,而不是0。

那么是否可以总结如下:
1. 在lis中,连续的setvar dimzin,会自动编组,一次u就可以全部恢复?
2. undo编组开始前的连续的setvar dimzin,属于前一个undo编组?
3. undo编组结束后的连续的setvar dimzin,自动归于该undo编组中?
4. 其他系统变量也是这样?(defun c:qq(/ *error*)
(defun *error* ( msg ) ;错误恢复
    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
      (princ msg)
    )
    (setvar "dimzin" 5)
    (while (= 8 (logand 8 (getvar 'undoctl)))
      (vl-cmdf ".undo" "END")
    )
    (setvar "dimzin" 6)
    (setvar "dimzin" 7)
    (setvar "dimzin" 8)
    (princ)
)
(setvar "cmdecho" 0)
(setvar "dimzin" 7)
(setvar "dimzin" 6)
(setvar "dimzin" 1)
(vl-cmdf ".undo" "be")
(setvar "dimzin" 2)
(setq a (getpoint))
(setvar "dimzin" 3)
(while (= 8 (logand 8 (getvar 'undoctl)))
    (vl-cmdf ".undo" "END")
)
(setvar "dimzin" 4)
(princ)
)
(defun c:qqq()
(princ (getvar "dimzin"))
(princ)
)

lostbalance 发表于 2015-1-24 23:25:55

自己顶一下,求解惑

USER2128 发表于 2015-1-25 08:22:37

u一次后变为1
    删除(vl-cmdf ".undo" "be")与(vl-cmdf ".undo" "END")之间
u两次后变为8
    因系统初始值为8
页: [1]
查看完整版本: 讨论setvar的undo编组问题