ChartingLineSeriesCollection.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Windows.Media;
  6. using MECF.Framework.UI.Client.ClientBase.Tree;
  7. using SciChart.Charting.Visuals.RenderableSeries;
  8. using SciChart.Data.Numerics;
  9. using DrawingColor = System.Drawing.Color;
  10. namespace MECF.Framework.UI.Client.ClientBase.Charting
  11. {
  12. /// <summary>
  13. /// 需要显示在图表中的项目列表。
  14. /// </summary>
  15. public class ChartingLineSeriesCollection : ObservableCollection<IRenderableSeries>
  16. {
  17. #region Variables
  18. private Queue<Color> _colorQueue;
  19. private readonly Random _colorRandom;
  20. #endregion
  21. #region Constructors
  22. public ChartingLineSeriesCollection(string displayName)
  23. {
  24. _colorQueue = GetNewColorPatternQueue();
  25. _colorRandom = new Random();
  26. DisplayName = displayName;
  27. }
  28. #endregion
  29. #region Properties
  30. public string DisplayName { get; }
  31. #endregion
  32. #region Methods
  33. /// <summary>
  34. /// 获取颜色列队。
  35. /// </summary>
  36. /// <returns></returns>
  37. private static Queue<Color> GetNewColorPatternQueue()
  38. {
  39. var colorList = new List<DrawingColor>(new DrawingColor[]
  40. {
  41. DrawingColor.Red, DrawingColor.Orange, DrawingColor.Yellow, DrawingColor.Green, DrawingColor.Blue,
  42. DrawingColor.Pink, DrawingColor.Purple, DrawingColor.Aqua,
  43. DrawingColor.Bisque, DrawingColor.Brown, DrawingColor.BurlyWood, DrawingColor.CadetBlue,
  44. DrawingColor.CornflowerBlue, DrawingColor.DarkBlue, DrawingColor.DarkCyan, DrawingColor.DarkGray,
  45. DrawingColor.DarkGreen, DrawingColor.DarkKhaki,
  46. DrawingColor.DarkMagenta, DrawingColor.DarkOliveGreen, DrawingColor.DarkOrange,
  47. DrawingColor.DarkSeaGreen, DrawingColor.DarkSlateBlue, DrawingColor.DarkSlateGray,
  48. DrawingColor.DarkViolet, DrawingColor.DeepPink,
  49. DrawingColor.DeepSkyBlue, DrawingColor.DimGray, DrawingColor.DodgerBlue, DrawingColor.ForestGreen,
  50. DrawingColor.Gold,
  51. DrawingColor.Gray, DrawingColor.GreenYellow, DrawingColor.HotPink, DrawingColor.Indigo,
  52. DrawingColor.Khaki, DrawingColor.LightBlue,
  53. DrawingColor.LightCoral, DrawingColor.LightGreen, DrawingColor.LightPink, DrawingColor.LightSalmon,
  54. DrawingColor.LightSkyBlue,
  55. DrawingColor.LightSlateGray, DrawingColor.LightSteelBlue, DrawingColor.LimeGreen,
  56. DrawingColor.MediumOrchid, DrawingColor.MediumPurple,
  57. DrawingColor.MediumSeaGreen, DrawingColor.MediumSlateBlue, DrawingColor.MediumSpringGreen,
  58. DrawingColor.MediumTurquoise, DrawingColor.Moccasin, DrawingColor.NavajoWhite, DrawingColor.Olive,
  59. DrawingColor.OliveDrab, DrawingColor.OrangeRed,
  60. DrawingColor.Orchid, DrawingColor.PaleGoldenrod, DrawingColor.PaleGreen,
  61. DrawingColor.PeachPuff, DrawingColor.Peru, DrawingColor.Plum, DrawingColor.PowderBlue,
  62. DrawingColor.RosyBrown, DrawingColor.RoyalBlue,
  63. DrawingColor.SaddleBrown, DrawingColor.Salmon, DrawingColor.SeaGreen, DrawingColor.Sienna,
  64. DrawingColor.SkyBlue, DrawingColor.SlateBlue, DrawingColor.SlateGray, DrawingColor.SpringGreen,
  65. DrawingColor.Teal, DrawingColor.Aquamarine,
  66. DrawingColor.Tomato, DrawingColor.Turquoise, DrawingColor.Violet, DrawingColor.Wheat,
  67. DrawingColor.YellowGreen
  68. });
  69. return new Queue<Color>(colorList.Select(x => Color.FromRgb(x.R, x.G, x.B)));
  70. }
  71. /// <summary>
  72. /// 复位色板。
  73. /// </summary>
  74. /// <param name="isRandomColor"></param>
  75. private void ResetColorQueue(bool isRandomColor = false)
  76. {
  77. if (isRandomColor)
  78. {
  79. _colorQueue.Clear();
  80. for (var i = 0; i < 200; i++)
  81. {
  82. _colorQueue.Enqueue(Color.FromRgb(
  83. (byte)_colorRandom.Next(0, 255),
  84. (byte)_colorRandom.Next(0, 255),
  85. (byte)_colorRandom.Next(0, 255)));
  86. }
  87. }
  88. else
  89. _colorQueue = GetNewColorPatternQueue();
  90. }
  91. /// <summary>
  92. /// 从色板中获取一个颜色。
  93. /// </summary>
  94. /// <returns></returns>
  95. private Color GetColor()
  96. {
  97. if (!_colorQueue.Any())
  98. ResetColorQueue();
  99. var dc = _colorQueue.Dequeue();
  100. return Color.FromRgb(dc.R, dc.G, dc.B);
  101. }
  102. /// <summary>
  103. /// 重置图表序列的颜色。
  104. /// </summary>
  105. public void ResetColors()
  106. {
  107. ResetColorQueue();
  108. foreach (var series in this)
  109. {
  110. series.Stroke = GetColor();
  111. }
  112. }
  113. /// <summary>
  114. /// 追加新的查询数据到列表。
  115. /// </summary>
  116. /// <param name="collection"></param>
  117. /// <param name="antiAliasing"></param>
  118. /// <param name="resamplingMode"></param>
  119. /// <returns>成功追加的项目。</returns>
  120. public List<IRenderableSeries> Append(List<TreeNode> collection, bool antiAliasing = true,
  121. ResamplingMode resamplingMode = ResamplingMode.MinMax)
  122. {
  123. var existed = this.Select(x => ((FastLineSeries)x).BackendParameterNode);
  124. var toBeAdded = collection.Except(existed).ToList();
  125. foreach (var node in toBeAdded)
  126. {
  127. var line = new FastLineSeries(node.FullName)
  128. {
  129. AntiAliasing = antiAliasing,
  130. ResamplingMode = resamplingMode,
  131. BackendParameterNode = node
  132. };
  133. node.ClearStatistic();
  134. Add(line);
  135. }
  136. // 清除本次追加的曲线数据,否则不可添加新数据点。
  137. var toBeCleaned =
  138. this.Where(x =>
  139. collection.Select(t => t.FullName)
  140. .Contains(x.DataSeries.SeriesName))
  141. .Cast<FastLineSeries>()
  142. .ToList();
  143. foreach (var line in toBeCleaned)
  144. {
  145. line.DataSeries.Clear();
  146. line.BackendParameterNode?.ClearStatistic();
  147. }
  148. return toBeCleaned.Cast<IRenderableSeries>().ToList();
  149. }
  150. /// <summary>
  151. /// 根据指定的<see cref="TreeNode"/>列表重新整理项目。
  152. /// <para>该方法提供一种快速更新列表的方法,尽量避免DataGrid刷新造成的UI卡顿问题。</para>
  153. /// </summary>a
  154. /// <param name="collection"></param>
  155. /// <param name="antiAliasing"></param>
  156. /// <param name="resamplingMode"></param>
  157. public void ReArrange(List<TreeNode> collection, bool antiAliasing = true,
  158. ResamplingMode resamplingMode = ResamplingMode.MinMax)
  159. {
  160. // 剔除本次没有选择但存在于列表中的项目。
  161. // 筛选本次选择并已存在于列表中的项目
  162. var toBeKept = this.Where(x =>
  163. collection.Select(t => t.FullName).Contains(x.DataSeries.SeriesName));
  164. // 删除本次没有选择的项目。
  165. var toBeRemoved = this.Except(toBeKept).ToList();
  166. foreach (var t in toBeRemoved)
  167. this.Remove(t);
  168. // 筛选未存在于列表中的ParameterNode
  169. var toBeAdded = collection
  170. .Except(collection.Where(x => this.Select(s => s.DataSeries.SeriesName).Contains(x.FullName))).ToList();
  171. foreach (var node in toBeAdded)
  172. {
  173. var line2D = new FastLineSeries(node.FullName)
  174. {
  175. AntiAliasing = antiAliasing,
  176. ResamplingMode = resamplingMode,
  177. BackendParameterNode = node
  178. };
  179. Add(line2D);
  180. }
  181. this.ToList().ForEach(x =>
  182. {
  183. x.DataSeries.Clear();
  184. ((FastLineSeries)x)?.BackendParameterNode?.ClearStatistic();
  185. });
  186. }
  187. public void SetFifoParam()
  188. {
  189. var dataSeries = this.Select(x => x.DataSeries).ToList();
  190. }
  191. #endregion
  192. #region Overrided Methods
  193. protected override void InsertItem(int index, IRenderableSeries item)
  194. {
  195. if(item != null)
  196. item.Stroke = GetColor();
  197. base.InsertItem(index, item);
  198. }
  199. #endregion
  200. }
  201. }