// PortConfigurationDlg.cpp: 实现文件
|
//
|
|
#include "stdafx.h"
|
#include "Servo.h"
|
#include "afxdialogex.h"
|
#include "PortConfigurationDlg.h"
|
#include "NewCellTypes/GridCellCheck.h"
|
#include "NewCellTypes/GridCellCombo.h"
|
#include "NewCellTypes/GridCellNumeric.h"
|
#include "RecipeManager.h"
|
#include "ServoCommo.h"
|
|
|
// CPortConfigurationDlg 对话框
|
|
IMPLEMENT_DYNAMIC(CPortConfigurationDlg, CDialogEx)
|
|
CPortConfigurationDlg::CPortConfigurationDlg(CWnd* pParent /*=nullptr*/)
|
: CDialogEx(IDD_DIALOG_PORT_CONFIGURATION, pParent)
|
{
|
|
}
|
|
CPortConfigurationDlg::~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 = 2;
|
const int nFixRows = 1;
|
const int nRows = 9;
|
|
int nColIdx = 0;
|
m_wndGrid.DeleteAllItems();
|
m_wndGrid.SetVirtualMode(FALSE);
|
|
// 设置样式颜色
|
m_wndGrid.GetDefaultCell(TRUE, FALSE)->SetBackClr(g_nGridFixCellColor);
|
m_wndGrid.GetDefaultCell(FALSE, TRUE)->SetBackClr(g_nGridFixCellColor);
|
m_wndGrid.GetDefaultCell(FALSE, FALSE)->SetBackClr(g_nGridCellColor);
|
m_wndGrid.SetFixedTextColor(g_nGridFixFontColor);
|
|
// 行列数量
|
m_wndGrid.SetRowCount(nRows);
|
m_wndGrid.SetColumnCount(nCols);
|
m_wndGrid.SetFixedRowCount(nFixRows);
|
m_wndGrid.SetFixedColumnCount(0);
|
|
// 设置列宽
|
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("启用"));
|
|
// 设置行为样式
|
m_wndGrid.SetFixedRowSelection(FALSE);
|
m_wndGrid.SetFixedColumnSelection(FALSE);
|
m_wndGrid.SetEditable(TRUE);
|
m_wndGrid.SetRowResize(FALSE);
|
m_wndGrid.SetColumnResize(TRUE);
|
m_wndGrid.SetListMode(TRUE);
|
m_wndGrid.EnableSelection(TRUE);
|
m_wndGrid.SetSingleRowSelection(TRUE);
|
m_wndGrid.ExpandColumnsToFit(TRUE);
|
m_wndGrid.ExpandLastColumn();
|
|
// 自动计算并设置每行高度
|
CRect rcClient;
|
m_wndGrid.GetClientRect(&rcClient);
|
int nAvailableHeight = rcClient.Height();
|
int nEachRowHeight = max(24, nAvailableHeight / nRows);
|
|
for (int i = 0; i < nRows; ++i) {
|
m_wndGrid.SetRowHeight(i, nEachRowHeight);
|
}
|
|
FillGrid();
|
}
|
|
void CPortConfigurationDlg::FillGrid()
|
{
|
//CStringArray recipeOptions;
|
//recipeOptions.Add(_T("Recipe A"));
|
//recipeOptions.Add(_T("Recipe B"));
|
//recipeOptions.Add(_T("Recipe C"));
|
|
for (int i = 1; i < 9; ++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);
|
}
|
}
|
|
m_wndGrid.Invalidate();
|
m_wndGrid.UpdateWindow();
|
}
|
|
void CPortConfigurationDlg::DoDataExchange(CDataExchange* pDX)
|
{
|
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()
|
|
|
// CPortConfigurationDlg 消息处理程序
|
|
BOOL CPortConfigurationDlg::OnInitDialog()
|
{
|
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();
|
}
|