Beispiel #1
0
        public DrawingImage Draw(DiagramDataSeriesUnited diagramData, DiagramDataExtremums diagramDataExtremums,
                                 DiagramDrawingCalculator diagramDrawingCalculator, DiagramMode diagramMode, Every groupInterval)
        {
            _diagramData = diagramData;
            _extremums   = diagramDataExtremums;
            _diagramDrawingCalculator = diagramDrawingCalculator;
            _diagramMode   = diagramMode;
            _groupInterval = groupInterval;

            var drawingGroup = new DrawingGroup();

            drawingGroup.Children.Add(FullDiagramBackground(_diagramDrawingCalculator));
            drawingGroup.Children.Add(DiagramRegionBackground(_diagramDrawingCalculator));

            drawingGroup.Children.Add(HorizontalAxes(_diagramDrawingCalculator));
            drawingGroup.Children.Add(VerticalGridLines(_diagramDrawingCalculator));

            drawingGroup.Children.Add(XAxisDashes(Dock.Top, _diagramDrawingCalculator));
            drawingGroup.Children.Add(XAxisDashes(Dock.Bottom, _diagramDrawingCalculator));
            drawingGroup.Children.Add(XAxisMarkers(Dock.Top, _diagramDrawingCalculator));
            drawingGroup.Children.Add(XAxisMarkers(Dock.Bottom, _diagramDrawingCalculator));

            drawingGroup.Children.Add(VerticalAxes(_diagramDrawingCalculator));

            drawingGroup.Children.Add(YAxisDashes(Dock.Left, _diagramDrawingCalculator));
            drawingGroup.Children.Add(YAxisMarkers(Dock.Left, _diagramDrawingCalculator));
            drawingGroup.Children.Add(YAxisDashes(Dock.Right, _diagramDrawingCalculator));
            drawingGroup.Children.Add(YAxisMarkers(Dock.Right, _diagramDrawingCalculator));

            drawingGroup.Children.Add(HorizontalGridLines(_diagramDrawingCalculator));

            if (_diagramMode == DiagramMode.BarVertical || _diagramMode == DiagramMode.BarVertical100)
            {
                BarVerticalDiagram(_diagramDrawingCalculator, ref drawingGroup);
            }
            if (_diagramMode == DiagramMode.Lines)
            {
                for (var j = 0; j < _diagramData.SeriesCount; j++)
                {
                    drawingGroup.Children.Add(OneSeriesLine(_diagramDrawingCalculator, j));
                }
            }
            if (_diagramMode == DiagramMode.SeparateLines)
            {
                drawingGroup.Children.Add(OneSeriesLine(_diagramDrawingCalculator, diagramData.ActiveLine));
            }

            return(new DrawingImage(drawingGroup));
        }
        public DiagramDataExtremums FindDataExtremums(DiagramMode diagramMode)
        {
            var dataExtremums = new DiagramDataExtremums();

            dataExtremums.MinDate = DiagramData.ElementAt(0).Key;
            dataExtremums.MaxDate = DiagramData.Last().Key;

            switch (diagramMode)
            {
            case DiagramMode.SeparateLines:
                // экстремумы определяются по одной, активной сейчас линии
                dataExtremums.MinValue = double.PositiveInfinity;
                dataExtremums.MaxValue = Double.NegativeInfinity;
                foreach (var day in DiagramData)
                {
                    if (day.Value[ActiveLine] < dataExtremums.MinValue)
                    {
                        dataExtremums.MinValue = day.Value[ActiveLine];
                    }
                    if (day.Value[ActiveLine] > dataExtremums.MaxValue)
                    {
                        dataExtremums.MaxValue = day.Value[ActiveLine];
                    }
                }
                break;

            case DiagramMode.Lines:
            case DiagramMode.BarHorizontal:
                // это вариант , когда столбцы разных серий стоят рядом
                dataExtremums.MinValue = DiagramData.Values.Min(l => l.Min());
                dataExtremums.MaxValue = DiagramData.Values.Max(l => l.Max());
                break;

            case DiagramMode.BarVertical:
                // ряд серий отрицательные, либо даже просто значение отрицательное в положительной серии
                dataExtremums.MinValue = dataExtremums.MaxValue = 0;
                foreach (var day in DiagramData)
                {
                    var plus  = day.Value.Where(values => values > 0).Sum();
                    var minus = day.Value.Where(values => values < 0).Sum();
                    if (plus > dataExtremums.MaxValue)
                    {
                        dataExtremums.MaxValue = plus;
                    }
                    if (minus < dataExtremums.MinValue)
                    {
                        dataExtremums.MinValue = minus;
                    }
                }
                break;

            case DiagramMode.BarVertical100:
                dataExtremums.MinValue = 0;
                dataExtremums.MaxValue = 100;
                break;
            }

            if ((int)diagramMode < 100)
            {
                if (dataExtremums.MaxValue > 0 && dataExtremums.MinValue > 0)
                {
                    dataExtremums.MinValue = 0;
                }
                if (dataExtremums.MaxValue < 0 && dataExtremums.MinValue < 0)
                {
                    dataExtremums.MaxValue = 0;
                }
            }

            return(dataExtremums);
        }
        public bool ZoomLimits(DiagramDataSeriesUnited currentSeriesUnited, Every groupInterval, int delta, ref DiagramDataExtremums extremums)
        {
            if (delta < 0)// increase picture
            {
                if (currentSeriesUnited.DiagramData.Count < 6)
                {
                    return(false);
                }
            }
            else
            {
            }

            int shiftDateRange = (extremums.MaxDate - extremums.MinDate).Days * delta / 1200;

            if (Math.Abs(shiftDateRange) < 31 && groupInterval == Every.Month)
            {
                shiftDateRange = 31 * Math.Sign(delta);
            }
            if (Math.Abs(shiftDateRange) < 366 && groupInterval == Every.Year)
            {
                shiftDateRange = 366 * Math.Sign(delta);
            }
            extremums.MinDate = extremums.MinDate.AddDays(-shiftDateRange);
            extremums.MaxDate = extremums.MaxDate.AddDays(shiftDateRange);
            return(true);
        }
        public bool MoveLimits(DiagramDataSeriesUnited etalonSeriesUnited, DiagramDrawingCalculator calculator, int horizontalPoints, int verticalPoints, ref DiagramDataExtremums extremums)
        {
            var delta = (int)Math.Round(Math.Abs(horizontalPoints / calculator.PointPerDay));

            if (horizontalPoints < 0) // двигаем влево
            {
                if (extremums.MaxDate == etalonSeriesUnited.DiagramData.Last().Key)
                {
                    return(false);
                }
                if ((etalonSeriesUnited.DiagramData.Last().Key - extremums.MaxDate).Days < delta)
                {
                    delta = (etalonSeriesUnited.DiagramData.Last().Key - extremums.MaxDate).Days;
                }
                extremums.MaxDate = extremums.MaxDate.AddDays(delta);
                extremums.MinDate = extremums.MinDate.AddDays(delta);
            }
            else // вправо
            {
                if (extremums.MinDate == etalonSeriesUnited.DiagramData.ElementAt(0).Key)
                {
                    return(false);
                }
                if ((extremums.MinDate - etalonSeriesUnited.DiagramData.ElementAt(0).Key).Days < delta)
                {
                    delta = (extremums.MinDate - etalonSeriesUnited.DiagramData.ElementAt(0).Key).Days;
                }
                extremums.MinDate = extremums.MinDate.AddDays(-delta);
                extremums.MaxDate = extremums.MaxDate.AddDays(-delta);
            }
            return(true);
        }