// DlgSideUserDefectSetting.cpp : ±¸Çö ÆÄÀÏÀÔ´Ï´Ù. // #include "stdafx.h" #include "EdgeInspector_App.h" #include "DlgSideUserDefectSetting.h" #include "afxdialogex.h" // CDlgSideDimensionSetting ´ëÈ­ »óÀÚÀÔ´Ï´Ù. IMPLEMENT_DYNAMIC(CDlgSideUserDefectSetting, CDialogEx) CDlgSideUserDefectSetting::CDlgSideUserDefectSetting(CWnd* pParent /*=NULL*/) : CDialogEx(CDlgSideUserDefectSetting::IDD, pParent) { m_pDlgRecipe = NULL; m_pGlassData = NULL; m_pSelectSideIdx = NULL; m_pRecipeImageViewer = NULL; } CDlgSideUserDefectSetting::~CDlgSideUserDefectSetting() { } void CDlgSideUserDefectSetting::DoDataExchange(CDataExchange* pDX) { DDX_Control(pDX, IDC_SIDE_USER_DEFECT_SETTING_LIST, m_SideUserDefectSetting); CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CDlgSideUserDefectSetting, CDialogEx) END_MESSAGE_MAP() BOOL CDlgSideUserDefectSetting::PreTranslateMessage(MSG* pMsg) { if( pMsg->message == WM_KEYDOWN ) { if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE ) { ::TranslateMessage(pMsg); ::DispatchMessage(pMsg); return TRUE; // DO NOT process further } } return CDialog::PreTranslateMessage(pMsg); } void CDlgSideUserDefectSetting::SetDlgRecipe(CGlassRecipe* pDlgRecipe) { m_pDlgRecipe = pDlgRecipe; UpdateRecipe(FALSE); } void CDlgSideUserDefectSetting::UpdateRecipe(BOOL bGetData) { // Title if(m_pSelectSideIdx != NULL) { CString strTemp; strTemp.Format(_T("[%s] User Defect Setting"), g_SideName[(int) *(m_pSelectSideIdx)]); SetDlgItemText(IDC_STATIC_TITLE, strTemp); } if(bGetData == FALSE) { Fill_SideUserDefectSetting(bGetData); } else { Fill_SideUserDefectSetting(bGetData); } } void CDlgSideUserDefectSetting::Init_SideUserDefectSetting() { if (m_SideUserDefectSetting.GetSafeHwnd() == NULL) return; int nRows = 1; int nCols = 11; int nFixRows = 1; int nFixCols = 0; int nRowIdx = 0; int nColIdx = 0; m_SideUserDefectSetting.DeleteAllItems(); m_SideUserDefectSetting.SetVirtualMode(FALSE); m_SideUserDefectSetting.GetDefaultCell(TRUE, FALSE)->SetBackClr(g_nGridFixCellColor); m_SideUserDefectSetting.GetDefaultCell(FALSE, TRUE)->SetBackClr(g_nGridFixCellColor); m_SideUserDefectSetting.GetDefaultCell(FALSE, FALSE)->SetBackClr(g_nGridCellColor); m_SideUserDefectSetting.SetFixedTextColor(g_nGridFixFontColor); m_SideUserDefectSetting.SetRowCount(nRows); m_SideUserDefectSetting.SetColumnCount(nCols); m_SideUserDefectSetting.SetFixedRowCount(nFixRows); m_SideUserDefectSetting.SetFixedColumnCount(nFixCols); CFont *pFont = m_SideUserDefectSetting.GetFont(); if (pFont) { LOGFONT lf; pFont->GetLogFont(&lf); lf.lfItalic = 0; lf.lfHeight = 14; lf.lfWeight = FW_BOLD; _tcscpy_s(lf.lfFaceName, _T("Arial")); m_SideUserDefectSetting.GetDefaultCell(FALSE, TRUE)->SetFont(&lf); m_SideUserDefectSetting.GetDefaultCell(TRUE, FALSE)->SetFont(&lf); m_SideUserDefectSetting.GetDefaultCell(FALSE, FALSE)->SetFont(&lf); m_SideUserDefectSetting.GetDefaultCell(TRUE, TRUE)->SetFont(&lf); } // Col m_SideUserDefectSetting.SetColumnWidth(nColIdx, 80); m_SideUserDefectSetting.SetItemText(nRowIdx, nColIdx++, _T("No.")); m_SideUserDefectSetting.SetColumnWidth(nColIdx, 150); m_SideUserDefectSetting.SetItemText(nRowIdx, nColIdx++, _T("Use (0:Off/1:On)")); m_SideUserDefectSetting.SetColumnWidth(nColIdx, 200); m_SideUserDefectSetting.SetItemText(nRowIdx, nColIdx++, _T("Method (0:Gray/1:Y Pitch/2:X Pitch")); m_SideUserDefectSetting.SetColumnWidth(nColIdx, 120); m_SideUserDefectSetting.SetItemText(nRowIdx, nColIdx++, _T("Min Th.")); m_SideUserDefectSetting.SetColumnWidth(nColIdx, 120); m_SideUserDefectSetting.SetItemText(nRowIdx, nColIdx++, _T("Max Th.")); m_SideUserDefectSetting.SetColumnWidth(nColIdx, 120); m_SideUserDefectSetting.SetItemText(nRowIdx, nColIdx++, _T("Diff Th.")); m_SideUserDefectSetting.SetColumnWidth(nColIdx, 120); m_SideUserDefectSetting.SetItemText(nRowIdx, nColIdx++, _T("Diff Pitch")); m_SideUserDefectSetting.SetColumnWidth(nColIdx, 120); m_SideUserDefectSetting.SetItemText(nRowIdx, nColIdx++, _T("Min Size")); m_SideUserDefectSetting.SetColumnWidth(nColIdx, 120); m_SideUserDefectSetting.SetItemText(nRowIdx, nColIdx++, _T("NG Size X (um)")); m_SideUserDefectSetting.SetColumnWidth(nColIdx, 120); m_SideUserDefectSetting.SetItemText(nRowIdx, nColIdx++, _T("NG Size Y (um)")); m_SideUserDefectSetting.SetColumnWidth(nColIdx, 150); m_SideUserDefectSetting.SetItemText(nRowIdx, nColIdx++, _T("Filter (0:NG/1:OR/2:AND)")); m_SideUserDefectSetting.SetFixedRowSelection(FALSE); m_SideUserDefectSetting.SetFixedColumnSelection(FALSE); m_SideUserDefectSetting.EnableSelection(TRUE); m_SideUserDefectSetting.SetEditable(TRUE); m_SideUserDefectSetting.SetRowResize(FALSE); m_SideUserDefectSetting.SetColumnResize(FALSE); m_SideUserDefectSetting.ExpandColumnsToFit(TRUE); } void CDlgSideUserDefectSetting::Fill_SideUserDefectSetting(BOOL bGetData) { if(m_SideUserDefectSetting.GetSafeHwnd() == NULL) return; if(m_pDlgRecipe == NULL || m_pSelectSideIdx == NULL) return; int nSideIdx = *(m_pSelectSideIdx); if(nSideIdx < 0 || eRcp_SideRD_End <= nSideIdx) return; CSIDE_PARM* pParam = &m_pDlgRecipe->m_SideParam[nSideIdx]; CString strTemp; int nRow = 0; int nCol = 0; if(bGetData == FALSE) { int nUserDefectCount = pParam->m_nUserDefectAreaCount; m_SideUserDefectSetting.SetRowCount(nUserDefectCount + 1); for(int i=0; iSetState(GVIS_READONLY); m_SideUserDefectSetting.SetItemText(nRow, nCol++, strTemp); strTemp.Format(_T("%d"), (int) pParam->m_UserDefectPrm[i].m_bUseInspect); m_SideUserDefectSetting.SetItemText(nRow, nCol++, strTemp); strTemp.Format(_T("%d"), (int) pParam->m_UserDefectPrm[i].m_nInspect_Method); m_SideUserDefectSetting.SetItemText(nRow, nCol++, strTemp); strTemp.Format(_T("%d"), (int) pParam->m_UserDefectPrm[i].m_nMin_Threshold); m_SideUserDefectSetting.SetItemText(nRow, nCol++, strTemp); strTemp.Format(_T("%d"), (int) pParam->m_UserDefectPrm[i].m_nMax_Threshold); m_SideUserDefectSetting.SetItemText(nRow, nCol++, strTemp); strTemp.Format(_T("%d"), (int) pParam->m_UserDefectPrm[i].m_nDiff_Threshold); m_SideUserDefectSetting.SetItemText(nRow, nCol++, strTemp); strTemp.Format(_T("%d"), (int) pParam->m_UserDefectPrm[i].m_nDiff_Pitch); m_SideUserDefectSetting.SetItemText(nRow, nCol++, strTemp); strTemp.Format(_T("%d"), (int) pParam->m_UserDefectPrm[i].m_nMinSize_Filter_pxl); m_SideUserDefectSetting.SetItemText(nRow, nCol++, strTemp); strTemp.Format(_T("%d"), (int) pParam->m_UserDefectPrm[i].m_nJudge_Size_Min_X_um); m_SideUserDefectSetting.SetItemText(nRow, nCol++, strTemp); strTemp.Format(_T("%d"), (int) pParam->m_UserDefectPrm[i].m_nJudge_Size_Min_Y_um); m_SideUserDefectSetting.SetItemText(nRow, nCol++, strTemp); strTemp.Format(_T("%d"), (int) pParam->m_UserDefectPrm[i].m_nJudge_Size_Min_OR_AND); m_SideUserDefectSetting.SetItemText(nRow, nCol++, strTemp); } m_SideUserDefectSetting.Invalidate(); } else { int nUserDefectCount = m_SideUserDefectSetting.GetRowCount() - 1; pParam->m_nUserDefectAreaCount = nUserDefectCount; for(int i=0; im_UserDefectPrm[i].m_bUseInspect = _wtoi(strTemp); strTemp = m_SideUserDefectSetting.GetItemText(nRow, nCol++); pParam->m_UserDefectPrm[i].m_nInspect_Method = _wtoi(strTemp); strTemp = m_SideUserDefectSetting.GetItemText(nRow, nCol++); pParam->m_UserDefectPrm[i].m_nMin_Threshold = _wtoi(strTemp); strTemp = m_SideUserDefectSetting.GetItemText(nRow, nCol++); pParam->m_UserDefectPrm[i].m_nMax_Threshold = _wtoi(strTemp); strTemp = m_SideUserDefectSetting.GetItemText(nRow, nCol++); pParam->m_UserDefectPrm[i].m_nDiff_Threshold = _wtoi(strTemp); strTemp = m_SideUserDefectSetting.GetItemText(nRow, nCol++); pParam->m_UserDefectPrm[i].m_nDiff_Pitch = _wtoi(strTemp); strTemp = m_SideUserDefectSetting.GetItemText(nRow, nCol++); pParam->m_UserDefectPrm[i].m_nMinSize_Filter_pxl = _wtoi(strTemp); strTemp = m_SideUserDefectSetting.GetItemText(nRow, nCol++); pParam->m_UserDefectPrm[i].m_nJudge_Size_Min_X_um = _wtoi(strTemp); strTemp = m_SideUserDefectSetting.GetItemText(nRow, nCol++); pParam->m_UserDefectPrm[i].m_nJudge_Size_Min_Y_um = _wtoi(strTemp); strTemp = m_SideUserDefectSetting.GetItemText(nRow, nCol++); pParam->m_UserDefectPrm[i].m_nJudge_Size_Min_OR_AND = _wtoi(strTemp); } } } BOOL CDlgSideUserDefectSetting::OnInitDialog() { CDialogEx::OnInitDialog(); Init_SideUserDefectSetting(); return TRUE; } BEGIN_EVENTSINK_MAP(CDlgSideUserDefectSetting, CDialogEx) ON_EVENT(CDlgSideUserDefectSetting, IDC_BUTTON_ADD, DISPID_CLICK, CDlgSideUserDefectSetting::ClickButtonAdd, VTS_NONE) ON_EVENT(CDlgSideUserDefectSetting, IDC_BUTTON_MODIFY, DISPID_CLICK, CDlgSideUserDefectSetting::ClickButtonModify, VTS_NONE) ON_EVENT(CDlgSideUserDefectSetting, IDC_BUTTON_DEL, DISPID_CLICK, CDlgSideUserDefectSetting::ClickButtonDel, VTS_NONE) END_EVENTSINK_MAP() void CDlgSideUserDefectSetting::ClickButtonAdd() { if(m_pDlgRecipe == NULL || m_pSelectSideIdx == NULL) return; int nSideIdx = *(m_pSelectSideIdx); if(nSideIdx < 0 || eRcp_SideRD_End <= nSideIdx) return; CSIDE_PARM* pParam = &m_pDlgRecipe->m_SideParam[nSideIdx]; int nAddIdx = pParam->m_nUserDefectAreaCount; if(nAddIdx < 0 || MAX_SIDE_USER_DEFECT_AREA_COUNT <= nAddIdx) { CString strMsg; strMsg.Format(_T("Max User Defect Count : %d ea"), MAX_SIDE_USER_DEFECT_AREA_COUNT); AfxMessageBox(strMsg); return; } if(m_pGlassData == NULL || m_pRecipeImageViewer == NULL) return; CSide_Data* pSideData = m_pGlassData->GetSideData((DimensionDir) nSideIdx); if(pSideData == NULL) return; if(pSideData->m_bTopMark_Find == FALSE || pSideData->m_bBotMark_Find == FALSE) { AfxMessageBox(_T("Check Mark Find..")); return; } pParam->m_UserDefectPrm[nAddIdx].Reset(); pParam->m_UserDefectPrm[nAddIdx].m_ptTopMarkPos = pSideData->m_ptTopMark_FindResult; pParam->m_UserDefectPrm[nAddIdx].m_ptBotMarkPos = pSideData->m_ptBotMark_FindResult; pParam->m_UserDefectPrm[nAddIdx].m_rtUserDefectArea = m_pRecipeImageViewer->GetManualMeasureRect(); pParam->m_UserDefectPrm[nAddIdx].m_bUseInspect = TRUE; pParam->m_UserDefectPrm[nAddIdx].m_nInspect_Method = 0; // 0 : Gray, 1 : Y Pitch, 2 : X Pitch pParam->m_UserDefectPrm[nAddIdx].m_nMin_Threshold = 30; pParam->m_UserDefectPrm[nAddIdx].m_nMax_Threshold = 255; pParam->m_UserDefectPrm[nAddIdx].m_nDiff_Threshold = 15; pParam->m_UserDefectPrm[nAddIdx].m_nDiff_Pitch = 10; pParam->m_UserDefectPrm[nAddIdx].m_nMinSize_Filter_pxl = 3; pParam->m_UserDefectPrm[nAddIdx].m_nJudge_Size_Min_X_um = 50; pParam->m_UserDefectPrm[nAddIdx].m_nJudge_Size_Min_Y_um = 50; pParam->m_UserDefectPrm[nAddIdx].m_nJudge_Size_Min_OR_AND = 1; // 0 : No Use, 1 : OR, 2 : AND pParam->m_nUserDefectAreaCount = nAddIdx + 1; // Draw User Defect Area pSideData->m_rtUserDefectArea_pxl[nAddIdx] = pParam->m_UserDefectPrm[nAddIdx].m_rtUserDefectArea; pSideData->m_nUserDefectAreaCount++; m_pRecipeImageViewer->Invalidate(); UpdateRecipe(FALSE); } void CDlgSideUserDefectSetting::ClickButtonModify() { if(m_pDlgRecipe == NULL || m_pSelectSideIdx == NULL) return; int nSideIdx = *(m_pSelectSideIdx); if(nSideIdx < 0 || eRcp_SideRD_End <= nSideIdx) return; CSIDE_PARM* pParam = &m_pDlgRecipe->m_SideParam[nSideIdx]; int nUserDefectCount = pParam->m_nUserDefectAreaCount; CCellID FocusedID = m_SideUserDefectSetting.GetFocusCell(); int nModifyIdx = FocusedID.row - 1; if(nModifyIdx < 0 || nUserDefectCount <= nModifyIdx) { AfxMessageBox(_T("Select Error")); return; } CString strTemp; strTemp.Format(_T("Modify [%d] User Defect Area ?"), nModifyIdx+1); if(IDYES != AfxMessageBox(strTemp, MB_YESNO)) return; if(m_pGlassData == NULL || m_pRecipeImageViewer == NULL) return; CSide_Data* pSideData = m_pGlassData->GetSideData((DimensionDir) nSideIdx); if(pSideData == NULL) return; if(pSideData->m_bTopMark_Find == FALSE || pSideData->m_bBotMark_Find == FALSE) { AfxMessageBox(_T("Check Mark Find..")); return; } pParam->m_UserDefectPrm[nModifyIdx].m_ptTopMarkPos = pSideData->m_ptTopMark_FindResult; pParam->m_UserDefectPrm[nModifyIdx].m_ptBotMarkPos = pSideData->m_ptBotMark_FindResult; pParam->m_UserDefectPrm[nModifyIdx].m_rtUserDefectArea = m_pRecipeImageViewer->GetManualMeasureRect(); // Draw User Defect Area pSideData->m_rtUserDefectArea_pxl[nModifyIdx] = pParam->m_UserDefectPrm[nModifyIdx].m_rtUserDefectArea; m_pRecipeImageViewer->Invalidate(); UpdateRecipe(FALSE); } void CDlgSideUserDefectSetting::ClickButtonDel() { if(m_pDlgRecipe == NULL || m_pSelectSideIdx == NULL) return; int nSideIdx = *(m_pSelectSideIdx); if(nSideIdx < 0 || eRcp_SideRD_End <= nSideIdx) return; CSIDE_PARM* pParam = &m_pDlgRecipe->m_SideParam[nSideIdx]; int nUserDefectCount = pParam->m_nUserDefectAreaCount; CCellID FocusedID = m_SideUserDefectSetting.GetFocusCell(); int nDelIdx = FocusedID.row - 1; if(nDelIdx < 0 || nUserDefectCount <= nDelIdx) { AfxMessageBox(_T("Select Error")); return; } CString strTemp; strTemp.Format(_T("Delete [%d] User Defect Area ?"), nDelIdx+1); if(IDYES != AfxMessageBox(strTemp, MB_YESNO)) return; int nPosIdx = 0; for(int i=0; im_UserDefectPrm[nPosIdx] = pParam->m_UserDefectPrm[i]; nPosIdx++; } pParam->m_nUserDefectAreaCount = nUserDefectCount - 1; UpdateRecipe(FALSE); }