This section gives examples of working with numeric data in Origin C. Numeric data can be stored in variables of the following data types:
Numeric data and strings can be stored in the nodes of a tree, provided the nodes have one of the data types above.
Note:Values such as 0.0, NANUM (missing value) and values between -1.0E-290 to 1.0E-290 will be evaluated to be False in logic statement.
As important as numeric data is, it is also important to be able to represent missing data. Origin C defines the NANUM macro for comparing and assigning values to missing data. Missing values are only supported with the double data type.
double d = NANUM; if( NANUM == d ) out_str("The value is a missing value.");
Origin C also provides the is_missing_value function for testing if a value is a missing value.
if( is_missing_value(d) ) out_str("The value is a missing value.");
In the following example code, the prec and round functions are used to control the precision of double type numeric data. The is_equal function is used to compare two pieces of double type numeric data.
double dVal = PI; // PI defined as 3.1415926535897932384626 // convert the double value to have 6 significant digits int nSignificantDigits = 6; printf("%f\n", prec(dVal, nSignificantDigits)); // force the double value to only have two decimal digits uint nDecimalPlaces = 2; double dd = round(dVal, nDecimalPlaces); printf("%f\n", dd); // compare two double values if( is_equal(dd, 3.14) ) { out_str("equal\n"); } else { out_str("not equal\n"); }
// assign int type numeric to string string str = 10; out_str(str); int nn = 0; str = nn; out_str(str); // convert double type numeric to string double dd = PI; str = ftoa(dd, "*"); // Use "*" for Origin's global setting in Options dialog out_str(str); str = ftoa(dd, "*8"); // Use "*8" for 8 significant out_str(str);
// One-Dimensional array with basic data type, for example, double, int, string, // complex. vector vx, vy; int nMax = 10; vx.Data(1, nMax, 1); // assign value to vx from 1 to 10 with increment 1 vy.SetSize(nMax); // set size(10) to vy for(int nn = 0; nn < nMax; nn++) { vy[nn] = rnd(); // assign random data to each item in vy printf("index = %d, x = %g, y = %g\n", nn+1, vx[nn], vy[nn]); }
// Access the data in a worksheet window Worksheet wks = Project.ActiveLayer(); Column col(wks, 0); vector& vec = col.GetDataObject(); vec = vec * 0.1; // Multiply 0.1 by each piece of data in vec vec = sin(vec); // Find the sine of each piece of data in vec
// Two-Dimensional array with basic data type, for example, double, int, complex, // but not string. matrix mat(5, 6); for(int ii = 0; ii < 5; ii++) { for(int jj = 0; jj < 6; jj++) { mat[ii][jj] = ii + jj; printf("%g\t", mat[ii][jj]); } printf("\n"); // new line }
// Access the data in matrix window MatrixLayer ml = Project.ActiveLayer(); MatrixObject mo = ml.MatrixObjects(0); matrix& mat = mo.GetDataObject(); mat = mat + 0.1; // Add 0.1 for the each data in matrix
The Origin C TreeNode class provides several methods for constructing multi-level trees, traversing trees and accessing the value/attributes of tree nodes.
Tree tr; // Access the value of a tree node TreeNode trName = tr.AddNode("Name"); trName.strVal = "Jane"; tr.UserID.nVal = 10; vector<string> vsBooks = {"C++", "MFC"}; tr.Books.strVals = vsBooks; out_tree(tr); // output tree
complex cc(1.5, 2.2); cc.m_re = cc.m_re +1; cc.m_im = cc.m_im * 0.1; out_complex("cc = ", cc); // output cc = 2.500000+0.220000i
// Access complex dataset Worksheet wks = Project.ActiveLayer(); Column col(wks, 1); if( FSI_COMPLEX == col.GetInternalDataType() ) { vector<complex>& vcc = col.GetDataObject(); vcc[0] = 0.5 + 3.6i; }
// Access complex matrix MatrixLayer ml = Project.ActiveLayer(); MatrixObject mo = ml.MatrixObjects(); if( FSI_COMPLEX == mo.GetInternalDataType() ) { matrix<complex>& mat = mo.GetDataObject(); mat[0][0] = 1 + 2.5i; }
The DataRange class is a versatile mechanism to get and put data in a Worksheet, Matrix or Graph window.
For a Worksheet, a data range can be specified by column/row index as one column, one row, any sub block range, one cell or entire Worksheet.
// Construct a data range on the active worksheet, all columns and rows // from 1st row to 5th row. Worksheet wks = Project.ActiveLayer(); int r1 = 0, c1 = 0, r2 = 4, c2 = -1; DataRange dr; // range name should be make sense, for example, "X", "Y", // "ED"(Y error), "Z". If the data range is not belong to dependent // or independent type, default can be "X". dr.Add("X", wks, r1, c1, r2, c2);
Get data from data range to vector. DataRange::GetData supports multiple overloaded methods. For example:
vector vData; int index = 0; // range index dr.GetData(&vData, index);
For a Matrix window, the data range can be a matrix object index.
MatrixLayer ml = Project.ActiveLayer(); DataRange dr; int nMatrixObjectIndex = 0; dr.Add(ml, nMatrixObjectIndex, "X");
Get data from data range to matrix.
matrix mat; dr.GetData(mat);
For a Graph window, the data range can be one data plot, or a sub range of one data plot.
GraphLayer gl = Project.ActiveLayer(); DataPlot dp = gl.DataPlots(); // Get active data plot DataRange dr; int i1 = 0; // from the first data point int i2 = -1; // to the last data point dp.GetDataRange(dr, i1, i2);
Get XY data from data plot to vector by data range object.
vector vx, vy; DWORD dwRules = DRR_GET_DEPENDENT; dr.GetData(dwRules, 0, NULL, NULL, &vy, &vx);
OriginC supports a GetN dialog
interactive control to choose a data range.#include <GetNBox.h> // Open a dialog to choose a range from one graph data plot. // And construct a data range object by this selection. GETN_TREE(tr) GETN_INTERACTIVE(Range1, "Select Range", "") if( GetNBox(tr) ) // returns true if click OK button { DataRange dr; dr.Add("Range1", tr.Range1.strVal); vector vData; int index = 0; // range index dr.GetData(&vData, index); // The data in vData is the selected data points }