/// <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); } } } } } } }
/// <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); } } } }
/// <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); } }