private static void FillRenkoData(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.ExceptionRenkoUsedYValueFormatInvalid); } if (num >= series.YValuesPerPoint) { throw new InvalidOperationException(SR.ExceptionRenkoUsedYValueOutOfRange); } } double boxSize = RenkoChart.GetBoxSize(series, originalData, num); double num2 = double.NaN; double num3 = double.NaN; int num4 = 0; foreach (DataPoint point in originalData.Points) { if (!point.Empty) { int num5 = 0; bool flag = true; if (!double.IsNaN(num2) && !double.IsNaN(num3)) { Color color = Color.Transparent; string text = ((DataPointAttributes)point)["PriceUpColor"]; if (text == null) { 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.ExceptionRenkoUpBrickColorInvalid); } } if (point.YValues[num] >= num3 + boxSize) { flag = true; num5 = (int)Math.Floor((point.YValues[num] - num3) / boxSize); } else if (point.YValues[num] <= num2 - boxSize) { flag = false; num5 = (int)Math.Floor((num2 - point.YValues[num]) / boxSize); } while (num5 > 0) { DataPoint dataPoint2 = point.Clone(); ((DataPointAttributes)dataPoint2)["OriginalPointIndex"] = num4.ToString(CultureInfo.InvariantCulture); dataPoint2.series = series; dataPoint2.YValues = new double[2]; dataPoint2.XValue = point.XValue; if (flag) { dataPoint2.YValues[1] = num3; dataPoint2.YValues[0] = num3 + boxSize; num2 = num3; num3 = num2 + boxSize; dataPoint2.Color = color; if (dataPoint2.BorderWidth < 1) { dataPoint2.BorderWidth = 1; } if (dataPoint2.BorderStyle == ChartDashStyle.NotSet) { dataPoint2.BorderStyle = ChartDashStyle.Solid; } if ((dataPoint2.BorderColor == Color.Empty || dataPoint2.BorderColor == Color.Transparent) && (dataPoint2.Color == Color.Empty || dataPoint2.Color == Color.Transparent)) { dataPoint2.BorderColor = series.Color; } } else { dataPoint2.YValues[1] = num2; dataPoint2.YValues[0] = num2 - boxSize; num3 = num2; num2 = num3 - boxSize; } series.Points.Add(dataPoint2); num5--; } goto IL_029c; } num3 = point.YValues[num]; num2 = point.YValues[num]; num4++; continue; } goto IL_029c; IL_029c: num4++; } }
public static void PrepareData(Series series, IServiceContainer serviceContainer) { if (string.Compare(series.ChartTypeName, "Renko", StringComparison.OrdinalIgnoreCase) == 0 && series.IsVisible()) { Chart chart = (Chart)serviceContainer.GetService(typeof(Chart)); if (chart == null) { throw new InvalidOperationException(SR.ExceptionRenkoNullReference); } 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.ExceptionRenkoCanNotCobine); } } Series series3 = new Series("RENKO_ORIGINAL_DATA_" + 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.ChartType = SeriesChartType.RangeColumn; series.XValueIndexed = true; series.YValuesPerPoint = 2; 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; } } } RenkoChart.FillRenkoData(series, series3); } }