重构:移除文件保存中的班别逻辑,改为基于玻璃Loading Time的按小时/按天保存
优化:缺陷图片中的标注文本,针对Notch Dimension和Notch Chamfer类型,增加特殊标记,便于区分
已修改8个文件
230 ■■■■■ 文件已修改
EdgeInspector_App/Data/DefectStorage.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/Data/PostProcess.cpp 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/Defect.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/EdgeInspector_App.rc 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/Recipe/HardwareSettings.cpp 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/Recipe/HardwareSettings.h 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/View/ViewMain_HWSetting.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/resource.h 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/Data/DefectStorage.cpp
@@ -309,6 +309,8 @@
    pDefect->m_bJudge_NG = TRUE;
    pDefect->m_dSizeX_um = dMeasureResult_um;
    pDefect->m_dSizeY_um = dMeasureDiff_um;
    pDefect->m_dChamfer_um = dMeasureResult_um;
    pDefect->m_dChamferOff_um = dMeasureDiff_um;
    pDefect->m_DefectInfo = defect;
    if(m_pGrabber->GetSmallImage(iScan,pDefect->m_Image
EdgeInspector_App/Data/PostProcess.cpp
@@ -180,6 +180,9 @@
    if (glass_id.IsEmpty() == TRUE)
        glass_id.Format(_T("MANUAL_ID"));
    // 获取当前产品加载时间
    CTime tGlassLoading = m_pGlassData->GetLoadingTime();
    CString measure_data;
    CString chip_data;
    CString defect_data;
@@ -241,42 +244,19 @@
        m_pGlassData->GetSideData(DIMENSION_C)->m_nTopCornerHeight,
        m_pGlassData->GetSideData(DIMENSION_C)->m_nBottomCornerWidth,
        m_pGlassData->GetSideData(DIMENSION_C)->m_nBottomCornerHeight
        );
    );
    measure_data.Append(_T("\r\n"));
    CString measure_file_path;
    if (m_pHardware->m_bSaveResultByHour) {
        // 按小时保存结果
        measure_file_path.Format(_T("%s\\%s_%02d_MeasureData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, tGlassLoading.GetHour());
    }
    else {
        // 不按小时保存结果
        measure_file_path.Format(_T("%s\\%s_MeasureData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay);
    }
    // 获取当前时间
    std::time_t m_now = std::time(nullptr);
    // 使用localtime_s代替localtime
    std::tm m_nowTm;
    localtime_s(&m_nowTm, &m_now);
    if (m_nowTm.tm_hour < 4)
    {
        measure_file_path.Format(_T("%s\\%s_%02d_MeasureData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay,24);
    }
    else if(m_nowTm.tm_hour > 3 && m_nowTm.tm_hour < 9)
    {
        measure_file_path.Format(_T("%s\\%s_%02d_MeasureData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 4);
    }
    else if (m_nowTm.tm_hour > 7 && m_nowTm.tm_hour < 13)
    {
        measure_file_path.Format(_T("%s\\%s_%02d_MeasureData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 8);
    }
    else if (m_nowTm.tm_hour > 11 && m_nowTm.tm_hour < 17)
    {
        measure_file_path.Format(_T("%s\\%s_%02d_MeasureData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 12);
    }
    else if (m_nowTm.tm_hour > 15 && m_nowTm.tm_hour < 21)
    {
        measure_file_path.Format(_T("%s\\%s_%02d_MeasureData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 16);
    }
    else if (m_nowTm.tm_hour > 19)
    {
        measure_file_path.Format(_T("%s\\%s_%02d_MeasureData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 20);
    }
    CheckDirectory(measure_file_path);
    CFile measure_module;
@@ -434,31 +414,13 @@
    }
    CString Chip_file_path;
    localtime_s(&m_nowTm, &m_now);
    if (m_nowTm.tm_hour < 4)
    {
        Chip_file_path.Format(_T("%s\\%s_%02d_ChipData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay,24);
    if (m_pHardware->m_bSaveResultByHour) {
        // 按小时保存结果
        Chip_file_path.Format(_T("%s\\%s_%02d_ChipData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, tGlassLoading.GetHour());
    }
    else if (m_nowTm.tm_hour > 3 && m_nowTm.tm_hour < 9)
    {
        Chip_file_path.Format(_T("%s\\%s_%02d_ChipData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 4);
    }
    else if (m_nowTm.tm_hour > 7 && m_nowTm.tm_hour < 13)
    {
        Chip_file_path.Format(_T("%s\\%s_%02d_ChipData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 8);
    }
    else if (m_nowTm.tm_hour > 11 && m_nowTm.tm_hour < 17)
    {
        Chip_file_path.Format(_T("%s\\%s_%02d_ChipData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 12);
    }
    else if (m_nowTm.tm_hour > 15 && m_nowTm.tm_hour < 21)
    {
        Chip_file_path.Format(_T("%s\\%s_%02d_ChipData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 16);
    }
    else if (m_nowTm.tm_hour > 19)
    {
        Chip_file_path.Format(_T("%s\\%s_%02d_ChipData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 20);
    else {
        // 不按小时保存结果
        Chip_file_path.Format(_T("%s\\%s_ChipData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay);
    }
    
    CheckDirectory(Chip_file_path);
@@ -481,32 +443,15 @@
    }
    CString Defect_file_path;
    if (m_pHardware->m_bSaveResultByHour) {
        // 按小时保存结果
        Defect_file_path.Format(_T("%s\\%s_%02d_DefectData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, tGlassLoading.GetHour());
    }
    else {
        // 不按小时保存结果
        Defect_file_path.Format(_T("%s\\%s_DefectData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay);
    }
    if (m_nowTm.tm_hour < 4)
    {
        Defect_file_path.Format(_T("%s\\%s_%02d_DefectData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 24);
    }
    else if (m_nowTm.tm_hour > 3 && m_nowTm.tm_hour < 9)
    {
        Defect_file_path.Format(_T("%s\\%s_%02d_DefectData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 4);
    }
    else if (m_nowTm.tm_hour > 7 && m_nowTm.tm_hour < 13)
    {
        Defect_file_path.Format(_T("%s\\%s_%02d_DefectData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 8);
    }
    else if (m_nowTm.tm_hour > 11 && m_nowTm.tm_hour < 17)
    {
        Defect_file_path.Format(_T("%s\\%s_%02d_DefectData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 12);
    }
    else if (m_nowTm.tm_hour > 15 && m_nowTm.tm_hour < 21)
    {
        Defect_file_path.Format(_T("%s\\%s_%02d_DefectData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 16);
    }
    else if (m_nowTm.tm_hour > 19)
    {
        Defect_file_path.Format(_T("%s\\%s_%02d_DefectData.csv"), m_strResultFolder, g_pBase->m_strLoadingDay, 20);
    }
    CheckDirectory(Defect_file_path);
    CFile defect_module;
@@ -642,14 +587,22 @@
BOOL CPostProcess::SaveDefectImage_with_Title(CDefect* pDefect, CSize szImage,CRect rectDefect,CString strFile, CvScalar color)
{
    Lock();
    if(pDefect == NULL || pDefect->m_Image == NULL)
    if (pDefect == NULL || pDefect->m_Image == NULL) {
        return FALSE;
    }
    // 标题文本
    CString strTitle;
    int nSideIdx = (0 <= pDefect->m_DefectInfo.m_nSideIdx && pDefect->m_DefectInfo.m_nSideIdx < MAX_SIDE_COUNT) ? pDefect->m_DefectInfo.m_nSideIdx : MAX_SIDE_COUNT;
    int nCategoryIdx = (0 <= pDefect->m_DefectInfo.m_DefectLoc && pDefect->m_DefectInfo.m_DefectLoc < DefectLoc_None) ? pDefect->m_DefectInfo.m_DefectLoc : DefectLoc_Unknown;
    strTitle.Format(_T("SIDE[%s] CAT[%s] SIZE[%d,%d]"), g_SideName[nSideIdx], g_strDefectType[nCategoryIdx], (int)pDefect->m_dSizeX_um, (int)pDefect->m_dSizeY_um);
    DefectLocation eCategory = pDefect->m_DefectInfo.m_DefectLoc;
    if (eCategory == DefectLoc_Notch_Dimension || eCategory == DefectLoc_Notch_Chamfer) {
        strTitle.Format(_T("SIDE[%s] CAT[%s] SIZE[%d,%d] distance[%d,%d] "), g_SideName[nSideIdx], g_strDefectType[nCategoryIdx], (int)pDefect->m_dSizeX_um, (int)pDefect->m_dSizeY_um, (int)pDefect->m_dChamfer_um, (int)pDefect->m_dChamferOff_um);
    }
    else {
        strTitle.Format(_T("SIDE[%s] CAT[%s] SIZE[%d,%d]"), g_SideName[nSideIdx], g_strDefectType[nCategoryIdx], (int)pDefect->m_dSizeX_um, (int)pDefect->m_dSizeY_um);
    }
    Unlock();
    // 成功标志
@@ -1052,47 +1005,28 @@
    // Save Path
    CString strFilePath;
    // 获取当前时间
    std::time_t m_now = std::time(nullptr);
    // 使用localtime_s代替localtime
    std::tm m_nowTm;
    localtime_s(&m_nowTm, &m_now);
    if (m_nowTm.tm_hour < 4)
    {
        strFilePath.Format(_T("D:\\Data\\%s\\%s\\%d\\%02d\\%02d\\%s_%s_%02d.csv"), m_pHardware->GetMachineName(), m_pHardware->GetLineID()
            , tLoadingTime.GetYear(), tLoadingTime.GetMonth(), tLoadingTime.GetDay()
            , m_pGlassData->GetGlassRecipe()->GetRecipeName(), tLoadingTime.Format(_T("%Y%m%d")),24 );
    if (m_pHardware->m_bSaveResultByHour) {
        // 按小时保存,绑定玻璃 Loading Time
        strFilePath.Format(_T("D:\\Data\\%s\\%s\\%d\\%02d\\%02d\\%s_%s_%02d.csv"),
            m_pHardware->GetMachineName(),
            m_pHardware->GetLineID(),
            tLoadingTime.GetYear(),
            tLoadingTime.GetMonth(),
            tLoadingTime.GetDay(),
            g_pBase->m_strRecipeName,
            g_pBase->m_strLoadingDay,
            tLoadingTime.GetHour());
    }
    else if (m_nowTm.tm_hour > 3 && m_nowTm.tm_hour < 8)
    {
        strFilePath.Format(_T("D:\\Data\\%s\\%s\\%d\\%02d\\%02d\\%s_%s_%02d.csv"), m_pHardware->GetMachineName(), m_pHardware->GetLineID()
            , tLoadingTime.GetYear(), tLoadingTime.GetMonth(), tLoadingTime.GetDay()
            , m_pGlassData->GetGlassRecipe()->GetRecipeName(), tLoadingTime.Format(_T("%Y%m%d")), 4);
    }
    else if (m_nowTm.tm_hour > 7 && m_nowTm.tm_hour < 12)
    {
        strFilePath.Format(_T("D:\\Data\\%s\\%s\\%d\\%02d\\%02d\\%s_%s_%02d.csv"), m_pHardware->GetMachineName(), m_pHardware->GetLineID()
            , tLoadingTime.GetYear(), tLoadingTime.GetMonth(), tLoadingTime.GetDay()
            , m_pGlassData->GetGlassRecipe()->GetRecipeName(), tLoadingTime.Format(_T("%Y%m%d")), 8);
    }
    else if (m_nowTm.tm_hour > 11 && m_nowTm.tm_hour < 16)
    {
        strFilePath.Format(_T("D:\\Data\\%s\\%s\\%d\\%02d\\%02d\\%s_%s_%02d.csv"), m_pHardware->GetMachineName(), m_pHardware->GetLineID()
            , tLoadingTime.GetYear(), tLoadingTime.GetMonth(), tLoadingTime.GetDay()
            , m_pGlassData->GetGlassRecipe()->GetRecipeName(), tLoadingTime.Format(_T("%Y%m%d")), 12);
    }
    else if (m_nowTm.tm_hour > 15 && m_nowTm.tm_hour < 20)
    {
        strFilePath.Format(_T("D:\\Data\\%s\\%s\\%d\\%02d\\%02d\\%s_%s_%02d.csv"), m_pHardware->GetMachineName(), m_pHardware->GetLineID()
            , tLoadingTime.GetYear(), tLoadingTime.GetMonth(), tLoadingTime.GetDay()
            , m_pGlassData->GetGlassRecipe()->GetRecipeName(), tLoadingTime.Format(_T("%Y%m%d")), 16);
    }
    else if (m_nowTm.tm_hour > 19)
    {
        strFilePath.Format(_T("D:\\Data\\%s\\%s\\%d\\%02d\\%02d\\%s_%s_%02d.csv"), m_pHardware->GetMachineName(), m_pHardware->GetLineID()
            , tLoadingTime.GetYear(), tLoadingTime.GetMonth(), tLoadingTime.GetDay()
            , m_pGlassData->GetGlassRecipe()->GetRecipeName(), tLoadingTime.Format(_T("%Y%m%d")), 20);
    else {
        // 按天保存,绑定玻璃 Loading Time
        strFilePath.Format(_T("D:\\Data\\%s\\%s\\%d\\%02d\\%02d\\%s_%s.csv"),
            m_pHardware->GetMachineName(),
            m_pHardware->GetLineID(),
            tLoadingTime.GetYear(),
            tLoadingTime.GetMonth(),
            tLoadingTime.GetDay(),
            g_pBase->m_strRecipeName,
            g_pBase->m_strLoadingDay);
    }
    CheckDirectory(strFilePath);
EdgeInspector_App/Defect.h
@@ -148,6 +148,8 @@
        m_dSizeX_um = 0.0;
        m_dSizeY_um = 0.0;
        m_dChamfer_um = 0.0;
        m_dChamferOff_um = 0.0;
        m_nDefectMergeCount = 0;
        m_bDefectMergeRemoved = FALSE;
@@ -174,6 +176,8 @@
    double            m_dSizeX_um;
    double            m_dSizeY_um;
    double            m_dChamfer_um;
    double            m_dChamferOff_um;
    // Merge
    int                m_nDefectMergeCount;
EdgeInspector_App/EdgeInspector_App.rc
Binary files differ
EdgeInspector_App/Recipe/HardwareSettings.cpp
@@ -1031,6 +1031,9 @@
        m_bUse_SaveDebugImage = rhs.m_bUse_SaveDebugImage;
        // ly,2025.07.10
        m_bSaveResultByHour = rhs.m_bSaveResultByHour;
        // ly,2025.07.07
        m_bEnableAutoCopy = rhs.m_bEnableAutoCopy;
        m_strCopyToolExePath = rhs.m_strCopyToolExePath;
@@ -1262,6 +1265,10 @@
    else if((void *)&m_nSaveImageQuality == pValue)
        str = _T("SAVEIMAGE_QUALITY");
    // ly,2025.07.10
    else if ((void*)&m_bSaveResultByHour == pValue)
        str = _T("SAVE_RESULT_BY_HOUR");
    // ly,2025.07.07
    else if ((void*)&m_bEnableAutoCopy == pValue)
        str = _T("ENABLE_AUTOCOPY");
@@ -1426,7 +1433,13 @@
    BasicInfoFile.GetItemValue((TCHAR*)(LPCTSTR)str,nTemp);
    m_bUse_SaveDebugImage = (BOOL) nTemp;
    // ly.2025.07.07
    // ly,2025.07.10
    str = GetFileString((void*)&m_bSaveResultByHour);
    if (str.IsEmpty() == TRUE)
        return FALSE;
    BasicInfoFile.GetItemValue((TCHAR*)(LPCTSTR)str, m_bSaveResultByHour, FALSE);
    // ly,2025.07.07
    str = GetFileString((void*)&m_bEnableAutoCopy);
    if (str.IsEmpty() == TRUE)
        return FALSE;
@@ -1600,7 +1613,13 @@
    Register.GetItemValue((TCHAR*)(LPCTSTR)str,nTemp);
    m_bUse_SaveDebugImage = (BOOL) nTemp;
    // ly.2025.07.07
    // ly,2025.07.10
    str = GetFileString((void*)&m_bSaveResultByHour);
    if (str.IsEmpty() == TRUE)
        return FALSE;
    Register.GetItemValue((TCHAR*)(LPCTSTR)str, m_bSaveResultByHour, FALSE);
    // ly,2025.07.07
    str = GetFileString((void*)&m_bEnableAutoCopy);
    if (str.IsEmpty() == TRUE)
        return FALSE;
@@ -1757,7 +1776,13 @@
        return FALSE;
    Register.SetItemValue((TCHAR*)(LPCTSTR)str,(int) m_bUse_SaveDebugImage);
    // ly.2025.07.07
    // ly,2025.07.10
    str = GetFileString((void*)&m_bSaveResultByHour);
    if (str.IsEmpty() == TRUE)
        return FALSE;
    Register.SetItemValue((TCHAR*)(LPCTSTR)str, (int)m_bSaveResultByHour);
    // ly,2025.07.07
    str = GetFileString((void*)&m_bEnableAutoCopy);
    if (str.IsEmpty() == TRUE)
        return FALSE;
@@ -1923,7 +1948,13 @@
        return FALSE;
    BasicInfoFile.SetItemValue((TCHAR*)(LPCTSTR)str,m_bUse_SaveDebugImage);
    // ly.2025.07.07
    // ly,2025.07.10
    str = GetFileString((void*)&m_bSaveResultByHour);
    if (str.IsEmpty() == TRUE)
        return FALSE;
    BasicInfoFile.SetItemValue((TCHAR*)(LPCTSTR)str, (int)m_bSaveResultByHour);
    // ly,2025.07.07
    str = GetFileString((void*)&m_bEnableAutoCopy);
    if (str.IsEmpty() == TRUE)
        return FALSE;
EdgeInspector_App/Recipe/HardwareSettings.h
@@ -204,6 +204,9 @@
    BOOL                        m_bUse_SaveDebugImage;
public:
    BOOL                        m_bSaveResultByHour;
public:
    BOOL                        m_bEnableAutoCopy;
    CString                        m_strCopyToolExePath;
    CString                        m_strCopyToolConfigPath;
EdgeInspector_App/View/ViewMain_HWSetting.cpp
@@ -83,6 +83,8 @@
    DDX_Check(pDX,IDC_CHECK_USE_SAVE_DEBUG_IMAGE,m_pDlgHDSettingParm->m_bUse_SaveDebugImage);    
    DDX_Check(pDX, IDC_CHECK_USE_SAVE_ALL_DMP, g_bUse_SaveAllDMP);
    DDX_Check(pDX, IDC_CHECK_SAVE_RESULT_BY_HOUR, m_pDlgHDSettingParm->m_bSaveResultByHour);        // ly,2025.07.10
    DDX_Check(pDX, IDC_CHECK_ENABLE_AUTO_COPY, m_pDlgHDSettingParm->m_bEnableAutoCopy);                // ly,2025.07.07
    DDX_Text(pDX, IDC_EDIT_COPY_TOOL_EXE_PATH, m_pDlgHDSettingParm->m_strCopyToolExePath);
    DDX_Text(pDX, IDC_EDIT_COPY_TOOL_CONFIG_PATH, m_pDlgHDSettingParm->m_strCopyToolConfigPath);
EdgeInspector_App/resource.h
Binary files differ