AutoLISP 在設定及恢復系統變數上的處理

在程式處理時經常會使用到系統變數
尤其最常用的是CmdechoOsmode...等,
通常會在程式開始處保存原有系統變數值,
在程式結束處恢復原有系統變數值。
例如:
(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")這之中加入其他系統變數就可以了。


留言

這個網誌中的熱門文章

AutoCAD 填充線(剖面線)樣式簡易製作產生器

AutoCAD 如何自訂線型教學

AutoCAD 動態圖塊-如何在所有可見性顯示或隱藏