図描きの備忘録

日々の業務の時間短縮。残業しないで帰る事を目指し、悪戦苦闘中。AutoCAD、Lisp、効率化、自動化、合理的、プログラミング、資産運用勉強中

Lisp入門 - 12 - システム変数とエラー処理

システム変数とエラー処理

こんにちは!

エカキオです!

今回の記事では、システム変数について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を作るか、エラー処理をマスターしましょう。

それでは、この辺で。

エカキオ


Related Posts Plugin for WordPress, Blogger...