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; } |
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(); |
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(); // カーソルを一つ進める } 。。。。。。。 |
public override bool
ReadyCalculation() |
using xx.yy.zz.MyBinFileOutModelLIB;
csTestTool.FileOpen(); for
(; ;
) |
ここで作成した要素モデル開発プロジェクトとテスト用の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 |