using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using Aitex.Core.RT.Log; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.DataCenter; using MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory; using MECF.Framework.UI.Client.ClientBase.Tree; using OpenSEMI.ClientBase.ServiceProvider; namespace MECF.Framework.UI.Client.CenterViews.Operations.RealTime { public class RealtimeProvider : IProvider { ObservableCollection _rootNode = new ObservableCollection(); Dictionary _indexer = new Dictionary(); public void Clear() { _indexer.Clear(); _rootNode.Clear(); } /// /// 使用字符串队列创建树结构的分支。 /// /// /// private static TreeNode CreateTreeBranch(Queue branchString, TreeNode node) { var rootNode = node; while (true) { if (branchString.Count <= 0) return rootNode; var name = branchString.Dequeue(); if (node == null) { // 根节点 node = new TreeNode(name); rootNode = node; } else { if (node.Name == name) continue; // 向ChildNode插入 var subNode = node.ChildNodes.FirstOrDefault(x => x.Name == name); if (subNode == null) { subNode = new TreeNode(name); node.ChildNodes.Add(subNode); } node = subNode; } } } public void Create() { } public ObservableCollection GetUserDefineParameters() { var typedContents = ((string)QueryDataClient.Instance.Service.GetTypedConfigContent("UserDefine", "")); ObservableCollection dataList = new ObservableCollection(); if (typedContents != null) { var contentList = typedContents.Split(',').ToList(); contentList.ForEach(x => { if (!string.IsNullOrEmpty(x)) dataList.Add($"{x}"); }); } return dataList; } public List GetTreeNodeParameters() { var root = new List(); try { Dictionary displayDic = QueryDataClient.Instance.Service.GetData("System.Display") as Dictionary; List dataList = (List)QueryDataClient.Instance.Service.GetConfig("System.NumericDataList"); List setUplist = null; if (QueryDataClient.Instance.Service.GetConfigItemList().Where(x => x.Path == "System.SetUp") != null) setUplist = QueryDataClient.Instance.Service.GetConfigItemList() .Where(x => x.Path == "System.SetUp").ToList(); var typedContents = ((string)QueryDataClient.Instance.Service.GetTypedConfigContent("UserDefine", "")); if (string.IsNullOrEmpty(typedContents)) { dataList.Add($"UserDefine"); } else { var contentList = typedContents.Split(',').ToList(); contentList.ForEach(x => { if (!string.IsNullOrEmpty(x)) dataList.Add($"UserDefine.{x}"); }); } dataList.Sort(); foreach (var dataName in dataList) { var nodeName = new Queue(dataName.Split('.')); if (nodeName.Count <= 0) continue; // 开始创建Tree分支 var rootNode = root.FirstOrDefault(x => x.Name == nodeName.Peek()); var node = CreateTreeBranch(nodeName, rootNode); if (rootNode == null) { root.Add(node); } } root.Sort(new NameComparer()); if (displayDic != null) { foreach (TreeNode rootNodes in root) { foreach (var terminalNode in rootNodes.Flatten(true)) { terminalNode.DisplayName = displayDic.ContainsKey($"{rootNodes.Name}.{terminalNode.FullName}") ? displayDic[$"{rootNodes.Name}.{terminalNode.FullName}"] : terminalNode.FullName; } } } foreach (var rootNodes in root) { var childNode = rootNodes.ChildNodes.ToList(); childNode.Sort(new NameComparer()); for (int i = 0; i < childNode.Count; i++) { rootNodes.ChildNodes.Move(rootNodes.ChildNodes.IndexOf(childNode[i]), i); } } } catch (Exception ex) { LOG.Write(ex); } return root; } public ObservableCollection GetParameterNodeParameters() { try { List dataList = (List)QueryDataClient.Instance.Service.GetConfig("System.NumericDataList"); var typedContents = ((string)QueryDataClient.Instance.Service.GetTypedConfigContent("UserDefine", "")); for (int i = 0; i < dataList.Count; i++) { if (dataList[i].StartsWith("SMIF")) dataList[i] = $"SMIFs.{dataList[i]}"; if (dataList[i].StartsWith("Stocker")) dataList[i] = $"Stockers.{dataList[i]}"; if (dataList[i].StartsWith("Stage")) dataList[i] = $"Stages.{dataList[i]}"; dataList[i] = dataList[i].Replace("PM1", "Tube"); } if (string.IsNullOrEmpty(typedContents)) { dataList.Add($"UserDefine"); } else { var contentList = typedContents.Split(',').ToList(); contentList.ForEach(x => { if (!string.IsNullOrEmpty(x)) dataList.Add($"UserDefine.{x}"); }); } dataList.Sort(); //List removeList = _indexer.Keys.ToList(); foreach (string dataName in dataList) { string[] nodeName = dataName.Split('.'); ParameterNode parentNode = null; string pathName = ""; for (int i = 0; i < nodeName.Length; i++) { pathName = (i == 0) ? nodeName[i] : (pathName + "." + nodeName[i]); //removeList.Remove(pathName); if (!_indexer.ContainsKey(pathName)) { _indexer[pathName] = new ParameterNode() { Name = pathName.Replace("UserDefine.", "").Replace("SMIFs.", "").Replace("Stages.", "") .Replace("Stockers.", ""), ChildNodes = new ObservableCollection(), ParentNode = parentNode }; if (parentNode == null) { _rootNode.Add(_indexer[pathName]); } else { parentNode.ChildNodes.Add(_indexer[pathName]); } } parentNode = _indexer[pathName]; //removeList.Remove(pathName); } } //foreach (var key in removeList) //{ // if (_indexer[key].ParentNode == null) // _rootNode.Remove(_indexer[key]); // else // { // _indexer[key].ParentNode.ChildNodes.Remove(_indexer[key]); // } //} return _rootNode; } catch (Exception ex) { LOG.Write(ex); } #region Test code ObservableCollection result = new ObservableCollection(); ParameterNode node1 = new ParameterNode() { Name = "Para Node 1", Selected = false, ChildNodes = new ObservableCollection() }; ParameterNode node2 = new ParameterNode() { Name = "Para Node 2", Selected = false, ChildNodes = new ObservableCollection() }; ParameterNode node3 = new ParameterNode() { Name = "Para Node 3", Selected = false, ChildNodes = new ObservableCollection() }; for (int i = 0; i < 5; i++) { ParameterNode node = new ParameterNode() { Name = node1.Name + "_" + i.ToString(), Selected = false, ChildNodes = new ObservableCollection() }; node1.ChildNodes.Add(node); } for (int i = 0; i < 3; i++) { ParameterNode node = new ParameterNode() { Name = node2.Name + "_" + i.ToString(), Selected = false, ChildNodes = new ObservableCollection() }; node2.ChildNodes.Add(node); } for (int i = 0; i < 4; i++) { ParameterNode node = new ParameterNode() { Name = node3.Name + "_" + i.ToString(), Selected = false, ChildNodes = new ObservableCollection() }; node3.ChildNodes.Add(node); } result.Add(node1); result.Add(node2); result.Add(node3); return result; #endregion } public class NameComparer : IComparer { public int Compare(TreeNode x, TreeNode y) { if (x == null || y == null) throw new ArgumentException("Parameters can't be null"); string fileA = x.DisplayName; string fileB = y.DisplayName; char[] arr1 = fileA.ToCharArray(); char[] arr2 = fileB.ToCharArray(); int i = 0, j = 0; while (i < arr1.Length && j < arr2.Length) { if (char.IsDigit(arr1[i]) && char.IsDigit(arr2[j])) { string s1 = "", s2 = ""; while (i < arr1.Length && char.IsDigit(arr1[i])) { s1 += arr1[i]; i++; } while (j < arr2.Length && char.IsDigit(arr2[j])) { s2 += arr2[j]; j++; } if (int.Parse(s1) > int.Parse(s2)) { return 1; } if (int.Parse(s1) < int.Parse(s2)) { return -1; } } else { if (arr1[i] > arr2[j]) { return 1; } if (arr1[i] < arr2[j]) { return -1; } i++; j++; } } if (arr1.Length == arr2.Length) { return 0; } else { return arr1.Length > arr2.Length ? 1 : -1; } } } } }