using OxyPlot;
using OxyPlot.Wpf;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Tango.BL.Entities;
using Tango.BL.Enumerations;
using Tango.Core;
using Tango.MachineStudio.ThreadExtensions.ViewModels;
namespace Tango.MachineStudio.ThreadExtensions.Models
{
public class PlotProperties : ExtendedObject
{
public Plot PlotControl { get; set; }
private IList<DataPoint> _points;
private FactorColors _color;
public FactorColors Color
{
get { return _color; }
set { _color = value; }
}
/// <summary>
/// Binding to ItemsSource of line chart.
/// </summary>
public IList<DataPoint> Points
{
get { return _points; }
set
{
_points = value;
RaisePropertyChangedAuto();
}
}
private IList<DataPoint> _target100Points;
/// <summary>
/// Binding to ItemsSource of line chart.
/// </summary>
public IList<DataPoint> Target100Points
{
get { return _target100Points; }
set
{
_target100Points = value;
RaisePropertyChangedAuto();
}
}
private IList<DataPoint> _target200Points;
/// <summary>
/// Binding to ItemsSource of line chart.
/// </summary>
public IList<DataPoint> Target200Points
{
get { return _target200Points; }
set
{
_target200Points = value;
RaisePropertyChangedAuto();
}
}
private int _step;
public int XStep
{
get { return _step; }
set { _step = value; RaisePropertyChangedAuto(); }
}
private double _from;
/// <summary>
/// From use to binding to bottom axis min value
/// </summary>
public double From
{
get { return _from; }
set
{
_from = value; RaisePropertyChangedAuto();
}
}
private double _to;
/// <summary>
/// To use to binding to bottom axis max value
/// </summary>
public double To
{
get { return _to; }
set
{
_to = value; RaisePropertyChangedAuto();
}
}
public PlotProperties(FactorColors color)
{
this.Points = new List<DataPoint>();
Target100Points = new List<DataPoint>();
Target200Points = new List<DataPoint>();
Color = color;
}
public void ClearResults()
{
Points.Clear();
Target100Points.Clear();
Target200Points.Clear();
}
public void CreateGraph(List<ColorProcessData> points, bool isLtype)
{
if (PlotControl == null)
{
Debug.WriteLine("ERROR!!! CreateGraph. Plot Control is NULL.");
return;
}
ClearResults();
PlotControl.InvalidatePlot(true);
double target100Y = FactorTarget.GetFactor100(Color);
double target200Y = FactorTarget.GetFactor200(Color);
_to = target100Y > target200Y? target100Y + 10: target200Y + 10;
_from = target100Y < target200Y ? target100Y - 10 : target200Y - 10;
foreach ( var x in points)
{
var point = new DataPoint(x.InkNlCm, isLtype ? x.L : x.B);
Points.Add(point);
_to = _to > point.Y ? _to : point.Y;
_from = ( _from == 0 || _from > point.Y ) ? point.Y : _from;
}
if (points.Count > 1)
{
var minInkNlCm = points.Min(n => n.InkNlCm);
var maxInkNlCm = points.Max(n => n.InkNlCm);
if(! Target100Points.Any(x => x.X == minInkNlCm))
{
Target100Points.Add(new DataPoint(minInkNlCm, target100Y));
Target200Points.Add(new DataPoint(minInkNlCm, target200Y));
}
if (!Target100Points.Any(x => x.X == maxInkNlCm))
{
Target100Points.Add(new DataPoint(maxInkNlCm, target100Y));
Target200Points.Add(new DataPoint(maxInkNlCm, target200Y));
}
}
Debug.WriteLine($"CreateGraph. Count Points {points.Count}");
if (_to == 0)
_to = isLtype ? 100 : 128;
if (_from == 0)
_from = isLtype ? 0 : -127;
RaisePropertyChanged("To");
RaisePropertyChanged("From");
XStep = (int)(Points.Count / 6);
PlotControl.InvalidatePlot(true);
}
}
}