public AxisLimits(DateTime startTimestamp, DateTime endTimestamp, Dimension yDimension) { const bool snapToGrid = true; StartTimestamp = startTimestamp; EndTimestamp = endTimestamp; var timeInterval = (EndTimestamp - StartTimestamp).TotalSeconds; TimeUnit = new TimeUnitForDisplay(timeInterval); X = new Dimension(0, TimeUnit.ConvertFromSeconds(timeInterval), !snapToGrid); Y = yDimension; }
private void InitSeries( MeasurementComparisonDictionary sourceData, DateTime baseTimestamp, TimeUnitForDisplay timeUnit) { _actualSeries = new Series(ActualCaption); _expectedSeries = new Series(ExpectedCaption); _failSeries = new Series(FailCaption); var hasFailure = false; foreach (var key in sourceData.Keys) { var xValue = timeUnit.ConvertFromSeconds((key - baseTimestamp).TotalSeconds); var value = sourceData[key].Value; var expectedY = value.ExpectedValueOut?.To <double>(); // if we have a non-convertible value, return null, so it is skipped var actualY = value.ActualValueOut?.ToWithDefault <double?>(null); // ensure that IsGood issues are also marked as failures. var pass = sourceData[key].IsOk(); var failValue = actualY ?? expectedY; AddPoint(_expectedSeries, xValue, expectedY); AddPoint(_actualSeries, xValue, actualY); if (pass) { continue; } AddPoint(_failSeries, xValue, failValue); hasFailure = true; } SetSeriesStyle(_actualSeries, SeriesType.Actual, hasFailure); SetSeriesStyle(_expectedSeries, SeriesType.Expected, hasFailure); SetSeriesStyle(_failSeries, SeriesType.Fail, hasFailure); _chart.Series.Add(_actualSeries); _chart.Series.Add(_expectedSeries); _chart.Series.Add(_failSeries); }
private void InitSeries( MeasurementComparisonDictionary sourceData, DateTime baseTimestamp, TimeUnitForDisplay timeUnit) { _expectedSeries = new LineSeries <ObservablePoint> { Values = new List <ObservablePoint>(), Fill = null, LineSmoothness = 0, GeometrySize = 0, Stroke = new SolidColorPaint(ExpectedColor) { StrokeThickness = LineThickness, PathEffect = new DashEffect(new[] { 5f, 5f }) }, Name = ExpectedCaption }; _actualSeries = new LineSeries <ObservablePoint> { Values = new List <ObservablePoint>(), Fill = null, LineSmoothness = 0, GeometrySize = 0, Stroke = new SolidColorPaint(ActualColor) { StrokeThickness = LineThickness + 1 }, Name = ActualCaption }; var errorPaint = new SolidColorPaint(FailColor); _failSeries = new LineSeries <ObservablePoint, CircleGeometry> { GeometrySize = 9, Values = new List <ObservablePoint>(), Fill = null, Stroke = null, GeometryStroke = errorPaint, GeometryFill = errorPaint, LineSmoothness = 0, Name = FailCaption }; foreach (var key in sourceData.Keys) { var xValue = timeUnit.ConvertFromSeconds((key - baseTimestamp).TotalSeconds); var value = sourceData[key].Value; var expectedY = value.ExpectedValueOut?.To <double>(); // if we have a non-convertible value, return null, so it is skipped var actualY = value.ActualValueOut?.ToWithDefault <double?>(null); // ensure that IsGood issues are also marked as failures. var pass = sourceData[key].IsOk(); var failValue = actualY ?? expectedY; AddPoint(_expectedSeries, xValue, expectedY); AddPoint(_actualSeries, xValue, actualY); if (pass) { continue; } AddPoint(_failSeries, xValue, failValue); } var chartSeries = new List <ISeries> { _actualSeries, _expectedSeries }; var errors = _failSeries.Values as List <ObservablePoint>; Debug.Assert(errors != null, nameof(errors) + " != null"); if (errors.Any()) { chartSeries.Add(_failSeries); } _chart.Series = chartSeries; _chart.DrawMarginFrame = new DrawMarginFrame { Fill = new SolidColorPaint(ChartColor), Stroke = new SolidColorPaint(MajorGridColor) }; }