Example 017: Graph showing real-time data handling

PegoGraph Objectadvanced

Real-time data handling

Preview

ProEssentials Pego Graph Object - Graph showing real-time data handling
Click to enlarge

Source Code

Form2.cs
1//! If RenderEngine is not Direct2D, use BitmapGradientMode=False for max speed.
2//! See Timer section below that includes update logic
3
4// No Shadows //
5Pego1.PePlot.DataShadows = DataShadows.None;
6
7// No Flicker //
8Pego1.PeConfigure.PrepareImages = true;
9Pego1.PeConfigure.CacheBmp = true;
10
11// Set Subsets and Points //
12Pego1.PeData.Subsets = 2;
13Pego1.PeData.Points = 200;
14
15Pego1.PeUserInterface.Scrollbar.PointsToGraph = 200; // set to lower number to show earliest
16Pego1.PeUserInterface.Scrollbar.PointsToGraphInit = PointsToGraphInit.Last;
17Pego1.PePlot.Method = GraphPlottingMethod.Point;
18
19// subset line types //
20Pego1.PeLegend.SubsetLineTypes[0] = LineType.ThinSolid;
21Pego1.PeLegend.SubsetLineTypes[1] = LineType.ThinSolid;
22
23// subset point types //
24Pego1.PeLegend.SubsetPointTypes[0] = PointType.SquareSolid;
25Pego1.PeLegend.SubsetPointTypes[1] = PointType.Plus;
26
27// Not ideal for real-time, but nice for presentation/demonstration
28//Pego1.PePlot.Option.PointGradientStyle = PlotGradientStyle.NoGradient;
29//Pego1.PeColor.PointBorderColor = Color.FromArgb(100, 0, 0, 0);
30
31// Main Title
32Pego1.PeString.MainTitle = "Simple Graph Real Time";
33Pego1.PeString.SubTitle = "";
34
35// Manually configure scales //
36Pego1.PeGrid.Configure.ManualScaleControlY = ManualScaleControl.MinMax;
37
38Pego1.PeGrid.Configure.ManualMinY = 1.0;
39Pego1.PeGrid.Configure.ManualMaxY = 100.0;
40Pego1.PeGrid.Configure.ManualMinY = 1.0;
41Pego1.PeGrid.Configure.ManualMaxDataString = "000.000";
42Pego1.PeGrid.Configure.ManualMaxPointLabel = "00:00:00xx";
43
44Pego1.PePlot.Allow.StackedData = false;
45Pego1.PeUserInterface.Dialog.PointsToGraph = false;
46Pego1.PePlot.Allow.Histogram = false;
47Pego1.PeUserInterface.Allow.FocalRect = false;
48Pego1.PeGrid.LineControl = GridLineControl.Both;
49Pego1.PeData.Precision = DataPrecision.OneDecimal;
50
51// Needed to allocate point labels so append logic works //
52// Set last point label, Points - 1 //
53Pego1.PeString.PointLabels[199] = "";
54
55// Reset first four default data points
56Pego1.PeData.Y[0, 0] = 0;
57Pego1.PeData.Y[0, 1] = 0;
58Pego1.PeData.Y[0, 2] = 0;
59Pego1.PeData.Y[0, 3] = 0;
60
61Pego1.PeData.Y[0, 199] = 0; // pre allocates memory
62Pego1.PeData.Y[1, 199] = 0;
63
64Pego1.PeColor.BitmapGradientMode = true;
65Pego1.PeColor.QuickStyle = QuickStyle.DarkNoBorder;
66
67Pego1.PeFont.Fixed = true;
68Pego1.PeFont.MainTitle.Bold = true;
69Pego1.PeFont.SubTitle.Bold = true;
70Pego1.PeFont.Label.Bold = true;
71Pego1.PeConfigure.TextShadows = TextShadows.BoldText;
72Pego1.PeFont.FontSize = FontSize.Medium;
73Pego1.PeGrid.Style = GridStyle.Dot;
74
75Pego1.PeColor.SubsetColors[0] = MainWindow.DemoColors[0];
76Pego1.PeColor.SubsetColors[1] = MainWindow.DemoColors[1];
77
78Pego1.PeConfigure.RenderEngine = RenderEngine.Direct2D;
79Pego1.PeConfigure.AntiAliasGraphics = true;
80Pego1.PeConfigure.AntiAliasText = true;
81
82// Set various export defaults //
83Pego1.PeSpecial.DpiX = 600;
84Pego1.PeSpecial.DpiY = 600;
85
86// default export setting //
87Pego1.PeUserInterface.Dialog.ExportSizeDef = ExportSizeDef.NoSizeOrPixel;
88Pego1.PeUserInterface.Dialog.ExportTypeDef = ExportTypeDef.Png;
89Pego1.PeUserInterface.Dialog.ExportDestDef = ExportDestDef.Clipboard;
90Pego1.PeUserInterface.Dialog.ExportUnitXDef = "1280";
91Pego1.PeUserInterface.Dialog.ExportUnitYDef = "768";
92Pego1.PeUserInterface.Dialog.ExportImageDpi = 300;
93
94MainWindow.Timer1.Interval = 25;
95MainWindow.Timer1.Enabled = true;
96MainWindow.Timer1.Start();
97
98Pego1.PeFunction.ReinitializeResetImage();
99Pego1.Invalidate();
100// Optionally call Pego1.Refresh() if you are not seeing changes immediately
101
102/*///////////////////////////////////////////////////////
103// the following code can be found in the Timer Event //
104////////////////////////////////////////////////////////
105private void Timer1_Tick(object sender, System.EventArgs e)
106{
107 // new point label //
108 CurrentTime = DateTime.Now.Hour.ToString() + ":" + DateTime.Now.Minute.ToString() + ":" + DateTime.Now.Second.ToString();
109
110 // Changing this variable increases throughput to chart, try 1, 10, 20, to 200
111 int nAmountToUpdate = 1;
112
113 // new YData //
114 float[] NewData = new float[2 * nAmountToUpdate];
115
116 for (int t = 0; t < nAmountToUpdate; t++)
117 {
118 // note this is subset 0 data
119 NewData[t] = ((float)(Rand_Num.NextDouble()) * 60) + 2;
120 NewData[t + 1] = ((float)(Rand_Num.NextDouble()) * 60) + 2;
121
122 // note this is subset 1 data, offset by nAmountToUpdate index as first subset data preceeds second subset data
123 NewData[nAmountToUpdate] = ((float)(Rand_Num.NextDouble()) * 90) + 2;
124 NewData[nAmountToUpdate + t] = ((float)(Rand_Num.NextDouble()) * 90) + 2;
125 }
126
127 // transfer new point label //
128 for (int t = 0; t < nAmountToUpdate; t++)
129 Pego1.PeString.PointLabels.AppendData(CurrentTime);
130
131 // transfer new YData //
132 // this will also update and view new image //
133 // Note last argument nAmountToUpdate, chart will expect array Length = 2 (PeData.Subsets) * nAmountToUpdate
134 Pego1.PeData.Y.AppendData(NewData, nAmountToUpdate);
135}
136
137*/
Tip: Uses property syntax like Pego1.PeData.Y[s, p]Click underlined properties to view documentation