Originはグラフと行列上の操作を行うガジェットツールをいくつか提供しています。これらのツールは、グラフウィンドウまたは行列ウィンドウがアクティブなときに、ガジェットメニューにあります。
ガジェットツールの1つを選択すると、Originはグラフまたは行列に四角形のオブジェクトを追加し、それを使ってデータ分析したい領域を選択します。関心のある領域(ROI)を選択したら、 ボタンをクリックしてコンテキストメニューを開き、ダイアログまたはテーマを使って、分析方法をセットアップし、結果を希望の場所に出力します。
Originはユーザ定義のXファンクションのついたガジェットツールを追加し、このガジェットをOriginのガジェットツールメニューに追加する事ができます。
内容 |
次にガジェットツールを作成する3つのステップを示します。
void xfname_events(string strGrName, int nEvent, int nMsg = 0);
次のセクションはこれらのステップをより細かく説明します。
//put additional include files here #include <..\Originlab\grobj_utils.h> #include <..\Originlab\GraphObjTools.h>
if( 0 == strcmp(lpcszVarName, "trGUI") ) { GETN_USE(tr) GETN_OPTION_BRANCH(GETNBRANCH_OPEN) // デフォルトでブランチを開く int nUserID = GET_USER_DATAID(0); int nBranchID = 1; GETN_STR(toolname, STR_TOOLNAME, "Quick Curve Stats")GETN_ID(nUserID++) // 編集ボックスと共にチェックボックスコントロールを追加 GETN_CONTROL_OPTION_BOX(1) GETN_COLOR(rectColor, "Rectangle Fill Color", SYSCOLOR_LTYELLOW) GETN_ID(nUserID++) GETN_COLOR_CHOICE_OPTIONS(COLORLIST_CUSTOM | COLORLIST_SINGLE) // 結果オプションを出力するためのQuantitiesブランチ GETN_BEGIN_BRANCH(quantities, "Quantities") GETN_ID(nBranchID++) GETN_OPTION_BRANCH(GETNBRANCH_OPEN|GETNBRANCH_CHECK_CONTROL) GETN_CHECK(dataname, "Dataset Name", true) GETN_ID(nUserID++) GETN_CHECK(n, "Total Number", true) GETN_ID(nUserID++) GETN_CHECK(sum, "Sum", true) GETN_ID(nUserID++) GETN_CHECK(mean, "Mean", true) GETN_ID(nUserID++) GETN_CHECK(sd, "Standard Deviation", false) GETN_ID(nUserID++) GETN_CHECK(se, "SE of Mean", false) GETN_ID(nUserID++) GETN_END_BRANCH(quantities) // Quantitiesブランチ終了 // 出力先のオプションのためのOutput Toブランチ GETN_BEGIN_BRANCH(output, "Output To") GETN_ID(nBranchID++) GETN_CHECK(script, "Script Window", true) GETN_ID(nUserID++) GETN_CHECK(reslog, "Results Log", false) GETN_ID(nUserID++) GETN_CHECK(outputwks, "Output to Worksheet", false) GETN_ID(nUserID++) GETN_END_BRANCH(output) // Output Toブランチの終了 } return 0;
Xファンクションは準備ができました。次のセクションでは、Origin Cの構築クラスから新しいクラスを導く方法を示します。
このセクションでは、Origin CのGraphObjCurveToolクラスから新しいクラスを導く方法を示します。GraphObjCurveTool クラスは新しいクラスで取り扱うほとんどの内容を扱えます。
GraphObjCurveTool クラスはグラフ上で操作するガジェットを作成する際に使用します。行列データで操作するガジェットを作成する場合は、 MatObjROITool ツールを作成する必要があります。GraphObjCurveTool と MatObjROITool はどちらもGraphObjTools.h ヘッダファイルで宣言されています。
//put additional include files here #include <GetNbox.h> #include <..\originlab\grobj_utils.h> #include <..\Originlab\GraphObjTools.h> #define XF_NAME "quick_curve_stats" #define TOOL_PREFERENCES_TITLE _L("Statistics") class QuickCurveStatsTool : public GraphObjCurveTool { protected: string GetXFName() { return XF_NAME; } string GetSignature() { return "xf_addtool_quick_curve_stats"; } string GetPreferenceTitle(){ return TOOL_PREFERENCES_TITLE; } // この関数はこの下のイベント追加関数セクションで書き換える bool DoOutput(bool bUpdateLastOutput, bool bMarkerOnly = false) { out_str("DoOutput"); return true; } };
QuickCurveStatsTool curveTool(); int nErr = curveTool.Create(XF_NAME, LN_VERTICAL, trGUI); if(nErr) { error_report("quick_curve_stats failed to Init!"); return; } curveTool.ExpandFullRange();
//put your own support static functions here void quick_curve_stats_events(string strGrName, int nEvent, int nMsg = 0) { QuickCurveStatsTool sTool; graphobjtool_events(sTool, strGrName, nEvent, nMsg); }
コマンドウィンドウで「quick_curve_stats -d」を実行し、Xファンクションを起動してROIをグラフに追加します。グラフ上のROIを移動すると、左側にあるOriginのステータスバーが現在のXの開始値/終了値、そしてROIの幅を表示します。以下の3つのステップはOnMove仮想メソッドをオーバーロードしてROIの上に表示されているテキストに統計の結果と「ROI moving」を表示します。
protected: BOOL OnMove() { string strTopText = getResult(); UpdateTopLabel(strTopText, true); return true; } private: string getResult(TreeNode& trResult = NULL) { // 選択したROI のデータを取得 vector vx, vy; GetData(vx, vy); // データで統計を計算 int npts; double sum, mean, sd, se; vy.Sum(sum); if( 0 != ocmath_basic_summary_stats(vy.GetSize(), vy, &npts, &mean, &sd, &se) ) { return "Error in calculation!"; } // GUIから出力オプションを入手 Tree trGUI; GetGUITree(trGUI); bool bDatasetName = trGUI.quantities.dataname.nVal, bPoints = trGUI.quantities.n.nVal, bSum = trGUI.quantities.sum.nVal, bMean = trGUI.quantities.mean.nVal, bSD = trGUI.quantities.sd.nVal, bSE = trGUI.quantities.se.nVal; string strDatasetName; if( bDatasetName ) { m_dp.GetRangeString(strDatasetName); } // 結果を文字列に入力 string strText; string strNumDec = "*", strNextLine = "\r\n"; if( bDatasetName ) strText += "Dataset Name: " + strDatasetName + strNextLine; if( bPoints ) strText += "N = " + npts + strNextLine; if( bSum ) strText += "Sum = " + ftoa(sum, strNumDec) + strNextLine; if( bMean ) strText += "Mean = " + ftoa(mean, strNumDec) + strNextLine; if( bSD ) strText += "SD = " + ftoa(sd, strNumDec) + strNextLine; if( bSE ) strText += "SE = " + ftoa(se, strNumDec) + strNextLine; strText.TrimRight(strNextLine); // 結果をツリーに入力 if( trResult && trResult.IsValid() ) { GETN_USE(trResult) if( bDatasetName ) { GETN_STR(DatasetName, "Dataset Name", strDatasetName) GETN_CURRENT_SUBNODE.SetAttribute(STR_TYPE_ATTRIB, TNVAL_TYPE_CSTRING); } if( bPoints ) { GETN_NUM(N, "Number of Points", npts) } if( bSum ) { GETN_NUM(Sum, "Sum", sum) } if( bMean ) { GETN_NUM(Mean, "Mean", mean) } if( bSD ) { GETN_NUM(SD, "SD", sd) } if( bSE ) { GETN_NUM(SE, "SE", se) } } return strText; }
protected: bool DoOutput(bool bUpdateLastOutput) { Tree trGUI; GetGUITree(trGUI); // 出力結果を文字列とツリーノードに出力 Tree tr; TreeNode trResult; if( trGUI.output.outputwks.nVal ) trResult = tr.AddNode("Result"); string strResult = getResult(trResult); // スクリプトウィンドウに出力、オプション if( trGUI.output.script.nVal ) { LT_execute("type -a"); // to open Script window if closed out_str(strResult); } // 結果ログに出力、オプション if( trGUI.output.reslog.nVal ) { Project.OutStringToResultsLog(strResult); } // ワークシートに出力、オプション if( trGUI.output.outputwks.nVal ) { // すでに存在しているなら、出力ワークシートを確認 Worksheet wks; string strOutputWks; bool bCreateNew = true; if( acessBinaryInfo(true, strOutputWks) ) { wks.Attach(strOutputWks); bCreateNew = !wks.IsValid(); } // 存在しない場合、新たにワークシートを作成 // それからワークシート名を四角形のバイナリ保存領域に入力 if( bCreateNew ) { wks.Create(NULL, CREATE_HIDDEN); wks.SetSize(-1, 0); wks.GetRangeString(strOutputWks); acessBinaryInfo(false, strOutputWks); } out_tree_to_wks(trResult, wks); } return true; } BOOL GetReportWorksheet(Worksheet& wksReport) { string strWks; if( acessBinaryInfo(true, strWks) ) { wksReport.Attach(strWks); return wksReport.IsValid(); } return false; } private: bool acessBinaryInfo(bool bGet, string& strInfo) { string strStorageName = "Info"; Tree tr; if( bGet ) { // 四角形のバイナリ保存領域から出力ワークシート名を入手 if( m_go.GetBinaryStorage(strStorageName, tr) && tr.OutputWks && !tr.OutputWks.IsEmpty() ) { strInfo = tr.OutputWks.strVal; return true; } return false; } else { // 出力ワークシート名を四角形のバイナリ保存領域に保存 tr.OutputWks.strVal = strInfo; return m_go.PutBinaryStorage(strStorageName, tr); } }