public static void PrepareData(Series series, IServiceContainer serviceContainer) { if (string.Compare(series.ChartTypeName, "Kagi", StringComparison.OrdinalIgnoreCase) == 0 && series.IsVisible()) { Chart chart = (Chart)serviceContainer.GetService(typeof(Chart)); if (chart == null) { throw new InvalidOperationException(SR.ExceptionKagiNullReference); } 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.ExceptionKagiCanNotCombine); } } string name = "KAGI_ORIGINAL_DATA_" + series.Name; if (chart.Series.GetIndex(name) == -1) { Series series3 = new Series(name, series.YValuesPerPoint); series3.Enabled = false; series3.ShowInLegend = false; 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; } } } KagiChart.FillKagiData(series, series3); } } }
private static void FillKagiData(Series series, Series originalData) { int num = 0; if (series.IsAttributeSet("UsedYValue")) { try { num = int.Parse(((DataPointAttributes)series)["UsedYValue"], CultureInfo.InvariantCulture); } catch { throw new InvalidOperationException(SR.ExceptionKagiAttributeFormatInvalid("UsedYValue")); } if (num >= series.YValuesPerPoint) { throw new InvalidOperationException(SR.ExceptionKagiAttributeOutOfRange("UsedYValue")); } } double num2 = 0.0; double num3 = KagiChart.GetReversalAmount(series, originalData, num, out num2); double num4 = double.NaN; int num5 = 0; int num6 = 0; foreach (DataPoint point in originalData.Points) { if (double.IsNaN(num4)) { num4 = point.YValues[num]; DataPoint dataPoint2 = point.Clone(); dataPoint2.series = series; dataPoint2.XValue = point.XValue; dataPoint2.YValues[0] = point.YValues[num]; series.Points.Add(dataPoint2); num6++; } else { if (num2 != 0.0) { num3 = num4 / 100.0 * num2; } int num7 = 0; num7 = ((point.YValues[num] > num4) ? 1 : ((point.YValues[num] < num4) ? (-1) : 0)); if (num7 != 0) { if (num7 == num5) { series.Points[series.Points.Count - 1].YValues[0] = point.YValues[num]; ((DataPointAttributes)series.Points[series.Points.Count - 1])["OriginalPointIndex"] = num6.ToString(CultureInfo.InvariantCulture); } else { if (Math.Abs(point.YValues[num] - num4) < num3) { num6++; continue; } DataPoint dataPoint3 = point.Clone(); ((DataPointAttributes)dataPoint3)["OriginalPointIndex"] = num6.ToString(CultureInfo.InvariantCulture); dataPoint3.series = series; dataPoint3.XValue = point.XValue; dataPoint3.YValues[0] = point.YValues[num]; series.Points.Add(dataPoint3); } num4 = point.YValues[num]; num5 = num7; } num6++; } } }