ProcessDataChartDataItem.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.ComponentModel;
  5. using System.Drawing;
  6. using System.Runtime.Serialization;
  7. using SciChart.Charting.Model.DataSeries;
  8. using SciChart.Charting.Visuals.RenderableSeries;
  9. using Aitex.Core.UI.MVVM;
  10. using Aitex.Core.UI.View.Smart;
  11. using SciChart.Data.Model;
  12. namespace Aitex.Core.UI.ControlDataContext
  13. {
  14. [DataContract]
  15. [Serializable]
  16. public class HistoryDataItem
  17. {
  18. [DataMember]
  19. public DateTime dateTime
  20. {
  21. get;
  22. set;
  23. }
  24. [DataMember]
  25. public string dbName
  26. {
  27. get;
  28. set;
  29. }
  30. [DataMember]
  31. public double value
  32. {
  33. get;
  34. set;
  35. }
  36. }
  37. public class ProcessDataChartDataItem : INotifyPropertyChanged
  38. {
  39. public event PropertyChangedEventHandler PropertyChanged;
  40. public void InvokePropertyChanged(string propertyName)
  41. {
  42. if (PropertyChanged != null)
  43. {
  44. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  45. }
  46. }
  47. public DelegateCommand<object> SeriesSelectAllCommand
  48. {
  49. get;
  50. private set;
  51. }
  52. public DelegateCommand<object> SeriesSelectNoneCommand
  53. {
  54. get;
  55. private set;
  56. }
  57. public DelegateCommand<object> SeriesSelectDefaultCommand
  58. {
  59. get;
  60. private set;
  61. }
  62. public ObservableCollection<IRenderableSeries> RenderableSeries
  63. {
  64. get;
  65. set;
  66. }
  67. public string ProcessInfo
  68. {
  69. get;
  70. set;
  71. }
  72. public int Count
  73. {
  74. get
  75. {
  76. return RenderableSeries.Count;
  77. }
  78. }
  79. private int _capacity = 10000;
  80. private Queue<Color> colorQueue = new Queue<Color>(new Color[]{Color.Aqua,Color.Aquamarine,Color.Bisque,Color.Blue,Color.Brown,Color.BurlyWood,Color.CadetBlue,
  81. Color.CornflowerBlue,Color.DarkBlue,Color.DarkCyan,Color.DarkGray,Color.DarkGreen,Color.DarkKhaki,Color.DarkMagenta,Color.DarkOliveGreen, Color.DarkOrange,
  82. Color.DarkSeaGreen,Color.DarkSlateBlue,Color.DarkSlateGray,Color.DarkViolet,Color.DeepPink,Color.DeepSkyBlue,Color.DimGray, Color.DodgerBlue,Color.ForestGreen, Color.Gold,
  83. Color.Gray,Color.Green,Color.GreenYellow,Color.HotPink,Color.Indigo,Color.Khaki,Color.LightBlue,Color.LightCoral,Color.LightGreen, Color.LightPink,Color.LightSalmon,Color.LightSkyBlue,
  84. Color.LightSlateGray,Color.LightSteelBlue,Color.LimeGreen,Color.MediumOrchid,Color.MediumPurple,Color.MediumSeaGreen,Color.MediumSlateBlue,Color.MediumSpringGreen,
  85. Color.MediumTurquoise,Color.Moccasin,Color.NavajoWhite,Color.Olive,Color.OliveDrab,Color.Orange,Color.OrangeRed,Color.Orchid,Color.PaleGoldenrod,Color.PaleGreen,
  86. Color.PeachPuff,Color.Peru,Color.Pink,Color.Plum,Color.PowderBlue,Color.Purple,Color.Red,Color.RosyBrown,Color.RoyalBlue,Color.SaddleBrown,Color.Salmon,Color.SeaGreen, Color.Sienna,
  87. Color.SkyBlue,Color.SlateBlue,Color.SlateGray,Color.SpringGreen,Color.Teal,Color.Tomato,Color.Turquoise,Color.Violet,Color.Wheat, Color.Yellow,Color.YellowGreen});
  88. public ProcessDataChartDataItem(int capacity = 60*5)
  89. {
  90. SeriesSelectAllCommand = new DelegateCommand<object>(new Action<object>(OnSeriesSelectAll), null);
  91. SeriesSelectNoneCommand = new DelegateCommand<object>(new Action<object>(OnSeriesSelectNone), null);
  92. SeriesSelectDefaultCommand = new DelegateCommand<object>(new Action<object>(OnSeriesSelectDefault), null);
  93. RenderableSeries = new ObservableCollection<IRenderableSeries>();
  94. _capacity = capacity;
  95. }
  96. public void SetInfo(string info)
  97. {
  98. ProcessInfo = info;
  99. InvokePropertyChanged("ProcessInfo");
  100. }
  101. public void AppendData(Dictionary<string, object> data)
  102. {
  103. if (data == null)
  104. return;
  105. foreach (var item in RenderableSeries)
  106. {
  107. var series = item as SmartDataLine;
  108. if (series == null)
  109. continue;
  110. if (!data.ContainsKey(series.DbDataName))
  111. continue;
  112. var dataSeries = series.DataSeries as XyDataSeries<DateTime, float>;
  113. while (dataSeries.Count > _capacity)
  114. dataSeries.RemoveAt(0);
  115. dataSeries.Append(DateTime.Now, (float)(Convert.ToDouble(data[series.DbDataName])));
  116. }
  117. }
  118. public void UpdateCultureString(Dictionary<string, string> data)
  119. {
  120. if (data == null)
  121. return;
  122. foreach (var item in RenderableSeries)
  123. {
  124. var series = item as SmartDataLine;
  125. if (series == null)
  126. continue;
  127. if (!data.ContainsKey(series.DbDataName))
  128. continue;
  129. series.DisplayName = data[series.DbDataName];
  130. }
  131. }
  132. public void UpdateData(List<HistoryDataItem> data)
  133. {
  134. ClearData();
  135. if (data == null || data.Count == 0)
  136. return;
  137. foreach (HistoryDataItem dataItem in data)
  138. {
  139. foreach (var item in RenderableSeries)
  140. {
  141. var series = item as SmartDataLine;
  142. if (series == null)
  143. continue;
  144. var dataSeries = series.DataSeries as XyDataSeries<DateTime, float>;
  145. while (dataSeries.Count > _capacity)
  146. dataSeries.RemoveAt(0);
  147. if (series.DbDataName != dataItem.dbName)
  148. continue;
  149. dataSeries.Append(dataItem.dateTime, (float)(dataItem.value));
  150. }
  151. }
  152. }
  153. public void ClearData()
  154. {
  155. foreach (var item in RenderableSeries)
  156. {
  157. var series = item as SmartDataLine;
  158. if (series == null)
  159. continue;
  160. var dataSeries = series.DataSeries as XyDataSeries<DateTime, float>;
  161. dataSeries.Clear();
  162. }
  163. }
  164. /// <summary>
  165. /// 如果已经有了key,更新名字和做标注
  166. /// 如果不存在,创建新的
  167. /// </summary>
  168. /// <param name="items"></param>
  169. public void UpdateColumns(Dictionary<string/*key value=database column name*/, Tuple<string, string, bool>> dicItems)
  170. {
  171. List<IRenderableSeries> lstRemovedSeries = new List<IRenderableSeries>();
  172. foreach (var seriesItem in RenderableSeries)
  173. {
  174. var series = seriesItem as SmartDataLine;
  175. if (series == null)
  176. continue;
  177. if (!dicItems.ContainsKey(series.DbDataName))
  178. {
  179. lstRemovedSeries.Add(seriesItem);
  180. continue;
  181. }
  182. UpdateColumn(dicItems[series.DbDataName]);
  183. dicItems.Remove(series.DbDataName);
  184. }
  185. foreach (var newItem in dicItems)
  186. {
  187. RenderableSeries.Add(new SmartDataLine(newItem.Value.Item2, newItem.Value.Item3? System.Windows.Media.Colors.Blue : System.Windows.Media.Colors.Red,
  188. newItem.Value.Item1, true)
  189. {
  190. YAxisId = newItem.Value.Item3 ? "PressureYAxisId" : "GeneralYAxisId"
  191. });
  192. }
  193. foreach (var removeItem in lstRemovedSeries)
  194. {
  195. RenderableSeries.Remove(removeItem);
  196. }
  197. }
  198. public void UpdateColumn(Tuple<string, string, bool> columnInfo)
  199. {
  200. foreach (var item in RenderableSeries)
  201. {
  202. var series = item as SmartDataLine;
  203. if (series != null && series.DbDataName == columnInfo.Item1)
  204. {
  205. series.DisplayName = columnInfo.Item2;
  206. if (series.Stroke.Equals(System.Windows.Media.Color.FromArgb(255, 0, 0, 255)))
  207. {
  208. Color drawingColor = colorQueue.Peek();
  209. series.Stroke = System.Windows.Media.Color.FromRgb(drawingColor.R, drawingColor.G, drawingColor.B);
  210. colorQueue.Enqueue(colorQueue.Dequeue());
  211. }
  212. series.YAxisId = columnInfo.Item3 ? "PressureYAxisId" : "GeneralYAxisId";
  213. break;
  214. }
  215. }
  216. }
  217. public void UpdateColumn(string dbName, string displayName, bool isPressure)
  218. {
  219. foreach (var item in RenderableSeries)
  220. {
  221. var series = item as SmartDataLine;
  222. if (series != null && series.DbDataName == dbName)
  223. {
  224. series.DisplayName = displayName;
  225. break;
  226. }
  227. }
  228. }
  229. public void UpdateColumnDisplayName(string dbName, string displayName)
  230. {
  231. foreach (var item in RenderableSeries)
  232. {
  233. var series = item as SmartDataLine;
  234. if (series != null && series.DbDataName == dbName)
  235. {
  236. series.DisplayName = displayName;
  237. break;
  238. }
  239. }
  240. }
  241. public void RemoveColumn(string dbName)
  242. {
  243. foreach (var item in RenderableSeries)
  244. {
  245. var series = item as SmartDataLine;
  246. if (series != null && series.DbDataName == dbName)
  247. {
  248. RenderableSeries.Remove(series);
  249. break;
  250. }
  251. }
  252. }
  253. public void RemoveAllColumn()
  254. {
  255. ClearData();
  256. RenderableSeries.Clear();
  257. }
  258. public void InitColumns(Dictionary<string, string> items)
  259. {
  260. ClearData();
  261. RenderableSeries.Clear();
  262. foreach (KeyValuePair<string, string> item in items)
  263. {
  264. RenderableSeries.Add(new SmartDataLine(item.Key, System.Windows.Media.Colors.Blue,
  265. item.Value, true)
  266. {
  267. YAxisId = item.Key.Contains("Pressure") ? "PressureYAxisId" : "GeneralYAxisId"
  268. });
  269. }
  270. }
  271. public void SetColor(string key, System.Windows.Media.Color color)
  272. {
  273. foreach (var item in RenderableSeries)
  274. {
  275. var series = item as SmartDataLine;
  276. if (series == null)
  277. continue;
  278. if (series.DisplayName == key)
  279. series.Stroke = color;
  280. }
  281. }
  282. public void OnSeriesSelectAll(object param)
  283. {
  284. foreach (var item in RenderableSeries)
  285. {
  286. var series = item as SmartDataLine;
  287. if (series == null)
  288. continue;
  289. series.IsVisible = true;
  290. }
  291. }
  292. public void OnSeriesSelectNone(object param)
  293. {
  294. foreach (var item in RenderableSeries)
  295. {
  296. var series = item as SmartDataLine;
  297. if (series == null)
  298. continue;
  299. series.IsVisible = false;
  300. }
  301. }
  302. public void OnSeriesSelectDefault(object param)
  303. {
  304. foreach (var item in RenderableSeries)
  305. {
  306. var series = item as SmartDataLine;
  307. if (series == null)
  308. continue;
  309. series.IsVisible = series.IsDefaultVisable;
  310. series.Stroke = series.DefaultSeriesColor;
  311. series.LineThickness = 1;
  312. }
  313. }
  314. }
  315. }