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")這之中加入其他系統變數就可以了。
留言
張貼留言