From 90c8673e4edaf2e68931470b4d480e02d4634fd0 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期六, 21 六月 2025 13:53:29 +0800
Subject: [PATCH] 1. 动态生成设备配方绑定界面的控件 2. 完善本地测试界面

---
 SourceCode/Bond/Servo/PortConfigurationDlg.cpp |  145 ++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 128 insertions(+), 17 deletions(-)

diff --git a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
index 79a1e11..895648a 100644
--- a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
+++ b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
@@ -8,6 +8,8 @@
 #include "NewCellTypes/GridCellCheck.h"
 #include "NewCellTypes/GridCellCombo.h"
 #include "NewCellTypes/GridCellNumeric.h"
+#include "RecipeManager.h"
+#include "ServoCommo.h"
 
 
 // CPortConfigurationDlg 瀵硅瘽妗�
@@ -24,13 +26,22 @@
 {
 }
 
+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::InitGrid()
 {
     if (m_wndGrid.GetSafeHwnd() == NULL) {
         return;
     }
 
-    const int nCols = 3;
+    const int nCols = 2;
     const int nFixRows = 1;
     const int nRows = 9;
 
@@ -53,8 +64,6 @@
     // 璁剧疆鍒楀
     m_wndGrid.SetColumnWidth(nColIdx, 50);
     m_wndGrid.SetItemText(0, nColIdx++, _T("Slot ID"));
-    m_wndGrid.SetColumnWidth(nColIdx, 150);
-    m_wndGrid.SetItemText(0, nColIdx++, _T("EQ Recipe"));
     m_wndGrid.SetColumnWidth(nColIdx, 150);
     m_wndGrid.SetItemText(0, nColIdx++, _T("Panel ID"));
     m_wndGrid.SetColumnWidth(nColIdx, 60);
@@ -98,20 +107,9 @@
         m_wndGrid.SetItemText(i, 0, strIndex);
         m_wndGrid.SetItemState(i, 0, GVIS_READONLY);
 
-        // EQ Recipe - ComboBox
-        //if (m_wndGrid.SetCellType(i, 1, RUNTIME_CLASS(CGridCellCombo))) {
-        //    CGridCellCombo* pCell = static_cast<CGridCellCombo*>(m_wndGrid.GetCell(i, 1));
-        //    pCell->SetOptions(recipeOptions);
-        //    pCell->SetStyle(CBS_DROPDOWNLIST);
-        //}
-        //m_wndGrid.SetItemText(i, 1, recipeOptions[0]);
-
-        // Panel ID - 鍙紪杈�
-        m_wndGrid.SetItemText(i, 1, _T(""));
-
         // Checkbox
-        m_wndGrid.SetCellType(i, 2, RUNTIME_CLASS(CGridCellCheck));
-        CGridCellCheck* pCheck = static_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 2));
+        m_wndGrid.SetCellType(i, 1, RUNTIME_CLASS(CGridCellCheck));
+        CGridCellCheck* pCheck = static_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
         if (pCheck) {
             pCheck->SetCheck(FALSE);
         }
@@ -123,12 +121,16 @@
 
 void CPortConfigurationDlg::DoDataExchange(CDataExchange* pDX)
 {
+    CDialogEx::DoDataExchange(pDX);
     DDX_Control(pDX, IDC_GRID_PANEL_RECIPE, m_wndGrid);
-	CDialogEx::DoDataExchange(pDX);
+    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_BN_CLICKED(IDC_BUTTON_APPLY, &CPortConfigurationDlg::OnBnClickedButtonApply)
 END_MESSAGE_MAP()
 
 
@@ -139,8 +141,117 @@
 	CDialogEx::OnInitDialog();
 
 	// TODO:  鍦ㄦ娣诲姞棰濆鐨勫垵濮嬪寲
+    // 鍒濆鍖栫鍙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();
 
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
 }
+
+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