예제 #1
0
        /// <summary>
        /// Renders a line chart a canvas. This method is called by the chart class.
        /// </summary>
        /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param>
        /// <param name="axis">Axis orientation object</param>
        /// <param name="minMax">Data for the extreme values</param>
        /// <param name="gridPaint">Paint object for the grid lines</param>
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            CheckConstructionPolicy(nameof(LineChart));
            var canvas = canvasWrapper.Canvas;

            if (canvasWrapper.NumberPlottedChart < 1)
            {
                DrawHorizontalLabels(canvasWrapper, axis, minMax);
                DrawVerticalLabels(canvasWrapper, axis, minMax);
            }

            _chartPaint.IsStroke = true;
            var path = new SKPath();

            path.MoveTo(ConstructionData.First());
            foreach (var point in ConstructionData.Skip(1))
            {
                path.LineTo(point);
                if (ShowPoints)
                {
                    canvas.DrawCircle(point, PointRadius, _chartPaint);
                }
            }
            canvas.DrawPath(path, _chartPaint);
            canvasWrapper.NumberPlottedChart += 1;

            if (canvasWrapper.CanShowLegend)
            {
                RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.LineChart);
            }
        }
        public void OutputBuilderTests_BuildProductLines_NullProductValue_ThrowsException()
        {
            //arrange
            var     sut   = new OutputBuilder();
            IMinMax range = GetMinMaxMock(1, 5, 3); // Irrelevant to this test

            IAccumulatedProduct[] mockData =
            {
                GetAccumulatedProductMock("a", new double[0]),
                GetAccumulatedProductMock("b", null),
                GetAccumulatedProductMock("c", new double[0]),
            };
            IAccumulatedProducts mockDatas = GetAccumulatedProductsMock(range, mockData);
            bool   exceptionThrown         = false;
            string exceptionMessage        = "";

            //act
            try
            {
                sut.BuildProductLines(mockDatas);
            }
            catch (InvalidOperationException e)
            {
                exceptionThrown  = true;
                exceptionMessage = e.Message;
            }
            //assert
            Assert.IsTrue(exceptionThrown);
            Assert.AreEqual("Accumulated product 1 value: not allowed to be null", exceptionMessage);
        }
예제 #3
0
        /// <summary>
        /// Renders a bar chart on the canvas. This method is called by the Chart class.
        /// </summary>
        /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param>
        /// <param name="axis">Axis orientation object</param>
        /// <param name="minMax">Data for the extreme values</param>
        /// <param name="gridPaint">Paint object for the grid lines</param>
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            CheckConstructionPolicy(nameof(BarChart));

            var drawingSpace = canvasWrapper.ChartArea.Right / ConstructionData.Count() * 0.9;
            var rectSpace    = (float)drawingSpace / canvasWrapper.NumberOfCharts;
            var columnSpace  = (float)((canvasWrapper.ChartArea.Right / ConstructionData.Count()) - drawingSpace) / 2;
            var pointX       = canvasWrapper.ChartArea.Width / ConstructionData.Count();
            var counter      = 0;

            foreach (var point in ConstructionData)
            {
                var x1 = (pointX * counter) + canvasWrapper.ChartArea.Left + columnSpace +
                         (canvasWrapper.NumberPlottedChart * rectSpace);
                var x2   = x1 + rectSpace - columnSpace;
                var rect = new SKRect(x1, point.Y, x2, canvasWrapper.ChartArea.Top);
                _chartPaint.IsStroke = IsStroked;
                canvasWrapper.Canvas.DrawRect(rect, _chartPaint);

                var xLabel = XLabel[counter];
                axis.DrawAndPositionXTickMark(xLabel, (x1 + (x2 - x1) / 2),
                                              canvasWrapper.ChartArea.Bottom, _labelPaint);

                var yLabel = GetYLabel(OriginalData.ElementAt(counter).Y);
                axis.DrawAndPositionYTickMark(yLabel, point.Y, (x1 + (x2 - x1) / 2), _labelPaint);
                counter++;
            }
            canvasWrapper.NumberPlottedChart += 1;
        }
예제 #4
0
        /// <summary>
        /// Renders an Area chart a canvas. This method is called by the chart class.
        /// </summary>
        /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param>
        /// <param name="axis">Axis orientation object</param>
        /// <param name="minMax">Data for the extreme values</param>
        /// <param name="gridPaint">Paint object for the grid lines</param>
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            CheckConstructionPolicy(nameof(LineChart));

            if (canvasWrapper.NumberPlottedChart < 1)
            {
                DrawHorizontalLabels(canvasWrapper, axis, minMax);
                DrawVerticalLabels(canvasWrapper, axis, minMax);
            }

            var canvas             = canvasWrapper.Canvas;
            var path               = new SKPath();
            var constructionPoints = ConstructionData.ToList();
            var firstPoint         = ConstructionData.First();
            var lastPoint          = ConstructionData.Last();
            var connectionPoint    = new SKPoint(lastPoint.X, firstPoint.Y);

            constructionPoints.Add(connectionPoint);
            path.MoveTo(constructionPoints.First());
            foreach (var point in constructionPoints.Skip(1))
            {
                path.LineTo(point);
            }
            path.FillType = SKPathFillType.EvenOdd;
            path.Close();
            _chartPaint.IsStroke = false;
            canvas.DrawPath(path, _chartPaint);
            canvasWrapper.NumberPlottedChart += 1;

            if (canvasWrapper.CanShowLegend)
            {
                RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.AreaChart);
            }
        }
        private static IAccumulatedProducts GetAccumulatedProductsMock(IMinMax range, IEnumerable <IAccumulatedProduct> products)
        {
            var mockAccProducts = new Mock <IAccumulatedProducts>();

            mockAccProducts.SetupGet(maps => maps.Range).Returns(range);
            mockAccProducts.SetupGet(maps => maps.Products).Returns(products);
            return(mockAccProducts.Object);
        }
예제 #6
0
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            var divisor     = 2.5f;
            var strokeWidth = 30;

            if (canvasWrapper.NumberOfCharts > 6)
            {
                switch (Device.RuntimePlatform)
                {
                case Device.WPF:
                case Device.GTK:
                case Device.macOS:
                case Device.UWP: {
                    divisor     = 2.0f;
                    strokeWidth = 15;
                    break;
                }

                default: {
                    divisor     = 1.5f;
                    strokeWidth = 30;
                    break;
                }
                }
                ;
            }


            var chartArea = canvasWrapper.ChartArea;
            var canvas    = canvasWrapper.Canvas;

            var radius = Math.Min(chartArea.MidX, chartArea.MidY) / divisor;

            radius = radius - (canvasWrapper.NumberPlottedChart * strokeWidth);

            _chartPaint.StrokeWidth = strokeWidth;
            _chartPaint.Style       = SKPaintStyle.Stroke;

            var teta = 360 - ((minMax.Ymax - OriginalData.ElementAt(0).Y) / (minMax.Ymax - minMax.Ymin) * 360);

            var rect = new SKRect(chartArea.MidX - radius, chartArea.MidY - radius, chartArea.MidX + radius, chartArea.MidY + radius);
            var path = new SKPath();

            path.AddArc(rect, 90, -teta);
            canvas.DrawPath(path, _chartPaint);

            _chartPaint.Color = ChartColor.WithAlpha(70);
            canvas.DrawCircle(chartArea.MidX, chartArea.MidY, radius, _chartPaint);
            canvasWrapper.NumberPlottedChart += 1;

            _chartPaint.Color = ChartColor;
            ChartName         = $"{Label} : {Value}";
            RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.ScatterChart);
        }
 private void Output(AccumulatedProducts accumulatedProducts, string fileName)
 {
     using (StreamWriter writer = new StreamWriter(fileName))
     {
         IMinMax range = accumulatedProducts.Range;
         writer.WriteLine(range.Start + ", " + range.Duration);
         foreach (var product in accumulatedProducts.Products)
         {
             string toOutput    = string.Join(", ", product.Values);
             string finalOutput = product.Name + ", " + toOutput;
             writer.WriteLine(finalOutput);
         }
     }
 }
예제 #8
0
        //Draws the vertical labels
        protected void DrawVerticalLabels(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            var heightSpacing = (canvasWrapper.ChartArea.Bottom - canvasWrapper.ChartArea.Top)
                                / canvasWrapper.GridLines;
            var heightHolder = heightSpacing;

            heightSpacing += canvasWrapper.Converter.YOffset;
            for (int i = 0; i < canvasWrapper.GridLines; i++)
            {
                var labelValue = canvasWrapper.Converter
                                 .YValueToRealScale(heightSpacing, minMax.Ymax, minMax.Ymin);
                axis.DrawAndPositionYTickMark(GetYLabel(labelValue), heightSpacing, canvasWrapper.ChartArea.Left, _labelPaint);
                heightSpacing += heightHolder;
            }
        }
예제 #9
0
        //Draws the horizontal labels
        protected void DrawHorizontalLabels(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            var widthSpacing = (canvasWrapper.ChartArea.Right - canvasWrapper.ChartArea.Left)
                               / canvasWrapper.GridLines;
            var widthHolder = widthSpacing;

            widthSpacing += canvasWrapper.Converter.XOffset;
            for (int i = 0; i < canvasWrapper.GridLines; i++)
            {
                var labelValue = canvasWrapper.Converter
                                 .XValueToRealScale(widthSpacing, minMax.Xmax, minMax.Xmin);
                axis.DrawAndPositionXTickMark(GetXLabel(labelValue), widthSpacing, canvasWrapper.ChartArea.Bottom, _labelPaint);
                widthSpacing += widthHolder;
            }
        }
        public void OutputBuilderTests_BuildProductLines_CorrectProductName_StringStartsWithProductNameAndAComma()
        {
            //arrange
            var     sut   = new OutputBuilder();
            IMinMax range = GetMinMaxMock(1, 5, 3); // Irrelevant to this test
            string  names = "Working";

            IAccumulatedProduct[] mockData  = { GetAccumulatedProductMock(names, new double[0]) };
            IAccumulatedProducts  mockDatas = GetAccumulatedProductsMock(range, mockData);
            //act
            List <string> outputString = sut.BuildProductLines(mockDatas);

            //assert
            Assert.AreEqual("Working, ", outputString.First());
        }
예제 #11
0
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            int   strokeWidth;
            float divisor;

            switch (Device.RuntimePlatform)
            {
            case Device.WPF:
            case Device.GTK:
            case Device.macOS:
            case Device.UWP: {
                divisor     = 3.0f;
                strokeWidth = 100;
                break;
            }

            default: {
                divisor     = 2.0f;
                strokeWidth = 200;
                break;
            }
            }
            ;

            var chartArea = canvasWrapper.ChartArea;
            var canvas    = canvasWrapper.Canvas;

            _chartPaint.StrokeWidth = strokeWidth;
            _chartPaint.Style       = SKPaintStyle.Stroke;
            _chartPaint.StrokeCap   = SKStrokeCap.Butt;


            var radius     = Math.Min(chartArea.MidX, chartArea.MidY) / divisor;
            var rect       = new SKRect(chartArea.MidX - radius, chartArea.MidY - radius, chartArea.MidX + radius, chartArea.MidY + radius);
            var startAngle = canvasWrapper.NumberPlottedChart == 0 ? 0 : canvasWrapper.NextStartAngle;
            var sweepAngle = (Angel / canvasWrapper.SumOfAngles) * 360;
            var path       = new SKPath();

            path.AddArc(rect, -startAngle, -sweepAngle);
            canvas.DrawPath(path, _chartPaint);

            canvasWrapper.NextStartAngle      = startAngle + sweepAngle;
            canvasWrapper.NumberPlottedChart += 1;
            ChartName = $"{Label} : {Value}";
            RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.ScatterChart);
        }
예제 #12
0
        /// <summary>
        /// Renders a bar chart on the canvas. This method is called by the Chart class.
        /// </summary>
        /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param>
        /// <param name="axis">Axis orientation object</param>
        /// <param name="minMax">Data for the extreme values</param>
        /// <param name="gridPaint">Paint object for the grid lines</param>
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            CheckConstructionPolicy(nameof(BarChart));

            var count        = ConstructionData.Count();
            var drawingSpace = canvasWrapper.ChartArea.Right / count * 0.9;
            var rectSpace    = (float)drawingSpace / canvasWrapper.NumberOfCharts;
            var columnSpace  = (float)((canvasWrapper.ChartArea.Right / count) - drawingSpace) / 2;
            var pointX       = canvasWrapper.ChartArea.Width / count;
            var counter      = 0;

            foreach (var point in ConstructionData)
            {
                var x1 = (pointX * counter) + canvasWrapper.ChartArea.Left + columnSpace +
                         (canvasWrapper.NumberPlottedChart * rectSpace);
                var x2   = x1 + rectSpace - columnSpace;
                var rect = new SKRect(x1, point.Y, x2, canvasWrapper.ChartArea.Top);
                _chartPaint.IsStroke = IsStroked;
                canvasWrapper.Canvas.DrawRect(rect, _chartPaint);

                var xLabel = XLabel[counter];
                _labelPaint.TextSize = canvasWrapper.LabelTextSize;
                if (canvasWrapper.NumberPlottedChart == 0)
                {
                    RenderXTickMark(canvasWrapper, axis, x1, x2, xLabel);
                    var yLabel = GetYLabel(OriginalData.ElementAt(counter).Y);
                    if (yLabel.Trim().Length > 5)
                    {
                        canvasWrapper.DrawYTickMarkOnBars = false;
                        DrawVerticalLabels(canvasWrapper, axis, minMax);
                    }
                }
                if (canvasWrapper.DrawYTickMarkOnBars)
                {
                    RenderYTickMark(canvasWrapper, axis, counter, point, rect);
                }
                counter++;
            }
            canvasWrapper.NumberPlottedChart += 1;
            if (canvasWrapper.CanShowLegend)
            {
                RenderLegend(canvasWrapper, axis, canvasWrapper.Canvas, PointPlotVariant.AreaChart);
            }
        }
예제 #13
0
        /// <summary>
        /// Renders a Scatter chart a canvas. This method is called by the chart class.
        /// </summary>
        /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param>
        /// <param name="axis">Axis orientation object</param>
        /// <param name="minMax">Data for the extreme values</param>
        /// <param name="gridPaint">Paint object for the grid lines</param>
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            CheckConstructionPolicy(nameof(ScatterChart));

            if (canvasWrapper.NumberPlottedChart < 1)
            {
                DrawHorizontalLabels(canvasWrapper, axis, minMax);
                DrawVerticalLabels(canvasWrapper, axis, minMax);
            }

            var canvas = DisplayPoints(canvasWrapper);

            canvasWrapper.NumberPlottedChart += 1;

            if (canvasWrapper.CanShowLegend)
            {
                RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.ScatterChart);
            }
        }
예제 #14
0
        /// <summary>
        /// Renders a line chart a canvas. This method is called by the chart class.
        /// </summary>
        /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param>
        /// <param name="axis">Axis orientation object</param>
        /// <param name="minMax">Data for the extreme values</param>
        /// <param name="gridPaint">Paint object for the grid lines</param>
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            CheckConstructionPolicy(nameof(LineChart));
            var canvas = canvasWrapper.Canvas;

            if (canvasWrapper.NumberPlottedChart < 1)
            {
                DrawHorizontalLabels(canvasWrapper, axis, minMax);
                DrawVerticalLabels(canvasWrapper, axis, minMax);
            }

            _chartPaint.IsStroke = true;
            canvas.DrawPoints(SKPointMode.Lines, ConstructionData.ToArray(), _chartPaint);
            canvasWrapper.NumberPlottedChart += 1;

            if (canvasWrapper.CanShowLegend)
            {
                RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.LineChart);
            }
        }
        public void OutputBuilderTests_BuildProductLines_IfNoDataIn_ThrowsException()
        {
            //arrange
            var     sut   = new OutputBuilder();
            IMinMax range = GetMinMaxMock(1, 5, 3); // Irrelevant to this test
            IAccumulatedProducts mockDatas = GetAccumulatedProductsMock(range, new IAccumulatedProduct[] { });
            bool   exceptionThrown         = false;
            string exceptionMessage        = "";

            //act
            try
            {
                sut.BuildProductLines(mockDatas);
            }
            catch (InvalidOperationException e)
            {
                exceptionThrown  = true;
                exceptionMessage = e.Message;
            }
            //assert
            Assert.IsTrue(exceptionThrown);
            Assert.AreEqual("The list of accumulated products is not allowed to be empty", exceptionMessage);
        }
예제 #16
0
        /// <summary>
        /// Renders a Scatter chart a canvas. This method is called by the chart class.
        /// </summary>
        /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param>
        /// <param name="axis">Axis orientation object</param>
        /// <param name="minMax">Data for the extreme values</param>
        /// <param name="gridPaint">Paint object for the grid lines</param>
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            CheckConstructionPolicy(nameof(LineChart));

            if (canvasWrapper.NumberPlottedChart < 1)
            {
                DrawHorizontalLabels(canvasWrapper, axis, minMax);
                DrawVerticalLabels(canvasWrapper, axis, minMax);
            }

            var canvas = canvasWrapper.Canvas;

            _chartPaint.IsStroke = IsStroked;
            foreach (var point in ConstructionData)
            {
                canvas.DrawCircle(point, PointRadius, _chartPaint);
            }
            canvasWrapper.NumberPlottedChart += 1;

            if (canvasWrapper.CanShowLegend)
            {
                RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.ScatterChart);
            }
        }
예제 #17
0
 public MinMaxViewModel(IMinMax <T> limits)
 {
     Limits = limits;
 }
예제 #18
0
        public string BuildSummaryLine(IMinMax range)
        {
            string summaryLine = range.Start + ", " + range.Duration;

            return(summaryLine);
        }
예제 #19
0
 public override float InitialCalculations(IMinMax minMax)
 {
     Angel = 360 - ((minMax.Ymax - OriginalData.ElementAt(0).Y) / (minMax.Ymax - minMax.Ymin) * 360);
     return(Angel);
 }
예제 #20
0
 //No initial Calculation for this chart type
 public virtual float InitialCalculations(IMinMax minMax)
 {
     return(0f);
 }