// 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; i<nUserDefectCount; i++)
|
{
|
nRow = i + 1;
|
nCol = 0;
|
|
// 1. No.
|
strTemp.Format(_T("%d"), i + 1);
|
m_SideUserDefectSetting.GetCell(nRow, nCol)->SetState(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; i<nUserDefectCount; i++)
|
{
|
nRow = i + 1;
|
nCol = 0;
|
|
// 1. No.
|
strTemp = m_SideUserDefectSetting.GetItemText(nRow, nCol++);
|
|
strTemp = m_SideUserDefectSetting.GetItemText(nRow, nCol++);
|
pParam->m_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; i<MAX_SIDE_USER_DEFECT_AREA_COUNT; i++)
|
{
|
if(i == nDelIdx)
|
continue;
|
|
pParam->m_UserDefectPrm[nPosIdx] = pParam->m_UserDefectPrm[i];
|
nPosIdx++;
|
}
|
pParam->m_nUserDefectAreaCount = nUserDefectCount - 1;
|
|
UpdateRecipe(FALSE);
|
}
|