Adding Tags to Imported Data and Displaying on Plots
Version Info
Minimum Origin Version Required: Origin 8 SR0
Examples
In this example, we use LabTalk commands to import a sample data, call an Origin C function to add event tags to the X column in the form of meta data, then after plotting the XY data, we call another Origin C function to draw those event tags as vertical lines with associated labels.
Saving Event Tags to X Column
This OC function save an array of X values and associated labels to the specified column in the User tree so that you can also view them from Column Properties
int putEventsInStorage(string strPageName)
{
Page pg = Project.Pages(strPageName);
if( NULL == pg )
{
printf("Failed to get page named %s\n", strPageName);
return -1;
}
Worksheet wks = pg.Layers();
if( NULL == wks )
{
printf("Failed to get sheet from page named %s\n", strPageName);
return -2;
}
Column xcol = wks.Columns(0); // assume data X column is first column
if( NULL == xcol )
{
printf("Failed to get column\n");
return -3;
}
Tree trEvents;
trEvents.Event1.Tag.strVal = "Jump1";
trEvents.Event1.X.dVal = 72.0;
trEvents.Event2.Tag.strVal = "Jump2";
trEvents.Event2.X.dVal = 301.0;
trEvents.Event3.Tag.strVal = "Jump3";
trEvents.Event3.X.dVal = 460.0;
trEvents.Event4.Tag.strVal = "Jump4";
trEvents.Event4.X.dVal = 760.0;
if( FALSE == xcol.PutBinaryStorage("TREE", trEvents) ) // TREE is the name of the User Tree
{
printf("Failed to put binary storage into the column\n");
return -4;
}
return 0; // Success
}
Adding Event Tags to Graph
This OC function retrive the X column from the first data plot and find the stored event tags and add them as lines and labels
int drawEventTags(string strGraphName, int nPlotIndex = 0)
{
Page pg = Project.Pages(strGraphName);
if( NULL == pg )
{
printf("Failed to get graph named %s\n", strGraphName);
return -1;
}
GraphLayer gl = pg.Layers(); // active graph layer
if( NULL == gl )
{
printf("Failed to get active layer from graph named %s\n", strGraphName);
return -2;
}
Column xcol;
DataPlot dp = gl.DataPlots(nPlotIndex);
if( dp )
{
XYRange xy;
if( FALSE == dp.GetDataRange(xy) || FALSE == xy.GetXColumn(xcol) )
{
printf("Failed to get X column from graph named %s\n", strGraphName);
return -3;
}
}
Tree trEvents;
if( FALSE == xcol.GetBinaryStorage("TREE", trEvents) )
{
printf("Failed to get the binary storage from the X column\n");
return -4;
}
int nEvent = 1;
string str;
vector vx(2), vy(2);
GraphObject go;
Tree trFormat;
TreeNode tnEvent;
while( true )
{
//---------- Get Event Node
str.Format("Event%d", nEvent);
tnEvent = trEvents.GetNode(str);
if( NULL == tnEvent )
break; // no more events, exit loop
//---------- Add Vertical Line
vx[0] = vx[1] = tnEvent.X.dVal;
vy[0] = vy[1] = 0;
go = gl.CreateGraphObject(GROT_LINE);
go.SetName(str + "Line");
go.Attach = 2; // 2 = attach to axes
trFormat.Reset();// make sure tree is empty
trFormat.Root.Direction.nVal = LN_VERTICAL;
trFormat.Root.Span.nVal = 1; // turn span on
trFormat.Root.Data.X.dVals = vx;
trFormat.Root.Data.Y.dVals = vy;
trFormat.Root.Color.nVal = SYSCOLOR_LTGRAY;
trFormat.Root.BehindData.nVal = 1; // put line behind plot data
trFormat.Root.States.nVal = GOC_NO_SELECT | GOC_NO_MOVE | GOC_NO_ROTATE | GOC_NO_SKEW | GOC_NO_EDIT | GOC_NO_BORDERSIZE | GOC_NO_IN_PLACE_EDIT;
if( 0 == go.UpdateThemeIDs(trFormat.Root) )
go.ApplyFormat(trFormat, true, true);
//---------- Add Text Label
go = gl.CreateGraphObject(GROT_TEXT);
go.SetName(str + "Text");
go.Attach = 2; // 2 = attach to axes
go.Text = tnEvent.Tag.strVal;
go.X = (go.DX / 2) + tnEvent.X.dVal;
go.Y = (go.DY / 2) + gl.Y.To;
trFormat.Reset();// make sure tree is emtpy
trFormat.Root.Angle.dVal = 45;
trFormat.Root.States.nVal = GOC_NO_SELECT | GOC_NO_MOVE | GOC_NO_ROTATE | GOC_NO_SKEW | GOC_NO_EDIT | GOC_NO_BORDERSIZE | GOC_NO_IN_PLACE_EDIT;
if( 0 == go.UpdateThemeIDs(trFormat.Root) )
go.ApplyFormat(trFormat, true, true);
//---------- Next Event
nEvent++;
}
return 0; // Success
}
LabTalk Script Using Above Origin C Functions
// Import a data file from Samples folder.
%Z = System.Path.Program$;
impASC fname:="%Zsamples\signal processing\step signal with random noise.dat";
// Put event data into binary storage.
putEventsInStorage(%H);
// Plot the imported data.
plotxy 2 plot:=200;
// Update plot with meta data info.
drawEventTags(%H);
|