AutoLISP 在設定及恢復系統變數上的處理
在程式處理時經常會使用到系統變數,
尤其最常用的是
通常會在程式開始處保存原有系統變數值,
在程式結束處恢復原有系統變數值。
例如:
但是程式的過程中,
如果發生錯誤導致程式中斷,
會發生系統變數值沒有恢復的情形,
所以會應用到在錯誤處理時用的錯誤處理函數(*error*)上加入恢復系統變數值。
例如:
但是系統變數很多時,
除了程式碼變長以外,
在變數也會變多,
因此會引起一些不便。
可以用下面方法解決這類的問題:
使用上面這方法,
想要加入更多系統變數,
只要在
尤其最常用的是
Cmdecho
、Osmode
...等,通常會在程式開始處保存原有系統變數值,
在程式結束處恢復原有系統變數值。
例如:
(defun c:test ( / oldlayer oldsnap oldpick) ;|程式開始-保存原有系統變數|; (setq oldlayer (getvar "clayer")) ;目前圖層) (setq oldsnap (getvar "osmode")) ;(儲存目前的抓點設定) (setq oldpick (getvar "pickbox")) ;(儲存目前的選取框大小值) ;|程式開始-修改系統變數|; (setvar "clayer" "123") (setvar "osmode" 0) (setvar "pickbox" 5) ;|程式過程....|; ;|程式結束-恢復原有系統變數|; (setvar "clayer" oldlayer) (setvar "osmode" oldsnap) (setvar "pickbox" oldpick) (princ) )
但是程式的過程中,
如果發生錯誤導致程式中斷,
會發生系統變數值沒有恢復的情形,
所以會應用到在錯誤處理時用的錯誤處理函數(*error*)上加入恢復系統變數值。
例如:
(defun c:test ( / *error* oldlayer oldsnap oldpick)
(defun *error* (err) ;|程式錯誤時-恢復原有系統變數|; (setvar "clayer" oldlayer) (setvar "osmode" oldsnap) (setvar "pickbox" oldpick) (princ (strcat ";錯誤:" err)) ) ;|程式開始-保存原有系統變數|; (setq oldlayer (getvar "clayer")) ;目前圖層) (setq oldsnap (getvar "osmode")) ;(儲存目前的抓點設定) (setq oldpick (getvar "pickbox")) ;(儲存目前的選取框大小值) ;|程式開始-修改系統變數|; (setvar "clayer" "123") (setvar "osmode" 0) (setvar "pickbox" 5) ;|程式過程....|; ;|程式結束-恢復原有系統變數|; (setvar "clayer" oldlayer) (setvar "osmode" oldsnap) (setvar "pickbox" oldpick) (princ) )
除了程式碼變長以外,
在變數也會變多,
因此會引起一些不便。
可以用下面方法解決這類的問題:
(defun c:test ( / *error* e_lst) (defun *error* (err) ;|程式錯誤時-恢復原有系統變數|; (mapcar 'eval e_lst) (princ (strcat ";錯誤:" err)) ) ;|程式開始-保存原有系統變數|; (setq e_lst (mapcar (function (lambda (n) (list 'setvar n (getvar n)))) '("clayer" "osmode" "pickbox"))) ;|程式開始-修改系統變數|; (setvar "clayer" "123") (setvar "osmode" 0) (setvar "pickbox" 5) ;|程式過程....|; ;|程式結束-恢復原有系統變數|; (mapcar 'eval e_lst) (princ) )
使用上面這方法,
想要加入更多系統變數,
只要在
'("clayer" "osmode" "pickbox")
這之中加入其他系統變數就可以了。
留言
張貼留言