Add series to graph

This commit is contained in:
Evgeny Redikultsev
2023-12-23 22:40:42 +05:00
parent a19333f7df
commit 0a6d29bcfc
38 changed files with 762 additions and 233 deletions

View File

@@ -17,6 +17,9 @@ using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
//Copyright (c) 2023 Redikultsev Evgeny, Ekaterinburg, Russia
//All rights reserved.
namespace StructureHelper.Windows.Graphs
{
public class GraphViewModel : ViewModelBase
@@ -28,9 +31,8 @@ namespace StructureHelper.Windows.Graphs
}
IArrayParameter<double> arrayParameter;
List<IValueParameter<double>> valueParameters;
Dictionary<IValueParameter<double>, double[]> valueList;
List<IArrayParameter<double>> arrayParameters;
private RelayCommand redrawLinesCommand;
private bool invertXValues;
private bool invertYValues;
@@ -39,6 +41,7 @@ namespace StructureHelper.Windows.Graphs
public SelectedItemViewModel<IValueParameter<double>> XItems { get; private set; }
public SelectItemsViewModel<IValueParameter<double>> YItems { get; set; }
public ObservableCollection<ColumnInfo> Columns { get; } = new ObservableCollection<ColumnInfo>();
public ObservableCollection<Series> Series { get;}
public bool InvertXValues
@@ -68,7 +71,7 @@ namespace StructureHelper.Windows.Graphs
public ICommand RedrawLinesCommand
{
get => redrawLinesCommand ??= new RelayCommand(o => DrawLines());
get => redrawLinesCommand ??= new RelayCommand(o => DrawSeries());
}
public ICommand SaveAsImage
@@ -102,47 +105,36 @@ namespace StructureHelper.Windows.Graphs
Clipboard.SetImage(bitmapImage);
}
public GraphViewModel(IArrayParameter<double> arrayParameter)
public GraphViewModel(IArrayParameter<double> arrayParameter) : this (new List<IArrayParameter<double>>() { arrayParameter})
{
this.arrayParameter = arrayParameter;
valueParameters = GetParameters();
XItems = new SelectedItemViewModel<IValueParameter<double>>(valueParameters);
YItems = new SelectItemsViewModel<IValueParameter<double>>(valueParameters);
YItems.ShowButtons = true;
XItems.SelectedItem = XItems.Collection[0];
YItems.UnSelectAllCommand.Execute(null);
}
public GraphViewModel(IEnumerable<IArrayParameter<double>> arrayParameters)
{
this.arrayParameters = arrayParameters.ToList();
Series = new();
foreach (var item in this.arrayParameters)
{
Series.Add(new Series(item));
}
VisualProps = new();
}
private List<IValueParameter<double>> GetParameters()
public GraphViewModel(IEnumerable<Series> series)
{
valueList = new Dictionary<IValueParameter<double>, double[]>();
var items = new List<IValueParameter<double>>();
var data = arrayParameter.Data;
int columnCount = data.GetLength(1);
for (int i = 0; i < columnCount; i++)
Series = new();
foreach (var item in series)
{
var item = new ValueParameter<double>()
{
Name = arrayParameter.ColumnLabels[i],
Color = ColorProcessor.GetRandomColor(),
};
items.Add(item);
int rowCount = data.GetLength(0);
var values = new double[rowCount];
for (int j = 0; j < rowCount; j++)
{
values[j] = data[j, i];
}
valueList.Add(item, values);
Series.Add(item);
}
return items;
VisualProps = new();
}
private void DrawLines()
private void DrawSeries()
{
if (XItems.SelectedItem is null || YItems.SelectedCount == 0) return;
SetLines();
OnPropertyChanged(nameof(SeriesCollection));
OnPropertyChanged(nameof(Labels));
@@ -150,47 +142,15 @@ namespace StructureHelper.Windows.Graphs
private void SetLines()
{
var xParameter = XItems.SelectedItem;
var yParameters = YItems.SelectedItems;
var xFactor = invertXValues ? -1d : 1d;
var yFactor = invertYValues ? -1d : 1d;
var labels = new List<double>();
SeriesCollection = new SeriesCollection();
foreach (var yParameter in yParameters)
Labels = new();
foreach (var series in Series)
{
var localLabels = new List<double>();
var lineSeries = new LineSeries()
{
Configuration = new CartesianMapper<IPoint2D>()
.X(point => point.X)
.Y(point => point.Y),
Title = yParameter.Name,
};
GraphService.SetVisualProps(lineSeries, VisualProps, yParameter.Color);
_ = valueList.TryGetValue(xParameter, out double[] xValues);
_ = valueList.TryGetValue(yParameter, out double[] yValues);
var chartValues = new ChartValues<Point2D>();
for (int i = 0; i < yValues.Count(); i++)
{
double diagramValue = yValues[i] * yFactor;
var x = xValues[i] * xFactor;
var y = yValues[i] * yFactor;
var point = new Point2D() { X = x, Y = y };
chartValues.Add(point);
labels.Add(x);
localLabels.Add(x);
}
lineSeries.Values = chartValues;
//lineSeries.LabelPoint = point => localLabels[(int)point.X].ToString();
SeriesCollection.Add(lineSeries);
series.VisualProps = VisualProps;
series.RefreshSeries();
SeriesCollection.AddRange(series.SeriesCollection);
Labels.AddRange(series.Labels);
}
Labels = labels
.OrderBy(x => x)
.Distinct()
.Select(x => x.ToString())
.ToList();
}
}
}