概要 - AutoLISP ルーチンを自動ロードして実行する

 
 
 

起動時に AutoLISP ルーチンをロードし、作図セッション中、特定のときにコマンドや関数を実行します。

AutoCAD ベースの製品は、ユーザ定義が可能な 3 つのファイルの内容を自動的にロードします。この 3 つのファイルは、acad.lspacaddoc.lsp、および現在のカスタマイズ ファイルに関する MNL ファイルです。

既定では、acad.lsp ファイルはプログラムの起動時に、1 度だけロードされます。acaddoc.lsp ファイルはそれぞれのドキュメント(図面)が開かれるたびにロードされます。つまり、acad.lsp ファイルの読み込みはアプリケーションの起動ルーチンの一部であり、acaddoc.lsp ファイルの読み込みはドキュメント(図面)の初期化処理の一部であると考えることができます。これらの起動ファイルの既定の動作は、システム変数 ACADLSPASDOC の設定により変更できます。

これらのファイルのいずれかで、特殊な形式の S::STARTUP 関数を定義すると、図面が完全に初期化された直後に、このルーチンが実行されます。別の方法として、APPLOAD[アプリケーション ロード]コマンドの[スタートアップ登録]オプションを使用して、指定したアプリケーションを自動的にロードすることができます。この方法を使用すると、ファイルを編集する必要はありません。

起動ファイル acad.lspacaddoc.lsp は、AutoCAD ベースの製品に付属しているわけではありません。これらのファイルは、ユーザが作成して管理します。

重要:AutoCAD 2014 ベースの製品から、システム変数 SECURELOAD を 1 または 2 に設定している場合は、カスタム アプリケーションはセキュア モードでのみ機能することになりました。セキュア モードで動作している場合、プログラムはコードを含むファイルを信頼する場所からロードおよび実行するように制限されます。信頼する場所は、システム変数 TRUSTEDPATHS で指定します。詳細は、「概要 - 悪意のあるコードから保護する」を参照してください。

コマンドの自動ロード

AutoLISP ファイルをロードすると、コマンドを使用していなくても、ファイルのコマンド定義によってメモリが使用されます。AutoLISP の autoload 関数を使用すると、ルーチン全体をメモリにロードしなくても、コマンドを使用できるようになります。次のコードを acaddoc.lsp ファイルに追加すると、CMD1、CMD2、CMD3 が cmds.lsp ファイルから自動的にロードされ、コマンド NEWCMD が newcmd.lsp ファイルから自動的にロードされます。

(autoload "CMDS" '("CMD1" "CMD2" "CMD3")) 
(autoload "NEWCMD" '("NEWCMD"))

自動的にロードされるコマンドを、コマンド プロンプトに最初に入力した時点で、コマンド定義全体が関連ファイルからロードされます。AutoLISP は ObjectARX アプリケーション用に autoarxload 関数も提供しています。『AutoLISP リファレンス』の autoload および autoarxload を参照してください。

注: 名前が同じ AutoLISP アプリケーションのファイルは、ファイルの「更新日時」に基づいてロードされます。完全なファイル名(ファイル拡張子を含めて)を指定しない場合は、最新の更新日時を持つ LSP ファイルがロードされます。

ACAD.LSP ファイル

特定の AutoLISP ルーチンを常に使用する場合は、acad.lsp ファイルを作成すると便利です。AutoCAD を起動すると、サポート ファイル検索パスを使用して acad.lsp ファイルが検索されます。acad.lsp ファイルが見つかった場合、それがメモリにロードされます。

acad.lsp ファイルは、アプリケーション固有の起動ルーチン用に使用することを目的としているため、acad.lsp ファイル内で定義されているすべての関数と変数は、最初の図面でのみ有効です。すべての図面で使用できるようにするには、そのルーチンを acad.lsp ファイルから acaddoc.lsp に移動します。

acad.lspacaddoc.lsp の機能は、システム変数 ACADLSPASDOC で変更できます。システム変数 ACADLSPASDOC を 0(既定)に設定すると、acad.lsp ファイルがアプリケーション起動時に 1 度だけロードされます。1 に設定すると、acad.lsp ファイルは新しい図面を作成したとき、または既存の図面ファイルを開いたときに再ロードされます。

acad.lsp ファイルには、1 つまたは複数のルーチンの AutoLISP コードを格納できます。一連の load 関数呼び出しだけを格納することもできます。後者の方法の方が、修正が簡単なため適切です。次のコードを acad.lsp ファイルとして保存すると、ファイル mysessionapp1.lspdatabasesynch.lspdrawingmanager.lsp が、プログラムを起動するたびにロードされます。

(load "mysessionapp1")
(load "databasesynch")
(load "drawingmanager")
警告:予約済みの acad<リリース>.lsp ファイルは変更しないでください。オートデスクが提供する acad<リリース>.lsp ファイルには、リリースに特有の必要不可欠な AutoLISP 定義関数が含まれています。このファイルは、acad.lsp ファイルがロードされる直前にメモリにロードされます。<リリース> は、AutoCAD ベースの製品のリリースを表します。たとえば、acad2012.lsp は AutoCAD 2012 ベースの製品がロードするファイルです。

ACADDOC.LSP ファイル

acaddoc.lsp ファイルは、各ドキュメント(図面)の初期化に使用することを目的としています。このファイルは、新しい図面を開始するたびに(または、既存の図面を開くたびに)使用できる AutoLISP ルーチンのライブラリをロードしたいときに役に立ちます。

AutoCAD を起動すると、プログラムは、ライブラリ パスで acaddoc.lsp ファイルを検索します。このファイルが見つかると、メモリにロードされます。acaddoc.lsp ファイルは、システム変数 ACADLSPASDOC の設定に関係なく、常に各図面に対してロードされます。

ほとんどのユーザは、すべてのドキュメント ベースの AutoLISP ルーチンに対して 1 つの acaddoc.lsp ファイルを持つことになるでしょう。プログラムは、ライブラリ パスで定義されている順序で acaddoc.lsp ファイルを検索します。したがって、この機能を使用すると、各図面フォルダ内に異なる acaddoc.lsp ファイルを格納でき、特定の種類の図面や特定の作業用に特定の AutoLISP ルーチンをロードすることができます。

acad.lsp ファイルには、1 つまたは複数のルーチンの AutoLISP コードを格納できます。一連の load 関数呼び出しだけを格納することもできます。後者の方法の方が、修正が簡単なため適切です。次のコードを acaddoc.lsp ファイルとして保存すると、ファイル mydocumentapp1.lspbuild.lspcounter.lsp が、新しいドキュメントを開くたびにロードされます。

(load "mydocumentapp1")
(load "build")
(load "counter")
警告:予約済みの acad<リリース>doc.lsp ファイルは変更しないでください。オートデスクが提供する acad<リリース>doc.lsp ファイルには、リリースに特有の必要不可欠な AutoLISP 定義関数が含まれています。このファイルは、acaddoc.lsp ファイルがロードされる直前にメモリにロードされます。<リリース> は、AutoCAD ベースの製品のリリースを表します。たとえば、acad2012doc.lsp は AutoCAD 2012 ベースの製品がロードするファイルです。

MNL ファイルと AutoLISP メニューのカスタマイズ

カスタマイズ ファイルがロードされるときに、ファイル名がメニュー ファイルと同一の MNL ファイルが検索されます。このファイルが見つかると、メモリにロードされます。この機能を使用すると、ユーザ インタフェース要素の正しい動作に必要な AutoLISP 関数を確実にロードすることができます。

たとえば、既定のカスタマイズ ファイル acad.cuix がロードされると、ユーザ インタフェース要素が使用する多数の AutoLISP 関数が定義されたファイル acad.mnl もロードされます。MNL ファイルは、acaddoc.lsp ファイルの後にロードされます。

注:AutoLISP の command 関数を使用して、(command "menu" "newmenu") のような構文でカスタマイズ ファイルをロードすると、関連する MNL ファイルは、AutoLISP ルーチンが実行し終わるまでロードされません。
(command "menu" "newmenu")

(princ "Newmenu utilities… Loaded.")
(Princ)

この例のように、 princ 関数の呼び出しを使用してステータス メッセージを表示することができます。最初の princ が実行されると、コマンド プロンプト領域に次のメッセージが表示されます。

Newmenu のユーティリティ… がロードされました。

2 番目の princ で AutoLISP 関数が終了します。2 番目の princ 関数を呼び出さないと、上記のメッセージが 2 回表示されます。安全を期すために、 load 関数の呼び出しで、前述の onfailure 引数を指定することもできます。

S::STARTUP 関数: 初期化の実行

S::STARTUP 関数を定義すると、図面が初期化された後の必要なセットアップ操作を行うことができます。

起動 LISP ファイル(acad.lspacaddoc.lsp、MNL)は、図面が完全に初期化される前にメモリにロードされます。通常は、 command 関数を使用しない限り問題は発生しません。command 関数を使用すると、図面が初期化された後の動作は保証されません。

ユーザ定義関数 S::STARTUP acad.lspacaddoc.lspまたは MNL ファイルに含めると、この関数は、新しい図面を開始したときや既存の図面を開いたときに呼び出されます。このため、AutoLISP 起動ファイルに S::STARTUP の定義を含めると、セットアップ操作を実行できます。

たとえば、標準の HATCH[ハッチング]コマンドを、メッセージを表示した後に BHATCH[境界ハッチング]コマンドに切り替えるように変更したいときは、次のコードを含む acaddoc.lsp ファイルを使用します。

(defun C:HATCH ( ) 
  (alert "Using the BHATCH command!")
  (princ "\nEnter OLDHATCH to get to real HATCH command.\n")
  (command "BHATCH")
  (princ)
) 
(defun C:OLDHATCH ( ) 
  (command ".HATCH")
  (princ)
) 
(defun-q S::STARTUP ( ) 
  (command "undefine" "hatch") 
  (princ "\nRedefined HATCH to BHATCH!\n")
)

図面が初期化される前に、HATCH と OLDHATCH の新しい定義が defun 関数で定義されます。図面が初期化されると、 S::STARTUP 関数が呼び出され、標準の HATCH の定義が再定義されます。

注: S::STARTUP 関数を追加するには、 defun ではなく defun-q 関数を使用して定義する必要があります。

S::STARTUP 関数はいろいろな場所(acad.lspacaddoc.lsp、MNL ファイル、またはこれらのファイルからロードされるその他の AutoLISP ファイル)で定義できるため、以前に定義した S::STARTUP 関数が上書きされる可能性があります。

次の例に、起動関数が他の関数と一緒に確実に動作する 1 つの方法を示します。

(defun-q MYSTARTUP ( )

...独自の起動関数 ...

)
(setq S::STARTUP (append S::STARTUP MYSTARTUP))

上記のコードは、独自の起動関数を既存の S::STARTUP 関数のコードに追加し、次に S::STARTUP 関数を再定義することによって、独自の起動コードを追加しています。これにより、前から存在していた S::STARTUP 関数に関係なく正しく動作します。