Sic.Framework/MECF.Framework.UI.Client/CenterViews/Core/Charting/ChartingLineSeriesCollectio...

239 lines
8.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows.Media;
using SciChart.Charting.Visuals.RenderableSeries;
using SciChart.Data.Numerics;
using Sicentury.Core.Tree;
using DrawingColor = System.Drawing.Color;
namespace MECF.Framework.UI.Client.CenterViews.Core.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 => ((SicFastLineSeries)x).BackendParameterNode);
var toBeAdded = collection.Except(existed).ToList();
foreach (var node in toBeAdded)
{
var line = new SicFastLineSeries(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<SicFastLineSeries>()
.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 SicFastLineSeries(node.FullName)
{
AntiAliasing = antiAliasing,
ResamplingMode = resamplingMode,
BackendParameterNode = node
};
Add(line2D);
}
this.ToList().ForEach(x =>
{
x.DataSeries.Clear();
((SicFastLineSeries)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
}
}