Add series to graph
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user