Minimum Origin Version Required: Origin 8 SR0
Following code show how to access graph format using Origin C code.
To customize graph format, you may use OriginObject::GetFormat to get the format tree of one Origin object(e.x. GraphPage, GraphLayer, DataPlot, Axis), save it to XML file or output it the learn more about it.
To view all graph layer relative format from tree. Compile, and then run this function in Commad window will output format tree.
void ViewGraphFormatTree() { GraphLayer gl = Project.ActiveLayer(); if(!gl) return; Tree trFormat; trFormat = gl.GetFormat(FPB_ALL, FOB_ALL, TRUE, TRUE); out_tree(trFormat); // output format tree string strSaveTo = GetAppPath(false) + "FormatTree.xml"; if(trFormat.Save(strSaveTo)) out_str("Format Tree xml file saved to "+strSaveTo); }
// This function shows how to get Stack settings from a graph. // Stack settings in the Theme are only available in Origin version 8.1 and later. void GetGraphFormatStackSetting() { GraphLayer gl = Project.ActiveLayer(); if(!gl) return; Tree trFormat; trFormat = gl.GetFormat(FPB_ALL, FOB_ALL, TRUE, TRUE); #if _OC_VER >= 0x0810 switch( trFormat.Root.Stack.Offset.nVal ) { case PLOTSTACK_NONE: break; case PLOTSTACK_CUMULATIVE: out_str("Cumulative offset setting."); bool bCumulative = true; break; case PLOTSTACK_CONST: out_str("Constant offset setting."); double dConst = trFormat.Root.Stack.Constant.nVal; break; case PLOTSTACK_AUTO: out_str("Auto offset setting."); double dGap = trFormat.Root.Stack.Gap.dVal; break; case PLOTSTACK_INDIVIDUAL: out_str("Individual offset setting."); bool bX = trFormat.Root.Stack.X.nVal; bool bY = trFormat.Root.Stack.Y.nVal; break; default: out_str("Unknown offset setting."); break; } #else // !_OC_VER >= 0x0810 out_str("Stack settings in Theme only available in Origin 8.1 and later."); #endif // !_OC_VER >= 0x0810 }
For now, theme tree not work on change label justify, we will support, can firstly use Labtalk command as below.
Run "change_label_justify 2 1", label display as center.
// nLabelPlotIndex, label plot index, offset from 1, // nJustify, 0:Left; 1:Center; 2:Right. void change_label_justify(int nLabelPlotIndex, int nJustify = 0) { string strLT; strLT.Format("range aa=%d;", nLabelPlotIndex); //this plot is label string str; str.Format("set aa -tj %d;", nJustify); strLT += str; LT_execute(strLT); }
void TurnOffSpeedMode() { GraphLayer gl = Project.ActiveLayer(); if(gl) { Tree trFormat; trFormat = gl.GetFormat(FPB_ALL, FOB_ALL, TRUE, TRUE); TreeNode trSpeed = trFormat.Root.Speed.Matrix; // if the plot data is from worksheet, // use the following line instead of the line above // TreeNode trSpeed = trFormat.Root.Speed.Worksheet; if( !trSpeed ) return; if( trSpeed.nVal ) { trSpeed.nVal = 0; if( gl.ApplyFormat(trFormat, TRUE, TRUE) ) out_str("Turn off speed mode!"); } else { out_str("Speed mode already be turn off!"); } } }
BOOL speed_mode_75(BOOL bOn = FALSE) { BOOL bRes = FALSE; GraphLayer gl = Project.ActiveLayer(); if( gl ) { Tree trFormat; trFormat.Root.Page.Layers.All.Speed.Worksheet.nVal = bOn; // wks speed mode trFormat.Root.Page.Layers.All.Speed.Matrix.nVal = bOn; // matrix speed mode // Origin 7.5 does not have easy update ID mechanism, so we must use low level access // these IDs could be found comparing "Save Theme As" tree to OTH(xml) file generated by saving trFormat.Root.ID = 0x00000001; // root ID trFormat.Root.Page.ID = 0x00000004; // page ID trFormat.Root.Page.Layers.ID = 0x40000014; // layer collection ID trFormat.Root.Page.Layers.All.ID = 0x10000015; // all layers ID trFormat.Root.Page.Layers.All.Speed.ID = 0x0000026F; // speed branch ID trFormat.Root.Page.Layers.All.Speed.Worksheet.ID = 0x00000270; // worksheet speed mode ID trFormat.Root.Page.Layers.All.Speed.Matrix.ID = 0x00000272; // matrix speed mode ID bRes = gl.ApplyFormat(trFormat); } return bRes; }
// set property for the special points on data plot. void set_specialpoints() { GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(0); Tree tr; tr.Root.Points.Point1.Index.nVal=0; // the index of the current editing point is 0(offset is 0) tr.Root.Points.Point1.Symbol.Size.dVal=20; // pts tr.Root.Points.Point1.Symbol.Type.nVal=0; // geometric tr.Root.Points.Point1.Symbol.Shape.nVal=1; // square tr.Root.Points.Point1.Symbol.Interior.nVal=0; // solid tr.Root.Points.Point1.Symbol.EdgeColor.nVal=2; // green color tr.Root.Points.Point2.Index.nVal=2; // the index of the current editing point is 2(offset is 0) tr.Root.Points.Point2.Symbol.Size.dVal=20; // pts tr.Root.Points.Point2.Symbol.Type.nVal=0; // geometric tr.Root.Points.Point2.Symbol.Shape.nVal=1; // square tr.Root.Points.Point2.Symbol.Interior.nVal=0; // solid tr.Root.Points.Point2.Symbol.EdgeColor.nVal=3; // blue color int iRet = dp.UpdateThemeIDs(tr.Root, "Error", "Unknown tag"); bool bRet = dp.ApplyFormat(tr, true, true); }
//use SetModifier to set plot label void set_label_by_SetModifier() { //prepare data Worksheet wks; wks.Create("origin"); if(!wks) return; wks.AddCol(); vector vn = {1,2,3,4,5}; for(int ii = 0; ii < 3; ii++) { Dataset ds(wks, ii); ds = vn; } //plot DataRange dr; dr.Add(wks, 0, "X"); dr.Add(wks, 1, "Y"); GraphPage gp; gp.Create("Origin"); GraphLayer gl = gp.Layers(); gl.AddPlot(dr, IDM_PLOT_SCATTER); gl.Rescale(); //set label Column col(wks, 2); DataPlot dp = gl.DataPlots(0); if(!dp) return; dp.SetModifier(COLDESIG_PLOTLABEL_FORM, col);//see PlotDesignationEx for more modifier types. vector<int> vnDesigs; vector<string> saNames; dp.GetModifiers(vnDesigs, saNames); vector<uint> vecIndex; if(vnDesigs.Find(vecIndex, COLDESIG_PLOTLABEL_FORM) > 0) { printf("label form = %s\n", saNames[ vecIndex[0] ]); } } //use ApplyFormat to set plot label void set_label_by_applyformat() { //prepare data Worksheet wks; wks.Create("origin"); if(!wks) return; wks.AddCol(); vector vn = {1,2,3,4,5}; for(int ii = 0; ii < 3; ii++) { Dataset ds(wks, ii); ds = vn; } //plot DataRange dr; dr.Add(wks, 0, "X"); dr.Add(wks, 1, "Y"); GraphPage gp; gp.Create("Origin"); GraphLayer gl = gp.Layers(); gl.AddPlot(dr, IDM_PLOT_SCATTER); gl.Rescale(); //set label DataPlot dp = gl.DataPlots(0); if(dp) { Tree trFmt; TreeNode trEnable = trFmt.Root.Label.AddNode("Enable"); trEnable.nVal = 1; OQCOLOR nLab; int ycol = 1, labelcol = 2; //convert the offset(modifier column to y column) to theme internal value okutil_get_ocolor_by_col(&nLab, labelcol, ycol, SYMB_COLOR_COLTYPE_INDEX); trFmt.Root.Label.Form.nVal = nLab; if ( 0 == dp.UpdateThemeIDs(trFmt.Root) ) dp.ApplyFormat(trFmt, true, true); } }
//use a column of values to control data plot colors for plots of data from the same worksheet void DataPlot_SetColorByCol_ex() { //wks with 3 columns int nXCol = 0, nYCol = 1, nCCol = 2; Worksheet wks = Project.ActiveLayer(); DataRange dr; dr.Add(wks, nXCol, "X"); dr.Add(wks, nYCol, "Y"); //make a line plot GraphPage gp; gp.Create("Origin"); GraphLayer gl = gp.Layers(); gl.AddPlot(dr, IDM_PLOT_LINE); DataPlot dp = gl.DataPlots(0); if( !dp ) return; //Get the color value to make plot colors follow a same worksheet column value OQCOLOR oqColor; okutil_get_ocolor_by_col(&oqColor, nCCol, nYCol, COLTYPE_COLOR_COLORMAP); //set line color by theme Tree trFormat; trFormat.Root.Line.Color.nVal = oqColor; int iRet = dp.UpdateThemeIDs(trFormat.Root); bool bRet = dp.ApplyFormat(trFormat, true, true); gl.Rescale(); }