APCPIDEditViewModel.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. using Aitex.Core.RT.SCCore;
  2. using Caliburn.Micro;
  3. using Caliburn.Micro.Core;
  4. using MECF.Framework.Common.DataCenter;
  5. using MECF.Framework.Common.OperationCenter;
  6. using MECF.Framework.Common.RecipeCenter;
  7. using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig;
  8. using MECF.Framework.UI.Client.CenterViews.Dialogs;
  9. using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
  10. using MECF.Framework.UI.Client.ClientBase;
  11. using OpenSEMI.ClientBase;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Collections.ObjectModel;
  15. using System.IO;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Windows;
  19. //using System.Windows.Forms;
  20. using System.Windows.Controls;
  21. using FurnaceUI.Client;
  22. using FurnaceUI.Models;
  23. using FurnaceUI.Views.Editors;
  24. using Aitex.Core.Util;
  25. using Aitex.Core.Common.DeviceData;
  26. using MECF.Framework.UI.Client.CenterViews.Parameter;
  27. using MECF.Framework.Common.ParameterCenter;
  28. using RecipeEditorLib.RecipeModel.Params;
  29. namespace FurnaceUI.Views.Parameter
  30. {
  31. public class APCPIDEditViewModel : FurnaceUIViewModelBase
  32. {
  33. private UIElement _parent;
  34. private bool _isEditEnabled = true;
  35. public bool IsEditEnabled
  36. {
  37. get => _isEditEnabled&&(this.Permission==3);
  38. set
  39. {
  40. _isEditEnabled = value;
  41. NotifyOfPropertyChange(nameof(IsEditEnabled));
  42. }
  43. }
  44. public void SetParent(UIElement parent)
  45. {
  46. _parent = parent;
  47. }
  48. private string _fileName = "";
  49. public string FileName
  50. {
  51. get => _fileName;
  52. set
  53. {
  54. _fileName = value;
  55. NotifyOfPropertyChange(nameof(FileName));
  56. }
  57. }
  58. public string RetrunString { get; set; } = "";
  59. private readonly ParameterProvider _parameterProvider = new ParameterProvider();
  60. private Dictionary<string, ObservableCollection<ParameterTemplateColumnBase>> ParameterTemplate;
  61. public APCPIDParameterData CurrentParameter { get; set; } = new APCPIDParameterData();
  62. private ParameterFormatBuilder _columnBuilder = new ParameterFormatBuilder();
  63. private APCPIDTable _selectedParameterStep;
  64. public APCPIDTable SelectedParameterStep
  65. {
  66. get => _selectedParameterStep;
  67. set
  68. {
  69. if (value != null)
  70. {
  71. _selectedParameterStep = value;
  72. NotifyOfPropertyChange("SelectedParameterStep");
  73. }
  74. else
  75. {
  76. _selectedParameterStep = null;
  77. NotifyOfPropertyChange("SelectedParameterStep");
  78. }
  79. }
  80. }
  81. private int _IndexNoDefault = -1;
  82. public int IndexNoDefault
  83. {
  84. get { return _IndexNoDefault; }
  85. set
  86. {
  87. _IndexNoDefault = value;
  88. NotifyOfPropertyChange("IndexNoDefault");
  89. }
  90. }
  91. private bool _appendStepItemIsEnabled;
  92. public bool AppendStepItemIsEnabled
  93. {
  94. get => _appendStepItemIsEnabled;
  95. set
  96. {
  97. _appendStepItemIsEnabled = value;
  98. NotifyOfPropertyChange("AppendStepItemIsEnabled");
  99. }
  100. }
  101. private bool _overWriteCopyIsEnabled;
  102. public bool OverWriteCopyIsEnabled
  103. {
  104. get => _overWriteCopyIsEnabled;
  105. set
  106. {
  107. _overWriteCopyIsEnabled = value;
  108. NotifyOfPropertyChange("OverWriteCopyIsEnabled");
  109. }
  110. }
  111. private bool _insertCopyIsEnabled;
  112. public bool InsertCopyIsEnabled
  113. {
  114. get => _insertCopyIsEnabled;
  115. set
  116. {
  117. _insertCopyIsEnabled = value;
  118. NotifyOfPropertyChange("InsertCopyIsEnabled");
  119. }
  120. }
  121. private bool _prevStepOverwriteIsEnabled;
  122. public bool PrevStepOverwriteIsEnabled
  123. {
  124. get => _prevStepOverwriteIsEnabled;
  125. set
  126. {
  127. _prevStepOverwriteIsEnabled = value;
  128. NotifyOfPropertyChange("PrevStepOverwriteIsEnabled");
  129. }
  130. }
  131. private bool _prevStepInsertIsEnabled;
  132. public bool PrevStepInsertIsEnabled
  133. {
  134. get => _prevStepInsertIsEnabled;
  135. set
  136. {
  137. _prevStepInsertIsEnabled = value;
  138. NotifyOfPropertyChange("PrevStepInsertIsEnabled");
  139. }
  140. }
  141. private bool _DownloadEnable = true;
  142. public bool DownloadEnable
  143. {
  144. get => _DownloadEnable&&(this.Permission==3);
  145. set
  146. {
  147. _DownloadEnable = value;
  148. NotifyOfPropertyChange(nameof(DownloadEnable));
  149. }
  150. }
  151. private bool _prevStepItemIsEnabled;
  152. public bool PrevStepItemIsEnabled
  153. {
  154. get => _prevStepItemIsEnabled;
  155. set
  156. {
  157. _prevStepItemIsEnabled = value;
  158. NotifyOfPropertyChange("PrevStepItemIsEnabled");
  159. }
  160. }
  161. private bool _currStepDeleteIsEnabled;
  162. public bool CurrStepDeleteIsEnabled
  163. {
  164. get => _currStepDeleteIsEnabled;
  165. set
  166. {
  167. _currStepDeleteIsEnabled = value;
  168. NotifyOfPropertyChange("CurrStepDeleteIsEnabled");
  169. }
  170. }
  171. private bool _multStepsDeleteIsEnabled;
  172. public bool MultStepsDeleteIsEnabled
  173. {
  174. get => _multStepsDeleteIsEnabled;
  175. set
  176. {
  177. _multStepsDeleteIsEnabled = value;
  178. NotifyOfPropertyChange("MultStepsDeleteIsEnabled");
  179. }
  180. }
  181. private bool _settingButtonEnable;
  182. public bool SettingButtonEnable
  183. {
  184. get => _settingButtonEnable;
  185. set
  186. {
  187. _settingButtonEnable = value;
  188. NotifyOfPropertyChange("SettingButtonEnable");
  189. }
  190. }
  191. private string _eventSetting;
  192. public string EventSetting
  193. {
  194. get => _eventSetting;
  195. set
  196. {
  197. _eventSetting = value;
  198. NotifyOfPropertyChange("EventSetting");
  199. }
  200. }
  201. public bool IsEnable => CGlobal.ParameterEditViewEnable;//是否是View模式
  202. public string EditRecipeStepName { get; set; }
  203. public void SetCmdIsEnabled()
  204. {
  205. if (CurrentParameter.Steps == null || CurrentParameter.Steps.Count == 0)
  206. {
  207. SelectedStepName = "";
  208. SelectedParameterStep = null;
  209. AppendStepItemIsEnabled = true;
  210. OverWriteCopyIsEnabled = false;
  211. InsertCopyIsEnabled = false;
  212. PrevStepOverwriteIsEnabled = false;
  213. PrevStepInsertIsEnabled = false;
  214. PrevStepItemIsEnabled = false;
  215. CurrStepDeleteIsEnabled = false;
  216. MultStepsDeleteIsEnabled = false;
  217. SettingButtonEnable = false;
  218. }
  219. }
  220. public int SelectedStepNo { get; set; }
  221. private string _selectedStepName;
  222. public string SelectedStepName
  223. {
  224. get
  225. {
  226. return _selectedStepName;
  227. }
  228. set
  229. {
  230. _selectedStepName = value;
  231. NotifyOfPropertyChange("SelectedStepName");
  232. }
  233. }
  234. private List<ConfigNode> _ConfigNodes = new List<ConfigNode>();
  235. public List<ConfigNode> ConfigNodes
  236. {
  237. get { return _ConfigNodes; }
  238. set { _ConfigNodes = value; NotifyOfPropertyChange("ConfigNodes"); }
  239. }
  240. private Step _selectedRecipeStep;
  241. public Step SelectedRecipeStep
  242. {
  243. get => _selectedRecipeStep;
  244. set
  245. {
  246. _selectedRecipeStep = value;
  247. NotifyOfPropertyChange("SelectedRecipeStep");
  248. }
  249. }
  250. private RecipeDataBase _CurrentRecipe;
  251. public RecipeDataBase CurrentRecipe
  252. {
  253. get { return _CurrentRecipe; }
  254. set { _CurrentRecipe = value; this.NotifyOfPropertyChange(nameof(CurrentRecipe)); }
  255. }
  256. public string FullFileName { get; set; }
  257. public string ParameterType { get; set; }
  258. public APCPIDEditViewModel()
  259. {
  260. string prefix = "Parameter\\APCPID";
  261. _parameterProvider.GetParameterFormatXml(prefix);
  262. ParameterTemplate = _parameterProvider.GetGroupParameterTemplate();
  263. _columnBuilder.Build(prefix);
  264. CurrentParameter.PrefixPath = prefix;
  265. }
  266. public APCPIDEditViewModel(string strPrefixPath, string strRecipeName, string permission = "")
  267. {
  268. _parameterProvider.GetParameterFormatXml(strPrefixPath);
  269. ParameterTemplate = _parameterProvider.GetGroupParameterTemplate();
  270. _columnBuilder.Build(strPrefixPath);
  271. CurrentParameter.PrefixPath = strPrefixPath;
  272. CurrentParameter.Name = strRecipeName;
  273. CurrentParameter.Permission = permission;
  274. FileName = $"{strPrefixPath}\\{strRecipeName}";
  275. }
  276. protected override void OnViewLoaded(object view)
  277. {
  278. base.OnViewLoaded(view);
  279. }
  280. protected override void OnActivate()
  281. {
  282. base.OnActivate();
  283. //InvokeClient.Instance.Service.DoOperation($"PM1.SetSensorRecipeOK", "");
  284. }
  285. protected override void OnDeactivate(bool close)
  286. {
  287. base.OnDeactivate(close);
  288. InvokeClient.Instance.Service.DoOperation($"PM1.SetSensorPROCManualOK", "");
  289. }
  290. protected override void OnInitialize()
  291. {
  292. base.OnInitialize();
  293. // GetHeaderConfig();
  294. LoadData();
  295. LoadViewData();
  296. SetCmdIsEnabled();
  297. }
  298. private void LoadData()
  299. {
  300. if (CurrentRecipe != null)
  301. {
  302. CurrentParameter.PrefixPath = $"Parameter\\APCPID";
  303. StringParam pressAPC = CurrentRecipe.ConfigItems.FirstOrDefault(x => x.Name == "Combination.PressAPCPID") as StringParam;
  304. if (pressAPC != null && !string.IsNullOrEmpty(pressAPC.Value))
  305. {
  306. CurrentParameter.Permission = "";
  307. CurrentParameter.Name = pressAPC.Value;
  308. }
  309. else
  310. {
  311. if (CurrentParameter.Steps != null && CurrentParameter.Steps.Count > 0)
  312. {
  313. foreach (var item in CurrentParameter.Steps)
  314. {
  315. var apcPID = (APCPIDTable)item;
  316. apcPID.P.Value = "0";
  317. apcPID.I.Value = "0";
  318. apcPID.D.Value = "0";
  319. apcPID.A.Value = "0";
  320. apcPID.Offset.Value = "0";
  321. apcPID.CH.Value = "0";
  322. apcPID.CL.Value = "0";
  323. }
  324. }
  325. CurrentParameter.Name = "";
  326. CurrentParameter.SlowVacP.Value = "0";
  327. FullFileName = "";
  328. DialogBox.ShowDialog(DialogButton.Cancel, DialogType.INFO, "Please set the Combination default APC PID file!");
  329. return;
  330. }
  331. FullFileName = $"{CurrentParameter.PrefixPath}\\{CurrentParameter.Name}";
  332. }
  333. else
  334. {
  335. CurrentParameter.TableNumber = _columnBuilder.TableNumber;
  336. CurrentParameter.ChamberType = _columnBuilder.ChamberType;
  337. FullFileName = $"{CurrentParameter.PrefixPath}\\{CurrentParameter.Name}";
  338. }
  339. var recipeContent = _parameterProvider.LoadParameter(CurrentParameter.PrefixPath, CurrentParameter.Name);
  340. if (string.IsNullOrEmpty(recipeContent))
  341. {
  342. System.Windows.MessageBox.Show($"{CurrentParameter.PrefixPath}\\{CurrentParameter.Name} is empty, please confirm the file is valid.");
  343. return;
  344. }
  345. CurrentParameter.InitData(CurrentParameter.PrefixPath, CurrentParameter.Name, recipeContent, "");
  346. }
  347. private void LoadViewData()
  348. {
  349. if (CurrentParameter.Steps != null && CurrentParameter.Steps.Count > 0)
  350. {
  351. SelectedStepName = CurrentParameter.Steps[0].Name;
  352. SelectedStepNo = CurrentParameter.Steps[0].StepNo;
  353. SelectTable(CurrentParameter.Steps[0]);
  354. }
  355. }
  356. private void RecipeGasPanelSettingViewModel_ChangedStepEvent(Step step)
  357. {
  358. SelectTable(step);
  359. IndexNoDefault = step.StepNo - 1;
  360. }
  361. public void SelectTable(object step)
  362. {
  363. if (step != null && step is APCPIDTable step1)
  364. {
  365. var SelectedStep = this.CurrentParameter.Steps.Where(x => x.StepNo == step1.StepNo).FirstOrDefault();
  366. SelectedStep.IsChecked = true;
  367. SelectedStepNo = step1.StepNo;
  368. string strName = step1.Name.Trim();
  369. SelectedStepName = strName;
  370. SelectedParameterStep = (APCPIDTable)SelectedStep;
  371. }
  372. SetCmdIsEnabled();
  373. }
  374. public void StepEdit(string stepEditCmd)
  375. {
  376. var windowManager = IoC.Get<IWindowManager>();
  377. switch (stepEditCmd)
  378. {
  379. case "Append":
  380. CurrentParameter.Steps.Add(CurrentParameter.CreateStep());
  381. int TempSelectIndex = 0;
  382. IndexNoDefault = TempSelectIndex;
  383. SelectTable(CurrentParameter.Steps[TempSelectIndex]);
  384. break;
  385. case "InsertCopy":
  386. InsertCopyStep();
  387. break;
  388. case "OverWrite"://任何步骤的内容都可以覆盖到选定的步骤中
  389. OverWriteStep();
  390. break;
  391. case "PrevStepOverwrite"://用上一步的内容覆盖所选步骤
  392. PrevStepOverwriteStep();
  393. break;
  394. case "PrevStepInsert"://在选定步骤之前,插入带有前一步内容的新步骤。
  395. InsertPrevStep();
  396. break;
  397. case "PrevStepItem":
  398. break;
  399. case "MultStepsDelete":
  400. break;
  401. default:
  402. break;
  403. }
  404. }
  405. private void OverWriteStep()
  406. {
  407. var windowManager = IoC.Get<IWindowManager>();
  408. if (CurrentParameter == null) return;
  409. }
  410. private void PrevStepOverwriteStep()
  411. {
  412. int index = -1;
  413. index = SelectedParameterStep.StepNo;
  414. if (index > 1)
  415. {
  416. CurrentParameter.CloneStep(CurrentParameter.Steps.Where(x => x.StepNo == SelectedParameterStep.StepNo).FirstOrDefault(), CurrentParameter.Steps.Where(x => x.StepNo == SelectedParameterStep.StepNo - 1).FirstOrDefault());
  417. }
  418. }
  419. public void InsertPrevStep()
  420. {
  421. }
  422. public void InsertCopyStep()
  423. {
  424. var windowManager = IoC.Get<IWindowManager>();
  425. if (CurrentParameter == null) return;
  426. }
  427. //撤销修改
  428. public void RecipeIsChangeClick(object cmdName, object value)
  429. {
  430. var windowManager = IoC.Get<IWindowManager>();
  431. }
  432. public void TempSetClick(object sender)
  433. {
  434. string stSetValue = ShowNumberKeyboard(sender as Button, "");
  435. }
  436. public void RampSetClick(object sender)
  437. {
  438. string strSetRamp = ShowNumberKeyboard(sender as Button, "");
  439. }
  440. private string ShowNumberKeyboard(Control control, string defaultValue)
  441. {
  442. NumberKeyboard numberKeyboard = new NumberKeyboard("", defaultValue);
  443. var point = control.PointFromScreen(new Point(0, 0));
  444. double wx = SystemParameters.WorkArea.Width;
  445. double hy = SystemParameters.WorkArea.Height;
  446. if (-point.Y + control.ActualHeight + 5 + numberKeyboard.Height < hy)
  447. {
  448. numberKeyboard.Top = -point.Y + control.ActualHeight + 5;
  449. }
  450. else
  451. {
  452. numberKeyboard.Top = -point.Y - numberKeyboard.Height - 5;
  453. }
  454. if (-point.X + numberKeyboard.Width < wx)
  455. {
  456. numberKeyboard.Left = -point.X;
  457. }
  458. else
  459. {
  460. numberKeyboard.Left = -point.X - (numberKeyboard.Width - control.ActualWidth);
  461. }
  462. if ((bool)numberKeyboard.ShowDialog())
  463. return numberKeyboard.ValueString;
  464. else
  465. return "Cancel";
  466. }
  467. public void TempTextClick(string type, object sender)
  468. {
  469. var windowManager = IoC.Get<IWindowManager>();
  470. switch (type)
  471. {
  472. case "Mode":
  473. RecipeTempModeViewModel recipeTempModeViewModel = new RecipeTempModeViewModel();
  474. var rtn = (windowManager as WindowManager)?.ShowDialogWithTitle(recipeTempModeViewModel, null, "Temp Mode");
  475. break;
  476. case "Correct":
  477. TempOffsetTableViewModel tempOffsetTableViewModel = new TempOffsetTableViewModel();
  478. break;
  479. case "PID":
  480. TempOffsetTableViewModel tempOffsetTableViewModel1 = new TempOffsetTableViewModel();
  481. break;
  482. default:
  483. break;
  484. }
  485. }
  486. public void TempTextChanged(string type, object sender, object item)
  487. {
  488. if (!string.IsNullOrEmpty(type) && item != null && sender != null)
  489. {
  490. TempSetData tempData = (TempSetData)item;
  491. string value = ((TextBox)sender).Text;
  492. int stepNo = SelectedParameterStep.StepNo;
  493. var step = CurrentParameter.Steps.Where(x => x.StepNo == stepNo).FirstOrDefault();
  494. }
  495. }
  496. public void ParameterSave()
  497. {
  498. if (IsEditEnabled)
  499. {
  500. var SelectedStep = this.CurrentParameter.Steps.Where(x => x.StepNo == SelectedStepNo).FirstOrDefault();
  501. //RecipePermissionSelectViewModel dialog = new RecipePermissionSelectViewModel("Save recipe and permission", CurrentRecipe.RecipePermission);
  502. //WindowManager wm = new WindowManager();
  503. //bool? dialogReturn = wm.ShowDialog(dialog);
  504. //if (!dialogReturn.HasValue || !dialogReturn.Value)
  505. // return;
  506. List<string> names = new List<string>();
  507. string filmFormula = string.Empty;
  508. ParameterTable step = CurrentParameter.Steps.Where(x => x.StepNo == SelectedParameterStep.StepNo).FirstOrDefault();
  509. this.CurrentParameter.Revisor = BaseApp.Instance.UserContext.LoginName;
  510. this.CurrentParameter.ReviseTime = DateTime.Now;
  511. this.CurrentParameter.Level = this.LevelDisplay;
  512. //this.CurrentRecipe.RecipePermission = dialog.RecipePermission;
  513. var result = this._parameterProvider.SaveParameter(CurrentParameter.PrefixPath, CurrentParameter.Name, CurrentParameter.GetXmlString());
  514. if (result)
  515. ((Window)GetView()).Close();
  516. }
  517. else
  518. {
  519. var step = CurrentParameter.Steps.FirstOrDefault(x => x.IsChecked);
  520. RetrunString = $"{FullFileName},{step.StepNo},{step.Name}";
  521. ((Window)GetView()).DialogResult = true;
  522. }
  523. }
  524. public void SetValue(object sender, string isFullKeyboard = "")
  525. {
  526. string value = ((TextBox)sender).Text;
  527. if (!string.IsNullOrEmpty(isFullKeyboard))
  528. {
  529. FullKeyboard fullKeyboard1 = new FullKeyboard("", value);
  530. if ((bool)fullKeyboard1.ShowDialog())
  531. {
  532. ((TextBox)sender).Text = fullKeyboard1.ValueString;
  533. }
  534. }
  535. else
  536. {
  537. NumberKeyboard fullKeyboard = new NumberKeyboard("", value);
  538. if ((bool)fullKeyboard.ShowDialog())
  539. {
  540. ((TextBox)sender).Text = fullKeyboard.ValueString;
  541. }
  542. }
  543. }
  544. public void ParameterDownload()
  545. {
  546. if (DialogButton.No == DialogBox.ShowDialog(DialogButton.Yes | DialogButton.No,
  547. DialogType.CONFIRM,
  548. $"Confirm the issuance of PID data for the current step?"))
  549. {
  550. return;
  551. }
  552. var step = CurrentParameter.Steps.FirstOrDefault(x => x.IsChecked);
  553. InvokeClient.Instance.Service.DoOperation($"PM1.APC.SetPID", $"{FullFileName}", step.StepNo);
  554. }
  555. public void ParameterUnload()
  556. {
  557. if (DialogButton.No == DialogBox.ShowDialog(DialogButton.Yes | DialogButton.No,
  558. DialogType.CONFIRM,
  559. $"Read PID data to UI? Please save!"))
  560. {
  561. return;
  562. }
  563. DownloadEnable = false;
  564. InvokeClient.Instance.Service.DoOperation("PM1.APC.GetAllPIDFileInfo");
  565. var allAPCPID = (Dictionary<string, Dictionary<string, string>>)QueryDataClient.Instance.Service.GetData("PM1.APC.AllPIDFileInfo");
  566. if (allAPCPID != null && allAPCPID.Count > 0)
  567. {
  568. foreach (var item in CurrentParameter.Steps)
  569. {
  570. if (allAPCPID.TryGetValue(item.StepNo.ToString(), out var dataItem))
  571. {
  572. ((APCPIDTable)item).P.SetValue(dataItem["P"]);
  573. ((APCPIDTable)item).I.SetValue(dataItem["I"]);
  574. ((APCPIDTable)item).D.SetValue(dataItem["D"]);
  575. ((APCPIDTable)item).A.SetValue(dataItem["A"]);
  576. ((APCPIDTable)item).CH.SetValue(dataItem["CH"]);
  577. ((APCPIDTable)item).CL.SetValue(dataItem["CL"]);
  578. ((APCPIDTable)item).Offset.SetValue(dataItem["Offset"]);
  579. }
  580. }
  581. CurrentParameter.SlowVacP.SetValue(allAPCPID.LastOrDefault().Value["P"]);
  582. CurrentParameter.SlowVacI.SetValue(allAPCPID.LastOrDefault().Value["I"]);
  583. CurrentParameter.SlowVacD.SetValue(allAPCPID.LastOrDefault().Value["D"]);
  584. CurrentParameter.SlowVacA.SetValue(allAPCPID.LastOrDefault().Value["A"]);
  585. }
  586. }
  587. public void ParameterCancel()
  588. {
  589. if (DialogBox.ShowDialog(DialogButton.Yes | DialogButton.No, DialogType.CONFIRM, " You confirm that you want to unsave the recipe and exit the interface?") == DialogButton.No)
  590. return;
  591. ((Window)GetView()).Close();
  592. }
  593. protected override void InvokeAfterUpdateProperty(Dictionary<string, object> data)
  594. {
  595. base.InvokeAfterUpdateProperty(data);
  596. if (CurrentParameter.Steps != null && CurrentParameter.Steps.Count > 0 && CheckValueChange(data))
  597. {
  598. //SelectStep(CurrentRecipe.Steps[EditRecipeStepNo]);
  599. }
  600. oldresult = data;
  601. }
  602. Dictionary<string, object> oldresult;
  603. private bool CheckValueChange(Dictionary<string, object> result)
  604. {
  605. Dictionary<string, object> temp = result;
  606. if (oldresult == null)
  607. {
  608. oldresult = result;
  609. return true;
  610. }
  611. else
  612. {
  613. List<string> strkeys = new List<string>();
  614. foreach (var key in result.Keys)
  615. {
  616. if (_subscribedKeys.Contains(key) && oldresult.ContainsKey(key) && result.ContainsKey(key))
  617. {
  618. if (result[key].GetType() == typeof(AITValveData) && ((AITValveData)oldresult[key]).VirtualFeedback != ((AITValveData)result[key]).VirtualFeedback)
  619. {
  620. return true;
  621. }
  622. else if (result[key].GetType() == typeof(AITMfcData) && ((AITMfcData)oldresult[key]).VirtualSetPoint != ((AITMfcData)result[key]).VirtualSetPoint)
  623. {
  624. return true;
  625. }
  626. else if (result[key].GetType() == typeof(bool) && (bool)oldresult[key] != (bool)result[key])
  627. {
  628. return true;
  629. }
  630. }
  631. }
  632. }
  633. return false;
  634. }
  635. }
  636. }