using Aitex.Core.RT.Log; using Aitex.Core.RT.RecipeCenter; using Aitex.Core.UI.MVVM; using Aitex.Core.Utilities; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.OperationCenter; using MECF.Framework.Common.Persistent.Prewet; using MECF.Framework.Common.Persistent.SRD; using MECF.Framework.Common.RecipeCenter; using MECF.Framework.Common.Routine; using CyberX8_Core; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; 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.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace CyberX8_Themes.UserControls { /// /// RecipeControl.xaml 的交互逻辑 /// public partial class RecipeControl : UserControl { public RecipeControl() { InitializeComponent(); } #region 属性 public static readonly DependencyProperty ModuleNameProperty = DependencyProperty.Register( "ModuleName", typeof(string), typeof(RecipeControl), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender)); /// /// 模块名称 /// public string ModuleName { get { return (string)this.GetValue(ModuleNameProperty); } set { this.SetValue(ModuleNameProperty, value); } } public static readonly DependencyProperty ModuleTitleProperty = DependencyProperty.Register( "ModuleTitle", typeof(string), typeof(RecipeControl), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender)); /// /// 模块名称 /// public string ModuleTitle { get { return (string)this.GetValue(ModuleTitleProperty); } set { this.SetValue(ModuleTitleProperty, value); } } public static readonly DependencyProperty InputCycleTimesProperty = DependencyProperty.Register( "InputCycleTimes", typeof(int), typeof(RecipeControl), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.AffectsRender)); /// /// InputCycleTimes /// public int InputCycleTimes { get { return (int)this.GetValue(InputCycleTimesProperty); } set { this.SetValue(InputCycleTimesProperty, value); } } public static readonly DependencyProperty AchievedCycleTimesProperty = DependencyProperty.Register( "AchievedCycleTimes", typeof(int), typeof(RecipeControl), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.AffectsRender)); /// /// AchievedCycleTimes /// public int AchievedCycleTimes { get { return (int)this.GetValue(AchievedCycleTimesProperty); } set { this.SetValue(AchievedCycleTimesProperty, value); } } public static readonly DependencyProperty NumberOfSelectedRecipeScansProperty = DependencyProperty.Register( "NumberOfSelectedRecipeScans", typeof(int), typeof(RecipeControl), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.AffectsRender)); /// /// NumberOfSelectedRecipeScans /// public int NumberOfSelectedRecipeScans { get { return (int)this.GetValue(NumberOfSelectedRecipeScansProperty); } set { this.SetValue(NumberOfSelectedRecipeScansProperty, value); } } public static readonly DependencyProperty SelectedRecipeNodeProperty = DependencyProperty.Register( "SelectedRecipeNode", typeof(RecipeNode), typeof(RecipeControl),new FrameworkPropertyMetadata(null, new PropertyChangedCallback(SelectedRecipeNodeChanged))); /// /// 当前选中recipe节点 /// public RecipeNode SelectedRecipeNode { get { return (RecipeNode)this.GetValue(SelectedRecipeNodeProperty); } set { this.SetValue(SelectedRecipeNodeProperty, value); } } public static readonly DependencyProperty RecipeTypeProperty = DependencyProperty.Register( "RecipeType", typeof(string), typeof(RecipeControl)); /// /// Recipe类型 /// public string RecipeType { get { return (string)this.GetValue(RecipeTypeProperty); } set { this.SetValue(RecipeTypeProperty, value); } } public static readonly DependencyProperty LoadEnabledProperty = DependencyProperty.Register( "LoadEnabled", typeof(bool), typeof(RecipeControl),new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); /// /// 按钮可用性 /// public bool LoadEnabled { get { return (bool)this.GetValue(LoadEnabledProperty); } set { this.SetValue(LoadEnabledProperty, value); } } /// /// 选中Recipe文件的触发的方法 /// /// /// private static void SelectedRecipeNodeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue != null) { d.SetValue(LoadEnabledProperty, true); } else { d.SetValue(LoadEnabledProperty, false); } } public static readonly DependencyProperty CurrentOperationModeProperty = DependencyProperty.Register( "CurrentOperationMode", typeof(string), typeof(RecipeControl)); /// /// CurrentOperationMode /// public string CurrentOperationMode { get { return (string)this.GetValue(CurrentOperationModeProperty); } set { this.SetValue(CurrentOperationModeProperty, value); } } public static readonly DependencyProperty IsEngineeringProperty = DependencyProperty.Register( "IsEngineering", typeof(bool), typeof(RecipeControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); /// /// IsEngineering /// public bool IsEngineering { get { return (bool)this.GetValue(IsEngineeringProperty); } set { this.SetValue(IsEngineeringProperty, value); } } public static readonly DependencyProperty IsProductionProperty = DependencyProperty.Register( "IsProduction", typeof(bool), typeof(RecipeControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); /// /// IsProduction /// public bool IsProduction { get { return (bool)this.GetValue(IsProductionProperty); } set { this.SetValue(IsProductionProperty, value); } } public static readonly DependencyProperty RecipeModeValueProperty = DependencyProperty.Register( "RecipeModeValue", typeof(string), typeof(RecipeControl), new FrameworkPropertyMetadata("", new PropertyChangedCallback(OnItemsSourceChanged))); /// /// OpertationModeValue /// public string RecipeModeValue { get { return (string)this.GetValue(RecipeModeValueProperty); } set { this.SetValue(RecipeModeValueProperty, value); } } private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue != null) { string currentMode = (string)e.NewValue; switch (currentMode) { case "Engineering": d.SetValue(IsEngineeringProperty, true); d.SetValue(IsProductionProperty, false); break; case "Production": d.SetValue(IsEngineeringProperty, false); d.SetValue(IsProductionProperty, true); break; default: break; } } } #endregion private void GetRecipeType() { if (SelectedRecipeNode.RecipeFullFileName.Contains("pwt")) { PwtRecipe pwtRecipe = RecipeFileManager.Instance.LoadGenericityRecipe(SelectedRecipeNode.RecipeFullFileName); if (pwtRecipe != null) { NumberOfSelectedRecipeScans = pwtRecipe.NumberOfScans; } } } private void Pause_Click(object sender, RoutedEventArgs e) { if ("Manual".Equals(CurrentOperationMode)) { InvokeClient.Instance.Service.DoOperation($"{ModuleName}.PauseWaferRecipe", SelectedRecipeNode.RecipeFullFileName, InputCycleTimes); } else { MessageBox.Show("Current OperationMode Can't Perform This Action", $"Current OperationMode is {CurrentOperationMode}", MessageBoxButton.OK, MessageBoxImage.Error); } } private void Resume_Click(object sender, RoutedEventArgs e) { if ("Manual".Equals(CurrentOperationMode)) { InvokeClient.Instance.Service.DoOperation($"{ModuleName}.ResumeWaferRecipe", SelectedRecipeNode.RecipeFullFileName, InputCycleTimes); } else { MessageBox.Show("Current OperationMode Can't Perform This Action", $"Current OperationMode is {CurrentOperationMode}", MessageBoxButton.OK, MessageBoxImage.Error); } } private void Abort_Click(object sender, RoutedEventArgs e) { if ("Manual".Equals(CurrentOperationMode)) { InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort"); } else { if (RecipeModeValue != SelectedRecipeNode.RecipeLocation) { MessageBox.Show("Recipe OperationMode is not match!", $"Current Recipe OperationMode is {RecipeModeValue}", MessageBoxButton.OK, MessageBoxImage.Error); } else { MessageBox.Show("Current OperationMode Can't Perform This Action", $"Current OperationMode is {CurrentOperationMode}", MessageBoxButton.OK, MessageBoxImage.Error); } } } private void Edit_Click(object sender, RoutedEventArgs e) { string _recipeName = ""; string pattern3 = @"^SRD\d$"; string pattern2 = @"^Dryer\d$"; string pattern1 = @"^Rinse\d$"; string pattern4 = @"^Reservoir\d$"; Regex regex3 = new Regex(pattern3); Regex regex2 = new Regex(pattern2); Regex regex1 = new Regex(pattern1); Regex regex4 = new Regex(pattern4); switch (ModuleName) { case "Prewet1": _recipeName = "PwtRecipe"; break; case string str when regex1.IsMatch(str): _recipeName = "QdrRecipe"; break; case string str when regex2.IsMatch(str): _recipeName = "HvdRecipe"; break; case string str when regex3.IsMatch(str): _recipeName = "SrdRecipe"; break; case string str when regex4.IsMatch(str): _recipeName = "ResRecipe"; break; default: break; } if (!"Manual".Equals(CurrentOperationMode)) { MessageBox.Show("Current OperationMode Can't Perform This Action", $"Current OperationMode is {CurrentOperationMode}", MessageBoxButton.OK, MessageBoxImage.Error); } else { if (RecipeModeValue != SelectedRecipeNode.RecipeLocation) { MessageBox.Show("Recipe OperationMode is not match!", $"Current Recipe OperationMode is {RecipeModeValue}", MessageBoxButton.OK, MessageBoxImage.Error); } else { GlobalEvents.OnSwitchFixedTabItem("Recipe", "", _recipeName); } } } private void RunRecipe_Click(object sender, RoutedEventArgs e) { GetRecipeType(); if ("Manual".Equals(CurrentOperationMode)) { if (InputCycleTimes==0) { MessageBox.Show("Please Enter CycleTimes First!", "Current Cycle is 0", MessageBoxButton.OK, MessageBoxImage.Error); } else { InvokeClient.Instance.Service.DoOperation($"{ModuleName}.CycleManualProcessRecipe", SelectedRecipeNode.RecipeFullFileName, InputCycleTimes); } } else { MessageBox.Show("Current OperationMode Can't Perform This Action", $"Current OperationMode is {CurrentOperationMode}", MessageBoxButton.OK, MessageBoxImage.Error); } } } }