From f6b143d9a6f62875e62dae61a0af061139d7a156 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期一, 21 七月 2025 17:23:17 +0800
Subject: [PATCH] 1. 添加新建配方和部分编辑配方绑定的功能

---
 SourceCode/Bond/Servo/RecipeDeviceBindDlg.cpp |  181 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 178 insertions(+), 3 deletions(-)

diff --git a/SourceCode/Bond/Servo/RecipeDeviceBindDlg.cpp b/SourceCode/Bond/Servo/RecipeDeviceBindDlg.cpp
index fec07da..4d3440d 100644
--- a/SourceCode/Bond/Servo/RecipeDeviceBindDlg.cpp
+++ b/SourceCode/Bond/Servo/RecipeDeviceBindDlg.cpp
@@ -5,7 +5,22 @@
 #include "Servo.h"
 #include "afxdialogex.h"
 #include "RecipeDeviceBindDlg.h"
+#include "RecipeManager.h"
+#include "Common.h"
 
+#define IDC_EDIT_DEVICEID_BASE     3000
+#define IDC_EDIT_DEVICENAME_BASE   3050
+#define IDC_COMBO_RECIPEID_BASE    3100
+
+// 缁戝畾鐣岄潰闇�瑕佹樉绀虹殑璁惧
+static const std::vector<DeviceMetaInfo> g_vecBindDevices = {
+    { EQ_ID_VACUUMBAKE,      EQ_NAME_VACUUMBAKE },
+    { EQ_ID_Bonder1,         EQ_NAME_BONDER1 },
+    { EQ_ID_Bonder2,         EQ_NAME_BONDER2 },
+    { EQ_ID_BAKE_COOLING,    EQ_NAME_BAKE_COOLING },
+    { EQ_ID_MEASUREMENT,     EQ_NAME_MEASUREMENT },
+    { EQ_ID_EFEM,            EQ_NAME_EFEM }
+};
 
 // CRecipeDeviceBindDlg 瀵硅瘽妗�
 
@@ -13,6 +28,8 @@
 
 CRecipeDeviceBindDlg::CRecipeDeviceBindDlg(CWnd* pParent /*=nullptr*/)
 	: CDialogEx(IDD_DIALOG_RECIPE_DEVICE_BIND, pParent)
+    , m_strPPID(_T(""))
+    , m_strDesc(_T(""))
 {
 
 }
@@ -21,14 +38,172 @@
 {
 }
 
-void CRecipeDeviceBindDlg::DoDataExchange(CDataExchange* pDX)
-{
-	CDialogEx::DoDataExchange(pDX);
+const RecipeInfo& CRecipeDeviceBindDlg::GetRecipeInfo() const {
+    return m_recipe;
 }
 
+void CRecipeDeviceBindDlg::SetRecipeInfo(const RecipeInfo& info)
+{
+    m_recipe = info;
+}
+
+void CRecipeDeviceBindDlg::DoDataExchange(CDataExchange* pDX)
+{
+    CDialogEx::DoDataExchange(pDX);
+    DDX_Text(pDX, IDC_EDIT_PPID, m_strPPID);
+    DDX_Text(pDX, IDC_EDIT_DESC, m_strDesc);
+}
 
 BEGIN_MESSAGE_MAP(CRecipeDeviceBindDlg, CDialogEx)
+    ON_WM_CLOSE()
+    ON_WM_SIZE()
+    ON_BN_CLICKED(IDOK, &CRecipeDeviceBindDlg::OnBnClickedOk)
 END_MESSAGE_MAP()
 
 
 // CRecipeDeviceBindDlg 娑堟伅澶勭悊绋嬪簭
+
+BOOL CRecipeDeviceBindDlg::OnInitDialog()
+{
+	CDialogEx::OnInitDialog();
+
+    // TODO:  鍦ㄦ娣诲姞棰濆鐨勫垵濮嬪寲
+    if (m_recipe.vecDeviceList.empty()) {
+        SetWindowText(_T("鏂板缓閰嶆柟"));
+
+        // 璁剧疆鍥哄畾澶у皬锛堜緥濡� 600x400锛�
+        SetWindowPos(nullptr, 0, 0, 600, 400, SWP_NOMOVE | SWP_NOZORDER);
+
+        // 鍒涘缓鎺т欢
+        const int totalControlWidth = 340;
+        CRect clientRect;
+        GetClientRect(&clientRect);
+        int xStart = (clientRect.Width() - totalControlWidth) / 2;
+
+        const int nRowHeight = 30;
+        const int yStart = 30; // 椤堕儴璧峰楂樺害
+
+        const int nRowCount = static_cast<int>(g_vecBindDevices.size());
+        for (int i = 0; i < nRowCount; ++i) {
+            int y = yStart + i * nRowHeight;
+            const auto& meta = g_vecBindDevices[i];
+
+            CEdit* pEditID = new CEdit();
+            pEditID->Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(xStart, y, xStart + 100, y + 25), this, IDC_EDIT_DEVICEID_BASE + i);
+
+            CString strID;
+            strID.Format(_T("%d"), meta.nDeviceID);
+            pEditID->SetWindowText(strID);
+            pEditID->SetReadOnly(TRUE);     // 璁惧ID鍙
+
+            CEdit* pEditName = new CEdit();
+            pEditName->Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(xStart + 110, y, xStart + 210, y + 25), this, IDC_EDIT_DEVICENAME_BASE + i);
+            pEditName->SetWindowText(CA2T(meta.strDeviceName));
+            pEditName->SetReadOnly(TRUE);   // 璁惧鍚嶇О鍙
+
+            CComboBox* pCombo = new CComboBox();
+            pCombo->Create(WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST, CRect(xStart + 220, y, xStart + 340, y + 300), this, IDC_COMBO_RECIPEID_BASE + i);
+
+            // 娣诲姞閫夐」鍒� ComboBox
+            m_vecDevices.push_back({ pEditID, pEditName, pCombo });
+        }
+    }
+    else {
+        SetWindowText(_T("缂栬緫閰嶆柟"));
+
+        m_strPPID = CA2T(m_recipe.strPPID.c_str());
+        m_strDesc = CA2T(m_recipe.strDescription.c_str());
+        UpdateData(FALSE);
+
+        // 璁剧疆璁惧琛屾暟鎹�
+        for (size_t i = 0; i < m_recipe.vecDeviceList.size() && i < m_vecDevices.size(); ++i) {
+            const DeviceRecipe& d = m_recipe.vecDeviceList[i];
+            CString str;
+            // 璁剧疆璁惧ID鍜屽悕绉�
+            str.Format(_T("%d"), d.nDeviceID);
+            m_vecDevices[i].editDeviceID->SetWindowText(str);
+
+            str.Format(_T("%s"), d.strDeviceName.c_str());
+            m_vecDevices[i].editDeviceName->SetWindowText(str);
+
+            /*ComboBox閫夋嫨閰嶆柟ID锛屽悗闈㈤渶瑕佷慨鏀�****/
+            //int nCount = m_vecDevices[i].comboRecipeID->GetCount();
+            //for (int idx = 0; idx < nCount; ++idx) {
+            //    if ((int)m_vecDevices[i].comboRecipeID->GetItemData(idx) == d.nRecipeID) {
+            //        m_vecDevices[i].comboRecipeID->SetCurSel(idx);
+            //        break;
+            //    }
+            //}
+        }
+    }
+
+	return TRUE;  // return TRUE unless you set the focus to a control
+	// 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
+}
+
+void CRecipeDeviceBindDlg::OnClose()
+{
+    // TODO: 鍦ㄦ娣诲姞娑堟伅澶勭悊绋嬪簭浠g爜鍜�/鎴栬皟鐢ㄩ粯璁ゅ��
+    CDialogEx::OnClose();
+
+    // 娓呯悊鎺т欢
+    for (auto& device : m_vecDevices) {
+        if (device.editDeviceID) {
+            device.editDeviceID->DestroyWindow();
+            delete device.editDeviceID;
+        }
+        if (device.editDeviceName) {
+            device.editDeviceName->DestroyWindow();
+            delete device.editDeviceName;
+        }
+        if (device.comboRecipeID) {
+            device.comboRecipeID->DestroyWindow();
+            delete device.comboRecipeID;
+        }
+    }
+    m_vecDevices.clear();
+}
+
+void CRecipeDeviceBindDlg::OnSize(UINT nType, int cx, int cy)
+{
+    CDialogEx::OnSize(nType, cx, cy);
+
+    // TODO: 鍦ㄦ澶勬坊鍔犳秷鎭鐞嗙▼搴忎唬鐮�
+}
+
+void CRecipeDeviceBindDlg::OnBnClickedOk()
+{
+    // TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+    UpdateData(TRUE);
+
+    // 鏀堕泦鎵�鏈夎澶囨槧灏�
+    m_recipe.vecDeviceList.clear();
+    for (const auto& dev : m_vecDevices) {
+        DeviceRecipe info;
+        CString strID, strName;
+        dev.editDeviceID->GetWindowText(strID);
+        dev.editDeviceName->GetWindowText(strName);
+
+        int sel = dev.comboRecipeID->GetCurSel();
+        info.nRecipeID = -1;
+        if (sel != CB_ERR) {
+            info.nRecipeID = (int)dev.comboRecipeID->GetItemData(sel);
+        }
+        info.nDeviceID = _ttoi(strID);
+        info.strDeviceName = CT2A(strName);
+
+        m_recipe.vecDeviceList.push_back(info);
+    }
+
+    // 妫�鏌� PPID 鏄惁涓虹┖
+    if (m_strPPID.IsEmpty()) {
+        AfxMessageBox(_T("閰嶆柟 PPID 涓嶈兘涓虹┖"));
+        return;
+    }
+
+    // PPID鍜屾弿杩�
+    m_recipe.strPPID = CT2A(m_strPPID);
+    m_recipe.strDescription = CT2A(m_strDesc);
+
+    CDialogEx::OnOK();
+}

--
Gitblit v1.9.3