435 lines
18 KiB
C#
435 lines
18 KiB
C#
using Aitex.Core.RT.Log;
|
||
using Caliburn.Micro;
|
||
using MECF.Framework.Common.OperationCenter;
|
||
using OpenSEMI.Ctrlib.Controls;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Windows;
|
||
using System.Windows.Controls;
|
||
|
||
using MECF.Framework.Common.Equipment;
|
||
using MECF.Framework.UI.Client.CenterViews.Tray;
|
||
using MECF.Framework.Common.SubstrateTrackings;
|
||
using MECF.Framework.Common.DataCenter;
|
||
using MECF.Framework.RT.Core.DBProviderEx;
|
||
|
||
namespace MECF.Framework.UI.Client.ClientBase
|
||
{
|
||
public class MenuElement
|
||
{
|
||
public string Name { get; set; }
|
||
public string Invoke { get; set; }
|
||
public bool IsSeparator { get; set; }
|
||
}
|
||
|
||
public class ContextMenuManager
|
||
{
|
||
public bool ShowAligner { get; set; }
|
||
public bool ShowCooling { get; set; }
|
||
|
||
public static string SF = "{0:F}";
|
||
|
||
public ContextMenuManager()
|
||
{
|
||
_slotMenus = InitMenus(_SlotMenuElements);
|
||
_carrierMenus = InitMenus(_carrierMenuElements);
|
||
|
||
ShowAligner = true;
|
||
ShowCooling = true;
|
||
}
|
||
|
||
#region single Instance
|
||
private static ContextMenuManager m_Instance = null;
|
||
public static ContextMenuManager Instance
|
||
{
|
||
get
|
||
{
|
||
if (m_Instance == null)
|
||
{
|
||
m_Instance = new ContextMenuManager();
|
||
}
|
||
return m_Instance;
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region Slot Menus
|
||
|
||
private ContextMenu _slotMenus;
|
||
public ContextMenu SlotMenus
|
||
{
|
||
get { return _slotMenus; }
|
||
}
|
||
|
||
private readonly List<MenuElement> _SlotMenuElements = new List<MenuElement>() {
|
||
new MenuElement(){ Name="Create Wafer", Invoke="CreateWafer"},
|
||
new MenuElement(){ Name="Delete Wafer", Invoke="DeleteWafer"},
|
||
new MenuElement(){ Name="-", IsSeparator = true},
|
||
new MenuElement(){ Name="Return Wafer", Invoke="ReturnWafer"},
|
||
new MenuElement(){ Name="Tray Info", Invoke="TrayInfo"}
|
||
|
||
};
|
||
//public ContextMenu GetSlotMenus(Slot slot)
|
||
//{
|
||
// if (slot != null)
|
||
// {
|
||
// MenuItem createWafer = _slotMenus.Items.GetItemAt(0) as MenuItem;
|
||
// MenuItem deleteWafer = _slotMenus.Items.GetItemAt(1) as MenuItem;
|
||
// MenuItem returnWafer = _slotMenus.Items.GetItemAt(3) as MenuItem;
|
||
|
||
// createWafer.IsEnabled = (WaferStatus)slot.WaferStatus == WaferStatus.Empty ? true : false;
|
||
// deleteWafer.IsEnabled = (WaferStatus)slot.WaferStatus == WaferStatus.Empty ? false : true;
|
||
// returnWafer.IsEnabled = (WaferStatus)slot.WaferStatus != WaferStatus.Empty && !slot.ModuleID.StartsWith("LP");
|
||
// }
|
||
// return _slotMenus;
|
||
//}
|
||
public ContextMenu GetSlotMenus(Slot slot)
|
||
{
|
||
if (slot != null)
|
||
{
|
||
if (slot.ModuleID == "" || slot.ModuleID == ModuleName.PM2.ToString())
|
||
{
|
||
return null;
|
||
}
|
||
else if (slot.ModuleID == ModuleName.LoadLock.ToString() || slot.ModuleID == ModuleName.Buffer.ToString())
|
||
{
|
||
return GetAllMenus(slot);
|
||
}
|
||
else
|
||
{
|
||
return GetWaferMenus(slot);
|
||
}
|
||
|
||
}
|
||
return null;
|
||
}
|
||
public void OnContextMenuClick(object sender, RoutedEventArgs args)
|
||
{
|
||
try
|
||
{
|
||
MenuItem m_menu = sender as MenuItem;
|
||
Slot CurrentSlot = ContextMenuService.GetPlacementTarget(LogicalTreeHelper.GetParent(m_menu)) as Slot;
|
||
if (CurrentSlot == null)
|
||
return;
|
||
|
||
MenuElement ele = m_menu.Tag as MenuElement;
|
||
if (ele.Invoke == "TrayInfo")
|
||
{
|
||
ModuleName chamber = ModuleHelper.Converter(CurrentSlot.ModuleID);
|
||
int slot = (int)CurrentSlot.SlotID;
|
||
|
||
|
||
//查询当前wafer_guid是否存在,如果存在提示:已存在,是否更新?
|
||
InvokeClient.Instance.Service.DoOperation("GetTrayInfoByWaferguid2", CurrentSlot.ModuleID, CurrentSlot.SlotID);
|
||
//System.Threading.Thread.Sleep(100);
|
||
string[] _subscribedKeys = { "System.TrayInfo.TrayInfoByWaferguid" };
|
||
Dictionary<string, object> result = QueryDataClient.Instance.Service.PollData(_subscribedKeys);
|
||
string sTrayInfoByWaferguid = "";
|
||
if (result != null && result.Count>0)
|
||
{
|
||
sTrayInfoByWaferguid = result["System.TrayInfo.TrayInfoByWaferguid"].ToString();
|
||
}
|
||
|
||
tray_thickness_data data = new tray_thickness_data();
|
||
if (sTrayInfoByWaferguid.Trim().Length > 0)
|
||
{
|
||
try
|
||
{
|
||
if (MessageBox.Show("The information of the trays which load this wafer has already existed. Will you update it with the new one?", "Please make sure.", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.No)
|
||
{
|
||
return;
|
||
}
|
||
data.StringTo(sTrayInfoByWaferguid);
|
||
|
||
//
|
||
winTrayNumber winTN = new winTrayNumber();
|
||
|
||
//可以直接使用字符串数组赋值
|
||
winTN.TrayNumber = String.Format(SF,data.tray_number);
|
||
winTN.TrayCoating = String.Format(SF, data.tray_coating);
|
||
winTN.TrayMax = String.Format(SF, data.tray_max);
|
||
//
|
||
winTN.TrayInnerNumber = data.tray_inner_number;
|
||
winTN.TrayInnerCoating = String.Format(SF, data.tray_inner_coating);
|
||
winTN.TrayInnerMax = String.Format(SF, data.tray_inner_max);
|
||
//
|
||
winTN.RingInnerNumber = data.ring_inner_number;
|
||
winTN.RingInnerCoating = String.Format(SF, data.ring_inner_coating);
|
||
winTN.RingInnerMax = String.Format(SF, data.ring_inner_max);
|
||
//
|
||
winTN.RingOuterNumber = data.ring_outer_number;
|
||
winTN.RingOuterCoating = String.Format(SF, data.ring_outer_coating);
|
||
winTN.RingOuterMax = String.Format(SF, data.ring_outer_max);
|
||
|
||
if (winTN.ShowDialog() == true)
|
||
{
|
||
|
||
data.tray_number = winTN.TrayNumber;
|
||
data.tray_coating = Convert.ToDouble(winTN.TrayCoating);
|
||
data.tray_max = Convert.ToDouble(winTN.TrayMax);
|
||
|
||
data.tray_inner_number = winTN.TrayInnerNumber;
|
||
data.tray_inner_coating = Convert.ToDouble(winTN.TrayInnerCoating);
|
||
data.tray_inner_max = Convert.ToDouble(winTN.TrayInnerMax);
|
||
|
||
data.ring_inner_number = winTN.RingInnerNumber;
|
||
data.ring_inner_coating = Convert.ToDouble(winTN.RingInnerCoating);
|
||
data.ring_inner_max = Convert.ToDouble(winTN.RingInnerMax);
|
||
|
||
data.ring_outer_number = winTN.RingOuterNumber;
|
||
data.ring_outer_coating = Convert.ToDouble(winTN.RingOuterCoating);
|
||
data.ring_outer_max = Convert.ToDouble(winTN.RingOuterMax);
|
||
//
|
||
InvokeClient.Instance.Service.DoOperation("UpdateTrayInfoByWaferguid", chamber, slot, data.ToString());
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show("Get Tray Info failed:" + ex.Message, "Warning");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//如果不存在,直接添加
|
||
try
|
||
{
|
||
//
|
||
winTrayNumber winTN = new winTrayNumber();
|
||
|
||
if (winTN.ShowDialog() == true)
|
||
{
|
||
|
||
data.tray_number = winTN.TrayNumber;
|
||
data.tray_coating = Convert.ToDouble(winTN.TrayCoating);
|
||
data.tray_max = Convert.ToDouble(winTN.TrayMax);
|
||
|
||
data.tray_inner_number = winTN.TrayInnerNumber;
|
||
data.tray_inner_coating = Convert.ToDouble(winTN.TrayInnerCoating);
|
||
data.tray_inner_max = Convert.ToDouble(winTN.TrayInnerMax);
|
||
|
||
data.ring_inner_number = winTN.RingInnerNumber;
|
||
data.ring_inner_coating = Convert.ToDouble(winTN.RingInnerCoating);
|
||
data.ring_inner_max = Convert.ToDouble(winTN.RingInnerMax);
|
||
|
||
data.ring_outer_number = winTN.RingOuterNumber;
|
||
data.ring_outer_coating = Convert.ToDouble(winTN.RingOuterCoating);
|
||
data.ring_outer_max = Convert.ToDouble(winTN.RingOuterMax);
|
||
//
|
||
//InvokeClient.Instance.Service.DoOperation("InsertTrayInfo", chamber, slot, data);
|
||
InvokeClient.Instance.Service.DoOperation("InsertTrayInfo", chamber, slot,data.ToString());
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show("Get Tray Info failed:" + ex.Message, "Warning");
|
||
}
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
InvokeClient.Instance.Service.DoOperation(ele.Invoke, CurrentSlot.ModuleID, CurrentSlot.SlotID);
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LOG.Write(ex);
|
||
}
|
||
}
|
||
|
||
private ContextMenu InitMenus(List<MenuElement> menus)
|
||
{
|
||
ContextMenu cm = new ContextMenu();
|
||
|
||
foreach (MenuElement element in menus)
|
||
{
|
||
if (element.IsSeparator)
|
||
{
|
||
cm.Items.Add(new Separator());
|
||
}
|
||
else
|
||
{
|
||
MenuItem m_item = new MenuItem();
|
||
m_item.Header = element.Name;
|
||
m_item.Tag = element;
|
||
m_item.Click += new RoutedEventHandler(OnContextMenuClick);
|
||
m_item.IsEnabled = true;
|
||
cm.Items.Add(m_item);
|
||
}
|
||
|
||
}
|
||
return cm;
|
||
}
|
||
public ContextMenu GetWaferMenus(Slot slot)
|
||
{
|
||
|
||
MenuItem createWafer = _slotMenus.Items.GetItemAt(0) as MenuItem;
|
||
MenuItem deleteWafer = _slotMenus.Items.GetItemAt(1) as MenuItem;
|
||
Separator separator = _slotMenus.Items.GetItemAt(2) as Separator;
|
||
MenuItem returnWafer = _slotMenus.Items.GetItemAt(3) as MenuItem;
|
||
MenuItem addTrayNumber = _slotMenus.Items.GetItemAt(4) as MenuItem;
|
||
|
||
|
||
|
||
createWafer.IsEnabled = (WaferStatus)slot.WaferStatus == WaferStatus.Empty;
|
||
deleteWafer.IsEnabled = (WaferStatus)slot.WaferStatus != WaferStatus.Empty;
|
||
returnWafer.IsEnabled = (WaferStatus)slot.WaferStatus != WaferStatus.Empty && !slot.ModuleID.StartsWith("Cass");
|
||
addTrayNumber.IsEnabled = false;
|
||
|
||
|
||
createWafer.Visibility = Visibility.Visible;
|
||
deleteWafer.Visibility = Visibility.Visible;
|
||
separator.Visibility = Visibility.Visible;
|
||
returnWafer.Visibility = Visibility.Visible;
|
||
addTrayNumber.Visibility = Visibility.Hidden;
|
||
|
||
return _slotMenus;
|
||
}
|
||
|
||
public ContextMenu GetTrayMenus(Slot slot)
|
||
{
|
||
//暂未启用
|
||
|
||
MenuItem createWafer = _slotMenus.Items.GetItemAt(0) as MenuItem;
|
||
MenuItem createTray = _slotMenus.Items.GetItemAt(1) as MenuItem;
|
||
MenuItem deleteWafer = _slotMenus.Items.GetItemAt(2) as MenuItem;
|
||
MenuItem deleteTray = _slotMenus.Items.GetItemAt(3) as MenuItem;
|
||
MenuItem returnWafer = _slotMenus.Items.GetItemAt(5) as MenuItem;
|
||
Separator separator = _slotMenus.Items.GetItemAt(4) as Separator;
|
||
|
||
createTray.IsEnabled = true; //slot.TrayStatus == 0;
|
||
deleteTray.IsEnabled = true; //slot.TrayStatus != 0;
|
||
|
||
createTray.Visibility = Visibility.Visible;
|
||
deleteTray.Visibility = Visibility.Visible;
|
||
separator.Visibility = Visibility.Collapsed;
|
||
deleteWafer.Visibility = Visibility.Collapsed;
|
||
createWafer.Visibility = Visibility.Collapsed;
|
||
returnWafer.Visibility = Visibility.Collapsed;
|
||
return _slotMenus;
|
||
}
|
||
|
||
public ContextMenu GetAllMenus(Slot slot)
|
||
{
|
||
MenuItem createWafer = _slotMenus.Items.GetItemAt(0) as MenuItem;
|
||
MenuItem deleteWafer = _slotMenus.Items.GetItemAt(1) as MenuItem;
|
||
Separator separator = _slotMenus.Items.GetItemAt(2) as Separator;
|
||
MenuItem returnWafer = _slotMenus.Items.GetItemAt(3) as MenuItem;
|
||
MenuItem addTrayNumber = _slotMenus.Items.GetItemAt(4) as MenuItem;
|
||
|
||
|
||
|
||
createWafer.IsEnabled = (WaferStatus)slot.WaferStatus == WaferStatus.Empty;
|
||
deleteWafer.IsEnabled = (WaferStatus)slot.WaferStatus != WaferStatus.Empty;
|
||
returnWafer.IsEnabled = (WaferStatus)slot.WaferStatus != WaferStatus.Empty && !slot.ModuleID.StartsWith("Cass");
|
||
addTrayNumber.IsEnabled = (WaferStatus)slot.WaferStatus != WaferStatus.Empty;
|
||
|
||
|
||
createWafer.Visibility = Visibility.Visible;
|
||
deleteWafer.Visibility = Visibility.Visible;
|
||
separator.Visibility = Visibility.Visible;
|
||
returnWafer.Visibility = Visibility.Visible;
|
||
addTrayNumber.Visibility = Visibility.Visible;
|
||
|
||
|
||
return _slotMenus;
|
||
}
|
||
|
||
|
||
public void ReturnWafer(string menu, Slot p_from)
|
||
{
|
||
try
|
||
{
|
||
if (p_from == null || !p_from.IsValidSlot())
|
||
return;
|
||
|
||
//DialogButton btns = DialogButton.Transfer | DialogButton.Cancel;
|
||
string info = " from " + p_from.ModuleID + " slot " + (p_from.SlotID + 1).ToString();
|
||
string message = "Are you sure to return the wafer: \n" + info;
|
||
//DialogButton m_dResult = DialogBox.ShowDialog(btns, DialogType.CONFIRM, message);
|
||
|
||
bool displayAlignerCondition = p_from.ModuleID == "LP1" || p_from.ModuleID == "LP2" || p_from.ModuleID == "LP3" || p_from.ModuleID == "EfemRobot"
|
||
|| p_from.ModuleID == "LLA" || p_from.ModuleID == "LLB" || p_from.ModuleID == "LLC" || p_from.ModuleID == "LLD" || p_from.ModuleID == "Buffer";
|
||
|
||
displayAlignerCondition = displayAlignerCondition && (p_from.ModuleID != "Aligner");
|
||
|
||
bool displayPassCoolingCondition = (p_from.ModuleID.Contains("PM") || p_from.ModuleID == "TMRobot");
|
||
|
||
WindowManager wm = new WindowManager();
|
||
WaferTransferDialogViewModel _transferVM = new WaferTransferDialogViewModel(message, displayAlignerCondition, displayPassCoolingCondition);
|
||
_transferVM.AlignerVisibility = ShowAligner ? Visibility.Visible : Visibility.Hidden;
|
||
_transferVM.CoolingVisibility = ShowCooling ? Visibility.Visible : Visibility.Hidden;
|
||
bool? bret = wm.ShowDialogWithNoStyle(_transferVM);
|
||
if ((bool)bret)
|
||
{
|
||
//get and use transfer conditions
|
||
WaferTransferCondition conditions = _transferVM.DialogResult;
|
||
|
||
InvokeClient.Instance.Service.DoOperation(menu, p_from.ModuleID, p_from.SlotID,
|
||
conditions.IsPassCooling, conditions.CoolingTime);
|
||
}
|
||
|
||
p_from.ClearDragDropStatus();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LOG.Write(ex);
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
|
||
|
||
#region Carrier menus
|
||
|
||
private ContextMenu _carrierMenus;
|
||
public ContextMenu CarrierMenus
|
||
{
|
||
get { return _carrierMenus; }
|
||
}
|
||
|
||
private readonly List<MenuElement> _carrierMenuElements = new List<MenuElement>() {
|
||
new MenuElement(){ Name="Create Carrier", Invoke="System.CreateCarrier"},
|
||
new MenuElement(){ Name="Delete Carrier", Invoke="System.DeleteCarrier"},
|
||
|
||
};
|
||
|
||
public void OnCarrierContextMenuClick(object sender, RoutedEventArgs args)
|
||
{
|
||
try
|
||
{
|
||
MenuItem menuItem = sender as MenuItem;
|
||
CarrierContentControl locateCarrier = ContextMenuService.GetPlacementTarget(LogicalTreeHelper.GetParent(menuItem)) as CarrierContentControl;
|
||
if (locateCarrier == null)
|
||
return;
|
||
|
||
MenuElement ele = menuItem.Tag as MenuElement;
|
||
|
||
InvokeClient.Instance.Service.DoOperation(ele.Invoke, locateCarrier.ModuleID, locateCarrier.CarrierID);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LOG.Write(ex);
|
||
}
|
||
}
|
||
|
||
|
||
public ContextMenu GetCarrierMenus(CarrierContentControl carrier)
|
||
{
|
||
if (carrier != null)
|
||
{
|
||
MenuItem createCarrier = _carrierMenus.Items.GetItemAt(0) as MenuItem;
|
||
MenuItem deleteWafer = _carrierMenus.Items.GetItemAt(1) as MenuItem;
|
||
|
||
createCarrier.IsEnabled = (WaferStatus)carrier.WaferStatus == WaferStatus.Empty ? true : false;
|
||
deleteWafer.IsEnabled = (WaferStatus)carrier.WaferStatus == WaferStatus.Empty ? false : true;
|
||
}
|
||
return _carrierMenus;
|
||
}
|
||
|
||
#endregion
|
||
|
||
}
|
||
}
|