Minimum Origin Version Required: Origin 8.0
This example shows how to set script with event mode on one retangle graph object. The Script and Event Mode are Script, Run After and Ctrl-TAB for TAB options in Programming Control... dialog. Right click on graph object and choose Programming Control... to open this dialog.
This example just simulate Origin Zoom graph. Move rectangle on the top layer to zoom the selected area and display in the bottom layer.
To generate ZoomSource template for the top layer:
To genereate ZoomDest template for the bottom layer:
void zoom_plot() { GraphPage gp; gp.Create("ZoomSource"); int nZoomLayer = gp.AddLayer("Layer2", 0, "ZoomDest"); // return the plot index of newly created layer graph_arrange_layers(gp, 2, 1); // 2 rows 1 column Worksheet wks; wks.Create("Origin", CREATE_HIDDEN); string strFile = GetAppPath(true) + "Samples\\Spectroscopy\\HiddenPeaks.dat"; ASCIMP ai; if( AscImpReadFileStruct(strFile, &ai) != 0 ) { out_str("Fail to read ASCII file struct."); return; } if( 0 != wks.ImportASCII(strFile, ai) ) { out_str("Fail to import data"); return; } // plot source data to the first layer and second layer DataRange drIn; drIn.Add(wks, 0, "X"); drIn.Add(wks, 1, "Y"); GraphLayer glSource = gp.Layers(0); glSource.AddPlot(drIn, IDM_PLOT_LINE); DataRange dr2; dr2.Add(wks, 0, "X"); dr2.Add(wks, 1, "Y"); GraphLayer glZoom = gp.Layers(nZoomLayer); glZoom.AddPlot(dr2, IDM_PLOT_LINE); // add rectangle to first layer GraphObject goRect = glSource.CreateGraphObject(GROT_RECT); goRect.Attach = 2; Tree tr; tr.Root.Border.Color.nVal = SYSCOLOR_BLUE; tr.Root.Border.Width.dVal = 0.2; tr.Root.Fill.Color.nVal = SYSCOLOR_CYAN; tr.Root.BehindData.nVal = 1; tr.Root.Dimension.Left.dVal = glSource.X.From + (glSource.X.To - glSource.X.From) * 0.2; tr.Root.Dimension.Top.dVal = glSource.Y.To - (glSource.Y.To - glSource.Y.From) * 0.4; tr.Root.Dimension.Width.dVal = (glSource.X.To - glSource.X.From) * 0.2; tr.Root.Dimension.Height.dVal = (glSource.Y.To - glSource.Y.From) * 0.2; tr.Root.Script.strVal = "string name$=this.name$; ZoomByRect(name$)"; tr.Root.Event.nVal = GRCT_MOVE; if( 0 == goRect.UpdateThemeIDs(tr.Root) ) { goRect.ApplyFormat(tr, true, true); } ZoomByRect(goRect.GetName()); // call this once in first time to init zoom layer according to the init postion of rectangle } // This function always assume the first layer is source data layer, the second layer is zoom layer. void ZoomByRect(string strRectName) { GraphPage gp = Project.GraphPages(-1); // to get active graph page GraphLayer glSource = gp.Layers(0); GraphLayer glZoom = gp.Layers(1); GraphObject goRect = glSource.GraphObjects(strRectName); if( !goRect ) return; double dLeft = goRect.X - goRect.DX / 2.0; double dRight = goRect.X + goRect.DX / 2.0; double dTop = goRect.Y + goRect.DY / 2.0; double dBottom = goRect.Y - goRect.DY / 2.0; printf("%.2f, %.2f, %.2f, %.2f\n", dLeft, dRight, dTop, dBottom); glZoom.X.From = dLeft; glZoom.X.To = dRight; glZoom.Y.From = dBottom; glZoom.Y.To = dTop; }