RealtimeProvider.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using Aitex.Core.RT.Log;
  6. using Aitex.Core.RT.SCCore;
  7. using MECF.Framework.Common.DataCenter;
  8. using MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory;
  9. using MECF.Framework.UI.Client.ClientBase.Tree;
  10. using OpenSEMI.ClientBase.ServiceProvider;
  11. namespace MECF.Framework.UI.Client.CenterViews.Operations.RealTime
  12. {
  13. public class RealtimeProvider : IProvider
  14. {
  15. ObservableCollection<ParameterNode> _rootNode = new ObservableCollection<ParameterNode>();
  16. Dictionary<string, ParameterNode> _indexer = new Dictionary<string, ParameterNode>();
  17. public void Clear()
  18. {
  19. _indexer.Clear();
  20. _rootNode.Clear();
  21. }
  22. /// <summary>
  23. /// 使用字符串队列创建树结构的分支。
  24. /// </summary>
  25. /// <param name="branchString"></param>
  26. /// <param name="node"></param>
  27. private static TreeNode CreateTreeBranch(Queue<string> branchString, TreeNode node)
  28. {
  29. var rootNode = node;
  30. while (true)
  31. {
  32. if (branchString.Count <= 0)
  33. return rootNode;
  34. var name = branchString.Dequeue();
  35. if (node == null)
  36. {
  37. // 根节点
  38. node = new TreeNode(name);
  39. rootNode = node;
  40. }
  41. else
  42. {
  43. if (node.Name == name)
  44. continue;
  45. // 向ChildNode插入
  46. var subNode = node.ChildNodes.FirstOrDefault(x => x.Name == name);
  47. if (subNode == null)
  48. {
  49. subNode = new TreeNode(name);
  50. node.ChildNodes.Add(subNode);
  51. }
  52. node = subNode;
  53. }
  54. }
  55. }
  56. public void Create()
  57. {
  58. }
  59. public ObservableCollection<string> GetUserDefineParameters()
  60. {
  61. var typedContents = ((string)QueryDataClient.Instance.Service.GetTypedConfigContent("UserDefine", ""));
  62. ObservableCollection<string> dataList = new ObservableCollection<string>();
  63. if (typedContents != null)
  64. {
  65. var contentList = typedContents.Split(',').ToList();
  66. contentList.ForEach(x =>
  67. {
  68. if (!string.IsNullOrEmpty(x)) dataList.Add($"{x}");
  69. });
  70. }
  71. return dataList;
  72. }
  73. public List<TreeNode> GetTreeNodeParameters()
  74. {
  75. var root = new List<TreeNode>();
  76. try
  77. {
  78. Dictionary<string, string> displayDic = QueryDataClient.Instance.Service.GetData("System.Display") as Dictionary<string, string>;
  79. List<string> dataList = (List<string>)QueryDataClient.Instance.Service.GetConfig("System.NumericDataList");
  80. List<SCConfigItem> setUplist = null;
  81. if (QueryDataClient.Instance.Service.GetConfigItemList().Where(x => x.Path == "System.SetUp") != null)
  82. setUplist = QueryDataClient.Instance.Service.GetConfigItemList()
  83. .Where(x => x.Path == "System.SetUp").ToList();
  84. var typedContents = ((string)QueryDataClient.Instance.Service.GetTypedConfigContent("UserDefine", ""));
  85. if (string.IsNullOrEmpty(typedContents))
  86. {
  87. dataList.Add($"UserDefine");
  88. }
  89. else
  90. {
  91. var contentList = typedContents.Split(',').ToList();
  92. contentList.ForEach(x =>
  93. {
  94. if (!string.IsNullOrEmpty(x)) dataList.Add($"UserDefine.{x}");
  95. });
  96. }
  97. dataList.Sort();
  98. foreach (var dataName in dataList)
  99. {
  100. var nodeName = new Queue<string>(dataName.Split('.'));
  101. if (nodeName.Count <= 0)
  102. continue;
  103. // 开始创建Tree分支
  104. var rootNode = root.FirstOrDefault(x => x.Name == nodeName.Peek());
  105. var node = CreateTreeBranch(nodeName, rootNode);
  106. if (rootNode == null)
  107. {
  108. root.Add(node);
  109. }
  110. }
  111. root.Sort(new NameComparer());
  112. if (displayDic != null)
  113. {
  114. foreach (TreeNode rootNodes in root)
  115. {
  116. foreach (var terminalNode in rootNodes.Flatten(true))
  117. {
  118. terminalNode.DisplayName = displayDic.ContainsKey($"{rootNodes.Name}.{terminalNode.FullName}") ? displayDic[$"{rootNodes.Name}.{terminalNode.FullName}"] : terminalNode.FullName;
  119. }
  120. }
  121. }
  122. foreach (var rootNodes in root)
  123. {
  124. var childNode = rootNodes.ChildNodes.ToList();
  125. childNode.Sort(new NameComparer());
  126. for (int i = 0; i < childNode.Count; i++)
  127. {
  128. rootNodes.ChildNodes.Move(rootNodes.ChildNodes.IndexOf(childNode[i]), i);
  129. }
  130. }
  131. }
  132. catch (Exception ex)
  133. {
  134. LOG.Write(ex);
  135. }
  136. return root;
  137. }
  138. public ObservableCollection<ParameterNode> GetParameterNodeParameters()
  139. {
  140. try
  141. {
  142. List<string> dataList =
  143. (List<string>)QueryDataClient.Instance.Service.GetConfig("System.NumericDataList");
  144. var typedContents = ((string)QueryDataClient.Instance.Service.GetTypedConfigContent("UserDefine", ""));
  145. for (int i = 0; i < dataList.Count; i++)
  146. {
  147. if (dataList[i].StartsWith("SMIF"))
  148. dataList[i] = $"SMIFs.{dataList[i]}";
  149. if (dataList[i].StartsWith("Stocker"))
  150. dataList[i] = $"Stockers.{dataList[i]}";
  151. if (dataList[i].StartsWith("Stage"))
  152. dataList[i] = $"Stages.{dataList[i]}";
  153. dataList[i] = dataList[i].Replace("PM1", "Tube");
  154. }
  155. if (string.IsNullOrEmpty(typedContents))
  156. {
  157. dataList.Add($"UserDefine");
  158. }
  159. else
  160. {
  161. var contentList = typedContents.Split(',').ToList();
  162. contentList.ForEach(x =>
  163. {
  164. if (!string.IsNullOrEmpty(x)) dataList.Add($"UserDefine.{x}");
  165. });
  166. }
  167. dataList.Sort();
  168. //List<string> removeList = _indexer.Keys.ToList();
  169. foreach (string dataName in dataList)
  170. {
  171. string[] nodeName = dataName.Split('.');
  172. ParameterNode parentNode = null;
  173. string pathName = "";
  174. for (int i = 0; i < nodeName.Length; i++)
  175. {
  176. pathName = (i == 0) ? nodeName[i] : (pathName + "." + nodeName[i]);
  177. //removeList.Remove(pathName);
  178. if (!_indexer.ContainsKey(pathName))
  179. {
  180. _indexer[pathName] = new ParameterNode()
  181. {
  182. Name = pathName.Replace("UserDefine.", "").Replace("SMIFs.", "").Replace("Stages.", "")
  183. .Replace("Stockers.", ""),
  184. ChildNodes = new ObservableCollection<ParameterNode>(),
  185. ParentNode = parentNode
  186. };
  187. if (parentNode == null)
  188. {
  189. _rootNode.Add(_indexer[pathName]);
  190. }
  191. else
  192. {
  193. parentNode.ChildNodes.Add(_indexer[pathName]);
  194. }
  195. }
  196. parentNode = _indexer[pathName];
  197. //removeList.Remove(pathName);
  198. }
  199. }
  200. //foreach (var key in removeList)
  201. //{
  202. // if (_indexer[key].ParentNode == null)
  203. // _rootNode.Remove(_indexer[key]);
  204. // else
  205. // {
  206. // _indexer[key].ParentNode.ChildNodes.Remove(_indexer[key]);
  207. // }
  208. //}
  209. return _rootNode;
  210. }
  211. catch (Exception ex)
  212. {
  213. LOG.Write(ex);
  214. }
  215. #region Test code
  216. ObservableCollection<ParameterNode> result = new ObservableCollection<ParameterNode>();
  217. ParameterNode node1 = new ParameterNode() { Name = "Para Node 1", Selected = false, ChildNodes = new ObservableCollection<ParameterNode>() };
  218. ParameterNode node2 = new ParameterNode() { Name = "Para Node 2", Selected = false, ChildNodes = new ObservableCollection<ParameterNode>() };
  219. ParameterNode node3 = new ParameterNode() { Name = "Para Node 3", Selected = false, ChildNodes = new ObservableCollection<ParameterNode>() };
  220. for (int i = 0; i < 5; i++)
  221. {
  222. ParameterNode node = new ParameterNode() { Name = node1.Name + "_" + i.ToString(), Selected = false, ChildNodes = new ObservableCollection<ParameterNode>() };
  223. node1.ChildNodes.Add(node);
  224. }
  225. for (int i = 0; i < 3; i++)
  226. {
  227. ParameterNode node = new ParameterNode() { Name = node2.Name + "_" + i.ToString(), Selected = false, ChildNodes = new ObservableCollection<ParameterNode>() };
  228. node2.ChildNodes.Add(node);
  229. }
  230. for (int i = 0; i < 4; i++)
  231. {
  232. ParameterNode node = new ParameterNode() { Name = node3.Name + "_" + i.ToString(), Selected = false, ChildNodes = new ObservableCollection<ParameterNode>() };
  233. node3.ChildNodes.Add(node);
  234. }
  235. result.Add(node1);
  236. result.Add(node2);
  237. result.Add(node3);
  238. return result;
  239. #endregion
  240. }
  241. public class NameComparer : IComparer<TreeNode>
  242. {
  243. public int Compare(TreeNode x, TreeNode y)
  244. {
  245. if (x == null || y == null)
  246. throw new ArgumentException("Parameters can't be null");
  247. string fileA = x.DisplayName;
  248. string fileB = y.DisplayName;
  249. char[] arr1 = fileA.ToCharArray();
  250. char[] arr2 = fileB.ToCharArray();
  251. int i = 0, j = 0;
  252. while (i < arr1.Length && j < arr2.Length)
  253. {
  254. if (char.IsDigit(arr1[i]) && char.IsDigit(arr2[j]))
  255. {
  256. string s1 = "", s2 = "";
  257. while (i < arr1.Length && char.IsDigit(arr1[i]))
  258. {
  259. s1 += arr1[i];
  260. i++;
  261. }
  262. while (j < arr2.Length && char.IsDigit(arr2[j]))
  263. {
  264. s2 += arr2[j];
  265. j++;
  266. }
  267. if (int.Parse(s1) > int.Parse(s2))
  268. {
  269. return 1;
  270. }
  271. if (int.Parse(s1) < int.Parse(s2))
  272. {
  273. return -1;
  274. }
  275. }
  276. else
  277. {
  278. if (arr1[i] > arr2[j])
  279. {
  280. return 1;
  281. }
  282. if (arr1[i] < arr2[j])
  283. {
  284. return -1;
  285. }
  286. i++;
  287. j++;
  288. }
  289. }
  290. if (arr1.Length == arr2.Length)
  291. {
  292. return 0;
  293. }
  294. else
  295. {
  296. return arr1.Length > arr2.Length ? 1 : -1;
  297. }
  298. }
  299. }
  300. }
  301. }