SDC C-Project CF Review 프로그램
LYW
2021-09-14 ffe71aadfdcb4a9ea2ac4d8d320983d42ef3cad5
ReviewHistory/ReveiwHistory/GlassRawCPJT.cpp
»õ ÆÄÀÏ
@@ -0,0 +1,2279 @@
#include "StdAfx.h"
#include "GlassRawCPJT.h"
#include "akLoggerExt.h"
#include "MacroResultFile.h"
#include "akCore/akFileUtil.h"
#include "akGridData.h"
//#include "AOIDefinitionType.h"
//#include "AOIDefinition.h"
#define LOCAL_INDEX_PATH         "D:\\DIT_ResultData\\Index\\"
#define LOCAL_REV_IMAGE_PATH      "D:\\ResultData\\UploadImage\\"
#define LOCAL_AOI_IMAGE_PATH      "D:\\Image\\Defect\\"
#define LOCAL_MURA_IMAGE_PATH      "D:\\DIT_ResultData\\Mura\\IMG\\"
#define LOCAL_DEEP_PATH            "D:\\DIT_ResultData\\Deeplearning\\"
#define LOCAL_RTMS_INFO_PATH      "D:\\RTMS_TEMP\\"
#define LOCAL_RAWPATH_INFO_INI_PATH   "D:\\ResultData\\"
#define RAWINFO_FILE_NAME         "RESULT_INFO.ini"
#define LOCAL_AOIRAWDFS_PATH      "D:\\DIT_ResultData\\Raw"
#define LOCAL_AOIRAWBIN_PATH      "D:\\DIT_ResultData\\RawBin"
#define NETWORK_AOIRAWDFS_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\Raw"
#define NETWORK_AOIRAWBIN_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\RawBin"
#define NETWORK_AOIRAWFILE_SUB_PATH "\\\\126.100.100.1\\d\\Raw_im\\"
#define NETWORK_AOI_IMAGE_PATH      "\\\\126.100.100.1\\d\\Image\\Defect\\"
//0404NWH
#define NETWORK_MURARAW_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\Mura\\RAW" //0405nwh
#define NETWORK_MURA_IMAGE_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\Mura\\IMG" //0405nwh
char* g_pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
void _TimeDelay(int delay)
{
   MSG      msg;
   BOOL   fRst = FALSE;
   clock_t lBlockTime = delay + clock();
   while (lBlockTime > clock())
   {
      fRst = (BOOL)PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
      if (fRst)
      {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
      }
      Sleep(10);
   }
}
CGlassRawCPJT::CGlassRawCPJT(void)
{
   CreateDirectory("D:\\RTMS_Signal", NULL);
   CreateDirectory(LOCAL_AOIRAWDFS_PATH, NULL);
   CreateDirectory(LOCAL_AOIRAWBIN_PATH, NULL);
   CreateDirectory("D:\\Raw_im", NULL);
   m_MuraResultFile.readOptionFile("C:\\DIT_Review\\ReviewServerConfig\\MacroInfo.cfg");
   m_GlassRawRTMS.SetMuraResult(&m_MuraResultFile);
   m_nWriteRawDefectIdx = 1;
   m_bReviewEndCheck = FALSE;
}
CGlassRawCPJT::~CGlassRawCPJT(void)
{
}
BOOL CGlassRawCPJT::SequenceGlassLoading( CgrmGlassRawData* pData )
{
   //스택기능
   if(m_StackResult.getStackUse())
   {
      //201218 CJH - Stack Download ì‹œë„
      SendMessageFTPDownloadStack(pData->GetGlassData());
      m_StackResult.StackFileReadStart(pData->GetGlassData()->m_strGlassID);
   }
   return TRUE;
}
BOOL CGlassRawCPJT::SequenceInspectEnd( CgrmGlassRawData* pData )
{
   m_bReviewEndCheck = FALSE;
   //210128
   m_tmReviewEnd = m_tmReviewStart = CTime::GetCurrentTime();
   pData->GetGlassData()->m_tmReviewEnd = m_tmReviewEnd;      // Insp End ì‹œ Raw ì—…로드로, E_TIME, LD_TIME ìž…ë ¥ [ 21-03-18 KJG ]
   m_tmFileCreateTime = CTime::GetCurrentTime();
   //여기에서 ë¼ì¸ë³„로 íŒŒì¼ëª…, í˜¹ì€ Path ìœ„치 ê²°ì •하면됨. AOIServer í˜¹ì€ ReviewServer에서 ì•ˆí•´ë„됨 [김태현2019/9/4]
   pData->GetGlassData()->m_strFileName;
   {
      _grmGlassData* pGlassData = pData->GetGlassData();
      CTime CurrTime = pGlassData->m_tmGlassLoading;
      CString strTime=_T(""), strFileName=_T("");
      strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
         CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
      strFileName.Format("%s_%s_%s.bin", pGlassData->m_strGlassID, pGlassData->m_strStepID, strTime.GetBuffer(0));
      strcpy(pData->GetGlassData()->m_strFileName, strFileName.GetBuffer(0));
   }
   strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
   if(!WriteBinFile(pData))
      return FALSE;
   if (1) ReadMuraFile(pData);
   if (WriteAOIFile(pData) == FALSE)
      return FALSE;
   // [C-PRJ] Image Upload Define - KHT (2020/11/19)
   _TimeDelay(5000); // ì´ë¯¸ì§€ ë³µì‚¬ ì‹œê°„ ëŒ€ê¸°
   //210218 CJH - ê²€ì‚¬ ì¢…료시 ê²°ê³¼íŒŒì¼ ë° CCD Image ì—…로드
   SendMessageFTPUploadRaw(pData->GetGlassData());
   SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_AOI_IMAGE);
   SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);//0405nwh
   return TRUE;
}
BOOL CGlassRawCPJT::SequenceReviewStart( CgrmGlassRawData* pData )
{
   //210128
   m_tmReviewStart = m_tmReviewEnd = CTime::GetCurrentTime();
   //여기에서 ë¼ì¸ë³„로 íŒŒì¼ëª…, í˜¹ì€ Path ìœ„치 ê²°ì •하면됨. AOIServer í˜¹ì€ ReviewServer에서 ì•ˆí•´ë„됨 [김태현2019/9/4]
   pData->GetGlassData()->m_strFileName;
   strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWBIN_PATH);
   //strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
   CString strFindFile;
   int nCloseTime = 600*100000;//sec
   int nReTryTime = 30;
   {
      CTime tmReviewLoading = CTime::GetCurrentTime();
      CString strWild;
      strWild.Format("%s\\%s_%s_*.bin", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strGlassID,pData->GetGlassData()->m_strStepID);
      CakFileUtil akFileFinder;
      while(nReTryTime--)
      {
         akFileFinder.FindFile(strWild.GetBuffer(0), FALSE);
         VECFINDDATA* pFindData = akFileFinder.getFindData();
         int nFileNamePos = strlen(akFileFinder.getProcessPath());
         std::map<LONGLONG, CString> mapSpanFileName;
         for(int i=0; i<pFindData->size(); i++)
         {
            char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
            {
               CakParser parser;
               parser.process(pFileName, "_.");
               if(parser.getTokNum() < 4) continue;
               int nDataTime[8]={};
               {
                  int nTokIndex=0;
                  const char* pGlassId = parser.getTokStr(nTokIndex++);
                  const char* pStepId = parser.getTokStr(nTokIndex++);
                  char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
                  char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
                  nDataTime[0] = (pDate[0]-'0')*1000 + (pDate[1]-'0')*100 + (pDate[2]-'0')*10+ (pDate[3]-'0')*1;
                  nDataTime[1] = (pDate[4]-'0')*10+ (pDate[5]-'0')*1;
                  nDataTime[2] = (pDate[6]-'0')*10+ (pDate[7]-'0')*1;
                  nDataTime[3] = (pTime[0]-'0')*10+ (pTime[1]-'0')*1;
                  nDataTime[4] = (pTime[2]-'0')*10+ (pTime[3]-'0')*1;
                  nDataTime[5] = (pTime[4]-'0')*10+ (pTime[5]-'0')*1;
               }
               CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5] );
               CTimeSpan tmSpan = tmReviewLoading-tmTemp;
               mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
            }
         }
         if(mapSpanFileName.empty() == FALSE)
         {
            if(mapSpanFileName.begin()->first < nCloseTime)
            {
               //가장 ìµœê·¼ ê²°ê³¼íŒŒì¼ ì°¾ê¸° ì„±ê³µ [김태현 2019/7/17]
               strFindFile = mapSpanFileName.begin()->second;
               break;
            }
         }
         akFileFinder.clear();
         Sleep(100);
      }
   }
   if(strFindFile.IsEmpty()) return FALSE;
   strcpy(pData->GetGlassData()->m_strFileName, strFindFile.GetBuffer(0));
   if(!ReadBinFile(pData))
      return FALSE;
   strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
   pData->GetGlassData()->m_tmReviewLoading = m_tmReviewStart;
   return TRUE;
}
BOOL CGlassRawCPJT::SequenceReviewEnd( CgrmGlassRawData* pData )
{
   m_bReviewEndCheck = TRUE;
   m_tmReviewEnd = m_tmReviewStart = CTime::GetCurrentTime();
   m_tmFileCreateTime = CTime::GetCurrentTime();
   pData->GetGlassData()->m_tmReviewEnd = m_tmReviewEnd;
   //여기에서 ë¼ì¸ë³„로 íŒŒì¼ëª…, í˜¹ì€ Path ìœ„치 ê²°ì •하면됨. AOIServer í˜¹ì€ ReviewServer에서 ì•ˆí•´ë„됨 [김태현2019/9/4]
   pData->GetGlassData()->m_strFileName;
   strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWDFS_PATH);
   if(1) ReadMuraFile(pData);
     if(WriteAOIFile(pData) == FALSE)
        return FALSE;
   //210126 CJH - Review End에서만 RTMS ê²°ê³¼íŒŒì¼ ìƒì„±í•˜ë„록 ë³€ê²½
   if (m_GlassRawRTMS.WriteAOIFile(pData) == FALSE)
      return FALSE;
   if(1)
   {
      _grmGlassData* pGlassData = pData->GetGlassData();
      SendMessageFTPUploadRaw(pGlassData);
      SendMessageFTPUploadImage(pGlassData, FTPCMD_AOI_IMAGE);
      SendMessageFTPUploadImage(pGlassData, FTPCMD_REVIEW_IMAGE);
      SendMessageFTPUploadImage(pGlassData, FTPCMD_MURA_IMAGE);//0405nwh
   }
   return TRUE;
}
BOOL CGlassRawCPJT::SequenceFtpUpload(char* pRawFilePathName)
{
   // Manual Upload ê¸°ëŠ¥ [21-02-05 KJG]
   CTime tmFileCreate;
   _grmGlassData GlassData;
   _grmGlassData* pGlassData = &GlassData;
   //정보 ì–»ì–´ì˜¤ê¸° [김태현 2019/1/25]
   char* pFileName = CakFileUtil::getFileName(pRawFilePathName);
   char* pext = CakFileUtil::getFileExt(pRawFilePathName);
   if (!strcmp(pext, "") == FALSE) return FALSE; // í™•장자가 ì—†ìŒ
   CakParser parser;
   FILE* pf = fopen(pRawFilePathName, "r");
   if (pf)
   {
      CString strParse, strLDTime;
      char buffer[512];
      fgets(buffer, 512, pf);
      fgets(buffer, 512, pf);
      fgets(buffer, 512, pf);
      fgets(buffer, 512, pf);
      parser.process(buffer, " ");
      if (parser.getTokNum() < 20) return FALSE;
      strParse = parser.getTokStr(0);
      if (strParse != "DATA") return FALSE;
      strParse = parser.getTokStr(1);
      if (strParse != "PANEL") return FALSE;
      strcpy(pGlassData->m_strProcessID, "");
      strcpy(pGlassData->m_strProductID, "");
      strcpy(pGlassData->m_strLotID, "");
      strcpy(pGlassData->m_strStepID, "");
      strcpy(pGlassData->m_strGlassID, "");
      strcpy(pGlassData->m_strProcessID, parser.getTokStr(4));
      strcpy(pGlassData->m_strProductID, parser.getTokStr(5));
      strcpy(pGlassData->m_strLotID, parser.getTokStr(5));         // C-PJT - m_strLotID = m_strProductID
      strcpy(pGlassData->m_strStepID, parser.getTokStr(6));
      strcpy(pGlassData->m_strGlassID, parser.getTokStr(9));
      strLDTime = parser.getTokStr(19);
      if (pGlassData->m_strProcessID == "" || pGlassData->m_strProductID == "" || pGlassData->m_strLotID == "" || pGlassData->m_strStepID == "" || pGlassData->m_strGlassID == "")
      {
         AKLOG("Manual Upload Fail : Parsing Data is Empty");
         return FALSE;
      }
      int nYear = _ttoi(strLDTime.Left(4));
      int nMon = _ttoi(strLDTime.Mid(4, 2));
      int nDay = _ttoi(strLDTime.Mid(6, 2));
      int nHour = _ttoi(strLDTime.Mid(8, 2));
      int nMin = _ttoi(strLDTime.Mid(10, 2));
      int nSec = _ttoi(strLDTime.Mid(12, 2));
      pGlassData->m_tmGlassLoading = CTime(nYear, nMon, nDay, nHour, nMin, nSec);
      m_tmFileCreateTime = CTime::GetCurrentTime();
      strcpy(pGlassData->m_strPath, NETWORK_AOIRAWDFS_PATH);
      SendMessageFTPUploadRaw(pGlassData);
      SendMessageFTPUploadImage(pGlassData, FTPCMD_AOI_IMAGE);
      SendMessageFTPUploadImage(pGlassData, FTPCMD_REVIEW_IMAGE);
      AKLOG("Manual Success : %s File Send FTPUploader Command", pRawFilePathName);
   }
   else
   {
      AKLOG("Manual Upload Fail : Can't Open File");
      return FALSE;
   }
   fclose(pf);
   return TRUE;
}
BOOL CGlassRawCPJT::WriteAOIFile( CgrmGlassRawData* pData )
{
   BOOL bResult = TRUE;
   bResult &= MakeAOIFile(pData);
   m_GlassRawAna.MakeAnaFile(pData);
   //m_GlassRawRTMS.WriteAOIFile(pData);
   AKLOG("WriteAOIFile Complete");
   return bResult;
}
BOOL CGlassRawCPJT::MakeAOIFile( CgrmGlassRawData* pData )
{
   AKLOG("MakeAOIFile Start");
   m_nWriteRawDefectIdx = 1;
   _grmGlassData* pGlass = pData->GetGlassData();
   CString strFilePathName;
   CString strFileName;//파일생성 ì‹œê°„ ë•Œë¬¸ì— ì—¬ê¸°ì„œ ì •확하게 íŒŒì¼ëª… ë‹¤ì‹œ ì •ì •
   {
      //Glass ì •ë³´
      CTime CurrTime = m_tmReviewEnd;
      CString strTime;
      strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
         CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
      strFileName.Format("%s", pGlass->m_strGlassID); // ì‹ ê¸°ëŒ€ í”„로 ìš”ì²­ í™•장자 ì‚­ì œ
   }
   strFilePathName.Format("%s\\%s", pGlass->m_strPath, strFileName);//pGlass->m_strFileName);
   //strFilePathName.Format("C:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
   // ê¸€ë¼ìФ ID만 ì¡´ìž¬í•˜ì—¬ ìž¬ê²€ì‚¬ ì‹œ íŒŒì¼ ìƒì„± ì‹¤íŒ¨. ì‚­ì œí•œë‹¤
   DeleteFile(strFilePathName);
   //FILE* pf = fopen(strFilePathName.GetBuffer(0), "w");
   FILE* pf = fopen(strFilePathName.GetBuffer(0), "w");
   if(pf == NULL)
   {
      AKLOG("MakeAOIFile Fail : [%s]", strFilePathName.GetBuffer(0));
      return FALSE;
   }
   CString strBuffer;
   CString strLine;
   //////////////////////////////////////////////////////////////////////////
   //HEDER ITEM
   {
      makeDataHeader(strLine, pGlass);
      fprintf(pf, "%s\n", strLine.GetBuffer(0));
   }
   //////////////////////////////////////////////////////////////////////////
   //GLASSDATA
   {
      makeDataGlass(strLine, pGlass);
      fprintf(pf, "%s\n", strLine.GetBuffer(0));
   }
   //////////////////////////////////////////////////////////////////////////
   //CELL & DEFECT DATA
   {
      //make
      {
         for (int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++)
         {
            _grmCellData* pCell = pData->GetCellData(iCell);
            makeDataCell(strLine, pData, pCell);
            fprintf(pf, "%s\n", strLine);
            for (int iDefect = 0; iDefect < pData->GetGlassData()->m_nDefectNum; iDefect++)
            {
               _grmDefectData* pDefect = pData->GetDefectData(iDefect);
               if (pDefect->m_nCellIdx != iCell) continue;
               //210203 CJH - CutOff ëŒ€ìƒ ê²°ê³¼íŒŒì¼ ìž‘성 ì œì™¸
               if (pDefect->m_bDefectCutoff == TRUE) continue;
               if (makeDataDefect(strLine, pData, pDefect))
               {
                  fprintf(pf, "%s\n", strLine);
               }
            }
         }
      }
   }
   AKLOG("MakeAOIFile Complete : [%s]", strFilePathName.GetBuffer(0));
   fclose(pf);
   return TRUE;
}
void CGlassRawCPJT::makeDataHeader( CString& strLine, _grmGlassData* pGlassData )
{
   strLine.Empty();
   CString strValue;
   strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR TB TW RB RW T_STACK MAX_AVG_GRAY MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT BR_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT"; //53ea
   strLine += strValue; strLine += "\n";
   strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT PRO_IMAGE AVG_GRAY_0 PORTION_0 CORNER_GRAY_0 AVG_AMP_0 FFT_VAR_0 FFT_VAH_0 FFT_VAQ_0 FFT_PK_0 AVG_GRAY_1 PORTION_1 CORNER_GRAY_1 AVG_AMP_1 FFT_VAR_1 FFT_VAH_1 FFT_VAQ_1 FFT_PK_1 AVG_GRAY_2 PORTION_2 CORNER_GRAY_2 AVG_AMP_2 FFT_VAR_2 FFT_VAH_2 FFT_VAQ_2 FFT_PK_2 AVG_GRAY_3 PORTION_3 CORNER_GRAY_3 AVG_AMP_3 FFT_VAR_3 FFT_VAH_3 FFT_VAQ_3 FFT_PK_3"; //54ea 21-06-21 Mura Data ì¶”ê°€
   strLine += strValue; strLine += "\n";
   //210405
   //ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE DSC_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG SCAN_AI REVIEW_AI INS_MODE INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK
   strValue = "ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE DSC_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG R_HEIGHT G_HEIGHT B_HEIGHT INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK CLASS_CODE"; //50ea
   strLine += strValue;
}
#define SPRINTRAWSTART char strItemValue[1024];int nItemValueLen, nItemValuePos = 0;memset(strItemValue, ' ', sizeof(char)*1024)
#define SPRINTRAW(ITEMSIZE, fmt, ...) nItemValueLen = sprintf(strItemValue+nItemValuePos, fmt,##__VA_ARGS__); strItemValue[nItemValuePos+ nItemValueLen] = ' ';nItemValuePos+=ITEMSIZE+1
#define SPRINTRAWEND strItemValue[nItemValuePos - 1] = 0; strLine = strItemValue
void CGlassRawCPJT::makeDataGlass( CString& strLine, _grmGlassData* pGlassData )
{
   SPRINTRAWSTART;
   CString strValue;
   /* PANEL ITEM
   01   4   ITEM         // ITEM Separator
   02   5   PANEL         // PANEL Separator
   03   5   MODULETYPE      // Module Type
   04   27  MODULEID      // Module ID
   05   20  PROCESSID      // ProcessID
   06   20  PRODUCTID      // ProductID
   07   10  STEPID         // StepID
   08   2   PROD_TYPE      // Prod Type
   09   12  BATCHID      // Batch ID
   10   12  H_PANELID      // Host Panel ID
   11   12  E_PANELID      // Panel ID Reading by VCR
   12   12  P_PANELID      // Pair Panel ID
   13   16  OPERID         // Perator ID or Module ID
   14   3   COMP_COUNT      // Cell Count
   15   16  PPID         // PPID (Recipe Name)
   16   4   GRADE         // Grade (Judgement)
   17   4   CODE         // Grade Code (Judgement Code)
   18   4   R_GRADE      // Grade by Operator (Re-Judgement)
   19   16  MAP_IMAGE      // Map Image File Name
   20   14  L_TIME         // Cassette or Conveyor에서 OUT된 ì‹œê°„
   21   14  U_TIME         // Cassette or Conveyor에서 IN된 ì‹œê°„
   22   14  S_TIME         // Stage에서 ê²€ì‚¬/계측 ì‹œìž‘된 ì‹œê°
   23   14  E_TIME         // Stage에서 ê²€ì‚¬/계측 ì¢…료된 ì‹œê°
   24   12   T_DEFECT      // Common Item 1 - Total Defect Count
   25   12   TR         // Panel ì •ë³´ 02
   26   12   PR         // Panel ì •ë³´ 03
   27   12   TB         // Panel ì •ë³´ 04
   28   12   TW         // Panel ì •ë³´ 05
   29   12   RB         // Panel ì •ë³´ 06
   30   12   RW         // Panel ì •ë³´ 07
   31   12   T_STACK         // SD+SP ìˆ˜
   32   12   BMDF          // Panel ì •ë³´ 09 -> ë³€ê²½ MAX_AVG_GRAY 04/12
   33   12   CJ         // Panel ì •ë³´ 10 -> ë³€ê²½ MAX_PORTION 04/12
   34   12   OK_CELL      // OK Cell Count
   35   12   RJ_CELL      // RJ Cell Count
   36   12   RW_CELL      // RW Cell Count
   37   12   NR_CELL      // NR Cell Count
   38   12   MASK_CELL      // MASK Cell Count - CST ID
   39   12   A_CELL         // ì´ìƒ Cell Count - SLOT NO
   40   12   P_CELL         // Pattern Shift Cell Count - JOB END
   41   12   TD_DEFECT      // Total Defect Count -> TD Defect Count
   42   12   SD_DEFECT      // SD Defect Count
   43   12   PD_DEFECT      // PD Defect Count
   44   12   SP_DEFECT      // SP Defect Count
   45   12   PAD_GATE      // PAD Gate ë¶ˆëŸ‰ ìˆ˜
   46   12   PAD_DATA      // PAD Data ë¶ˆëŸ‰ ìˆ˜
   47   12   M_DEFECT      // MASK ë¶ˆëŸ‰ ìˆ˜
   48   12   C_DEFECT      // COMMON ë¶ˆëŸ‰
   49   12   BR_DEFECT      // SCRATCH ë¶ˆëŸ‰ ìˆ˜
   50   12   CRACK         // Crack ë¶ˆëŸ‰ ìˆ˜ - Image ì´¬ìƒ ê°¯ìˆ˜
   51   12   P_SHIFT         // Pattern Shift ë¶ˆëŸ‰ ìˆ˜ - ë ˆì‹œí”¼ ì´ë¦„
   */
   //////////////////////////////////////////////////////////////////////////
   // [김태현2020/9/15]
   // SPRINTRAW(데이터 í¬ê¸°, "VALUE");
   // 01   4   ITEM         // ITEM Separator
   SPRINTRAW(4, "DATA");
   // 02   5   PANEL      // PANEL Separator
   SPRINTRAW(5, "PANEL");
   // 03   5   MODULETYPE   // Module Type
   /*SPRINTRAW(5, "*");*/
   if (strlen(pGlassData->m_strEquipID) == 0)
   {
      SPRINTRAW(5, "*");
   }
   else
   {
      CString temp = pGlassData->m_strEquipID;
      SPRINTRAW(5, "%s", temp.Left(5));
   }
   // 04   27  MODULEID      // Module ID
   if (strlen(pGlassData->m_strOperID) == 0)
   {
      SPRINTRAW(27, "*");
   }
   else
   {
      SPRINTRAW(27, "%s", pGlassData->m_strOperID);
   }
   // 05   20  PROCESSID   // ProcessID
   if (strlen(pGlassData->m_strProcessID) == 0)
   {
      SPRINTRAW(20, "*");
   }
   else
   {
      SPRINTRAW(20, "%s", pGlassData->m_strProcessID);
   }
   // 06   20  PRODUCTID   // ProductID
   if (strlen(pGlassData->m_strProductID) == 0)
   {
      SPRINTRAW(20, "*");
   }
   else
   {
      SPRINTRAW(20, "%s", pGlassData->m_strProductID);
   }
   // 07   10  STEPID      // StepID
   if (strlen(pGlassData->m_strStepID) == 0)
   {
      SPRINTRAW(10, "*");
   }
   else
   {
      SPRINTRAW(10, "%s", pGlassData->m_strStepID);
   }
   // 08   2   PROD_TYPE   // Prod Type
   if (strlen(pGlassData->m_strProdType) == 0)
   {
      SPRINTRAW(2, "*");
   }
   else
   {
      SPRINTRAW(2, "%s", pGlassData->m_strProdType);
   }
   // 09   12  BATCHID      // Batch ID    - Glass ID ì•ž 6자리
   strValue = pGlassData->m_strGlassID;
   SPRINTRAW(12, "%s", strValue.Left(6));
   // 10   12  H_PANELID   // Host Panel ID
   if (strlen(pGlassData->m_strGlassID) == 0)
   {
      SPRINTRAW(12, "*");
   }
   else
   {
      SPRINTRAW(12, "%s", pGlassData->m_strGlassID);
   }
   // 11   12  E_PANELID   // Panel ID Reading by VCR
   if (strlen(pGlassData->m_strEPPID) == 0)
   {
      SPRINTRAW(12, "*");
   }
   else
   {
      SPRINTRAW(12, "%s", pGlassData->m_strEPPID);
   }
   // 12   12  P_PANELID   // Pair Panel ID
   if (strlen(pGlassData->m_strPairHPanelID) == 0)
   {
      SPRINTRAW(12, "*");
   }
   else
   {
      SPRINTRAW(12, "%s", pGlassData->m_strPairHPanelID);
   }
   // 13   16  OPERID      // Perator ID or Module ID
   if (strlen(pGlassData->m_strOperID) == 0)
   {
      SPRINTRAW(16, "*");
   }
   else
   {
      SPRINTRAW(16, "%s", pGlassData->m_strOperID);
   }
   // 14   3   COMP_COUNT   // Cell Count
   SPRINTRAW(3, "%d", pGlassData->m_nCellNum);
   // 15   16  PPID         // PPID (Recipe Name)
   if (strlen(pGlassData->m_strPPID) == 0)
   {
      SPRINTRAW(16, "*");
   }
   else
   {
      SPRINTRAW(16, "%s", pGlassData->m_strPPID);
   }
   // 16   4   GRADE      // Grade (Judgement)
   if (strlen(pGlassData->m_strGlassJudge) == 0)
   {
      SPRINTRAW(4, "*");
   }
   else
   {
      SPRINTRAW(4, "%s", pGlassData->m_strGlassJudge);
   }
   // 17   4   CODE         // Grade Code (Judgement Code)
   if (strlen(pGlassData->m_strGlassCode) == 0)
   {
      SPRINTRAW(4, "*");
   }
   else
   {
      SPRINTRAW(4, "%s", pGlassData->m_strGlassCode);
   }
   // 18   4   R_GRADE      // Grade by Operator (Re-Judgement)
   SPRINTRAW(4, "*");
   // 19   16  MAP_IMAGE   // Map Image File Name
//   if (strlen(pGlassData->m_strFileName) == 0)
//   {
//      SPRINTRAW(16, "*");
//   }
//   else
//   {
//      SPRINTRAW(16, "%s", pGlassData->m_strFileName);
//   }
   SPRINTRAW(16, "map01.jpg"); //Defect Map ìžë¦¿ìˆ˜ê°€ 20자리가 ë„˜ëŠ”ë‹¤..
   // 20   14  L_TIME      // Cassette or Conveyor에서 OUT된 ì‹œê°„
   strValue.Format("%04d%02d%02d%02d%02d%02d"         // START_TIME
      , pGlassData->m_tmGlassLoading.GetYear()
      , pGlassData->m_tmGlassLoading.GetMonth()
      , pGlassData->m_tmGlassLoading.GetDay()
      , pGlassData->m_tmGlassLoading.GetHour()
      , pGlassData->m_tmGlassLoading.GetMinute()
      , pGlassData->m_tmGlassLoading.GetSecond());
   SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
   // 21   14  U_TIME      // Cassette or Conveyor에서 IN된 ì‹œê°„
   strValue.Format("%04d%02d%02d%02d%02d%02d"         // E_TIME
      , pGlassData->m_tmReviewEnd.GetYear()
      , pGlassData->m_tmReviewEnd.GetMonth()
      , pGlassData->m_tmReviewEnd.GetDay()
      , pGlassData->m_tmReviewEnd.GetHour()
      , pGlassData->m_tmReviewEnd.GetMinute()
      , pGlassData->m_tmReviewEnd.GetSecond());
   SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
   // 22   14  S_TIME      // Stage에서 ê²€ì‚¬/계측 ì‹œìž‘된 ì‹œê°
   strValue.Format("%04d%02d%02d%02d%02d%02d"         // START_TIME
      , pGlassData->m_tmInspectionStart.GetYear()
      , pGlassData->m_tmInspectionStart.GetMonth()
      , pGlassData->m_tmInspectionStart.GetDay()
      , pGlassData->m_tmInspectionStart.GetHour()
      , pGlassData->m_tmInspectionStart.GetMinute()
      , pGlassData->m_tmInspectionStart.GetSecond());
   SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
   // 23   14  E_TIME      // Stage에서 ê²€ì‚¬/계측 ì¢…료된 ì‹œê°
   strValue.Format("%04d%02d%02d%02d%02d%02d"         // E_TIME
      , pGlassData->m_tmReviewEnd.GetYear()
      , pGlassData->m_tmReviewEnd.GetMonth()
      , pGlassData->m_tmReviewEnd.GetDay()
      , pGlassData->m_tmReviewEnd.GetHour()
      , pGlassData->m_tmReviewEnd.GetMinute()
      , pGlassData->m_tmReviewEnd.GetSecond());
   SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
   // 24   6   T_DEFECT      // Common Item 1 - Total Defect Count
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNum - pGlassData->m_nCutOffDefectNum); //210203 CJH - Cutoff ê²°í•¨ì€ ì „체개수에서 ì œì™¸í•´ì¤€ë‹¤.
   // 25   6   TR      // Panel ì •ë³´ 02
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeTR);
   // 26   6   PR      // Panel ì •ë³´ 03
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgePR);
   // 27   6   TB      // Panel ì •ë³´ 04
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeTB);
   // 28   6   TW      // Panel ì •ë³´ 05
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeTW);
   // 29   6   RB      // Panel ì •ë³´ 06
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeRB);
   // 30   6   RW      // Panel ì •ë³´ 07
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeRW);
   // 31   6   T_STACK      // Panel ì •ë³´ 08   SD+SP ìˆ˜ ìž…ë ¥
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackSD + pGlassData->m_nDefectNumStackSP);
   //32   6   BMDF       // Panel ì •ë³´ 09 -> ë³€ê²½ MAX_AVG_GRAY 04/12 nwh
   if (strlen(pGlassData->m_strMaxAvgGray) == 0)
   {
      SPRINTRAW(12, "*");
   }
   else
   {
      SPRINTRAW(12, "%s", pGlassData->m_strMaxAvgGray);
   }
   // 33   6   CJ         // Panel ì •ë³´ 10 -> ë³€ê²½ MAX_PORTION  04/12 nwh
   if (strlen(pGlassData->m_strMaxPortion) == 0)
   {
      SPRINTRAW(12, "*");
   }
   else
   {
      SPRINTRAW(12, "%s", pGlassData->m_strMaxPortion);
   }
   // 34   6   OK_CELL      // OK Cell Count
   SPRINTRAW(12, "*");
   // 35   6   RJ_CELL      // RJ Cell Count
   SPRINTRAW(12, "*");
   // 36   6   RW_CELL      // RW Cell Count
   SPRINTRAW(12, "*");
   // 37   6   NR_CELL      // NR Cell Count
   SPRINTRAW(12, "*");
   // 38   6   MASK_CELL      // MASK Cell Count   //201215 CJH - CSTID로 ë³€ê²½
   if (strlen(pGlassData->m_strCSTID) == 0)
   {
      SPRINTRAW(12, "*");
   }
   else
   {
      SPRINTRAW(12, "%s", pGlassData->m_strCSTID);
   }
   SPRINTRAW(12, "%d", pGlassData->m_nSlot_No);    // SLot_No ì¶”ê°€ [ 21-03-18 KJG ]
   SPRINTRAW(12, "%d", pGlassData->m_bJob_end);    // Job_end ì¶”ê°€ [ 21-03-18 KJG ]
   // 41   6   TD_DEFECT      // TD Defect Count   -> í˜„공정에서 ë‚˜ì˜¨ ëª¨ë“  ê²°í•¨ : Total - SD
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackTD);
   // 42   6   SD_DEFECT      // SD Defect Count  -> TD ê²°í•¨ì—ì„œ Stack ê²°í•¨ì„ ì œì™¸í•œ ê²°í•¨(우리 ì„¤ë¹„에서 ì²« ë°œê²¬ëœ ê²°í•¨)
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackSD);
   // 43   6   PD_DEFECT      // PD Defect Count   -> í˜„재 ê³µì •에서 ê²€ì¶œëœ íŠ¹ì • Partial ê²°í•¨(사양서 ìƒì—ëŠ” Zone이라 ë˜ì–´ìžˆìœ¼ë‚˜ ì‹¤ì§ˆì ìœ¼ë¡œëŠ” Classfication에 í†µê³¼ëœ ê²°í•¨)
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackPD);
   // 44   6   SP_DEFECT      // SP Defect Count   -> í˜„재 ê³µì •에서 ê²€ì¶œëœ íŠ¹ì • Partial ê²°í•¨ ì¤‘, ì´ì „ ê³µì •의 Partial ê²°í•¨ì„ ì œì™¸í•œ ê²°í•¨
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackSP);
   // 45   6   PAD_GATE      // PAD Gate ë¶ˆëŸ‰ ìˆ˜
   SPRINTRAW(12, "*");
   // 46   6   PAD_DATA      // PAD Data ë¶ˆëŸ‰ ìˆ˜
   SPRINTRAW(12, "*");
   // 47   6   M_DEFECT      // MASK ë¶ˆëŸ‰ ìˆ˜
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeMD);
   // 48   6   C_DEFECT      // COMMON ë¶ˆëŸ‰
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeCD);
   // 49   6   S_DEFECT      // SCRATCH ë¶ˆëŸ‰ ìˆ˜
   SPRINTRAW(12, "*");
   // 50   6   CRACK      // Crack ë¶ˆëŸ‰ ìˆ˜   //201217 CJH - Image ì´¬ìƒ ê°œìˆ˜ë¡œ ë³€ê²½
   //SPRINTRAW(12, "%d", pGlassData->m_nDefectNumLocCrack);
   SPRINTRAW(12, "%d", pGlassData->m_nReviewNum);
   // 51 6   P_SHIFT      // Pattern Shift ë¶ˆëŸ‰ ìˆ˜   //201217 CJH - Recipe로 ë³€ê²½
   if (strlen(pGlassData->m_strRecipeName) == 0)
   {
      SPRINTRAW(16, "*");
   }
   else if(strlen(pGlassData->m_strRecipeName) <= 16)
   {
      SPRINTRAW(16, "%s", pGlassData->m_strRecipeName);
   }
   else if (strlen(pGlassData->m_strRecipeName) > 16)
   {
      CString temp = pGlassData->m_strRecipeName;  // ë ˆì‹œí”¼ 17자리 ë„˜ì–´ê°€ë©´ DCOLL ë°œìƒìœ¼ë¡œ ì˜ˆì™¸ì²˜ë¦¬ [ 21-06-02 KJG ]
      temp = temp.Left(16);
      SPRINTRAW(16, "%s", temp.GetBuffer(0));
   }
   // 52   12   SHRINK      // Server or Frame Shrink ë™ìž‘ ì—¬ë¶€
   if (strlen(pGlassData->m_strShrinked) == 0)
   {
      SPRINTRAW(12, "*");
   }
   else
   {
      SPRINTRAW(12, "%s", pGlassData->m_strShrinked);
   }
   // 53   12   RAW_CUT      // RAW ìž…ë ¥ Defect ìˆ˜ëŸ‰ ìƒí•œ ì‚¬ìš©ì—¬ë¶€
   if (pGlassData->m_bRawCutoff)
   {
      SPRINTRAW(12, "USE");
   }
   else
   {
      SPRINTRAW(12, "UNUSE");
   }
   SPRINTRAWEND;   //중요!!! ì ¤ ë§ˆì§€ë§‰ì— ê¼­ ìžˆì–´ì•¼í•¨!!!(삭제금지) [김태현2020/9/23]
}
void CGlassRawCPJT::makeDataCell( CString& strLine, CgrmGlassRawData* pData, _grmCellData* pCellData )
{
   SPRINTRAWSTART;
   /* SUBPanel ITEM
   01 4  ITEM            // ITEM
   02 8  SUBPANEL         // SUBPANEL
   03 12 SUBPANELID      // Subpanel ID
   04 7  COORD_X         // X Beginnign Coord
   05 7  COORD_Y         // Y Beginning Coord
   06 7  SIZE_X         // X-axis Size
   07 7  SIZE_Y         // Y-axis Size
   08 6  GATELINE         // GateLine
   09 6  DATALINE         // DataLine
   10 4  GRADE            // Grade (Judgement)
   11 4  CODE            // Grade Code (Judgement)
   12 4  R_GRADE         // Grade by Operator (Re-Judgement)
   13 12  T_DEFECT         // Total Defect Count
   14 12  TD_DEFECT      // TD Defect Count
   15 12  SD_DEFECT      // SD Defect Count
   16 12  PD_DEFECT      // PD Defect Count
   17 12  SP_DEFECT      // SP Defect Coun
   18 12  PAD_GATE         // PAD Gate Defect Count
   19 12  PAD_DATA         // PAD Data Defect Count
   20 12  M_DEFECT         // MASK Defect Count
   21 12  C_DEFECT         // COMMON Defect Count
   22 12  S_DEFECT         // SCRATCH Defect Count
   23 12  CRACK            // CRACK Defect Count
   24 12  P_SHIFT         // Pattern Shift Defect Count
   */
   // 01 4  ITEM            // ITEM
   SPRINTRAW(4, "DATA");
   // 02 8  SUBPANEL         // SUBPANEL
   SPRINTRAW(8, "SUBPANEL");
   // 03 12 SUBPANELID         // Subpanel ID
   //SPRINTRAW(12, "%d", pCellData->m_nCellID);
   SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]);
   // ê¸€ë¼ìФ ì›ì  ê¸°ì¤€ Y좌표 ë°˜ëŒ€
   // ì½”너컷 ê¸°ì¤€ìœ¼ë¡œ ê²°ê³¼íŒŒì¼ ì¢Œí‘œê°€ ìƒì„±ë˜ëŠ”ë° ê³ ê°ì‚¬ì— ëª…확한 í™•인 í•„ìš”
   // Server는 ëª¨ë“  ì¢Œí‘œë¥¼ ê¸€ë¼ìФ ì›ì  ê¸°ì¤€ìœ¼ë¡œ í•˜ëŠ”ë° ì½”너컷 ê¸°ì¤€ì´ ë˜ì–´ì•¼í•˜ëŠ”ì§€ ë´ì•¼í•¨
   // ì…€ ìœ„치는 ê¸€ë¼ìФ ì›ì , ì¢Œí‘œëŠ” ì½”너컷???
   // 210129 CJH - ì…€ ì›ì  ìœ„치에 ë”°ë¼ ì¢Œí‘œìœ„치 ë³€ê²½ LeftTop(1,-1) RightTop(-1,-1) LeftBottom(1,1) RightBottom(-1,1)
   if (pCellData->m_nCellXDir == 1)
   {
      // 04 7  COORD_X         // X Beginning Coord
      SPRINTRAW(8, "%d", pCellData->m_rectCellLeft);
   }
   else
   {
      // 04 7  COORD_X         // X Beginning Coord
      SPRINTRAW(8, "%d", pCellData->m_rectCellRight);
   }
   if (pCellData->m_nCellYDir == 1)
   {
      // 05 7  COORD_Y         // Y Beginning Coord   //Top을 í•´ì•¼ ì œëŒ€ë¡œ ê°’이 ë“¤ì–´ê°...Rect부터 ìž˜ëª» ë“¤ì–´ê°€ëŠ”ë“¯
      SPRINTRAW(8, "%d", pCellData->m_rectCellTop * -1);
   }
   else
   {
      // 05 7  COORD_Y         // Y Beginning Coord
      SPRINTRAW(8, "%d", pCellData->m_rectCellBottom * -1);
   }
   // 06 7  SIZE_X            // X-axis Size
   SPRINTRAW(7, "%d", pCellData->m_rectCellRight - pCellData->m_rectCellLeft);
   // 07 7  SIZE_Y            // Y-axis Size
   SPRINTRAW(7, "%d", pCellData->m_rectCellBottom - pCellData->m_rectCellTop);
   // 08 6  GATELINE         // ì´ GateLine ìˆ˜
   SPRINTRAW(6, "%d", pCellData->m_nGateNum);
   // 09 6  DATALINE         // ì´ DataLine ìˆ˜
   SPRINTRAW(6, "%d", pCellData->m_nDataNum);
   // 10 4  GRADE            // Grade (Judgement)
   SPRINTRAW(4, "%s", GetDefectInfoToString(DMT_DefectJudge, pCellData->m_nJudgement));
   // 11 4  CODE            // Grade Code (Judgement)
   SPRINTRAW(4, "OOOO");
   // 12 4  R_GRADE         // Grade by Operator (Re-Judgement)
   SPRINTRAW(4, "*");
   // 13 6  T_DEFECT         // Total Defect Count
   SPRINTRAW(12, "%d", pCellData->getTotalDefectNum());
   // 14 6  TD_DEFECT         // TD Defect Count - total defect
   SPRINTRAW(12, "%d", pCellData->m_nDefectTDCount);
   // 15 6  SD_DEFECT         // SD Defect Count - stack defect
   SPRINTRAW(12, "%d", pCellData->m_nDefectSDCount);
   // 16 6  PD_DEFECT         // PD Defect Count - partial defect
   SPRINTRAW(12, "%d", pCellData->m_nDefectPDCount);
   // 17 6  SP_DEFECT         // SP Defect Count - stack partial
   SPRINTRAW(12, "%d", pCellData->m_nDefectSPCount);
   // 18 6  PAD_GATE         // PAD Gate Defect Count
   SPRINTRAW(12, "*");
   // 19 6  PAD_DATA         // PAD Data Defect Count
   SPRINTRAW(12, "*");
   // 20 6  M_DEFECT         // MASK Defect Count
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeMD);
   // 21 6  C_DEFECT         // COMMON Defect Count
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeCD);
   // 22 6  S_DEFECT  -> 22 6  PRO_IMAGE ë³€ê²½    nwh0404
   if (strlen(pCellData->m_strProImage))
   {
      SPRINTRAW(12, "%s", pCellData->m_strProImage);
   }
   else
   {
      SPRINTRAW(12,"*");
   }
   // 23 12  AVG_GRAY_0
   if (strlen(pCellData->m_strAvgGray_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 24 12 PORTION_0
   if (strlen(pCellData->m_strPortion_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   //kyh 0622
   // 25 12 CORNER_GRAY_0
   if (strlen(pCellData->m_strCorner_Gray_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 26 12 AVG_AMP_0
   if (strlen(pCellData->m_strAvgAmp_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 27 12 FFT_VAR_0
   if (strlen(pCellData->m_strFFTVar_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVar_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 28 12 FFT_VAH_0
   if (strlen(pCellData->m_strFFTVah_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVah_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 29 12 FFT_VAQ_0
   if (strlen(pCellData->m_strFFTVaq_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 30 12 FFT_PK_0
   if (strlen(pCellData->m_strFFTPK_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTPK_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 31 12  AVG_GRAY_1
   if (strlen(pCellData->m_strAvgGray_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 32 12 PORTION_1
   if (strlen(pCellData->m_strPortion_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   //kyh 0622
   // 33 12 CORNER_GRAY_1
   if (strlen(pCellData->m_strCorner_Gray_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 34 12 AVG_AMP_1
   if (strlen(pCellData->m_strAvgAmp_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 35 12 FFT_VAR_1
   if (strlen(pCellData->m_strFFTVar_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVar_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 36 12 FFT_VAH_1
   if (strlen(pCellData->m_strFFTVah_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVah_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 37 12 FFT_VAQ_1
   if (strlen(pCellData->m_strFFTVaq_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 38 12 FFT_PK_1
   if (strlen(pCellData->m_strFFTPK_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTPK_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 39 12  AVG_GRAY_2
   if (strlen(pCellData->m_strAvgGray_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 40 12 PORTION_2
   if (strlen(pCellData->m_strPortion_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   //kyh 0622
   // 41 12 CORNER_GRAY_2
   if (strlen(pCellData->m_strCorner_Gray_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 42 12 AVG_AMP_2
   if (strlen(pCellData->m_strAvgAmp_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 43 12 FFT_VAR_2
   if (strlen(pCellData->m_strFFTVar_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVar_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 44 12 FFT_VAH_2
   if (strlen(pCellData->m_strFFTVah_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVah_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 45 12 FFT_VAQ_2
   if (strlen(pCellData->m_strFFTVaq_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 46 12 FFT_PK_2
   if (strlen(pCellData->m_strFFTPK_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTPK_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 47 12  AVG_GRAY_3
   if (strlen(pCellData->m_strAvgGray_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 48 12 PORTION_3
   if (strlen(pCellData->m_strPortion_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   //kyh 0622
   // 49 12 CORNER_GRAY_3
   if (strlen(pCellData->m_strCorner_Gray_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 50 12 AVG_AMP_3
   if (strlen(pCellData->m_strAvgAmp_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 51 12 FFT_VAR_3
   if (strlen(pCellData->m_strFFTVar_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVar_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 52 12 FFT_VAH_3
   if (strlen(pCellData->m_strFFTVah_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVah_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 53 12 FFT_VAQ_3
   if (strlen(pCellData->m_strFFTVaq_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 54 12 FFT_PK_3
   if (strlen(pCellData->m_strFFTPK_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTPK_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   SPRINTRAWEND;   //중요!!! ì ¤ ë§ˆì§€ë§‰ì— ê¼­ ìžˆì–´ì•¼í•¨!!!(삭제금지) [김태현2020/9/23]
}
BOOL CGlassRawCPJT::makeDataDefect( CString& strLine, CgrmGlassRawData* pData, _grmDefectData* pDefectData )
{
   SPRINTRAWSTART;
   CString      strItem;
   /* DEFECT ITEM
      // 01   4    ITEM         // ITEM
      // 02   6    DEFECT         // DEFECT
      // 03   12   ID            // Subpanel ID
      // 04   5    DEF_NO         // Defect Number of Panel
      // 05   7    COORD_X      // Defect Location from origin point X
      // 06   7    COORD_Y      // Defect Location from origin point Y
      // 07   6    GATELINE      // Defect Gateline
      // 08   6    DATALINE      // Defect Dataline
      // 09   4    SIZE_S         // Defect Size (Square)
      // 10   4    SIZE_W         // Defect Size (Width)
      // 11   4    SIZE_L         // Defect Size (Length)
      // 12   4    SIZE_H         // Defect Size (Height)
      // 13   4    GRADE         // Defect Grade
      // 14   4    CODE         // Defect Code
      // 15   2    STACK_FLAG      // Current Defect Flag
      // 16   2    STACK_COUNT   // Count of Defect detected step
      // 17   60   STACK_STEP      // Flow(Step) of defect detection
      // 18   16   IMAGE_FILE      // Image file Name
      // 19   12   DSC Code
      // 20   12   Image ë¶„류 Code
      // 21   12   ë¶ˆëŸ‰ì´ ìœ„치한 Zone No ìž…ë ¥
      // 22   12   ë¶ˆëŸ‰ í¬ê¸° (L,H,M,S)
      // 23   12   M/N/C/S/K/*
      // 24   12   ë¯¸ì‚¬ìš©
      // 25   12   ë¯¸ì‚¬ìš©
      // 26   12   ì „ STEP íŒì • D/F ìœ ë¬´
      // 27   12   Gray Min
      // 28   12   Gray Max
      // 29   12   Gray Average
      // 30   12   Defect Peak
      // 31   12   ë¯¸ì‚¬ìš©
      // 32   12   ë¯¸ì‚¬ìš©
      // 33   12   Scan ë²ˆí˜¸
      // 34   12   Camera ID
      // 35   12   ë¯¸ì‚¬ìš©
      // 36   12   R_SRC_MIN
      // 37   12   R_SRC_MAX
      // 38   12   R_SRC_AVG
      // 39   12   Scan AI ë¶„류결과
      // 40   12   Review AI ë¶„류결과
      // 41   12   ê²€ì¶œëª¨ë“œ (Dark or Bright)
      // 42   12   ê²€ì¶œì±„널 RGB
   */
   // 01   4    ITEM         // ITEM
   SPRINTRAW(4, "DATA");
   // 02   6    DEFECT         // DEFECT
   SPRINTRAW(6, "DEFECT");
   // 03   12   ID            // Subpanel ID
   SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefectData->m_nCellIdx / 36, g_pCellCode[pDefectData->m_nCellIdx % 36]);
   // 04   5    DEF_NO         // Defect Number of Panel
   // RAW íŒŒì¼ìš© Defect Index
   //SPRINTRAW(5, "%d", pDefectData->m_nDefectIdx);
   SPRINTRAW(5, "%d", m_nWriteRawDefectIdx++);
   // 05   8    COORD_X      // Defect Location from origin point X
   SPRINTRAW(8, "%d", pDefectData->m_nUMCenterAlignX);
   // 06   8    COORD_Y      // Defect Location from origin point Y
   // ì‹ ê¸°ëŒ€í”„로 ìš”ì²­ ìž„시 ìˆ˜ì •
   SPRINTRAW(8, "%d", pDefectData->m_nUMCenterAlignY*-1);
   // 07   6    GATELINE      // Defect Gateline
   SPRINTRAW(6, "%d", pDefectData->m_nCellGate);
   // 08   6    DATALINE      // Defect Dataline
   SPRINTRAW(6, "%d", pDefectData->m_nCellData);
   // 09   4    SIZE_S         // Defect Size (Square)
   if (abs(pDefectData->m_nPixelSize) > 9999) {
      SPRINTRAW(4, "%d",9999);
   }
   else
   {
      SPRINTRAW(4, "%d", pDefectData->m_nPixelSize);
   }
   // 10   4    SIZE_W         // Defect Size (Width)
   if (abs(pDefectData->m_nUMSizeX) > 9999) {
      SPRINTRAW(4, "%d", 9999);
   }
   else
   {
      SPRINTRAW(4, "%d", pDefectData->m_nUMSizeX);
   }
   // 11   4    SIZE_L         // Defect Size (Length)
   if (abs(pDefectData->m_nUMSizeY) > 9999) {
      SPRINTRAW(4, "%d", 9999);
   }
   else
   {
      SPRINTRAW(4, "%d", pDefectData->m_nUMSizeY);
   }
   // 12   4    SIZE_H         // Defect Size (Height)
   if (abs(pDefectData->m_nDefectRScale) > 9999) {
      SPRINTRAW(4, "%d", 9999);
   }
   else
   {
      strItem.Format("%d", pDefectData->m_nDefectRScale);
      SPRINTRAW(4, "%.4s", strItem.GetBuffer(0));
   }
   // 13   4    GRADE         // Defect Grade
   SPRINTRAW(4, "%s", GetDefectInfoToString(DMT_DefectJudge, pDefectData->m_DefectJudgement));
   // 14   4    CODE         // Defect Code
   if (strlen(pDefectData->m_strDefectCode))
   {
      SPRINTRAW(4, "%.4s", pDefectData->m_strDefectCode);
   }
   else
   {
      SPRINTRAW(4, "*");
   }
   // 15   2    STACK_FLAG      // Current Defect Flag  //201221 CJH - TD/SD/PD/SP
   if (pDefectData->m_StackInfo == Stack_Unknown)
   {
      SPRINTRAW(2, "%s", "UK");
   }
   else if (pDefectData->m_StackInfo == Stack_TD)
   {
      SPRINTRAW(2, "%s", "TD");
   }
   else if (pDefectData->m_StackInfo == Stack_SD)
   {
      SPRINTRAW(2, "%s", "SD");
   }
   else if (pDefectData->m_StackInfo == Stack_PD)
   {
      SPRINTRAW(2, "%s", "PD");
   }
   else if (pDefectData->m_StackInfo == Stack_SP)
   {
      SPRINTRAW(2, "%s", "SP");
   }
   else
   {
      SPRINTRAW(2, "*");
   }
   // 16   2    STACK_COUNT   // Count of Defect detected step
   SPRINTRAW(2, "%2d", pDefectData->m_nStackStepCount);
   // 17   60   STACK_STEP      // Flow(Step) of defect detection
   if (strlen(pDefectData->m_strStackFirst))
   {
      SPRINTRAW(60, "%s", pDefectData->m_strStackFirst);
   }
   else
   {
      SPRINTRAW(60, "*");
   }
   // 18   16   IMAGE_FILE      // Image file Name
   // ê²€ì‚¬ ì´ë¯¸ì§€ ë¯¸ì‚¬ìš©
   if (strlen(pDefectData->m_ReviewDefect.m_strRevImageName))
   {
      SPRINTRAW(16, "%s", pDefectData->m_ReviewDefect.m_strRevImageName);
   }
   else
   {
      SPRINTRAW(16, "*");
   }
   // 19   12    DSC_CODE      // Common 01 DSC Code
   SPRINTRAW(12, "*");
   // 20   12    VC_CODE      // Common 02 Image ë¶„류 Code
   SPRINTRAW(12, "*");
   // 21   12    ZONE_NO      // Common 03 ë¶ˆëŸ‰ì´ ìœ„치한 Zone No ìž…ë ¥
   // Zone Data
   int nValue = 0;
   for (int i = 15; i >= 0; i--)
   {
      if (pDefectData->m_sZonePixelCount[i] > 0)
         nValue += 1;
      if (i > 0)
         nValue = nValue << 1;
   }
   SPRINTRAW(12, "%04X", nValue);
   // 22   12    DEFECT_SIZE   // Common 04 ë¶ˆëŸ‰ í¬ê¸° (L,H,M,S)
   if (pDefectData->m_DefectSizeType == SizeType_Small)
   {
      SPRINTRAW(12, "S");
   }
   else if (pDefectData->m_DefectSizeType == SizeType_Mid)
   {
      SPRINTRAW(12, "M");
   }
   else if (pDefectData->m_DefectSizeType == SizeType_Large)
   {
      SPRINTRAW(12, "L");
   }
   else if (pDefectData->m_DefectSizeType == SizeType_Huge)
   {
      SPRINTRAW(12, "H");
   }
   else if (pDefectData->m_DefectSizeType == SizeType_Ultra)
   {
      SPRINTRAW(12, "U");
   }
   else
   {
      SPRINTRAW(12, "S");
   }
   //SizeType_Small
   // 23   12    REPEAT_DEFECT   // Common 05 M/N/C/S/K/*
   if (pDefectData->m_DefectSubType == DefectSubType_MC)
   {
      SPRINTRAW(12, "MC");
   }
   else if (pDefectData->m_DefectSubType == DefectSubType_Mask)
   {
      SPRINTRAW(12, "MD");
   }
   else if (pDefectData->m_DefectSubType == DefectSubType_Common)
   {
      SPRINTRAW(12, "CD");
   }
   else if (pDefectData->m_DefectSubType == DefectSubType_NoDefect)
   {
      SPRINTRAW(12, "NO");
   }
   else
   {
      SPRINTRAW(12, "N");
   }
   // 24   12       // Common 06 ë¯¸ì‚¬ìš© -> WSI ë†’이 ê¸°ìž…
   //m_nPlanType == ditRaw::RTP_WSI ì´ê±¸ë¡œ ë¹„교하니깐 ê°€ë” ë¹„교안되고 ë„˜ì–´ê° 210205
   if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
   {
      SPRINTRAW(12, "%.03lf", pDefectData->m_ReviewDefect.m_fWsi_ResultData[1]);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 25   12       // Common 07 ë¯¸ì‚¬ìš© -> CS ë†’이 ê¸°ìž…
   if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
   {
      SPRINTRAW(12, "%.03lf", pDefectData->m_ReviewDefect.m_fWsi_ResultData[3]);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 26   12       // Common 08 ì „ STEP íŒì • D/F ìœ ë¬´
   SPRINTRAW(12, "*");
   // 27   12    GRAY_MIN      // Common 09 Gray Min
   SPRINTRAW(12, "%d", pDefectData->m_nLevelSrcMin);
   // 28   12    GRAY_MAX      // Common 10 Gray Max
   SPRINTRAW(12, "%d", pDefectData->m_nLevelSrcMax);
   // 29   12    GRAY_AVG      // Common 11 Gray Average
   SPRINTRAW(12, "%d", pDefectData->m_nLevelSrcAvg);
   // 30   12    GRAY_DEF      // Common 12 Defect Peak
   if (static_cast<int>(pDefectData->m_sDefectPeak) == 0)
   {
      SPRINTRAW(12, "1");
   }
   else
   {
      SPRINTRAW(12, "%d", pDefectData->m_sDefectPeak);
   }
   // 31 NO USE -> WSI Image Name
   if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
   {
      if (strlen(pDefectData->m_ReviewDefect.m_strWsi_3DImageFilename))
      {
      SPRINTRAW(12, "%s", pDefectData->m_ReviewDefect.m_strWsi_3DImageFilename);
      }
      else
      {
         SPRINTRAW(12, "*");
      }
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 32 NO USE -> CCD Image ìœ ë¬´
   if (strlen(pDefectData->m_strAoiImageName))
   {
      SPRINTRAW(12, "O");
   }
   else
   {
      SPRINTRAW(12, "X");
   }
   // 33   12    CAM_POSITION   // Common 15 Scan ë²ˆí˜¸
   SPRINTRAW(12, "%d", pDefectData->m_nScanIdx);
   // 34   12    CAM_POSITION   // Common 16 Camera ID
   SPRINTRAW(12, "%d", pDefectData->m_nCameraID);
   // 35   12    Defect Idx            // Common 25 Defect Idx
   SPRINTRAW(12, "%d", pDefectData->m_nDefectIdx);
   // 36   12    R_SRC_MIN      // Common 18 R_SRC_MIN
   SPRINTRAW(12, "%d", pDefectData->m_nLevelRefMin);
   // 37   12    R_SRC_MAX      // Common 19 R_SRC_MAX
   SPRINTRAW(12, "%d", pDefectData->m_nLevelRefMax);
   // 38   12    R_SRC_AVG      // Common 20 R_SRC_AVG
   SPRINTRAW(12, "%d", pDefectData->m_nLevelRefAvg);
   // 39   12    Scan AI ë¶„류결과         // Common 21 ê³ ê°ì‚¬ ìž…ë ¥==>>>> 0405변경WSI R Height//210405
   if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
   {
      SPRINTRAW(12, "%.03lf", pDefectData->m_ReviewDefect.m_fWsi_ResultData[4]);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 40   12    Review AI ë¶„류결과      // Common 22 ê³ ê°ì‚¬ ìž…ë ¥==>>>> 0405변경WSI G Height//210405
   if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
   {
      SPRINTRAW(12, "%.03lf", pDefectData->m_ReviewDefect.m_fWsi_ResultData[5]);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 41   12    ê²€ì¶œëª¨ë“œ (Dark or Bright)   // Common 23 ê³ ê°ì‚¬ ìž…ë ¥==>>>> 0405변경WSI B Height//210405
   if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
   {
      SPRINTRAW(12, "%.03lf", pDefectData->m_ReviewDefect.m_fWsi_ResultData[6]);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 42   12    ê²€ì¶œì±„널 RGB            // Common 24 ê³ ê°ì‚¬ ìž…ë ¥
   CString strData;  // ê²€ì¶œ ì±„널 ì¶”ê°€ ex) 0, 1, 2 [ 21-03-23 KJG ]
   int nLayers = pDefectData->m_nHliLayers;
   strItem = _T("");
   for (int i = 0; i < 8; i++)
   {
      if (nLayers & 1)
      {
         if (strItem.IsEmpty()) strData.Format("%d", i);
         else strData.Format(",%d", i);
         strItem += strData;
      }
      nLayers = nLayers >> 1;
   }
   SPRINTRAW(12, "%s", strItem);
   // 43   12     Compactness         //201215 CJH - 43~46 ì‹ ê·œ Defect Feature ê²°ê³¼íŒŒì¼ ì¶”ê°€
   SPRINTRAW(12, "%d", pDefectData->m_nCompact);
   // 44   12     Thickness
   SPRINTRAW(12, "%d", pDefectData->m_nThickness);
   // 45   12     Major
   SPRINTRAW(12, "%d", pDefectData->m_nMajor);
   // 46   12     Minor
   SPRINTRAW(12, "%d", pDefectData->m_nMinor);
   // 47   12     WSI Defect Type 0 normal 1 metal 2Huge 3diffuse 4 trashy
   if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
   {
      if (strlen(GetWsiDefectType(pDefectData->m_ReviewDefect.m_fWsi_ResultData[0])))
      {
      SPRINTRAW(12, "%s", GetWsiDefectType(pDefectData->m_ReviewDefect.m_fWsi_ResultData[0]));
           }
           else
           {
      SPRINTRAW(12, "*");
           }
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 48   12   Defect Type ì¶”ê°€ [ 21-03-23 KJG ]
   if (pDefectData->m_DefectType == DefectType_RBlack)
   {
      SPRINTRAW(12, "RB");
   }
   else if (pDefectData->m_DefectType == DefectType_RWhite)
   {
      SPRINTRAW(12, "RW");
   }
   else if (pDefectData->m_DefectType == DefectType_TBlack)
   {
      SPRINTRAW(12, "TB");
   }
   else if (pDefectData->m_DefectType == DefectType_TWhite)
   {
      SPRINTRAW(12, "TW");
   }
   else
   {
      SPRINTRAW(12, "UN");
   }
   // 49   12    Frame Shrink ì •ë³´ ì¶”ê°€
   SPRINTRAW(12, "%d", pDefectData->m_bShrinked);
   // 50   12    CLASS_NO      // Zone Classification NO
   // Zone Data
   nValue = 0;
   for (int i = 15; i >= 0; i--)
   {
      if (pDefectData->m_sZoneClassPixelCount[i] > 0)
         nValue += 1;
      if (i > 0)
         nValue = nValue << 1;
   }
   SPRINTRAW(12, "%04X", nValue);
   SPRINTRAWEND;   //중요!!! ì ¤ ë§ˆì§€ë§‰ì— ê¼­ ìžˆì–´ì•¼í•¨!!!(삭제금지) [김태현2020/9/23]
   return TRUE;
}
BOOL CGlassRawCPJT::ReadMuraFile( CgrmGlassRawData* pData )//0404nwh
{
   CString strMacroFilePath;
   {
      strMacroFilePath.Format("%s\\%s", NETWORK_MURARAW_PATH, pData->GetGlassData()->m_strGlassID);
      CFileFind FF;
      if (FF.FindFile(strMacroFilePath))
      {
         FF.FindNextFile();
         strMacroFilePath = FF.GetFilePath();
         FF.Close();
      }
      else
      {
         AKLOG("Find Macro File Fail. [%s]", strMacroFilePath);
         return FALSE;
      }
   }
   ////Mura Image Server íŠ¹ì • í´ë”에 ì €ìž¥
   CString strMacroImageSrcPath;
   CString strMacroImageTarPath;
   strMacroImageSrcPath.Format("%s\\%s", NETWORK_MURA_IMAGE_PATH, pData->GetGlassData()->m_strGlassID);
   strMacroImageTarPath.Format("%s\\%s\\MuraImage", NETWORK_AOI_IMAGE_PATH, pData->GetGlassData()->m_strGlassID); //생각좀해보자
   //CreateDirectory("D:\\Image\\Defect\\Mura",NULL); ì•ˆí•´ë„될거같음
   if (strMacroImageSrcPath.IsEmpty() == FALSE)
   {
      AKLOG("Macro Image File Copy Start[%s]", strMacroImageTarPath);
      CakFileUtil::CopyFolder(strMacroImageSrcPath.GetBuffer(0), strMacroImageTarPath.GetBuffer(0), FALSE);
      if (m_bReviewEndCheck == TRUE)
      {
         CakFileUtil::DeleteFolder(strMacroImageSrcPath.GetBuffer(0), FALSE);
      }
      AKLOG("Macro Image File Copy End");
   }
   ///Mura ê²°ê³¼íŒŒì¼ ì½ê³  ì“°ê¸° ì‚­ì œ
   if (m_MuraResultFile.openFile_Mura(strMacroFilePath.GetBuffer(0)) == TRUE)
   {
      AKLOG("Macro File Read Success : %dItem", m_MuraResultFile.GetSubPanelNum());
      if (m_bReviewEndCheck == TRUE)
      {
         DeleteFile(strMacroFilePath);
      }
   }
   else
   {
      AKLOG("Macro File Read Fail[%s]", strMacroFilePath);
      //DeleteFile(strMacroResultTargetPath);
      return FALSE;
   }
   return TRUE;
}
void CGlassRawCPJT::SendMessageFTPUploadRaw( _grmGlassData* pGlassData )
{
   if(pGlassData == NULL) return;
   HWND hWnd = ::FindWindow(NULL, "FTPUploader");
   if(hWnd == NULL) return;
   char strServerFolder[256] = {};
   char strServerFile[256] = {};
   char strLocalFolder[256] = {};
   char pLocalFile[256] = {};
   char strRTMSFile[32] = {};
   char strServerRawFileSubPath[256] = {};
   char strServer_SubFileName[32] = {};
   GetFormatDescription(FTPCMD_RAW, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName,pGlassData); //taek 201211
   CFTPCopyDataParam upParam;
   strcpy(upParam.m_strServer_FolderName,         strServerFolder);
   strcpy(upParam.m_strServer_FileName,         strServerFile);
   strcpy(upParam.m_strLocal_FolderName,         strLocalFolder);
   strcpy(upParam.m_strLocal_FileName,            pLocalFile);
   strcpy(upParam.m_strServer_SubFilePath,         strServerRawFileSubPath);
   strcpy(upParam.m_strServer_SubFileName,         strServer_SubFileName);
   strcpy(upParam.m_strServer_SignalFolderName,   "");
   strcpy(upParam.m_strServer_SignalFileName,      "");
   strcpy(upParam.m_strRTMS_FileName, ""); //taek 201211
   upParam.m_nCreateSignalFile                     = FALSE;//m_ctrlCreateSignal.GetCheck();
   upParam.m_nSendResultCode                     = FALSE;//m_ctrlResultAck.GetCheck();
   upParam.m_nProcessType                        = CFTPCopyDataParam::FTPProcessType_UpFile;
   // [C-PRJ] Image Upload Define - KHT (2020/11/19)
   upParam.m_nDataType                           = CFTPCopyDataParam::FTPDataType_Raw;
   COPYDATASTRUCT cds;
   cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_RawUpload;
   cds.cbData = sizeof(CFTPCopyDataParam);
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 30000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
}
void CGlassRawCPJT::SendMessageFTPDownloadStack( _grmGlassData* pGlassData )
{
   if(pGlassData == NULL) return;
   HWND hWnd = ::FindWindow(NULL, "FTPUploader");
   if(hWnd == NULL) return;
   char strServerFolder[256] = {};
   char strServerFile[256] = {};
   char strLocalFolder[256] = {};
   char pLocalFile[256] = {};
   char strRTMSFile[32] = {};
   char strServerRawFileSubPath[256] = {};
   char strServer_SubFileName[256] = {};
   GetFormatDescription(FTPCMD_STACK, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName,pGlassData);
   CFTPCopyDataParam upParam;
   strcpy(upParam.m_strServer_FolderName,         strServerFolder);
   strcpy(upParam.m_strServer_FileName,         strServerFile);
   strcpy(upParam.m_strLocal_FolderName,         strLocalFolder);
   strcpy(upParam.m_strLocal_FileName,            pLocalFile);
   strcpy(upParam.m_strServer_SignalFolderName,   "");
   strcpy(upParam.m_strServer_SignalFileName,      "");
   strcpy(upParam.m_strRTMS_FileName, "");
   upParam.m_nCreateSignalFile                     = FALSE;//m_ctrlCreateSignal.GetCheck();
   upParam.m_nSendResultCode                     = FALSE;//m_ctrlResultAck.GetCheck();
   upParam.m_nProcessType                        = CFTPCopyDataParam::FTPProcessType_DownFile;
   // [C-PRJ] Image Upload Define - KHT (2020/11/19)
   upParam.m_nDataType                           = CFTPCopyDataParam::FTPDataType_Stack;
   COPYDATASTRUCT cds;
   cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_RawDownload;
   cds.cbData = sizeof(CFTPCopyDataParam);
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
}
void CGlassRawCPJT::SendMessageFTPDownloadDataFile( _grmGlassData* pGlassData )
{
   if(pGlassData == NULL) return;
   HWND hWnd = ::FindWindow(NULL, "FTPDownloader");
   if(hWnd == NULL) return;
   char strServerFolder[256] = {};
   char strServerFile[256] = {};
   char strLocalFolder[256] = {};
   char pLocalFile[256] = {};
   //GetFormatDescription(FTPCMD_DATAFILE, strServerFolder, strServerFile, strLocalFolder, pLocalFile, pGlassData);
   {
      CString strGlassIDOrg = pGlassData->m_strGlassID;
      CString strGlassID = strGlassIDOrg.Left(12);
      sprintf(strServerFolder, "%s", pGlassData->m_strCassetteSequenceNo);
      sprintf(strServerFile, "%s.dat", strGlassID.GetBuffer(0));
      sprintf(strLocalFolder,  "D:\\DIT_ResultData\\DownloadData");
      sprintf(pLocalFile,  "%s.dat", strGlassID.GetBuffer(0));
   }
   CFTPCopyDataParam upParam;
   strcpy(upParam.m_strServer_FolderName,         strServerFolder);
   strcpy(upParam.m_strServer_FileName,         strServerFile);
   strcpy(upParam.m_strLocal_FolderName,         strLocalFolder);
   strcpy(upParam.m_strLocal_FileName,            pLocalFile);
   strcpy(upParam.m_strServer_SignalFolderName,   "");
   strcpy(upParam.m_strServer_SignalFileName,      "");
   upParam.m_nCreateSignalFile                     = FALSE;//m_ctrlCreateSignal.GetCheck();
   upParam.m_nSendResultCode                     = FALSE;//m_ctrlResultAck.GetCheck();
   upParam.m_nProcessType                        = CFTPCopyDataParam::FTPProcessType_DownFile;
   // [C-PRJ] Image Upload Define - KHT (2020/11/19)
   upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Unknown;
   COPYDATASTRUCT cds;
   cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_RawDownload;
   cds.cbData = sizeof(CFTPCopyDataParam);
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
}
void CGlassRawCPJT::SendMessageFTPUploadImage( _grmGlassData* pGlassData, emFTPCommand sort)
{
   if(pGlassData == NULL) return;
   HWND hWnd = ::FindWindow(NULL, "FTPUploader");
   if(hWnd == NULL) return;
   char strServerFolder[256] = {};
   char strServerFile[32];// = "*.*";
   char strLocalFolder[256] = {};
   char strLocalFile[32];// = "*.*";
   char strRTMSFile[256] = {}; //taek 201211
   char strServerRawFileSubPath[256] = {};
   char strServer_SubFileName[256] = {};
   GetFormatDescription(sort, strServerFolder, strServerFile, strLocalFolder, strLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName,pGlassData); //taek 201211
   CFTPCopyDataParam upParam;
   strcpy(upParam.m_strServer_FolderName,         strServerFolder);
   strcpy(upParam.m_strServer_FileName,         strServerFile);
   strcpy(upParam.m_strLocal_FolderName,         strLocalFolder);
   strcpy(upParam.m_strLocal_FileName,            strLocalFile);
   strcpy(upParam.m_strServer_SignalFolderName,   "");
   strcpy(upParam.m_strServer_SignalFileName,      "");
   strcpy(upParam.m_strRTMS_FileName,             strRTMSFile); //taek 201211
   upParam.m_nCreateSignalFile                     = FALSE;
   upParam.m_nSendResultCode                     = FALSE;
   upParam.m_nProcessType                        = CFTPCopyDataParam::FTPProcessType_UpFile;
   // [C-PRJ] Image Upload Define - KHT (2020/11/19)
   upParam.m_nDataType                           = CFTPCopyDataParam::FTPDataType_Image;
   COPYDATASTRUCT cds;
   cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_ImageUpload; // FTP Uploader에서는 êµ¬ë¶„되어 ìžˆì§€ ì•ŠìŒ!
   cds.cbData = sizeof(CFTPCopyDataParam);
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
}
BOOL CGlassRawCPJT::SendMessageFTPUploadIndexFile( _grmGlassData* pGlassData )
{
   if(pGlassData == NULL)
      return FALSE;
   HWND hWnd = ::FindWindow(NULL, "FTPUploader");
   if(hWnd == NULL) return FALSE;
   char strServerFolder[256] = {};
   char strServerFile[256] = {};
   char strLocalFolder[256] = {};
   char pLocalFile[256] = {};
   char strRTMSFile[32] = {};
   char strServerRawFileSubPath[256];
   char strServer_SubFileName[256] = {};
   GetFormatDescription(FTPCMD_INDEX, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName, pGlassData);
   //    if(0)//test
   //    {
   //       sprintf(strServerFolder, "HDD1/DIT/TestC");
   //       ServerFile = "ftptestfile.txt";
   //
   //       sprintf(strLocalFolder, "D:");
   //       pLocalFile = "ftptestfile.txt";
   //    }
   CFTPCopyDataParam upParam;
   strcpy(upParam.m_strServer_FolderName,         strServerFolder);
   strcpy(upParam.m_strServer_FileName,         strServerFile);
   strcpy(upParam.m_strLocal_FolderName,         strLocalFolder);
   strcpy(upParam.m_strLocal_FileName,            pLocalFile);
   strcpy(upParam.m_strServer_SignalFolderName,   "");
   strcpy(upParam.m_strServer_SignalFileName,      "");
   strcpy(upParam.m_strRTMS_FileName, "");
   upParam.m_nCreateSignalFile                     = FALSE;//m_ctrlCreateSignal.GetCheck();
   upParam.m_nSendResultCode                     = FALSE;//m_ctrlResultAck.GetCheck();
   upParam.m_nProcessType                        = CFTPCopyDataParam::FTPProcessType_UpFile;
   // [C-PRJ] Image Upload Define - KHT (2020/11/19)
   upParam.m_nDataType                           = CFTPCopyDataParam::FTPDataType_Index;
   COPYDATASTRUCT cds;
   cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_RawUpload;
   cds.cbData = sizeof(CFTPCopyDataParam);
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   return TRUE;
}
void CGlassRawCPJT::GetFormatDescription(emFTPCommand sort, char* pServerPath, char* pServerFile, char* pLocalPath, char* pLocalFile, char* pRTMSFile, char* pServerFileSubPath, char* pServerFileSubName, _grmGlassData* pGlassData) //taek 201211
{
   CString strGlassID = pGlassData->m_strGlassID;
   //For test
   //if (strlen(strGlassID) == 0) strGlassID = "HPANELID";
   CString strGlassIDLevel6th = strGlassID.Left(6);
   CString strGlassIDLevel5th = strGlassID.Left(5);
   CString strGlassIDLevel8th = strGlassID.Left(8);
   CString strLotID = pGlassData->m_strLotID;
   CString strStepID = pGlassData->m_strStepID;
   CString strProcessID = pGlassData->m_strProcessID;
   //For test
   //if (strlen(strStepID) == 0) strStepID = "F11112";
   strLotID.MakeLower();
   strStepID.MakeLower();
   strGlassID.MakeLower();
   strGlassIDLevel6th.MakeLower();
   strProcessID.MakeLower();
   switch(sort)
   {
   case FTPCMD_AOI_IMAGE:
      {
         if(strGlassID.GetLength() > 6)
            sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
         else
            sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
         sprintf(pLocalPath, "%s%s", LOCAL_AOI_IMAGE_PATH, strGlassID.GetBuffer(0));
         strcpy(pServerFile, "*.*");
         strcpy(pLocalFile, "*.*");
      }
      break;
   case FTPCMD_REVIEW_IMAGE:
      {
         CTime time = m_tmFileCreateTime;
         CString strTime = NULL;
         CString strInsEndTime = NULL;
         strTime = pGlassData->m_tmGlassLoading.Format("%Y%m%d%H%M%S");
         strInsEndTime = pGlassData->m_tmInspectionEND.Format("%Y%m%d%H%M%S");
         if (strGlassID.GetLength() > 6)
            sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
         else
            sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
         sprintf(pLocalPath, "%s%s_%s", LOCAL_REV_IMAGE_PATH, strGlassID.GetBuffer(0), strTime);
         strcpy(pServerFile, "*.*");
         strcpy(pLocalFile, "*.*");
            //Result ini ë¦¬ë·° ì´ë¯¸ì§€ path ì±„우기
            CString strRawFilePathName = NULL;
            CString strLine = NULL;
         CString strPath = NULL;
            strRawFilePathName += LOCAL_RAWPATH_INFO_INI_PATH;
            strRawFilePathName += RAWINFO_FILE_NAME;
            FILE* pf = fopen(strRawFilePathName.GetBuffer(0), "a");
         if(pf != NULL)
            {
            strLine = pServerPath;
            strPath = strLine.Left(strLine.GetLength() - 1);
               fprintf(pf, "IMGPATH= Z:\%s\n", strPath.GetBuffer(0));
               fprintf(pf, "DISK=FILESERVER\n");
            fclose(pf);
         }
         //RTMS ê²°ê³¼ íŒŒì¼ ì—…로드
         CString strRTMSPathFileName = NULL;
         CString strRTMSFileName = NULL;
         strRTMSFileName.Format("%s#%s#%04d%02d%02d%02d%02d%02d.Signal", pGlassData->m_strEquipID, pGlassData->m_strProductID, time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
         strRTMSPathFileName += LOCAL_RTMS_INFO_PATH;
         strRTMSPathFileName += strRTMSFileName;
         //          strRTMSFileName = strRawFilePath.Left(strRawFilePath.GetLength()-1); //taek ë§ˆì§€ë§‰ ê°’ ë¹¼ê³  ê°€ì ¸ì˜¤ê¸° test
         FILE* pfile = fopen(strRTMSPathFileName.GetBuffer(0), "a");
         sprintf(pRTMSFile, "%s", strRTMSPathFileName); //taek 201211
         if (pfile != NULL)
         {
            fprintf(pfile, "MODULE_ID = %s\n", pGlassData->m_strEquipID);
            fprintf(pfile, "PRODUCT_ID = %s\n", pGlassData->m_strProductID);
            fprintf(pfile, "PROCESS_ID = %s\n", pGlassData->m_strProcessID);
            fprintf(pfile, "STEP_ID = %s\n", pGlassData->m_strStepID);
            fprintf(pfile, "PANEL_ID = %s\n", pGlassData->m_strGlassID);
            fprintf(pfile, "RESULT = *\n");
            fprintf(pfile, "REASON_CODE = *\n");
            fprintf(pfile, "RDP_PATH_RAW = \\cfq1raw1cai1coi%s\n", GetRawFilePath());
            fprintf(pfile, "RDP_PATH_IMAGE = \\cfq1img1cai1coi%s\n", strLine.Left(strLine.GetLength() - 1));
            fprintf(pfile, "INSP_TIME = %s\n", strInsEndTime);
            fclose(pfile);
         }
      }
      break;
   case FTPCMD_RAW:
      {
         CTime time = m_tmFileCreateTime;
         SetRawFilePath("");
         CString strFileName;//파일생성 ì‹œê°„ ë•Œë¬¸ì— ì—¬ê¸°ì„œ ì •확하게 íŒŒì¼ëª… ë‹¤ì‹œ ì •ì •
         {
            //Glass ì •ë³´
            CTime CurrTime = m_tmFileCreateTime;
            CString strTime;
            strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
               CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
            // ì‹œê°„, í™•장자 ì—†ì•° [11/20/2020 Server]
            strFileName.Format("%s", pGlassData->m_strGlassID);
            strFileName.MakeLower();
         }
         /*sprintf(pServerPath, "%s\\%04d%02d%02d\\%s\\%s\\%s\\Data", pGlassData->m_strEquipID, time.GetYear(), time.GetMonth(), time.GetDay(),
            strGlassIDLevel5th.GetBuffer(0),
            strGlassIDLevel8th.GetBuffer(0),
            strGlassID.GetBuffer(0)); */
         //if (strGlassID.GetLength() > 6)
         //   sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strLotID, strStepID, strGlassIDLevel6th, strGlassID);
         //else
            sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
         sprintf(pLocalPath, "%s", pGlassData->m_strPath);
         sprintf(pServerFile, "%s", strFileName.GetBuffer(0));
         sprintf(pLocalFile, "%s", strFileName.GetBuffer(0));
         CString strServerSubRawFilePath= NULL;
         CString strServerSubRawFileName = NULL;
         {
            strServerSubRawFilePath += NETWORK_AOIRAWFILE_SUB_PATH;
            CString strTime;
            CTime CurrTime = m_tmFileCreateTime;
            strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
               CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
            // ì‹œê°„, í™•장자 ì—†ì•° [11/20/2020 Server]
            strServerSubRawFileName.Format("\\%s_%s", pGlassData->m_strGlassID, strTime);
            //strServerSubRawFilePath += strServerSubRawFileName;
            BOOL bIsBDI = strcmp((pGlassData->m_strLine), _T("BDI")) == 0 ? TRUE : FALSE;  // BDI ì¸ ê²½ìš° InspectorEnd ì‹œì— SubFile ìƒì„± [ 21-03-23 KJG ]
            if (m_bReviewEndCheck || bIsBDI)  // InspectEnd ì‹œì—ëŠ” SubFile ë¯¸ìƒì„± ë³€ê²½ [ 21-03-18 KJG ]
            {
               sprintf(pServerFileSubName, "%s", strServerSubRawFileName.GetBuffer(0));
               sprintf(pServerFileSubPath, "%s", strServerSubRawFilePath.GetBuffer(0));
            }
            else
            {
               sprintf(pServerFileSubName, "%s", "");
               sprintf(pServerFileSubPath, "%s", "");
            }
         }
         //Result ini raw íŒŒì¼ì´ë¦„(path포함)write
         CString strRawFilePathName = NULL;
         CString strLine = NULL;
         strRawFilePathName += LOCAL_RAWPATH_INFO_INI_PATH;
         strRawFilePathName += RAWINFO_FILE_NAME;
         FILE* pf = fopen(strRawFilePathName.GetBuffer(0), "w");
         if(pf != NULL)
         {
            strLine = pServerPath + strFileName;
            fprintf(pf, "[RESULT_PATH]\n");
            fprintf(pf, "RAWPATH= X:\%s\n", strLine.GetBuffer(0));
            SetRawFilePath(strLine.GetBuffer(0));
            fprintf(pf, "SUMPATH= \n");
            fclose(pf);
         }
      }
      break;
   case FTPCMD_STACK:
      {
      //201218 CJH - Stack Download ê²½ë¡œ ì„¤ì •
         sprintf(pServerPath, "\\stack\\%s\\%s\\%s", strProcessID,
            strStepID,
            strGlassIDLevel6th.GetBuffer(0));
         sprintf(pServerFile, "%s",
            strGlassID);
         sprintf(pLocalPath, "%s", m_StackResult.getStackLocalPath());
         sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0));
      }
      break;
      case FTPCMD_MURA_IMAGE: //0404nwh
      {   //
         /*CTime time = m_tmFileCreateTime;
         sprintf(pServerPath, "%s\\%04d%02d%02d\\%s\\%s\\%s\\Image", pGlassData->m_strEquipID, time.GetYear(), time.GetMonth(), time.GetDay(),
            strGlassIDLevel5th.GetBuffer(0),
            strGlassIDLevel8th.GetBuffer(0),
            strGlassID.GetBuffer(0));
                     sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0));
         strcpy(pServerFile, "*.*");
         strcpy(pLocalFile, "*.*");*/
         if (strGlassID.GetLength() > 6)
            sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
         else
            sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
         sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0));
         strcpy(pServerFile, "*.*");
         strcpy(pLocalFile, "*.*");
      }
      break;
   case FTPCMD_INDEX:
      {
         CTime time = m_tmFileCreateTime;
         sprintf(pServerPath, "INDEX\\%s", pGlassData->m_strEquipID);
         sprintf(pServerFile, "%04d%02d%02d_%s.csv", time.GetYear(), time.GetMonth(), time.GetDay(),   pGlassData->m_strStepID);
         sprintf(pLocalPath, "%s", LOCAL_INDEX_PATH);
         sprintf(pLocalFile, "%s", pServerFile);
      }
      break;
   case FTPCMD_LINK:
      {
         CTime time = m_tmFileCreateTime;
         CString strFileName;//파일생성 ì‹œê°„ ë•Œë¬¸ì— ì—¬ê¸°ì„œ ì •확하게 íŒŒì¼ëª… ë‹¤ì‹œ ì •ì •
         {
            //Glass ì •ë³´
            CTime CurrTime = m_tmFileCreateTime;
            CString strTime;
            strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
               CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
            strFileName.Format("%s_%s_%s.csv", pGlassData->m_strOperID, pGlassData->m_strGlassID, strTime.GetBuffer(0));
         }
         sprintf(pServerPath, "%s\\%s\\%s\\%s\\%s", "LINK", pGlassData->m_strEquipID,
            strGlassIDLevel5th.GetBuffer(0),
            strGlassIDLevel8th.GetBuffer(0),
            strGlassID.GetBuffer(0));
         sprintf(pLocalPath, "%s", pGlassData->m_strPath);
         sprintf(pServerFile, "%s", strFileName.GetBuffer(0));
         sprintf(pLocalFile, "%s", strFileName.GetBuffer(0));
      }
      break;
   }
}
CString CGlassRawCPJT::GetDefectInfoToString(emDefectMemberType nDefectInfoType, int nParam)
{
   CString sStr;
   switch(nDefectInfoType)
   {
   case DMT_DefectJudge:// Judge
      {
         switch (nParam)
         {
         case Judge_OK:         sStr.Format("OK");
            break;
         case Judge_RP:         sStr.Format("RP");
            break;
         case Judge_NG:         sStr.Format("NG");
            break;
         case Judge_TR:         sStr.Format("TR");
            break;
         case Judge_PR:         sStr.Format("PR");
            break;
         case Judge_PT:         sStr.Format("PT");
            break;
         case Judge_Review:      sStr.Format("RV");
            break;
         case Judge_RC:         sStr.Format("RC");
            break;
         case Judge_Size:      sStr.Format("SZ");
            break;
         case Judge_VI:         sStr.Format("VI");
            break;
         case Judge_Rework:      sStr.Format("RW");
            break;
         case Judge_Unknown:      sStr.Format("OK");//sStr.Format("Unknown");   //Unknown도 ì¼ë‹¨ OK
            break;
         default:            sStr.Format("OK");//sStr.Format("Ets");
            break;
         }
      }
      break;
   case DMT_DefectSizeType:
      {
         sStr = "S";
         switch(nParam)
         {
            //case SizeType_Unknown:    sStr.Format("U");   break;
         case 1/*SizeType_Small*/:    sStr.Format("S");
            break;
         case 2/*SizeType_Mid*/:       sStr.Format("M");
            break;
         case 3/*SizeType_Large*/:    sStr.Format("L");
            break;
         case 4/*SizeType_Huge*/:       sStr.Format("O");
            break;
            //case SizeType_Ultra:    sStr.Format("Ultra");      break;
            //default:             sStr.Format("Ets");      break;
         }
      }
      break;
   }
   return sStr;
}
CString CGlassRawCPJT::GetWsiDefectType(int nType)
{
   CString strDefectType=_T("");
   switch (nType)
   {
   case 0:       strDefectType.Format("normal");
      break;
   case 1:       strDefectType.Format("metal");
      break;
   case 2:       strDefectType.Format("huge");
      break;
   case 3:       strDefectType.Format("diffuse");
      break;
   case 4:       strDefectType.Format("trashy");
      break;
   }
   return strDefectType;
}