/// <summary>
        /// Creates the segments of FastBarBitmapSeries
        /// </summary>
        public override void CreateSegments()
        {
            var isGrouped = (ActualXAxis is CategoryAxis && !(ActualXAxis as CategoryAxis).IsIndexed);

            if (isGrouped)
            {
                xValues = GroupedXValuesIndexes;
            }
            else
            {
                xValues = GetXValues();
            }
            IList <double> x1Values, x2Values, y1Values, y2Values;

            x1Values = new List <double>();
            x2Values = new List <double>();
            y1Values = new List <double>();
            y2Values = new List <double>();

            if (xValues != null)
            {
                DoubleRange sbsInfo = this.GetSideBySideInfo(this);
                double      origin  = ActualXAxis != null ? ActualXAxis.Origin : 0;
                if (ActualXAxis != null && ActualXAxis.Origin == 0 && ActualYAxis is LogarithmicAxis &&
                    (ActualYAxis as LogarithmicAxis).Minimum != null)
                {
                    origin = (double)(ActualYAxis as LogarithmicAxis).Minimum;
                }

                if (isGrouped)
                {
                    Segments.Clear();
                    Adornments.Clear();
                    GroupedActualData.Clear();
                    for (int i = 0; i < DistinctValuesIndexes.Count; i++)
                    {
                        var list = (from index in DistinctValuesIndexes[i]
                                    where GroupedSeriesYValues[0].Count > index
                                    select new List <double> {
                            GroupedSeriesYValues[0][index], index
                        }).
                                   OrderByDescending(val => val[0]).ToList();
                        for (int j = 0; j < list.Count; j++)
                        {
                            var yValue = list[j][0];
                            GroupedActualData.Add(ActualData[(int)list[j][1]]);
                            if (i < xValues.Count && GroupedSeriesYValues[0].Count > i)
                            {
                                x1Values.Add(i + sbsInfo.Start);
                                x2Values.Add(i + sbsInfo.End);
                                y1Values.Add(yValue);
                                y2Values.Add(ActualXAxis != null ? ActualXAxis.Origin : 0); // Setting origin value for fastbar segment
                            }
                        }
                    }

                    if (Segment != null && (!IsActualTransposed && Segment is FastBarBitmapSegment) ||
                        (IsActualTransposed && Segment is FastColumnBitmapSegment))
                    {
                        Segments.Clear();
                    }

                    if (Segment == null || Segments.Count == 0)
                    {
                        if (IsActualTransposed)
                        {
                            Segment = new FastBarBitmapSegment(x1Values, y1Values, x2Values, y2Values, this);
                        }
                        else
                        {
                            Segment = new FastColumnBitmapSegment(x1Values, y1Values, x2Values, y2Values, this);
                        }

                        Segment.SetData(x1Values, y1Values, x2Values, y2Values);
                        this.Segments.Add(Segment);
                    }

                    if (AdornmentsInfo != null)
                    {
                        int count = 0;
                        for (int i = 0; i < DistinctValuesIndexes.Count; i++)
                        {
                            var list = (from index in DistinctValuesIndexes[i]
                                        select new List <double> {
                                GroupedSeriesYValues[0][index], index
                            }).
                                       OrderByDescending(val => val[0]).ToList();
                            for (int j = 0; j < DistinctValuesIndexes[i].Count; j++)
                            {
                                var yValue = list[j][0];
                                if (i < xValues.Count)
                                {
                                    if (this.AdornmentsInfo.AdornmentsPosition == AdornmentsPosition.Top)
                                    {
                                        AddColumnAdornments(i, yValue, x1Values[count], y1Values[count], count, sbsInfo.Delta / 2);
                                    }
                                    else if (this.AdornmentsInfo.AdornmentsPosition == AdornmentsPosition.Bottom)
                                    {
                                        AddColumnAdornments(i, yValue, x1Values[count], y2Values[count], count, sbsInfo.Delta / 2);
                                    }
                                    else
                                    {
                                        AddColumnAdornments(i, yValue, x1Values[count], y1Values[count] + (y2Values[count] - y1Values[count]) / 2, count, sbsInfo.Delta / 2);
                                    }
                                }

                                count++;
                            }
                        }
                    }
                }
                else
                {
                    if (!this.IsIndexed)
                    {
                        for (int i = 0; i < this.DataCount; i++)
                        {
                            x1Values.Add(xValues[i] + sbsInfo.Start);
                            x2Values.Add(xValues[i] + sbsInfo.End);
                            y1Values.Add(YValues[i]);
                            y2Values.Add(ActualXAxis != null ? ActualXAxis.Origin : 0); // Setting origin value for fastbar segment
                        }
                    }
                    else
                    {
                        for (int i = 0; i < this.DataCount; i++)
                        {
                            x1Values.Add(i + sbsInfo.Start);
                            x2Values.Add(i + sbsInfo.End);
                            y1Values.Add(YValues[i]);
                            y2Values.Add(origin);
                        }
                    }

                    if (Segment != null && (!IsActualTransposed && Segment is FastBarBitmapSegment) ||
                        (IsActualTransposed && Segment is FastColumnBitmapSegment))
                    {
                        Segments.Clear();
                    }
                    if (Segment == null || Segments.Count == 0)
                    {
                        if (IsActualTransposed)
                        {
                            Segment = new FastBarBitmapSegment(x1Values, y1Values, x2Values, y2Values, this);
                        }
                        else
                        {
                            Segment = new FastColumnBitmapSegment(x1Values, y1Values, x2Values, y2Values, this);
                        }
                        Segment.SetData(x1Values, y1Values, x2Values, y2Values);
                        this.Segments.Add(Segment);
                    }

                    if (Segment is FastBarBitmapSegment)
                    {
                        (Segment as FastBarBitmapSegment).Item = ActualData;
                        (Segment as FastBarBitmapSegment).SetData(x1Values, y1Values, x2Values, y2Values);
                    }
                    else
                    {
                        (Segment as FastColumnBitmapSegment).Item = ActualData;
                        (Segment as FastColumnBitmapSegment).SetData(x1Values, y1Values, x2Values, y2Values);
                    }

                    if (AdornmentsInfo != null)
                    {
                        ClearUnUsedAdornments(this.DataCount);
                        for (int i = 0; i < this.DataCount; i++)
                        {
                            if (i < this.DataCount)
                            {
                                if (this.AdornmentsInfo.AdornmentsPosition == AdornmentsPosition.Top)
                                {
                                    AddColumnAdornments(xValues[i], YValues[i], x1Values[i], y1Values[i], i, sbsInfo.Delta / 2);
                                }
                                else if (this.AdornmentsInfo.AdornmentsPosition == AdornmentsPosition.Bottom)
                                {
                                    AddColumnAdornments(xValues[i], YValues[i], x1Values[i], y2Values[i], i, sbsInfo.Delta / 2);
                                }
                                else
                                {
                                    AddColumnAdornments(xValues[i], YValues[i], x1Values[i], y1Values[i] + (y2Values[i] - y1Values[i]) / 2, i, sbsInfo.Delta / 2);
                                }
                            }
                        }
                    }
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Creates the segments of ColumnSeries.
        /// </summary>
        public override void CreateSegments()
        {
            double        x1, x2, y1, y2;
            var           isGrouped = ActualXAxis is CategoryAxis && !(ActualXAxis as CategoryAxis).IsIndexed;
            List <double> xValues   = null;

            if (isGrouped)
            {
                xValues = GroupedXValuesIndexes;
            }
            else
            {
                xValues = GetXValues();
            }
            double median = 0d;
            double origin = ActualXAxis != null ? ActualXAxis.Origin : 0;

            if (ActualXAxis != null && ActualXAxis.Origin == 0 && ActualYAxis is LogarithmicAxis &&
                (ActualYAxis as LogarithmicAxis).Minimum != null)
            {
                origin = (double)(ActualYAxis as LogarithmicAxis).Minimum;
            }
            if (xValues != null)
            {
                DoubleRange sbsInfo = this.GetSideBySideInfo(this);
                median = sbsInfo.Delta / 2;
                int segmentCount = 0;

                if (isGrouped)
                {
                    Segments.Clear();
                    Adornments.Clear();
                    GroupedActualData.Clear();
                    for (int i = 0; i < DistinctValuesIndexes.Count; i++)
                    {
                        var list = (from index in DistinctValuesIndexes[i]
                                    where GroupedSeriesYValues[0].Count > index
                                    select new List <double> {
                            GroupedSeriesYValues[0][index], index
                        }).
                                   OrderByDescending(val => val[0]).ToList();
                        for (int j = 0; j < list.Count; j++)
                        {
                            var yValue = list[j][0];
                            x1 = i + sbsInfo.Start;
                            x2 = i + sbsInfo.End;
                            y1 = yValue;
                            y2 = origin; // Setting origin value for column segment
                            GroupedActualData.Add(ActualData[(int)list[j][1]]);
                            Segments.Add(new ColumnSegment(x1, y1, x2, y2, this)
                            {
                                XData = xValues[j],
                                YData = yValue,
                                Item  = GroupedActualData[segmentCount]
                            });
                            if (AdornmentsInfo != null)
                            {
                                if (this.AdornmentsInfo.AdornmentsPosition == AdornmentsPosition.Top)
                                {
                                    AddColumnAdornments(i, yValue, x1, y1, segmentCount, median);
                                }
                                else if (this.AdornmentsInfo.AdornmentsPosition == AdornmentsPosition.Bottom)
                                {
                                    AddColumnAdornments(i, yValue, x1, y2, segmentCount, median);
                                }
                                else
                                {
                                    AddColumnAdornments(i, yValue, x1, y1 + (y2 - y1) / 2, segmentCount, median);
                                }
                            }

                            segmentCount++;
                        }
                    }
                }
                else
                {
                    ClearUnUsedSegments(this.DataCount);
                    ClearUnUsedAdornments(this.DataCount);
                    double     start       = sbsInfo.Start;
                    double     end         = sbsInfo.End;
                    List <int> SeriesCount = new List <int>();

                    foreach (ChartSeriesBase series in Area.Series)
                    {
                        SeriesCount.Add(series.DataCount);
                    }

                    for (int i = 0; i < this.DataCount; i++)
                    {
                        if (i < this.DataCount)
                        {
                            x1 = xValues[i] + start;
                            x2 = xValues[i] + end;
                            y1 = YValues[i];
                            y2 = origin; // Setting origin value for column segment

                            if (i < Segments.Count)
                            {
                                (Segments[i]).SetData(x1, y1, x2, y2);
                                (Segments[i] as ColumnSegment).XData = xValues[i];
                                (Segments[i] as ColumnSegment).YData = YValues[i];
                                (Segments[i] as ColumnSegment).Item  = ActualData[i];
                                if (SegmentColorPath != null && !Segments[i].IsEmptySegmentInterior && ColorValues.Count > 0 && !Segments[i].IsSelectedSegment)
                                {
                                    Segments[i].Interior = (Interior != null) ? Interior : ColorValues[i];
                                }
                            }
                            else
                            {
                                Segments.Add(new ColumnSegment(x1, y1, x2, y2, this)
                                {
                                    XData = xValues[i], YData = YValues[i], Item = ActualData[i]
                                });
                            }

                            if (AdornmentsInfo != null)
                            {
                                if (this.AdornmentsInfo.AdornmentsPosition == AdornmentsPosition.Top)
                                {
                                    AddColumnAdornments(xValues[i], YValues[i], x1, y1, i, median);
                                }
                                else if (this.AdornmentsInfo.AdornmentsPosition == AdornmentsPosition.Bottom)
                                {
                                    AddColumnAdornments(xValues[i], YValues[i], x1, y2, i, median);
                                }
                                else
                                {
                                    AddColumnAdornments(xValues[i], YValues[i], x1, y1 + (y2 - y1) / 2, i, median);
                                }
                            }
                        }
                    }

                    if (ShowEmptyPoints)
                    {
                        UpdateEmptyPointSegments(xValues, true);
                    }
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// Creates the segments of ColumnSeries.
        /// </summary>
        public override void CreateSegments()
        {
            List <double> xValues    = null;
            bool          isGrouping = this.ActualXAxis is CategoryAxis3D && !(this.ActualXAxis as CategoryAxis3D).IsIndexed;

            if (isGrouping)
            {
                xValues = this.GroupedXValuesIndexes;
            }
            else
            {
                xValues = this.GetXValues();
            }

            var    zValues = GetZValues();
            var    isZAxis = zValues != null && zValues.Count > 0;
            double median;

            if (xValues == null)
            {
                return;
            }

            var         area3D    = this.ActualArea as SfChart3D;
            var         depthInfo = GetSegmentDepth(isZAxis ? area3D.ActualDepth : area3D.Depth);
            var         sbsInfo   = GetSideBySideInfo(this);
            DoubleRange zsbsInfo  = DoubleRange.Empty;

            if (isZAxis)
            {
                zsbsInfo = this.GetZSideBySideInfo(this);
            }

            median = sbsInfo.Delta / 2;
            double z1, z2;
            double start        = depthInfo.Start;
            double end          = depthInfo.End;
            int    segmentCount = 0;

            if (isGrouping && this.GroupedSeriesYValues[0] != null && GroupedSeriesYValues[0].Count > 0)
            {
                Segments.Clear();
                Adornments.Clear();
                GroupedActualData.Clear();
                for (int i = 0; i < DistinctValuesIndexes.Count; i++)
                {
                    var list = (from index in DistinctValuesIndexes[i]
                                select new List <double> {
                        GroupedSeriesYValues[0][index], index
                    }).ToList();
                    double startValue = isZAxis ? zsbsInfo.Start : depthInfo.Start;

                    var divider      = zsbsInfo.Delta / list.Count;
                    var segmentWidth = divider * 0.75;
                    var segmentSpace = divider * 0.25;

                    for (int j = 0; j < list.Count; j++)
                    {
                        var yValue      = list[j][0];
                        var x1          = i + sbsInfo.Start;
                        var x2          = i + sbsInfo.End;
                        var y1          = yValue;
                        var y2          = ActualXAxis != null ? ActualXAxis.Origin : 0;
                        var actualStart = 0d;
                        var actualEnd   = 0d;

                        GroupedActualData.Add(this.ActualData[(int)list[j][1]]);
                        if (list.Count > 1)
                        {
                            if (isZAxis)
                            {
                                start      = startValue;
                                end        = start + segmentWidth;
                                startValue = end + segmentSpace;

                                actualStart = start;
                                actualEnd   = end;

                                start = zValues[i] + start;
                                end   = zValues[i] + end;
                            }
                            else
                            {
                                var count = list.Count;
                                var space = depthInfo.End / ((count * 2) + count + 1);
                                start      = startValue + space;
                                end        = start + depthInfo.End / (count * 2);
                                startValue = end;
                            }
                        }
                        else
                        {
                            if (isZAxis)
                            {
                                actualStart = zsbsInfo.Start;
                                actualEnd   = zsbsInfo.End;

                                start = zValues[i] + zsbsInfo.Start;
                                end   = zValues[i] + zsbsInfo.End;
                            }
                            else
                            {
                                start = depthInfo.Start;
                                end   = depthInfo.End;
                            }
                        }

                        Segments.Add(new ColumnSegment3D(x1, y1, x2, y2, start, end, this)
                        {
                            XData = xValues[j],
                            YData = yValue,
                            Item  = GroupedActualData[segmentCount]
                        });

                        if (this.AdornmentsInfo == null)
                        {
                            continue;
                        }

                        double xAdornmentPosition = 0d;
                        double zAdornmentPosition = 0d;

                        xAdornmentPosition = this.GetXAdornmentAnglePosition(i, sbsInfo);
                        if (isZAxis)
                        {
                            zAdornmentPosition = this.GetZAdornmentAnglePosition(zValues[i], new DoubleRange(actualStart, actualEnd));
                        }
                        else
                        {
                            zAdornmentPosition = this.GetZAdornmentAnglePosition(start, end);
                        }

                        switch (AdornmentsInfo.AdornmentsPosition)
                        {
                        case AdornmentsPosition.Top:
                            this.AddColumnAdornments(i, yValue, xAdornmentPosition, y1, segmentCount, median, zAdornmentPosition);
                            break;

                        case AdornmentsPosition.Bottom:
                            this.AddColumnAdornments(i, yValue, xAdornmentPosition, y2, segmentCount, median, zAdornmentPosition);
                            break;

                        default:
                            this.AddColumnAdornments(i, yValue, xAdornmentPosition, y1 + (y2 - y1) / 2, segmentCount, median, zAdornmentPosition);
                            break;
                        }

                        segmentCount++;
                    }
                }
            }
            else
            {
                this.ClearUnUsedSegments(this.DataCount);
                this.ClearUnUsedAdornments(this.DataCount);
                for (var i = 0; i < this.DataCount; i++)
                {
                    if (i >= this.DataCount)
                    {
                        continue;
                    }

                    var x1 = xValues[i] + sbsInfo.Start;
                    var x2 = xValues[i] + sbsInfo.End;
                    var y1 = YValues[i];
                    var y2 = ActualXAxis != null ? ActualXAxis.Origin : 0;

                    if (isZAxis)
                    {
                        z1 = zValues[i] + zsbsInfo.Start;
                        z2 = zValues[i] + zsbsInfo.End;
                    }
                    else
                    {
                        z1 = depthInfo.Start;
                        z2 = depthInfo.End;
                    }

                    if (i < Segments.Count)
                    {
                        (Segments[i]).SetData(x1, y1, x2, y2, z1, z2);
                        ((ColumnSegment3D)Segments[i]).YData = this.YValues[i];
                        ((ColumnSegment3D)Segments[i]).Plans = null;
                        ((ColumnSegment3D)Segments[i]).XData = xValues[i];
                        if (isZAxis)
                        {
                            ((ColumnSegment3D)Segments[i]).ZData = zValues[i];
                        }

                        ((ColumnSegment3D)Segments[i]).Item = this.ActualData[i];
                    }
                    else
                    {
                        Segments.Add(new ColumnSegment3D(x1, y1, x2, y2, z1, z2, this)
                        {
                            XData = xValues[i],
                            YData = YValues[i],
                            ZData = isZAxis ? zValues[i] : 0,
                            Item  = ActualData[i]
                        });
                    }

                    if (this.AdornmentsInfo == null)
                    {
                        continue;
                    }

                    double xAdornmentPosition = 0d;
                    double zAdornmentPosition = 0d;

                    xAdornmentPosition = this.GetXAdornmentAnglePosition(xValues[i], sbsInfo);
                    if (isZAxis)
                    {
                        zAdornmentPosition = this.GetZAdornmentAnglePosition(zValues[i], zsbsInfo);
                    }
                    else
                    {
                        zAdornmentPosition = this.GetZAdornmentAnglePosition(start, end);
                    }

                    switch (AdornmentsInfo.AdornmentsPosition)
                    {
                    case AdornmentsPosition.Top:
                        this.AddColumnAdornments(xValues[i], this.YValues[i], xAdornmentPosition, y1, i, median, zAdornmentPosition);
                        break;

                    case AdornmentsPosition.Bottom:
                        this.AddColumnAdornments(xValues[i], this.YValues[i], xAdornmentPosition, y2, i, median, zAdornmentPosition);
                        break;

                    default:
                        this.AddColumnAdornments(xValues[i], this.YValues[i], xAdornmentPosition, y1 + (y2 - y1) / 2, i, median, zAdornmentPosition);
                        break;
                    }
                }
            }

            if (this.ShowEmptyPoints)
            {
                this.UpdateEmptyPointSegments(xValues, true);
            }
        }