MainParameterEditViewModel.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. using Aitex.Core.RT.SCCore;
  2. using Caliburn.Micro;
  3. using MECF.Framework.Common.DataCenter;
  4. using MECF.Framework.Common.OperationCenter;
  5. using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig;
  6. using MECF.Framework.UI.Client.CenterViews.Dialogs;
  7. using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
  8. using OpenSEMI.ClientBase;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Collections.ObjectModel;
  12. using System.Globalization;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. using System.Windows;
  17. using System.Windows.Controls;
  18. using System.Windows.Data;
  19. using FurnaceUI.Models;
  20. using FurnaceUI.Views.Editors;
  21. using FurnaceUI.Views.Recipes;
  22. namespace FurnaceUI.Views.Parameter
  23. {
  24. public class MainParameterEditViewModel : FurnaceUIViewModelBase
  25. {
  26. public List<ParamBase> ParameterTree { get; set; } = new List<ParamBase>();
  27. public RecipeDataBase CurrentRecipe { get; set; } = new RecipeDataBase();
  28. public bool IsPermission { get => this.Permission == 3; }
  29. public ObservableCollection<TempSetData> HeadLst { get; set; } = new ObservableCollection<TempSetData>();
  30. private ConfigNode levelOneNode;
  31. public ConfigNode LevelOneNode
  32. {
  33. get { return levelOneNode; }
  34. set { levelOneNode = value; this.NotifyOfPropertyChange(nameof(LevelOneNode)); }
  35. }
  36. private ConfigNode levelTwoNode;
  37. public ConfigNode LevelTwoNode
  38. {
  39. get { return levelTwoNode; }
  40. set { levelTwoNode = value; this.NotifyOfPropertyChange(nameof(LevelTwoNode)); }
  41. }
  42. private List<ConfigItem> currenItems;
  43. public List<ConfigItem> CurrenItems
  44. {
  45. get { return currenItems; }
  46. set { currenItems = value; this.NotifyOfPropertyChange(nameof(CurrenItems)); }
  47. }
  48. private List<ConfigNode> _ConfigNodes = new List<ConfigNode>();
  49. public List<ConfigNode> ConfigNodes
  50. {
  51. get { return _ConfigNodes; }
  52. set { _ConfigNodes = value; NotifyOfPropertyChange("ConfigNodes"); }
  53. }
  54. private string _defaultUnit = "Pa";
  55. public string DefaultUnit
  56. {
  57. get
  58. {
  59. return _defaultUnit;
  60. }
  61. set
  62. {
  63. _defaultUnit = value;
  64. NotifyOfPropertyChange("DefaultUnit");
  65. }
  66. }
  67. private ConfigNode _rootNode;
  68. private string _CurrentNodeName = string.Empty;
  69. private string path;
  70. private string currentValue;
  71. private ObservableCollection<PageValue> valueList { get; set; } = new ObservableCollection<PageValue>();
  72. protected override void OnInitialize()
  73. {
  74. base.OnInitialize();
  75. this.SystemName = "System";
  76. ConfigNodes = SystemConfigProvider.Instance.GetConfigTree(SystemName).SubNodes;
  77. InitTree();
  78. _rootNode = SystemConfigProvider.Instance.GetConfig(true);
  79. }
  80. protected override void OnActivate()
  81. {
  82. base.OnActivate();
  83. DefaultUnit = (string)QueryDataClient.Instance.Service.GetConfig("APC.PressureUnit");
  84. }
  85. private void InitTree()
  86. {
  87. var node = SystemConfigProvider.Instance.GetConfigTree(SystemName).SubNodes;
  88. ParameterTree.Add(new ParamBase() { ID = 1, ParentID = 0, Name = "StepTime", ConfigName = "StepTime" });
  89. ParameterTree.Add(new ParamBase() { ID = 2, ParentID = 0, Name = "TempSetting", ConfigName = "TempSetting" });
  90. ParameterTree.Add(new ParamBase() { ID = 3, ParentID = 0, Name = "WaferCycleTime", ConfigName = "WaferCycleTime" });
  91. ParameterTree = this.LoadTreeView(0);
  92. }
  93. private List<ParamBase> LoadTreeView(int id)
  94. {
  95. List<ParamBase> node = ParameterTree.FindAll(s => s.ParentID.Equals(id));
  96. foreach (var item in node)
  97. {
  98. item.Children = LoadTreeView(item.ID);
  99. }
  100. return node;
  101. }
  102. public void HideAllCanvas()
  103. {
  104. var view = GetView() as MainParameterEditView;
  105. view.StepTime.Visibility = Visibility.Hidden;
  106. view.TempSetting.Visibility = Visibility.Hidden;
  107. view.WaferCycleTime.Visibility = Visibility.Hidden;
  108. }
  109. public void TreeViewSelectedItemChanged(object obj)
  110. {
  111. valueList.Clear();
  112. LevelOneNode = LevelTwoNode = new ConfigNode();
  113. HideAllCanvas();
  114. var view = GetView() as MainParameterEditView;
  115. ParamBase para = obj as ParamBase;
  116. string strHeader = "PM1.RecipeEditParameter";
  117. Canvas canvas = null;
  118. if (para.ConfigName == "WaferCycleTime")
  119. strHeader = "PM1";
  120. LevelOneNode = FindNodeByName(_rootNode, $"{strHeader}.{para.ConfigName}");
  121. LevelTwoNode = LevelOneNode.SubNodes.FirstOrDefault();
  122. switch (para.ConfigName)
  123. {
  124. case "StepTime":
  125. canvas = view.StepTime;
  126. break;
  127. case "TempSetting":
  128. canvas = view.TempSetting;
  129. InitItemsCurrentValue(LevelOneNode);
  130. if (LevelOneNode.SubNodes.Where(x => x.TempSttingBoolValue == true).Count() <= 0)
  131. {
  132. LevelOneNode.SubNodes[0].TempSttingBoolValue = true;
  133. }
  134. break;
  135. case "WaferCycleTime":
  136. canvas = view.WaferCycleTime;
  137. break;
  138. }
  139. if (canvas == null) return;
  140. canvas.Visibility = Visibility.Visible;
  141. this.GetHeaderConfig();
  142. if (LevelTwoNode == null)
  143. {
  144. InitItemsCurrentValue(LevelOneNode, false);
  145. }
  146. else
  147. {
  148. InitItemsCurrentValue(LevelTwoNode, true);
  149. ConfigNode subNode = LevelTwoNode.SubNodes.FirstOrDefault();
  150. if (subNode != null) InitItemsCurrentValue(subNode, true);
  151. }
  152. }
  153. private void InitItemsCurrentValue(ConfigNode node, bool initSubItems = true)
  154. {
  155. if (node == null) return;
  156. CurrenItems = node.Items;
  157. _CurrentNodeName = string.IsNullOrEmpty(node.Path) ? node.Name : $"{node.Path}.{node.Name}";
  158. if (CurrenItems == null || CurrenItems.Count <= 0)
  159. {
  160. if (!initSubItems) return;
  161. foreach (var item in node.SubNodes)
  162. {
  163. InitItemsCurrentValue(item);
  164. }
  165. }
  166. else
  167. {
  168. GetDataOfConfigItems();
  169. }
  170. }
  171. private void GetDataOfConfigItems()
  172. {
  173. if (CurrenItems == null)
  174. return;
  175. for (int i = 0; i < CurrenItems.Count; i++)
  176. {
  177. var isInstalled = QueryDataClient.Instance.Service.GetConfig($"PM1.MFC.{CurrenItems[i].Name}.IsMFCInstalled");
  178. if (isInstalled != null && !(bool)isInstalled)
  179. CurrenItems[i].Visible = false;
  180. else
  181. CurrenItems[i].Visible = true;
  182. string key = String.Format("{0}{1}{2}", _CurrentNodeName, ".", CurrenItems[i].Name);
  183. CurrenItems[i].CurrentValue = SystemConfigProvider.Instance.GetValueByName(key);
  184. CurrenItems[i].Path = key;
  185. if (CurrenItems[i].Type == DataType.Bool)
  186. {
  187. bool value;
  188. if (bool.TryParse(CurrenItems[i].CurrentValue, out value))
  189. {
  190. CurrenItems[i].BoolValue = value;
  191. CurrenItems[i].CurrentValue = value ? "Yes" : "No";
  192. }
  193. }
  194. else
  195. CurrenItems[i].StringValue = CurrenItems[i].CurrentValue;
  196. }
  197. }
  198. public void MenuCommand(object obj, object menuLevel)
  199. {
  200. RadioButton radioButton = obj as RadioButton;
  201. ConfigNode currentNode = null;
  202. switch (menuLevel.ToString())
  203. {
  204. case "LevelOne":
  205. currentNode = LevelTwoNode = LevelOneNode.SubNodes.Find((x) => x.Name == radioButton.ToolTip.ToString());
  206. break;
  207. case "LevelTwo":
  208. currentNode = LevelTwoNode.SubNodes.Find((x) => x.Name == radioButton.ToolTip.ToString());
  209. break;
  210. }
  211. InitItemsCurrentValue(currentNode);
  212. }
  213. public void SetValue(object obj)
  214. {
  215. var CurrentRecipes = CurrentRecipe;
  216. if (CurrenItems == null || currenItems.Count == 0) return;
  217. ConfigItem item = null;
  218. if (obj is Control)
  219. item = CurrenItems.Find((x) => x.Name == (obj as Control).ToolTip.ToString());
  220. else
  221. item = obj as ConfigItem;
  222. InputDialogViewModel dialog = new InputDialogViewModel();
  223. dialog.Item = item;
  224. dialog.DisplayName = "Set Value";
  225. WindowManager wm = new WindowManager();
  226. bool? bret = wm.ShowDialog(dialog);
  227. if ((bool)bret)
  228. {
  229. item.StringValue = dialog.DialogResult;
  230. //key :System.IsSimulatorMode
  231. //value: true or false 都是字符串
  232. //input check
  233. string value;
  234. if (item.Type == DataType.Bool)
  235. {
  236. if (item.StringValue.Equals("Yes", StringComparison.CurrentCultureIgnoreCase))
  237. item.BoolValue = true;
  238. else if (item.StringValue.Equals("No", StringComparison.CurrentCultureIgnoreCase))
  239. item.BoolValue = false;
  240. else
  241. {
  242. DialogBox.ShowWarning("The Value Should be Yes Or No.");
  243. return;
  244. }
  245. value = item.BoolValue.ToString().ToLower();
  246. }
  247. else
  248. {
  249. if (item.Type == DataType.Int)
  250. {
  251. int iValue;
  252. if (int.TryParse(item.StringValue, out iValue))
  253. {
  254. if (!double.IsNaN(item.Max) && !double.IsNaN(item.Min))
  255. {
  256. if (iValue > item.Max || iValue < item.Min)
  257. {
  258. DialogBox.ShowWarning(string.Format("The value should be between {0} and {1}.", ((int)item.Min).ToString(), ((int)item.Max).ToString()));
  259. return;
  260. }
  261. }
  262. }
  263. else
  264. {
  265. DialogBox.ShowWarning("Please input valid data.");
  266. return;
  267. }
  268. value = item.StringValue;
  269. }
  270. else if (item.Type == DataType.Double)
  271. {
  272. double fValue;
  273. if (double.TryParse(item.StringValue, out fValue))
  274. {
  275. if (!double.IsNaN(item.Max) && !double.IsNaN(item.Min))
  276. {
  277. if (fValue > item.Max || fValue < item.Min)
  278. {
  279. DialogBox.ShowWarning(string.Format("The value should be between {0} and {1}.", item.Min.ToString(), item.Max.ToString()));
  280. return;
  281. }
  282. string[] box = fValue.ToString().Split('.');
  283. if (box.Length > 1 && box[1].Length > 3)
  284. {
  285. DialogBox.ShowWarning(string.Format("The value should be more than three decimal places"));
  286. return;
  287. }
  288. }
  289. }
  290. else
  291. {
  292. DialogBox.ShowWarning("Please input valid data.");
  293. return;
  294. }
  295. value = item.StringValue;
  296. }
  297. else
  298. value = item.StringValue;
  299. }
  300. string key = String.Format("{0}{1}{2}", _CurrentNodeName, ".", item.Name);
  301. path = item.Path;
  302. currentValue = value;
  303. valueList.Add(new PageValue() { Path = path, CurrentValue = currentValue });
  304. }
  305. }
  306. public void SaveParameter()
  307. {
  308. foreach (var item in valueList)
  309. {
  310. InvokeClient.Instance.Service.DoOperation($"{SystemName}.SetConfig", item.Path, item.CurrentValue);
  311. }
  312. }
  313. public void GetHeaderConfig()
  314. {
  315. HeadLst.Clear();
  316. for (int i = 0; i < 10; i++)
  317. {
  318. if (i % 2 != 0)
  319. {
  320. var configHeater = (string)QueryDataClient.Instance.Service.GetConfig($"PM1.Heater.Heater{i}.DisplayName");
  321. TempSetData item = new TempSetData(configHeater);
  322. item.SetValue.Value = configHeater;
  323. HeadLst.Add(item);
  324. }
  325. }
  326. }
  327. private ConfigNode FindNodeByName(ConfigNode parentNode, string strName)
  328. {
  329. string strCates = strName.Split('.')[0];
  330. ConfigNode node = parentNode.SubNodes.Find((x) => x.Name == strCates);
  331. if (node == null)
  332. return parentNode;
  333. else
  334. return FindNodeByName(node, strName.Replace(strCates + ".", ""));
  335. }
  336. }
  337. public class ParamBase
  338. {
  339. public int ID { get; set; }
  340. public string Name { get; set; }
  341. public int ParentID { get; set; }
  342. public string ConfigName { get; set; }
  343. public List<ParamBase> Children { get; set; }
  344. public ParamBase()
  345. {
  346. Children = new List<ParamBase>();
  347. }
  348. }
  349. public class ParameterConvert : IValueConverter
  350. {
  351. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  352. {
  353. return value.ToString().Replace("Table", "").Replace("LineNo", "");
  354. }
  355. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  356. {
  357. throw new NotImplementedException();
  358. }
  359. }
  360. }