Origin Cは、データマーカを編集するのに次のメソッドをサポートします。
次のコードは、アクティブグラフに2つのデータマーカを追加する方法を示しています。
GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(); // データマーカのインデックス vector<int> vnBegin = {0, 9}; vector<int> vnEnd = {4, 14}; // 2つのデータマーカを追加 int nRet = dp.AddDataMarkers(vnBegin, vnEnd); if( 0 == nRet ) { out_str("Add data marker successfully."); }
以下のコードは、現在のデータマーカの位置を変更します。
GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(); // データマーカのインデックス vector<int> vnBegin = {11, 2}; vector<int> vnEnd = {19, 5}; vector<int> vnIndices = {1, 0}; // 2つのデータマーカを追加 int nRet = dp.SetDataMarkers(vnBegin, vnEnd, vnIndices); if( 0 == nRet ) { out_str("Set data marker successfully."); gl.GetPage().Refresh(); }
次のサンプルコードは、データプロットの色をセットする方法を示します。
GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(0); bool bRepaint = true; dp.SetColor(SYSCOLOR_GREEN, bRepaint);
OriginObject::GetFormat と OriginObject::ApplyFormat は、Originオブジェクトフォーマットを取得するのに使われます。 次のフォーマットの取得、セット、コピーのメカニズムは、OriginObjectの基底クラスから派生するクラスを持つすべてのOriginオブジェクトに対して使うことができます(クラスの階層を参照)。 例えば、Originオブジェクトは、DataPlot クラス, Worksheet クラス, WorksheetPage クラス, MatrixLayer クラス, MatrixPage クラス, GraphLayer クラス, GraphPage クラスのオブジェクトにすることができます。
DataPlot クラスは、DataObjectBase クラスから派生され、DataObjectBase クラスは、OriginObject クラスがら派生されるので、DataPlot::GetFormat を呼び出して、フォーマットツリー構造を取得できます。
次のコードを使って、フォーマットツリー構造を見る2つの方法があります。
GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(-1); // アクティブデータプロットを取得 // 異なるプロットタイプ(例えば、折れ線、ボックスチャート...) は、 // フォーマットツリーの異なる構造を持ちます。 Tree tr; // ツリー構造の詳細を表示するフォーマットツリーを取得 tr = dp.GetFormat(FPB_ALL, FOB_ALL, true, true); out_tree(tr); // フォーマットツリーを取得
GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(-1); //アクティブデータプロットを取得 // 折れ線プロットのフォーマットをセット // Note:フォーマットツリーの構造を取得するには前のセクションを参照 Tree tr; tr.Root.Line.Connect.nVal = 2; // 2点のセグメントに対しては2 tr.Root.Line.Color.nVal = RGB2OCOLOR(RGB(100, 100, 220)); tr.Root.Line.Width.dVal = 1.5; if( 0 == dp.UpdateThemeIDs(tr.Root) ) { bool bRet = dp.ApplyFormat(tr, true, true); }
データプロットからテーマファイルにフォーマットツリーを取得し保存すると、テーマファイルをツリーにロードし、フォーマットツリーを別のデータプロットに適用できます。
// Graph1からテーマファイルにプロット設定を保存 GraphPage gpSource("Graph1"); GraphLayer glSource = gpSource.Layers(0); DataPlot dpSource = glSource.DataPlots(0); Tree tr; tr = dpSource.GetFormat(FPB_ALL, FOB_ALL, true, true); string strTheme = GetAppPath(false) + "plotsettings.XML"; tr.Save(strTheme); // テーマファイルからプロット設定をツリーにロードし、 // ツリーからデータプロットオブジェクトにフォーマットを適用 GraphPage gpDest("Graph2"); GraphLayer glDest = gpDest.Layers(0); DataPlot dpDest = glDest.DataPlots(0); Tree tr2; tr2.Load(strTheme); dpDest.ApplyFormat(tr2, true, true);
あるデータプロットからのプロット設定をツリーに取得すると、このツリーから別のプロットオブジェクトに設定を適用できます。
GraphPage gpSource("Graph1"); GraphLayer glSource = gpSource.Layers(0); DataPlot dpSource = glSource.DataPlots(0); GraphPage gpDest("Graph2"); GraphLayer glDest = gpDest.Layers(0); DataPlot dpDest = glDest.DataPlots(0); // 元のデータプロットからフォーマットを取得 Tree tr; tr = dpSource.GetFormat(FPB_ALL, FOB_ALL, true, true); // フォーマットを別のデータプロットに適用 dpDest.ApplyFormat(tr, true, true);
GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(-1); // アクティブデータプロットを取得 // シンボルフォーマットをセット Tree tr; tr.Root.Symbol.Size.nVal = 12; // シンボルのサイズ tr.Root.Symbol.Shape.nVal = 1; // 円 tr.Root.Symbol.Interior.nVal = 1; // 内部 tr.Root.Symbol.EdgeColor.nVal = SYSCOLOR_RED; tr.Root.Symbol.FillColor.nVal = SYSCOLOR_BLUE; // 垂直ドロップラインの表示 tr.Root.DropLines.Vertical.nVal = 1; tr.Root.DropLines.VerticalColor.nVal = SYSCOLOR_LTGRAY; tr.Root.DropLines.VerticalStyle.nVal = 1; tr.Root.DropLines.VerticalWidth.nVal = 1.5; if( 0 == dp.UpdateThemeIDs(tr.Root) ) { bool bRet = dp.ApplyFormat(tr, true, true); }
Origin Cを使って、グループ化したプロットに対するフォーマットをセットします。 同じ操作を、作図の詳細ダイアログで、グループタブで行うことができます。フォーマットには線の色、シンボルタイプ、シンボルの内部、線種が含まれます。
次のサンプルは、線+シンボルグラフのフォーマットをセットする方法を示しています。このグループには4つのデータプロットがあるものとします。
GraphLayer gl = Project.ActiveLayer(); GroupPlot gplot = gl.Groups(0); // レイヤ内の最初のグループ // Nesterはグループ内でネストするオブジェクトタイプの配列 // グループ内で周期的にネストする4種類の設定 vector<int> vNester(3); vNester[0] = 0; // グループ内で周期的に線の色を変更 vNester[1] = 3; // グループ内で周期的にシンボルを変更 vNester[2] = 8; // グループ内で周期的にシンボル内部を変更 gplot.Increment.Nester.nVals = vNester; // グループプロットのNester // フォーマット設定を4つのプロットへのvectorに配置 vector<int> vLineColor = {SYSCOLOR_BLUE, SYSCOLOR_OLIVE, SYSCOLOR_RED, SYSCOLOR_CYAN}; vector<int> vSymbolShape = {1, 3, 5, 8}; vector<int> vSymbolInterior = {1, 2, 5, 0}; Tree tr; tr.Root.Increment.LineColor.nVals = vLineColor; // 線の色をテーマツリーにセット tr.Root.Increment.Shape.nVals = vSymbolShape; // シンボルの形状をテーマツリーにセット // シンボルの内部をテーマツリーにセット tr.Root.Increment.SymbolInterior.nVals = vSymbolInterior; if(0 == gplot.UpdateThemeIDs(tr.Root) ) { bool bb = gplot.ApplyFormat(tr, true, true); // テーマツリーを適用 }
DataPlotクラスは、カラーマップの設定をするための2つのオーバーロードメソッド持ちます。
次のサンプルでは、等高線図のZカラーマップの設定方法を示します。
GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(0); // Zレベルの元のカラーマップを取得 vector vZs; BOOL bLogScale = FALSE; BOOL bRet = dp.GetColormap(vZs, bLogScale); int nLevels = vZs.GetSize(); // Zレベルのvectorを減少させ、DataPlotに戻してセット double min, max; vZs.GetMinMax(min, max); double dChangeVal = fabs(max - min) * 0.2; bool bIncrease = true; if( !bIncrease ) dChangeVal = 0 - dChangeVal; min = min - dChangeVal; max = max - dChangeVal; double inc = (max - min) / nLevels; vZs.Data(min, max, inc); dp.SetColormap(vZs);
次のサンプルでは、カラーマップZ値レベルをLog10スケールタイプでセットする方法を示しています。
bool plot_matrix(LPCSTR lpsczMatPage, LPCSTR lpcszGraphTemplate = "contour" , int nPlotID = IDM_PLOT_CONTOUR) { // 特定行列ページから行列オブジェクトを取得 MatrixPage matPage = Project.MatrixPages(lpsczMatPage); if( !matPage ) { out_str("Invalid matrix page"); return false; } // 行列ページのアクティブシートを取得 MatrixLayer ml = matPage.Layers(-1); // 行列シート内のアクティブ行列オブジェクトを取得 MatrixObject mobj = ml.MatrixObjects(-1); // テンプレートで非表示のグラフページを作成し、プロットを追加 // 非表示として、描画しない GraphPage gp; gp.Create(lpcszGraphTemplate, CREATE_HIDDEN); GraphLayer glay = gp.Layers(); int nPlot = glay.AddPlot(mobj, nPlotID); if(nPlot < 0) { out_str("fail to add data plot to graph"); return false; } glay.Rescale(); // XY軸を再スケール // Zレベルベクトルを構築 int nNewLevels = 4; double min = 0.1, max = 100000.; double step = (log10(max) - log10(min)) / (nNewLevels - 1); vector vLevels; vLevels.SetSize(nNewLevels); vLevels.Data(log10(min), log10(max), step); vLevels = 10^vLevels; // パーセントでZ値をセット。実際のZ値ではないことに注意 // 最初の値は0、最後の値は < 100 である必要がある vLevels = 100*(vLevels - min)/(max - min); Tree tr; tr.ColorMap.Details.Levels.dVals = vLevels; tr.ColorMap.ScaleType.nVal = 1; // 1 は log10 tr.ColorMap.Min.dVal = min; tr.ColorMap.Max.dVal = max; DataPlot dp = glay.DataPlots(nPlot); bool bRet = dp.SetColormap(tr); if( !bRet ) { out_str("fail to set colormap"); return false; } gp.Label = "Plot created using template: " + (string)lpcszGraphTemplate; gp.TitleShow = WIN_TITLE_SHOW_BOTH; gp.SetShow(); // 用意できたら表示 return true; }
上述のplot_matrix 関数をcoutour テンプレートとともに呼び出し、IDM_PLOT_CONTOUR プロットid で等高線図を作成してカラーマップをセットします。
void plot_contour_ex(LPCSTR lpcszMatPage) { plot_matrix(lpcszMatPage, "contour", IDM_PLOT_CONTOUR); }
上述の plot_matrix 関数を image テンプレートと共に呼び出し、IDM_PLOT_MATRIX_IMAGE プロット id でイメージグラフを作成してカラーマップをセットします。
void plot_image_ex(LPCSTR lpcszMatPage) { plot_matrix(lpcszMatPage, "image", IDM_PLOT_MATRIX_IMAGE); }
次のサンプルでは、塗りつぶし色を削除し、等高線図の線の色、スタイル、幅、テキストラベルをセットします。
GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(0); Tree tr; dp.GetColormap(tr); // 塗りつぶし色削除 tr.ColorFillControl.nVal = 0; // 線の色を設定 vector<int> vnLineColors; vnLineColors = tr.Details.LineColors.nVals; int nLevels = vnLineColors.GetSize(); vnLineColors.Data(1, nLevels, 1); tr.Details.LineColors.nVals = vnLineColors; // 全ての線のスタイルを破線にセット vector<int> vnLineStyles(vnLineColors.GetSize()); vnLineStyles = 1; tr.Details.LineStyles.nVals = vnLineStyles; // 全ての線の幅をセット vector vdLineWidths(vnLineColors.GetSize()); vdLineWidths = 3; tr.Details.LineWidths.dVals = vdLineWidths; // ラベルの表示/非表示。最初の2つ以外を表示 vector<int> vnLabels(vnLineColors.GetSize()); vnLabels = 1; vnLabels[0] = 0; vnLabels[1] = 0; tr.Details.Labels.nVals = vnLabels; // グラフの背景の設定 dp.SetColormap(tr);
このサンプルでは、等高線グラフのテキストラベルのフォーマット(例:色、サイズ、太字、斜体)をセットする方法を示します。
GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(0); // カラーマッププロットの関連オブジェクトのすべてのプロパティを取得 Tree tr; tr = dp.GetFormat(FPB_ALL, FOB_ALL, true, true); // すべてのラベルを表示 vector<int> vnLabels; vnLabels = tr.Root.ColorMap.Details.Labels.nVals; vnLabels = 1;// 0 は非表示、1 は表示 tr.Root.ColorMap.Details.Labels.nVals = vnLabels; // ラベルに対して数値フォーマットをセット tr.Root.NumericFormats.Format.nVal = 0; // 十進法 tr.Root.NumericFormats.DigitsControl.nVal = 0; tr.Root.NumericFormats.SignificantDigits.nVal = 5;//小数点以下桁数 tr.Root.NumericFormats.Prefix.strVal = "_"; tr.Root.NumericFormats.Suffix.strVal = "Label"; tr.Root.NumericFormats.MinArea.nVal = 5; // ラベル Criteria - Min Area(%) // ラベルに対してテキストフォーマットをセット tr.Root.Labels.Color.nVal = SYSCOLOR_BLUE; //FontFaceIndex_to_DWORD は、GUIインデックスからDWORD実数値に変換するのに使用 tr.Root.Labels.Face.nVal = FontFaceIndex_to_DWORD(2);// GUI内に3番目のフォントを選択 tr.Root.Labels.Size.nVal = 20; tr.Root.Labels.WhiteOut.nVal = 1; tr.Root.Labels.Bold.nVal = 1; tr.Root.Labels.Italic.nVal = 1; tr.Root.Labels.Underline.nVal = 1; if(0 == dp.UpdateThemeIDs(tr.Root) ) dp.ApplyFormat(tr, true, true);