private static void FillPointAndFigureData(Series series, Series originalData) { int num = 0; if (series.IsAttributeSet("UsedYValueHigh")) { try { num = int.Parse(((DataPointAttributes)series)["UsedYValueHigh"], CultureInfo.InvariantCulture); } catch { throw new InvalidOperationException(SR.ExceptionPointAndFigureUsedYValueHighInvalidFormat); } if (num >= series.YValuesPerPoint) { throw new InvalidOperationException(SR.ExceptionPointAndFigureUsedYValueHighOutOfRange); } } int num2 = 1; if (series.IsAttributeSet("UsedYValueLow")) { try { num2 = int.Parse(((DataPointAttributes)series)["UsedYValueLow"], CultureInfo.InvariantCulture); } catch { throw new InvalidOperationException(SR.ExceptionPointAndFigureUsedYValueLowInvalidFormat); } if (num2 >= series.YValuesPerPoint) { throw new InvalidOperationException(SR.ExceptionPointAndFigureUsedYValueLowOutOfrange); } } Color color = ChartGraphics.GetGradientColor(series.Color, Color.Black, 0.5); string text = ((DataPointAttributes)series)["PriceUpColor"]; if (text != null) { try { ColorConverter colorConverter = new ColorConverter(); color = (Color)colorConverter.ConvertFromString(null, CultureInfo.InvariantCulture, text); } catch { throw new InvalidOperationException(SR.ExceptionPointAndFigureUpBrickColorInvalidFormat); } } double minPrice = default(double); double maxPrice = default(double); PointAndFigureChart.GetPriceRange(originalData, num, num2, out minPrice, out maxPrice); double boxSize = PointAndFigureChart.GetBoxSize(series, originalData, num, num2, minPrice, maxPrice); double reversalAmount = PointAndFigureChart.GetReversalAmount(series, originalData, num, num2, minPrice, maxPrice); double num3 = double.NaN; double num4 = double.NaN; int num5 = 0; int num6 = 0; foreach (DataPoint point in originalData.Points) { if (!point.Empty) { bool flag = false; int num7 = 0; if (double.IsNaN(num3)) { num3 = point.YValues[num]; num4 = point.YValues[num2]; num6++; continue; } int num8 = 0; if (num5 == 1 || num5 == 0) { if (point.YValues[num] >= num3 + boxSize) { num8 = 1; num7 = (int)Math.Floor((point.YValues[num] - num3) / boxSize); } else if (point.YValues[num2] <= num3 - boxSize * reversalAmount) { num8 = -1; num7 = (int)Math.Floor((num3 - point.YValues[num2]) / boxSize); } else if (point.YValues[num] <= num4 - boxSize) { flag = true; num7 = (int)Math.Floor((num4 - point.YValues[num]) / boxSize); if (series.Points.Count > 0) { series.Points[series.Points.Count - 1].YValues[0] -= (double)num7 * boxSize; } num4 -= (double)num7 * boxSize; } } if (num8 == 0 && (num5 == -1 || num5 == 0)) { if (point.YValues[num2] <= num4 - boxSize) { num8 = -1; num7 = (int)Math.Floor((num4 - point.YValues[num2]) / boxSize); } else if (point.YValues[num] >= num4 + boxSize * reversalAmount) { num8 = 1; num7 = (int)Math.Floor((point.YValues[num] - num4) / boxSize); } else if (point.YValues[num2] >= num3 + boxSize) { flag = true; num7 = (int)Math.Floor((num3 - point.YValues[num2]) / boxSize); if (series.Points.Count > 0) { series.Points[series.Points.Count - 1].YValues[1] += (double)num7 * boxSize; } num3 += (double)num7 * boxSize; } } if (num8 != 0 && !flag) { if (num8 == num5) { if (num8 == 1) { series.Points[series.Points.Count - 1].YValues[1] += (double)num7 * boxSize; num3 += (double)num7 * boxSize; ((DataPointAttributes)series.Points[series.Points.Count - 1])["OriginalPointIndex"] = num6.ToString(CultureInfo.InvariantCulture); } else { series.Points[series.Points.Count - 1].YValues[0] -= (double)num7 * boxSize; num4 -= (double)num7 * boxSize; ((DataPointAttributes)series.Points[series.Points.Count - 1])["OriginalPointIndex"] = num6.ToString(CultureInfo.InvariantCulture); } } else { DataPoint dataPoint2 = point.Clone(); ((DataPointAttributes)dataPoint2)["OriginalPointIndex"] = num6.ToString(CultureInfo.InvariantCulture); dataPoint2.series = series; dataPoint2.XValue = point.XValue; if (num8 == 1) { dataPoint2.Color = color; ((DataPointAttributes)dataPoint2)["PriceUpPoint"] = "true"; dataPoint2.YValues[0] = num4 + ((num5 != 0) ? boxSize : 0.0); dataPoint2.YValues[1] = dataPoint2.YValues[0] + (double)num7 * boxSize - ((num5 != 0) ? boxSize : 0.0); } else { dataPoint2.YValues[1] = num3 - ((num5 != 0) ? boxSize : 0.0); dataPoint2.YValues[0] = dataPoint2.YValues[1] - (double)num7 * boxSize; } num3 = dataPoint2.YValues[1]; num4 = dataPoint2.YValues[0]; series.Points.Add(dataPoint2); } num5 = num8; } } num6++; } }
public static void PrepareData(Series series, IServiceContainer serviceContainer) { if (string.Compare(series.ChartTypeName, "PointAndFigure", StringComparison.OrdinalIgnoreCase) == 0 && series.IsVisible()) { Chart chart = (Chart)serviceContainer.GetService(typeof(Chart)); if (chart == null) { throw new InvalidOperationException(SR.ExceptionPointAndFigureNullReference); } ChartArea chartArea = chart.ChartAreas[series.ChartArea]; foreach (Series item in chart.Series) { if (item.IsVisible() && item != series && chartArea == chart.ChartAreas[item.ChartArea]) { throw new InvalidOperationException(SR.ExceptionPointAndFigureCanNotCombine); } } if (!PointAndFigureChart.customizeSubscribed) { PointAndFigureChart.customizeSubscribed = true; chart.Customize += PointAndFigureChart.OnCustomize; } string name = "POINTANDFIGURE_ORIGINAL_DATA_" + series.Name; if (chart.Series.GetIndex(name) == -1) { Series series3 = new Series(name, series.YValuesPerPoint); series3.Enabled = false; series3.ShowInLegend = false; series3.YValuesPerPoint = series.YValuesPerPoint; chart.Series.Add(series3); foreach (DataPoint point in series.Points) { series3.Points.Add(point); } series.Points.Clear(); if (series.IsAttributeSet("TempDesignData")) { ((DataPointAttributes)series3)["TempDesignData"] = "true"; } ((DataPointAttributes)series)["OldXValueIndexed"] = series.XValueIndexed.ToString(CultureInfo.InvariantCulture); ((DataPointAttributes)series)["OldYValuesPerPoint"] = series.YValuesPerPoint.ToString(CultureInfo.InvariantCulture); series.XValueIndexed = true; if (series.ChartArea.Length > 0 && series.IsXValueDateTime()) { Axis axis = chartArea.GetAxis(AxisName.X, series.XAxisType, series.XSubAxisName); if (axis.Interval == 0.0 && axis.IntervalType == DateTimeIntervalType.Auto) { bool flag = false; double num = 1.7976931348623157E+308; double num2 = -1.7976931348623157E+308; foreach (DataPoint point2 in series3.Points) { if (!point2.Empty) { if (point2.XValue != 0.0) { flag = true; } if (point2.XValue > num2) { num2 = point2.XValue; } if (point2.XValue < num) { num = point2.XValue; } } } if (flag) { ((DataPointAttributes)series)["OldAutomaticXAxisInterval"] = "true"; DateTimeIntervalType intervalType = DateTimeIntervalType.Auto; axis.interval = ((AxisScale)axis).CalcInterval(num, num2, true, out intervalType, series.XValueType); axis.intervalType = intervalType; } } } PointAndFigureChart.FillPointAndFigureData(series, series3); } } }