private static void SetUpYAxis(BasicChart d) { var MyClass = (BasicChart)d; // Only calcualte the min and max values if AutoScale is true if (MyClass.AutoScale) { double TempYMax, TempYMin; TempYMax = double.MinValue; TempYMin = double.MaxValue; if (MyClass.ItemsSource == null) { return; } foreach (var ClassItem in MyClass.ItemsSource) { IEnumerable MyCollectionItem = (IEnumerable)GetPropValue(ClassItem, MyClass.DataCollectionName); foreach (var item in MyCollectionItem) { double value = (double)GetPropValue(item, MyClass.DisplayMemberValues); if (value < TempYMin) { TempYMin = value; } if (value > TempYMax) { TempYMax = value; } } } MyClass.YMax = TempYMax + (TempYMax - TempYMin) * 0.05d; MyClass.YMin = TempYMin - (TempYMax - TempYMin) * 0.05d; } MyClass.YItems = new ObservableCollection <YAxisLabels>(); double deltaY = (MyClass.YMax - MyClass.YMin) / (MyClass.NumberOfYSteps); for (int j = 0; j <= MyClass.NumberOfYSteps; j++) { var YLabelObject = new YAxisLabels(); YLabelObject.YLabel = (MyClass.YMin + (double)j * deltaY).ToString(MyClass.DoubleToString); YLabelObject.YLocation = ((double)j) * (double)MyClass.PlotHeight / (double)MyClass.NumberOfYSteps; MyClass.YItems.Add(YLabelObject); } }
private static void SetUpGraph(BasicChart sender, IEnumerable ItemsSource) { List <PointCollection> ListOfChartCurves = new List <PointCollection>(); List <double> origianlValues = new List <double>(); if (ItemsSource == null) { return; } //Loop trough all the sources foreach (var ClassItem in ItemsSource) { PointCollection PointsOnChart = new PointCollection(); int X = 0; // Get the Collection of dataitems from the current source IEnumerable MyCollectionItem = (IEnumerable)GetPropValue(ClassItem, sender.DataCollectionName); // For all the chart points, get the relevant Y values foreach (var item in MyCollectionItem) { var YValues = GetPropValue(item, sender.DisplayMemberValues); // No X value filters are applied if (sender.XMin == sender.XMax) { if (YValues is double) { origianlValues.Add((double)YValues); if (double.IsInfinity((double)YValues) || double.IsNaN((double)YValues) || double.IsNegativeInfinity((double)YValues) || double.IsPositiveInfinity((double)YValues)) { PointsOnChart.Add(new Point(0, double.NaN)); } else { double YValue = ((double)YValues - sender.YMin) / (sender.YMax - sender.YMin) * sender.PlotHeight; PointsOnChart.Add(new Point(0, YValue)); } } } else if (sender.XMin <= X && X <= sender.XMax) { if (YValues is double) { origianlValues.Add((double)YValues); if (double.IsInfinity((double)YValues) || double.IsNaN((double)YValues) || double.IsNegativeInfinity((double)YValues) || double.IsPositiveInfinity((double)YValues)) { PointsOnChart.Add(new Point(0, double.NaN)); } else { double YValue = ((double)YValues - sender.YMin) / (sender.YMax - sender.YMin) * sender.PlotHeight; PointsOnChart.Add(new Point(0, YValue)); } } } X++; } ListOfChartCurves.Add(PointsOnChart); } ObservableCollection <FrameworkElement> items = new ObservableCollection <FrameworkElement>(); for (int k = 0; k < ListOfChartCurves.Count; k++) { for (int i = 0; i < ListOfChartCurves[k].Count; i++) { double pos = (double)i * sender.PlotWidth / (double)ListOfChartCurves[k].Count; ListOfChartCurves[k][i] = new Point(pos, ListOfChartCurves[k][i].Y); if (sender.ShowGraphPoints && sender.CurveVisibility[k].IsChecked) { Ellipse CurvePoint = new Ellipse(); CurvePoint.Width = 10; CurvePoint.Height = 10; CurvePoint.Fill = DistinctColorList[k]; CurvePoint.ToolTip = origianlValues[i].ToString(); Canvas.SetLeft(CurvePoint, ListOfChartCurves[k][i].X - 5); Canvas.SetTop(CurvePoint, ListOfChartCurves[k][i].Y - 5); items.Add(CurvePoint); } } } for (int k = 0; k < ListOfChartCurves.Count; k++) { if (sender.CurveVisibility[k].IsChecked) { PointCollection PointsOnChart = ListOfChartCurves[k]; List <PointCollection> MyLines = new List <PointCollection>(); PointCollection CurrentCollection = new PointCollection(); // Create lines even if points are disjoint/missing for (int i = 0; i < PointsOnChart.Count; i++) { // Current point is mission if (double.IsNaN(PointsOnChart[i].Y)) { // Any values that should be stored in previous points? if (CurrentCollection.Count != 0) { MyLines.Add(CurrentCollection.Clone()); } // Create a new line to store any new valid points found CurrentCollection = new PointCollection(); } else { // It's a valid point, add it to the current pointcollection CurrentCollection.Add(PointsOnChart[i]); } } // Add the last pontcollection, if it has any points in it. if (CurrentCollection.Count != 0) { MyLines.Add(CurrentCollection.Clone()); } //Draw all the lines found in the curve foreach (PointCollection item in MyLines) { Polyline Curve = new Polyline(); if (sender.SmoothCurve) { Curve.Points = CatmullRomSpline(item, 0.01); } else { Curve.Points = item; } Curve.StrokeThickness = 2; Curve.Stroke = DistinctColorList[k]; items.Add(Curve); } } } sender.PlotArea.ItemsSource = items; }
private static void OnCurveVisibilityChanged(BasicChart sender, IEnumerable NewValues) { SetUpGraph(sender, NewValues); }
private static void SetUpXAxis(BasicChart d) { ObservableCollection <XAxisLabels> Xitems = new ObservableCollection <XAxisLabels>(); var MyBasicChart = (BasicChart)d; if (MyBasicChart.ItemsSource == null) { return; } int count = 0; foreach (var item in MyBasicChart.ItemsSource) { count += 1; } if (count == 0) { return; } IEnumerable MyItemsSource = MyBasicChart.ItemsSource; var GetItemsSourceEnumerator = MyItemsSource.GetEnumerator(); GetItemsSourceEnumerator.MoveNext(); var FirstItemsSource = GetItemsSourceEnumerator.Current; IEnumerable test2 = (IEnumerable)GetPropValue(FirstItemsSource, MyBasicChart.DataCollectionName); int ItemsNumber = 0; foreach (var item in test2) { var Xlables = GetPropValue(item, MyBasicChart.DisplayMemberLabels); if (MyBasicChart.XMin == MyBasicChart.XMax) { // Set up the X labels var XLabelObject = new XAxisLabels(); if ((MyBasicChart.StartSkipAt <= ItemsNumber) && (ItemsNumber - MyBasicChart.StartSkipAt) % MyBasicChart.SkipLabels == 0) { XLabelObject.XLabel = Xlables.ToString(); } Xitems.Add(XLabelObject); } else { if (MyBasicChart.XMin <= ItemsNumber && ItemsNumber <= MyBasicChart.XMax) { // Set up the X labels var XLabelObject = new XAxisLabels(); if ((MyBasicChart.StartSkipAt <= ItemsNumber) && (ItemsNumber - MyBasicChart.StartSkipAt) % MyBasicChart.SkipLabels == 0) { XLabelObject.XLabel = Xlables.ToString(); } Xitems.Add(XLabelObject); } } ItemsNumber++; } for (int i = 0; i < Xitems.Count; i++) { double pos = (double)i * (double)MyBasicChart.PlotWidth / (double)Xitems.Count; Xitems[i].LabelAngle = 45; Xitems[i].XLocation = pos; } MyBasicChart.XAxis.ItemsSource = Xitems; }