(前頁)<<      >>(次頁)          (Up)

3章 CommonMPの要素モデルを作成する
3.3 要素モデル スタブを作成する(その2)



 必要なファイルとクラスが揃った所で、制作したクラスの変更を行います。

(手順5:個別クラスの変更)
 (手順5−1:ファクトリクラス内のメソッド実装)

  Factoryクラスに実装するメソッドを下図に示します。

       
 
@CreateFactoryID メソッド
 CreateFactoryID メソッドは 既に変更しました。

ACreateCalModel メソッド
 CreateCalModel メソッドは、要素モデルのインスタンスを生成するメソッドです。 このメソッド内では、引数で与えられたモデルの種別に従って、複数の種別の要素モデルを作成する事が可能です。 引数の要素モデル種別は、MyExerciseModelDefineで定義された値が与えられます。(詳しくは GetCalModelInfoListメソッドで説明)

 下の様にコーディングします。 

        public override McCalModel CreateCalModel(HySObjectKind csModelKind)
        {
            McBasicCalculateModelBase csCalModel = null;

            if (csModelKind.Equals(MyExerciseModelDefine.MY_DYNAMIC_MODEL_KIND) == true)
            {
                csCalModel = new MyDynamicWaveModel();
            }
            return csCalModel;
        }


BCreateCalInfo メソッド
 CreateCalInfo メソッドは 引数で与えられたモデルの種別に対応する演算データクラスのインスタンスを生成するメソッドです。

(補足) 「演算データクラス」の必要性
 CommonMPでは、計算中にそれを一時中断し、その情報をファイルに保存しておき、別な時にそれを読み出し、計算を再開して継続する機能があります。 この機能をを実現する為には、要素モデル内のメンバー変数の内容を全てファイルに書き出したり、ファイルに保存された情報を読みだして要素モデル内部のメンバー変数に展開しなければなりません。 要素モデルのメンバー変数の個数や種類はモデルによって異なるため、CommonMPフレームワークから、一般的な方法で実現することができません。 (要素モデル作成者が自クラスに、ファイル書き出し、読み出しのメソッドを実装する必要があります)

     
 しかしながら、要素モデルが使用する全てのメンバー変数を演算データクラスに纏めてしまうと、CommonMPフレームワーク側で演算データクラスに対して ファイル入出力処理を実装するだけで、要素モデル側はファイル入出力に関わる全ての処理を意識する必要が無くなります。

   
 このため、要素モデルクラスは 全ての計算情報を 演算データクラスの中に入れておく必要があります。(但し、独自のメンバー変数を作成しても、ファイル保存/復元が出来ないだけで、計算処理自体には影響しません。)



 このメソッド内では、引数で与えられたモデルの種別に対応する複数の演算データを作成する事が可能です。 引数の要素モデル種別は、MyExerciseModelDefineで定義された値が与えられます。(詳しくは GetCalModelInfoListメソッドで説明)
 以下の様にコーディングします。 

        public override McCalInfo CreateCalInfo(HySObjectKind csModelKind)
        {
            McCalInfo csCalInfoData = null;

            if (csModelKind.Equals(MyExerciseModelDefine.MY_DYNAMIC_MODEL_KIND) == true)
            {
                csCalInfoData = new MyDynamicWaveCalInfo();
            }
            return csCalInfoData;
        }



CCreateModelProperty メソッド
 CreateModelProperty メソッドは 引数で与えられたモデルの種別に対応するプロパティデータのインスタンスを生成するメソッドです。 此処で作成する MyExerciseModel の場合には 独自のプロパティデータクラスは作成せず、CommonMPが提供する親クラスをそのまま利用します。
 以下の様にコーディングします。

        public override McCellModelPropertyIF CreateModelProperty(HySID csLibraryID, HySObjectKind csModelKind)
        {
            McCellModelPropertyInfo csRtnCellPrptyDt = null;

            if (csModelKind.Equals(MyExerciseModelDefine.MY_DYNAMIC_MODEL_KIND) == true)
            {
                csRtnCellPrptyDt = new McCellModelPropertyInfo(csLibraryID, csModelKind);

                csRtnCellPrptyDt.SetStepTime(60); // δT設定 60秒
            }
            return csRtnCellPrptyDt;
        }


 生成したプロパティデータに 時間増分値:δT=60秒をセットします。
 此処では、スタブだけ作成するので これ以上のコーディングは行いません。(インスタンスを生成するだけです)

DCreateModelInitialInfo メソッド
 CreateModelInitialInfo メソッドは、引数で与えられたモデルの種別に対応する初期化データのインスタンスを生成するメソッドです。 此処で作成する MyExerciseModel の場合には 独自の初期化データクラスは作成せず、CommonMPが提供する親クラスをそのまま利用します。
 以下の様にコーディングします。

        public override McPropertyInfoRoot CreateModelInitialInfo(HySID csLibraryID, HySObjectKind csModelKind)
        {

            McInitialInfo csRtnDt = null;

            if (csModelKind.Equals(MyExerciseModelDefine.MY_DYNAMIC_MODEL_KIND) == true)
            {
                csRtnDt = new McInitialInfo(csLibraryID, csModelKind);
            }
            return csRtnDt;
        }


 此処では、スタブを作成するだけなので これ以上のコーディングは行いません。(インスタンスを生成するだけです)
 
EGetCalModelInfoList メソッド
 CommonMPで動作する要素モデルは CommonMP:ライブラリ管理画面に表示されます。 この情報は 要素モデルDLL製作者が提供する必要があります。 表示するモデル情報は McModelInfo クラスの中に代入して提供します。 GetCalModelInfoList メソッドは 表示情報を生成してCommonMPに提供するメソッドです。

       
      (ライブラリ管理画面に表示される要素モデルの情報)

 以下の様にコーディングします。

        public override HySDataLinkedList GetCalModelInfoList()
        {
            McModelInfo csModelInfo=null;

            csModelInfo = new McModelInfo(
                    (HySID)this.GetFactoryID(),
                    McModelLibraryDefine.DIVISION_CALCULATION_MODEL,    // <-- 演算モデルは、必ずこの値にして下さい
                    new HySObjectKind("CAL_SAMPLE_MODELS"), // <-- LibraryCategoryXML.xmlに定義されている値を使用する
                    MyExerciseModelDefine.MY_DYNAMIC_MODEL_KIND, // モデルの識別子
                    MyExerciseModelDefine.MY_DYNAMIC_WAVE_MODEL_NAME  // モデルの名称
                                          );

            csModelInfo.SetVersionInf("Ver1.0 ");
            csModelInfo.SetSummaryInf("演習で作成する DynamicWave河道モデル です");
            csModelInfo.SetCreatorInf("要素モデル開発演習者");
            csModelInfo.SetIconName(new HySString("Lane"));

            m_csCalModelInforList.AddLast(csModelInfo); // 演算モデル情報の追加
            return m_csCalModelInforList;
        }


  表示する画面と、McModelInfoクラスインスタンス に設定する情報の対応を下の図に示します。

 
 McModelInfoクラスインスタンス 生成時の時に引数として、表示情報を設定します。
・第1引数は、Factoryクラスのファクトリ識別子で、Factoryクラス:MyExerciseModelFactory から取得します。
・第2引数は 必ず、McModelLibraryDefine.DIVISION_CALCULATION_MODEL とします。
・第3引数は モデル管理画面上で表示される時の分類を示すもので、\CommonMP\Execute\conf\LibraryCategory.xml に定義された値を入れます。 
 LibraryCategory.xml 内のカテゴリーがライブラリ管理画面のフォルダーに相当します。

       

 MyExerciseModel で制作するモデルは「サンプルモデル等」のフォルダーに入れるので ”CAL_SAMPLE_MODELS” とします。
・第4引数は モデル識別子で Defineクラスの中で定義したモデル識別子を入れます。ここに設定した値が、 CreateCalModel()、CreateCalInfo()、CreateModelProperty()、CreateModelInitialInfo() の引数として与えられます。
・第5引数は モデルの名称で Defineクラスの中で定義したクラス名称を与えます。

 McModelInfo クラスの各メソッド(SetVersionInf 等)に設定された情報と ライブラリ画面に表示情報の対応は 先の図の通りです。
 また、モデルを示すアイコンは \CommonMP\Execute\ModelIcon\下に入れたアイコン名です。

       




 GetCalModelInfoList メソッド内で 生成された McModelInfo クラスのインスタンスは、”リスト”という形で提供します。”リスト”クラスは、親クラスのメンバー変数(csCalModelInforList )として、実体を持っています。 


リスト”について
 表示するモデル情報は McModelInfo クラスで管理し、”リスト”という形で提供します。 FORTRANでは 複数のデータは配列で取り扱うことが多いですが、CommonMPでは  ”リスト” という形式で扱う事が多くあります。 リスト形式で扱うと データを任意の位置に挿入したり取り外したりすることが可能です。また、管理するデータの数も可変です。

          
 
(雑談)
 C#が提供するリスト構造を扱うクラスが有りますが、2章でも言及したように、当初 C++への移行の可能性もあったので、CommonMPは独自のリストクラス(HySDataLinkedList)を持っています。 (CommonMPのリストクラスは [Serializable]可能です。[Serializable])については、いずれ説明します。)

 


(前頁)<<      >>(次頁)

初版:2013/06/15 |