Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/Aitex/Core/UI/ControlDataContext/ProcessDataChartDataItem.cs

363 lines
10 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Media;
using Aitex.Core.UI.MVVM;
using Aitex.Core.UI.View.Smart;
using SciChart.Charting.Model.DataSeries;
using SciChart.Charting.Visuals.RenderableSeries;
namespace Aitex.Core.UI.ControlDataContext
{
public class ProcessDataChartDataItem : INotifyPropertyChanged
{
private int _capacity = 10000;
private Queue<System.Drawing.Color> colorQueue = new Queue<System.Drawing.Color>(new System.Drawing.Color[80]
{
System.Drawing.Color.Aqua,
System.Drawing.Color.Aquamarine,
System.Drawing.Color.Bisque,
System.Drawing.Color.Blue,
System.Drawing.Color.Brown,
System.Drawing.Color.BurlyWood,
System.Drawing.Color.CadetBlue,
System.Drawing.Color.CornflowerBlue,
System.Drawing.Color.DarkBlue,
System.Drawing.Color.DarkCyan,
System.Drawing.Color.DarkGray,
System.Drawing.Color.DarkGreen,
System.Drawing.Color.DarkKhaki,
System.Drawing.Color.DarkMagenta,
System.Drawing.Color.DarkOliveGreen,
System.Drawing.Color.DarkOrange,
System.Drawing.Color.DarkSeaGreen,
System.Drawing.Color.DarkSlateBlue,
System.Drawing.Color.DarkSlateGray,
System.Drawing.Color.DarkViolet,
System.Drawing.Color.DeepPink,
System.Drawing.Color.DeepSkyBlue,
System.Drawing.Color.DimGray,
System.Drawing.Color.DodgerBlue,
System.Drawing.Color.ForestGreen,
System.Drawing.Color.Gold,
System.Drawing.Color.Gray,
System.Drawing.Color.Green,
System.Drawing.Color.GreenYellow,
System.Drawing.Color.HotPink,
System.Drawing.Color.Indigo,
System.Drawing.Color.Khaki,
System.Drawing.Color.LightBlue,
System.Drawing.Color.LightCoral,
System.Drawing.Color.LightGreen,
System.Drawing.Color.LightPink,
System.Drawing.Color.LightSalmon,
System.Drawing.Color.LightSkyBlue,
System.Drawing.Color.LightSlateGray,
System.Drawing.Color.LightSteelBlue,
System.Drawing.Color.LimeGreen,
System.Drawing.Color.MediumOrchid,
System.Drawing.Color.MediumPurple,
System.Drawing.Color.MediumSeaGreen,
System.Drawing.Color.MediumSlateBlue,
System.Drawing.Color.MediumSpringGreen,
System.Drawing.Color.MediumTurquoise,
System.Drawing.Color.Moccasin,
System.Drawing.Color.NavajoWhite,
System.Drawing.Color.Olive,
System.Drawing.Color.OliveDrab,
System.Drawing.Color.Orange,
System.Drawing.Color.OrangeRed,
System.Drawing.Color.Orchid,
System.Drawing.Color.PaleGoldenrod,
System.Drawing.Color.PaleGreen,
System.Drawing.Color.PeachPuff,
System.Drawing.Color.Peru,
System.Drawing.Color.Pink,
System.Drawing.Color.Plum,
System.Drawing.Color.PowderBlue,
System.Drawing.Color.Purple,
System.Drawing.Color.Red,
System.Drawing.Color.RosyBrown,
System.Drawing.Color.RoyalBlue,
System.Drawing.Color.SaddleBrown,
System.Drawing.Color.Salmon,
System.Drawing.Color.SeaGreen,
System.Drawing.Color.Sienna,
System.Drawing.Color.SkyBlue,
System.Drawing.Color.SlateBlue,
System.Drawing.Color.SlateGray,
System.Drawing.Color.SpringGreen,
System.Drawing.Color.Teal,
System.Drawing.Color.Tomato,
System.Drawing.Color.Turquoise,
System.Drawing.Color.Violet,
System.Drawing.Color.Wheat,
System.Drawing.Color.Yellow,
System.Drawing.Color.YellowGreen
});
public DelegateCommand<object> SeriesSelectAllCommand { get; private set; }
public DelegateCommand<object> SeriesSelectNoneCommand { get; private set; }
public DelegateCommand<object> SeriesSelectDefaultCommand { get; private set; }
public ObservableCollection<IRenderableSeries> RenderableSeries { get; set; }
public string ProcessInfo { get; set; }
public int Count => RenderableSeries.Count;
public event PropertyChangedEventHandler PropertyChanged;
public void InvokePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public ProcessDataChartDataItem(int capacity = 300)
{
SeriesSelectAllCommand = new DelegateCommand<object>(OnSeriesSelectAll, null);
SeriesSelectNoneCommand = new DelegateCommand<object>(OnSeriesSelectNone, null);
SeriesSelectDefaultCommand = new DelegateCommand<object>(OnSeriesSelectDefault, null);
RenderableSeries = new ObservableCollection<IRenderableSeries>();
_capacity = capacity;
}
public void SetInfo(string info)
{
ProcessInfo = info;
InvokePropertyChanged("ProcessInfo");
}
public void AppendData(Dictionary<string, object> data)
{
if (data == null)
{
return;
}
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine && data.ContainsKey(smartDataLine.DbDataName))
{
XyDataSeries<DateTime, float> val = smartDataLine.DataSeries as XyDataSeries<DateTime, float>;
while (val.Count > _capacity)
{
val.RemoveAt(0);
}
val.Append(DateTime.Now, (float)Convert.ToDouble(data[smartDataLine.DbDataName]));
}
}
}
public void UpdateCultureString(Dictionary<string, string> data)
{
if (data == null)
{
return;
}
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine && data.ContainsKey(smartDataLine.DbDataName))
{
smartDataLine.DisplayName = data[smartDataLine.DbDataName];
}
}
}
public void UpdateData(List<HistoryDataItem> data)
{
ClearData();
if (data == null || data.Count == 0)
{
return;
}
foreach (HistoryDataItem datum in data)
{
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine)
{
XyDataSeries<DateTime, float> val = smartDataLine.DataSeries as XyDataSeries<DateTime, float>;
while (val.Count > _capacity)
{
val.RemoveAt(0);
}
if (!(smartDataLine.DbDataName != datum.dbName))
{
val.Append(datum.dateTime, (float)datum.value);
}
}
}
}
}
public void ClearData()
{
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine)
{
XyDataSeries<DateTime, float> val = smartDataLine.DataSeries as XyDataSeries<DateTime, float>;
val.Clear();
}
}
}
public void UpdateColumns(Dictionary<string, Tuple<string, string, bool>> dicItems)
{
List<IRenderableSeries> list = new List<IRenderableSeries>();
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine)
{
if (!dicItems.ContainsKey(smartDataLine.DbDataName))
{
list.Add(item);
continue;
}
UpdateColumn(dicItems[smartDataLine.DbDataName]);
dicItems.Remove(smartDataLine.DbDataName);
}
}
foreach (KeyValuePair<string, Tuple<string, string, bool>> dicItem in dicItems)
{
ObservableCollection<IRenderableSeries> renderableSeries = RenderableSeries;
SmartDataLine smartDataLine2 = new SmartDataLine(dicItem.Value.Item2, dicItem.Value.Item3 ? Colors.Blue : Colors.Red, dicItem.Value.Item1, isVisable: true);
smartDataLine2.YAxisId = dicItem.Value.Item3 ? "PressureYAxisId" : "GeneralYAxisId";
renderableSeries.Add(smartDataLine2);
}
foreach (IRenderableSeries item2 in list)
{
RenderableSeries.Remove(item2);
}
}
public void UpdateColumn(Tuple<string, string, bool> columnInfo)
{
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine && smartDataLine.DbDataName == columnInfo.Item1)
{
smartDataLine.DisplayName = columnInfo.Item2;
if (smartDataLine.Stroke.Equals(System.Windows.Media.Color.FromArgb(byte.MaxValue, 0, 0, byte.MaxValue)))
{
System.Drawing.Color color = colorQueue.Peek();
smartDataLine.Stroke = System.Windows.Media.Color.FromRgb(color.R, color.G, color.B);
colorQueue.Enqueue(colorQueue.Dequeue());
}
smartDataLine.YAxisId = columnInfo.Item3 ? "PressureYAxisId" : "GeneralYAxisId";
break;
}
}
}
public void UpdateColumn(string dbName, string displayName, bool isPressure)
{
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine && smartDataLine.DbDataName == dbName)
{
smartDataLine.DisplayName = displayName;
break;
}
}
}
public void UpdateColumnDisplayName(string dbName, string displayName)
{
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine && smartDataLine.DbDataName == dbName)
{
smartDataLine.DisplayName = displayName;
break;
}
}
}
public void RemoveColumn(string dbName)
{
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine && smartDataLine.DbDataName == dbName)
{
RenderableSeries.Remove(smartDataLine);
break;
}
}
}
public void RemoveAllColumn()
{
ClearData();
RenderableSeries.Clear();
}
public void InitColumns(Dictionary<string, string> items)
{
ClearData();
RenderableSeries.Clear();
foreach (KeyValuePair<string, string> item in items)
{
ObservableCollection<IRenderableSeries> renderableSeries = RenderableSeries;
SmartDataLine smartDataLine = new SmartDataLine(item.Key, Colors.Blue, item.Value, isVisable: true);
smartDataLine.YAxisId = item.Key.Contains("Pressure") ? "PressureYAxisId" : "GeneralYAxisId";
renderableSeries.Add(smartDataLine);
}
}
public void SetColor(string key, System.Windows.Media.Color color)
{
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine && smartDataLine.DisplayName == key)
{
smartDataLine.Stroke = color;
}
}
}
public void OnSeriesSelectAll(object param)
{
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine)
{
smartDataLine.IsVisible = true;
}
}
}
public void OnSeriesSelectNone(object param)
{
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine)
{
smartDataLine.IsVisible = false;
}
}
}
public void OnSeriesSelectDefault(object param)
{
foreach (IRenderableSeries item in RenderableSeries)
{
if (item is SmartDataLine smartDataLine)
{
smartDataLine.IsVisible = smartDataLine.IsDefaultVisable;
smartDataLine.Stroke = smartDataLine.DefaultSeriesColor;
smartDataLine.LineThickness = 1.0;
}
}
}
}
}