mrDarker
2025-06-21 90c8673e4edaf2e68931470b4d480e02d4634fd0
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)
{
    DDX_Control(pDX, IDC_GRID_PANEL_RECIPE, m_wndGrid);
   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_BN_CLICKED(IDC_BUTTON_APPLY, &CPortConfigurationDlg::OnBnClickedButtonApply)
END_MESSAGE_MAP()
@@ -139,8 +141,117 @@
   CDialogEx::OnInitDialog();
   // TODO:  在此添加额外的初始化
    // 初始化端口下拉框内容
    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: 在此添加控件通知处理程序代码
    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("未知的端口名称!"));
        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();
}