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

6章 再び要素モデルの作成
6.1 独自プロパティ画面の作成
(その3 モデルの完成)


6.1.7  処理実装

 前頁で 要素モデルとプロパティ画面のスタブを完成させ、起動することを確認しました。 この頁では 処理を実装します。
 要素モデルの実装は DynamicModel実装の場合を参考にして行います。
 手順は以下の様になります。

独自プロパティデータ(MyKinematicWavePropertyData)クラスの実装
(1-1)メンバー変数追加
(1-2)Clone、CopyInf メソッド実装
(1-3)XmlOUT、XmlIN メソッド実装

(2)独自初期化データ(MyKinematicWaveInitialData)クラスの実装
(2-1)メンバー変数追加
(2-2)Clone、CopyInf メソッド実装
(2-2)XmlOUT、XmlIN メソッド実装

(3)ファクトリークラスの実装
(3-1)CreateModelProperty メソッド実装
(3-2)CreateModelInitialInfo メソッド実装

(4)演算データ(MyKinematicWaveCalInfo)クラスの実装
(4-1)メンバー変数の追加
(4-2)Clone、CopyInfo メソッド実装

(5)要素モデル(MyKinematicWaveModel)クラス実装
(5-1)ReceiveConnectionCheck、SendConnectionCheck メソッド実装
(5-2)Initialize メソッド実装
(5-3)Calculate、DataFusion メソッド実装
(5-4)SetProperty メソッド実装



(1)独自プロパティデータ(MyKinematicWavePropertyData)クラスの実装
(1-1)メンバー変数追加
 
  画面から設定したい変数を プロパティ画面のメンバー変数として追加します。
    public class MyKinematicWavePropertyData : McCellModelPropertyInfo
    {
        public double XL = 100.0 * 1000.0;
        public long NX = 50;
        public double SLOPE = 1.0 / 2000.0;
        public double WIDTH = 200.0;
        public double ROUGH = 0.03;


(1-2)Clone、CopyInf メソッド実装
 
  Cloneメソッドは スタブ作成時に実装した内容で修正する必要が有りません。 CopyInfoメソッドは 追加したメンバー変数をコピーするように修正します。
        protected override void CopyInf(McPropertyInfoRoot csOrgObj)
        {
            base.CopyInf(csOrgObj);
            MyKinematicWavePropertyData csPrpOrgObj = csOrgObj as MyKinematicWavePropertyData;
            if (csPrpOrgObj != null)
            {
                // ToDo 独自メンバー変数のコピー処理を追加して下さい。
                XL = csPrpOrgObj.XL;
                NX = csPrpOrgObj.NX;
                SLOPE = csPrpOrgObj.SLOPE;
                WIDTH = csPrpOrgObj.WIDTH;
                ROUGH = csPrpOrgObj.ROUGH;
            }
        } 

(1-3)XmlOUT、XmlIN メソッド実装

 プロパティデータクラスと次の初期化データクラスは 画面から設定した内容を  Xmlファイルに書き出したり、読み込んだりする機能が必要です。 この機能は、CUI版のCommonMPで使用します。 GUI版CommonMPは画面でオペレーターが要素モデル設定値を設定しますが、CUI版CommonMPは構造定義ファイルに記述された設定値を読み込んで、要素モデルの設定値とします。 XmlOUT、XmlIN メソッドは構造定義ファイルのRead、Writeに使用します。

   
 
 プロパティ情報は <Property>タグ内に設定されます。 
 設定方法としては、 <Property>タグの属性として セットする方法と、下位に新しいタグとしてセットする方法の2種類があります。
 KinematicWaveモデルでは、その両方を使用しています。

        public override HySXmlNode XmlOUT(ref HySXmlWriter csXmlWriter)
        {
            HySXmlNode csRtn = base.XmlOUT(ref csXmlWriter);
            // ToDo 独自メンバーのXML出力処理を入れます。

            //   属性として追加する場合
            csRtn.SetAttribute("NX", NX.ToString());

            // 別タグとして追加する場合
            HySXmlNode csLclNode;
            csLclNode = HySXmlNode.CreateElement("Val_XL", csXmlWriter);
            csLclNode.SetAttribute("XL", XL.ToString());
            csRtn.AppendChild(csLclNode);

            csLclNode = HySXmlNode.CreateElement("Val_SLOPE", csXmlWriter);
            csLclNode.SetAttribute("SLOPE", SLOPE.ToString());
            csRtn.AppendChild(csLclNode);

            csLclNode = HySXmlNode.CreateElement("Val_WIDTH", csXmlWriter);
            csLclNode.SetAttribute("WIDTH", WIDTH.ToString());
            csRtn.AppendChild(csLclNode);

            csLclNode = HySXmlNode.CreateElement("Val_ROUGH", csXmlWriter);
            csLclNode.SetAttribute("ROUGH", ROUGH.ToString());
            csRtn.AppendChild(csLclNode);
            return csRtn;
        }

        public override bool XmlIN(HySXmlNode csPrptyXml)
        {
            bool bRtn = base.XmlIN(csPrptyXml);
            // ToDo 独自メンバーのXML入力処理を入れます。

            //   属性として追加する場合
            string sValueAttr = "";
            sValueAttr = csPrptyXml.GetAttribute("NX");
            if (sValueAttr != "")
            {
                NX = Convert.ToInt32(sValueAttr);
            }
           
            // 別タグとして追加する場合
            HySXmlNode csXml = null;
            HySXmlNodeList csXmlVariableList = csPrptyXml.GetChildNodeListByTagName("Val_XL");
            csXml = csXmlVariableList.GetNode(0);
            sValueAttr = csXml.GetAttribute("XL");
            csXmlVariableList = csPrptyXml.GetChildNodeListByTagName("Val_SLOPE");
            csXml = csXmlVariableList.GetNode(0);
            sValueAttr = csXml.GetAttribute("SLOPE");
            csXmlVariableList = csPrptyXml.GetChildNodeListByTagName("Val_WIDTH");
            csXml = csXmlVariableList.GetNode(0);
            sValueAttr = csXml.GetAttribute("WIDTH");
            csXmlVariableList = csPrptyXml.GetChildNodeListByTagName("Val_ROUGH");
            csXml = csXmlVariableList.GetNode(0);
            sValueAttr = csXml.GetAttribute("ROUGH");

            return bRtn;
        } 



(2)独自初期化データ(MyKinematicWaveInitialData)クラスの実装
(2-1)メンバー変数追加
(2-2)Clone、CopyInf メソッド実装
(2-3)XmlOUT、XmlIN メソッド実装


 プロパティデータクラスの場合と同様に メンバー変数を追加し、各メソッドを実装します。  
    public class MyKinematicWaveInitialData : McInitialInfo
    {
        /// <summary>初期流量 </summary>
        public double m_dInitQ;
     。。。。。。。。。。。
        protected override void CopyInf(McPropertyInfoRoot csOrgObj)
        {
            base.CopyInf(csOrgObj);
            MyKinematicWaveInitialData csPrpOrgObj = csOrgObj as MyKinematicWaveInitialData;
            if (csPrpOrgObj != null)
            {
                m_dInitQ = csPrpOrgObj.m_dInitQ;
            }
        }

     。。。。。。。。。。。
        public override HySXmlNode XmlOUT(ref HySXmlWriter csXmlWriter)
        {
            HySXmlNode csRtn = base.XmlOUT(ref csXmlWriter);

            //   属性として追加する場合
            csRtn.SetAttribute("m_dInitQ", m_dInitQ.ToString());
            return csRtn;
        }

        public override bool XmlIN(HySXmlNode csPrptyXml)
        {
            bool bRtn = base.XmlIN(csPrptyXml);

            //   属性として追加する場合
            string sValueAttr = "";
            sValueAttr = csPrptyXml.GetAttribute("m_dInitQ");
            if (sValueAttr != "")
            {
                m_dInitQ = Convert.ToDouble(sValueAttr);
            }
            return bRtn;
        } 
     。。。。。。。。。。。



(3)ファクトリークラスの実装
(3-1)CreateModelProperty メソッド実装

 
 デフォルト値と、受信・送信パターンを設定します。
 受信・送信パターンは 「MyDynamicWaveModel」 モデルの時と同様とします。

public override McCellModelPropertyIF CreateModelProperty(HySID csLibraryID, HySObjectKind csModelKind)
{
       。。。。。。。。。。
            else if (csModelKind.Equals(MyExerciseModelDefine.MY_KINEMATIC_MODEL_KIND) == true)
            {
                csRtnCellPrptyDt = new MyKinematicWavePropertyData(csLibraryID, csModelKind);
                csRtnCellPrptyDt.SetStepTime(60); // δT設定 60秒

                MyKinematicWavePropertyData csKinematicPrpty = csRtnCellPrptyDt as MyKinematicWavePropertyData;

                csKinematicPrpty.XL = 100.0 * 1000.0;
                csKinematicPrpty.NX = 50;
                csKinematicPrpty.ROUGH = 0.03;
                csKinematicPrpty.WIDTH = 200.0;
                csKinematicPrpty.SLOPE = 1.0 / 2000.0;

                // 受信可能なパターン
                {
                    // 第1パターン
                    McTranInfoPattern csTrnPtn = csRtnCellPrptyDt.CreateTranInforPattern(
                        MyExerciseModelDefine.IN_PATTERN_TOP,
                        McTranInfoDefine.SINGLE_CELL_SERIAL,
                        "上流端流入") as McTranInfoPattern;
                    {
                        // セル内変数設定
                        HySDataCharacteristicInCell csCellChara = csTrnPtn.CreateCellDataCharacteristic(1);
                        {
                            csCellChara.SetDataKind(0, "流量", HySDataCharacteristicInCell.DATA_KIND.QUANTITY_OF_WATER_FLOW, "m3/sec");
                        }
                        csTrnPtn.SetCellDataCharacteristic(csCellChara); // セル情報設定
                        csTrnPtn.SetInterpolateType(HySDefine.InterpolateType.LINEAR); // 内挿方法設定
                    }
                    csRtnCellPrptyDt.AddReceivePattern(csTrnPtn);    // 受信可能パターンの追加
                }
                // 送信パターンの設定
                {
                    // 第1パターン
                    McTranInfoPattern csTrnPtn = csRtnCellPrptyDt.CreateTranInforPattern(
                        MyExerciseModelDefine.OUT_PATTERN_BOTTOM,
                        McTranInfoDefine.SINGLE_CELL_SERIAL,
                        "下流端出力") as McTranInfoPattern;
                    {
                        // セル内変数設定
          。。。。。。。。。


 (3-2)CreateModelInitialInfo メソッド実装

 デフォルト値の設定を行います。
public override McPropertyInfoRoot CreateModelInitialInfo(HySID csLibraryID, HySObjectKind csModelKind)
{
       。。。。。。。。。。
            else if (csModelKind.Equals(MyExerciseModelDefine.MY_KINEMATIC_MODEL_KIND) == true)
             {
                csRtnDt = new MyKinematicWaveInitialData(csLibraryID, csModelKind);
                ((MyKinematicWaveInitialData)csRtnDt).m_dInitQ = 0.1;
            } 


(4)演算データ(MyKinematicWaveCalInfo)クラスの実装
(4-1)メンバー変数の追加
(4-2)Clone、CopyInfo メソッド実装

 DynamicWaveモデル作成の場合と同様に 第2章で作成したDynamicWaveモデル(CSSMDL2.lzh)の内容をクラス内にコピーし実装します。 

    [Serializable]
    public class MyKinematicWaveCalInfo : McCalInfo
    {
        public long NXX = 500;
        public double DX;
        public double[] X;
        public double[] H;
     。。。。。。。。。

        public override bool CopyInfo(McCalInfo csOrgInfo)
        {
            MyDynamicWaveCalInfo csOrdDt = (MyDynamicWaveCalInfo)csOrgInfo; // キャスト

            // To Do
            // 此処に、追加したメンバーをコピーする処理を入れます。
            DX=csOrdDt.DX;
            X=new double[NXX];
            H=new double[NXX];
            H1=new double[NXX];
            Q=new double[NXX]; 
     。。。。。。。。。



(5)要素モデル(MyKinematicWaveModel)クラス実装
(5-1)ReceiveConnectionCheck、SendConnectionCheck メソッド実装
(5-2)Initialize メソッド実装
(5-3)Calculate、DataFusion メソッド実装
(5-4)SetProperty メソッド実装

 DynamicWave要素モデルの各メソッドを参考にし、第2章で作成したDynamicWaveモデル(CSSMDL2.lzh)の内容をコピーしメソッドを実装します。

    public class MyKinematicWaveModel : McForecastModelBase
    {
        /// <summary> 演算データ(キャスト用) </summary>
        MyKinematicWaveCalInfo m_csMyInf = null;   // 便利の為、キャスト用に定義しておく
     。。。。。。。。。
        protected override bool ReceiveConnectionCheck(ref McStructErrorInfo csErrorInf, long lInputDataNum, McReceiveCellDataIF[] csInputCellData)
        {
            bool bRtn = true;

            if (lInputDataNum < 1)
            { 
     。。。。。。。。。
            }
            return bRtn;
        }
        protected override bool SendConnectionCheck(ref McStructErrorInfo csErrorInf, long lOutputDataNum, McSendCellDataIF[] csOutputCellData)
        {
            bool bRtn = true;
            if (lOutputDataNum == 0)
       。。。。。。。。。
            return bRtn;
        }
        protected override bool Initialize(ref McPropertyInfoRoot csInitialData, long lInputDataNum, ref McReceiveCellDataIF[] csInputCellData)
        {
            bool bRtn = false;
            // 引数で与えられたデータを キャストしています。
            MyKinematicWaveInitialData csInDt = csInitialData as MyKinematicWaveInitialData;
            if (csInDt != null)
            {
                bRtn = true;
          。。。。。。。。。
            }
            return bRtn;
        }
        protected override long Calculate(long lInputDataNum, ref McReceiveCellDataIF[] csInputCellData)
        {
            double m_DT = m_csDltTime.GetTime();

            // start of 受信情報取得
            double dQIN = 0.0;
          。。。。。。。。。
            return 0;
        }

        protected override long DataFusion(long lOutputDataNum, ref McSendCellDataIF[] csOutputCellData)
        {
            HySID csSndPttnID;
            HySCellData[] csSndCellData = null;
          。。。。。。。。。
            return 0;
        }



 


 ここで作成した要素モデル開発プロジェクト(Ex12_CommonMP.lzh

 ダウンロードしたら解凍して生成されたフォルダー「MyExerciseModel」、「MyExerciseModelProperty」を \CommonMP\Source\HYMCO\OptionImpl\ 下に置きます。   
 解凍して生成されたプロジェクト:MyExerciseModel.csproj 、MyExerciseModelProperty.csprojを ディバッグ用ソリューションに追加し、スタートアッププロジェクト(TestModelDeveloperMainExp)の依存関係に追加します。 また、 解凍して生成された、「MyExerciseStep1」フォルダーを \CommonMP\CommonMPData\ 下に置きます



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

初版:2013/08/03 |