オブジェクトテンプレートの使用
オブジェクトテンプレートとは何か
オブジェクトテンプレートを使用すると、モデル内のオブジェクトのテンプレートインスタンスを作成することによって、継承のオブジェクト指向の原則に従ってモデルを構築して構成することができます。テンプレートインスタンスは、いくつかの便利な機能を有効にする、そのテンプレートへの特殊なリンクを備えていることを除いて、FlexSimの他のオブジェクトと同様です。
- デフォルトで、テンプレートインスタンスは、テンプレートオブジェクトからプロパティ値を継承します。これは、テンプレート上のプロパティを変更すると、すべてのインスタンスが自動的に新しいプロパティ値を受け取ることを意味します。
- 各インスタンス上のプロパティを選択的にオーバーライドできます。その場合は、インスタンスのプロパティ値がテンプレートと無関係になります。オーバーライドを定義するためのメカニズムは、デフォルトで自動的です。インスタンス上のプロパティを変更するとすぐに、FlexSimが自動的にそのプロパティをオーバーライド済みとしてマークします。または、プロパティがオーバーライドされるのか継承されるのかを明示的に定義できます。
- テンプレート継承は多層化することができます。テンプレートインスタンス自体を他のインスタンスのテンプレートにして、継承の一種の「系統図」を作成することができます。
この柔軟な継承機能を使用すると、モデルの構築と構成を大幅に高速化できます。モデル内のいくつかの主要なオブジェクト上のオブジェクトプロパティを構成するだけで、それらのプロパティが自動的に他の多数のオブジェクトに継承されます。
テンプレートインスタンスを作成する
FlexSim内のほとんどの3Dオブジェクトをテンプレートにすることができます。オブジェクトをテンプレートにするには、そのオブジェクトのテンプレートインスタンスを作成するだけです。そのためには、次の手順を実行します。
- モデル内のオブジェクトをクリックします。
- 右側の[プロパティ]で、[テンプレート]ペインを展開します。
- [インスタンス]で、 を押します。
これにより、オブジェクトのテンプレートインスタンスが作成されます。
継承関係を示す青色のベジエ線が描画されます。これらの線は、テンプレートオブジェクトの一番下からインスタンスオブジェクトの一番上に伸びています。
インスタンス継承を管理する
テンプレートインスタンスを作成すると、そのインスタンスのほとんどのプロパティが継承されます。プロパティのテキストスタイルによって、継承された値とオーバーライドされた値が区別されます。
斜体で表示されたプロパティは継承されたプロパティであるのに対して、太字で表示されたプロパティはオーバーライドされたプロパティです。
インスタンス上の継承されたプロパティを変更するとすぐに、その表示が斜体から太字に変化して、そのプロパティがオーバーライドされたことが示されます。その後は、テンプレート上のプロパティに対する変更がインスタンスに反映されなくなります。
オーバーライドされたプロパティのリストを直接表示して編集することもできます。
- 分析するテンプレートインスタンスをクリックします。
- [プロパティ]で[テンプレート]ペインを展開します。
- [オーバーライド]で、 を押します。
ポップアップウィンドウが開いて、オブジェクトのオーバーライドされたプロパティのリストが表示されます。必要に応じて、このリストに対して追加、削除、および並べ替えを実行できます。オーバーライドを選択して を押すこともできます。これにより、インスタンスからオーバーライドが削除されますが、その値がテンプレートに適用され、テンプレート上のインスタンスの現在値とすべての兄弟インスタンスがアクティブになります。
グローバルテンプレート
モデル内の任意のオブジェクトをグローバルテンプレートにすることもできます。グローバルテンプレートによって、ライブラリ内にドラッグ可能なアイコンが作成されます。このオブジェクトをモデルにドラッグすると、そのグローバルテンプレートのインスタンスが自動的に作成されます。そのためには、次の手順を実行します。
- グローバルテンプレートにするオブジェクトをクリックします。
- [プロパティ]で[テンプレート]ペインを展開します。
- [グローバルテンプレート]チェックボックスをオンにします。
左側のライブラリにオブジェクトが表示されます。そのオブジェクトのインスタンスをモデルにドラッグすることができます。
オブジェクトをグローバルテンプレートにすると、そのオブジェクトがツールボックスにも表示されます。ツールボックスでテンプレートをダブルクリックすると、オブジェクトが3Dビューの中央に表示され、そのプロパティを編集可能なことが強調されます。オブジェクトを右クリックして、グローバルテンプレートとしてユーザーライブラリに追加することもできます。これにより、そのオブジェクトを他のモデルで再利用できるようになります。
ユーザーライブラリとグローバルテンプレート
ツールボックス経由でユーザーライブラリに追加されたグローバルテンプレートは、ユーザーライブラリに追加された標準オブジェクトとは異なります。グローバルテンプレートをユーザーライブラリからモデルにドロップすると、モデル内に同じ名前のグローバルテンプレートが存在した場合は、モデルに新しいオブジェクトが追加されるだけでなく、そのグローバルテンプレートが更新されます。その結果、そのグローバルテンプレートのすべてのテンプレートインスタンスも更新されます。これにより、ユーザーライブラリからモデル内のオブジェクトへの更新が容易になります。これは、すべての動作が更新された新しいオブジェクトをモデルに再インストールするのに似ています。
技術的詳細
テンプレート継承はオブジェクトプロパティを介して有効にされます。テンプレートインスタンスのあるオブジェクト上のプロパティを設定すると、オブジェクトのインスタンスのそれぞれでObject.setProperty()を効率的に呼び出すことによって変更がインスタンスに伝播されます。また、オブジェクト上のオーバーライドリストにプロパティの一意の名前を格納することによって、プロパティがオーバーライドされます。ここでの重要なポイントは、継承可能な入力のセットが、オブジェクトがサポートしている名前付きプロパティのセットによって決定されることです。オブジェクトデータの一部に対応する名前付きプロパティがなかった場合は、そのデータを継承できません。また、一般的に、サポートされるプロパティは、オブジェクト入力、つまり、モデルの構築中にオブジェクトに対して定義したデータに制限されます。統計や状態値などのデータは、プロパティをサポートしないため、継承できません。とはいえ、ほとんどのオブジェクト入力は継承をサポートします。
FlexSimバージョン21.2以降で継承できない3Dオブジェクト入力は次のとおりです。
- ナビゲータのプロパティ
- オブジェクトのアニメーションとコンポーネント
- 流体オブジェクトのプロパティ
- 一部の人のプロパティ
- ビジュアルツールの内部接続
本質的に継承をサポートしない名前付きプロパティもあります。この主な理由は、これらのプロパティにとって継承は意味を持たないためです。これらのプロパティを以下に示します。
- AllGroups(読み取り専用)
- IsSelected(3D操作で使用)
- Class(読み取り専用)
- Classes(読み取り専用)
- Container
- Location.X、Location.Y、Location.Z(Locationがあれば冗長)
- Rotation.X、Rotation.Y、Rotation.Z(Rotationがあれば冗長)
- Size.X、Size.Y、Size.Z(Sizeがあれば冗長)
- Color.Red、Color.Green、Color.Blue、Color.Alpha(Colorがあれば冗長)
- Template
- TemplateInstances
- TemplateOverrides
- Dimensions(他のストレージオブジェクトのプロパティがあれば冗長)
プロトタイプベースのOOP
FlexSimのオブジェクトテンプレートメカニズムでは、クラスベースではなく、プロトタイプベースのモデルリングスタイルが使用されます。テンプレートは、それ自体がモデル内のオブジェクトであるため、それらが定義されたモデルと統合できます。この設計を使用すると、よりまとまったモデル構築プロセスが可能になります。そこでは、クラス構築とインスタンス化/モデル構築の2つのフェーズを切り替えるのではなく、オブジェクト定義とモデル構築を同時に行うことができます。一方、よりクラスベースのモデル構築アプローチの方が望ましい場合は、テンプレートをモデルの特定の領域から切り離して設定することができます。そうすれば、テンプレートを個別に定義してから、テンプレートインスタンスだけを使用して実際のモデルを構築することができます。