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

6章 再び要素モデルの作成
6.1 独自プロパティ画面の作成
 (その1 追加モデルのスタブ作成)


 前頁で触れたように、CommonMPは MVCソフトウエアパターン構造を採用しているので、要素モデルのプロパティ画面を作成するには、要素モデルDLLとは異なるDLLを作成する必要があります。  プロパティ画面の製作手順は 要素モデルの場合とほぼ同様の手順を踏みます。

@要素モデル用プロパティ画面DLL用プロジェクトを作成する。
A要素モデル用プロパティ画面スタブを作成する。
B要素モデル用プロパティ画面の実装を行う。


 本ホームページでは、プロパティ画面を製作するに当り、要素モデルと、そのプロパティ画面を同時に制作してみます。

テーマ 

新しい要素モデルと、このモデル専用のプロパティ画面を作成し、DLLとしてリリースする。

製作の進め方

@  6.1.1  要素モデルスタブを作成する。
A  6.1.2  独自プロパティ画面に使用するプロパティ情報、初期化情報クラスのスタブを作成する
B  6.1.3  スタブ状態で、CommonMPに組み込んで動作させてみる。
C  6.1.4  要素モデル用プロパティ画面の開発プロジェクトを作成する
D  6.1.5  プロパティ画面のスタブを作成する。
E  6.1.6  スタブ状態で、CommonMPに組み込んで動作させてみる。
F  6.1.7  上記@〜Eで作成したスタブに処理を実装する。

 以下、上記手順に従って、要素モデルプロパティ画面を作成していきます。


 

テーマ設定

 第2章で作成した2つのモデルのうち、第3章で「DynamicWave」モデルを、CommonMPの要素モデルに移植しました。

 そこで、新しい要素モデルとしては、第2章で制作したもう一つのモデル 「KinematicWave」モデルを対象とします。
 この時、独自のプロパティ情報クラス、初期化情報クラスを作成し、そのクラスに応じた独自画面を作成してみます。

 CommonMPの規格では、「1つのDLL内に要素モデルは1個」が原則となっていますが、学習用モデルに多量のDLLを作成すると、学習後それらを削除するのに手間がかかるので、ここでは、第3章で作成したDLLに要素モデルを追加します。
 

6.1.1 要素モデルのスタブ作成

 第3章でも、要素モデルは最初にスタブを作成しました。 そこで、此処でも、「KinematicWave」モデルのスタブの作成から行います。既にDLLは存在していDLLの用のMicrosoft Visual C# の要素モデルプロジェクトのフォルダ内に存在するモデル型紙をコピーして使用します。
 前回作成した「DyanamicWave」要素モデルは 未来型のモデルでした。 今回作成する「KinemacitWave」モデルも同様に現在の状態からδt秒後の状態を計算するため、未来型のモデルです。

    
           ↑ 制作する要素モデルクラスの派生関係


        
            ↑ 制作する演算データクラスの派生関係



 モデルのスタブ作成は以下の手順です。

@型紙をコピーしてKinematicWave要素モデルクラスとKinematicWave演算データクラスファイルを作成します。
Aコピーして作成した2つのファイルを プロジェクトに追加します。
B追加した2つのファイルを開き namespace 名称を DLLの namespace 名に一致させます。
C要素モデルクラスと演算データクラスの名称を変更します。
DFactoryクラスの各メソッドを変更します。



 以降順に手順を説明します。

 要素モデルの型紙は「MyHydraulicsModel」であり、計算中の情報を格納する情報クラスの型紙は「MyHydraulicsCalInfo」となります。 2つのソースファイルをコピーして、DLLの要素モデルが配置されているディレクトリ「\MyExerciseModel\Model」下にペーストします。 ペースト後、ファイル名をそれぞれ「MyKinematicWaveModel」と「MyKinematicWaveCalInfo」に変更します。

   
                ↑ 型紙のコピー

                   

                ↓ ディレクトリ「Model」下にペーストし、ファイル名称の変更を行う
   

 Microsoft Visual C# から、要素モデル開発用ソリューションを立ち上げ、プロジェクト「MyExerciseModel」の「Model」フォルダーを選択し、ポップアップメニューの「追加」−「既存の項目」 を選択します。 

     
      ↑ Microsoft Visual C# ソリューションエクスプローラー

 表示されたダイアローグから先ほどコピーした「MyHydraulicsModel」と「MyHydraulicsCalInfo」ファイルを選択して、プロジェクトにモデルを追加します。

     
    ↑ ファイルの追加を、Microsoft Visual C# ソリューションエクスプローラー上で確認

 追加した2つのファイルを開き、namespace名をDLL内のFactoryクラスのnamespace 名に変更します。

      namespace CommonMP.HYMCO.OptionImpl.MyModelLIB
            ↓
      namespace CommonMP.HYMCO.OptionImpl.MyExerciseModelLIB


 次に、型紙内のクラス名を変更したいのですが、MicroSoft Visual C# のリファクタリング機能を使用したいので、先ずコンパイルを行います。
 コンパイルが終了した後、

  要素モデル名の変更
      MyHydraulicsModel →  MyKinematicWaveModel 
  演算データクラス名の変更
      MyHydraulicsCalInfo → MyKinematicWaveCalInfo 

 に変更します。 

 第3章でも行ったようにクラス名を選択した後、マウス右クリックにてポップアップメニューを開き「リファクタ」−「名称の変更」から行うと便利です。

    
        ↑ リファクタリング機能を利用したクラス名称変更

 コンパイルが成功すれば、要素モデルクラスと 演算中データクラスのスタブは制作完了です。


6.1.2 プロパティデータクラスと初期化データクラスのスタブ作成


 第3章では、プロパティデータクラスと初期化データクラスは共に、CommonMPが提供するクラス(McCellModelPropertyInfo、McInitialInfo)を そのまま利用しました。  この章では、独自のクラス(MyKinematicWavePropertyData、MyKinematicWaveInitialData)を作成します。

       

          
        ↑ 制作するデータクラスの派生関係


 先ずはスタブ作成を行います。
 スタブの作成は以下の手順で行います。(要素モデルクラスと演算データクラスの場合とほぼ同様の手順です)

@型紙をコピーして独自クラス MyKinematicWavePropertyDataクラスとMyKinematicWaveInitialDataクラスファイルを作成します。
Aコピーして作成した2つのファイルを プロジェクトに追加します。
B追加した2つのファイルを開き namespace 名称を DLLの namespace 名に一致させます。
Cプロパティデータクラスと初期化データクラスの名称を変更します。



 以降、手順を説明します。

 2つのクラスの型紙もサンプルに準備されています。
 プロパティデータクラスの型紙
   \CommonMP\Source\HYMCO\OptionImpl\MyExerciseModel\モデル型紙\PropertyData\MySpecialPropertyData.cs
 初期化データクラスの型紙
      \CommonMP\Source\HYMCO\OptionImpl\MyExerciseModel\モデル型紙\InitialData\MySpecialInitialData.cs

 この2つのファイルをそれぞれ次のディレクトリにコピーします。

 プロパティデータクラスのコピー先
   \CommonMP\Source\HYMCO\OptionImpl\MyExerciseModel\Model\PropertyData
 初期化データクラスのコピー先
   \CommonMP\Source\HYMCO\OptionImpl\MyExerciseModel\Model\InitialData

 
 
      
           (プロパティデータクラスコピーの例)

 
 予定のディレクトリにコピーした後 ファイル名を変更します。

   プロパティデータのソースファイル名変更
     MySpecialPropertyData.cs → MyKinematicWavePropertyData.cs 
   初期化データのソースファイル名変更
      MySpecialInitialData.cs → MyKinematicWaveInitialData.cs

 要素モデルクラスの追加と同様の操作を行なって、上記2つのクラスを プロジェクトに追加します

      
        ↑ 2つのデータクラスをソリューションに追加する


  追加した2つのファイルを開き、namespace名をDLL内のFactoryクラスのnamespace 名に変更します。

    namespace CommonMP.HYMCO.OptionImpl.MyModelLIB
        ↓
    namespace CommonMP.HYMCO.OptionImpl.MyExerciseModelLIB


 次に、コンパイルを行った後、リファクタリング機能を用いて

    プロパティlデータクラス名の変更
      MySpecialPropertyData→  MyKinematicWavePropertyData 
    初期化データクラス名の変更
      MySpecialInitialData→ MyKinematicWaveInitialDat

 に変更します。

 コンパイルが成功すれば、要素モデルクラスと 演算中データクラスのスタブは制作完了です。 


6.1.3  ファクトリークラスの変更とスタブ組み込みの確認


 追加モデルに関連するクラスのスタブが完了した所で、スタブをCmmonMP内から呼び出せるようにして、スタブの組み込みを確認します。
 最初に、組み込む要素モデルの種別と名称をDefineクラス内に定義します。

    public class MyExerciseModelDefine
    {
     。。。。。。。。
       /// <summary>演習:KinematicWaveモデル種別</summary>
        public static readonly HySObjectKind MY_KINEMATIC_MODEL_KIND = new HySObjectKind("MyKinematicWaveModel");
        /// <summary>演習:KinematicWaveモデル名称</summary>
        public static readonly HySString MY_KINEMATIC_WAVE_MODEL_NAME = new HySString("演習:KinematicWaveモデル");
     。。。。。。。。
    }


 次に、ファクトリークラスの下記メソッドを変更します。

     

@CreateCalModel メソッド
 引数で与えられた要素モデル種別が、Defineクラスに追加した「KinematicWave」モデル種別の時、MyKinematicWaveModelクラスのインスタンスを生成します。

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

        public override McCalModel CreateCalModel(HySObjectKind csModelKind)
        {
            McBasicCalculateModelBase csCalModel = null;
            if (csModelKind.Equals(MyExerciseModelDefine.MY_DYNAMIC_MODEL_KIND) == true)
            {
                csCalModel = new MyDynamicWaveModel();
            }
            else if (csModelKind.Equals(MyExerciseModelDefine.MY_KINEMATIC_MODEL_KIND) == true)
            {
                csCalModel = new MyKinematicWaveModel();
            }
            return csCalModel;
        } 



ACreateCalInfo メソッド
 引数で与えられた要素モデル種別が、Defineクラスに追加した「KinematicWave」モデル種別の時、MyKinematicWaveCalInfoクラスのインスタンスを生成します。

 下記のようにコーディングします。

        public override McCalInfo CreateCalInfo(HySObjectKind csModelKind)
        {
            McCalInfo csCalInfoData = null;
            if (csModelKind.Equals(MyExerciseModelDefine.MY_DYNAMIC_MODEL_KIND) == true)
            {
                csCalInfoData = new MyDynamicWaveCalInfo();
            }
            else if (csModelKind.Equals(MyExerciseModelDefine.MY_KINEMATIC_MODEL_KIND) == true)
            {
                csCalInfoData = new MyKinematicWaveCalInfo();
            }
            return csCalInfoData;
        } 



BCreateModelProperty メソッド
 引数で与えられた要素モデル種別が、Defineクラスに追加した「KinematicWave」モデル種別の時、新しく追加したクラス MyKinematicWavePropertyDataクラスのインスタンスを生成します。

 下記のようにコーディングを行います。  

        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);
         。。。。。。。。。
            }
            else if (csModelKind.Equals(MyExerciseModelDefine.MY_KINEMATIC_MODEL_KIND) == true)
            {
                csRtnCellPrptyDt = new MyKinematicWavePropertyData(csLibraryID, csModelKind);
             }
            return csCalInfoData;
        } 



CCreateModelInitialInfo メソッド
 引数で与えられた要素モデル種別が、Defineクラスに追加した「KinematicWave」モデル種別の時、新しく追加したクラス MyKinematicWaveInitialDataクラスのインスタンスを生成します。

 下記のようにコーディングを行います。  

        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);
         。。。。。。。。。
            }
            else if (csModelKind.Equals(MyExerciseModelDefine.MY_KINEMATIC_MODEL_KIND) == true)
            {
                csRtnDt  = new MyKinematicWaveInitialData(csLibraryID, csModelKind);
             }
            return csRtnDt ;
        } 

 

DGetCalModelInfoList メソッド
 追加した 要素モデル:「KinematicWave」の情報を McModelInfo クラスに代入してリストに追加します。

 下記のようにコーディングを行います。 

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

           // DynamicWave モデル情報追加
            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  // モデルの名称
                                          );

     // KinematicWave モデル情報追加
            csModelInfo = new McModelInfo(
                    (HySID)this.GetFactoryID(),
                    McModelLibraryDefine.DIVISION_CALCULATION_MODEL,    // <-- 演算モデルは、必ずこの値にして下さい
                    new HySObjectKind("CAL_SAMPLE_MODELS"), // <-- LibraryCategoryXML.xmlに定義されている値を使用する
                    MyExerciseModelDefine.MY_KINEMATIC_MODEL_KIND, // モデルの識別子
                    MyExerciseModelDefine.MY_KINEMATIC_WAVE_MODEL_NAME  // モデルの名称
                                          );
            csModelInfo.SetVersionInf("Ver1.0 ");
            csModelInfo.SetSummaryInf("演習で作成する KinematicWave河道モデル です");
            csModelInfo.SetCreatorInf("要素モデル開発演習者");
            csModelInfo.SetIconName(".\\MyExerciseModel\\Sample");

            csModelInfo.SetManualFileName(".\\MyExerciseModel\\MyExerciseModelDoc.txt"); // <-- モデル解説書

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

            return m_csCalModelInforList;
        }



  要素モデル組み込みの確認

 
 要素モデル開発用のCommonMPを Debugモードで起動し、ライブラリ管理画面に KinematicWaveモデルが追加されていることを確認します。

          


 


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

初版:2013/07/12 |