チュートリアル: 新しいカスタム コマンドを作成し、システム変数でコントロールする(AutoLISP)

AutoLISP プログラミング言語を使用すると、独自のコマンドのような関数を作成し、システム変数の値を設定することにより、作図環境をコントロールすることができます。

AutoLISP を使用することで、標準の AutoCAD コマンドまたはサードパーティのユーティリティによって定義されたコマンドと対話するように、コマンド プロンプトからアクセスできる新しいコマンドを作成することができます。カスタム コマンドでは、command 関数を使用して標準の AutoCAD コマンドを使用することができます。または、カスタム コマンドで AutoLISP 関数を使用して、直接オブジェクトを操作することができます。開発者の多くは、複数の標準の AutoCAD コマンドを特定の順番で実行する AutoLISP 関数を作成します。

AutoLISP プログラムでは、システム変数の値を照会したり、変更することもできます。システム変数は、コマンドの動作や AutoCAD の環境に影響を与えます。

新しい関数を作成する

新しい関数は、defun AutoLISP 関数を使用して定義します。defun は「関数を定義する」という意味です。

defun 関数の構文と要素は、次のとおりです。

(defun function_name ([arguments] [/ local_variables ...]) expr ...)

見れば分かるように、1 番目の引数は、定義する関数の名前です。

defun 関数では、関数に引き渡すことができる引数のリストと、この関数「固有」のユーザ定義変数のリストを定義することができます。関数が有効である間だけ関数で使用できるユーザ定義関数を宣言するときは、必ず defun 式の一部としてローカル変数のリストにユーザ定義関数を追加してください。

次に、コマンド プロンプトまたはメッセージ ボックスにメッセージを出力するカスタム関数の例を示します。

(defun display-msg (msg mode / )
  (if (= mode 0)
    (prompt (strcat "\n" msg))
    (alert msg)
  )
 (princ)
)

カスタム display-msg 関数には、メッセージ(文字列)と、モード(0 または 1 の整数値)を指定します。この関数は、AutoCAD のコマンド プロンプトにコードを入力してから、次のいずれかを入力して関数を実行することでテストできます。

カスタム コマンドを作成する

カスタム コマンドは、defun 関数を使用して定義される関数ですが、特別な命名規則が使用されます。つまり、接頭辞として c: が使用されます。これにより、他の関数と区別されます。

引数を受け入れる関数を定義することはできますが、引数を受け入れるためのカスタム コマンドとして使用される関数は決して定義しないでください。カスタム コマンドとして定義される関数は、getXXX 関数、entsel 関数、nentsel 関数、ssget 関数を使用してユーザに入力を求める必要があります。

defun 関数の関数名を指定すると、このカスタム コマンドをコマンド プロンプトに対して入力したときに実行される AutoLISP 式を入力することができます。

次の手順で、「HELLO」という名前のカスタム コマンドを定義する方法を説明します。このコマンドは、ユーザに文字列値を要求し、次に入力された文字列をメッセージ ボックスに表示します。

  1. コマンド プロンプトに対して !msg·と入力し、[Enter]を押します。

    現在ユーザ定義変数 msg には値が割り当てられていないために、値 nil が返されるはずです。msg は、HELLO コマンドの一部として定義されるユーザ定義変数で、他のプログラムでは使用できないようにする必要があります。

  2. コマンド プロンプトに対して、次のコードを一行ずつ入力します。各行の終わりで[Enter]を押します。最後の行を入力すると、コマンド ウィンドウの履歴に値 C:HELLO が表示されるはずです。

    (defun c:hello ( / msg)
      (setq msg (getstring T "\nEnter a message: "))
      (alert msg)
    )

これで HELLO コマンドが定義されたので、コマンド プロンプトに対してコマンド名を入力することでこのコマンドを実行することができます。HELLO コマンドを実行するには、次の手順を実行します。

  1. コマンド プロンプトに対して、hello と入力します。

  2. 「メッセージを入力してください:」 というプロンプトに対して、This is my first AutoLISP command! と入力します。

    入力したメッセージを表示するメッセージ ボックスが表示されます。

    メッセージ ボックス: Windows

    メッセージ ボック: Mac OS

  3. メッセージ ボックスを閉じるには、[OK]をクリックします。

  4. コマンド プロンプトに対して !msg·と入力し、[Enter]を押します。

    予想どおり、値 nil が返されはずです。setq 関数を使用して、「メッセージを入力してください:」プロンプトに対して入力された値を msg 変数に割り当てても、変数の値は保持されません。なぜなら、これは C:HELLO 関数へのローカル変数として定義された変数だからです。C:HELLO 関数の defun 式内のローカル変数リストから msg を削除すると、msg 変数はグローバル変数として定義されるので、関数の実行が終了した後もこの値は保持されます。

コマンド プロンプトに対して直接式を入力する方が楽に AutoLISP を学習して使用することができますが、この便利さには欠点があります。図面内で定義する関数とユーザ定義変数は、図面を閉じるまではこの図面内からしかアクセスできません。このことは、次の操作を実行することで確認できます。

  1. 現在の図面で、前述の HELLO 関数を定義します(まだこのようにして定義していない場合)。

  2. 新しい図面を作成します。

  3. コマンド プロンプトに対して、hello と入力します。

    次のメッセージが表示されます。

    そのようなコマンド "HELLO" はありません。ヘルプを表示するには F1 キーを押してください。

作成した AutoLISP の式を拡張子が LSP のファイルに保存して、式を再利用したり、他の図面にロードできるようにすることができます。AutoLISP ソース(LSP)ファイルを作成、ロードする方法については、「チュートリアル: AutoLISP ファイルを作成、ロード、開く」を参照してください。

システム変数の値にアクセス、設定する

システム変数は、たとえばコマンドの動作をコントロールし、作図環境の設定を変更し、新しいオブジェクトの既定のプロパティ値を指定しますが、それだけではありません。次の関数を使用して、システム変数の値を照会し、設定することができます。

次に、システム変数 OSMODE (オブジェクト スナップ モード)の値を取得し、設定する方法を説明します。

  1. コマンド プロンプトに対して、(setq cur_osmode (getvar "osmode")) と入力します。

    システム変数 OSMODE の現在の値が返され、ユーザ定義変数 cur_osmode に割り当てられます。OSMODE からは整数値が返されますが、値は複数の「ビットコード」値の和です。たとえば、値は 35 は、端点(1)、中点(2)、交点(32)の定常オブジェクト スナップが有効であることを示します。

  2. コマンド プロンプトに対して、osnap と入力します。

    [作図補助設定]ダイアログ ボックスの[オブジェクトスナップ]タブが表示されます。このタブでは、どのオブジェクト スナップが有効であるかを確認することができます。次の図は、システム変数 OSMODE が値 35 に設定されている場合の[作図補助設定]ダイアログ ボックスを示しています。

    [作図補助設定]ダイアログ ボックス: Windows

    [作図補助設定]ダイアログ ボックス: Mac OS

  3. [作図補助設定]ダイアログ ボックスで、現在有効なオブジェクト スナップを変更し、[OK]をクリックします。

  4. コマンド プロンプトに対して (getvar "osmode") と入力します。

    システム変数 OSMODE の現在の値が返されます。

  5. コマンド プロンプトに対して、(setvar "osmode" cur_osmode) と入力します。

    システム変数 OSMODE の値が直前にユーザ定義変数 cur_osmode に割り当てた値に復元されます。

  6. 再度[作図補助設定]ダイアログ ボックスを表示します。オブジェクト スナップの設定が復元されているはずです。

注: 作図環境を変更する前に、システム変数の値を格納し、プログラムの終了前に復元する習慣を付けるとよいでしょう。