Sponsored links

【AutoLISP エラー処理】 コマンド関数定義の中で自作エラー処理関数を定義 システム変数編

Sponsored links
AutoLISP
Sponsored links

コマンド/関数を定義している中でエラー処理関数を定義することができます。

今回は、システム変数を初期値に戻す処理も入れた例です。

Sponsored links

予備知識

AutoLISPプログラム

今回は、図形の色を赤色に変えるコマンドのプログラム内に、エラー処理を入れます
コチラの記事で紹介したシステム変数CMDECHO とDYNMODEをコマンド実行時に変更して、エラー中断時には最初の設定に戻すようにします。

まずはAutoLISPプログラムから。

(defun c:test ( / *error* Objs Obj)

;-----------------------------------------
;エラー処理 
    (defun *error* (msg)
      (if OldCmdEcho (setvar "CMDECHO" OldCmdEcho)) 
      (if OldDynMode (setvar "DYNMODE" OldDynMode)) 
      (princ msg)
    (princ))

;----------------------------------------- 
;システム変数の変更と設定保存
  
   (setq OldCmdEcho (getvar "CMDECHO")) 
   (setq OldDynMode (getvar "DYNMODE "))
   (setvar "CMDECHO" 0)
   (setvar "DYNMODE" 3)
  
;-----------------------------------------
      
     (while T ; ここから
       (setq Obj (car (entsel))) ; 図形選択
       (command-s "._CHANGE" Obj "" "_P" "_C" "1" "") ;Objの図形を赤にする。 
     ) ;while ここまで繰り返す 
  
;----------------------------------------- 
;システム変数を初めの設定設定に戻す
(if OldCmdEcho (setvar "CMDECHO" OldCmdEcho)) 
(if OldDynMode (setvar "DYNMODE" OldDynMode))  
;----------------------------------------- 

(princ));defun

AutoLISPの説明

(defun c:test ( / *error* Objs Obj)

コマンド終了(中断)したら、元のエラー処理に戻るように、*error*を ローカル関数にします。

(defun *error* (msg)
(if OldCmdEcho (setvar “CMDECHO” OldCmdEcho))
(if OldDynMode (setvar “DYNMODE” OldDynMode))

(princ msg)
(princ))

コマンド関数 test を定義している中で、エラー処理を定義します。
*error*を上書きしていますが、ローカル関数なので、コマンドが終わればエラー処理は元に戻ります。

(if 変数名 を付けて、”もし変数に値があれば設定する”とした方が、万が一、変数に値が入っていなかったり、変数を保存する前にエラー処理が実行されるようなことが合った場合、更なるエラーを引き起こさなくて安心です。

OldCdmEchoは、システム変数 CMDECHO をこれから入れるシステム変数です。
この部分全体はエラー中断されたときに実行されるので、OldCdmEchoに値を入れる前にあっても大丈夫です。

(setq OldCmdEcho (getvar “CMDECHO”))
(setq OldDynMode (getvar “DYNMODE “))

これから値を変更するシステム変数の値を変数に入れておきます。

(setvar “CMDECHO” 0)
(setvar “DYNMODE” 3)

そして、システム変数の値を、このコマンド実行時に使いたい値に変更しました。

(while T…….)

このコマンドのメインの部分です。
今回は、図形を選択して、色を赤に変えています。

(if OldCmdEcho (setvar “CMDECHO” OldCmdEcho))
(if OldDynMode (setvar “DYNMODE” OldDynMode))

正常に終了した時に、システム変数を元に戻します。

このコマンドでは、この上で、(while T ….. ) で無限に繰り返しているので、この部分に到達することは無いので省略してもOKです。

Jagaimo
Jagaimo

よく使うエラー処理のパターンは、システム変数の保存と戻すのも含めて、いろんなコマンドで使いまわせるように、別の自作関数にする方法もあります。

まとめ

  • コマンド/関数を定義している中でエラー処理関数を定義することができる。
  • 今回は、システム変数の値を戻すエラー処理を、コマンド定義の中でした例。

関連記事

エラー処理のドリルです。

コマンド関数の定義内にエラー関数定義を入れてたコマンドサンプルです。

Comments