using Aitex.Core.Common.DeviceData; using Aitex.Core.UI.Control; using Aitex.Core.Util; using MECF.Framework.Common.OperationCenter; using MECF.Framework.UI.Core.Control; using MECF.Framework.UI.Core.ExtendedControls; using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Media.Imaging; using System.Windows.Threading; namespace Aitex.Core.UI.DeviceControl { /// /// AITGasIIIValve.xaml 的交互逻辑 /// public partial class AITGasIIIValve : UserControl { public AITGasIIIValve() { InitializeComponent(); } // define dependency properties public static readonly DependencyProperty CommandProperty = DependencyProperty.Register( "Command", typeof(ICommand), typeof(AITGasIIIValve), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender)); public ICommand Command { get { return (ICommand)this.GetValue(CommandProperty); } set { this.SetValue(CommandProperty, value); } } public Window AITGasOwner { get; set; } public bool IsSwitchOpen { get; set; } public BrushConverter _brushconvert = new BrushConverter(); public bool IsVirtualSwitchOpen { get; set; } private SwitchDialog dialog; private string _valveDisplayName = ""; public string ValveDisplayName { get => _valveDisplayName; set { _valveDisplayName = value; } } public bool IsSim { get { return (bool)this.GetValue(IsSimProperty); } set { this.SetValue(IsSimProperty, value); } } // Using a DependencyProperty as the backing store for MenuVisibility. This enables animation, styling, binding, etc... public static readonly DependencyProperty IsSimProperty = DependencyProperty.Register("IsSim", typeof(bool), typeof(AITGasIIIValve), new FrameworkPropertyMetadata(false)); Storyboard sb; public Visibility MenuVisibility { get { return (Visibility)this.GetValue(MenuVisibilityProperty); } set { this.SetValue(MenuVisibilityProperty, value); } } // Using a DependencyProperty as the backing store for MenuVisibility. This enables animation, styling, binding, etc... public static readonly DependencyProperty MenuVisibilityProperty = DependencyProperty.Register("MenuVisibility", typeof(Visibility), typeof(AITGasIIIValve), new FrameworkPropertyMetadata(Visibility.Visible)); public static readonly DependencyProperty DeviceDataProperty = DependencyProperty.Register( "DeviceData", typeof(AITValveData), typeof(AITGasIIIValve), new FrameworkPropertyMetadata(new AITValveData(), FrameworkPropertyMetadataOptions.AffectsRender)); public AITValveData DeviceData { get { var data = (AITValveData)this.GetValue(DeviceDataProperty); switch (GasStateType) { case GasPanelStateType.Manual: case GasPanelStateType.Monitor: { rdTrig.CLK = (data == null || data.IsOpen); flickerTrig.CLK = (data == null || data.IsOpen) && data.IsILKOK; if (flickerTrig.R) { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("White"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("OpenValveStoryBoard") as Storyboard; sb.Begin(); })); } if (rdTrig.R) { if (data.IsILKOK) { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("White"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("OpenValveStoryBoard") as Storyboard; sb.Begin(); })); } else { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("White"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("FlickerValveStoryBoard") as Storyboard; sb.Begin(); })); } } if (rdTrig.T) { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("Black"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("CloseValveStoryBoard") as Storyboard; sb.Begin(); })); } } break; case GasPanelStateType.Recipe: rdTrig.CLK = (data == null || data.VirtualFeedback); if (rdTrig.R) { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("White"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("OpenValveStoryBoard") as Storyboard; sb.Begin(); })); IsVirtualSwitchOpen = true; } if (rdTrig.T) { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("Black"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("CloseValveStoryBoard") as Storyboard; sb.Begin(); })); IsVirtualSwitchOpen = false; } break; default: break; } return data; } set { this.SetValue(DeviceDataProperty, value); } } public static readonly DependencyProperty GasPanelStateTypeProperty = DependencyProperty.Register( "GasStateType", typeof(GasPanelStateType), typeof(AITGasIIIValve), new FrameworkPropertyMetadata(GasPanelStateType.Manual, FrameworkPropertyMetadataOptions.AffectsRender)); public GasPanelStateType GasStateType { get { return (GasPanelStateType)this.GetValue(GasPanelStateTypeProperty); } set { this.SetValue(GasPanelStateTypeProperty, value); } } public bool IsShowSwitchDialog { get { return (bool)GetValue(IsShowSwitchDialogProperty); } set { SetValue(IsShowSwitchDialogProperty, value); } } // Using a DependencyProperty as the backing store for IsShowSwitchDialog. This enables animation, styling, binding, etc... public static readonly DependencyProperty IsShowSwitchDialogProperty = DependencyProperty.Register("IsShowSwitchDialog", typeof(bool), typeof(AITGasIIIValve), new PropertyMetadata(false)); public static readonly DependencyProperty DeviceData2Property = DependencyProperty.Register( "DeviceData2", typeof(AITValveData), typeof(AITGasIIIValve), new FrameworkPropertyMetadata(new AITValveData(), FrameworkPropertyMetadataOptions.AffectsRender)); public AITValveData DeviceData2 { get { return (AITValveData)this.GetValue(DeviceData2Property); } set { this.SetValue(DeviceData2Property, value); } } public static readonly DependencyProperty ValveOpenOrientationProperty = DependencyProperty.Register( "ValveOpenOrientation", typeof(LineOrientation), typeof(AITGasIIIValve), new FrameworkPropertyMetadata(LineOrientation.Horizontal, FrameworkPropertyMetadataOptions.AffectsRender)); public LineOrientation ValveOpenOrientation { get { return (LineOrientation)GetValue(ValveOpenOrientationProperty); } set { SetValue(ValveOpenOrientationProperty, value); } } public static readonly DependencyProperty IsDisableModeProperty = DependencyProperty.Register( "IsDisableMode", typeof(bool), typeof(AITGasIIIValve), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); public bool IsDisableMode { get { return (bool)GetValue(IsDisableModeProperty); } set { SetValue(IsDisableModeProperty, value); } } public bool IsOpen => DeviceData == null || DeviceData.IsOpen; private DispatcherTimer valveTimer = new DispatcherTimer(); RD_TRIG rdTrig = new RD_TRIG(); RD_TRIG flickerTrig = new RD_TRIG(); private BitmapSource GetImage(string name) { return new BitmapImage(new Uri(string.Format("pack://application:,,,/MECF.Framework.Common;component/Resources/Valve/{0}", name))); } protected override void OnRender(DrawingContext drawingContext) { var data = (AITValveData)this.GetValue(DeviceDataProperty); if (data != null) { ValveName.Text = DeviceData.DisplayName.Replace("ValveAV", ""); if ((DeviceData.Feedback && GasStateType == GasPanelStateType.Manual) || (DeviceData.Feedback && GasStateType == GasPanelStateType.Monitor) || (DeviceData.VirtualFeedback && GasStateType == GasPanelStateType.Recipe)) { if (!DeviceData.IsILKOK && !(GasStateType == GasPanelStateType.Recipe)) { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("White"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("FlickerValveStoryBoard") as Storyboard; sb.Begin(); })); } else if (DeviceData.IsILKOK && !DeviceData.Feedback && !(GasStateType == GasPanelStateType.Recipe)) { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("Black"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("CloseValveStoryBoard") as Storyboard; sb.Begin(); })); } else { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("White"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("OpenValveStoryBoard") as Storyboard; sb.Begin(); })); } } else { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("Black"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("CloseValveStoryBoard") as Storyboard; sb.Begin(); })); } this.ToolTip = $"Valve Name:{DeviceData.DisplayName} \r\n Device ID:{DeviceData.DeviceSchematicId} \r\n SetPoint:{DeviceData.SetPoint} \r\n SetVirtual:{DeviceData.VirtualFeedback} \r\n Status:{DeviceData.Feedback}"; } else { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("Black"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("CloseValveStoryBoard") as Storyboard; sb.Begin(); })); } base.OnRender(drawingContext); } private void OpenValve(object sender, RoutedEventArgs e) { if (IsDisableMode) return; switch (GasStateType) { case GasPanelStateType.Manual: InvokeClient.Instance.Service.DoOperation($"{DeviceData.UniqueName}.{AITValveOperation.GVTurnValve}", true); break; case GasPanelStateType.Monitor: //InvokeClient.Instance.Service.DoOperation($"{DeviceData.UniqueName}.{AITValveOperation.GVTurnValve}", true); break; case GasPanelStateType.Recipe: InvokeClient.Instance.Service.DoOperation($"{DeviceData.UniqueName}.{AITValveOperation.GVVirtualTurnValve}", true); break; default: break; } if (Command == null) return; Command.Execute(new object[] { DeviceData.DeviceName, AITValveOperation.GVVirtualTurnValve, true }); } private void CloseValve(object sender, RoutedEventArgs e) { if (IsDisableMode) return; switch (GasStateType) { case GasPanelStateType.Manual: InvokeClient.Instance.Service.DoOperation($"{DeviceData.UniqueName}.{AITValveOperation.GVTurnValve}", false); break; case GasPanelStateType.Monitor: //InvokeClient.Instance.Service.DoOperation($"{DeviceData.UniqueName}.{AITValveOperation.GVTurnValve}", false); break; case GasPanelStateType.Recipe: InvokeClient.Instance.Service.DoOperation($"{DeviceData.UniqueName}.{AITValveOperation.GVVirtualTurnValve}", false); break; default: break; } if (Command == null) return; Command.Execute(new object[] { DeviceData.DeviceName, AITValveOperation.GVVirtualTurnValve, false }); } private void AITGasValve_OnLoaded(object sender, RoutedEventArgs e) { imgValveOpen.Source = GetImage(ValveOpenOrientation == LineOrientation.Horizontal ? "ValveOpenVerticalJet.png" : "ValveOpenHorizontalJet.png"); imgValveClose.Source = GetImage(ValveOpenOrientation == LineOrientation.Vertical ? "ValveCloseVerticalJet.png" : "ValveCloseHorizontalJet.png"); if (DeviceData == null || DeviceData.IsOpen) { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("White"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("OpenValveStoryBoard") as Storyboard; sb.Begin(); })); } else { Application.Current.Dispatcher.BeginInvoke(new Action(() => { ValveName.Foreground = (Brush)_brushconvert.ConvertFromString("Black"); if (sb != null) { sb.Stop(); sb.Remove(); } sb = this.FindResource("CloseValveStoryBoard") as Storyboard; sb.Begin(); })); } //valveTimer.Start(); } private void imgValveClose_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (e.StylusDevice != null) e.Handled = true;//认为误触,直接标记成已处理 else imgValve_TouchUp(sender, null); } private void imgValve_TouchUp(object sender, TouchEventArgs e) { if (IsShowSwitchDialog) { dialog = new SwitchDialog { }; dialog.IsOpen = GasStateType == GasPanelStateType.Recipe ? IsVirtualSwitchOpen : IsSwitchOpen; dialog.Owner = AITGasOwner; dialog.Topmost = true; dialog.WindowStartupLocation = WindowStartupLocation.CenterScreen; dialog.DeviceName = "Valve Name: " + DeviceData.DeviceName.Replace("Valve", ""); dialog.ShowDialog(); if ((bool)dialog.IsSave) { switch (GasStateType) { case GasPanelStateType.Manual: IsSwitchOpen = dialog.IsOpen; InvokeClient.Instance.Service.DoOperation($"{DeviceData.UniqueName}.{AITValveOperation.GVTurnValve}", dialog.IsOpen); break; case GasPanelStateType.Monitor: break; case GasPanelStateType.Recipe: IsVirtualSwitchOpen = dialog.IsOpen; InvokeClient.Instance.Service.DoOperation($"{DeviceData.UniqueName}.{AITValveOperation.GVVirtualTurnValve}", dialog.IsOpen); break; default: break; } } if (Command == null) return; Command.Execute(new object[] { DeviceData.DeviceName, AITValveOperation.GVVirtualTurnValve, IsVirtualSwitchOpen }); } else { //if (IsDisableMode) return; switch (GasStateType) { case GasPanelStateType.Manual: DeviceData.Feedback = !DeviceData.IsOpen; rdTrig.CLK = (DeviceData == null || DeviceData.IsOpen); IsSwitchOpen = DeviceData.Feedback; //IsSwitchOpen = !IsSwitchOpen; //InvokeClient.Instance.Service.DoOperation($"{DeviceData.UniqueName}.{AITValveOperation.GVTurnValve}", IsSwitchOpen); break; case GasPanelStateType.Monitor: break; case GasPanelStateType.Recipe: IsVirtualSwitchOpen = !IsVirtualSwitchOpen; InvokeClient.Instance.Service.DoOperation($"{DeviceData.UniqueName}.{AITValveOperation.GVVirtualTurnValve}", IsVirtualSwitchOpen); break; default: break; } if (Command == null) return; Command.Execute(new object[] { DeviceData.DeviceName, AITValveOperation.GVVirtualTurnValve, IsVirtualSwitchOpen }); } } } }