【お知らせ】この部分は英語原文のみでの提供となります。何卒ご了承ください。
3.4.9 General Screen Reader by Graph Object
Version Info
Minimum Origin Version Required: Origin 8 SR6
Remark
This example is using Graph Object, including rectangle and crossing lines, to make a screen reader. After activate this rectangle, can move it by top, left... key to the exact position.
Need to Do Before Running Examples
Prior to running the following example, the grobj_utils.c file need to be loaded and compiled. This can be done from script with the following command or just add this file to your workspace.
run.LoadOC(Originlab\grobj_utils.c);
Example
#include <..\Originlab\grobj_utils.h> #define STR_LINE_1_NAME "MyLine1" #define STR_LINE_2_NAME "MyLine2" #pragma labtalk(1)//To control the calling of Origin C function, for any LT usage, no need to be inside run command // this function used to add rectangle and line on the active layer void AddRectAndLine() { GraphLayer gl = Project.ActiveLayer(); // get active graph layer if( gl ) // if layer exist { GraphObject goRect = gl.CreateGraphObject(GROT_RECT); SetRectangleFormat(goRect, gl); GraphObject goVLine; // vertical line GraphObject goHLine; // horizontal line double dVLineX0, dVLineX1, dVLineY0, dVLineY1; // coordinates of start and end points of vertical line dVLineX0 = goRect.X; // start point x0 dVLineX1 = goRect.X; // end point x1 dVLineY0 = goRect.Y - goRect.DY / 2.0; // start point y0 dVLineY1 = goRect.Y + goRect.DY / 2.0; // end point y1 // add vertical line if( add_line(gl, goVLine, dVLineX0, dVLineY0, ATTACH_TO_SCALE, LN_FREE, false, false, dVLineX1, dVLineY1, SYSCOLOR_RED, STR_LINE_1_NAME) ) // add vertical line successfully { // set line format SetLineFormat(goVLine, goRect); } // coordinates of start and end points of horizontal line double dHLineX0, dHLineX1, dHLineY0, dHLineY1; dHLineX0 = goRect.X - goRect.DX / 2.0; // start point x0 dHLineX1 = goRect.X + goRect.DX / 2.0; // end point x1 dHLineY0 = goRect.Y; // start point y0 dHLineY1 = goRect.Y; // end point y1 // add horizontal line if( add_line(gl, goHLine, dHLineX0, dHLineY0, ATTACH_TO_SCALE, LN_FREE, false, false, dHLineX1, dHLineY1, SYSCOLOR_RED, STR_LINE_2_NAME) ) // add horizontal line successfully { // set line format SetLineFormat(goHLine, goRect); } } } // set rectangle object properties void SetRectangleFormat(GraphObject& goRect, GraphLayer& gl) { if( gl ) { // set size, position, color, etc. for rectangle. Tree tr; tr.Root.Dimension.Units.nVal = UNITS_SCALE; tr.Root.Dimension.Attachment.nVal = 2; // 2, attach layer and scale tr.Root.Dimension.Left.dVal = gl.X.From; // left axis tr.Root.Dimension.Top.dVal = gl.Y.From; // top axis tr.Root.Dimension.Width.dVal = (gl.X.To - gl.X.From) * 0.08; tr.Root.Dimension.Height.dVal = (gl.Y.To - gl.Y.From) * 0.1; tr.Root.Border.Color.nVal = SYSCOLOR_GRAY; tr.Root.Border.Width.nVal = 1; tr.Root.Fill.Color.dVal = SYSCOLOR_LTGRAY; tr.Root.KeepInside.nVal = true; // keep this object always inside the graph layer tr.Root.BehindData.nVal = true; // set rectangle behind data tr.Root.Event.nVal = GRCT_MOVE; // event: move tr.Root.Script.strVal = "Run -OC MoveLines(this.Name$)"; // when move rectangle, call MoveLines() if(0 == goRect.UpdateThemeIDs(tr.Root)) // 0 means no error { bool bRet = goRect.ApplyFormat(tr, true, true); ASSERT(bRet); } // to disable resize, rotate... after perpare size, postion. Tree tr1; tr1.Root.States.dVal = GOC_NO_RESIZE|GOC_NO_ROTATE|GOC_NO_SKEW|GOC_HITTEST_BEFORE_DATA; if(0 == goRect.UpdateThemeIDs(tr1.Root)) // 0 means no error { bool bRet = goRect.ApplyFormat(tr1, true, true); ASSERT(bRet); } } } // set line object properties void SetLineFormat(GraphObject& goLine, GraphObject& goRect) { // to disable selectable, resize, rotate... Tree tr; tr.Root.States.dVal = GOC_NO_RESIZE|GOC_NO_ROTATE|GOC_NO_SKEW|GOC_NO_EDIT|GOC_NO_IN_PLACE_EDIT|GOC_NO_BORDERSIZE|GOC_NO_SELECT|GOC_NO_DEL_SEL_PT; if( 0 == goLine.UpdateThemeIDs(tr.Root) ) // 0 means no error { bool bRet = goLine.ApplyFormat(tr, true, true); // return true if applied format successfully } // make line to connect to rectange connect_justify(goRect, goLine, CTP_AUTO); } #pragma labtalk(2) //To control the calling of Origin C function, cannot use like LT command, only use in run -oc cmd // call this function when rectangle moves void MoveLines(string strRectName) { GraphLayer gl = Project.ActiveLayer(); // get the active layer if( !gl ) // if active layer not exist, return return; GraphObject goRect = gl.GraphObjects(strRectName); // print the center coordinate of the rectangle printf("X = %f \nY = %f\n", goRect.X, goRect.Y); }