123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Linq;
- using System.Windows.Media;
- using MECF.Framework.UI.Client.ClientBase.Tree;
- using SciChart.Charting.Visuals.RenderableSeries;
- using SciChart.Data.Numerics;
- using DrawingColor = System.Drawing.Color;
- namespace MECF.Framework.UI.Client.ClientBase.Charting
- {
- /// <summary>
- /// 需要显示在图表中的项目列表。
- /// </summary>
- public class ChartingLineSeriesCollection : ObservableCollection<IRenderableSeries>
- {
- #region Variables
- private Queue<Color> _colorQueue;
- private readonly Random _colorRandom;
- #endregion
- #region Constructors
- public ChartingLineSeriesCollection(string displayName)
- {
- _colorQueue = GetNewColorPatternQueue();
- _colorRandom = new Random();
- DisplayName = displayName;
- }
- #endregion
- #region Properties
- public string DisplayName { get; }
- #endregion
- #region Methods
- /// <summary>
- /// 获取颜色列队。
- /// </summary>
- /// <returns></returns>
- private static Queue<Color> GetNewColorPatternQueue()
- {
- var colorList = new List<DrawingColor>(new DrawingColor[]
- {
- DrawingColor.Red, DrawingColor.Orange, DrawingColor.Yellow, DrawingColor.Green, DrawingColor.Blue,
- DrawingColor.Pink, DrawingColor.Purple, DrawingColor.Aqua,
- DrawingColor.Bisque, DrawingColor.Brown, DrawingColor.BurlyWood, DrawingColor.CadetBlue,
- DrawingColor.CornflowerBlue, DrawingColor.DarkBlue, DrawingColor.DarkCyan, DrawingColor.DarkGray,
- DrawingColor.DarkGreen, DrawingColor.DarkKhaki,
- DrawingColor.DarkMagenta, DrawingColor.DarkOliveGreen, DrawingColor.DarkOrange,
- DrawingColor.DarkSeaGreen, DrawingColor.DarkSlateBlue, DrawingColor.DarkSlateGray,
- DrawingColor.DarkViolet, DrawingColor.DeepPink,
- DrawingColor.DeepSkyBlue, DrawingColor.DimGray, DrawingColor.DodgerBlue, DrawingColor.ForestGreen,
- DrawingColor.Gold,
- DrawingColor.Gray, DrawingColor.GreenYellow, DrawingColor.HotPink, DrawingColor.Indigo,
- DrawingColor.Khaki, DrawingColor.LightBlue,
- DrawingColor.LightCoral, DrawingColor.LightGreen, DrawingColor.LightPink, DrawingColor.LightSalmon,
- DrawingColor.LightSkyBlue,
- DrawingColor.LightSlateGray, DrawingColor.LightSteelBlue, DrawingColor.LimeGreen,
- DrawingColor.MediumOrchid, DrawingColor.MediumPurple,
- DrawingColor.MediumSeaGreen, DrawingColor.MediumSlateBlue, DrawingColor.MediumSpringGreen,
- DrawingColor.MediumTurquoise, DrawingColor.Moccasin, DrawingColor.NavajoWhite, DrawingColor.Olive,
- DrawingColor.OliveDrab, DrawingColor.OrangeRed,
- DrawingColor.Orchid, DrawingColor.PaleGoldenrod, DrawingColor.PaleGreen,
- DrawingColor.PeachPuff, DrawingColor.Peru, DrawingColor.Plum, DrawingColor.PowderBlue,
- DrawingColor.RosyBrown, DrawingColor.RoyalBlue,
- DrawingColor.SaddleBrown, DrawingColor.Salmon, DrawingColor.SeaGreen, DrawingColor.Sienna,
- DrawingColor.SkyBlue, DrawingColor.SlateBlue, DrawingColor.SlateGray, DrawingColor.SpringGreen,
- DrawingColor.Teal, DrawingColor.Aquamarine,
- DrawingColor.Tomato, DrawingColor.Turquoise, DrawingColor.Violet, DrawingColor.Wheat,
- DrawingColor.YellowGreen
- });
- return new Queue<Color>(colorList.Select(x => Color.FromRgb(x.R, x.G, x.B)));
- }
- /// <summary>
- /// 复位色板。
- /// </summary>
- /// <param name="isRandomColor"></param>
- private void ResetColorQueue(bool isRandomColor = false)
- {
- if (isRandomColor)
- {
- _colorQueue.Clear();
- for (var i = 0; i < 200; i++)
- {
- _colorQueue.Enqueue(Color.FromRgb(
- (byte)_colorRandom.Next(0, 255),
- (byte)_colorRandom.Next(0, 255),
- (byte)_colorRandom.Next(0, 255)));
- }
- }
- else
- _colorQueue = GetNewColorPatternQueue();
- }
- /// <summary>
- /// 从色板中获取一个颜色。
- /// </summary>
- /// <returns></returns>
- private Color GetColor()
- {
- if (!_colorQueue.Any())
- ResetColorQueue();
- var dc = _colorQueue.Dequeue();
- return Color.FromRgb(dc.R, dc.G, dc.B);
- }
- /// <summary>
- /// 重置图表序列的颜色。
- /// </summary>
- public void ResetColors()
- {
- ResetColorQueue();
- foreach (var series in this)
- {
- series.Stroke = GetColor();
- }
- }
- /// <summary>
- /// 追加新的查询数据到列表。
- /// </summary>
- /// <param name="collection"></param>
- /// <param name="antiAliasing"></param>
- /// <param name="resamplingMode"></param>
- /// <returns>成功追加的项目。</returns>
- public List<IRenderableSeries> Append(List<TreeNode> collection, bool antiAliasing = true,
- ResamplingMode resamplingMode = ResamplingMode.MinMax)
- {
- var existed = this.Select(x => ((FastLineSeries)x).BackendParameterNode);
- var toBeAdded = collection.Except(existed).ToList();
- foreach (var node in toBeAdded)
- {
- var line = new FastLineSeries(node.FullName)
- {
- AntiAliasing = antiAliasing,
- ResamplingMode = resamplingMode,
- BackendParameterNode = node
- };
- node.ClearStatistic();
- Add(line);
- }
- // 清除本次追加的曲线数据,否则不可添加新数据点。
- var toBeCleaned =
- this.Where(x =>
- collection.Select(t => t.FullName)
- .Contains(x.DataSeries.SeriesName))
- .Cast<FastLineSeries>()
- .ToList();
- foreach (var line in toBeCleaned)
- {
- line.DataSeries.Clear();
- line.BackendParameterNode?.ClearStatistic();
- }
- return toBeCleaned.Cast<IRenderableSeries>().ToList();
- }
- /// <summary>
- /// 根据指定的<see cref="TreeNode"/>列表重新整理项目。
- /// <para>该方法提供一种快速更新列表的方法,尽量避免DataGrid刷新造成的UI卡顿问题。</para>
- /// </summary>a
- /// <param name="collection"></param>
- /// <param name="antiAliasing"></param>
- /// <param name="resamplingMode"></param>
- public void ReArrange(List<TreeNode> collection, bool antiAliasing = true,
- ResamplingMode resamplingMode = ResamplingMode.MinMax)
- {
- // 剔除本次没有选择但存在于列表中的项目。
- // 筛选本次选择并已存在于列表中的项目
- var toBeKept = this.Where(x =>
- collection.Select(t => t.FullName).Contains(x.DataSeries.SeriesName));
- // 删除本次没有选择的项目。
- var toBeRemoved = this.Except(toBeKept).ToList();
- foreach (var t in toBeRemoved)
- this.Remove(t);
- // 筛选未存在于列表中的ParameterNode
- var toBeAdded = collection
- .Except(collection.Where(x => this.Select(s => s.DataSeries.SeriesName).Contains(x.FullName))).ToList();
- foreach (var node in toBeAdded)
- {
- var line2D = new FastLineSeries(node.FullName)
- {
- AntiAliasing = antiAliasing,
- ResamplingMode = resamplingMode,
- BackendParameterNode = node
- };
- Add(line2D);
- }
- this.ToList().ForEach(x =>
- {
- x.DataSeries.Clear();
- ((FastLineSeries)x)?.BackendParameterNode?.ClearStatistic();
- });
- }
- public void SetFifoParam()
- {
- var dataSeries = this.Select(x => x.DataSeries).ToList();
-
- }
- #endregion
- #region Overrided Methods
- protected override void InsertItem(int index, IRenderableSeries item)
- {
- if(item != null)
- item.Stroke = GetColor();
- base.InsertItem(index, item);
- }
- #endregion
- }
- }
|