using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Windows; using Aitex.Core.RT.IOCore; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.IOCore; using MECF.Framework.Common.OperationCenter; using MECF.Framework.UI.Client.ClientBase; using OpenSEMI.ClientBase; using OpenSEMI.ClientBase.IO; namespace MECF.Framework.UI.Client.CenterViews.Maitenances.IO3 { /// /// 与IO2ViewModel的区别是,这个用Float类型的AI , AO /// public class IO3ViewModel : UiViewModelBase, ISupportMultipleSystem { public Visibility DIVisibility { get { return DIs.Count > 0 ? Visibility.Visible : Visibility.Collapsed; } } public Visibility DOVisibility { get { return DOs.Count > 0 ? Visibility.Visible : Visibility.Collapsed; } } public Visibility AIVisibility { get { return AIs.Count > 0 ? Visibility.Visible : Visibility.Collapsed; } } public Visibility AOVisibility { get { return AOs.Count > 0 ? Visibility.Visible : Visibility.Collapsed; } } public int DIWidth { get { return (DIs.Count / 31 + 1) * 355; } } public int DOWidth { get { return (DOs.Count / 31 + 1) * 405; } } public int AIWidth { get { return (AIs.Count / 31 + 1) * 370; } } public int AOWidth { get { return (AOs.Count / 31 + 1) * 370; } } public ObservableCollection> AIs { get; private set; } public ObservableCollection AOs { get; private set; } public ObservableCollection> DIs { get; private set; } public ObservableCollection> DOs { get; private set; } public ObservableCollection> AIsFilter { get; private set; } public ObservableCollection AOsFilter { get; private set; } public ObservableCollection> DIsFilter { get; private set; } public ObservableCollection> DOsFilter { get; private set; } private string _diKey; private string _doKey; private string _aiKey; private string _aoKey; protected override void OnInitialize() { base.OnInitialize(); _diKey = $"{SystemName}.DIItemList"; _doKey = $"{SystemName}.DOItemList"; _aiKey = $"{SystemName}.AIItemList"; _aoKey = $"{SystemName}.AOItemList"; this.AIs = InitIOData(IOType.AI, _aiKey); this.AOs = InitIOData(IOType.AO, _aoKey); this.DIs = InitIOData(IOType.DI, _diKey); this.DOs = InitIOData(IOType.DO, _doKey); this.AIsFilter = this.AIs; this.AOsFilter = this.AOs; this.DIsFilter = this.DIs; this.DOsFilter = this.DOs; _diKey = $"{SystemName}.DIList"; _doKey = $"{SystemName}.DOList"; _aiKey = $"{SystemName}.AIList"; _aoKey = $"{SystemName}.AOList"; Subscribe(_aiKey); Subscribe(_aoKey); Subscribe(_diKey); Subscribe(_doKey); } protected override void OnActivate() { base.OnActivate(); } protected override void OnDeactivate(bool close) { base.OnDeactivate(close); } protected override void InvokeAfterUpdateProperty(Dictionary data) { base.InvokeAfterUpdateProperty(data); if (data.ContainsKey(_aiKey) && data[_aiKey] != null) { List lstData = (List)data[_aiKey]; Dictionary dicValues = new Dictionary(); for (int i = 0; i < lstData.Count; i++) { dicValues[lstData[i].Name] = lstData[i].FloatValue; } foreach (IOItem item in AIs) { if (dicValues.ContainsKey(item.Name)) item.Value = dicValues[item.Name]; } } if (data.ContainsKey(_aoKey) && data[_aoKey] != null) { List lstData = (List)data[_aoKey]; Dictionary dicValues = new Dictionary(); for (int i = 0; i < lstData.Count; i++) { dicValues[lstData[i].Name] = lstData[i].FloatValue; } foreach (IOItem item in AOs) { if (dicValues.ContainsKey(item.Name)) item.Value = dicValues[item.Name]; } } if (data.ContainsKey(_diKey) && data[_diKey] != null) { List lstData = (List)data[_diKey]; Dictionary dicValues = new Dictionary(); for (int i = 0; i < lstData.Count; i++) { dicValues[lstData[i].Name] = lstData[i].BoolValue; } foreach (IOItem item in DIs) { if (dicValues.ContainsKey(item.Name)) item.Value = dicValues[item.Name]; } } if (data.ContainsKey(_doKey) && data[_doKey] != null) { List lstData = (List)data[_doKey]; Dictionary dicValues = new Dictionary(); for (int i = 0; i < lstData.Count; i++) { dicValues[lstData[i].Name] = lstData[i].BoolValue; } foreach (IOItem item in DOs) { if (dicValues.ContainsKey(item.Name)) item.Value = dicValues[item.Name]; } } } public void SetDO(IOItem doItem) { if (!DialogBox.Confirm( $"Please be attention, direct control DO is generally forbidden, Are you sure you want to do the operation?\r\n {doItem.Name} = {!doItem.Value}", "Warning")) return; InvokeClient.Instance.Service.DoOperation("System.SetDoValue", doItem.Name, !doItem.Value); } public void SetAO(AOItemFloat AOItemFloat) { if (!DialogBox.Confirm( $"Please be attention, direct control AO is generally forbidden, Are you sure you want to do the operation?\r\n {AOItemFloat.Name} = {AOItemFloat.NewValue}", "Warning" )) return; InvokeClient.Instance.Service.DoOperation("System.SetAoValueFloat", AOItemFloat.Name, AOItemFloat.NewValue); AOItemFloat.TextSaved = true; } public ObservableCollection> InitIOData(IOType type, string dataName) { //get the whole informations ObservableCollection> da = new ObservableCollection>(); if (type == IOType.DI) { var diList = QueryDataClient.Instance.Service.GetData(dataName); if (diList != null) { List item = (List)diList; for (int i = 0; i < item.Count; i++) { bool value = true; if (value is T) { if(item[i].Visible) { da.Add(new IOItem() { Index = item[i].Index, Name = item[i].Name, DisplayName = (string.IsNullOrEmpty(item[i].Description) || item[i].Description.Length > 6) ? item[i].Name.Substring(item[i].Name.IndexOf('.') + 1) : item[i].Name.Substring(item[i].Name.IndexOf('.') + 1) + " (" + item[i].Description + ")", Value = (T)(object)item[i].BoolValue, Address = item[i].Address }); } } } } } if (type == IOType.DO) { var diList = QueryDataClient.Instance.Service.GetData(dataName); if (diList != null) { List item = (List)diList; for (int i = 0; i < item.Count; i++) { bool value = true; if (value is T) { if (item[i].Visible) { da.Add(new IOItem() { Index = item[i].Index, Name = item[i].Name, DisplayName = (string.IsNullOrEmpty(item[i].Description) || item[i].Description.Length > 6) ? item[i].Name.Substring(item[i].Name.IndexOf('.') + 1) : item[i].Name.Substring(item[i].Name.IndexOf('.') + 1) + " (" + item[i].Description + ")", Value = (T)(object)item[i].BoolValue, Address = item[i].Address }); } } } } } if (type == IOType.AI) { var diList = QueryDataClient.Instance.Service.GetData(dataName); if (diList != null) { List item = (List)diList; for (int i = 0; i < item.Count; i++) { if (item[i].Visible) { da.Add(new IOItem() { Index = item[i].Index, Name = item[i].Name, DisplayName = item[i].Name.Substring(item[i].Name.IndexOf('.') + 1), Value = (T)(object)item[i].FloatValue, Address = item[i].Address }); } } } } return da; } public ObservableCollection InitIOData(IOType type, string dataName) { //get the whole informations ObservableCollection da = new ObservableCollection(); if (type == IOType.AO) { var diList = QueryDataClient.Instance.Service.GetData(dataName); if (diList != null) { List item = (List)diList; for (int i = 0; i < item.Count; i++) { if (item[i].Visible) { da.Add(new AOItemFloat() { Index = item[i].Index, Name = item[i].Name, DisplayName = item[i].Name.Substring(item[i].Name.IndexOf('.')+1), Value = item[i].FloatValue, Address = item[i].Address }); } } } } return da; } private string _currentCriteria = String.Empty; public string CurrentCriteria { get { return _currentCriteria; } set { if (value == _currentCriteria) return; _currentCriteria = value; NotifyOfPropertyChange("CurrentCriteria"); ApplyFilter(); } } private void ApplyFilter() { int index = 0; if (int.TryParse(CurrentCriteria, out index)) { DIsFilter = new ObservableCollection>( DIs.Where(d => d.Index == index)); DOsFilter = new ObservableCollection>( DOs.Where(d => d.Index == index)); AIsFilter = new ObservableCollection>( AIs.Where(d => d.Index == index)); AOsFilter = new ObservableCollection( AOs.Where(d => d.Index == index)); } else { DIsFilter = new ObservableCollection>( DIs.Where(d => d.DisplayName.IndexOf(CurrentCriteria, StringComparison.OrdinalIgnoreCase) >= 0)); DOsFilter = new ObservableCollection>( DOs.Where(d => d.DisplayName.IndexOf(CurrentCriteria, StringComparison.OrdinalIgnoreCase) >= 0)); AIsFilter = new ObservableCollection>( AIs.Where(d => d.DisplayName.IndexOf(CurrentCriteria, StringComparison.OrdinalIgnoreCase) >= 0)); AOsFilter = new ObservableCollection( AOs.Where(d => d.DisplayName.IndexOf(CurrentCriteria, StringComparison.OrdinalIgnoreCase) >= 0)); } } public void ClearFilter() { CurrentCriteria = ""; } } }