using Aitex.Core.Common; using FurnaceUI.Views.Maintenances; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.OperationCenter; using MECF.Framework.Common.SubstrateTrackings; using MECF.Framework.UI.Client.Annotations; using MECF.Framework.UI.Client.ClientBase; using SciChart.Core.Extensions; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace FurnaceUI.Controls.Parts { /// /// CassetteView.xaml 的交互逻辑 /// public partial class CassetteView : UserControl, INotifyPropertyChanged { public string CarrierModule { get { return (string)GetValue(CarrierModuleProperty); } set { SetValue(CarrierModuleProperty, value); } } public static readonly DependencyProperty CarrierModuleProperty = DependencyProperty.Register("CarrierModule", typeof(string), typeof(CassetteView), new PropertyMetadata("System")); public int CarrierSlot { get { return (int)GetValue(CarrierSlotProperty); } set { SetValue(CarrierSlotProperty, value); } } public static readonly DependencyProperty CarrierSlotProperty = DependencyProperty.Register("CarrierSlot", typeof(int), typeof(CassetteView), new PropertyMetadata(0)); public CarrierInfo CarrierData { get { return (CarrierInfo)GetValue(CarrierDataProperty); } set { SetValue(CarrierDataProperty, value); OnPropertyChanged("CarrierData"); } } public static readonly DependencyProperty CarrierDataProperty = DependencyProperty.Register("CarrierData", typeof(CarrierInfo), typeof(CassetteView), new PropertyMetadata(new CarrierInfo(1), CarrierDataChangedCallback)); public Visibility StockerPCassetteVisibility { get { return (Visibility)GetValue(StockerPCassetteVisibilityProperty); } set { SetValue(StockerPCassetteVisibilityProperty, value); } } // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc... public static readonly DependencyProperty StockerPCassetteVisibilityProperty = DependencyProperty.Register("StockerPCassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden)); public Visibility StockerEDCassetteVisibility { get { return (Visibility)GetValue(StockerEDCassetteVisibilityProperty); } set { SetValue(StockerEDCassetteVisibilityProperty, value); } } // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc... public static readonly DependencyProperty StockerEDCassetteVisibilityProperty = DependencyProperty.Register("StockerEDCassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden)); public Visibility ProcessCassetteVisibility { get { return (Visibility)GetValue(ProcessCassetteVisibilityProperty); } set { SetValue(ProcessCassetteVisibilityProperty, value); } } // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc... public static readonly DependencyProperty ProcessCassetteVisibilityProperty = DependencyProperty.Register("ProcessCassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden)); public Visibility StockerMCassetteVisibility { get { return (Visibility)GetValue(StockerMCassetteVisibilityProperty); } set { SetValue(StockerMCassetteVisibilityProperty, value); } } // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc... public static readonly DependencyProperty StockerMCassetteVisibilityProperty = DependencyProperty.Register("StockerMCassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden)); public Visibility StockerM1CassetteVisibility { get { return (Visibility)GetValue(StockerM1CassetteVisibilityProperty); } set { SetValue(StockerM1CassetteVisibilityProperty, value); } } // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc... public static readonly DependencyProperty StockerM1CassetteVisibilityProperty = DependencyProperty.Register("StockerM1CassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden)); public Visibility StockerM2CassetteVisibility { get { return (Visibility)GetValue(StockerM2CassetteVisibilityProperty); } set { SetValue(StockerM2CassetteVisibilityProperty, value); } } // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc... public static readonly DependencyProperty StockerM2CassetteVisibilityProperty = DependencyProperty.Register("StockerM2CassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden)); public Visibility StockerSDCassetteVisibility { get { return (Visibility)GetValue(StockerSDCassetteVisibilityProperty); } set { SetValue(StockerSDCassetteVisibilityProperty, value); } } // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc... public static readonly DependencyProperty StockerSDCassetteVisibilityProperty = DependencyProperty.Register("StockerSDCassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden)); public string CassetteType { get { return (string)GetValue(CassetteTypeProperty); } set { SetValue(CassetteTypeProperty, value); OnPropertyChanged("CassetteType"); } } // Using a DependencyProperty as the backing store for CassetteType. This enables animation, styling, binding, etc... public static readonly DependencyProperty CassetteTypeProperty = DependencyProperty.Register("CassetteType", typeof(string), typeof(CassetteView), new PropertyMetadata(null, CassetteTypeChangedCallback)); public int WaferCount { get { return (int)GetValue(WaferCountProperty); } set { SetValue(WaferCountProperty, value); OnPropertyChanged("WaferCount"); } } // Using a DependencyProperty as the backing store for WaferCount. This enables animation, styling, binding, etc... public static readonly DependencyProperty WaferCountProperty = DependencyProperty.Register("WaferCount", typeof(int), typeof(CassetteView), new PropertyMetadata(0)); public double oldScale = 0; public static void CarrierDataChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { var selfView = (CassetteView)d; var data = (CarrierInfo)e.NewValue; //if (!ModuleManager.ModuleInfos.ContainsKey(selfView.CarrierModule)) //{ // selfView.ProcessCassetteVisibility = Visibility.Hidden; // return; //} //var currentWafers = ModuleManager.ModuleInfos[selfView.CarrierModule].WaferManager.Wafers; //if (data == null || !data.HasWaferIn || currentWafers == null || currentWafers.Count == 0) //{ // selfView.ProcessCassetteVisibility = Visibility.Hidden; // SetCassetteColor(selfView.CassetteType, d); // return; //} //var tempList = currentWafers.Where(p => !string.IsNullOrEmpty(p.WaferID)).ToList(); //if (tempList.All(o => o.WaferStatus > 1)) //{ // var processedWafer = currentWafers.Where(a => a.WaferStatus > 1).FirstOrDefault(); // if (processedWafer != null && (processedWafer.WaferType.Equals(WaferType.P) || processedWafer.WaferType.Equals(WaferType.M) || processedWafer.WaferType.Equals(WaferType.M1) || processedWafer.WaferType.Equals(WaferType.M2))) // { // selfView.StockerPCassetteVisibility = Visibility.Hidden; // selfView.StockerMCassetteVisibility = Visibility.Hidden; // selfView.StockerM1CassetteVisibility = Visibility.Hidden; // selfView.StockerM2CassetteVisibility = Visibility.Hidden; // selfView.StockerSDCassetteVisibility = Visibility.Hidden; // selfView.StockerEDCassetteVisibility = Visibility.Hidden; // selfView.ProcessCassetteVisibility = Visibility.Visible; // } //} } public static void CassetteTypeChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { var self = (CassetteView)d; switch ((string)e.NewValue) { case "P": self.StockerPCassetteVisibility = Visibility.Visible; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "M": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Visible; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "M1": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Visible; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "M2": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Visible; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "SD": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Visible; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "ED": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Visible; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "Process": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Visible; break; default: self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; } } static void SetCassetteColor(string typeStr, DependencyObject d) { var self = (CassetteView)d; switch (typeStr) { case "P": self.StockerPCassetteVisibility = Visibility.Visible; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "M": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Visible; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "M1": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Visible; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "M2": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Visible; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "SD": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Visible; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "ED": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Visible; self.ProcessCassetteVisibility = Visibility.Hidden; break; case "Process": self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Visible; break; default: self.StockerPCassetteVisibility = Visibility.Hidden; self.StockerMCassetteVisibility = Visibility.Hidden; self.StockerM1CassetteVisibility = Visibility.Hidden; self.StockerM2CassetteVisibility = Visibility.Hidden; self.StockerSDCassetteVisibility = Visibility.Hidden; self.StockerEDCassetteVisibility = Visibility.Hidden; self.ProcessCassetteVisibility = Visibility.Hidden; break; } } public CassetteView() { InitializeComponent(); } public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { } protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); } public void Filp(int filp, int angle, bool absolute = true, int ms = 0, double accelerationRatio = 0, double decelerationRatio = 0, Action onComplete = null) { var storyboard = new Storyboard(); storyboard.Completed += (s, e) => onComplete?.Invoke(); if (Filp(storyboard, filp, angle, absolute, ms, accelerationRatio, decelerationRatio, onComplete)) { storyboard.Begin(); } else { onComplete?.Invoke(); } } public bool Filp(Storyboard storyboard, int filp, int angle, bool absolute = true, int ms = 0, double accelerationRatio = 0, double decelerationRatio = 0, Action onComplete = null) { var newScale = 0.5; if (newScale == oldScale) { return false; } ScaleTransform scaleTransform = new ScaleTransform(); if (filp == 180) { scaleTransform.ScaleX = -1; } else { scaleTransform.ScaleX = 1; } TransformGroup Group = new TransformGroup(); Group.Children.Add(scaleTransform); tbWaferCount.RenderTransform = Group; tbWaferCount.RenderTransformOrigin = new Point(0.5, 0.5); var animation = new DoubleAnimation(oldScale, angle, TimeSpan.FromMilliseconds(ms)); animation.AccelerationRatio = accelerationRatio; animation.DecelerationRatio = decelerationRatio; storyboard.Children.Add(animation); Storyboard.SetTarget(animation, tbWaferCount); Storyboard.SetTargetProperty(animation, new PropertyPath("RenderTransform.(TransformGroup.Children)[0].(TranslateTransform.X)")); oldScale = angle; return true; } private void CreateCassette(object sender, RoutedEventArgs e) { InvokeClient.Instance.Service.DoOperation("System.CreateCarrier", CarrierModule, 0); } private void DeleteCassette(object sender, RoutedEventArgs e) { InvokeClient.Instance.Service.DoOperation("System.DeleteCarrier", CarrierModule, 0); } } }