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

6章 再び要素モデルの作成
6.2 色々な要素モデル    〜 ファイル出力要素の作成例 〜


 これまでは、計算用の要素モデルの作成を行ってきました。
 しかしながら、独自のフォーマットで書かれたファイルを入力、出力したい事もあります。
 そこで、ここでは、計算要素モデルが出力した結果を、バイナリー形式でファイルに出力する要素モデルを作成してみます。
 当然のことながら、生成されたバイナリーファイルをエディターで開いても、出力結果を見ることはできません。 そこで、バイナリーファイル出力要素が書きだしたファイルを読む為のツールも用意します。 また、そのツールを使用して、画面上に2次元の情報を出力するツールも作成します。

 ファイル入力要素モデルは、 CommonMPをダウンロードすると \CommonMP\Source\HYMCO\PublicModelElement\ 下に 色々な要素モデルが存在しています。(例えば、 McTidalLevelGauging、 McRainfallGauging、等) 
 また、CommonMPのホームページ上にも、各種入力要素モデルが公開されています(ソース付き)

 しかしながら、出力要素モデルのサンプルは少ないので、本頁では、ファイル出力要素を作成します。  但し、独自フォーマットのファイル出力要素モデルが数多く作成されると、互換性の無いフォーマットファイルが多数リリースされることになるため、特殊用、個人用に留めておくか、 或いは、そのフォーマットを利用するツールも一緒にリリースすれば、良いかもしれません。

 
(1) 作成するバイナリーファイル出力要素モデルの仕様

・入力する接続線は1本だけとし、複数の情報をマージしたりする事は不可とします。
・セルの配列次元数、配列数、セル内のデータ数、セル内データの名称を 出力ファイルにヘッダーとして書き出します。
・ヘッダーの後に、受信したセル型情報を1レコードとして、次々にファイルに追加書き込みします。
・受信した情報をすべて書き込むのではなく、指定数間引きながらファイルに書き込みます。
・出力するファイル名は プロパティ画面から指定します。 ファイルは、プロジェクトフォルダー下の「OutputData」フォルダー下に生成されます。
・書き込めるデータ形式は、 ポイント時系列、1次元時系列、2次元時系列、3次元時系列情報とします。
・ファイル出力用要素モデル名称は:MyBinFileOutputModelとし、 DLL名称は xx.yy.zz.MyBinFileOutputModel.dll とします。また、namespace名は xx.yy.zz.MyBinFileOutModelLIB です。
・DLL内には、出力したファイルを読み出すツールも一緒に用意します。
 ツールの namespace 名は ファイル出力要素と同じ(xx.yy.zz.MyBinFileOutModelLIB)とし、ツールクラスの名称は 「MyBinFileReadTool」とします。


(2)出力モデルの作成


 計算要素モデルは、「McForecastModelBase」または「McStateCalModelBase」から派生して制作しました。しかしながら、 ファイル出力要素モデルは、「McBasicFileOutCtl」から派生して制作します。
 出力要素モデルのサンプルは ダウンロードしたCommonMP内に含まれる「\CommonMP\Source\HYMCO\OptionImpl\McModelSample\DebugTools\McTestOutFileModel 」です。

 計算要素モデルの場合と同様にスタブを作成します。(詳しい手順は、既に3.3章に記述した通りです。)
 @ 「MyModel」フォルダーをコピーし、「MyBinFileOutModel」フォルダーを作成します。
 A 「MyModel.csproj」の名称を「MyBinFileOutModel.csproj」に変更します。
 B Microsoft Visual C#から、単独で「MyBinFileOutModel.csproj」を開き、生成DLL名、namespace 名、ファイル名、クラス名等を変更します。
 C ソリューション「TestModelDeveloperMainExp.sln」 に「MyBinFileOutModel.csproj」を追加し、依存性にも追加します。

 ここまでは、計算要素モデルと同様です。
 
 しかし、ここで、計算要素モデルの型紙から制作した要素モデルの親クラスを「McBasicFileOutCtl」に変更します。

 ファイル出力要素は他の要素モデルへデータを送ることは無いので、「SendConnectionCheck()」メソッドは破棄します。
 また、protected override long Calculate(long lInputDataNum, ref McReceiveCellDataIF[] csInputCellData) メソッドを、 public override long Calculate(ref HySDataLinkedList csInputDataList) メソッドに変更します。
 
 ファイルへの出力は、 DataFusion()メソッドではなく、 Calculate()メソッド内で行う事とするので、 protected override long DataFusion(long lOutputDataNum, ref McSendCellDataIF[] csOutputCellData)は何もしないで return します。


        protected override long DataFusion(long lOutputDataNum, ref McSendCellDataIF[] csOutputCellData)
        {   // DoNothing
            return 0;
        }



 ReceiveConnectionCheck()メソッドで 受信する情報の次元、セル内の情報を調べておきます。
 
        protected override bool ReceiveConnectionCheck(ref McStructErrorInfo csErrorInf, long lInputDataNum, McReceiveCellDataIF[] csInputCellData)
        {
        。。。。 入力情報の次元等取得 。。。。
                long lD1 = 0; long lD2 = 0; long lD3 = 0; long lCellDataNum = 0;
                long lCellDim = csInputCellData[0].GetDimension(ref lD1, ref lD2, ref lD3, ref lCellDataNum); 

        。。。。 ファイル出力要素の前に接続されている要素モデルが設定したセル内情報の取得
                HySTimeSeriesCellArray csRcvSeriesData = m_csInputData[0] as HySTimeSeriesCellArray;
                lCellDataNum = csRcvSeriesData.GetDataDimentionInCell(); // <-- 重要
                HySDataCharacteristicInCell csChar = csRcvSeriesData.GetCellDataCharacteristic();
         


 McBasicFileOutCtl クラス内では、
 別な要素モデルからの入力情報は、入力数:m_lInputDataNum、入力接続線の情報:csInputData[ ]  として引数で与えられます。 しかし、この出力モデルへの入力数は1本だけという仕様なので、m_lInputDataNum= 1 として、csInputData[0]だけを使用します。

 入力情報 csInputData は、リンクリスト形式です。
 リンクリストは 読み出したい位置に カーソルを移動し、カーソル位置のレコードを読み出すようにします。
 カーソルは読み出したい時刻を与えることで、設定できます。(下図参照)

 


 

 SetCursorPlus()とすると、指定時刻より、一つ新しい位置ににカーソル位置を設定できます。
  (このメソッドの戻り値は、カーソル位置から最新レコードまでのレコード数です)
 このメソッドを利用する場合、最後に読みだしたいレコードの時刻を指定すると、その次時刻位置にカーソルが設定されますので、、カーソル位置からのレコードが未だ読み出していないレコードになります。

 

 

 

       public override long Calculate(ref HySDataLinkedList csInputDataList)
        {
 
             McTimeSeriesD2CellArrayTranInfo csCellD2Trn = m_csInputData[0] as McTimeSeriesD2CellArrayTranInfo;
             McD2CellArrayTranInfo csDt2Rcd = null;
             HySCellData[,] csD2RcvCellData = null;

            HhySTime csReadTime =   読みだしたい時刻

            long lDtNum = csRcvSeriesData.SetCursorPlus(csReadTime );   // <-- カーソル位置を指定する (lDtNum には、カーソル位置から最後までのレコード数が取得される)
            for (long lDtLp = 0; lDtLp < lDtNum; lDtLp++)
            {   // カーソル位置からの、残りレコードを取得する
                    csDt2Rcd = (McD2CellArrayTranInfo)csCellD2Trn.GetCursorData();  // <-- カーソル位置のデータ(レコード)を取得する

                    csD2RcvCellData = csDt2Rcd.GetCellData();   // <-- 読み出したレコード内のセル情報を取得する

                      。。。。。。。。。。。。
                    読み出したれセルデータを ファイルに書き出す。
                      。。。。。。。。。。。。

                    csRcvSeriesData.MoveCursorNext();  // カーソルを一つ進める
            }
       。。。。。。。

 
 また、McBasicFileOutCtl クラス内のメンバー変数としては
    ファイル名を設定する変数:HySString    m_csOutFileNameWithFullPath
    ファイルを操作するインスタンス:HySFile  m_csOutFile
 が、存在します。
 書き込むファイルは、ReadyCalculation()メソッド内でオープンし、CompleteCalculation()メソッド内でクローズします。

        public override bool ReadyCalculation()
        {
            bool bRtn = true;
            m_csOutFile = new HySFile(m_csOutFileNameWithFullPath.ToString());
            // 出力ファイルオープン(追加モード)
            m_csOutFile.Open(HySFile.OPEN_MODE.APPEND, HySFile.READ_WRITE_MODE.WRITE, HySFile.DIRECTORY_MODE.NOT_MK_DIR);
            return bRtn;
        }

        public override bool CompleteCalculation()
        {
            m_csOutFile.Close();
            return true;
        }

 


(3)出力ファイルの読み出しツール

 出力したファイルを読み出すツールも同時に制作します。
 ファイルをオープンした後、ヘッダーに書かれたセルの配列数や、セル内の情報を読み出します。
 その後、1レコードづつ読み取ります。
 (ツールをテストした時のテストプログラム:CommonMP\Source\HYMCO\OptionImpl\MyBinFileOutModel\BinFileReadTool\ToolTest\ToolTest\Program.cs を参照)


using CommonMP.HYMCO.Interface.Model;
using CommonMP.HYMCO.Interface.Data;
using CommonMP.HYMCO.CoreImpl.Data;
using CommonMP.HYMCO.CoreImpl.Tool;
using CommonMP.HYMCO.CoreImpl.Model;
using CommonMP.HYMCO.CoreImpl.Data.FileIO;

using xx.yy.zz.MyBinFileOutModelLIB;


namespace ToolTest
{
    class Program
    {
        static void Main(string[] args)
        {
            MyBinFileReadTool csTestTool = new MyBinFileReadTool("Z:\\Prog\\CommonMP\\CommonMPData\\MyExerciseStep2\\OutputData\\OutData.bin");

            csTestTool.FileOpen();
           
            long D1=-1; long D2=-1; long D3=-1; long lDimInCell=-1;
            long DimNo = csTestTool.GetDimention(ref  D1, ref  D2, ref  D3, ref  lDimInCell);

            for (; ; )
            {
                McFileOutRecord csRcd = csTestTool.ReadRecord();
                if (csRcd == null) {
                    break;
                }
            }
            csTestTool.FileClose();
        }
    }
}

 
 また、このツールを利用して、読みだしたファイルを表示する(2次元のみ)画面を作成しました。
 本頁の下からダウンロードしたサンプルの
 \CommonMP\Source\HYMCO\OptionImpl\MyDispBinFile2Dim 下の MyDispBinFile2Dim.sln を Microsoft Visual C# から開くと 画面プログラムを起動できます。
 
 湖の食物連鎖シミュレーションの出力(CommonMP の計算プロジェクトは、\CommonMP\CommonMPData\MyExerciseStep2\Ex22_湖その4.cmprj)を表示した例を下に示します。

    


 また、ダム操作と下流の人間の行動シミュレーションの出力結果を表示する例を 下に示します。

     
 




 ここで作成した要素モデル開発プロジェクトとテスト用のCommonMP計算プロジェクト(Ex21_CommonMP.lzh

 ダウンロードしたら解凍して生成されたフォルダー「MyBinFileOutModel」、「MyDispBinFile2Dim」、「MyLakeModel」を \CommonMP\Source\HYMCO\OptionImpl\ 下に置きます。
 それぞれ、解凍して生成されたフォルダー内のプロジェクト:MyBinFileOutModel.csproj 、MyDispBinFile2Dim.csproj 、MyLakeModel.csproj を ディバッグ用ソリューションに追加します。 また、スタートアッププロジェクト(TestModelDeveloperMainExp)の依存関係に各プロジェクトを追加します。
 バイナリ出力要素モデル用のプロジェクトは、 MyBinFileOutModel.csproj です。  MyDispBinFile2Dim.csproj は、出力したファイル(2次元情報専用)を読み出して画面に表示するプロジェクトです。 また、 MyLakeModel.csproj は、湖の食物連鎖シミュレーションモデルで、 表示すべき2次元バイナリーデータを生成するために使用します。
 
 テスト用のモデルが、\CommonMP\CommonMPData下の 「MyExerciseStep2」に出力されます。 この中の 「Ex22_湖その4.cmprj」が、制作したバイナリー出力要素を組み込んだモデルです。 動作させると、CommonMP\CommonMPData\MyExerciseStep2\OutputData 下に バイナリー情報が生成されます。 
 予め、テスト用のバイナリー情報を LakeOutData.bin として準備しています。 

 


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

初版:2013/10/14 |