userzhl 发表于 2009-1-14 12:40:00
<p>我也用了,但是经常捕捉会丢失,是怎么回事呢?</p><p>(defun 111()<br/>(error-init (list '("cmdecho" 0 "osmode" 0 ) 1 ))<br/>......<br/>(error-restore)<br/>)</p><p>(defun error-init (lst / ss varl untag reset bar)<br/> (if (= 1 (logand 1 (getvar "pickfirst")))<br/> (progn<br/> (setq ss (ssgetfirst))<br/> (if (not (apply 'or ss)) (setq ss nil))<br/> )<br/> )<br/> (mapcar 'set '(varl untag reset bar) lst)<br/> (setq $lt-alive$ (if (not $lt-alive$) 1 (1+ $lt-alive$)))<br/> (if (and (> $lt-alive$ 1)<br/> (= "*LTErr*" (last $lt-error$))<br/> )<br/> (progn<br/> (setq *error* lt:error $lt-alive$ 1)<br/> (error-restore)<br/> (setq $lt-alive$ 1)<br/> )<br/> )<br/> (if (<= $lt-alive$ 0)<br/> (progn<br/> (setq $lt-alive$ 0)<br/> (error-restore)<br/> (setq $lt-alive$ 1)<br/> )<br/> )<br/> (if (= $lt-alive$ 1)<br/> (progn<br/> (setq $lt-olderror$ *error*)<br/> (if (or (not (listp $lt-error$))<br/> (/= "*LTErr*" (last $lt-error$))<br/> )<br/> (setq $lt-error$ (list "*LTErr*"))<br/> )<br/> (if (or (= (type (car $lt-error$)) 'list)<br/> (= "*LTErr*" (car $lt-error$))<br/> )<br/> (setq $lt-error$ (cons untag $lt-error$))<br/> (setq $lt-error$ (cons untag (cdr $lt-error$)))<br/> )<br/> (if untag<br/> (lt:undo-init T)<br/> (setq $lt-undoctl$ nil)<br/> )<br/> )<br/> )<br/> (sysvar-set (car lst))<br/> (if (= $lt-alive$ 1)<br/> (progn<br/> (setq *error* lt:error)<br/> (if reset (setq $lt-error$ (append (reverse (cdr (reverse $lt-error$)))<br/> (list reset (last $lt-error$))<br/> )<br/> )<br/> )<br/> )<br/> )<br/> (if ss (apply 'sssetfirst ss))<br/>)<br/>(defun error-restore ()<br/> (setq $lt-alive$ (1- $lt-alive$)<br/> $lt-error$ (cons (car $lt-error$)<br/> (reverse (cons (last $lt-error$)<br/> (cddr (reverse (cdr $lt-error$)))<br/> )<br/> )<br/> )<br/> )<br/> (if (>= $lt-alive$ 0)<br/> (lt:sysvar-restore)<br/> (setq $lt-varlist$ nil)<br/> )<br/> (if (<= $lt-alive$ 0)<br/> (progn<br/> (lt:undo-restore)<br/> (if $lt-olderror$ (setq *error* $lt-olderror$ $lt-olderror$ nil))<br/> )<br/> )<br/>(if (null $zhl_os)(setq $zhl_os 767))<br/>(if $zhl_os (setvar "osmode" $zhl_os))<br/> (princ)<br/>)</p><p>(defun sysvar-set (lst / lst3 a n b lst2)<br/> (setq lst3 (car $lt-varlist$) n -2)<br/> (repeat (/ (length lst) 2)<br/> (setq a (strcase (nth (setq n (+ n 2)) lst))<br/> b (nth (1+ n) lst)<br/> lst2 (append lst2 (list (list a (getvar a))))<br/> )<br/> (if (and $lt-varlist$ (not (assoc a lst3)))<br/> (setq lst3 (append lst3 (list (list a (getvar a)))))<br/> )<br/> (setvar a b)<br/> )<br/> (if $lt-varlist$<br/> (setq $lt-varlist$ (append (list lst3) (cdr $lt-varlist$) (list lst2)))<br/> (setq $lt-varlist$ (list lst2))<br/> )<br/>)<br/>(defun lt:undo-restore (/ x)<br/> (if $lt-undoctl$<br/> (progn<br/> (defun x (i val) (= (logand i val) i))<br/> (sysvar-set '("cmdecho" 0))<br/> (while (= 8 (logand 8 (getvar "undoctl"))) (command "_.undo" "_end"))<br/> (if (/= $lt-undoctl$ (getvar "undoctl"))<br/> (progn<br/> (cond<br/> ((= 0 $lt-undoctl$) (command "_.undo" "_control" "_none"))<br/> ((x 2 $lt-undoctl$) (command "_.undo" "_control" "_one")) <br/> )<br/> (if (x 4 $lt-undoctl$) (command "_.undo" "_auto" "_on"))<br/> )<br/> )<br/> (if (not (x 2 (getvar "undoctl"))) (lt:sysvar-restore))<br/> (setq $lt-undoctl$ nil)<br/> )<br/> )<br/>) <br/>(defun lt:undo-init (varset / x y z)<br/> (defun x () (getvar "undoctl"))<br/> (defun y (i) (= (logand i (x)) i))<br/> (sysvar-set '("cmdecho" 0))<br/> (setq z (x))<br/> (if (or (= (x) 0) (= (x) 16)) (command "_.undo" "_all"))<br/> (if (or (not (y 1)) (y 2)) (command "_.undo" "_control" "_all"))<br/> (if (y 4) (command "_.undo" "_auto" "_off"))<br/> (while (y 8) (command "_.undo" "_end"))<br/> (while (not (y 8)) (command "_.undo" "_begin"))<br/> (lt:sysvar-restore)<br/> (if (= varset T) (setq $lt-undoctl$ z) z)<br/>)<br/>(defun lt:sysvar-restore (/ lst)<br/> (if (<= $lt-alive$ 0)<br/> (setq lst (car $lt-varlist$) $lt-varlist$ (list lst))<br/> (setq lst (last $lt-varlist$))<br/> )<br/> (mapcar '(lambda (x) (apply 'setvar x)) lst)<br/> (setq $lt-varlist$ (reverse (cdr (reverse $lt-varlist$))))<br/>)</p>caoyin 发表于 2009-1-14 13:33:00
捕捉丢失,说明error函数的定义还是有问题——也就是说出错处理没有被激活userzhl 发表于 2009-1-14 17:36:00
出错处理怎样才能被激活?上面这段程序要怎么改呢?大菜鸟 发表于 2009-1-15 07:53:00
好东西,值得学习!caoyin 发表于 2009-1-15 13:54:00
本帖最后由 作者 于 2009-1-15 13:56:28 编辑 <br /><br /> userzhl发表于2009-1-14 17:36:00static/image/common/back.gif出错处理怎样才能被激活?上面这段程序要怎么改呢?<p></p><p>;;写一个简单的示例</p><p>;;当程序出错,*error*函数则自动被激活执行,相关的恢复设置可定义在*error*函数中,如下面的红色部分</p><p>(defun c:tt (/ err os)<br/> (setq err *error*) ;储存当前*error*函数定义<br/> (setq os (getvar "osmode")) ;储存系统变量osmode当前值<br/> (setvar "osmode" 0) ;关闭osmode<br/> (defun *error* (m) ;自定义*error*函数<br/> (princ m) ;如果不需要打印出错信息这一行可以不要<br/> <font color="#ff3300">(setvar "osmode" os)</font> ;在出错的时候恢复osmode<br/> )<br/> (if (and (setq p1 (getpoint "\n指定直线第一点: "))<br/> (setq p2 (getpoint p1 "\n指定直线第二点(此时按ESC测试): "))<br/> )<br/> (command "_.line" p1 p2 "")<br/> )<br/> (setvar "osmode" os) ;在未出错的时候恢复osmode<br/> (princ)<br/>)</p><p></p>
jxphklibin 发表于 2009-2-3 14:47:00
非常详细,支持!jxphklibin 发表于 2009-2-3 15:15:00
怎么找不到这个函数 lt:entselcaoyin 发表于 2009-2-4 13:58:00
jxphklibin发表于2009-2-3 15:15:00static/image/common/back.gif怎么找不到这个函数 lt:entsel<p><a href="http://bbs.mjtd.com/forum.php?mod=viewthread&tid=72404">http://bbs.mjtd.com/forum.php?mod=viewthread&tid=72404</a></p><p>见3楼</p>
jxphklibin 发表于 2009-2-4 21:07:00
有些函数缺少,请补上!7607155 发表于 2009-2-5 21:55:00
<p>谢楼主分享</p>