/// <summary> /// Добавление на канвас "серой" области /// </summary> /// <param name="canvas"></param> /// <param name="X1"></param> /// <param name="X2"></param> /// <param name="manager"></param> protected static void AddWhitespace(Canvas canvas, double X1, double X2, ScaleManager manager) { if (X2 <= X1) { return; } double d_start = manager.GetOffset((UInt64)X1); double d_end = manager.GetOffset((UInt64)X2); Rectangle rect = new Rectangle(); rect.Stroke = new SolidColorBrush(Colors.Green); rect.Fill = new SolidColorBrush(Color.FromArgb(100, 125, 125, 125)); rect.Width = d_end - d_start; rect.Height = (canvas.ActualHeight != 0) ? canvas.ActualHeight - 4 : 4; canvas.Children.Add(rect); Canvas.SetLeft(rect, d_start); Canvas.SetBottom(rect, 2); }
/// <summary> /// Отображение простого сигнала /// </summary> /// <param name="canvas"></param> /// <param name="iter"></param> /// <param name="DrawValue"></param> protected void RenderSimpleSignal(Canvas canvas, IValueIterator iter, DrawValueDelegate DrawValue) { markers.Clear(); canvas.Children.Clear(); UInt64 MinimumVisibleChange = scaleManager.MinimumVisibleChange; //Рисование начала диаграммы UInt64 x1 = 0, x2 = 0; string value = string.Empty; x1 = scaleManager.VisibleStartTime; iter.SetCurrentIndexByKey(scaleManager.VisibleStartTime); x2 = iter.LastEvent; if (x2 > scaleManager.VisibleEndTime) { x2 = scaleManager.VisibleEndTime; } if (x2 < scaleManager.VisibleStartTime) { x2 = scaleManager.VisibleStartTime; } Markers.Add(new TimeMarker(x1, scaleManager.GetOffset(x1))); while (true) { //Началась "серая" область if ((x2 - x1) <= MinimumVisibleChange) { UInt64 whitespace = x1; while (true) { x1 = iter.LastEvent; if (x1 > scaleManager.VisibleEndTime) { x1 = scaleManager.VisibleEndTime; } if (x1 < scaleManager.VisibleStartTime) { x1 = scaleManager.VisibleStartTime; } iter.MoveNext(); x2 = iter.LastEvent; if (x2 > scaleManager.VisibleEndTime) { x2 = scaleManager.VisibleEndTime; } if (x2 < scaleManager.VisibleStartTime) { x2 = scaleManager.VisibleStartTime; } //закончилась "серая" область if ((x2 - x1) >= scaleManager.MinimumVisibleChange) { AddWhitespace(canvas, whitespace, x1, scaleManager); value = AbstractSignalDump.GetStringValue(iter); Markers.Add(new TimeMarker(x1, scaleManager.GetOffset(x1))); DrawValue(canvas, x1, x2, scaleManager, value); break; } if ((iter.LastEvent >= scaleManager.VisibleEndTime) || (iter.IsEndOfIteration == true)) { AddWhitespace(canvas, whitespace, iter.LastEvent, scaleManager); Markers.Add(new TimeMarker(iter.LastEvent, scaleManager.GetOffset(iter.LastEvent))); break; } iter.SetCurrentIndexByKey(x1 + MinimumVisibleChange); } } else { value = AbstractSignalDump.GetStringValue(iter); Markers.Add(new TimeMarker(x1, scaleManager.GetOffset(x1))); DrawValue(canvas, x1, x2, scaleManager, value); iter.MoveNext(); } x1 = x2; x2 = iter.LastEvent; if ((iter.LastEvent >= scaleManager.VisibleEndTime) || (iter.IsEndOfIteration == true)) { value = AbstractSignalDump.GetStringValue(iter); Markers.Add(new TimeMarker(x1, scaleManager.GetOffset(x1))); DrawValue(canvas, x1, scaleManager.VisibleEndTime, scaleManager, value); break; } if (x2 > scaleManager.VisibleEndTime) { x2 = scaleManager.VisibleEndTime; } if (x2 < scaleManager.VisibleStartTime) { x2 = scaleManager.VisibleStartTime; } } }