Visual LISP のプロジェクト機能を使おう
AutoLISP でプログラムを書き始めていくつかの新しいコマンドを作ってみると、どちらにも共通する部分が出てくることが判ります。これをそれぞれのソースコードのファイルに記述するのは、コードのメンテナンスでもプログラムサイズの面でもムダの多いやり方です。そこで、共通部分を関数として切り出して、それぞれのコマンドから一つの関数を共有して使うようにすることが自然な方法です。
共通の関数は、元のコマンドのソースコードとは別のファイルに移します。関係する関数のソースコードは一つのファイルにまとめてしまわないで、一つの機能、一つの関数、一つのファイルの原則で分けられているべきです。共通の関数が増えていくと関連するファイルが増えていき、今度はファイルの管理が面倒にも思えます。扱うファイルの増加に、人によってはこの原則は過激なものに思えるかもしれませんが、今回は関連する複数のソースコードファイルをプロジェクト機能で手軽に管理する手順を取り上げます。
共通部分の共通関数化、関数ごとのファイルの分割といった考えを進めていくとモジュールや関数ライブラリといったアイデアが浮かびます。そして、それらとプロジェクトで自作した関数を合わせて【独自の名前空間 VLX アプリケーション】として仕上げ、最終的にどのような環境の AutoCAD でも使用可能なアプリケーションプログラムとする手順を構築するのが目標です。今回のプロジェクト機能はその第一歩です。
プロジェクトフォルダの準備
他の最新の開発環境ではソフト側で段取りを整えてくれますが、Visual LISP は少し古くさいためか、まずプロジェクトフォルダを自分で作成してその中に自分で書いたソースコードを収めて行くこととします。プロジェクトフォルダの中には、コンパイルする際に自動的に作成される一時ファイルを入れるためのフォルダも作成しておきます。

今回の例では、「VisualLISP」というフォルダの下に「project」というフォルダを作成し、この中にプロジェクトフォルダを作っていくこととします。「myProject01」がプロジェクトフォルダで、この中に今回のプロジェクトに関連する LISP のソースコードを収めます。同じところにさらに「temp」というフォルダを作っておき、コンパイラが作成する一時ファイルの格納場所にします。一時ファイルはコンパイラが使用するもので、基本的に人の目に触れる必要はありません。
プロジェクトファイルの作成
プロジェクトフォルダの準備ができたら、プロジェクトファイルを作成します。
- Visual LISP のメニューから【プロジェクト】>【新規プロジェクト】を選択します。
- 表示されたダイアログで、プロジェクトファイルの保存先とプロジェクトファイル名を指定します。プロジェクトファイル名は、複数のソースコードをコンパイルする際、出力を一つにまとめるオプションを選択するとそのファイル名にも使われます。
今回は、先ほどの「myProject01」フォルダに、「myApp01」という名前のプロジェクトファイルを作成することとし【保存】ボタンを押します。 - 続けて、プロジェクト設定を指定する【プロジェクトのプロパティ】ダイアログが表示されます。最初は【プロジェクトファイル】タブが表示されてプロジェクトに含めるソースコードを指定する内容となっていますが、まだコードは書いていないので【作成オプション】タブに切り替えてプロジェクトの設定を行います。
- 【作成オプション】タブでは、【Fasフォルダ】と【テンポラリフォルダ】の内容を先の一時フォルダの保存先「temp」フォルダを指すようにします。他には【ファイル合成モード】を【すべてに 1 モジュール】にしておくと、コンパイルした際に複数のソースコードの出力をプロジェクトファイルと同じ名前の一つの FAS ファイルにまとめてくれますので、この一つの FAS ファイルでプログラムを使用することもできます。
- 【作成オプション】タブの他のオプションは触る必要はありません。【OK】ボタンを押すとダイアログが終了してプロジェクトファイルが作成されます。
- 【プロジェクトのプロパティ】ダイアログが消えると、代わりにプロジェクトのウィンドウが表示されます。まだ【プロジェクトファイル】が登録されていないので、中身は白い空欄です。





【プロジェクトのプロパティ】の内容を変更したくなったら、いつでもプロジェクトウィンドウの【プロジェクトのプロパティ】ボタンで変更することができます。新しくプログラムファイルを作成するたびに、【プロジェクトのプロパティ】ダイアログの【プロジェクトファイル】タブからファイルをプロジェクトに追加していってください。【プロジェクトファイル】の順番は AutoCAD にロードされる順番を表しています。順番によってはロード時にエラーになる場合もあるので、【上へ】【下へ】ボタンで調整してください。
プロジェクトウィンドウを表示する/消す
プロジェクトウィンドウの右上の【×】ボタンを押すとプロジェクトウィンドウは消えます。また Visual LISP のメニュー【プロジェクト】から下部に並ぶプロジェクト名を選択すると、再びプロジェクトウィンドウが表示されます。
これらの操作はプロジェクトウィンドウの表示/非表示を変えているだけで、Visual LISP 内ではプロジェクトは開かれたままの状態であることに留意してください。
プロジェクトを開く/閉じる

プロジェクトが開かれている間は、関連する【プロジェクトファイル】は Visual LISP が監視しています。そのためファインダーなどからファイル名を勝手に変えようとすると 警告を受けたりします。
Visual LISP は複数のプロジェクトを同時に開いておくことができます。プロジェクトを閉じるには、まず対象をアクティブなプロジェクトにします。具体的には【プロジェクト】メニューから目的のプロジェクトを選択します。既にアクティブなプロジェクトの場合は、プロジェクト名の左にチェックマークが付いています。アクティブプロジェクトを確認したら、【プロジェクト】>【プロジェクトを閉じる】を選択します。
改めてプロジェクトを開くには、Visual LISP のメニュー【プロジェクト】>【プロジェクトを開く】を選択します。
プロジェクトをロードする
一つ関数を作るたびに一つのファイルに保存し、プロジェクトに登録します。

一通りプログラムが書け【プロジェクトファイル】に登録したら、プロジェクトウィンドウの【ソースファイルをロード】ボタンを押すと、すべての【プロジェクトファイル】が AutoCAD にロードされます。関連するファイルが増えても必要な関数のロードのし忘れが起こらないのがプロジェクト機能の最大のメリットです。プログラムがロードされたら動作テストを行い、修正があったら再び【ソースファイルをロード】ボタンで上書きロードを行います。

ロードする前に編集中のソースコードをファイルに保存するようにしてください。最新の AutoCAD では【ソースファイルをロード】しようとすると未保存のソースコードを保存するか確認を求めてきますが、古いものは編集はしたが保存されていないファイルをロードしようとしてエラーとなる場合があります。テストを繰り返しながら、プロジェクトに一つ二つと独自のコマンドを作成して追加していきます。
最初に述べたとおり共通する関数は独立した別のファイルにしてプロジェクトに登録する以外に、例え共通と言えなくても、一つの機能、一つの関数、一つのファイルの原則で別々のファイルに分割して管理することをお勧めします。本来、関数はその扱っている問題の抽象化レベルに応じた一つの機能で完結しているように構築していくのが良いプログラミングの抽象化です。ここでいう「問題に応じた抽象化レベル」とは、例えば「実数のプラスマイナスを逆にする関数」という低レベルの抽象化に対して、それをベースとしたより抽象化レベルの高い「ベクトルの向きを反転させる関数」という視点の変化を指します。また、いろいろなケースでパーツとして再利用できるように考えることによって、関数に要求される独立した機能が整理され見通しの良いプログラムとなります。そこで、機能に応じた関数ごとにファイルが分かれていると、いろいろな目的に対して機能を組み合わせ、すなわち関数のファイルを組み合わせる事ができます。しかし、その原則を貫くと関連ファイルの数が Visual LISP のプロジェクト機能でも煩雑に感じるほど増えてくるのも現実です。これを緩和するため関数ライブラリを構築する手段を考える必要がありますが、稿を改めて紹介したいと思います。また、プロジェクトからソースコードをコンパイルしてロードすることもできますが、コンパイルの手順については最終的な【VLX アプリケーション】の作成の段で行いたいと思います。