プロパティテーブル

概要と主要な概念

プロパティテーブルは、モデル内のオブジェクトのプロパティを可視化して変更しやすくするためのツールです。モデルにオブジェクトを追加すると、各オブジェクトにその動作を設定するプロパティの定義済みのセットが割り当てられます。モデル内のオブジェクトの数が増えると、モデル内のすべてのオブジェクトのすべてのプロパティを表示して管理するのが難しくなります。[プロパティ]ペインを使用すれば、複数のオブジェクトを同時に簡単に編集できますが、プロパティテーブルの方がはるかに強力です。プロパティテーブルでは、複数のオブジェクトのプロパティ値の表示比較の両方が可能なだけでなく、それらのプロパティを直感的で使いやすいExcelに似たテーブルインターフェイスで変更することも可能です。

プロパティテーブルでこれが可能なのは、モデルをデータベーステーブルのように表示できるからです。各オブジェクトはこのテーブル内の1つの行を表し、各オブジェクトのプロパティはデータベーステーブル内のフィールド、つまり、列を表します。このデータベースに似た視点を使用して、表示または編集する特定のプロパティを選択しながら、オブジェクトのテーブルにクエリを行うことができます。クエリは、特定のタイプのオブジェクト、グループメンバーシップ、特定のプロパティ値などで絞り込むことができます。最後に、クエリは、これらの同じ基準でまたは別々の基準で並べ替えることができます。このクエリの結果がテーブルビューに表示されるため、テーブルの複数の行で複数のオブジェクトを簡単に比較したり、テーブル内のオブジェクトのプロパティを個別にまたは一度に複数をすばやく簡単に変更したりできます。

プロパティテーブルの作成

主に、プロパティテーブルを作成する方法は2つあります。プロパティテーブルは、ツールボックスを使用して作成することも、特定のオブジェクトの[プロパティ]ペインを使用して作成することもできます。

ツールボックスからのプロパティテーブルの作成

ツールボックスからプロパティテーブルを作成するには、[ツールボックス]タブをクリックして、 ボタンをクリックし、[オブジェクトプロパティテーブル]を選択します。これにより、モデル内の各オブジェクトの名前が表示される基本的なプロパティテーブルが作成されます。プロパティテーブルタブでは、さらなる構成を行うことができます。

[プロパティ]ペインからのプロパティテーブルの作成

[プロパティ]ペインからプロパティテーブルを作成するには、オブジェクトをクリックして、そのプロパティで必要なペインを探します。ペインのタイトルバーには、通常、ボタンがあります。このボタンを押して、[プロパティを比較]を選択します。モデル内のオブジェクトの関連プロパティを比較するプロパティテーブルウィンドウが表示されます。選択されたオブジェクトの対応する行がテーブルで強調表示されます。さらに、Shiftキーを押しながらオブジェクトを選択して赤くし、その後でこのボタンを押すと、選択したオブジェクトによってプロパティテーブルがフィルタリングされます。つまり、Shiftキーを押しながら複数のオブジェクトセットを素早く選択し、その後で再度プロパティテーブルをクリックすると、テーブルはそれらのオブジェクトによってフィルタリングされます。なお、デフォルトでは、このプロパティテーブルはウィンドウが開いている場合のみアクティブです。このテーブルをツールボックスから常に利用できるようにするには、[プロパティ]ペインに移動し、[プロパティテーブルをインストール]を押します。

プロパティテーブルのカスタマイズ

プロパティテーブルタブには、表示するプロパティ、表示するオブジェクトのセットを絞り込む方法、およびそれらのテーブル内での順序を定義するためのコントロールが含まれています。

ボタンを押して、テーブルに表示するプロパティを定義します。ボタンを押して、テーブルに表示するオブジェクトを絞り込むためのプロパティを定義します。絞り込むためのプロパティを選択すると、そのプロパティがフィルタ編集フィールドに表示され、それをクリックするとフィルタ式を定義できるようになります。

最後に、ボタンをクリックして、テーブルの並び順を定義できます。これは、フィルタリングの定義方法と同様に機能します。

オブジェクトラベル値

オブジェクトラベル値で選択、絞り込み、および並べ替えを行うこともできます。これを行うには、該当する、またはボタンを押します。ダイアログの最上部に、[ラベル]フィールドが表示されるはずです。ラベルの名前を入力して、ボタンを押します。

これにより、選択/絞り込み/並べ替えにそのラベルが追加されます。

オブジェクトプロパティの変更

必要なものだけが表示されるようにテーブルを構成したら、そのテーブルを使用してオブジェクトのプロパティ値を比較するだけでなく、それらを個別にまたは一度に複数を変更することもできます。

単一のオブジェクトを変更するには、そのオブジェクトのターゲットプロパティセルをダブルクリック(またはセルをクリックしてF2を押す)して、それに設定する値を入力してから、セル以外の場所をクリックします。これにより、入力した値がすぐにオブジェクトのプロパティに適用されます。ただし、一部のプロパティではこのような直接編集ができないことに注意してください。

または、複数のオブジェクトのプロパティを同時に編集できます。単一のプロパティの1つ以上の行を選択すると、選択した行の横にボタンが表示されます。そのボタンを押して、値を編集するためのダイアログを開きます。編集が終わったら、そのダイアログの[適用]ボタンを押すと、編集した値がテーブルで選択したすべての行に適用されます。

プロパティについて知る

プロパティは、主に、特定のオブジェクトクラスで分類されます。たとえば、固定リソースには、固定リソースの動作を具体的に構成するプロパティが含まれています。ただし、オブジェクトのすべてのクラスに適用可能なプロパティもあります。これらは、さまざまなドロップダウンの[一般]カテゴリと[ビジュアル]カテゴリを介してアクセスできます。これらのプロパティは他のプロパティと同様に機能しますが、その多くが、特に、選択項目のフィルタリング、並べ替え、および表示の向上に役立ちます。これらには、次のようなプロパティが含まれます。

Name

プロパティカテゴリ潜在的用途
Name一般フィルタリング、並べ替え

Nameプロパティは、各オブジェクトの名前を示します。これは、フィルタリングや並べ替えの目的に役立ちます。モデルオブジェクトに一貫した名前を付けた場合は、LIKE句を使用して、名前に特定のパターンが含まれているオブジェクトを見つけることができます。そのためには、次の手順を実行します。

  1. ボタンをクリックします。
  2. [一般]>[Name]を選択します。
  3. ドロップダウンを使用して、LIKE句を使用するようにフィルタを構成します。
  4. 名前のパターンを入力します。たとえば、「Cell_1_%」と入力します。

上のパターン例は、名前がCell_1_で始まるすべてのオブジェクトを検索します。

Classes

プロパティカテゴリ潜在的用途
Classes一般フィルタリング

Classesプロパティは、オブジェクトがインスタンスであるクラス名の配列です。このプロパティは、特に、フィルタリングに役立ちます。コンベヤなどのモデル内の特定のクラスのオブジェクトのみを調べたい場合は、Classesプロパティで絞り込むことができます。

  1. ボタンをクリックします。
  2. [一般]>[Classes]を選択します。
  3. 必要なクラス名を入力するか、ドロップダウンメニューからクラスを選択します。
  4. IN]オプションが選択されていることを確認します。

AllGroups

プロパティカテゴリ潜在的用途
AllGroups一般フィルタリング、並べ替え

AllGroupsプロパティは、オブジェクトが間接(サブグループ経由)または直接のメンバーであるグループのセットです。これは、フィルタリングや並べ替えに非常に役立ちます。たとえば、特定のグループ内のオブジェクトのみのプロパティを表示して編集したい場合は、このプロパティで絞り込むことができます。

  1. ボタンをクリックします。
  2. [一般]>[AllGroups]を選択します。
  3. 必要なグループ名を入力するか、ドロップダウンメニューからグループを選択します。
  4. IN]オプションが選択されていることを確認します。IN句の機能については、前述の説明を参照してください。

AllGroupsプロパティも並べ替えに非常に役立ちます。たとえば、コンベヤを編集しているとします(式"Conveyor::Conveyor" IN Classesをフィルタに追加済みとします)。テーブルにすべてのコンベヤを表示したいのですが、それらを割り当てたグループ別に分類したいと考えています。そのためには、次の手順を実行します。

  1. ボタンをクリックします。
  2. [一般]>[AllGroups]を選択します。

これにより、テーブル内のコンベヤがグループメンバー順に並べ替えられるため、同じグループ内のすべてのコンベヤがまとめてテーブルに表示されます。

IsSelected

プロパティカテゴリ潜在的用途
IsSelected一般フィルタリング、可視性

IsSelectedプロパティは、オブジェクトが選択されている(赤枠が付いている)場合は1で、そうでない場合は0です。このプロパティは、特に、可視性に関して役に立ちます。3Dビューとプロパティテーブルの間をすばやく行き来する際、3Dビュー内のどのオブジェクトがプロパティテーブル内のどの行に対応するかを確認できると便利です。そのためには、次の手順を実行します。

  1. ボタンをクリックします。
  2. [一般]>[IsSelected]を選択します。
  3. 必要な行の範囲を選択して、IsSelectedプロパティをオンまたはオフにします。
  4. クリックして3Dビューに戻ると、変化したオブジェクトが表示されます。

この操作を使用すれば、テーブルの行とモデルオブジェクト間の対応をすばやく確認することができます。

また、IsSelectedプロパティは、逆方向の操作も可能にします。3Dビューでオブジェクトのセットを選択すると、プロパティテーブルで選択したオブジェクトのみをテーブルに表示することができます。そのためには、次の手順を実行します。

  1. ボタンをクリックします。
  2. [一般]>[IsSelected]を選択します。
  3. フィールドに「1」と入力して、比較が=であることを確認します。
  4. 3Dビューをクリックして、Shiftキーを押しながらモデル内のオブジェクトのセットを選択します。
  5. クリックしてプロパティテーブルビューに戻ります。テーブルビューをクリックするとすぐに、テーブルビューが更新され、3Dビューで選択したオブジェクトのみが表示されます。

この機能を使用すれば、モデル内で選択したオブジェクトのプロパティをすばやく表示して構成することができます。

Color

プロパティカテゴリ潜在的用途
Colorビジュアル可視性

Colorプロパティは、オブジェクトの色を示します。IsSelectedと同様に、このプロパティを使用すると、テーブル内の行とモデル内のオブジェクトを簡単に関連付けることができます。テーブル内の行の範囲内のオブジェクトの色を変更することによって、それらの行が関連付けられた3Dビュー内のオブジェクトを表示することができます。

  1. ボタンをクリックします。
  2. [ビジュアル]>[Color]を選択します。
  3. 必要な行の範囲を選択して、それらの行のColorプロパティを変更します。
  4. クリックして3Dビューに戻ると、変化したオブジェクトが表示されます。

IsSelectedを上回るColorを使用することのメリットは、オブジェクトの色の変化をすばやく認識できる場合があることです。特に、ズームアウトしたときに、オブジェクトが赤枠で囲まれていることがわかります。

プロパティのタイプ

すべてのプロパティ値がバリアントを返しますが、プロパティは別の値のタイプに分類できるのが一般的です。使用可能なプロパティ値のタイプのセットを以下に示します。

Number

Numberプロパティは、倍精度浮動小数点数を保持するプロパティです。

Boolean

Booleanプロパティは、1と0のどちらかの値を保持する数値プロパティです。これらのプロパティを変更すると、FlexSimのインターフェイスにチェックボックスが表示されます。

String

Stringプロパティは、文字列値を保持するプロパティです。

Node

Nodeプロパティは、取得されたノードを返し、設定されたノードを格納します。または、設定するときに文字列を渡すと、その文字列がパスとして解釈され、それに応じて参照が決定されます。まず、このプロパティがオンになっているオブジェクトへの相対パスの決定が試みられます。それに失敗すると、モデルへの相対パスが決定されます。

Array

Arrayプロパティは、取得された配列を返し、設定された配列を格納します。または、設定するときに文字列を渡すと、自動的にその文字列が配列に解釈されます。この文字列は、グローバルテーブルに表示する形式にすることができます。

Array[5]: {1, 2, 3, 4}

または、JSONに似た形式にすることができます。

[1, 2, 3, 4]

これらの形式のいずれも、適切に配列に解釈されます。このことは、Excelやデータベースに対してエクスポートまたはインポートする場合に便利です。値を文字列として単純にデータベースに保存すれば、それを設定するときに配列が決定されます。

Options

Optionsプロパティは、有限セットの値のいずれかを格納できるプロパティです。FlexSimのインターフェイスでは、コンボボックス内のオプションを選択できます。値を取得する(Object.getProperty())と、オプションに関連付けられた数値またはノード値が返されます。ただし、GET_PROPERTY_FLAG_STRINGフラグが使用されている場合、オプションの名前が返されます。値を設定する(Object.setProperty())ときに、オプションの対応する数値またはノード値を渡すか、オプションの名前である英字の文字列を渡すと、関連する適切な値が自動的に決定されます。

Code

Codeプロパティは、潜在的にコードロジックを保持可能なプロパティです。このプロパティに単純な数値またはツリーノード参照を格納することもできますが、評価するロジックがユーザーにより定義されている場合もあります。プロパティにコードが含まれている場合は、そのプロパティを取得する(Object.getProperty())と、完全なコード文字列が返されます。

Unit

Unitプロパティは、距離、速度、加速度、時間などの測定単位に対応するプロパティです。このプロパティを変更すると、FlexSimのインターフェイスに、指定した数値を表現する単位を定義可能なコントロールが表示されます。

Unitプロパティの値を取得する(Object.getProperty())と、モデル単位で表された倍精度浮動小数点数が返されます。必ずしも表示された単位と同じとは限りません。ただし、GET_PROPERTY_FLAG_UNITSフラグが使用されている場合、長さ2の配列が返されます。最初の要素には表示値が、第2の要素には表示単位が格納されています。プロパティを設定する(Object.setProperty())と、設定した値がモデル単位と同じであると仮定されます。または、Object.setProperty()に配列を渡すことができます。ここで、配列の1つ目の要素は数値で、2つ目の要素は値の単位の略語です。たとえば、obj.setProperty("Acceleration", [1.2, "m/min/min"])はオブジェクトのAccelerationプロパティを毎分1.2メートルに設定します。

SQLの直接使用

プロパティテーブルは、オブジェクトプロパティを表示して管理するための使いやすいツールです。ただし、根本的には、プロパティテーブルは、FlexSimの強力なSQL機能を中心としたユーザーインターフェイスラッパーにすぎません。プロパティテーブルタブの右側に、[SQL]ボタンが表示されます。このボタンを押すと、表示しているテーブルに関連付けられたSQLクエリの全体が表示されます。

このクエリをTable.query()コマンドの呼び出しにコピー/貼り付けると、プロパティテーブルに表示されているものと同じ結果が得られます。単純なシナリオでは、すでにプロパティテーブルインターフェイスでできること以上のことはできませんが、次のように、独自のカスタマイズされた機能をプログラムで実装できる可能性が広がります。

  • モデル内のオブジェクトとグローバルテーブルなどの他のデータを関連付ける内部結合クエリの作成
  • AVG()やCOUNT()などの集約関数を使用した複数のオブジェクトに関する情報の集約
  • SQL UPDATE句とDELETE句を使用したプロパティの変更またはモデルからのオブジェクトの削除
  • SQL INSERT INTO句を使用したモデルの自動構築

Objects()テーブルの使用

モデル内のオブジェクトのセットにクエリを行うには、クエリ内でObjects()テーブルを使用します。例:

SELECT Object, Name FROM Objects()

Objects()テーブルは、標準のSQLテーブル値関数で呼び出されるテーブルです。オプションで、この関数にパラメータを渡して、サブツリーでオブジェクトが検索される「ルート」ノードを定義することができます。パラメータは、パス、オブジェクトの名前、モデル内のオブジェクトへの参照のいずれかにすることができます。

SELECT Object, Name FROM Objects('MODEL:/FirstFloor')

SELECT Object, Name FROM Objects('FirstFloor')

SELECT Object, Name FROM Objects(Model.find('FirstFloor'))

上のすべての例が同じ結果を提供します。ここで、「ルート」ノードはモデル内のFirstFloorという名前のオブジェクトです。一方、Objects()にパラメータが渡されなかった場合は、「ルート」ノードがモデルになります。クエリは、ルートオブジェクトのサブツリーを再帰的に検索してオブジェクを見つけ、各オブジェクトがテーブル内の1つの行を表す「仮想」テーブルを作成します。

プログラムによるオブジェクトプロパティの更新

プロパティテーブルを使用して、プログラムでオブジェクトプロパティを更新することもできます。これは、次の3つの方法のいずれかで実行できます。

  1. Tableクラスを使用する。
  2. Table.query()内のUPDATE句でプロパティテーブルを直接参照する。
  3. Table.query()を使用してObjects()テーブルを更新する。

Tableクラスを使用した更新

Tableクラスを使用してオブジェクトプロパティを更新するには、プロパティテーブルをグローバルテーブルのように操作するだけです。

double speed = 5;
Table propTable = Table("TravelSpeeds");

for (int i = 1; i <=  propTable.numRows; i ++){
    propTable[i]["MaxSpeed"] = speed;
}

プロパティテーブルを直接参照することによる更新

直接プロパティテーブル参照を使用してTable.query()でオブジェクトプロパティを更新するには、そのテーブルの名前をUPDATE句に配置するだけです。

Table.query("UPDATE TaskExecuterProps SET MaxSpeed = 5");

このクエリは、まず、TaskExecuterPropsという名前のプロパティテーブルをモデルに配置してから、次に、プロパティテーブルにMaxSpeed列を配置すると仮定します。クエリは、プロパティテーブル内のすべての行(つまり、オブジェクト)を調べて、対応するオブジェクトのMaxSpeedプロパティを5に設定します。

FlexSim SQLの$メカニズムを使用して、値を関数に渡すこともできます。

double speed = Table("SpeedTable")["TaskExecuters"]["Speed"];
Table.query("UPDATE TaskExecuterProps SET MaxSpeed = $1", speed));

Objects()テーブルの更新

オブジェクトプロパティは、Objects()テーブルを直接参照することによっても更新することができます。ここで、更新したくないオブジェクトを除外するためにWHERE句を追加する必要があるかもしれません。

Table.query("UPDATE Objects() SET MaxSpeed = 5 WHERE 'GroupA' IN Groups");

このクエリは、モデル内のすべてのオブジェクトを意味するObjects()テーブルを調べます。その後で、式WHERE 'GroupA' IN Groupsで絞り込みます。これは、Groupsプロパティに「GroupA」という値が含まれているオブジェクトのみを更新することを意味します。つまり、「GroupA」という名前のグループのメンバーであるオブジェクトだけが必要ということです。最後に、これらのグループメンバーに対して、MaxSpeedプロパティを5の値に設定します。

SQLを使用して、内部結合と同様に、他のテーブルのリレーショナルルックアップによってオブジェクトプロパティを動的に更新することもできます。たとえば、オブジェクトが属しているグループに基づいてオブジェクトのさまざまな速度を定義するSpeedsテーブルをセットアップできます。

その後で、内部結合を使用して、対応するグループに属しているオブジェクトを更新できます。

UPDATE Objects() AS Obj
INNER JOIN Speeds ON Speeds.Group IN Obj.Groups
SET Obj.MaxSpeed = Speeds.Speed

このクエリは、モデル内のすべてのオブジェクトを調べて(UPDATE Objects() AS Obj)から、そのオブジェクトとSpeedsグローバルテーブルを相互参照し、Group値がオブジェクトのGroupsプロパティ内の要素のいずれか(オブジェクトがそのグループのメンバーであることを意味する)の行を探します(INNER JOIN Speeds ON Speeds.Group IN Obj.Groups)。その行が見つかると、オブジェクトのMaxSpeedプロパティを速度テーブル行のSpeed値に設定します(SET Obj.MaxSpeed = Speeds.Speed)。

これらの例は、プロパティテーブルとFlexSimのSQLエンジンを組み合わせて利用可能な機能のほんの一部に過ぎません。FlexSimのSQL機能の詳細については、「SQLクエリ」トピックの、特に、「SQL言語サポート」セクションを参照してください。SQLの概要については、w3schools.comを参照してください。

[プロパティ]ペイン

プロパティテーブルの[プロパティ]ペインを使用すると、プロパティテーブルデータをエクスポートまたはインポートすることができるため、複数のプロパティ構成を簡単に切り替えられるようになります。

この仕組みについては、例を使って説明するのが最善の方法でしょう。4つのプロセッサが搭載されたモデルがあり、さまざまなプロパティ構成で実験したいとします。プロセッサのUseTransportUseProcessOperators、およびNumProcessOperatorsプロパティを表示するプロパティテーブルを作成しました。

この構成を保存するには、次の手順を実行します。

  1. ProcessorConfig1という名前のグローバルテーブルを作成します。
  2. プロパティテーブルの[プロパティ]ペインの[Copy to Global Table]で、ドロップダウンからそのテーブルを選択してから、[Copy]を押します。

これにより、データがプロパティテーブルからグローバルテーブルにコピーされます。

次に、2つ目の構成を作成します。プロパティテーブル内のさまざまなプロパティを変更してから、ProcessorConfig2という名前の2つ目のグルーバルテーブルを作成し、そのテーブルにプロパティテーブルをコピーします。

これで、この2つの構成が保存されたため、これらの間を簡単に切り替えることができます。

  1. Update Query]の横にある[Generate]を押します。
  2. これにより、プロパティテーブル内の現在の列のセットに基づいて更新クエリが生成されます。このクエリは次のようになります。

    UPDATE Objects() AS Obj
    	INNER JOIN $1 AS Src
    	ON Obj.Object = Src.Object
    SET
    	Obj.Name = Src.Name,
    	Obj.UseTransport = Src.UseTransport,
    	Obj.UseProcessOperators = Src.UseProcessOperators,
    	Obj.NumProcessOperators = Src.NumProcessOperators

  3. Update from Global Table]で、更新するテーブルを選択します。
  4. 実行]を押します。

モデル内のオブジェクトのプロパティとプロパティテーブル自体が、更新中の構成に基づいて更新されるはずです。その後で、[Update from Global Table]でテーブルを選択して、もう一度[実行]を押すことによって、簡単に他の構成から更新することができます。

動作

クエリは、Srcテーブル、つまり、更新したいテーブルを取得して、そのObject列とモデル内のオブジェクト参照を照合します。その後で、Srcテーブル内で一致した行の値に基づいて、それらのオブジェクトのプロパティを更新します。

[プロパティ]ペインのフィールド

[プロパティ]ペインで構成可能なフィールドのセットを以下に示します。

名前

ペインの最上部で、プロパティテーブルの名前を編集できます。

Copy to Global Table

これは、コピー先のグローバルテーブルの名前を定義します。グローバルテーブルにテーブルをコピーするには、グローバルテーブル名を入力するか、ドロップダウンリストからグローバルテーブルを選択してから、[Copy]ボタンを押します。任意に名前を入力できます。そのグローバルテーブルがまだ存在しなかった場合は、[Copy]が押されたときに自動的に追加されるようにできます。

Update from Global Table

このフィールドは、過去に保存したグローバルテーブルから更新するために使用できます。このフィールドは、[Update Query]と連携して動作します。指定したグローバルテーブルはクエリ内の$1パラメータになります。

このフィールドは、動的に評価される式です。任意のFlexScript式を使用して、インポート元となるテーブルを決定できます(たとえば、モデルパラメータに関連付けることによって)。モデルパラメータの使用は、ドロップダウンで使用可能なピックオプションです。

Update On Reset

このチェックボックスがオンになっている場合は、モデルのリセットごとに更新メカニズムが自動的に実行されます。

Update Query

更新クエリは、[実行]を押すことによって手動で実行したり、モデルリセットごとに実行するように設定したりできるクエリです。前述したように、保存済みの構成に基づいてプロパティを更新することができます。[Generate]ボタンはこのデフォルトの構成切り替えメカニズム用のクエリを自動生成しますが、クエリ全体をカスタマイズ用に使用できます。クエリはTable.query()に直接渡されます。そのため、それをモデルのニーズに合わせてカスタマイズすることができます。たとえば、前述Speedsテーブルなどの他のテーブルとのINNER JOINを実行します。

モデルの自動構築

前述したように、Objects()テーブルとSQL INSERT INTO句を組み合わせて使用して、実際にモデル内のオブジェクトを作成し、それらにプロパティ値を割り当てることができます。たとえば、Table.query()へのスクリプト呼び出しに以下のクエリをコピー/貼り付け、それを実行します。

INSERT INTO Objects() (Class, Name, Location, OutObjects) VALUES
('Source', 'Source1', ARRAY(0, 0, 0), ARRAY('Queue1')),
('Queue', 'Queue1', ARRAY(5, 0, 0), ARRAY('Processor1', 'Processor2', 'Processor3')),
('Processor', 'Processor1', ARRAY(10, 3, 0), ARRAY('Sink1')),
('Processor', 'Processor2', ARRAY(10, 0, 0), ARRAY('Sink1')),
('Processor', 'Processor3', ARRAY(10, -3, 0), ARRAY('Sink1')),
('Sink', 'Sink1', ARRAY(15, 0, 0), ARRAY())

これにより、接続された完全に機能するオブジェクトのセットがモデル内に作成されます。このようなクエリを手作業で作成したくないかもしれませんが、この機能を使用すれば、モデル構築も完全にデータ駆動型のアクティビティにすることができます。テーブルから読み取ってSQL INSERT INTOクエリを組み立てる単純なスクリプトを作成してから、そのクエリを実行してモデル内にオブジェクトを作成できます。今後、このような機能をFlexSimのプロパティテーブルに統合したいと考えていますが、これを自分で行うために必要なツールはすでに揃っています。

または、コード内でオブジェクトを列挙する代わりに、INSERT INTO SELECT句を使用できます。これは、グローバルテーブルが外部ソースからインポートされた可能性がある場合に使用します。

INSERT INTO Objects() (Class, Name, Location, OutObjects)
SELECT Class, Name, Location, OutObjects FROM AutoBuildData

INSERT INTOの必須フィールド

INSERT INTO句を使用してモデルを自動構築する場合は、2つの特殊なフィールドのうちの少なくとも1つをクエリに挿入して、作成するオブジェクトのタイプをFlexSimが理解できるようにする必要があります。もう一方のプロパティフィールドはオプションで、指定されなかった場合は、デフォルトのプロパティ値に戻ります。

INSERT INTOを使用する場合は、ClassフィールドとCopyFromフィールドのどちらかを含める必要があります。Classフィールドは、インスタンスを作成するクラスの名前です。「Source」、「Processor」、「Queue」などがあります。このフィールドは、プロパティテーブルに表示するために使用することもできます。または、特別なCopyFromフィールドを指定できます。これは、コピーを作成するオブジェクトのパスまたは名前です。このフィールドを使用して、モデル内にオブジェクトを作成して事前構成してから、そのオブジェクトを自動構築ステップで作成することができます。

下のサンプルクエリは、前の例と同様ですが、ここでは、モデル内にTemplateSourceという名前のオブジェクトがすでに作成されています。このソースのコピーは、CopyFromフィールドを使用して作成されます。他のオブジェクトはすべてライブラリクラスのインスタンスとして作成されます。

INSERT INTO Objects() (Class, CopyFrom, Name, Location, OutObjects) VALUES
(NULL, 'TemplateSource', 'Source1', ARRAY(0, 0, 0), ARRAY('Queue1')),
('Queue', NULL, 'Queue1', ARRAY(5, 0, 0), ARRAY('Processor1', 'Processor2', 'Processor3')),
('Processor', NULL, 'Processor1', ARRAY(10, 3, 0), ARRAY('Sink1')),
('Processor', NULL, 'Processor2', ARRAY(10, 0, 0), ARRAY('Sink1')),
('Processor', NULL, 'Processor3', ARRAY(10, -3, 0), ARRAY('Sink1')),
('Sink', NULL, 'Sink1', ARRAY(15, 0, 0), ARRAY())

FlexSimでのSQLの使用方法については、「SQLクエリ」を参照してください。