Minimum Origin Version Required: Origin 8 SR0
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.
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 }
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 }
// 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);