Xファンクションのついたガジェットツールの作成

Originはグラフと行列上の操作を行うガジェットツールをいくつか提供しています。これらのツールは、グラフウィンドウまたは行列ウィンドウがアクティブなときに、ガジェットメニューにあります。

ガジェットツールの1つを選択すると、Originはグラフまたは行列に四角形のオブジェクトを追加し、それを使ってデータ分析したい領域を選択します。関心のある領域(ROI)を選択したら、OCguide xf gadget tool contextmenu button.png ボタンをクリックしてコンテキストメニューを開き、ダイアログまたはテーマを使って、分析方法をセットアップし、結果を希望の場所に出力します。

OCguide xf gadget tool.png

Originはユーザ定義のXファンクションのついたガジェットツールを追加し、このガジェットをOriginのガジェットツールメニューに追加する事ができます。

内容

  1. 1 ガジェットを作成する方法
  2. 2 Xファンクションを作成する
  3. 3 GraphObjCurveToolから導かれたクラスを定義する
  4. 4 イベント関数を追加する
    1. 4.1 基本的なグローバルイベント関数
    2. 4.2 仮想イベント関数のオーバーロード

ガジェットを作成する方法

次にガジェットツールを作成する3つのステップを示します。

  1. Xファンクションを作成します。
    Xファンクションはダイアログテーマを制御し、Originのガジェットメニューにガジェットツールを追加します。
  2. GraphObjCurveTool または MatObjROIToolを由来とするOrigin Cクラスを作成します。
    GraphObjCurveTool と MatObjROITool はOrigin Cの構築クラスで以下のファイルで宣言されます。
    Origin実行フォルダ\OriginC\Originlab\GraphObjTools.h
    これらのクラスは興味のある領域 (ROI) オブジェクトを作成し、イベントのデフォルト制御を提供します。イベント、例えばROIオブジェクトを移動したりサイズを変更したり、ROIのコンテキストメニューでアイテムを選択するような事を含みます。
  3. イベント関数を追加します。
    グローバルイベント関数の名前は「 xfname_イベント(アルファベット)」形式である必要があり、ここでxfnameはXファンクションの名前である事を示します。関数の引数リストは次のシンタックスを使用する必要があります。
    void xfname_events(string strGrName, int nEvent, int nMsg = 0);
            
    

次のセクションはこれらのステップをより細かく説明します。

Xファンクションを作成する

  1. Originがアクティブな状態で、Xファンクションビルダを開くためにF10キーを押してください。Xファンクションの名前と変数名を以下のように設定します。
    OCguide xf gadget tool xfbuilder.png
  2. Ocguide xfdialog savebutton.pngボタンをクリックして、Xファンクションを保存します。
  3. Ocguide xfdialog codebuilderbutton.pngボタンをクリックして、コードビルダでXファンクションのソースコードを開きます。
  4. include ステイトメントに以下の2つを追加します。
    //put additional include files here
    #include <..\Originlab\grobj_utils.h>
    #include <..\Originlab\GraphObjTools.h>
            
    
  5. quick_curve_stats_make_tree関数名を探し、そのボディ部分を以下のコードに置き換えてGUIツリーを作成します。
    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;
            
    
  6. Ocguide XF Compile Button.PNGボタンをクリックして変更点をコンパイルします。コンパイルが無事に終了したら、Ocguide XF Returntodialog Button.PNGボタンをクリックしてXファンクションビルダに戻ります。
  7. Ocguide xfdialog savebutton.pngボタンをクリックしてXファンクションをもう一度保存し、その後Xファンクションビルダを閉じます。
  8. コマンドウィンドウで「quick_curve_stats -d」を実行します。次のダイアログが表示されます。
    OCguide xf gadget tool dialog.png

Xファンクションは準備ができました。次のセクションでは、Origin Cの構築クラスから新しいクラスを導く方法を示します。

GraphObjCurveToolから導かれたクラスを定義する

このセクションでは、Origin CのGraphObjCurveToolクラスから新しいクラスを導く方法を示します。GraphObjCurveTool クラスは新しいクラスで取り扱うほとんどの内容を扱えます。

GraphObjCurveTool クラスはグラフ上で操作するガジェットを作成する際に使用します。行列データで操作するガジェットを作成する場合は、 MatObjROITool ツールを作成する必要があります。GraphObjCurveTool と MatObjROITool はどちらもGraphObjTools.h ヘッダファイルで宣言されています。

  1. quick_curve_stats.XFCをコードビルダで開きます。ファイルの上部で以下のように新しいクラスを定義します。
    //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;
            }  
    };
    
  2. Xファンクションのメイン関数へ移動し、そこで上記で定義した関数を元にROIをグラフ上に作成します。
    QuickCurveStatsTool curveTool(); 
    int nErr = curveTool.Create(XF_NAME, LN_VERTICAL, trGUI);  
    if(nErr)
    {
        error_report("quick_curve_stats failed to Init!");
        return;
    }
    curveTool.ExpandFullRange();
            
    
  3. 曲線のあるグラフをアクティブにし、コマンドウィンドウで「quick_curve_stats -d」を実行します。上部にテキストがあり、小さなボタンを2つ付けた四角形がグラフ上に追加されます。

イベント関数を追加する

基本的なグローバルイベント関数

  1. コードビルダでquick_curve_stats.XFCを開きます。そこで、//put your own support static functions here行の下に、以下のようなイベント関数を追加します。
    //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);  
    }
    
  2. コマンドウィンドウで「quick_curve_stats -d」を実行してからOKボタンを押してダイアログを閉じます。ROIに付属しているOCguide xf gadget tool contextmenu button.pngボタンをクリックして、コンテキストメニューを開きます。「新しい出力」をクリックするとスクリプトウィンドウに「DoOutput」を表示します。コンテキストメニューで「設定」を選択すると、Xファンクションの設定が表示されます。四角形の塗り色を変更し、「ツール名を表示する」コントロールにあるテキストを変更してOKをクリックします。塗り色と表示されるテキストは変更されます。

仮想イベント関数のオーバーロード

コマンドウィンドウで「quick_curve_stats -d」を実行し、Xファンクションを起動してROIをグラフに追加します。グラフ上のROIを移動すると、左側にあるOriginのステータスバーが現在のXの開始値/終了値、そしてROIの幅を表示します。以下の3つのステップはOnMove仮想メソッドをオーバーロードしてROIの上に表示されているテキストに統計の結果と「ROI moving」を表示します。

  1. QuickCurveStatsTool クラスで以下の2つのメソッドを宣言します。
    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;
            }
            
    
  2. Xファンクションを実行して、ROIをグラフに追加します。ROIに移動すると、上部のテキストは現在選択されてる情報の統計結果に更新されます。
  3. 以下はコンテキストメニューの「新しい出力」と「結果シートへ移動」が動くようになるかを示します。そのためには、導かれたQuickCurveStatsToolのクラスの中にあるDoOutput と GetReportWorksheet仮想関数をオーバーロードし、プライベート関数、acessBinaryInfoへアクセスして結果ワークシートの名前を四角形の中のバイナリ保存領域に示します。四角形からレポートワークシート名を入手できなかった場合、または結果シートの名前が不正な名前であった場合、「レポートシートへ移動」コンテキストメニューはグレーになります。QuickCurveStatsTool クラスに以下のメソッドを追加します。
    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);
                    }  
            }
            
    
  4. データプロットセットがアクティブな状態でグラフを作成し、コマンドウィンドウで「quick_curve_stats -d」を実行してROIを追加します。ROIをグラフ上の確認したい部分に移動して、コンテキストメニューを開いてから「設定」を選択してダイアログを開きます。Quantities と Output To ブランチ内にある全てのチェックボックスをチェックしてOKをクリックしてダイアログを閉じます。もう一度コンテキストメニューを開くと、「結果ワークシートへ移動」がグレーになっている事が分かります。「新しい出力」をメニューからクリックして、結果の文字列がスクリプトウィンドウと結果ログに出力され、非表示になるワークシートが作成されます。「結果ワークシートへ移動」を選択すると、結果ワークシートが表示されます。ワークシート内の列は結果を表示します。