From bfe14e41fa5b07771d78af4511ba18d706bc23cc Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 28 七月 2025 17:07:52 +0800
Subject: [PATCH] 1.Spooling Config功能EAP模拟测试;
---
SourceCode/Bond/Servo/PortConfigurationDlg.cpp | 311 ++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 280 insertions(+), 31 deletions(-)
diff --git a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
index 9c88a9f..b941707 100644
--- a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
+++ b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
@@ -5,6 +5,11 @@
#include "Servo.h"
#include "afxdialogex.h"
#include "PortConfigurationDlg.h"
+#include "NewCellTypes/GridCellCheck.h"
+#include "NewCellTypes/GridCellCombo.h"
+#include "NewCellTypes/GridCellNumeric.h"
+#include "RecipeManager.h"
+#include "ServoCommo.h"
// CPortConfigurationDlg 瀵硅瘽妗�
@@ -14,20 +19,167 @@
CPortConfigurationDlg::CPortConfigurationDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_DIALOG_PORT_CONFIGURATION, pParent)
{
-
+ // 鍒濆鍖栨垚鍛樺彉閲�
+ m_pPort[0] = dynamic_cast<SERVO::CLoadPort*>(theApp.m_model.m_master.getEquipment(EQ_ID_LOADPORT1));
+ m_pPort[1] = dynamic_cast<SERVO::CLoadPort*>(theApp.m_model.m_master.getEquipment(EQ_ID_LOADPORT2));
+ m_pPort[2] = dynamic_cast<SERVO::CLoadPort*>(theApp.m_model.m_master.getEquipment(EQ_ID_LOADPORT3));
+ m_pPort[3] = dynamic_cast<SERVO::CLoadPort*>(theApp.m_model.m_master.getEquipment(EQ_ID_LOADPORT4));
}
CPortConfigurationDlg::~CPortConfigurationDlg()
{
}
+int CPortConfigurationDlg::GetLoadPortEqID(const std::string& strPortName)
+{
+ if (strPortName == "Port 1") return EQ_ID_LOADPORT1;
+ if (strPortName == "Port 2") return EQ_ID_LOADPORT2;
+ if (strPortName == "Port 3") return EQ_ID_LOADPORT3;
+ if (strPortName == "Port 4") return EQ_ID_LOADPORT4;
+ return -1; // 鏈煡绔彛
+}
+
+void CPortConfigurationDlg::LoadPortConfigToUI(SERVO::CLoadPort* pPort)
+{
+ if (!pPort) {
+ return;
+ }
+
+ SetDlgItemText(IDC_EDIT_LOTID, "");
+ SetDlgItemText(IDC_EDIT_PRODUCTID, "");
+ SetDlgItemText(IDC_EDIT_OPERATIONID, "");
+ m_comboMaterialsType.SetCurSel(0);
+
+ bool bJobInfoSet = false;
+ for (int i = 0; i < SLOT_MAX; ++i) {
+ SERVO::CSlot* pSlot = pPort->getSlot(i);
+ if (!pSlot) {
+ continue;
+ }
+
+ SERVO::CGlass* pGlass = dynamic_cast<SERVO::CGlass*>(pSlot->getContext());
+ int nRow = i + 1;
+
+ // 璁剧疆 Panel ID 鍜屽嬀閫夋
+ CGridCellCheck* pCheck = static_cast<CGridCellCheck*>(m_wndGrid.GetCell(nRow, 1));
+ if (pCheck && pGlass) {
+ pCheck->SetCheck(pSlot->isEnable() ? TRUE : FALSE);
+ pCheck->SetText(pGlass ? pGlass->getID().c_str() : _T(""));
+ }
+ else {
+ pCheck->SetCheck(FALSE);
+ pCheck->SetText(_T(""));
+ }
+
+ // 鍥炲~ Job 淇℃伅锛堝彧鍙栫涓�涓湁鏁� Glass锛�
+ if (!bJobInfoSet && pGlass) {
+ SERVO::CJobDataS* pJS = pGlass->getJobDataS();
+ if (pJS) {
+ SetDlgItemText(IDC_EDIT_LOTID, CString(pJS->getLotId().c_str()));
+ SetDlgItemText(IDC_EDIT_PRODUCTID, CString(pJS->getProductId().c_str()));
+ SetDlgItemText(IDC_EDIT_OPERATIONID, CString(pJS->getOperationId().c_str()));
+ m_comboMaterialsType.SetCurSel(pJS->getMaterialsType() - 1);
+ bJobInfoSet = true;
+ }
+ }
+ }
+}
+
+void CPortConfigurationDlg::InitGrid()
+{
+ if (m_wndGrid.GetSafeHwnd() == NULL) {
+ return;
+ }
+
+ const int nCols = 2;
+ const int nFixRows = 1;
+ const int nRows = SLOT_MAX + 1; // 瀛樺湪琛ㄥご锛屾墍浠� +1
+
+ int nColIdx = 0;
+ m_wndGrid.DeleteAllItems();
+ m_wndGrid.SetVirtualMode(FALSE);
+
+ // 璁剧疆鏍峰紡棰滆壊
+ m_wndGrid.GetDefaultCell(TRUE, FALSE)->SetBackClr(g_nGridFixCellColor);
+ m_wndGrid.GetDefaultCell(FALSE, TRUE)->SetBackClr(g_nGridFixCellColor);
+ m_wndGrid.GetDefaultCell(FALSE, FALSE)->SetBackClr(g_nGridCellColor);
+ m_wndGrid.SetFixedTextColor(g_nGridFixFontColor);
+
+ // 琛屽垪鏁伴噺
+ m_wndGrid.SetRowCount(nRows);
+ m_wndGrid.SetColumnCount(nCols);
+ m_wndGrid.SetFixedRowCount(nFixRows);
+ m_wndGrid.SetFixedColumnCount(0);
+
+ // 璁剧疆鍒楀
+ m_wndGrid.SetColumnWidth(nColIdx, 50);
+ m_wndGrid.SetItemText(0, nColIdx++, _T("Slot ID"));
+ m_wndGrid.SetColumnWidth(nColIdx, 60);
+ m_wndGrid.SetItemText(0, nColIdx++, _T("鍚敤"));
+
+ // 璁剧疆琛屼负鏍峰紡
+ m_wndGrid.SetFixedRowSelection(FALSE);
+ m_wndGrid.SetFixedColumnSelection(FALSE);
+ m_wndGrid.SetEditable(TRUE);
+ m_wndGrid.SetRowResize(FALSE);
+ m_wndGrid.SetColumnResize(TRUE);
+ m_wndGrid.SetListMode(TRUE);
+ m_wndGrid.EnableSelection(TRUE);
+ m_wndGrid.SetSingleRowSelection(TRUE);
+ m_wndGrid.ExpandColumnsToFit(TRUE);
+ m_wndGrid.ExpandLastColumn();
+
+ // 鑷姩璁$畻骞惰缃瘡琛岄珮搴�
+ CRect rcClient;
+ m_wndGrid.GetClientRect(&rcClient);
+ int nAvailableHeight = rcClient.Height();
+ int nEachRowHeight = max(24, nAvailableHeight / nRows);
+
+ for (int i = 0; i < nRows; ++i) {
+ m_wndGrid.SetRowHeight(i, nEachRowHeight);
+ }
+
+ FillGrid();
+}
+
+void CPortConfigurationDlg::FillGrid()
+{
+ //CStringArray recipeOptions;
+ //recipeOptions.Add(_T("Recipe A"));
+ //recipeOptions.Add(_T("Recipe B"));
+ //recipeOptions.Add(_T("Recipe C"));
+
+ for (int i = 1; i < 9; ++i) {
+ CString strIndex;
+ strIndex.Format(_T("%d"), i);
+ m_wndGrid.SetItemText(i, 0, strIndex);
+ m_wndGrid.SetItemState(i, 0, GVIS_READONLY);
+
+ // Checkbox
+ m_wndGrid.SetCellType(i, 1, RUNTIME_CLASS(CGridCellCheck));
+ CGridCellCheck* pCheck = static_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
+ if (pCheck) {
+ pCheck->SetCheck(FALSE);
+ }
+ }
+
+ m_wndGrid.Invalidate();
+ m_wndGrid.UpdateWindow();
+}
+
void CPortConfigurationDlg::DoDataExchange(CDataExchange* pDX)
{
- CDialogEx::DoDataExchange(pDX);
+ CDialogEx::DoDataExchange(pDX);
+ DDX_Control(pDX, IDC_GRID_PANEL_RECIPE, m_wndGrid);
+ DDX_Control(pDX, IDC_COMBO_PORT, m_comboPort);
+ DDX_Control(pDX, IDC_COMBO_RECIPE, m_comboRecipe);
+ DDX_Control(pDX, IDC_COMBO_MATERIALS_TYPE, m_comboMaterialsType);
}
BEGIN_MESSAGE_MAP(CPortConfigurationDlg, CDialogEx)
+ ON_CBN_SELCHANGE(IDC_COMBO_PORT, &CPortConfigurationDlg::OnSelchangeComboPort)
+ ON_BN_CLICKED(IDC_BUTTON_APPLY, &CPortConfigurationDlg::OnBnClickedButtonApply)
END_MESSAGE_MAP()
@@ -38,37 +190,134 @@
CDialogEx::OnInitDialog();
// TODO: 鍦ㄦ娣诲姞棰濆鐨勫垵濮嬪寲
- // 缁戝畾鑷畾涔夋帶浠讹紙蹇呴』涓庤祫婧愪腑鐨� ID 涓�鑷达級
- m_wndGrid.SubclassDlgItem(IDC_GRID_PANEL_RECIPE, this);
-
- // 璁剧疆琛屽垪鏁�
- m_wndGrid.SetRowCount(9); // 鍖呮嫭琛ㄥご1琛� + 鏁版嵁8琛�
- m_wndGrid.SetColumnCount(4);
-
- // 璁剧疆鍥哄畾鐨勮〃澶磋
- m_wndGrid.SetFixedRowCount(1);
- m_wndGrid.SetFixedColumnCount(0);
-
- // 璁剧疆鍒楁爣棰�
- m_wndGrid.SetItemText(0, 0, _T("Slot ID"));
- m_wndGrid.SetItemText(0, 1, _T("EQ Recipe"));
- m_wndGrid.SetItemText(0, 2, _T("Panel ID"));
- m_wndGrid.SetItemText(0, 3, _T("鉁�"));
-
- // 璁剧疆鍒楀
- m_wndGrid.SetColumnWidth(0, 60);
- m_wndGrid.SetColumnWidth(1, 150);
- m_wndGrid.SetColumnWidth(2, 150);
- m_wndGrid.SetColumnWidth(3, 40);
-
- // 濉厖鏁版嵁琛�
- for (int i = 1; i <= 8; ++i)
- {
- CString str;
- str.Format(_T("%d"), i);
- m_wndGrid.SetItemText(i, 0, str);
+ // 鍒濆鍖栫鍙d笅鎷夋鍐呭
+ CString ports[] = { _T("Port 1"), _T("Port 2"), _T("Port 3"), _T("Port 4") };
+ for (const auto& item : ports) {
+ m_comboPort.AddString(item);
}
+ m_comboPort.SetCurSel(0); // 榛樿閫夋嫨绗竴涓鍙�
+
+ // 鍒濆鍖栭厤鏂逛笅鎷夋鍐呭
+ std::vector<std::string> vecRecipe = RecipeManager::getInstance().getAllPPID();
+ for (const auto& recipe : vecRecipe) {
+ m_comboRecipe.AddString(CString(recipe.c_str()));
+ }
+ m_comboRecipe.SetCurSel(0); // 榛樿閫夋嫨绗竴涓厤鏂�
+
+ // 鍒濆鍖栫墿鏂欑被鍨嬩笅鎷夋鍐呭
+ CString materialTypes[] = { _T("G1"), _T("G2"), _T("G1+G2") };
+ for (const auto& item : materialTypes) {
+ m_comboMaterialsType.AddString(item);
+ }
+ m_comboMaterialsType.SetCurSel(0); // 榛樿閫夋嫨绗竴涓墿鏂欑被鍨�
+
+ InitGrid();
+
+ LoadPortConfigToUI(m_pPort[0]); // 榛樿鍔犺浇绗竴涓鍙g殑閰嶇疆
+
+ // 璁剧疆瀵硅瘽妗嗘爣棰�
+ SetWindowText(_T("Port Configuration"));
return TRUE; // return TRUE unless you set the focus to a control
// 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
}
+
+void CPortConfigurationDlg::OnSelchangeComboPort()
+{
+ // TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+ int selPort = m_comboPort.GetCurSel();
+ if (selPort < 0 || selPort >= 4) {
+ return; // 鏃犳晥閫夋嫨
+ }
+
+ // 鍔犺浇閫変腑绔彛鐨勯厤缃埌 UI
+ LoadPortConfigToUI(m_pPort[selPort]);
+}
+
+void CPortConfigurationDlg::OnBnClickedButtonApply()
+{
+ // TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+ SERVO::PortConfig config;
+
+ // 鑾峰彇 Port 鍚嶇О
+ int selPort = m_comboPort.GetCurSel();
+ if (selPort != CB_ERR) {
+ CString str;
+ m_comboPort.GetLBText(selPort, str);
+ config.strPortName = CT2A(str.GetString());
+ }
+
+ // 鑾峰彇 Recipe 鍚嶇О
+ int selRecipe = m_comboRecipe.GetCurSel();
+ if (selRecipe != CB_ERR) {
+ CString str;
+ m_comboRecipe.GetLBText(selRecipe, str);
+ config.strRecipe = CT2A(str.GetString());
+ }
+
+ // 鑾峰彇 Material Type 绱㈠紩锛堢储寮曚粠 0 寮�濮嬶紝瀵瑰簲鏋氫妇浠� 1 寮�濮嬶級
+ int selMaterial = m_comboMaterialsType.GetCurSel();
+ if (selMaterial != CB_ERR) {
+ config.nMaterialType = selMaterial + 1;
+ }
+ else {
+ AfxMessageBox(_T("Please select a material type!"));
+ return;
+ }
+
+ // 鑾峰彇 Lot ID / Product ID / Operation ID
+ CString strText;
+ GetDlgItemText(IDC_EDIT_LOTID, strText);
+ config.strLotID = CT2A(strText.GetString());
+ if (config.strLotID.empty()) {
+ AfxMessageBox(_T("Lot ID cannot be empty!"));
+ return;
+ }
+
+ GetDlgItemText(IDC_EDIT_PRODUCTID, strText);
+ config.strProductID = CT2A(strText.GetString());
+ if (config.strProductID.empty()) {
+ AfxMessageBox(_T("Product ID cannot be empty!"));
+ return;
+ }
+
+ GetDlgItemText(IDC_EDIT_OPERATIONID, strText);
+ config.strOperationID = CT2A(strText.GetString());
+ if (config.strOperationID.empty()) {
+ AfxMessageBox(_T("Operation ID cannot be empty!"));
+ return;
+ }
+
+ // 鑾峰彇 Grid 琛ㄦ牸涓� Slot 鐘舵�侊紙绗�1~8琛岋級
+ for (int i = 1; i <= 8; ++i) {
+ SERVO::SlotConfig slot;
+ slot.nSlotID = i;
+
+ CGridCellCheck* pCheck = static_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
+ if (pCheck) {
+ slot.isEnabled = pCheck->GetCheck();
+ }
+
+ config.vecSlot.push_back(slot);
+ }
+
+ int nEqID = GetLoadPortEqID(config.strPortName);
+ if (nEqID < 0) {
+ AfxMessageBox(_T("鏈煡鐨勭鍙e悕绉帮紒"));
+ return;
+ }
+
+ SERVO::CLoadPort* pPort = dynamic_cast<SERVO::CLoadPort*>(theApp.m_model.m_master.getEquipment(nEqID));
+ if (!pPort) {
+ AfxMessageBox(_T("鎵句笉鍒板搴旂殑 LoadPort 璁惧锛�"));
+ return;
+ }
+
+ // 搴旂敤閰嶇疆锛堜緥濡傛祴璇曠敓鎴愮幓鐠冿級
+ if (pPort->testGenerateGlassListFromConfig(config) < 0) {
+ AfxMessageBox(_T("Failed to generate glass list from configuration!"));
+ return;
+ }
+
+ OnOK();
+}
\ No newline at end of file
--
Gitblit v1.9.3