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 colorQueue = new Queue(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 SeriesSelectAllCommand { get; private set; } public DelegateCommand SeriesSelectNoneCommand { get; private set; } public DelegateCommand SeriesSelectDefaultCommand { get; private set; } public ObservableCollection 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(OnSeriesSelectAll, null); SeriesSelectNoneCommand = new DelegateCommand(OnSeriesSelectNone, null); SeriesSelectDefaultCommand = new DelegateCommand(OnSeriesSelectDefault, null); RenderableSeries = new ObservableCollection(); _capacity = capacity; } public void SetInfo(string info) { ProcessInfo = info; InvokePropertyChanged("ProcessInfo"); } public void AppendData(Dictionary data) { if (data == null) { return; } foreach (IRenderableSeries item in RenderableSeries) { if (item is SmartDataLine smartDataLine && data.ContainsKey(smartDataLine.DbDataName)) { XyDataSeries val = smartDataLine.DataSeries as XyDataSeries; while (val.Count > _capacity) { val.RemoveAt(0); } val.Append(DateTime.Now, (float)Convert.ToDouble(data[smartDataLine.DbDataName])); } } } public void UpdateCultureString(Dictionary 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 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 val = smartDataLine.DataSeries as XyDataSeries; 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 val = smartDataLine.DataSeries as XyDataSeries; val.Clear(); } } } public void UpdateColumns(Dictionary> dicItems) { List list = new List(); 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> dicItem in dicItems) { ObservableCollection 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 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 items) { ClearData(); RenderableSeries.Clear(); foreach (KeyValuePair item in items) { ObservableCollection 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; } } } } }