MyLineSeries.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Abt.Controls.SciChart.Visuals.RenderableSeries;
  6. using System.ComponentModel;
  7. using System.Windows.Media;
  8. using Abt.Controls.SciChart.Model.DataSeries;
  9. using Aitex.UI.Charting.Model;
  10. using Aitex.UI.Charting.ViewModel;
  11. namespace Aitex.UI.Charting.View
  12. {
  13. /// <summary>
  14. /// Customized line series type
  15. /// </summary>
  16. public class MyLineSeries : FastLineRenderableSeries, INotifyPropertyChanged
  17. {
  18. /// <summary>
  19. /// 静态构造函数,用于初始化随机的默认颜色的初始值
  20. /// </summary>
  21. static MyLineSeries()
  22. {
  23. _presetColors = new List<Color>();
  24. _presetColors.Add(Colors.Indigo);
  25. _presetColors.Add(Colors.Blue);
  26. _presetColors.Add(Colors.DarkOrange);
  27. _presetColors.Add(Colors.Olive);
  28. _presetColors.Add(Colors.SaddleBrown);
  29. _presetColors.Add(Colors.DeepPink);
  30. _presetColors.Add(Colors.DarkGreen);
  31. _presetColors.Add(Colors.DarkSlateGray);
  32. _presetColors.Add(Colors.DarkCyan);
  33. _presetColors.Add(Colors.SteelBlue);
  34. _presetColors.Add(Colors.Maroon);
  35. _presetColors.Add(Colors.DarkOrchid);
  36. _presetColors.Add(Colors.Crimson);
  37. _presetColors.Add(Colors.Gray);
  38. }
  39. /// <summary>
  40. /// 自定义曲线的构造函数
  41. /// </summary>
  42. /// <param name="seriesName"></param>
  43. /// <param name="dataSource"></param>
  44. public MyLineSeries(string seriesName, IDataSource dataSource)
  45. {
  46. //产生一随机的GUID作为每个曲线的标志号,方便后续对曲线的查找和操作
  47. UniqueId = Guid.NewGuid().ToString();
  48. if (dataSource != null)
  49. {
  50. Points = dataSource.Datas[seriesName];
  51. DataSource = dataSource;
  52. LastUpdateTime = dataSource.BeginTime;
  53. }
  54. XAxisId = "DefaultAxisId"; //指名x、y坐标轴,此处和xaml文件中定义需一致
  55. YAxisId = "DefaultAxisId";
  56. DataSeries = new XyDataSeries<DateTime, float>();
  57. SeriesName = seriesName;
  58. if (seriesName.Equals("firstLoad")) return;
  59. //默认用户显示名称为“RecipeName” +“变量名的最后段”
  60. string displayName = seriesName;
  61. var strArr = displayName.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
  62. if (strArr.Length >= 2)
  63. displayName = string.Format("{0}_{1}", strArr[strArr.Length - 2], strArr[strArr.Length - 1]);
  64. string recipeName = dataSource == null ? "" : dataSource.Title;
  65. displayName = recipeName + "#" + displayName;
  66. DisplayName = displayName;
  67. SeriesDisplayName = seriesName;
  68. //产生预设10组+随机的颜色
  69. SeriesColor = GetRandomColor();
  70. NextQueryTime = DateTime.MinValue;
  71. }
  72. private string ConvertWaferDisplayName(string source)
  73. {
  74. string str = source;
  75. if ((source.ToLower().Contains("smart") && source.ToLower().Contains("reflect")) ||
  76. (source.ToLower().Contains("curvaturea") || source.ToLower().Contains("curvatureb") || source.ToLower().Contains("curvaturec") || source.ToLower().Contains("curvatured")) ||
  77. (source.ToLower().Contains("reflecta") || source.ToLower().Contains("reflectb") || source.ToLower().Contains("reflectc") || source.ToLower().Contains("reflectd")) ||
  78. (source.ToLower().Contains("tempa") || source.ToLower().Contains("tempb") || source.ToLower().Contains("tempc") || source.ToLower().Contains("tempd")))
  79. {
  80. if (!(string.IsNullOrEmpty(CommonViewModel.Instance.WaferDisplayIndex)))
  81. {
  82. string[] mSplit = source.Split('_');
  83. if (mSplit.Length >= 2)
  84. {
  85. int index;
  86. bool result = int.TryParse(mSplit[mSplit.Length - 1], out index);
  87. --index;
  88. if (result)
  89. {
  90. List<string> _mWaferDisplayIndex = CommonViewModel.Instance.WaferDisplayIndex.Split(',').ToList();
  91. for (int i = 0; i < _mWaferDisplayIndex.Count; i++)
  92. {
  93. if (i == index)
  94. {
  95. str = mSplit[0] + "_";
  96. for (int ii = 1; ii < mSplit.Length - 1; ii++)
  97. {
  98. str += mSplit[ii] + "_";
  99. }
  100. str += _mWaferDisplayIndex[i].PadLeft(2, '0');
  101. break;
  102. }
  103. }
  104. }
  105. }
  106. }
  107. }
  108. return str;
  109. }
  110. /// <summary>
  111. /// 下一次获取数据的时间点
  112. /// </summary>
  113. public DateTime NextQueryTime { get; set; }
  114. /// <summary>
  115. /// related data source
  116. /// </summary>
  117. public IDataSource DataSource { get; private set; }
  118. /// <summary>
  119. /// intenal data of property changed
  120. /// </summary>
  121. private double _factor = 1.0;
  122. /// <summary>
  123. /// internal data of property changed
  124. /// </summary>
  125. private double _offset = 0.0;
  126. /// <summary>
  127. /// data value's factor
  128. /// </summary>
  129. public double Factor
  130. {
  131. get
  132. {
  133. return _factor;
  134. }
  135. set
  136. {
  137. if (_factor != value)
  138. {
  139. _factor = value;
  140. //genetate factor change command
  141. CommonViewModel.Instance.ChangeDataDisplayFactor(UniqueId, value, _offset);
  142. InvokePropertyChanged("Factor");
  143. }
  144. }
  145. }
  146. /// <summary>
  147. /// data value's offset
  148. /// </summary>
  149. public double Offset
  150. {
  151. get
  152. {
  153. return _offset;
  154. }
  155. set
  156. {
  157. if (_offset != value)
  158. {
  159. _offset = value;
  160. //genetate factor change command
  161. CommonViewModel.Instance.ChangeDataDisplayFactor(UniqueId, _factor, value);
  162. InvokePropertyChanged("Offset");
  163. }
  164. }
  165. }
  166. /// <summary>
  167. /// Series Name
  168. /// </summary>
  169. public string SeriesName { get; private set; }
  170. /// <summary>
  171. /// data source name of this series object
  172. /// </summary>
  173. public string DataSourceName
  174. {
  175. get
  176. {
  177. if (DataSource == null)
  178. return string.Empty;
  179. return DataSource.Title;
  180. }
  181. }
  182. /// <summary>
  183. /// indicate the last update timestamp
  184. /// </summary>
  185. public DateTime LastUpdateTime { get; set; }
  186. /// <summary>
  187. /// internal string for display name
  188. /// </summary>
  189. private string _displayName;
  190. private string _serialDisplayName;
  191. /// <summary>
  192. /// series line's display name
  193. /// </summary>
  194. public string DisplayName
  195. {
  196. get
  197. {
  198. return _displayName;
  199. }
  200. set
  201. {
  202. _displayName = ConvertWaferDisplayName(value);//wafer排序映射
  203. if (DataSeries != null)
  204. {
  205. if (_offset == 0)
  206. DataSeries.SeriesName = string.Format("{0} x{1}", _displayName, _factor);
  207. else
  208. DataSeries.SeriesName = string.Format("{0} x{1}+{2}", _displayName, _factor, _offset);
  209. }
  210. InvokePropertyChanged("DisplayName");
  211. }
  212. }
  213. public string SeriesDisplayName {
  214. get
  215. {
  216. return _serialDisplayName;
  217. }
  218. set
  219. {
  220. _serialDisplayName = ConvertWaferDisplayName(value);//wafer排序映射
  221. InvokePropertyChanged("SeriesDisplayName");
  222. }
  223. }
  224. /// <summary>
  225. /// series line's thickness
  226. /// </summary>
  227. public double LineThickness
  228. {
  229. get
  230. {
  231. return StrokeThickness;
  232. }
  233. set
  234. {
  235. var i = Convert.ToInt32(value);
  236. if (i < 1) i = 1;
  237. if (i > 100) i = 100;
  238. StrokeThickness = i;
  239. InvokePropertyChanged("LineThickness");
  240. }
  241. }
  242. /// <summary>
  243. /// series object's unique id
  244. /// </summary>
  245. public string UniqueId { get; private set; }
  246. /// <summary>
  247. /// raw data points
  248. /// </summary>
  249. public DataItem Points { get; set; }
  250. #region Generate random color
  251. /// <summary>
  252. /// generate a random color
  253. /// </summary>
  254. private Random _colorRamdom = new Random();
  255. private Color GetRandomColor()
  256. {
  257. foreach (var preCo in _presetColors)
  258. {
  259. bool has = false;
  260. foreach (var co in CommonViewModel.Instance.RenderableSeries)
  261. {
  262. if (co.SeriesColor == preCo)
  263. {
  264. has = true;
  265. break;
  266. }
  267. }
  268. if (!has)
  269. return preCo;
  270. }
  271. byte r, g, b;
  272. do
  273. {
  274. _colorRamdom = new Random(Guid.NewGuid().GetHashCode());
  275. r = (byte)_colorRamdom.Next(255);
  276. _colorRamdom = new Random(Guid.NewGuid().GetHashCode());
  277. g = (byte)_colorRamdom.Next(255);
  278. _colorRamdom = new Random(Guid.NewGuid().GetHashCode());
  279. b = (byte)_colorRamdom.Next(255);
  280. } while (r + g + b < 255);
  281. return Color.FromArgb(0xFF, r, g, b);
  282. }
  283. /// <summary>
  284. /// 预先设定的颜色
  285. /// </summary>
  286. private static List<Color> _presetColors;
  287. #endregion
  288. #region PropertyChanged
  289. public event PropertyChangedEventHandler PropertyChanged;
  290. public void InvokePropertyChanged(string propertyName)
  291. {
  292. PropertyChangedEventArgs eventArgs = new PropertyChangedEventArgs(propertyName);
  293. PropertyChangedEventHandler changed = PropertyChanged;
  294. if (changed != null)
  295. {
  296. changed(this, eventArgs);
  297. }
  298. }
  299. public void InvokePropertyChanged()
  300. {
  301. Type t = this.GetType();
  302. var ps = t.GetProperties();
  303. foreach (var p in ps)
  304. {
  305. InvokePropertyChanged(p.Name);
  306. }
  307. }
  308. #endregion
  309. }
  310. }