Sponsored links

【AutoLISP グローバル変数】 グローバル変数とは?

Sponsored links
AutoLISP
Sponsored links

AutoLISPプログラムで使う変数は、”ローカル変数の宣言”をしなければ、コマンド終了後も変数内の情報が残り、その情報を使い回すことができます。

1つのコマンド/関数内だけではなく、広く使うので、ローカルの反対でグローバル変数です。

Sponsored links

予備知識

グローバル変数のメリット

ローカル変数は、(defun………….) の外からの影響を受けないし影響しないことがメリットです。

グローバル変数は逆に、(defun………….)の外でも、その変数に入った情報を使い回せることがメリットです。

注意点

変数名が同じだと上書きされます。

意図せず関係ないコマンドに必要な情報を変えてしまわないように、グローバル変数として使いたい物は、変数名が他と被らないように注意しましょう。

グローバル変数を使ったコマンド例

図形の色を変えるコマンドです。

(defun c:test1 (/ Obj)
  
  (if (null g00ChCol)
    (setq g00ChCol (acad_colordlg 1 nil)) ; 色選択ダイアログボックスを出して色をユーザ選択
  );if
  
   (setq Obj (car(entsel))) ; 色を変える図形をユーザ選択
   (command-s "._CHANGE" Obj "" "_P" "_C" g00ChCol "") ; コマンドで選択された図形を選択された色にする 
(princ))

コマンド名はtest1 です。

実行すると、色選択ダイアログボックスが出てきて、色を選び、選択した図形の色が選んだ色になります。

色番号はローカル変数宣言していないグローバル変数に情報を入れたので、情報は残ったままです。

2回目以降からは、色番号は最初に選んだものが使い回され、色番号ダイアログボックスが出てくること無く、図形を選ぶだけになり、最初に選んだ色に変わります。

さらに、他のコマンドで同じ情報を使い回すことができます

コチラのコマンドは、画層の色を変えるコマンドです。
コマンド名はtest2 です。

(defun c:test2 ( / Obj Ent Ly)
  
   (if (null g00ChCol)
    (setq g00ChCol (acad_colordlg 1)) ; 色選択ダイアログボックスを出して色をユーザ選択
  );if

  (setq Obj (car (entsel))) ; 図形をユーザ選択
      (setq Ent (entget Obj)) ;図形からDXY情報を得る
         (setq Ly (cdr (assoc 8 Ent))) ; 画層のグループコードから画層名を得る
  
  (command-s ".-LAYER" "C" g00ChCol Ly "" ) ;コマンドで選択された図形の画層の色を変える 

(princ))

色番号に関しては同じ変数名を使っていますので、test1 で変数に入れた情報をそのまま使えます。

実行すると、色番号の情報があれば、色選択ダイアログボックスが出てくること無く、先ほどの色に図形の画層の色が変わります。

AutoLISPの説明

色番号を入れる変数名は、グローバル変数でコマンド実行後も残るので、他の変数と被らないように工夫が必要です。

今回は、g00Col という名前にしました。

(if (null g00Col)
  (setq g00Col (acad_colordlg 1 nil))
);if

if を使って、
もし g00Colnil (何も情報が入ってない)なら、acad_colordlg を使って色選択ダイアログボックスを出して、ユーザ選択した色をg00Colに入れるようにしています。

2回目以降からは、g00Col に情報が入っているので、この部分は飛ばされて、色選択ダイアログボックスが出てきません。

グローバル変数の値を変えるには?

一度設定しても、後から変更したい。ということはあると思います。

このように、グローバル変数をリセットするコマンドを作るのも一つの方法です。

(defun c:test-reset ()
  
   (if g00Col
    (setq g00Col (acad_colordlg g00Col)) 
    (setq g00Col (acad_colordlg 1 nil)) 
  );if
  
(princ))

図形選択の時に色変更のオプションを付けることもできます。それはまた別記事で。

グローバル変数は、setq で定義しただけだと、図面ファイルを閉じた時にすべて消えます。後から開いたときでも、別の図面ファイルでも、同じ変数を使い回したい。というときに、パソコンに変数情報を保存しておく方法もあります。

まとめ

  • 汎用性がある情報は、グローバル変数に入れておいて使い回せる。
  • ローカル変数の宣言をしていなければ、グローバル変数で、コマンド実行後も変数の中の情報は残ったまま。
  • setq で変数に情報を入れただけだと、図面ファイルを閉じるとその変数情報は消える。

関連記事

色選択ダイアログボックスについてはコチラの記事を。

グローバル変数の対義で、一つのコマンド/関数内だけで使う変数、ローカル変数についてはコチラの記事を。

グローバル変数の保存を使ったサンプルコマンドです。

Comments