Add Graph Object

 

 

Version Info

Minimum Origin Version Required: Origin 8 SR0

Remark

We can create Graph Object like line, text, retangle on graph, worksheet or matrix window. More details about GraphObject class please reference to GraphObject and GraphLayer and PolyPolylineGraphObject

Add Text

void AddText()
{
    GraphPage gp;
    gp.Create("Origin");
    GraphLayer gl = gp.Layers(0); // get the first layer
    if(gl)
    {
        // add a Text named MyText
        GraphObject     go = gl.CreateGraphObject(GROT_TEXT);
        go.SetName("MyText");
        if( go )
        {
                go.Text = "New Label";
        }        
        gl.GetPage().Refresh();
    }
}

Add Line

Keep a graph window ative and run below AddLine function to add one vertical line and one horizontal line.

void AddLine()
{
        GraphLayer gl = Project.ActiveLayer();
        if( gl )
        {             
                // add vertical line and set position
                GraphObject goVLine = gl.CreateGraphObject(GROT_LINE);
                goVLine.SetName("vline");
                goVLine.X = gl.X.From + (gl.X.To - gl.X.From) / 2; // set the init position of vertical line
                
                // set direction, script
                string strScript = "type -a " + " \"X = $(vline.X)\" "; // set this script, moving vertical line will print out X pos to Command window.
                SetLineFormat(goVLine, LN_VERTICAL, strScript, GRCT_MOVE);            
                
                
                // add horizontal line and set position
                GraphObject goHLine = gl.CreateGraphObject(GROT_LINE);
                goHLine.SetName("hline");                 
                goHLine.Y = gl.Y.From + (gl.Y.To - gl.Y.From) / 2;        // set the init position of horizontal line
                
                // set direction, script
                strScript = "type -a " + " \"Y = $(hline.Y)\" "; // set this script, moving horizontal line will print out Y pos to Command window.
                SetLineFormat(goHLine, LN_HORIZONTAL, strScript, GRCT_MOVE);
        }
}

// set line object properties, script, format, color, width, attach mode, direction...
void SetLineFormat(GraphObject& goLine, int nDirection, string strScript, int nExecMode)
{
        goLine.Attach = 2;// 2, layer and scale
        
        Tree tr;                
        tr.Root.Span.nVal = 1; // 1 to span over the whole layer
        tr.Root.Direction.nVal = nDirection; // vertical or horizontal        
        tr.Root.Color.nVal = SYSCOLOR_RED;
        tr.Root.Width.dVal = 3;
        tr.Root.Event.nVal = nExecMode;
        tr.Root.Script.strVal = strScript; // set script, run it after the Event specified by nExecMode
        
        if( 0 == goLine.UpdateThemeIDs(tr.Root) ) // 0 means no error
        {
                bool bRet = goLine.ApplyFormat(tr, true, true); // return true if applied format successfully
        }
}

Add Rectangle

void AddRectangle()
{
        GraphPage gp;
        gp.Create("Origin");
        
        GraphLayer gl = gp.Layers(0);  
        GraphObject goRect = gl.CreateGraphObject(GROT_RECT);       
}

Add Curved Arrow Tool

This example shows how to add a curved arrow line on graph window, and how to change vertices of curve arrow line. In the following function, if replace GROBJ_TN_LINE4 to GROT_POLYLINE, the graph object will be Polyline.

#include <..\Originlab\grobj_utils.h>
void graph_object_line4_ex()
{
        GraphPage gp;
        gp.Create("origin");
        GraphLayer gl = gp.Layers();        

        GraphObject go;
        go = gl.CreateGraphObject(GROBJ_TN_LINE4);
        
        go.Attach = ATTACH_TO_SCALE;
        
        Tree tr;
        tr = go.GetFormat(FPB_DATA, FOB_ALL, true, true);
        
        // to take a look on default position
        vector vx0, vy0;
        vx0 = tr.Root.Data.X.dVals;
        vy0 = tr.Root.Data.Y.dVals;
        
        // to set the proper position for four points
        vector vx = {2.2, 4.7, 6.58, 7.16};
        vector vy ={5.7, 4.22, 5.12, 7.35};
        tr.Root.Data.X.dVals = vx;
        tr.Root.Data.Y.dVals = vy;
    tr.Root.Arrow.End.Style.nVal = 1; // add arrow to the end
        
        int nErr = go.UpdateThemeIDs(tr.Root);
        if(nErr == 0)
        {
                go.ApplyFormat(tr, true, true);
        }
        else
        {
                out_int("err = ", nErr);
        }
}

Add Polygon Tool

#include <..\Originlab\grobj_utils.h>
void graph_object_create_polygon_ex()
{
    GraphPage gp;
    gp.Create("origin");
    GraphLayer gl = gp.Layers();    
 
    GraphObject go;
    go = gl.CreateGraphObject(GROT_POLYGON); // create polygon by type id
 
    go.Attach = ATTACH_TO_SCALE;
 
    Tree tr;
    tr = go.GetFormat(FPB_DATA, FOB_ALL, true, true);// FPB_DATA bit to control the accessing of vertices of graph object
 
    // When polygon is just created, there are no vertices, so need to set them
    // The size of vx and vy vectors below will determine the number of points of the graph object
    Tree trNew;
    vector vx = {2.4, 4.6, 7.3, 6.8};
    vector vy ={4.8, 7.9, 7.2, 1.6};
    trNew.Root.Data.X.dVals = vx;
    trNew.Root.Data.Y.dVals = vy;
 
    int nErr = go.UpdateThemeIDs(trNew.Root);
    if(nErr == 0)
    {
        go.ApplyFormat(trNew, true, true);
    }
    else
    {
        out_int("err = ", nErr);
    }
}

Add Polypolygon

static void make_circle(vector& vx, vector& vy, int nSize, double x0, double y0, double rr)
{
        vx.SetSize(nSize);
        vy.SetSize(nSize);

        double inc = 2.* pi/nSize;
        double ang=0;
        for(int ii = 0; ii <nSize; ii++, ang+= inc)
        {
                vx[ii] = x0 + rr* sin(ang);
                vy[ii] = y0 + rr* cos(ang);
        }
}

void many_circles(int nRegNum = 100)
{
        GraphLayer gl = Project.ActiveLayer();
        double x1, x2, y1, y2, x0, y0, rr;
        x1 = gl.X.From, x2 = gl.X.To;
        y1 = gl.Y.From, y2 = gl.Y.To;

        PolyPolylineGraphObject go;
        go = gl.CreateGraphObject(GROT_POLYPOLYGON, "PP");
        go.Attach = ATTACH_TO_SCALE;
        // Set Label for polypolygon
        go.SetDrawOption(POLYPOLYLINE_DRAW_OPTION_NEED_TEXT);

        vector<double> vx, vy; 
        for(int ii = 0; ii < nRegNum ; ii ++)
        {
                x0 = x1 + (x2-x1) * rnd();
                y0 = y1 + (y2-y1) *rnd();
                rr = (x2-x1)/50 + rnd() * (x2-x1)/100;
                make_circle(vx, vy, 40, x0, y0, rr);
                go.AddPolyline(vx, vy);
        }
        
        Tree tr;
        tr.Root.Fill.Color.nVal = INDEX_COLOR_TRANSPARENT;
        tr.Root.Border.Color.nVal = SYSCOLOR_YELLOW;
        tr.Root.Border.Width.dVal = 0.2;
        
        tr.Root.States.nVal = GOC_NO_SELECT;
        
        int nRet = go.UpdateThemeIDs(tr.Root);
        go.ApplyFormat(tr, true, true);

        gl.GetPage().Refresh();
        out_str("done");
}