// DlgDeffectHistroy.cpp: 구현 파일 // #include "stdafx.h" #include "ReviewSystem.h" #include "DlgDeffectHistroy.h" #include "afxdialogex.h" #include "MainFrm.h" #include "DlgDefectHistoryMap.h" #include "DlgReviewHistoryTool.h" #include using namespace CHReviewResult; // SDC 향 #define DEFECTLISTCNT 14 TCHAR* Defect_HistoryTitlelist[DEFECTLISTCNT] = { _T("No"), _T("Mask_X(mm)"), _T("Mask_Y(mm)"), _T("Size"), _T("Peak"), _T("Cam"), _T("Scan"), _T("Type"), _T("Stack"), _T("Zone"), _T("Type"), _T("AOI_X(mm)"), _T("AOI_Y(mm)") }; int Defect_Historywidth[DEFECTLISTCNT] = { 50, 80, 80, 50, 50, 40, 40, 45, 45, 50, 50, 80, 80 }; // [2017:6:7]-[WEZASW] : BOE향 #define B7_DEFECTLISTCNT 15 TCHAR* B7_Defect_HistoryTitlelist[B7_DEFECTLISTCNT] = { _T("No"), _T("RV_X(mm)"), _T("RV_Y(mm)"), _T("DType"), _T("DCode"), _T("MType"), _T("SType"), _T("DLength"), _T("Area"), _T("Peak"), _T("Cam"), _T("DType1"), _T("AOI_X(mm)"), _T("AOI_Y(mm)") }; int B7_Defect_Historywidth[B7_DEFECTLISTCNT] = { 40, 65, 65, 65, 50, 55, 50, 60, 45, 45, 40, 60, 80, 80 }; // CDlgDeffectHistroy 대화 상자 IMPLEMENT_DYNAMIC(CDlgDeffectHistroy, CDialogEx) CDlgDeffectHistroy::CDlgDeffectHistroy(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DLG_DEFECT_HISTORY_TAB, pParent) { m_pDDL2P = NULL; m_nProcessStatus = 0; m_bAsending = TRUE; m_pMapDefectResult = NULL; } CDlgDeffectHistroy::~CDlgDeffectHistroy() { } void CDlgDeffectHistroy::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_HISTORY_DEFECT, m_ctrlListDefectHistory); } BEGIN_MESSAGE_MAP(CDlgDeffectHistroy, CDialogEx) ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_HISTORY_DEFECT, &CDlgDeffectHistroy::OnColumnclickListHistoryDefect) ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST_HISTORY_DEFECT, &CDlgDeffectHistroy::OnGetdispinfoListHistoryDefect) ON_NOTIFY(NM_DBLCLK, IDC_LIST_HISTORY_DEFECT, &CDlgDeffectHistroy::OnDblclkListHistoryDefect) //ON_NOTIFY(NM_CLICK, IDC_LIST_HISTORY_DEFECT, &CDlgDeffectHistroy::OnDblclkListHistoryDefect) ON_MESSAGE(UM_PROCESS_STATUS_UPDATE, &CDlgDeffectHistroy::OnProcessStatusUpdate) ON_MESSAGE(UM_DEFECT_FILTER_UPDATE, &CDlgDeffectHistroy::OnDefectFilterUpdate) END_MESSAGE_MAP() // CDlgDeffectHistroy 메시지 처리기 LRESULT CDlgDeffectHistroy::OnProcessStatusUpdate(WPARAM wParam, LPARAM lParam) { if (m_pMapDefectResult == NULL) return 0; if (m_pMapDefectResult->size() == 0) return 0; m_pOrgDefect.clear(); m_pSortDefect.clear(); UpdateColumn(); CDefectResult* pDefectResult = NULL; for (constMapDefectResultIt it = m_pMapDefectResult->begin(); it != m_pMapDefectResult->end(); it++) { pDefectResult = static_cast(it->second); if (!pDefectResult) continue; if (!m_sDefectFilter.bOpticDark && (pDefectResult->nOpticType == DEFECT_OPTIC_DARK)) { continue; } if (!m_sDefectFilter.bOpticBright && (pDefectResult->nOpticType == DEFECT_OPTIC_BRIGHT)) { continue; } if (!m_sDefectFilter.bOpticDkBr && (pDefectResult->nOpticType == DEFECT_OPTIC_DKBR)) { continue; } if (!m_sDefectFilter.bGrayBlack && (pDefectResult->nGrayType == DEFECT_GRAY_BLACK)) { continue; } if (!m_sDefectFilter.bGrayWhite && (pDefectResult->nGrayType == DEFECT_GRAY_WHITE)) { continue; } if (!m_sDefectFilter.bStackTD && (pDefectResult->nStackType == DEFECT_STACK_TD)) { continue; } if (!m_sDefectFilter.bStackCD && (pDefectResult->nStackType == DEFECT_STACK_CD)) { continue; } if (!m_sDefectFilter.bStackSD && (pDefectResult->nStackType == DEFECT_STACK_SD)) { continue; } if (!m_sDefectFilter.bStackSP && (pDefectResult->nStackType == DEFECT_STACK_SP)) { continue; } //taek m_pOrgDefect.push_back(pDefectResult); m_pSortDefect.push_back(pDefectResult); } m_bAsending = TRUE; SortListDefect(0); return 1; } LRESULT CDlgDeffectHistroy::OnDefectFilterUpdate(WPARAM wParam, LPARAM lParam) { if (m_pMapDefectResult == NULL) return 0; m_pOrgDefect.clear(); m_pSortDefect.clear(); UpdateColumn(); CDefectResult* pDefectResult = NULL; for (constMapDefectResultIt it = m_pMapDefectResult->begin(); it != m_pMapDefectResult->end(); it++) { pDefectResult = static_cast(it->second); if (!pDefectResult) continue; if (!m_sDefectFilter.bOpticDark && (pDefectResult->nOpticType == DEFECT_OPTIC_DARK)) { continue; } if (!m_sDefectFilter.bOpticBright && (pDefectResult->nOpticType == DEFECT_OPTIC_BRIGHT)) { continue; } if (!m_sDefectFilter.bOpticDkBr && (pDefectResult->nOpticType == DEFECT_OPTIC_DKBR)) { continue; } if (!m_sDefectFilter.bGrayBlack && (pDefectResult->nGrayType == DEFECT_GRAY_BLACK)) { continue; } if (!m_sDefectFilter.bGrayWhite && (pDefectResult->nGrayType == DEFECT_GRAY_WHITE)) { continue; } if (!m_sDefectFilter.bStackTD && (pDefectResult->nStackType == DEFECT_STACK_TD)) { continue; } if (!m_sDefectFilter.bStackPD && (pDefectResult->nStackType == DEFECT_STACK_PD)) { continue; } if (!m_sDefectFilter.bStackSD && (pDefectResult->nStackType == DEFECT_STACK_SD)) { continue; } if (!m_sDefectFilter.bStackSP && (pDefectResult->nStackType == DEFECT_STACK_SP)) { continue; } //taek if (!m_sDefectFilter.bPositionFront && (pDefectResult->nDefectPos == DEFECT_POSITION_FRONT)) { continue; } if (!m_sDefectFilter.bPositionBack && (pDefectResult->nDefectPos == DEFECT_POSITION_BACK)) { continue; } m_pOrgDefect.push_back(pDefectResult); m_pSortDefect.push_back(pDefectResult); } m_bAsending = TRUE; SortListDefect(0); return 0; } void CDlgDeffectHistroy::OnColumnclickListHistoryDefect(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. SortListDefect(pNMLV->iSubItem); *pResult = 0; } void CDlgDeffectHistroy::SortListDefect(int nCol) { LISTDefectit it; CDefectResult* pDefectResult; m_bAsending = !m_bAsending; if (nCol == 3 || nCol == 4 || nCol == 5 || nCol == 10) { vector< pair > vec; for (it = m_pSortDefect.begin(); it != m_pSortDefect.end(); ++it) { pDefectResult = *it; switch (nCol) { case 3: vec.push_back(make_pair(pDefectResult->strDefectType, pDefectResult)); break; case 4: vec.push_back(make_pair(pDefectResult->strMarkType, pDefectResult)); break; case 5: vec.push_back(make_pair(pDefectResult->strSizeType, pDefectResult)); break; case 10: vec.push_back(make_pair(pDefectResult->strDefectType1, pDefectResult)); break; default: continue; } } if (m_bAsending == TRUE) { std::sort(vec.begin(), vec.end(), greater< pair >()); } else { std::sort(vec.begin(), vec.end(), less< pair >()); } m_pSortDefect.clear(); vector< pair >::iterator itVec; for (itVec = vec.begin(); itVec != vec.end(); ++itVec) { m_pSortDefect.push_back(itVec->second); } vec.clear(); } else { vector< pair > vec; int nValue; for (it = m_pSortDefect.begin(); it != m_pSortDefect.end(); ++it) { pDefectResult = *it; if (!m_pDDL2P->GetAllDefect()) { if (!Mathching(pDefectResult)) { continue; } } switch (nCol) { case 0: nValue = pDefectResult->nDefectIdx; break; // _T("No") case 1: nValue = pDefectResult->nUMOriginX; break; // _T("RV_X(mm)") case 2: nValue = pDefectResult->nUMOriginY; break; // _T("RV_Y(mm)") case 6: nValue = pDefectResult->nAOISizeLength; break; // _T("DLength") case 7: nValue = pDefectResult->nAOIArea; break; // _T("Area") case 8: nValue = pDefectResult->nAOIPeak; break; // _T("Peak") case 9: nValue = pDefectResult->nAOICameraIdx; break; // _T("Cam") case 10: nValue = pDefectResult->nAOIScanIdx; break; // _T("Cam") case 11: nValue = pDefectResult->dUMCenterOriginX; break; // _T("AOI_X(mm)") case 12: nValue = pDefectResult->dUMCenterOriginY; break; // _T("AOI_Y(mm)") default: continue; } vec.push_back(make_pair(nValue, pDefectResult)); } if (m_bAsending == TRUE) { std::sort(vec.begin(), vec.end(), greater< pair >()); } else { std::sort(vec.begin(), vec.end(), less< pair >()); } m_pSortDefect.clear(); vector< pair >::iterator itVec; for (itVec = vec.begin(); itVec != vec.end(); ++itVec) { m_pSortDefect.push_back(itVec->second); } vec.clear(); } m_ctrlListDefectHistory.SetItemCount((int)m_pSortDefect.size()); } void CDlgDeffectHistroy::SetDefect() { SetSortData(); } void CDlgDeffectHistroy::SetSortData() { LISTDefectit it; CDefectResult* pDefectResult; m_pSortDefect.clear(); for (it = m_pOrgDefect.begin(); it != m_pOrgDefect.end(); it++) { pDefectResult = *it; if (!pDefectResult) continue; m_pSortDefect.push_back(pDefectResult); } m_ctrlListDefectHistory.SetItemCount((int)m_pSortDefect.size()); } BOOL CDlgDeffectHistroy::Mathching(CDefectResult* pDefectResult) { if (pDefectResult == NULL) return FALSE; return m_pDDL2P->Mathching(pDefectResult); } void CDlgDeffectHistroy::UpdateSelectDefectList(int nDefectIdx) { int i, nCount; CString strText; nCount = m_ctrlListDefectHistory.GetItemCount(); for (i = 0; i < nCount; i++) { strText = m_ctrlListDefectHistory.GetItemText(i, 0); if (nDefectIdx == _ttoi(strText)) { m_ctrlListDefectHistory.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED); m_ctrlListDefectHistory.EnsureVisible(i, FALSE); break; } } } void CDlgDeffectHistroy::SetListHeader(CString & strItem, int nRow, int nCol) { if (nRow != 0) return; switch (nCol) { case 0: strItem = _T("No"); break; case 1: strItem = _T("RV_X(mm)"); break; case 2: strItem = _T("RV_Y(mm)"); break; case 3: strItem = _T("DType"); break; case 4: strItem = _T("DCode"); break; case 5: strItem = _T("Judge"); break; case 6: strItem = _T("SType"); break; case 7: strItem = _T("DLength"); break; case 8: strItem = _T("Area"); break; case 9: strItem = _T("Peak"); break; case 10: strItem = _T("Cam"); break; case 11: strItem = _T("ScanN"); break; case 12: strItem = _T("AOI_X(mm)"); break; case 13: strItem = _T("AOI_Y(mm)"); break; default: break; } } void CDlgDeffectHistroy::UpdateColumn() { if (GetSafeHwnd() == NULL) return; m_ctrlListDefectHistory.SetRedraw(FALSE); LV_COLUMN column; int col = B7_DEFECTLISTCNT; m_ctrlListDefectHistory.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); int i; for (i = 0; i < col; i++) { m_ctrlListDefectHistory.DeleteColumn(0); } CString strTitle; for (i = 0; i < col; i++) { column.mask = LVCF_FMT | LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH; column.fmt = LVCFMT_LEFT; SetListHeader(strTitle, 0, i); column.pszText = (LPSTR)(LPCTSTR)strTitle; column.iSubItem = i; column.cx = B7_Defect_Historywidth[i]; m_ctrlListDefectHistory.InsertColumn(i + 1, &column); } m_ctrlListDefectHistory.SetRedraw(TRUE); } void CDlgDeffectHistroy::UpdateDefectFilter(const SDefectFilter * pDefectFilter) { if (pDefectFilter == NULL) return; // save defect filter m_sDefectFilter = *pDefectFilter; this->PostMessage(UM_DEFECT_FILTER_UPDATE); } void CDlgDeffectHistroy::UpdateProcessStatus(const CGlassResult * pGlassResult) { if (pGlassResult == NULL) return; m_pMapDefectResult = pGlassResult->GetMapDefectResult(); this->SendMessage(UM_PROCESS_STATUS_UPDATE); } void CDlgDeffectHistroy::OnGetdispinfoListHistoryDefect(NMHDR *pNMHDR, LRESULT *pResult) { NMLVDISPINFO *pDispInfo = reinterpret_cast(pNMHDR); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. CString strData, strText; SetData(strData, pDispInfo->item.iItem, pDispInfo->item.iSubItem); if ((pDispInfo->item.mask & LVIF_TEXT) == LVIF_TEXT) { #ifdef UNICODE BSTR bstr; bstr = strData.AllocSysString(); pDispInfo->item.pszText = (LPSTR)bstr; pDispInfo->item.pszText = static_cast(bstr); SysFreeString(bstr); #endif //멀티바이트 strcpy(pDispInfo->item.pszText, (LPSTR)(LPCTSTR)strData); } *pResult = 0; } void CDlgDeffectHistroy::SetData(CString& strItem, int nRow, int nCol) { if ((int)m_pSortDefect.size() <= nRow || nRow < 0) return; CDefectResult* pDefectResult; pDefectResult = (CDefectResult*)m_pSortDefect.at(nRow); if (pDefectResult == NULL) return; strItem = _T(""); switch (nCol) { case 0: //No { strItem.Format(_T("%d"), pDefectResult->nDefectIdx); } break; case 1: //RV_X(mm) { strItem.Format(_T("%.03lf"), pDefectResult->nUMOriginX / 1000.); } break; case 2: //RV_Y(mm) { strItem.Format(_T("%.03lf"), pDefectResult->nUMOriginY / 1000.); } break; case 3: //DType { strItem.Format(_T("%s"), pDefectResult->strDefectType); } break; case 4: //MType { strItem.Format(_T("%s"), pDefectResult->strDefectJudgeCode); } break; case 5: //MType { strItem.Format(_T("%s"), pDefectResult->strJudgeType); } break; case 6: //S_Type { strItem.Format(_T("%s"), pDefectResult->strSizeType); } break; case 7: //DLength { strItem.Format(_T("%d"), (int)pDefectResult->nAOISizeLength); } break; case 8: //Area { strItem.Format(_T("%d"), (int)pDefectResult->nAOIArea); } break; case 9: //Peak { strItem.Format(_T("%d"), pDefectResult->nAOIPeak); } break; case 10: //Cam { strItem.Format(_T("%d"), pDefectResult->nAOICameraIdx); } break; case 11: //D_Type1 { // strItem.Format(_T("%s"), pDefectResult->strDefectType1); strItem.Format(_T("%d"), pDefectResult->nAOIScanIdx); } break; case 12: //AOI_X(mm) { strItem.Format(_T("%.03lf"), pDefectResult->dUMCenterOriginX / 1000.); } break; case 13: //AOI_Y(mm) { strItem.Format(_T("%.03lf"), pDefectResult->dUMCenterOriginY / 1000.); } break; default: break; } } void CDlgDeffectHistroy::OnDblclkListHistoryDefect(NMHDR *pNMHDR, LRESULT *pResult) { /*< LYW 20211005 - #3662 ADD Start >*/ try { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. int nPos = m_ctrlListDefectHistory.GetSelectionMark(); if (nPos >= 0) { CString strText; strText = m_ctrlListDefectHistory.GetItemText(nPos, 0); int nDefectIdx = _ttoi(strText); if (nDefectIdx < 0) return; //History tool 에 인덱스 번호 넘기기 m_pDDL2P->UpdateSelectDefectInfoMap2(nDefectIdx); } *pResult = 0; } catch (...) { return; } /*< LYW 20211005 - #3662 ADD End >*/ } void CDlgDeffectHistroy::OnSize(UINT nType, int cx, int cy) { __super::OnSize(nType, cx, cy); // TODO: 여기에 메시지 처리기 코드를 추가합니다. if (m_ctrlListDefectHistory.GetSafeHwnd()) { m_ctrlListDefectHistory.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOZORDER); } } CDlgDeffectHistroy* CDlgDeffectHistroy::CDlgHistoryDefelist; CDlgDeffectHistroy* CDlgDeffectHistroy::GetInstance() { // CDlgDeffectHistroy 를 다른곳에서도 사용하게끔 싱글톤으로 구현 if (CDlgHistoryDefelist == NULL) { CDlgHistoryDefelist = new CDlgDeffectHistroy; } return CDlgHistoryDefelist; }; BOOL CDlgDeffectHistroy::OnEraseBkgnd(CDC* pDC) { // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다. CRect rect; GetClientRect(&rect); __super::OnEraseBkgnd(pDC); pDC->FillSolidRect(rect, RGB(38, 38, 38)); return TRUE; } HBRUSH CDlgDeffectHistroy::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = __super::OnCtlColor(pDC, pWnd, nCtlColor); CRect rect; CString strClass = _T(""); UINT nID = pWnd->GetDlgCtrlID(); if (nCtlColor == CTLCOLOR_STATIC) { pDC->SetTextColor(RGB(255, 255, 255)); pDC->SetBkColor(RGB(38, 38, 38)); hbr = (HBRUSH)GetStockObject(NULL_BRUSH); } // TODO: 기본값이 적당하지 않으면 다른 브러시를 반환합니다. return hbr; } BOOL CDlgDeffectHistroy::OnInitDialog() { CDialog::OnInitDialog(); // TODO: 여기에 추가 초기화 작업을 추가합니다. UpdateColumn(); return TRUE; // return TRUE unless you set the focus to a control // 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다. } BOOL CDlgDeffectHistroy::PreTranslateMessage(MSG* pMsg) { // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다. if (pMsg->message == WM_KEYDOWN) { if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) { ::TranslateMessage(pMsg); ::DispatchMessage(pMsg); return TRUE; } } return CDialog::PreTranslateMessage(pMsg); }