5.ユーザー定義によるパラメトリックな部品の作成方法

(1)基本概念

? 外部関数は、LSS-G ファイルにおいては、

グループ名称=FILE(関数名称, パラメータ1, パラメータ2, ・・・・);

のコマンド行で定義されます。LSS-G ファイル時に、インタープリタがこのコマンド行を検出すると、外部関数(関数名称.exe)を起動し、パラメータに基づいて、具体的な形状を生成し、グループ名称で定義されたグループの下にリンクします。ファイル保存に際しては、具体的な形状は棄却され、上記と同じ形式のコマンド行だけが保存されます。ユーザーがパラメータを変更するような編集操作がその間に行われた場合には、変更されたパラメータが保存されます。

 ユーザーが[形状生成]、あるいは配置操作画面の中で、ユーザー定義のパラメトリック部品を選択した場合には、パラメータ入力用ダイアログ(関数名称_D.exe,? ユーザーが作成)が起動されます。OKで終了すると、次に、外部関数(関数名称.exe)が起動され、具体的な形状が生成します。

 ユーザーが編集操作で作成したデータについても、LSS-Gファイル保存に際しては、上記と同じ形式で保存されます。

 以上を実現するためには、ユーザーは、二つの実行形式(パラメータ入力用ダイアログ(関数名称_D.exe)、及び形状生成関数(関数名称.exe) )を作成し、ksim\bin にある ext.tab に登録する必要があります。

(2)用意すべき実行形式(*.exe)とその機能

a. パラメータ入力用ダイアログ (関数名称_D.exe)

 景観シミュレータから起動され、ダイアログにユーザーが入力を行うためのダイアログです。通常は、ダイアログ・ベースのプロジェクトを起し、適当なエディットボックス(数値入力)や、チェックボックス、ラジオボタン等を組み合わせます。暇があれば、ヘルプ等を付け加えると便利でしょう。

 メイン画面がオルソ系統(平面図・立面図等)の場合には、メイン画面でクリックされた点の座標を受け取ることができます。

? サンプル・ソースから出発して、適当に付け加えるのが簡便です。

 ダイアログの結果は、上記と同じ形式でファイル出力します。

b. 形状生成部(関数名.exe)

 この部分は、パラメータを受け取り、具体的に確定された形状を生成する機能です。コンソール・アプリケーションとして作成します。生成された形状は、LSS-G形式と同じフォーマットで、「関数名称.g」の名称で、テンポラリ・ディレクトリ(通常は ksim\bin)に作成します。

 特殊な場合として、既存の部品を選択するだけ、あるいは既存のパラメトリック部品のパラメータの一部をユーザーに選択させ、残りを固定値としたい場合等は、形状生成部を作成する必要はなく、ダイアログ部を作成するだけで充分です。一例として、サンプルに置いた string_D.exe は、数値を入力し、景観構成要素データベースに登録された数値(文字)の3次元形状を選択して、そのファイル名称を返すだけの関数です。

 グループ名称=FILE(ユーザーが選択した数字の形状を表すLSS-Gファイルの名称);

という行を返すだけなので、形状生成部は必要ありません。

 但し、このようにして作成した形状は、ユーザーが後からパラメータを変更することはできません。もしあとから変更するようにしたければ、

 グループ名称=FILE(数値指定関数名,数値);

という行を生成するようにし、別途形状生成関数として、引数として数値を受け取り、決定されたLSS-Gファイルを、

 グループ名称=FILE(個別の数値形状記述LSS-Gファイル名.geo);

というデータを返す、数値指定関数名.exe という実行形式を作成する必要があります。

(3)実行形式の登録

 以上の二つの実行形式を、書きの形式で、ext.tab に追加登録します。

 FILE(関数名称,パラメータ1の形式,パラメータ2の形式,・・・・);

パラメータの形式には、以下の種類があります。

  DOUBLE????? 浮動小数点数

??? INT???????? 整数

??? STRING????? 文字列

??? FILE??????? ファイル名称

??? FACE  ??? 定義済みの面

??? LINE   ?? 定義済みの線

??? GROUP ???? 定義済みのグループ

??? TIME  ??? システム時間

注)FACE, LINE, GROUP については、LSS−Gファイルの中でこれらを用いたパラメトリック部品が要求された場合に、それを引数として処理します。これらのラベルは、読込み終了後は棄却されるので、表示されているデータから引用することはできません。ファイル保存の際には展開されてしまいます。ファイル解析中で、これら形式が要求された場合には、仮のファイルを作成して面・線・グループを定義し、そのファイル名を関数に渡します。従って、予め面・線・グループを定義したLSS−Gファイルが存在する場合には、そのファイル名称を指定しても、正常に機能します。ダイアログをどうしても作成したい場合には、ファイル名称を指定するようにします(掃引体1面(SWEEP1)、掃引体2面(SWEEP2)などは、そのように処理しています。

[例1] 

FILE(SAMPLE,DOUBLE,DOUBLE,DOUBLE);

  これは、梁間・桁行・勾配の3つの浮動小数点数を引数とする、SAMPLE という名前の関数で、

 SAMPLE_D.EXE がダイアログ、

? SAMPLE.EXE が形状生成部です。

[例2]

?FILE(TIMESPHERE,DOUBLE,DOUBLE,DOUBLE,TIME);

 これは、中心座標X、Y、Zを引数とする球で、半径は時間に比例します。形状生成関数は、SPHERE.EXEと同じもの(コピーし、名前を変えただけ)です。会話部では、半径を指定せず、中心座標だけを指定します。

(4)ダイアログの詳細

・起動時のコマンドラインの受け取り

ダイアログを実行する関数(関数名称_D.exe)は、起動時にコマンド・ラインから、最低二つのパラメータを受取ります。

ファイル名称:入力されたパラメータを、LSS-G 形式に従って出力するファイル名称です。簡単には、出力のみに用いますが、ユーザーがOKで抜けて、景観シミュレータに制御が戻った時点でエラーが検出された時や、ユーザーが画面からパラメトリックな部品を選んで、パラメータの再設定を行おうとした場合には、設定済のパラメータがこのファイルに記入されていますので、ダイアログ開始時点で、このファイルを解析し、エディットボックス等の数値をこのデータに基づいて初期化します。

グループ名称:これから作成しようとするグループ名称として、システムが用意したデフォルト値であり、ユニークであることをシステムが保証しているものです。ダイアログにおいては、グループ名称の欄の初期値として用います。

データ交換用フラグファイル名:景観シミュレータのメイン画面で、オルソ系の表示(平面・立面)になっている状態で、ユーザーが画面をクリックすると、次に述べるデータ交換用データファイルにデータがセットされ、このファイルに1(1文字)がセットされます。この機能を使用する場合には、タイマー割込み等で、このファイルのフラグが建っているかどうか検査し、建っていればデータを入力してから、フラグをリセットし、必要なエディットボックス等に受取った値を表示します。

データ交換用データファイル名:上記と連動して、ユーザーがクリックした位置に対応する座標値が入力されます。

・起動時のパラメータの取り込み

 起動時に、前回ダイアログを開いた時の設定時、または既存パラメトリック部品の設定パラメータを初期表示すると便利なので、ダイアログの初期化の時点で、

 グループ名称=FILE(関数名称, パラメータ1, パラメータ2, ・・・・);

という文字列を解析し、パラメータを取り出して、エディットボックス等の初期設定を行います。

・メイン画面からの座標値の取り込み

? ユーザーがOKボタンを押した場合、エディットボックス等にユーザーが設定した数値を読取り、上記のLSS-G形式の1行を生成し、ファイル名で指定されたファイルに書き込み、正常終了します。ダイアログ部で、入力されたデータの正当性のチェックを行い、再入力を促し、正当であることを確認することは、後の処理の安全性を高め、形状生成部の負担を軽減する(最終的にはロード時間の短縮になる)でしょう。

・終了時処理

ダイアログ終了時に、exit関数を使用すると、その値が起動した側である景観シミュレータに返されます。シミュレータの側では、戻り値に対応して、以下のように動作します:

0:デフォルト終了。予期せぬエラーや、ダイアログが壊れた場合など。

1:OK終了。ユーザーがOKで終了した場合。

2:キャンセル終了。ユーザーがキャンセルで抜けた場合。

3−63:建設省予約(今後の一般的なインターフェースに使用。現在未定義)。今後、高度な制御等が必要になった場合に、一般的なルールとして使用します。

64−255:ユーザー定義

(5)形状生成の詳細

・起動時のパラメータの受取り

? 形状生成部(関数名称.exe)は、引数として、次のデータを受取ります:

関数名称sample.exe であれば、SAMPLEという文字列です。無視して結構ですが、手堅くはエラー検査を行います。Ext.tabへの誤った登録の検出等が考えられます。

パラメータ:関数に必要なパラメータが、必要個数これに続きます。

出力ファイル名sim.exe が、結果を出力するファイル名として求めた名称です。パラメータを受取った後、このファイルに形状を書出します。通常は、テンポラリ・ディレクトリの中に、「関数名称.g」という名前のファイルを作成します。

・形状生成

? 必要な座標計算等を行った上で、要求されたファイルを開いた後、生成した形状を記述するLSS-G コマンドを出力します。

? 通常は、ROOT=GROUP(); という行で始め、頂点の定義

?Cn=COORD(X,Y値,Z);

?Pn=VERTEX(C1);

に続いて、面の定義

? Fn=FACE(Pa,Pb,Pc…);

を行い、最後に、全ての面を、

? GROUP_FACE(ROOT,F1,F2,…);

というコマンドで、ROOTグループに関連づけます。無論、各部品にマテリアルやテクスチャ(但し、所定のディレクトリにデータが用意されていることが必要)を定義することもできます。また、別の既存のLSS-Gファイルやパラメトリック部品をサブ部品として引用することもできます。

・終了時処理:

?return n または exit( n )で結果を景観シミュレータに返します。以下の戻り値コードを用います。

?0:未定義のエラー

?1:正常終了

?2:引数の数が合わない場合

?3:出力ファイルが開かない場合

(6)時間に依存する部品の作成方法

?ダイアログ及び形状生成の作成方法は、通常の場合と同様です。但し、時間を示すパラメータは、ダイアログで用意する必要はありません。

?ext.tab に登録する際に、時間を表すパラメータの部分を TIME とすると、システムからこの形状生成関数を起動した場合に、この引数にシステムの現在時刻(単位:日)を代入します。また、ユーザーが[表示][経年変化]で、現在時刻を変更した場合には、システムが全ての時間に依存する外部関数をスキャンし、その全てについて、形状を再生成します。