using System; using System.Collections.Generic; using System.Linq; using System.Text; using Abt.Controls.SciChart.Visuals.RenderableSeries; using System.ComponentModel; using System.Windows.Media; using Abt.Controls.SciChart.Model.DataSeries; using Aitex.UI.Charting.Model; using Aitex.UI.Charting.ViewModel; namespace Aitex.UI.Charting.View { /// /// Customized line series type /// public class MyLineSeries : FastLineRenderableSeries, INotifyPropertyChanged { /// /// 静态构造函数,用于初始化随机的默认颜色的初始值 /// static MyLineSeries() { _presetColors = new List(); _presetColors.Add(Colors.Indigo); _presetColors.Add(Colors.Blue); _presetColors.Add(Colors.DarkOrange); _presetColors.Add(Colors.Olive); _presetColors.Add(Colors.SaddleBrown); _presetColors.Add(Colors.DeepPink); _presetColors.Add(Colors.DarkGreen); _presetColors.Add(Colors.DarkSlateGray); _presetColors.Add(Colors.DarkCyan); _presetColors.Add(Colors.SteelBlue); _presetColors.Add(Colors.Maroon); _presetColors.Add(Colors.DarkOrchid); _presetColors.Add(Colors.Crimson); _presetColors.Add(Colors.Gray); } /// /// 自定义曲线的构造函数 /// /// /// public MyLineSeries(string seriesName, IDataSource dataSource) { //产生一随机的GUID作为每个曲线的标志号,方便后续对曲线的查找和操作 UniqueId = Guid.NewGuid().ToString(); if (dataSource != null) { Points = dataSource.Datas[seriesName]; DataSource = dataSource; LastUpdateTime = dataSource.BeginTime; } XAxisId = "DefaultAxisId"; //指名x、y坐标轴,此处和xaml文件中定义需一致 YAxisId = "DefaultAxisId"; DataSeries = new XyDataSeries(); SeriesName = seriesName; if (seriesName.Equals("firstLoad")) return; //默认用户显示名称为“RecipeName” +“变量名的最后段” string displayName = seriesName; var strArr = displayName.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries); if (strArr.Length >= 2) displayName = string.Format("{0}_{1}", strArr[strArr.Length - 2], strArr[strArr.Length - 1]); string recipeName = dataSource == null ? "" : dataSource.Title; displayName = recipeName + "#" + displayName; DisplayName = displayName; SeriesDisplayName = seriesName; //产生预设10组+随机的颜色 SeriesColor = GetRandomColor(); NextQueryTime = DateTime.MinValue; } private string ConvertWaferDisplayName(string source) { string str = source; if ((source.ToLower().Contains("smart") && source.ToLower().Contains("reflect")) || (source.ToLower().Contains("curvaturea") || source.ToLower().Contains("curvatureb") || source.ToLower().Contains("curvaturec") || source.ToLower().Contains("curvatured")) || (source.ToLower().Contains("reflecta") || source.ToLower().Contains("reflectb") || source.ToLower().Contains("reflectc") || source.ToLower().Contains("reflectd")) || (source.ToLower().Contains("tempa") || source.ToLower().Contains("tempb") || source.ToLower().Contains("tempc") || source.ToLower().Contains("tempd"))) { if (!(string.IsNullOrEmpty(CommonViewModel.Instance.WaferDisplayIndex))) { string[] mSplit = source.Split('_'); if (mSplit.Length >= 2) { int index; bool result = int.TryParse(mSplit[mSplit.Length - 1], out index); --index; if (result) { List _mWaferDisplayIndex = CommonViewModel.Instance.WaferDisplayIndex.Split(',').ToList(); for (int i = 0; i < _mWaferDisplayIndex.Count; i++) { if (i == index) { str = mSplit[0] + "_"; for (int ii = 1; ii < mSplit.Length - 1; ii++) { str += mSplit[ii] + "_"; } str += _mWaferDisplayIndex[i].PadLeft(2, '0'); break; } } } } } } return str; } /// /// 下一次获取数据的时间点 /// public DateTime NextQueryTime { get; set; } /// /// related data source /// public IDataSource DataSource { get; private set; } /// /// intenal data of property changed /// private double _factor = 1.0; /// /// internal data of property changed /// private double _offset = 0.0; /// /// data value's factor /// public double Factor { get { return _factor; } set { if (_factor != value) { _factor = value; //genetate factor change command CommonViewModel.Instance.ChangeDataDisplayFactor(UniqueId, value, _offset); InvokePropertyChanged("Factor"); } } } /// /// data value's offset /// public double Offset { get { return _offset; } set { if (_offset != value) { _offset = value; //genetate factor change command CommonViewModel.Instance.ChangeDataDisplayFactor(UniqueId, _factor, value); InvokePropertyChanged("Offset"); } } } /// /// Series Name /// public string SeriesName { get; private set; } /// /// data source name of this series object /// public string DataSourceName { get { if (DataSource == null) return string.Empty; return DataSource.Title; } } /// /// indicate the last update timestamp /// public DateTime LastUpdateTime { get; set; } /// /// internal string for display name /// private string _displayName; private string _serialDisplayName; /// /// series line's display name /// public string DisplayName { get { return _displayName; } set { _displayName = ConvertWaferDisplayName(value);//wafer排序映射 if (DataSeries != null) { if (_offset == 0) DataSeries.SeriesName = string.Format("{0} x{1}", _displayName, _factor); else DataSeries.SeriesName = string.Format("{0} x{1}+{2}", _displayName, _factor, _offset); } InvokePropertyChanged("DisplayName"); } } public string SeriesDisplayName { get { return _serialDisplayName; } set { _serialDisplayName = ConvertWaferDisplayName(value);//wafer排序映射 InvokePropertyChanged("SeriesDisplayName"); } } /// /// series line's thickness /// public double LineThickness { get { return StrokeThickness; } set { var i = Convert.ToInt32(value); if (i < 1) i = 1; if (i > 100) i = 100; StrokeThickness = i; InvokePropertyChanged("LineThickness"); } } /// /// series object's unique id /// public string UniqueId { get; private set; } /// /// raw data points /// public DataItem Points { get; set; } #region Generate random color /// /// generate a random color /// private Random _colorRamdom = new Random(); private Color GetRandomColor() { foreach (var preCo in _presetColors) { bool has = false; foreach (var co in CommonViewModel.Instance.RenderableSeries) { if (co.SeriesColor == preCo) { has = true; break; } } if (!has) return preCo; } byte r, g, b; do { _colorRamdom = new Random(Guid.NewGuid().GetHashCode()); r = (byte)_colorRamdom.Next(255); _colorRamdom = new Random(Guid.NewGuid().GetHashCode()); g = (byte)_colorRamdom.Next(255); _colorRamdom = new Random(Guid.NewGuid().GetHashCode()); b = (byte)_colorRamdom.Next(255); } while (r + g + b < 255); return Color.FromArgb(0xFF, r, g, b); } /// /// 预先设定的颜色 /// private static List _presetColors; #endregion #region PropertyChanged public event PropertyChangedEventHandler PropertyChanged; public void InvokePropertyChanged(string propertyName) { PropertyChangedEventArgs eventArgs = new PropertyChangedEventArgs(propertyName); PropertyChangedEventHandler changed = PropertyChanged; if (changed != null) { changed(this, eventArgs); } } public void InvokePropertyChanged() { Type t = this.GetType(); var ps = t.GetProperties(); foreach (var p in ps) { InvokePropertyChanged(p.Name); } } #endregion } }