本帖最后由 Free-Lancer 于 2014-4-13 02:05 编辑
综合到一起给大家一个完整版的 *error* 处理机制,这些函数大都来源于网络,只是稍加整理通用化了,可以作为 A/Vlisp 程序的错误处理机制的终极版本
 - ;; *error*
- (defun fy:error (msg)
- (if (and msg (/= msg "Function cancelled"))
- (prompt (strcat "Error: " msg))
- (princ)
- )
- (fy:end)
- (princ)
- )
- ;;start progam
- (defun fy:begin ()
- (setq olderr *error*
- *error* fy:error
- )
- (fy:Clearcset)
- (fy:startundo)
- t
- )
- ;;progame end
- (defun fy:end ()
- (fy:unsetv)
- (setq *error* olderr
- *sysvars* nil
- )
- (if *FyGlobleSym*
- (progn
- (if (vl-symbolp (car *FyGlobleSym*))
- (foreach x *FyGlobleSym* (set x nil))
- (foreach x *FyGlobleSym* (set (read x) nil))
- )
- (setq *FyGlobleSym* nil)
- )
- )
- (fy:endundo)
- (princ)
- )
- ;;push sysvar
- (defun fy:setv (name value / oldval)
- (setq oldval (getvar name))
- (if (not (assoc name *sysvars*))
- (setq *sysvars* (append *sysvars* (list (cons name oldval))))
- )
- (setvar name value)
- oldval
- )
- ;;Restore sysvar
- (defun fy:unsetv ()
- (foreach v *sysvars* (setvar (car v) (cdr v)))
- )
- ;;ActiveDocument
- (defun Fy:acDoc nil
- (eval (list 'defun
- 'FY:acdoc
- 'nil
- (vla-get-activedocument (vlax-get-acad-object))
- )
- )
- (fy:acdoc)
- )
- ;;StartUndo Mark
- (defun fy:StartUndo ()
- (vla-startundomark (fy:acdoc))
- )
- ;;EndUndo Mark
- (defun fy:EndUndo ()
- (vla-endundomark (fy:acdoc))
- )
- ;;ActiveSelectionSets
- (defun fy:acsets nil
- (eval (list 'defun
- 'fy:acsets
- 'nil
- (vla-get-Selectionsets (fy:acdoc))
- )
- )
- (fy:acsets)
- )
- ;; From eachy
- (defun fy:Clearcset (/ cset)
- (if (not (vl-catch-all-error-p
- (setq cset
- (vl-catch-all-apply
- 'vla-item
- (list
- (fy:acsets)
- "CURRENT"
- )
- )
- )
- )
- )
- (vla-delete cset)
- )
- (princ)
- )
使用方法
程序起始
(fy:begin);_完成初始化,标记 Undo
...
(fy:setv "cmdecho" 0);_程序中用这个函数替代 setvar,功能是仅保存系统变量的初始状态,后面可以根据需要再次对同一系统变量进行设置,但以后的设置仅仅是 setvar , 不会再保存该系统变量,类似 xdrx_sysvar_push ,堆栈概念;同时完成 ActiveX 中的 ActiveSelectionSet 的初始化
...
(fy:end);_程序结束,恢复保存的系统变量至程序运行前状态,程序运行编组结束
以上代码就是 app.fas 中的部分,编译版可以在下方签名链接下载 |