システム変数とエラー処理
こんにちは!
エカキオです!
今回の記事では、システム変数についてLispの中に組み込む方法と、途中でLispをキャンセルした時(エラー処理)の対応方法を解説していきます。
システム変数を利用することによって、実行中のLispの挙動であったり、設定を変更できます。
まずシステム変数について、簡単に解説致します。
システム変数とは?
システム変数というのは、簡単に言うとAutoCADの各オブジェクト設定です。
LTSCALE
OSNAP
DIMASSOC
etc...
変数という名称が付いていますので、この各変数の中に値が保存されています。
その中身を見るための関数はこちらです。
(getvar 〇)
○:変数名、" "で囲う必要があります。
例えば、
(getvar "LTSCALE")
これで"LTSCALE"の設定値が抽出されます。
変数に入れましょう。
(setq lt1 (getvar "LTSCALE"))
システム変数の値を変える
次にシステム変数の中身を変えていきます。
システム変数の値をセットすると覚えてください。
(setvar "LTSCALE" 150)
書き方はこうです。
これで、"LTSCALE"の値は150になりました。
Lispの中でシステム変数を変更する
Lispの中でシステム変数を使用する時の基本ルールは、
現状のシステム変数を保存(別の変数に入れておく)
↓
システム変数の値をセット
↓
Lispの最後に元のシステム変数の値を、システム変数に戻す。
例えば、
(setq lt1 (getvar "LTSCALE")) (setvar "LTSCALE" 150) ;〜〜〜〜ここでいろいろな処理 (setvar "LTSCALE" lt1)
という流れが基本となります。
エラー処理とは?
前述したLisp内でのシステム変数の処理ですが、最終的に元のシステム変数の値に戻す前にユーザーが「Esc」キーを押すか、処理にエラーが起きた時、システム変数の値が元の値に戻りません。
それでは、ユーザーが知らぬ間にシステム変数が変わっていってしまうので、
Lisp処理の途中で、なんらかの理由により終了した場合に実行される処理をエラー処理と言います。
;error関数 (defun error-sample (msg) (〇〇〇〇);エラー処理 (setq *error* test-error) ; エラー処理を元に戻す )
上記はエラーが起きた時に自動的に実行される関数を作りデフォルトのエラー処理(*error*)に上書きします。
「defun」のあとに「c:」をつけていませんが、Lispの中だけで使う分にはこれで構いません。
(setq test-error *error*)
↑「test-error」変数にデフォルトの「*error*」の処理を記しておく
(setq *error* error-sample)
↑「*error*」にerror-sampleの処理を書き換える
文章で見てもなんだかよくわからないですよね。でもこれは暗記してもらう他ないかもです。
書くタイミングなども、私はしばらく理解出来なかったので、
具体的な書き方、書き込む位置などの例を挙げて解説します。
(defun c:tameshi ( ) ;--------------------エラー処理設定 (defun error-sample (msg) (princ "¥n途中で終わったので、またやり直しです。再チャレンジ!") ;エラー処理 (setvar "ltscale" v1) (setq *error* test-error) ; エラー処理を元に ) ;--------------------エラー処理設定終わり ;--------------------前準備 (setq test-error *error*) ; 標準のエラー処理をtest-errorに保存 (setq v1 (getvar "ltscale")) ;元のシステム変数をv1に保存しておく (setq *error* error-sample) ;独自のエラー処理 error-sample を設定 ;--------------------前準備終わり ;--------------------実際の処理 (setq p1 (getpoint "1点目: ")) (setq p2 (getpoint p1 "2点目: ")) (setvar "ltscale" 500) (command "line" p1 p2 "") ;--------------------実際の処理終わり ;--------------------処理が無事終了した場合の処理 (setq *error* test-error) ; エラー処理を元に戻す (setvar "ltscale" v1) ; 元のシステム変数に戻す ;--------------------無事終了処理終わり );(defun c:tameshi〜 の終わりの括弧
いやぁ、長かった。
途中間違えてないか不安だ!笑
もちろん、途中コメントは消しても構いません。
今回例に使っている、(ltscale)はここではあまり意味はないです。
システム変数の例として使用しました。
まとめ
Lispを使用していく上で動作に影響してくるシステム変数、そしてシステム変数を変えることで忘れられないのが、エラー処理です。
もしエラー処理をしないと、知らぬ間に設定が変わりまくって元に戻らなくなって、苦い思いをします。
そうならないためには、システム変数を変えないLispを作るか、エラー処理をマスターしましょう。
それでは、この辺で。
エカキオ