| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832 | using Aitex.Core.Util;using Caliburn.Micro;using MECF.Framework.Common.IOCore;using MECF.Framework.Common.DataCenter;using MECF.Framework.Common.OperationCenter;using OpenSEMI.ClientBase;using Caliburn.Micro.Core;using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Linq;using System.Windows;using System.Xml;using System.Windows.Media;using MECF.Framework.Common.CommonData;using Aitex.Core.RT.Log;using FurnaceUI.Models;namespace FurnaceUI.Views.Operations{    public class InterlockViewModel : FurnaceModuleUIViewModelBase    {        public bool IsPermission { get => this.Permission == 3; }        private ObservableCollection<InterlockBase> _interlockTreePM = new ObservableCollection<InterlockBase>();        public ObservableCollection<InterlockBase> InterlockTreePM        {            get => _interlockTreePM;            set            {                _interlockTreePM = value;                NotifyOfPropertyChange(nameof(InterlockTreePM));            }        }        private SolidColorBrush _greenFill = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF07FF07"));        private SolidColorBrush _redFill = new SolidColorBrush(Colors.Red);        private SolidColorBrush _grayFill = new SolidColorBrush(Colors.Gray);        private ObservableCollection<InterlockBase> _interlockTreeEdit = new ObservableCollection<InterlockBase>();        public ObservableCollection<InterlockBase> InterlockTreeEdit        {            get => _interlockTreeEdit;            set            {                _interlockTreeEdit = value;                NotifyOfPropertyChange(nameof(InterlockTreeEdit));            }        }        public InterlockBase CurrentInterlock = new InterlockBase();        public ObservableCollection<InterlockLimit> InterlockLimits { get; set; } = new ObservableCollection<InterlockLimit>();        private int _interlockLimitsSelectIndex;        public int InterlockLimitSelectIndex        {            get => _interlockLimitsSelectIndex;            set            {                _interlockLimitsSelectIndex = value;                NotifyOfPropertyChange(nameof(InterlockLimitSelectIndex));            }        }        private bool _isShowInterlockPM = true;        public bool IsShowInterlockPM        {            get => _isShowInterlockPM;            set            {                _isShowInterlockPM = value;                NotifyOfPropertyChange(nameof(IsShowInterlockPM));            }        }        private bool _isShowInterlockEdit = false;        public bool IsShowInterlockEdit        {            get => _isShowInterlockEdit;            set            {                _isShowInterlockEdit = value;                NotifyOfPropertyChange(nameof(IsShowInterlockEdit));            }        }        private bool _isShowInterlockEditDetail = false;        public bool IsShowInterlockEditDetail        {            get => _isShowInterlockEditDetail;            set            {                _isShowInterlockEditDetail = value;                NotifyOfPropertyChange(nameof(IsShowInterlockEditDetail));            }        }        private List<string> _interlockEditAction = new List<string>();        public List<string> InterlockEditAction        {            get => _interlockEditAction;            set            {                _interlockEditAction = value;                NotifyOfPropertyChange(nameof(InterlockEditAction));            }        }        private string _interlockEditActionSelect;        public string InterLockEditActionSelect        {            get => _interlockEditActionSelect;            set            {                _interlockEditActionSelect = value;                NotifyOfPropertyChange(nameof(InterLockEditActionSelect));            }        }        private List<string> _interlockEditLimit = new List<string>();        public List<string> InterlockEditLimit        {            get => _interlockEditLimit;            set            {                _interlockEditLimit = value;                NotifyOfPropertyChange(nameof(InterlockEditLimit));            }        }        private string _interlockEditLimitSelect;        public string InterLockEditLimitSelect        {            get => _interlockEditLimitSelect;            set            {                _interlockEditLimitSelect = value;                NotifyOfPropertyChange(nameof(InterLockEditLimitSelect));            }        }        private int _interlockEditLimitSelectIndex;        public int InterlockEditLimitSelectIndex        {            get => _interlockEditLimitSelectIndex;            set            {                _interlockEditLimitSelectIndex = value;                NotifyOfPropertyChange(nameof(InterlockEditLimitSelectIndex));            }        }        private bool _actionValueTrue;        public bool ActionValueTrue        {            get => _actionValueTrue;            set            {                _actionValueTrue = value;                NotifyOfPropertyChange(nameof(ActionValueTrue));            }        }        private bool _actionValueFalse;        public bool ActionValueFalse        {            get => _actionValueFalse;            set            {                _actionValueFalse = value;                NotifyOfPropertyChange(nameof(ActionValueFalse));            }        }        private bool _limitValueTrue;        public bool LimitValueTrue        {            get => _limitValueTrue;            set            {                _limitValueTrue = value;                NotifyOfPropertyChange(nameof(LimitValueTrue));            }        }        private bool _limitValueFalse;        public bool LimitValueFalse        {            get => _limitValueFalse;            set            {                _limitValueFalse = value;                NotifyOfPropertyChange(nameof(LimitValueFalse));            }        }        private string _limitValueTrueName = "true";        public string LimitValueTrueName        {            get => _limitValueTrueName;            set            {                _limitValueTrueName = value;                NotifyOfPropertyChange(nameof(LimitValueTrueName));            }        }        private string _limitValueFalseName = "false";        public string LimitValueFalseName        {            get => _limitValueFalseName;            set            {                _limitValueFalseName = value;                NotifyOfPropertyChange(nameof(LimitValueFalseName));            }        }        private bool _limitConditionAND;        public bool LimitConditionAND        {            get => _limitConditionAND;            set            {                _limitConditionAND = value;                NotifyOfPropertyChange(nameof(LimitConditionAND));            }        }        private bool _limitConditionOR;        public bool LimitConditionOR        {            get => _limitConditionOR;            set            {                _limitConditionOR = value;                NotifyOfPropertyChange(nameof(LimitConditionOR));            }        }        private Visibility _isShowLimitValue = Visibility.Hidden;        public Visibility IsShowLimitValue        {            get => _isShowLimitValue;            set            {                _isShowLimitValue = value;                NotifyOfPropertyChange(nameof(IsShowLimitValue));            }        }        private bool _isInterlockEdit;        public bool IsInterlockEdit        {            get => _isInterlockEdit;            set            {                _isInterlockEdit = value;                NotifyOfPropertyChange(nameof(IsInterlockEdit));            }        }        private bool _isInterlockEditCancel;        public bool IsInterlockEditCancel        {            get => _isInterlockEditCancel;            set            {                _isInterlockEditCancel = value;                NotifyOfPropertyChange(nameof(IsInterlockEditCancel));            }        }        private bool _isInterlockEditSet = false;        private List<string> _moduleName = new List<string>() { "PM1" };        private string _actionItem = "BLANK";        public string ActionItem        {            get => _actionItem;            set            {                _actionItem = value;                NotifyOfPropertyChange(nameof(ActionItem));            }        }        private string _actionCheck = "BLANK";        public string ActionCheck        {            get => _actionCheck;            set            {                _actionCheck = value;                NotifyOfPropertyChange(nameof(ActionCheck));            }        }        private string _actionTimeCheck = "Time";        public string ActionTimeCheck        {            get => _actionTimeCheck;            set            {                _actionTimeCheck = value;                NotifyOfPropertyChange(nameof(ActionTimeCheck));            }        }        private string _actionValue;        public string ActionValue        {            get => _actionValue;            set            {                _actionValue = value;                NotifyOfPropertyChange(nameof(ActionValue));            }        }        private string _actionTimeValue = "0";        public string ActionTimeValue        {            get => _actionTimeValue;            set            {                _actionTimeValue = value;                NotifyOfPropertyChange(nameof(ActionTimeValue));            }        }        private bool _isEnabledActionTimeValue;        public bool IsEnabledActionTimeValue        {            get => _isEnabledActionTimeValue;            set            {                _isEnabledActionTimeValue = value;                NotifyOfPropertyChange(nameof(IsEnabledActionTimeValue));            }        }        private string _limitItem = "BLANK";        public string LimitItem        {            get => _limitItem;            set            {                _limitItem = value;                NotifyOfPropertyChange(nameof(LimitItem));            }        }        private string _limitCondition = "AND";        public string LimitCondition        {            get => _limitCondition;            set            {                _limitCondition = value;                NotifyOfPropertyChange(nameof(LimitCondition));            }        }        private string _limitCheck = "BLANK";        public string LimitCheck        {            get => _limitCheck;            set            {                _limitCheck = value;                NotifyOfPropertyChange(nameof(LimitCheck));            }        }        private string _limitValue = "0";        public string LimitValue        {            get => _limitValue;            set            {                _limitValue = value;                NotifyOfPropertyChange(nameof(LimitValue));            }        }        private string _limitUnit;        public string LimitUnit        {            get => _limitUnit;            set            {                _limitUnit = value;                NotifyOfPropertyChange(nameof(LimitUnit));            }        }        private bool _isEnabledLimitValue;        public bool IsEnabledLimitValue        {            get => _isEnabledLimitValue;            set            {                _isEnabledLimitValue = value;                NotifyOfPropertyChange(nameof(IsEnabledLimitValue));            }        }        private Dictionary<string, string> _editInterlockFlagNameReferenceDic;        private Dictionary<string, string> _editLimitCheckReferenceDic;        private string _diKey;        private string _doKey;        private string _aiKey;        [Subscription("PM1.LZonePV")]        public double LZonePV { get; set; }        [Subscription("PM1.CLZonePV")]        public double CLZonePV { get; set; }        [Subscription("PM1.CZonePV")]        public double CZonePV { get; set; }        [Subscription("PM1.CUZonePV")]        public double CUZonePV { get; set; }        [Subscription("PM1.UZonePV")]        public double UZonePV { get; set; }        private List<string> _paramNames = new List<string>() { "PM1.LZonePV", "PM1.CLZonePV", "PM1.CZonePV", "PM1.CUZonePV", "PM1.UZonePV" };        private Dictionary<string, bool> _flagCurrentValues = new Dictionary<string, bool>();        public InterlockViewModel()        {        }        protected override void OnInitialize()        {            base.OnInitialize();            _diKey = $"System.PM1.DIList";            _doKey = $"System.PM1.DOList";            _aiKey = $"System.PM1.AIList";            Subscribe(_aiKey);            Subscribe(_diKey);            Subscribe(_doKey);            InitEditInterlockIODic();            InitPMTree("");            InitEditTree("");            InitActionLists();            InitLimitLists();        }        private void InitEditInterlockIODic()        {            _editInterlockFlagNameReferenceDic = new Dictionary<string, string>()            {                //{ "FLAG001", "TAG5" },                //{ "FLAG002", "A/S CLS STS" },                //{ "FLAG003", "CAP CLOSE1 STS" },                //{ "FLAG004", "ATM FLAG" },                //{ "FLAG005", "TUBE OVER PRS" },                //{ "FLAG006", "TAG25" },                //{ "FLAG007", "LA-T ATM" },                //{ "FLAG008", "TAG10" },                //{ "FLAG009", "GAS DET HZD ALM" },                //{ "FLAG010", "TAG1" },                //{ "FLAG011", "TAG14" },                //{ "FLAG012", "TAG15" },                //{ "FLAG013", "TAG19" },                //{ "FLAG014", "CAP I/L ON CMD" },                //{ "FLAG015", "TAG12" },                //{ "FLAG030", "I-ALM464" },                //{ "FLAG031", "I-ALM467" },                //{ "FLAG032", "I-ALM470" },                //{ "FLAG040", "I-ALM514" },                //{ "FLAG041", "I-ALM517" },                //{ "FLAG042", "I-ALM520" },                //{ "SetSensorCAPOpen", "LED1" },                //{ "SetSensorCAPOpenEnable", "LED2" },                //{ "FLAG020", "LED3" },                //{ "FLAG021", "LED4" },                //{ "FLAG022", "LED13" },                //{ "FLAG023", "LED14" },            };            _editLimitCheckReferenceDic = new Dictionary<string, string>()            {                { ">=", "H" },                { "<", "L" },            };        }        private void InitActionLists()        {            _interlockEditAction = new List<string>();            foreach (var name in _moduleName)            {                GetActionList(name);            }        }        private void InitLimitLists()        {            _interlockEditLimit = new List<string>();            foreach (var name in _moduleName)            {                GetLimitDiList(name);            }            GetLimitAiList(_moduleName[0]);            foreach (var name in _moduleName)            {                GetLimitDoList(name);            }        }        private void GetActionList(string module)        {            List<NotifiableIoItem> notifiableIoItems = new List<NotifiableIoItem>();            notifiableIoItems = QueryDataClient.Instance.Service.GetDoList($"System.{module}");            for (int i = 0; i < notifiableIoItems.Count; i++)            {                _interlockEditAction.Add(notifiableIoItems[i].Name);            }        }        private void GetLimitDiList(string module)        {            List<NotifiableIoItem> notifiableIoItems = new List<NotifiableIoItem>();            notifiableIoItems = QueryDataClient.Instance.Service.GetDiList($"System.{module}");            for (int i = 0; i < notifiableIoItems.Count; i++)            {                _interlockEditLimit.Add(notifiableIoItems[i].Name);            }        }        private void GetLimitAiList(string module)        {            List<NotifiableIoItem> notifiableIoItems = new List<NotifiableIoItem>();            notifiableIoItems = QueryDataClient.Instance.Service.GetAiList($"System.{module}");            for (int i = 0; i < notifiableIoItems.Count; i++)            {                _interlockEditLimit.Add(notifiableIoItems[i].Name);            }        }        private void GetLimitDoList(string module)        {            List<NotifiableIoItem> notifiableIoItems = new List<NotifiableIoItem>();            notifiableIoItems = QueryDataClient.Instance.Service.GetDoList($"System.{module}");            for (int i = 0; i < notifiableIoItems.Count; i++)            {                _interlockEditLimit.Add(notifiableIoItems[i].Name);            }        }        private void InitPMTree(string key)        {            try            {                XmlDocument xmlConfig = new XmlDocument();                xmlConfig.LoadXml(QueryDataClient.Instance.Service.GetInterlockConfigContent());                //<Action do="DO_RF_power_on_off" value="true" tip="" tip.zh-CN="" tip.en-US="">                //  <Limit di="DI_RF_hardware_interlock"  value="true" tip="" tip.zh-CN="" tip.en-US="" />                //  <Limit di="DI_Chamber_door_sw"  value="true" tip="" tip.zh-CN="" tip.en-US="" />                //</Action>                XmlNode nodeInterlock = xmlConfig.SelectSingleNode("Interlock");                InterlockTreePM.Clear();                foreach (XmlNode item in nodeInterlock.ChildNodes)                {                    InterlockBase interlock = new InterlockBase();                    if (item.NodeType == XmlNodeType.Comment)                        continue;                    XmlElement actionNode = item as XmlElement;                    if (actionNode == null) continue;                    if (actionNode.Name != "Action")                    {                        continue;                    }                    if (!actionNode.GetAttribute("do").Contains("PM1"))                        continue;                    if (!string.IsNullOrEmpty(key) && !actionNode.GetAttribute("do").Contains(key))                        continue;                    interlock.Name = !string.IsNullOrEmpty(actionNode.GetAttribute("tip"))? actionNode.GetAttribute("tip"): actionNode.GetAttribute("do");                    interlock.SetValue = actionNode.GetAttribute("value");                    interlock.InterlockOKFill = _grayFill;                    //string doName = actionNode.GetAttribute("do");                    //bool value = Convert.ToBoolean(actionNode.GetAttribute("value"));                    //string tip = actionNode.GetAttribute("tip");                    foreach (XmlElement limitNode in actionNode.ChildNodes)                    {                        if (limitNode.Name != "Limit")                        {                            continue;                        }                        string action = string.Empty;                        string condition = limitNode.GetAttribute("condition");                        condition = string.IsNullOrEmpty(condition) ? "AND" : condition;                        string limitTip = string.Empty;                        if (limitNode.HasAttribute("tip"))                        {                            action = limitNode.GetAttribute("tip");                        }                        if (limitNode.HasAttribute("di"))                        {                            action = limitNode.GetAttribute("di");                            limitTip = string.IsNullOrEmpty(limitTip) ? limitNode.GetAttribute("di") : limitTip;                        }                        if (limitNode.HasAttribute("do"))                        {                            action = limitNode.GetAttribute("do");                            limitTip = string.IsNullOrEmpty(limitTip) ? limitNode.GetAttribute("do") : limitTip;                        }                        if (limitNode.HasAttribute("poll"))                        {                            action = limitNode.GetAttribute("do");                            limitTip = string.IsNullOrEmpty(limitTip) ? limitNode.GetAttribute("poll") : limitTip;                        }                        interlock.Children.Add(new InterlockBase() { Action = action, Name = limitTip, LimitValue = limitNode.GetAttribute("value"), Condition = condition, InterlockOKFill = _greenFill });                    }                    InterlockTreePM.Add(interlock);                }            }            catch (Exception ex)            {            }        }        private void InitEditTree(string key)        {            try            {                XmlDocument xmlConfig = new XmlDocument();                xmlConfig.LoadXml(QueryDataClient.Instance.Service.GetInterlockUserDefineConfigContent());                XmlNode nodeInterlock = xmlConfig.SelectSingleNode("Interlock");                InterlockTreeEdit.Clear();                foreach (XmlNode item in nodeInterlock.ChildNodes)                {                    InterlockBase interlock = new InterlockBase();                    if (item.NodeType == XmlNodeType.Comment)                        continue;                    XmlElement actionNode = item as XmlElement;                    if (actionNode == null) continue;                    if (actionNode.Name != "Action")                    {                        continue;                    }                    if (!string.IsNullOrEmpty(key) && !actionNode.GetAttribute("Name").Contains(key))                        continue;                    interlock.Action= actionNode.GetAttribute("Name");                    //interlock.Name = actionNode.GetAttribute("Name");                    //if (actionNode.GetAttribute("Name").Contains("FLAG"))                    //    interlock.Action = actionNode.GetAttribute("Name");                    //else                    //    interlock.Action = _editInterlockIOReferenceDic.Where(x => x.Value == actionNode.GetAttribute("Name"))?.FirstOrDefault().Key;                    if (_editInterlockFlagNameReferenceDic.ContainsKey(interlock.Action))                        interlock.Name = _editInterlockFlagNameReferenceDic[interlock.Action];                    else                        interlock.Name = interlock.Action;                    interlock.SetValue = actionNode.GetAttribute("Value");                    interlock.InterlockOKFill = _grayFill;                    //string doName = actionNode.GetAttribute("do");                    //bool value = Convert.ToBoolean(actionNode.GetAttribute("value"));                    //string tip = actionNode.GetAttribute("tip");                    foreach (XmlElement limitNode in actionNode.ChildNodes)                    {                        if (limitNode.Name != "Limit")                        {                            continue;                        }                        string action = string.Empty;                        if (limitNode.HasAttribute("Name"))                        {                            action = limitNode.GetAttribute("Name");                            //if (limitNode.GetAttribute("Name").Contains("FLAG"))                            //    action = limitNode.GetAttribute("Name");                            //else                            //    action = _editInterlockIOReferenceDic.Where(x => x.Value == limitNode.GetAttribute("Name"))?.FirstOrDefault().Key;                        }                        string condition = limitNode.GetAttribute("Condition");                        condition = string.IsNullOrEmpty(condition) ? "AND" : condition;                        string name = string.Empty;                        if (_editInterlockFlagNameReferenceDic.ContainsKey(action))                            name = _editInterlockFlagNameReferenceDic[action];                        else                            name = action;                        interlock.Children.Add(new InterlockBase() { Action = action, Name = name, LimitValue = limitNode.GetAttribute("Value"), Condition = condition, InterlockOKFill = _greenFill });                    }                    InterlockTreeEdit.Add(interlock);                }            }            catch (Exception ex)            {            }        }        protected override void InvokeAfterUpdateProperty(Dictionary<string, object> data)        {            base.InvokeAfterUpdateProperty(data);            try            {                if (data.ContainsKey(_aiKey) && data[_aiKey] != null)                {                    List<NotifiableIoItem> lstData = (List<NotifiableIoItem>)data[_aiKey];                    Dictionary<string, float> dicValues = new Dictionary<string, float>();                    for (int i = 0; i < lstData.Count; i++)                    {                        dicValues[lstData[i].Name] = lstData[i].FloatValue;                    }                }                if (data.ContainsKey(_diKey) && data[_diKey] != null)                {                    List<NotifiableIoItem> lstData = (List<NotifiableIoItem>)data[_diKey];                    Dictionary<string, bool> dicValues = new Dictionary<string, bool>();                    for (int i = 0; i < lstData.Count; i++)                    {                        //dicValues[lstData[i].Name] = lstData[i].BoolValue;                        for (int j = 0; j < InterlockTreePM.Count; j++)                        {                            bool setValue = false;                            if (InterlockTreePM[j].Children[0].Condition.ToLower() == "or")                            {                                setValue = false;                            }                            else                            {                                setValue = true;                            }                            for (int k = 0; k < InterlockTreePM[j].Children.Count; k++)                            {                                if (lstData[i].Name.Contains(InterlockTreePM[j].Children[k].Action))                                {                                    InterlockTreePM[j].Children[k].InterlockOK = lstData[i].BoolValue.ToString().ToLower() == InterlockTreePM[j].Children[k].LimitValue.ToLower();                                    InterlockTreePM[j].Children[k].InterlockOKFill = InterlockTreePM[j].Children[k].InterlockOK ? _greenFill : _grayFill;                                }                                if (InterlockTreePM[j].Children[k].Condition.ToLower() == "or")                                {                                    setValue = setValue || InterlockTreePM[j].Children[k].InterlockOK;                                }                                else                                {                                    setValue = setValue && InterlockTreePM[j].Children[k].InterlockOK;                                }                            }                            InterlockTreePM[j].InterlockOK = setValue; ;                            InterlockTreePM[j].InterlockOKFill = InterlockTreePM[j].InterlockOK ? _greenFill : _grayFill;                        }                    }                }                if (data.ContainsKey(_doKey) && data[_doKey] != null)                {                    List<NotifiableIoItem> lstData = (List<NotifiableIoItem>)data[_doKey];                    Dictionary<string, bool> dicValues = new Dictionary<string, bool>();                    for (int i = 0; i < lstData.Count; i++)                    {                        dicValues[lstData[i].Name] = lstData[i].BoolValue;                    }                }                RefreshInterlockEdit();            }            catch (Exception ex)            {            }        }        private void RefreshInterlockEdit()        {            if (InterlockTreeEdit.Count == 0)                return;            Dictionary<string, List<NotifiableIoItem>> keyValuePairs = new Dictionary<string, List<NotifiableIoItem>>();            List<NotifiableIoItem> notifiableIoItems = new List<NotifiableIoItem>();            foreach (var name in _moduleName)            {                notifiableIoItems = QueryDataClient.Instance.Service.GetDiList($"System.{name}");                keyValuePairs.Add($"{name}.DI_", notifiableIoItems);                notifiableIoItems = QueryDataClient.Instance.Service.GetDoList($"System.{name}");                keyValuePairs.Add($"{name}.DO_", notifiableIoItems);            }            notifiableIoItems = QueryDataClient.Instance.Service.GetAiList($"System.PM1");            keyValuePairs.Add($"PM1.AI_", notifiableIoItems);            for (int i = 0; i < InterlockTreeEdit.Count; i++)            {                bool setValue = false;                if (InterlockTreeEdit[i].Children[0].Condition.ToLower() == "or")                {                    setValue = false;                }                else                {                    setValue = true;                }                var doAction = InterlockTreeEdit[i].Action;                for (int j = 0; j < InterlockTreeEdit[i].Children.Count; j++)                {                    var action = InterlockTreeEdit[i].Children[j].Action;                    var limitValue = InterlockTreeEdit[i].Children[j].LimitValue;                    if (_paramNames.Contains(action))                    {                        var values = (double)this.GetType().GetProperty(action.Replace("PM1.", "")).GetValue(this);                        if (limitValue.Contains("H"))                        {                            limitValue = limitValue.Replace("H", "");                            InterlockTreeEdit[i].Children[j].InterlockOK = values > float.Parse(limitValue);                            InterlockTreeEdit[i].Children[j].InterlockOKFill = InterlockTreeEdit[i].Children[j].InterlockOK ? _greenFill : _grayFill;                        }                        else                        {                            limitValue = limitValue.Replace("L", "");                            InterlockTreeEdit[i].Children[j].InterlockOK = values < float.Parse(limitValue);                            InterlockTreeEdit[i].Children[j].InterlockOKFill = InterlockTreeEdit[i].Children[j].InterlockOK ? _greenFill : _grayFill;                        }                    }                    else if (action.ToUpper().Contains("FLAG"))                    {                        InterlockTreeEdit[i].Children[j].InterlockOK = GetFlagActionInterlockOK(action, limitValue);                        InterlockTreeEdit[i].Children[j].InterlockOKFill = InterlockTreeEdit[i].Children[j].InterlockOK ? _greenFill : _grayFill;                    }                    else                    {                        foreach (var key in keyValuePairs.Keys)                        {                            if (action.Contains(key))                            {                                var values = keyValuePairs[key].Where(x => x.Name == action).FirstOrDefault();                                if (values != null)                                {                                    if (action.Contains("AI_"))                                    {                                        if (limitValue.Contains("H"))                                        {                                            limitValue = limitValue.Replace("H", "");                                            InterlockTreeEdit[i].Children[j].InterlockOK = values.FloatValue > float.Parse(limitValue);                                            InterlockTreeEdit[i].Children[j].InterlockOKFill = InterlockTreeEdit[i].Children[j].InterlockOK ? _greenFill : _grayFill;                                        }                                        else                                        {                                            limitValue = limitValue.Replace("L", "");                                            InterlockTreeEdit[i].Children[j].InterlockOK = values.FloatValue < float.Parse(limitValue);                                            InterlockTreeEdit[i].Children[j].InterlockOKFill = InterlockTreeEdit[i].Children[j].InterlockOK ? _greenFill : _grayFill;                                        }                                    }                                    else                                    {                                        InterlockTreeEdit[i].Children[j].InterlockOK = values.BoolValue ? InterlockTreeEdit[i].Children[j].LimitValue.ToLower().Contains("on") : InterlockTreeEdit[i].Children[j].LimitValue.ToLower().Contains("off");                                        InterlockTreeEdit[i].Children[j].InterlockOKFill = InterlockTreeEdit[i].Children[j].InterlockOK ? _greenFill : _grayFill;                                    }                                }                            }                        }                    }                    if (InterlockTreeEdit[i].Children[j].Condition.ToLower() == "or")                    {                        setValue = setValue || InterlockTreeEdit[i].Children[j].InterlockOK;                    }                    else                    {                        setValue = setValue && InterlockTreeEdit[i].Children[j].InterlockOK;                    }                }                if (doAction.ToUpper().Contains("FLAG"))                {                    if (setValue)                    {                        if (InterlockTreeEdit[i].SetValue.ToUpper().Contains("ON"))                        {                            if (!_flagCurrentValues.ContainsKey(doAction))                            {                                _flagCurrentValues.Add(doAction, true);                            }                            else                            {                                _flagCurrentValues[doAction] = true;                            }                        }                        else                        {                            if (!_flagCurrentValues.ContainsKey(doAction))                            {                                _flagCurrentValues.Add(doAction, false);                            }                            else                            {                                _flagCurrentValues[doAction] = false;                            }                        }                        InterlockTreeEdit[i].InterlockOK = setValue;                        InterlockTreeEdit[i].InterlockOKFill = InterlockTreeEdit[i].InterlockOK ? _greenFill : _grayFill;                    }                }                else                {                    InterlockTreeEdit[i].InterlockOK = setValue;                    InterlockTreeEdit[i].InterlockOKFill = InterlockTreeEdit[i].InterlockOK ? _greenFill : _grayFill;                }            }            for (int i = 0; i < InterlockTreeEdit.Count; i++)            {                var doAction = InterlockTreeEdit[i].Action;                var setValue = InterlockTreeEdit[i].SetValue;                var interlcokOk = InterlockTreeEdit[i].InterlockOK;                if (doAction.ToUpper().Contains("FLAG") && _flagCurrentValues.ContainsKey(doAction))                {                    bool actionValue = _flagCurrentValues[doAction];                    if (actionValue)                    {                        if (setValue.ToUpper().Contains("OFF") && interlcokOk)                        {                            InterlockTreeEdit[i].InterlockOK = false;                            InterlockTreeEdit[i].InterlockOKFill = InterlockTreeEdit[i].InterlockOK ? _greenFill : _grayFill;                        }                    }                    else                    {                        if (setValue.ToUpper().Contains("ON") && interlcokOk)                        {                            InterlockTreeEdit[i].InterlockOK = false;                            InterlockTreeEdit[i].InterlockOKFill = InterlockTreeEdit[i].InterlockOK ? _greenFill : _grayFill;                        }                    }                }            }        }        public bool GetFlagActionInterlockOK(string action, string limitValue)        {            if (_flagCurrentValues.ContainsKey(action))            {                if (limitValue.ToUpper().Contains("ON"))                {                    return _flagCurrentValues[action];                }                else                {                    return !_flagCurrentValues[action];                }            }            return false;        }        public void CollapseAll()        {            SetExpand(InterlockTreePM, false);            SetExpand(InterlockTreeEdit, false);        }        public void ExpandAll()        {            SetExpand(InterlockTreePM, true);            SetExpand(InterlockTreeEdit, true);        }        public void SetExpand(ObservableCollection<InterlockBase> interlockbase, bool expand)        {            if (interlockbase == null)                return;            foreach (var interlock in interlockbase)            {                interlock.IsExpanded = expand;                if (interlock.Children != null)                    SetExpand(interlock.Children, expand);            }        }        public void EditTreeSelectChanged(InterlockBase interlock)        {            CurrentInterlock = interlock;            if (CurrentInterlock != null && CurrentInterlock.Children.Count > 0)            {                InterlockLimits.Clear();                foreach (var limit in CurrentInterlock.Children)                {                    InterlockLimits.Add(new InterlockLimit() { LimitName = limit.Action, LimitValue = limit.LimitValue, LimitCondition = limit.Condition });                }                InterlockLimitSelectIndex = 0;                SelectLimit();                ActionItem = CurrentInterlock.Action;                var value = CurrentInterlock.SetValue.Split(';').ToList();                if (value.Count > 1)                {                    if (value[0].Contains("KEEP"))                    {                        ActionTimeCheck = "KEEP";                        ActionTimeValue = value[0].Replace("KEEP", "");                        IsEnabledActionTimeValue = true;                    }                    else                    {                        ActionTimeCheck = "DELAY";                        ActionTimeValue = value[0].Replace("DELAY", "");                        IsEnabledActionTimeValue = true;                    }                    ActionCheck = value[1];                }                else                {                    ActionCheck = value[0];                    ActionTimeCheck = "Time";                    ActionTimeValue = "0";                    IsEnabledActionTimeValue = false;                }            }        }        public void InterlockEdit()        {            if (!_isInterlockEditSet)            {                _isInterlockEditSet = !_isInterlockEditSet;                IsInterlockEdit = true;            }            else            {                IsInterlockEdit = false;                IsInterlockEditCancel = true;                _isInterlockEditSet = !_isInterlockEditSet;            }        }        public void ActionSelect()        {            var temp = InterlockTreeEdit.Where(x => x.Action == InterLockEditActionSelect).FirstOrDefault();            if (temp == null)            {                InterlockLimits.Clear();                InterlockEditLimitSelectIndex = -1;            }            else            {                InterlockLimits.Clear();                foreach (var limit in temp.Children)                {                    InterlockLimits.Add(new InterlockLimit() { LimitName = limit.Action, LimitValue = limit.LimitValue, LimitCondition = limit.Condition });                }                InterlockEditLimitSelectIndex = InterlockEditLimit.IndexOf(InterlockLimits.First().LimitName);            }        }        public void LimitSelect()        {            if (string.IsNullOrEmpty(InterLockEditLimitSelect))                return;            if (InterLockEditLimitSelect.Contains("AI_"))            {                LimitValueTrueName = ">=";                LimitValueFalseName = "<";                IsShowLimitValue = Visibility.Visible;            }            else            {                LimitValueTrueName = "true";                LimitValueFalseName = "false";                IsShowLimitValue = Visibility.Hidden;            }        }        public void SelectItem(string itemType)        {            var windowManager = IoC.Get<IWindowManager>();            InterlockSelectItemViewModel interlockSelectItemViewModel = new InterlockSelectItemViewModel(itemType);            (windowManager as WindowManager)?.ShowDialogWithTitle(interlockSelectItemViewModel, null, "Interlock SelectItem View");            string selectedItem = interlockSelectItemViewModel.SelectedItem;            if (!string.IsNullOrEmpty(selectedItem))            {                switch (itemType)                {                    case "Action":                        ActionItem = selectedItem;                        break;                    case "Limit":                        if (selectedItem.Contains("FLAG"))                        {                            if (InterlockTreeEdit.Where(x => x.Action == selectedItem).FirstOrDefault() == null)                            {                                DialogBox.ShowWarning($"{selectedItem} item is not exist!");                                return;                            }                        }                        LimitItem = selectedItem;                        if (LimitItem.Contains("MFC") || LimitItem.Contains("MFM") || LimitItem.Contains("APC") || LimitItem.Contains("TEMP") || LimitItem.Contains("VG"))                        {                            IsEnabledLimitValue = true;                            if (LimitCheck.Contains("ON") || LimitCheck.Contains("OFF"))                                LimitCheck = "BLANK";                        }                        else                        {                            IsEnabledLimitValue = false;                            LimitValue = "";                            if (LimitCheck.Contains(">=") || LimitCheck.Contains("<"))                                LimitCheck = "BLANK";                        }                        if (LimitItem.Contains("MFC") || LimitItem.Contains("MFM"))                        {                            LimitUnit = "SCCM";                        }                        else if (LimitItem.Contains("APC"))                        {                            LimitUnit = "Torr";                        }                        else if (LimitItem.Contains("TEMP"))                        {                            LimitUnit = "℃";                        }                        else if (LimitItem.Contains("VG"))                        {                            LimitUnit = "kPa";                        }                        else                        {                            LimitUnit = "";                        }                        break;                }            }        }        public void SelectCheck(string value)        {            string itemType = string.Empty;            switch (value)            {                case "Action":                    itemType = ActionItem;                    break;                case "Limit":                    itemType = LimitItem;                    break;                case "TIME":                    itemType = value;                    break;            }            var windowManager = IoC.Get<IWindowManager>();            InterlockCheckViewModel interlockCheckViewModel = new InterlockCheckViewModel(itemType);            if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(interlockCheckViewModel, null, "Interlock Check View"))            {                if (value == "Action")                {                    ActionCheck = interlockCheckViewModel.CheckSelected;                }                else if (value == "Limit")                {                    LimitCheck = interlockCheckViewModel.CheckSelected;                    if (LimitCheck == ">=" || LimitCheck == "<")                        IsEnabledLimitValue = true;                    else                        IsEnabledLimitValue = false;                }                else                {                    ActionTimeCheck = interlockCheckViewModel.CheckSelected;                    if (ActionTimeCheck == "DELAY" || ActionTimeCheck == "KEEP")                        IsEnabledActionTimeValue = true;                    else                        IsEnabledActionTimeValue = false;                }            }        }        public void SelectCondition()        {            var windowManager = IoC.Get<IWindowManager>();            InterlockConditionViewModel interlockConditionViewModel = new InterlockConditionViewModel();            if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(interlockConditionViewModel, null, "Interlock Condition View"))            {                LimitCondition = interlockConditionViewModel.ConditionSelected;            }        }        public void SelectLimit()        {            if (InterlockLimitSelectIndex != -1 && InterlockLimits.Count > 0)            {                LimitItem = InterlockLimits[InterlockLimitSelectIndex].LimitName;                LimitCondition = InterlockLimits[InterlockLimitSelectIndex].LimitCondition;                var value = InterlockLimits[InterlockLimitSelectIndex].LimitValue;                if (value.Contains("H"))                {                    LimitCheck = ">=";                    LimitValue = value.Replace("H", "");                    IsEnabledLimitValue = true;                }                else if (value.Contains("L"))                {                    LimitCheck = "<";                    LimitValue = value.Replace("L", "");                    IsEnabledLimitValue = true;                }                else                {                    LimitCheck = value;                    LimitValue = "0";                    IsEnabledLimitValue = false;                }                if (LimitItem.Contains("MFC") || LimitItem.Contains("MFM"))                {                    LimitUnit = "SCCM";                }                else if (LimitItem.Contains("APC"))                {                    LimitUnit = "Torr";                }                else if (LimitItem.Contains("TEMP"))                {                    LimitUnit = "℃";                }                else                {                    LimitUnit = "";                }            }        }        public void ChangeLimit()        {            if (InterlockLimitSelectIndex != -1 && InterlockLimits.Count > 0)            {                if (string.IsNullOrEmpty(LimitItem) || LimitItem == "BLANK")                {                    DialogBox.ShowWarning("Limit item is empty,can not add!");                    return;                }                if (string.IsNullOrEmpty(LimitCondition))                {                    DialogBox.ShowWarning("Limit condition is empty,can not add!");                    return;                }                if (string.IsNullOrEmpty(LimitCheck) || LimitCheck == "BLANK")                {                    DialogBox.ShowWarning("Limit check is empty,can not add!");                    return;                }                if (IsEnabledLimitValue && string.IsNullOrEmpty(LimitValue))                {                    DialogBox.ShowWarning("Limit value is empty,can not add!");                    return;                }                //if (InterlockLimits.Any(x => x.LimitCondition == "BLANK") && LimitCondition == "BLANK" && InterlockLimits[InterlockLimitSelectIndex].LimitCondition != "BLANK")                //{                //    DialogBox.ShowWarning("Alreay have condition is BLANK,can not add!");                //    return;                //}                InterlockLimits[InterlockLimitSelectIndex].LimitName = LimitItem;                InterlockLimits[InterlockLimitSelectIndex].LimitCondition = LimitCondition;                //InterlockLimits[InterlockLimitSelectIndex].LimitValue = IsEnabledLimitValue ? LimitCheck + LimitValue : LimitCheck;                InterlockLimits[InterlockLimitSelectIndex].LimitValue = IsEnabledLimitValue ? LimitValue + _editLimitCheckReferenceDic[LimitCheck] : LimitCheck;            }        }        public void AddLimit()        {            if (string.IsNullOrEmpty(LimitItem) || LimitItem == "BLANK")            {                DialogBox.ShowWarning("Limit item is empty,can not add!");                return;            }            if (string.IsNullOrEmpty(LimitCondition))            {                DialogBox.ShowWarning("Limit condition is empty,can not add!");                return;            }            if (string.IsNullOrEmpty(LimitCheck) || LimitCheck == "BLANK")            {                DialogBox.ShowWarning("Limit check is empty,can not add!");                return;            }            if (IsEnabledLimitValue && string.IsNullOrEmpty(LimitValue))            {                DialogBox.ShowWarning("Limit value is empty,can not add!");                return;            }            //if (InterlockLimits.Any(x => x.LimitCondition == "BLANK") && LimitCondition == "BLANK")            //{            //    DialogBox.ShowWarning("Alreay have condition is BLANK,can not add!");            //    return;            //}            InterlockLimit interlockLimit = new InterlockLimit();            interlockLimit.LimitName = LimitItem;            interlockLimit.LimitCondition = LimitCondition;            //interlockLimit.LimitValue = IsEnabledLimitValue ? LimitCheck + LimitValue : LimitCheck;            interlockLimit.LimitValue = IsEnabledLimitValue ? LimitValue + _editLimitCheckReferenceDic[LimitCheck] : LimitCheck;            if (InterlockLimits.Where(x => x.LimitName == LimitItem).FirstOrDefault() != null)            {                DialogBox.ShowWarning($"Limit [{LimitItem}] is already existed");                return;            }            else            {                InterlockLimits.Add(interlockLimit);            }        }        public void DeleteLimit()        {            if (InterlockLimitSelectIndex != -1 && InterlockLimits.Count > 0)            {                if (!DialogBox.Confirm($"Are you sure delete limit [{InterlockLimits[InterlockLimitSelectIndex].LimitName}]"))                    return;                InterlockLimits.RemoveAt(InterlockLimitSelectIndex);                if (InterlockLimits.Count == 0)                {                    LimitItem = "BLANK";                    LimitCheck = "BLANK";                    LimitValue = "0";                    LimitUnit = "";                    LimitCondition = "AND";                    IsEnabledLimitValue = false;                }            }        }        public void Update()        {            if (CurrentInterlock == null)                return;            if (InterlockLimits.Count == 0)            {                DialogBox.ShowWarning("Condition is empty,can not save!");                return;            }            if (string.IsNullOrEmpty(ActionItem) || ActionItem == "BLANK")            {                DialogBox.ShowWarning("Action item is empty,can not save!");                return;            }            if (string.IsNullOrEmpty(ActionCheck) || ActionCheck == "BLANK")            {                DialogBox.ShowWarning("Action check is empty,can not save!");                return;            }            if (IsEnabledActionTimeValue && string.IsNullOrEmpty(ActionTimeValue))            {                DialogBox.ShowWarning("Time value is empty,can not save!");                return;            }            //if (InterlockLimits[InterlockLimits.Count - 1].LimitCondition != "BLANK")            //{            //    DialogBox.ShowWarning("The last condition must be 'BLANK',can not save!");            //    return;            //}            InterlockBase interlock = new InterlockBase();            interlock.Action = ActionItem;            interlock.SetValue = IsEnabledActionTimeValue ? $"{ActionTimeCheck}{ActionTimeValue};" : "";            interlock.SetValue += ActionCheck;            interlock.InterlockOKFill = _greenFill;            for (int i = 0; i < InterlockLimits.Count; i++)            {                interlock.Children.Add(new InterlockBase() { Action = InterlockLimits[i].LimitName, LimitValue = InterlockLimits[i].LimitValue, Condition = InterlockLimits[i].LimitCondition, InterlockOKFill = _greenFill });            }            InterlockTreeEdit.Where(x => x.Action == CurrentInterlock.Action && x.SetValue == CurrentInterlock.SetValue).FirstOrDefault().SetValue = interlock.SetValue;            InterlockTreeEdit.Where(x => x.Action == CurrentInterlock.Action && x.SetValue == CurrentInterlock.SetValue).FirstOrDefault().InterlockOKFill = interlock.InterlockOKFill;            InterlockTreeEdit.Where(x => x.Action == CurrentInterlock.Action && x.SetValue == CurrentInterlock.SetValue).FirstOrDefault().Children = interlock.Children;            QueryDataClient.Instance.Service.SetInterlockConfigContent(GetXmlString());            InvokeClient.Instance.Service.DoOperation($"System.UpdateUserDefineInterlock", "");            InterlockLimits.Clear();            InterlockParamClear();        }        public void Save()        {            if (InterlockLimits.Count == 0)            {                DialogBox.ShowWarning("Condition is empty,can not save!");                return;            }            if (string.IsNullOrEmpty(ActionItem) || ActionItem == "BLANK")            {                DialogBox.ShowWarning("Action item is empty,can not save!");                return;            }            if (string.IsNullOrEmpty(ActionCheck) || ActionCheck == "BLANK")            {                DialogBox.ShowWarning("Action check is empty,can not save!");                return;            }            if (IsEnabledActionTimeValue && string.IsNullOrEmpty(ActionTimeValue))            {                DialogBox.ShowWarning("Time value is empty,can not save!");                return;            }            //if (InterlockLimits[InterlockLimits.Count - 1].LimitCondition != "BLANK")            //{            //    DialogBox.ShowWarning("The last condition must be 'BLANK',can not save!");            //    return;            //}            InterlockBase interlock = new InterlockBase();            interlock.Action = ActionItem;            interlock.SetValue = IsEnabledActionTimeValue ? $"{ActionTimeCheck}{ActionTimeValue};" : "";            interlock.SetValue += ActionCheck;            interlock.InterlockOKFill = _greenFill;            for (int i = 0; i < InterlockLimits.Count; i++)            {                interlock.Children.Add(new InterlockBase() { Action = InterlockLimits[i].LimitName, LimitValue = InterlockLimits[i].LimitValue, Condition = InterlockLimits[i].LimitCondition, InterlockOKFill = _greenFill });            }            if (InterlockTreeEdit.Any(x => x.Action == interlock.Action && x.SetValue == interlock.SetValue))            {                DialogBox.ShowWarning($"Action [{interlock.Action}] condition {interlock.SetValue} is already existed");                return;            }            else            {                InterlockTreeEdit.Add(interlock);            }            QueryDataClient.Instance.Service.SetInterlockConfigContent(GetXmlString());            InvokeClient.Instance.Service.DoOperation($"System.UpdateUserDefineInterlock", "");            InterlockLimits.Clear();            InterlockParamClear();        }        private string GetXmlString()        {            if (InterlockTreeEdit == null)                return string.Empty;            XmlDocument doc = new XmlDocument();            XmlElement node = doc.CreateElement("Interlock");            doc.AppendChild(node);            XmlNode nodeData = doc.SelectSingleNode("Interlock");            foreach (InterlockBase interlock in InterlockTreeEdit)            {                XmlElement actionnode = doc.CreateElement("Action");                actionnode.SetAttribute("Name", interlock.Action);                //if (interlock.Action.Contains("FLAG"))                //    actionnode.SetAttribute("Name", interlock.Action);                //else                //    actionnode.SetAttribute("Name", _editInterlockIOReferenceDic[interlock.Action]);                actionnode.SetAttribute("Value", interlock.SetValue);                nodeData.AppendChild(actionnode);                foreach (InterlockBase limit in interlock.Children)                {                    XmlElement limitnode = doc.CreateElement("Limit");                    limitnode.SetAttribute("Name", limit.Action);                    //if (limit.Action.Contains("FLAG"))                    //    limitnode.SetAttribute("Name", limit.Action);                    //else                    //    limitnode.SetAttribute("Name", _editInterlockIOReferenceDic[limit.Action]);                    limitnode.SetAttribute("Value", limit.LimitValue);                    limitnode.SetAttribute("Condition", limit.Condition);                    actionnode.AppendChild(limitnode);                }            }            return doc.OuterXml;        }        public void Export()        {            try            {                Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();                dlg.DefaultExt = ".xml"; // Default file extension                 dlg.FileName = $"InterlockUserDefine_{DateTime.Now:yyyyMMdd_HHmmss}";                dlg.Filter = "xml数据文件(*.xml)|*.xml"; // Filter files by extension                 Nullable<bool> result = dlg.ShowDialog();// Show open file dialog box                if (result == true) // Process open file dialog box results                {                    XmlDocument xml = new XmlDocument();                    xml.LoadXml(GetXmlString());                    xml.Save(dlg.FileName);                    MessageBox.Show($"Export succeed, file save as {dlg.FileName}", "Export", MessageBoxButton.OK, MessageBoxImage.Information);                }            }            catch (Exception ex)            {                LOG.Write(ex);                MessageBox.Show("导出自定义Interlock发生错误", "导出失败", MessageBoxButton.OK, MessageBoxImage.Warning);            }        }        //public void Import()        //{        //    try        //    {        //        string filepath = "";        //        System.Windows.Forms.OpenFileDialog fd = new System.Windows.Forms.OpenFileDialog();        //        fd.Multiselect = false;        //        fd.Title = "Please Select File";        //        fd.Filter = "xml⽂件|*.xml";        //        if (fd.ShowDialog() == System.Windows.Forms.DialogResult.OK)        //        {        //            filepath = fd.FileName;        //        }        //        XmlDocument xmlConfig = new XmlDocument();        //        xmlConfig.Load(filepath);        //        XmlNode nodeInterlock = xmlConfig.SelectSingleNode("Interlock");        //        foreach (XmlNode item in nodeInterlock.ChildNodes)        //        {        //            InterlockBase interlock = new InterlockBase();        //            if (item.NodeType == XmlNodeType.Comment)        //                continue;        //            XmlElement actionNode = item as XmlElement;        //            if (actionNode == null) continue;        //            if (actionNode.Name != "Action")        //            {        //                continue;        //            }        //            if (IsSameActionName(actionNode.GetAttribute("Name")))        //                continue;        //            interlock.Action = actionNode.GetAttribute("Name");        //            interlock.Name = actionNode.GetAttribute("Name");        //            interlock.SetValue = actionNode.GetAttribute("Value");        //            interlock.InterlockOKFill = _greenFill;        //            //string doName = actionNode.GetAttribute("do");        //            //bool value = Convert.ToBoolean(actionNode.GetAttribute("value"));        //            //string tip = actionNode.GetAttribute("tip");        //            foreach (XmlElement limitNode in actionNode.ChildNodes)        //            {        //                if (limitNode.Name != "Limit")        //                {        //                    continue;        //                }        //                string action = string.Empty;        //                if (limitNode.HasAttribute("Name"))        //                {        //                    action = limitNode.GetAttribute("Name");        //                }        //                string condition = limitNode.GetAttribute("Condition");        //                condition = string.IsNullOrEmpty(condition) ? "AND" : condition;        //                interlock.Children.Add(new InterlockBase() { Action = action, Name = limitNode.GetAttribute("Name"), LimitValue = limitNode.GetAttribute("Value"), Condition = condition, InterlockOKFill = _greenFill });        //            }        //            InterlockTreeEdit.Add(interlock);        //        }        //    }        //    catch (Exception ex)        //    {        //        LOG.Write(ex);        //        MessageBox.Show("导入自定义Interlock发生错误", "导入失败", MessageBoxButton.OK, MessageBoxImage.Warning);        //    }        //}        private bool IsSameActionName(string actionName)        {            bool isSame = false;            foreach (InterlockBase interlock in InterlockTreeEdit)            {                if (interlock.Action == actionName)                {                    isSame = true;                    break;                }            }            return isSame;        }        public void Delete()        {            if (CurrentInterlock == null)                return;            var interlock = InterlockTreeEdit.Where(x => x.Action == CurrentInterlock.Action).FirstOrDefault();            if (interlock != null)            {                if (!DialogBox.Confirm($"Are you sure delete Interlock [{CurrentInterlock.Action}]"))                    return;                InterlockTreeEdit.Remove(CurrentInterlock);                QueryDataClient.Instance.Service.SetInterlockConfigContent(GetXmlString());                InvokeClient.Instance.Service.DoOperation($"System.UpdateUserDefineInterlock", "");                InterlockLimits.Clear();                InterlockParamClear();            }        }        private void InterlockParamClear()        {            LimitItem = "BLANK";            LimitCheck = "BLANK";            LimitValue = "0";            LimitUnit = "";            LimitCondition = "AND";            ActionTimeCheck = "Time";            ActionTimeValue = "0";            ActionItem = "BLANK";            ActionCheck = "BLANK";            IsEnabledLimitValue = false;            IsEnabledActionTimeValue = false;        }        public void InterlockFind(string findKey)        {            if (string.IsNullOrWhiteSpace(findKey) || string.IsNullOrEmpty(findKey))            {                if (IsShowInterlockPM)                {                    InitPMTree("");                }                if (IsShowInterlockEdit || IsShowInterlockEditDetail)                {                    InitEditTree("");                }            }            else            {                if (IsShowInterlockPM)                {                    InitPMTree(findKey);                }                if (IsShowInterlockEdit || IsShowInterlockEditDetail)                {                    InitEditTree(findKey);                }            }        }    }    public class InterlockLimit : NotifiableItem    {        private string _limitName;        public string LimitName        {            get => _limitName;            set            {                _limitName = value;                InvokePropertyChanged(nameof(LimitName));            }        }        private string _limitCondition;        public string LimitCondition        {            get => _limitCondition;            set            {                _limitCondition = value;                InvokePropertyChanged(nameof(LimitCondition));            }        }        private string _limitValue;        public string LimitValue        {            get => _limitValue;            set            {                _limitValue = value;                InvokePropertyChanged(nameof(LimitValue));            }        }    }    public class InterlockBase : PropertyChangedBase    {        private string _name;        public string Name        {            get => _name;            set            {                _name = value;                NotifyOfPropertyChange(nameof(Name));            }        }        private string _action;        public string Action        {            get => _action;            set            {                _action = value;                NotifyOfPropertyChange(nameof(Action));            }        }        private string _setValue;        public string SetValue        {            get => _setValue;            set            {                _setValue = value;                NotifyOfPropertyChange(nameof(SetValue));            }        }        private string _limitValue;        public string LimitValue        {            get => _limitValue;            set            {                _limitValue = value;                NotifyOfPropertyChange(nameof(LimitValue));            }        }        private bool _interlockOK;        public bool InterlockOK        {            get => _interlockOK;            set            {                _interlockOK = value;                NotifyOfPropertyChange(nameof(InterlockOK));            }        }        private SolidColorBrush _interlockOKFill;        public SolidColorBrush InterlockOKFill        {            get => _interlockOKFill;            set            {                _interlockOKFill = value;                NotifyOfPropertyChange(nameof(InterlockOKFill));            }        }        private string _condition;        public string Condition        {            get => _condition;            set            {                _condition = value;                NotifyOfPropertyChange(nameof(Condition));            }        }        private bool _isExpanded;        public bool IsExpanded        {            get => _isExpanded;            set            {                _isExpanded = value;                NotifyOfPropertyChange(nameof(IsExpanded));            }        }        private ObservableCollection<InterlockBase> _children;        public ObservableCollection<InterlockBase> Children        {            get => _children;            set            {                _children = value;                NotifyOfPropertyChange(nameof(Children));            }        }        public InterlockBase()        {            Children = new ObservableCollection<InterlockBase>();        }    }}
 |