| | |
| | | CControlJobDlg::CControlJobDlg(CWnd* pParent /*=nullptr*/) |
| | | : CDialogEx(IDD_DIALOG_CONTROL_JOB, pParent) |
| | | { |
| | | |
| | | m_pControlJob = nullptr; |
| | | } |
| | | |
| | | CControlJobDlg::~CControlJobDlg() |
| | |
| | | |
| | | |
| | | BEGIN_MESSAGE_MAP(CControlJobDlg, CDialogEx) |
| | | ON_WM_SIZE() |
| | | ON_BN_CLICKED(IDC_BUTTON_COMPLETION_BATH, &CControlJobDlg::OnBnClickedButtonCompletionBath) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | void CControlJobDlg::SetControlJob(SERVO::CControlJob* pControlJob) |
| | | { |
| | | m_pControlJob = pControlJob; |
| | | } |
| | | |
| | | // CControlJobDlg 消息处理程序 |
| | | |
| | | |
| | | BOOL CControlJobDlg::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | |
| | | // label字体 |
| | | LOGFONT lf{}; |
| | | GetFont()->GetLogFont(&lf); |
| | | lf.lfHeight = -20; |
| | | lf.lfWeight = FW_BOLD; |
| | | _tcscpy_s(lf.lfFaceName, _T("Arial")); |
| | | m_fontNoJob.CreateFontIndirect(&lf); |
| | | GetDlgItem(IDC_LABEL_NO_JOB)->SetFont(&m_fontNoJob); |
| | | |
| | | |
| | | // 列表控件 |
| | | HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1); |
| | | ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL); |
| | | |
| | | // m_list 已经是对话框上的 CExpandableListCtrl 成员(拖控件改类) |
| | | m_listCtrl.ModifyStyle(0, LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS); |
| | | m_listCtrl.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 260); |
| | | m_listCtrl.InsertColumn(1, _T("状态"), LVCFMT_LEFT, 120); |
| | | m_listCtrl.InsertColumn(2, _T("描述"), LVCFMT_LEFT, 260); |
| | | m_listCtrl.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 180); |
| | | m_listCtrl.InsertColumn(1, _T("类型"), LVCFMT_LEFT, 120); |
| | | m_listCtrl.InsertColumn(2, _T("状态"), LVCFMT_LEFT, 120); |
| | | m_listCtrl.InsertColumn(3, _T("配方"), LVCFMT_LEFT, 120); |
| | | m_listCtrl.InsertColumn(4, _T("Port / Carrier / Slot"), LVCFMT_LEFT, 180); |
| | | m_listCtrl.InsertColumn(5, _T("描述"), LVCFMT_LEFT, 220); |
| | | |
| | | auto* root1 = m_listCtrl.InsertRoot({ _T("EFEM"), _T("Ready"), _T("Front End Module") }); |
| | | m_listCtrl.InsertChild(root1, { _T("Slot #1"), _T("OK"), _T("150mm wafer") }); |
| | | m_listCtrl.InsertChild(root1, { _T("Slot #2"), _T("Empty"), _T("") }); |
| | | |
| | | auto* root2 = m_listCtrl.InsertRoot({ _T("Bonder"), _T("Run"), _T("G1+G2 Process") }); |
| | | auto* ch21 = m_listCtrl.InsertChild(root2, { _T("Job A"), _T("Proc"), _T("Step 1") }); |
| | | m_listCtrl.InsertChild(ch21, { _T("SubStep A1"), _T("Done"), _T("Align") }); |
| | | m_listCtrl.InsertChild(ch21, { _T("SubStep A2"), _T("Run"), _T("Bond") }); |
| | | // 控件状态 |
| | | Resize(); |
| | | |
| | | // 初始让顶层展开 |
| | | root1->expanded = true; |
| | | root2->expanded = true; |
| | | // 如果m_pControlJob为空,取master的 |
| | | auto* cj = m_pControlJob; |
| | | if (cj == nullptr) { |
| | | cj = theApp.m_model.getMaster().getControlJob(); |
| | | } |
| | | |
| | | m_listCtrl.RebuildVisible(); |
| | | ShowGroup1(cj == nullptr); |
| | | ShowGroup2(cj != nullptr); |
| | | GetDlgItem(IDC_BUTTON_COMPLETION_BATH)->EnableWindow(cj != nullptr); |
| | | LoadData(cj); |
| | | |
| | | return TRUE; // return TRUE unless you set the focus to a control |
| | | // 异常: OCX 属性页应返回 FALSE |
| | | } |
| | | |
| | | void CControlJobDlg::OnSize(UINT nType, int cx, int cy) |
| | | { |
| | | CDialogEx::OnSize(nType, cx, cy); |
| | | if (GetDlgItem(IDC_LIST1) == nullptr) return; |
| | | Resize(); |
| | | } |
| | | |
| | | void CControlJobDlg::Resize() |
| | | { |
| | | CRect rcClient, rcItem; |
| | | CWnd* pItem; |
| | | |
| | | GetClientRect(rcClient); |
| | | |
| | | |
| | | // 关闭按钮 |
| | | int y = rcClient.bottom - 12; |
| | | pItem = GetDlgItem(IDCANCEL); |
| | | pItem->GetClientRect(&rcItem); |
| | | pItem->MoveWindow(rcClient.right - 12 - rcItem.Width(), |
| | | y - rcItem.Height(), |
| | | rcItem.Width(), rcItem.Height()); |
| | | y -= rcItem.Height(); |
| | | y -= 12; |
| | | |
| | | |
| | | // 线 |
| | | pItem = GetDlgItem(IDC_LINE1); |
| | | pItem->MoveWindow(12, y, rcClient.Width() - 24, 2); |
| | | y -= 2; |
| | | |
| | | |
| | | // Label |
| | | pItem = GetDlgItem(IDC_LABEL_NO_JOB); |
| | | pItem->GetClientRect(&rcItem); |
| | | pItem->MoveWindow((rcClient.Width() - rcItem.Width()) / 2, |
| | | (y - rcItem.Height()) / 2, |
| | | rcItem.Width(), rcItem.Height()); |
| | | |
| | | |
| | | // ListCtrl |
| | | pItem = GetDlgItem(IDC_LIST1); |
| | | pItem->MoveWindow(12, 12, rcClient.Width() - 24, y - 12); |
| | | } |
| | | |
| | | void CControlJobDlg::ShowGroup1(BOOL bShow) |
| | | { |
| | | GetDlgItem(IDC_LABEL_NO_JOB)->ShowWindow(bShow ? SW_SHOW : SW_HIDE); |
| | | GetDlgItem(IDC_LINE1)->ShowWindow(bShow ? SW_SHOW : SW_HIDE); |
| | | } |
| | | |
| | | void CControlJobDlg::ShowGroup2(BOOL bShow) |
| | | { |
| | | GetDlgItem(IDC_LIST1)->ShowWindow(bShow ? SW_SHOW : SW_HIDE); |
| | | } |
| | | |
| | | void CControlJobDlg::LoadData(SERVO::CControlJob* pControlJob) |
| | | { |
| | | m_listCtrl.ClearTree(); |
| | | if (pControlJob == nullptr) return; |
| | | |
| | | auto* root1 = m_listCtrl.InsertRoot({ pControlJob->id().c_str(), _T("ControlJob"), |
| | | pControlJob->getStateText().c_str(), _T(""), _T(""), pControlJob->failReason().c_str()}); |
| | | auto pjs = pControlJob->getPjs(); |
| | | for (auto pj : pjs) { |
| | | auto* root2 = m_listCtrl.InsertChild(root1, {pj->id().c_str(), _T("ProcessJob"), |
| | | pj->getStateText().c_str(), pj->recipeSpec().c_str(), _T(""), pj->failReason().c_str()}); |
| | | auto cs = pj->carriers(); |
| | | for (auto c : cs) { |
| | | for (auto g : c.contexts) { |
| | | SERVO::CGlass* pGlass = (SERVO::CGlass*)g; |
| | | if (pGlass != nullptr) { |
| | | int port, slot; |
| | | pGlass->getOrginPort(port, slot); |
| | | std::string carrier = c.carrierId + " / Port" + std::to_string(port + 1) + " / Slot" + std::to_string(slot + 1); |
| | | m_listCtrl.InsertChild(root2, { pGlass->getID().c_str(), _T("Glass"), |
| | | pGlass->getStateText().c_str(), _T(""), carrier.c_str(), _T("") }); |
| | | } |
| | | else { |
| | | m_listCtrl.InsertChild(root2, { "Null", _T("Glass"), _T(""), _T(""), c.carrierId.c_str(), _T("") }); |
| | | } |
| | | } |
| | | } |
| | | root2->expanded = true; |
| | | } |
| | | root1->expanded = true; |
| | | m_listCtrl.RebuildVisible(); |
| | | } |
| | | |
| | | void CControlJobDlg::OnBnClickedButtonCompletionBath() |
| | | { |
| | | if (theApp.m_model.getMaster().completeControlJob("测试手动结批")) { |
| | | AfxMessageBox("结批完成"); |
| | | } |
| | | |
| | | auto* cj = m_pControlJob; |
| | | if (cj == nullptr) { |
| | | cj = theApp.m_model.getMaster().getControlJob(); |
| | | } |
| | | |
| | | ShowGroup1(cj == nullptr); |
| | | ShowGroup2(cj != nullptr); |
| | | GetDlgItem(IDC_BUTTON_COMPLETION_BATH)->EnableWindow(cj != nullptr); |
| | | LoadData(cj); |
| | | } |