カスタムライブラリ

概要

FlexSimを使用すると、標準ライブラリセットに加えて、特殊ライブラリを作成して設定できます。これらはユーザーライブラリと呼ばれます。オブジェクトにカスタム定義機能を作成してそれらのオブジェクトをライブラリに追加し、モデルの他の部分や他のモデルで使用できます。これらのライブラリを保存し、後で他のプロジェクトにロードできます。新しいモデルを作成したとき、またはライブラリをロードしたときにモデルに自動的にインストールされるオブジェクトのセットをライブラリに定義することもできます。

[ファイル]メニューから新しいユーザーライブラリの作成や、ユーザーライブラリを開くことができます。

カスタムライブラリ(ユーザーライブラリ)のメカニズムは、多くの分野で柔軟に操作できます。ユーザーライブラリの最も広く使用されている機能は、カスタマイズされたオブジェクトのモデルでの再利用ですが、ユーザーライブラリの機能はこれだけではありません。ユーザーライブラリを使用して、カスタムオブジェクトとデータのモデルへの自動インストール、オブジェクトとデータのメインプロジェクトとビューツリーへのインストール、アイコングリッド内のオブジェクトがモデルにドロップされたときのコードの実行などができます。これらの機能はすべて、ユーザーライブラリ機能の内部の2つのメカニズムから行われます。1つはdroppathとdropscriptのメカニズムです。このメカニズムにより、オブジェクトがそのモデルにドロップされたときの動作をカスタマイズすることが可能になります。もう1つは自動インストールメカニズムです。このメカニズムにより、ユーザーが新しいモデルの作成やモデルを開くなどの操作を行ったときに、オブジェクトやデータをインストールすることが可能になります。このトピックでは、これら2つのメカニズムについて詳しく説明します。

カスタムライブラリにオブジェクトを追加する

ユーザーライブラリに追加できるオブジェクトにはいくつかのタイプがあります。最も一般的なタイプは、カスタムモデリング状況に合わせてプロパティを変更したプロセッサやキューなどの標準オブジェクトです。基本FRオブジェクトや基本TEオブジェクトを使用して始めから開始し、カスタムの動作を実装してライブラリに追加することもできます。もう1つの方法は、VisualToolをサブモデルのコンテナとして使用し、サブモデル全体をライブラリに追加することです。これらのタイプのオブジェクトをユーザーライブラリに追加するには、3Dモデルビューでオブジェクトを右クリックし、[編集]、[ユーザーライブラリに追加]の順に選択します。

ユーザーライブラリをすでにロードしている場合は、それらのライブラリのリストが右クリックメニューに表示されます。

次のオブジェクトを追加することもできます。

  • GUI
  • グローバルテーブル
  • フローアイテム
  • ユーザーコマンド(カスタムライブラリ向け)

この機能には、これらの各オブジェクトを編集するウィンドウからアクセスできます。次の図は、ライブラリにGUIを追加するGUIエディタのメニューオプションを示しています。

ライブラリオブジェクトを編集する

オブジェクトがライブラリに追加されると、そのオブジェクトのコピーが作成され、ライブラリに入れられます。つまり、ライブラリに追加されると、元のオブジェクトへの関連付けがなくなります。これはコピーであるため、元のオブジェクトとは別に単独で変更できます。

ユーザーライブラリは、ユーザーライブラリノードのメインツリーに格納されています。

ライブラリアイコングリッドの右クリックメニューからライブラリオブジェクトのプロパティにアクセスすることもできます。

ライブラリを保存および削除する

ユーザーライブラリを保存または削除するには、ライブラリアイコングリッドのユーザーライブラリの横にある矢印をクリックします。

ドロップスクリプトとドロップパス

droppathとdropscriptのメカニズムを使用すると、オブジェクトがモデルにドロップされたときの動作をカスタマイズできます。これを行うには、ユーザーライブラリにカスタムオブジェクトを作成してから、「dropscript」または「droppath」のいずれかの属性をオブジェクトに追加し、dropscriptまたはdroppathのデータを指定します。

Dropscript

dropscript属性を追加すると、dropscriptノードがflexscriptとして実行され、ドロップに関する情報を提供する値がflexscript関数に渡されます。

dropscript関数内では、次の5つのアクセス変数を取得できます。

  • param(1) - ドロップされたオブジェクト。ユーザーがモデル内の空白領域にドラッグした場合、この変数は0またはNULLになります。このような場合は、通常、ユーザーがモデルにドロップしようとしていると想定できます。ただし、常にそうであるとは限りません。たとえば、VisualToolのように、ユーザーはモデルの部分空間を表示している3Dビューにオブジェクトをドロップすることがあります。この場合に安全なドロップを確保するには、ビューのビューフォーカスをドロップポイントとして使用する必要があります(param(5).find(">viewfocus+"))。
  • param(2), param(3), param(4) - それぞれドロップのx位置、y位置、z位置。param(1)がNULLの場合、これはモデル空間(またはビューのビューフォーカスの空間)内の位置です。param(1)がNULLでない場合は、param(1)内の位置です。
  • param(5) - オブジェクトがドロップされたビューウィンドウ。node(">viewfocus+", param(5))を使用してビューのビューフォーカスにアクセスします。
  • 戻り値 - dropscript関数では、作成したオブジェクトへの参照も返す必要があります。これにより、FlexSimは、C++ノードが作成されているかどうかを確認し、作成されている場合は、次にモデルを実行するときにコンパイルする必要があることを通知するフラグを設定するなどの追加処理を実行できます。

dropscriptのメカニズムにより、ユーザーライブラリの究極の柔軟性が実現します。このメカニズムを標準的な方法で使用すると、通常のオブジェクトのドロップなどを実行できますが、ドロップされたオブジェクトを初期化するための追加コードを実行することもできます。また、非標準的な方法で使用することも可能です。たとえば、コンベアベルトに湾曲部分や直線部分を追加したり、ラックオブジェクトにレベルやベイを追加したりできます。また、オブジェクトのトリガーへのコードの追加や、オブジェクトの特定のパラメータの設定もできます。さらに、オブジェクトへの衝突球の追加や、モデルのツールフォルダへの一連の機能の追加も可能です。可能性は無数にあります。

dropscriptノードの使用例については、を参照してください。

Droppath

droppathメカニズムは間接的な手法です。このメカニズムを使用すると、アイコンがモデルにドロップされたときにドロップする別のオブジェクトを参照できます。このメカニズムは、通常は自動インストール機能と共に使用されますが、アイコングリッド内のアイコンと共に使用することもできます。droppathオブジェクトの作成方法は、ドロップスクリプトを作成する場合と同じです。ライブラリにオブジェクトを追加してオブジェクトデータを付与しますが、今回は「droppath」という属性を付与します。ノードをflexscriptに切り替える必要はありませんが、droppath属性にテキストデータを付与し、ドロップする必要がある別のオブジェクトへのパスをテキスト内に指定します。

たとえば、droppath属性に「MAIN:/project/library/NetworkNode」というテキストを指定できます。これにより、オブジェクトのアイコンをモデルにドラッグしたときに、効率的にネットワークノードが作成されます。なぜネットワークノードをユーザーライブラリに追加するだけでないのか、なぜネットワークノードを通常のライブラリに移動して、そこからドロップするだけではないのかと思われるかもしれません。前者の問いに対する答えは、このユーザーライブラリを長期間使用する予定がある場合は、ネットワークノードに将来のバージョンのFlexSimと互換性を持たせた方がよいということです。新しいバージョンが登場するたびにユーザーライブラリを更新することなく、最新バージョンのネットワークノードを何でもドロップすると考えられるかもしれません。また、通常のライブラリにすでにデータがある場合に、ユーザーライブラリに同じデータを置くのはなぜでしょうか。後者の問いに対する答えは、ユーザーがオブジェクトを頻繁に使用する場合は、ネットワークノードをドロップ可能なアイコンとしてライブラリ内に置いておくと便利であるということです。これにより、必要なマウスのクリック数が減ります。

droppathは、絶対パス MAIN:/project/library/fixedresources/Processorまたは相対パス..>Processorのいずれかです。

自動インストール

自動インストールメカニズムを使用すると、ユーザーライブラリが新しいモデルの作成やモデルを開くなどの特定のアクションを実行したときに、モデルにオブジェクトや機能をインストールできます。自動インストールは、FlexSimのユーザーインターフェイスから次のオブジェクトに対して使用できます。

  • GUI
  • グローバルテーブル
  • フローアイテム
  • ユーザーコマンド(カスタムライブラリ向け)

カスタム自動インストールを作成するには、ユーザーライブラリオブジェクトに特別なノードを追加します。有効なノード名の具体的なセットは次のとおりです。

  • newmodelinstall - このノードは、ユーザーが新しいモデルを作成したときにインストールされます。ライブラリがロードされたときにもインストールされます。
  • startupinstall - このノードは、ユーザーが起動時にロードするライブラリとして指定したライブラリがロードされたときにインストールされます。
  • loadinstall - このノードは、ライブラリがユーザーによって明示的にロードされたときにインストールされます。
  • openmodelinstall - このノードは、ユーザーが既存のモデルを開いたときにインストールされます。このノードを使用すると、モデルにライブラリのコンポーネントが含まれているかどうかを確認し、含まれていない場合は、それらのコンポーネントをインストールできます。また、モデル内のコンポーネントが以前のバージョンのユーザーライブラリからインストールされたものである場合は、それらのコンポーネントを更新することもできます。

ライブラリアイコングリッドをカスタマイズする

カスタムライブラリのオブジェクトにはいくつかの属性を追加でき、それらの属性はライブラリアイコングリッドでのオブジェクトの表示方法に影響します。

ピクチャ

picture属性では、アイコングリッドに表示する画像へのパスを指定します。パスを空白のままにすると、オブジェクト名のみが表示されます。オブジェクトにプロセッサ画像を付与するには、picture属性に次のパスを指定します。

bitmaps\processorpicturesmall.png

picturealignleftノード値を変更することによって、左揃えを指定することもできます。

アイコングリッドの幅と高さ

ライブラリアイコングリッド内のアイコンのサイズを指定できます。「cellwidth」と「cellheight」という名前のライブラリ属性を付与します。各属性には、アイコングリッド内の1つのアイコンの幅と高さをピクセル数で示す数値が含まれている必要があります。

モデルライブラリノード

モデルには、ユーザーコマンド、グローバル変数、グローバルマクロなど多数のファセットを追加できます。その定義は、ユーザーから「見えない」ようになっているため、[ユーザーコマンド]ウィンドウや[グローバル変数]ウィンドウなどに表示されません。これらはライブラリの構造を参照することもできます。そのため、更新時にモデルに内容を継続的にコピーする必要はありません。これを行うには、「ModelLibraries」という名前のノードをモデルのToolsフォルダに追加し、そのサブ構造にさまざまなデータを与えます。この機能をモデルの一部にするためにカスタムライブラリをロードする必要はありませんが、これはおそらくユーザーライブラリで最もよく使用される機能であるため、このトピックに情報を記載しています。

この機能を作成するには、model/Toolsにノードを追加し、そこに「ModelLibraries」という名前を付けます。そのノードの内部に別のノードを追加し、そのノードにライブラリの名前(「MyLib」)を付けます。そのノードの内部には、追加可能なノードがいくつかあります。それらのノードの名前は、それぞれの意味をFlexSimに定義します。名前と意味は次のとおりです。

commands

「commands」という名前のノードを追加すると、そのノードの中にコマンドを置くことができます。これらのコマンドは、ユーザーが呼び出すことができ、コマンドのドキュメントに記載されますが、[ユーザーコマンド]ウィンドウには表示されません。各コマンドの構造は、model/Tools/UserCommandsの構造とまったく同じにします。

commandspath

「commandspath」という名前のノードを追加し、コマンドの定義を保持する別の場所へのパスを指定するテキストデータを付与できます。この場合、パスの宛先の構造は、model/Tools/UserCommandsの構造とまったく同じにします。これにより、コマンド定義をユーザー定義ライブラリに残し、このノードでそれを参照するだけで済みます。

globalvariables

「globalvariables」という名前のノードを追加し、Tools/GlobalVariablesのサブ構造と同じサブ構造を付与することで、[グローバル]変数ウィンドウからは「見えない」ものの、エンドユーザーが使用できる追加のグローバル変数を定義できます。

globalvariablespath

commandspathと同様に、グローバル変数が定義されている場所をリダイレクトできます。

fsmacros

ここでは、「fsmacros」という名前のノードを追加し、複数の#defineマクロを使用してそのノードにテキストデータを付与できます。これらのマクロは、ユーザーに表示され(青色)、オートコンプリートヒントのオプションとして追加されます。

fsmacrospath

commandspathと同様に、flexscriptグローバルマクロが定義されている場所を「fsmacrospath」オプションでリダイレクトできます。

binaries

「binaries」という名前のノードを追加し、FlexSimのコンパイル時にリンクする追加の.libファイルまたは.objファイルのリストを指定するテキストデータを付与できます。これは、コンパイルする必要があるC++トグルコードがある場合、またはエンドユーザーがコンパイル済みの機能にアクセスできるC++コードを定義することを期待する場合にのみ必要です。このテキストは、C++リンカーフェーズ中に[その他のライブラリ依存関係]フィールドに追加されます。リンカーのライブラリパスは、FlexSimのインストールディレクトリにある\program\system\libとして指定されているため、FlexSimのライブラリディレクトリにあるlibファイルとリンクするには、..\..\..\libraries\MyLib..といったパスを指定します。

binariespath

commandspathと同様に、リンカーオプションが指定されている場所を「binariespath」オプションでリダイレクトできます。

triggers

特定のポイントで起動するトリガーをいくつか追加することもできます。これを行うには、ノードを追加し、そのノードに「トリガー」という名前を付け、そのトリガーノードにさまざまなノードを追加します。

有効なトリガーは次のとおりです。

  • OnModelPreOpen - モデルツリーがロードされた直後とモデル初期化コードが起動する前に起動します。
  • OnModelOpen - モデルが開かれ、すべての初期化コードが完了した後に起動します。
  • OnModelPreSave - モデルがファイルに保存される直前に起動します。
  • OnModelSave - モデルがファイルに保存された直後に起動します。
  • OnLoadState - 状態のロードが実行されたときに起動します。
  • OnSaveState - 状態の保存が実行されたときに起動します。
  • OnRunStart - ユーザーが[実行]ボタンを押すたび、go()コマンドが呼び出されるたびに起動します。
  • OnRunStop - ユーザーが[停止]ボタンを押すたび、stop()コマンドが呼び出されるたびに起動します。
  • OnRunStop - ユーザーが[リセット]ボタンを押すたび、resetmodel()コマンドが呼び出されるたびに起動します。
  • OnPostCompile - ユーザーがモデルをコンパイルした後に起動します。

次の例は、カスタムライブラリの使用方法を示しています。

Dropscriptの例

[ファイル]、[新しいユーザーライブラリ]に移動して、新しいユーザーライブラリを作成します。ライブラリアイコングリッドで新しく作成されたユーザーライブラリの横にある下向きの矢印をクリックし、[ツリーをチェック]を選択します。

空のツリーが表示されます。

ライブラリを右クリックして[ノード]、[挿入]の順に選択するか、ライブラリを左クリックしてEnterキーを押して、ライブラリに新しいオブジェクトを挿入します。プラス記号のボタンを押してユーザーライブラリツリーを展開し、作成したノードを表示します。このノードに「Custom」という名前を付けます。ノードを右クリックして[ノード]、[オブジェクトデータを追加]の順に選択するか、ノードを左クリックしてOキーを押して、ノードにオブジェクトデータを追加します。矢印ボタンをクリックしてオブジェクトを展開します。次に、オブジェクトノードをクリックし、Enterキーを押して、属性ノードを挿入します。この属性ノードに「dropscript」という名前を付けます。ツリーは次のように表示されます。

dropscript属性を右クリックして[ノード]、[テキストデータを追加]の順に選択するか、左クリックしてTキーを押し、dropscript属性にテキストデータを追加します。ノードを右クリックして[ビルド]、[FlexScriptに切り替え]の順に選択して、ノードをflexscriptに切り替えます。属性に次のflexscriptテキストを追加します。


		msg("Object Dropped",
				"Onto Object: "
				+ param(1)?.name + "\n"
				+ "X: "
				+ string.fromNum(param(2),2) + "\n"
				+ "Y: "
				+ string.fromNum(param(3),2) + "\n"  
				+ "Z: "
				+ string.fromNum(param(4),2) + "\n" 
				+ "Onto View: " + param(5)?.name
			)
		);
		

属性ノード以外の場所をクリックし、属性ノードを右クリックして、[ビルド]、[ノードFlexScriptをビルド]の順に選択します。

最後に、drop-scriptノードを右クリックして[ノード]、[後ろに挿入]を選択して、オブジェクトの属性ツリーにpicture属性を追加します。新しいノードに「picture」という名前を付けます。ライブラリアイコングリッドでは、オブジェクトにpicture属性がある場合にのみ、グリッドにオブジェクトが表示されます。これは通常、そのオブジェクトのアイコングリッドに表示される画像を表すビットマップファイルへのパスです。この例では、この点は問題ではないため、picture属性を空白のままにして、グリッドにオブジェクトテキストのみが表示されるようにします。ツリーは次のように表示されます。

ライブラリアイコングリッドは次のように表示されます。

ライブラリアイコングリッドからモデルにカスタムアイコンをドラッグします。メッセージが表示されます。

このメッセージは実行中のdropscriptのコードです。このメッセージには、ドロップ先のオブジェクト(ある場合)、ドロップのx位置、y位置、z位置、オブジェクトがドロップされたビューウィンドウが表示されます。別のオブジェクトにドロップすることもできます。通常のライブラリオブジェクトをモデルにドラッグし、ユーザーライブラリに戻って、カスタムオブジェクトをモデル内のオブジェクトにドラッグします。次のメッセージが表示されます。

今回のメッセージには、オブジェクトがSource1にドロップされたことが示されます。x位置、y位置、z位置は、ソースオブジェクトに対する相対的な位置です。

Dropscriptの動的パラメータの例

この例では、グローバルテーブルでサイズが定義されるオブジェクトをユーザーライブラリから作成します。

上のDropscriptの例の説明に従って、新しいユーザーライブラリを作成します。

ライブラリアイコングリッドからプロセッサオブジェクトを3Dビューにドラッグアンドドロップします。プロセッサを右クリックし、[編集]、[ユーザーライブラリに追加]、[UserLibrary 1]の順に選択して、ライブラリに追加します。

プロセッサが3Dビューにドラッグされたときにプロセッサのサイズが動的に変更されるようにします。これを行うには、dropscriptノードのコードでカスタムオブジェクトを使用します。ライブラリアイコングリッドにプロセッサを表示したくないため、プロセッサをコピーし、属性ノードとしてカスタムオブジェクトに貼り付けます。

プロセッサオブジェクトをコピーします(左クリックしてCtrl+Cキーを押します)。カスタムオブジェクトの属性ツリーが開いていない場合は、カスタムオブジェクトを左クリックし、矢印ボタンを押して開きます。Enterキーを押して、カスタムオブジェクトに新しい属性ノードを作成します。新しいノードを左クリックし、Ctrl+Pキーを押してプロセッサオブジェクトを貼り付けます。その後、元のプロセッサオブジェクトを削除できます。

[ツール]、[グローバルテーブル]、[追加]の順に選択して新しいGlobalTableを作成します。このテーブルに「SizeTable」という名前を付けます。GlobalTableを次のように設定します。

このテーブルの値は、プロセッサのサイズを定義します。

カスタムオブジェクトに戻り、dropscriptコードを次のように更新します。


		treenode ontoObj = param(1);
		Vec3 ontoLoc = Vec3(param(2), param(3), param(4));
		treenode ontoView = param(5);
		Object newProcessor = dropuserlibraryobject(node("..>Processor", c), ontoObj, ontoLoc.x, ontoLoc.y, ontoLoc.z, ontoView);
		Table sizeTable = Table("SizeTable");
		newProcessor.size = Vec3(sizeTable[1][1], sizeTable[1][2], sizeTable[1][3]);
		return newProcessor;
		

dropscriptノードを右クリックし、[ビルド]、[ノードFlexScriptをビルド]の順に選択します。

ライブラリアイコングリッドから3Dビューにカスタムオブジェクトをドラッグ&ドロップして、カスタムオブジェクトを作成します。オブジェクトのサイズがdropscriptによって変更されていることに注意してください。

自動インストールの例

この例では、Dropscriptの動的パラメータの例で使用したプロセッサオブジェクトが、ユーザーが新しいモデルを作成したときに自動でインストールされるようにします。

GlobalTable SizeTableを開きます。 ボタンをクリックし、[UserLibrary 1に追加]、[自動インストールコンポーネントとして]の順に選択します。

ライブラリアイコングリッドでユーザーライブラリの横にある矢印をクリックし、[ツリーをチェック]を選択して、UserLibrary 1のツリービューを開きます。

UserLibrary 1の横にある矢印ボタンを押して、ライブラリの属性ツリーを展開します。ツリーは次のように表示されます。

newmodelinstallの横にあるプラス記号のボタンを押してノードを展開します。ノード内にSizeTableがすでに表示されていることに注意してください。これは重要です。この例のカスタムオブジェクトのdropscriptはこのGlobalTableを参照するためです。

ノードを左クリックし、Enterキーを押して、newmodelinstallのサブノードを作成します。カスタムオブジェクトをコピーしてこの新しいノードに貼り付けます。

これで、[ファイル]のツールバーにある[新規]ボタンを押し、その後に[新規モデル]を押すことができるようになります。3DビューにProcessor1オブジェクトがあり、GlobalTablesにSizeTableがあることがわかります。newmodelinstallフォルダは、新しいモデルが作成されたときにモデルに「ドロップ」される一連のオブジェクトのように動作します。オブジェクトは、アイコングリッドから実際にオブジェクトをドラッグしたときと同じ機能が実行されるという意味で「ドロップ」されます。dropscriptオブジェクトの場合は、オブジェクトがモデル内の点(0,0,0)にドロップされたようにスクリプトが実行されます。