本帖最后由 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)
- )
|