mrDarker
2025-07-22 b25d01dd43f27e34940de13a4efb54033f3007df
SourceCode/Bond/Servo/PortConfigurationDlg.cpp
@@ -19,7 +19,11 @@
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()
@@ -35,6 +39,37 @@
    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);
    SERVO::CSlot* pSlot = pPort->getSlot(0);
    if (pSlot == nullptr) {
        return;
    }
    SERVO::CGlass* pGlass = dynamic_cast<SERVO::CGlass*>(pSlot->getContext());
    if (pGlass != nullptr) {
        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);
        }
    }
   // 填充 Grid
   FillGrid(pSlot, pGlass);
}
void CPortConfigurationDlg::InitGrid()
{
    if (m_wndGrid.GetSafeHwnd() == NULL) {
@@ -43,7 +78,7 @@
    const int nCols = 2;
    const int nFixRows = 1;
    const int nRows = 9;
   const int nRows = SLOT_MAX + 1; // 存在表头,所以 +1
    int nColIdx = 0;
    m_wndGrid.DeleteAllItems();
@@ -64,8 +99,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("Panel ID"));
    m_wndGrid.SetColumnWidth(nColIdx, 60);
    m_wndGrid.SetItemText(0, nColIdx++, _T("启用"));
@@ -90,28 +123,41 @@
    for (int i = 0; i < nRows; ++i) {
        m_wndGrid.SetRowHeight(i, nEachRowHeight);
    }
    FillGrid();
}
void CPortConfigurationDlg::FillGrid()
void CPortConfigurationDlg::FillGrid(SERVO::CSlot* pSlot, SERVO::CGlass* pGlass)
{
    //CStringArray recipeOptions;
    //recipeOptions.Add(_T("Recipe A"));
    //recipeOptions.Add(_T("Recipe B"));
    //recipeOptions.Add(_T("Recipe C"));
    for (int i = 1; i < 9; ++i) {
   // 去除表头,从第2行开始填充数据
    for (int i = 1; i < SLOT_MAX + 1; ++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);
        if (i != 3) {
            // Checkbox
            m_wndGrid.SetCellType(i, 1, RUNTIME_CLASS(CGridCellCheck));
            CGridCellCheck* pCheck = static_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
            if (pCheck) {
                // 设置 Panel ID 和勾选框
                CGridCellCheck* pCheck = static_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
                if (pCheck && pSlot && pGlass) {
                    pCheck->SetCheck(pSlot->isEnable() ? TRUE : FALSE);
                    pCheck->SetText(pGlass ? pGlass->getID().c_str() : _T(""));
                }
                else {
                    pCheck->SetCheck(FALSE);
                    pCheck->SetText(_T(""));
                }
            }
        }
        else {
            m_wndGrid.SetItemState(i, 1, GVIS_READONLY);
        }
    }
@@ -130,6 +176,7 @@
BEGIN_MESSAGE_MAP(CPortConfigurationDlg, CDialogEx)
    ON_CBN_SELCHANGE(IDC_COMBO_PORT, &CPortConfigurationDlg::OnSelchangeComboPort)
    ON_BN_CLICKED(IDC_BUTTON_APPLY, &CPortConfigurationDlg::OnBnClickedButtonApply)
END_MESSAGE_MAP()
@@ -160,14 +207,31 @@
    for (const auto& item : materialTypes) {
        m_comboMaterialsType.AddString(item);
    }
    m_comboMaterialsType.SetCurSel(0); // 默认选择第一个物料类型
    m_comboMaterialsType.SetCurSel(0);  // 默认选择第一个物料类型
    InitGrid();
   LoadPortConfigToUI(m_pPort[0]);     // 默认加载第一个端口的配置
   // 设置对话框标题
   SetWindowText(_T("Port Configuration"));
   return TRUE;  // return TRUE unless you set the focus to a control
   // 异常: OCX 属性页应返回 FALSE
}
void CPortConfigurationDlg::OnSelchangeComboPort()
{
    // TODO: 在此添加控件通知处理程序代码
   int selPort = m_comboPort.GetCurSel();
   if (selPort < 0 || selPort >= 4) {
      return; // 无效选择
   }
   // 加载选中端口的配置到 UI
   LoadPortConfigToUI(m_pPort[selPort]);
}
void CPortConfigurationDlg::OnBnClickedButtonApply()
{
    // TODO: 在此添加控件通知处理程序代码