| | |
| | | #include "NewCellTypes/GridCellCheck.h" |
| | | #include "NewCellTypes/GridCellCombo.h" |
| | | #include "NewCellTypes/GridCellNumeric.h" |
| | | #include "RecipeManager.h" |
| | | #include "ServoCommo.h" |
| | | |
| | | |
| | | // 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::InitGrid() |
| | | { |
| | | if (m_wndGrid.GetSafeHwnd() == NULL) { |
| | | return; |
| | | } |
| | | |
| | | const int nCols = 3; |
| | | const int nCols = 2; |
| | | const int nFixRows = 1; |
| | | const int nRows = 9; |
| | | |
| | |
| | | // 设置列宽 |
| | | 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); |
| | |
| | | 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); |
| | | } |
| | |
| | | |
| | | 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() |
| | | |
| | | |
| | |
| | | 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(); |
| | | } |