SDC C-Project CF Review 프로그램
ReviewHistory/ReveiwHistory/akDefectFormation.h
»õ ÆÄÀÏ
@@ -0,0 +1,431 @@
#pragma once
#include <vector>
#include "Singleton.h"
struct _DefectDisplayOption //그냥 ì—¬ê¸°ì— ë§Œë“¤ìž..;; í•´ë” í•˜ë‚˜ë” íŒŒê¸° ê·€ì°¬..
{
   _DefectDisplayOption()
   {
      m_bShowDefectNormal = TRUE;
      m_bShowDefectGroupRound = TRUE;
      m_bShowDefectGroupLine = TRUE;
      m_bShowNoFilteredDefect = FALSE;
      m_nShowLabel = -1;
      m_nShowSize = 0;
   }
   BOOL m_bShowDefectNormal;
   BOOL m_bShowDefectGroupRound;
   BOOL m_bShowDefectGroupLine;
   BOOL m_bShowNoFilteredDefect;
   int m_nShowLabel; // 0보다 ìž‘으면 ëª¨ë‘ ë³´ê¸°
   int m_nShowSize; //해당값보다 ìž‘거나 ê°™ìœ¼ë©´ ì œê±°
};
struct _akDefect
{
   int nDefectID;
   double dPositionX;
   double dPositionY;
   int nLabel;
   int nSize; //
   int nType;//0:black defect, 1:white defect
   int nGraySrc;
   int nGrayTar;
   int nGrayDiff;
   int nFilter;//1이면 ì œì™¸
   //("SIZE_S");
   //("SIZE_W");
   //("SIZE_L");
   //("SIZE_H");
   //("DEFECT_CODE");
   //("DEF_AVG_1");
   //("REF_AVG_1");
   //("REF_GRAY_1");
   //("MASK_DEFECT");
   //("COMMON_DEFECT");
   //("XY_RATIO");
   //("CAM_NUM");
   //("LAMP_VALUE");
   CString m_strInfos[16];
   short         m_nDefectID;
   short         m_nCameraID;
   short         m_nScanIdx;
   //short         m_nDefectIdx;            // ì¹´ë©”라에서의 ê²°í•¨ ì¸ë±ìФ
   int            m_nDefectIdx;            // ì¹´ë©”라에서의 ê²°í•¨ ì¸ë±ìФ 201207 CJH - ìžë¦¿ ìˆ˜ ë„˜ì¹¨. int형으로 ë³€ê²½
   int            m_nPixelConv;            // pixel ë‹¨ìœ„ ì¢Œí‘œ
   int            m_nPixelScan;            // pixel ë‹¨ìœ„ ì¢Œí‘œ
   short                     m_nPixelSize;            // ê²°í•¨í¬ê¸°      ---------------------------------PS
   short/*SERVER_DefectType*/      m_DefectType;            // ê²°í•¨ íƒ€ìž…   ---------------------------------DT
   short/*SERVER_DefectSubType*/   m_DefectSubType;         // ê²°í•¨ì˜ íŒì •상태.
   short/*SERVER_DefectBDType*/   m_DefectBDType;            // ê²°í•¨ íƒ€ìž… - Bright, Dark, Both
   short         m_sPixelWidth;            // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë„ˆë¹„
   short         m_sPixelHeight;            // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë†’이
   short         m_nLevelSrcMin;            // ê²°í•¨ ë°ê¸° Min   -----------------------------SN
   short         m_nLevelSrcMax;            // ê²°í•¨ ë°ê¸° Max   -----------------------------SX
   short         m_nLevelSrcAvg;            // ê²°í•¨ ë°ê¸° Avg   -----------------------------SA
   short         m_nLevelRefMin;            // ë¹„교대상 ë°ê¸° Min   -------------------------RN
   short         m_nLevelRefMax;            // ë¹„교대상 ë°ê¸° Max   -------------------------RX
   short         m_nLevelRefAvg;            // ë¹„교대상 ë°ê¸° Avg   -------------------------RA
   short         m_nLevelDiffMin;         // ë¹„교차 Min   ---------------------------------DN
   short         m_nLevelDiffMax;         // ë¹„교차 Max   ---------------------------------DX
   short         m_nLevelDiffAvg;         // ë¹„교차 Avg   ---------------------------------DA
   int            m_nDefectRScale;         // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë†’이   -------------------------RS
   short         m_sThreshold;            // ê²°í•¨ì„ ê²€ì¶œí•  ë•Œì˜ Threshold
   short         m_sThresholdAvg;         // ê²°í•¨ì„ ê²€ì¶œí•  ë•Œì˜ Threshold AVG
   short         m_sDefectPeak;            // ê²°í•¨ì˜ Peak.
   short         m_sDefectLevel;            // (DiffAvg - Th) BOE 8G ìš”청사항
   int            m_nPixelGlassStart;         // Glass ì‹œìž‘ í”½ì…€
   short         m_sDefectLoc;
   short         m_sZonePixelCount[16];   // Zone별 ê²°í•¨ Pixel ìˆ˜
   short         m_sZoneValueMin[16];   // Zone별 ê²°í•¨ Min
   short         m_sZoneValueMax[16];   // Zone별 ê²°í•¨ Max
   short         m_sZoneValueAvg[16];   // Zone별 ê²°í•¨ Avg
   short         m_sZonePixelPercent[16];   // --------------------------------------Z0~ZF
   //210127 CJH - Zone별 Source Gray ìž…ë ¥
   short         m_sZoneValueSrcMin[16];   // Zone별 Source Min
   short         m_sZoneValueSrcMax[16];   // Zone별 Source Max
   short         m_sZoneValueSrcAvg[16]; // Zone별 Source Avg
   int            m_nUMOriginX;            // um단위 x좌표 (원점기준)
   int            m_nUMOriginY;            // um단위 y조표 (원점기준)
   int            m_nUMCenterAlignX;         // um단위 X좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • í›„)
   int            m_nUMCenterAlignY;         // um단위 Y좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • í›„)
   int            m_nUMCenterX;            // um단위 X좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • ì „)
   int            m_nUMCenterY;            // um단위 Y좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • ì „)
   int            m_nUMSizeX;               // um단위 X í¬ê¸°   -----------------------------UX
   int            m_nUMSizeY;               // um단위 Y í¬ê¸°   -----------------------------UY
   int            m_nUMSize;               // um단위 í¬ê¸°.
   CRect         m_RectUM;               // ë””펙 ì„¼í„° ê¸°ì¤€ ì‚¬ê°í˜•.
   short/*SERVER_DefectSizeType*/   m_DefectSizeType;         // ê²°í•¨ í¬ê¸° ì¢…류enum SERVER_DefectSizeType      { SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
   short/*SERVER_DefectPeakType*/   m_DefectPeakType;         // Peak의 ì¢…류.
   short/*Judgement*/            m_DefectJudgement;         // ê²°í•¨ íŒì •.
   BOOL               m_bDefectCutoff;         // ì»· ì˜¤í”„ ë””펙(TRUE= Cutoff, FALSE)
   short/*MAP16_DefectClass*/      m_DefectClass;            // BOE Defect Class 16등분 êµ¬ë¶„
   int            m_nPadRegionIdx;         // PAD ì˜ì—­ ì¸ë±ìФ
   int            m_nUMCellX;               // ì…€ ì›ì  ê¸°ì¤€ x ì¢Œí‘œ
   int            m_nUMCellY;               // ì…€ ì›ì  ê¸°ì¤€ y ì¢Œí‘œ
   short         m_nModelIdx;            // ëª‡ ë²ˆì§¸ ëª¨ë¸ì¸ê°€?
   short         m_nCellIdx;               // ëª‡ë²ˆì§¸ ì…€ì¸ê°€?
   short         m_nCellGate;            // ì…€ë³„ Gate라인(얼라인 ë³´ì • ì „)
   short         m_nCellData;            // ì…€ë³„ Data라인(얼라인 ë³´ì • ì „)
   short         m_nCellGateAlign;         // ì…€ë³„ Gate라인(얼라인 ë³´ì • í›„)
   short         m_nCellDataAlign;         // ì…€ë³„ Data라인(얼라인 ë³´ì • í›„)
   int            m_nUMShotX;               // ìƒ· ê¸°ì¤€ X좌표
   int            m_nUMShotY;               // ìƒ· ê¸°ì¤€ Y좌표
   short         m_nMaskDefectIdx;         // í•œ Glass에서 ë°œê²¬ëœ ë§ˆìŠ¤í¬ê²°í•¨ ë¬¶ìŒì˜ ì¸ë±ìФ.
   short         m_nShotIdx;               // ë…¸ê´‘샷 ë²ˆí˜¸
   short         m_nMatchShotCount;         // ë™ì¼í•œ ë§ˆìŠ¤í¬ ê²°í•¨ì˜ ìˆ˜.
   short         m_nMatchMaxSize;         // ë™ì¼í•œ ë§ˆìŠ¤í¬ ì¤‘ ê°€ìž¥ í° ê²°í•¨ì˜ í¬ê¸°.
   short         m_nRepeatCount;            // ì—°ì†ê²°í•¨ë°œê²¬ìœ„한 ë™ì¼ì¢Œí‘œ ë°˜ë³µìˆ˜
   short         m_nMaskRepeatCount;
   int            m_StackInfo;            // Stack Flag
   BOOL         m_bRealStack;            // Stack ë¨¸ì§€ì— ì˜í•œ TD(TRUE) ì¸ì§€, í•„터링에 ì˜í•œ TD(FALSE)구분할 ìˆ˜ ìžˆë‹¤.
   short         m_nStackStepCount;         // Stack ìˆ˜
   short         m_nStackColorIdx;         // Color를 ì„ íƒí•˜ëŠ” ì¸ë±ìФ.
   //CString         m_strStackStep[CFDEFECT_STACKCOUNT];         // Stack Step.
   char         m_strStackFirst[60];         // Stack Step. //201221 CJH - ìµœëŒ€ ì‚¬ì´ì¦ˆ 60bytes
   char         m_strUnitID[16];            // ìœ ë‹›ì•„이디
   int            m_ClassificationType;            // enum ClassificationType         { ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI나 TFE등 ì¶”ê°€ ë¶„류  ì•Œê³ ë¦¬ì¦˜ ì ìš© ê²°ê³¼.
   int            m_nAtomWidth;            // TFE í•µ ë„ˆë¹„
   int            m_nAtomHeight;            // TFE í•µ ë†’이
   short/*ReKind*/         m_DefectKind;            // ê²°í•¨ ì¢…류
   char         m_strDefectCode[32];         // Defect Code
   BOOL         m_bMergeState;            // Merge Status
   char         m_strAoiImageName[256];         // Defect Image Name(CCD Image)
   CString         m_strReviewImageName;
   int            m_nDefectMerge;      // í˜„재 ë””펙의 ë¨¸ì§€ ì—¬ë¶€
   int            m_nPixelSizeOrigin;
   int            m_nScratchRatio;
   int            m_nDensity;         // ì›í˜• ê²°í•¨ êµ¬ë¶„을 ìœ„한 ë°€ë„ [2017.8.2 bhs]
   char         m_strDefectName[16];
   char         m_strDefectType[16];
   double         m_dScanResolution;
   double         m_dConvResolution;
   int            m_nAngle;               // ê°ë„
   int            m_nMajor;               // ìž¥ì¶• ê¸¸ì´(Long)
   int            m_nMinor;               // ë‹¨ì¶• ê¸¸ì´(Short)
   int            m_nCompact;               // Blob ìž¥ì¶•을 ì§€ë¦„으로 í•˜ëŠ” ì›ì˜ ë„“이와 Blob ë„“이의 ë¹„율
   int            m_nThickness;            // Blob ë„“이와 ìž¥ì¶•의 ë¹„율 (Area / Major)
   short         m_nHliLevelIdx;            // ëª‡ ë²ˆì§¸ ë ˆë²¨(채널)인가?
   int            m_nHliLayers;            // í•´ë‹¹ê²°í•¨ì— í¬í•¨ëœ ë ˆì´ì–´ bit처리
   BOOL         m_bShrinked;            //210323 CJH - Frame Shrink ì •ë³´ ì¶”ê°€
};
struct _akModule
{
   int            m_nModuleIndex;
   int            m_nUMShotX;               // ìƒ· ê¸°ì¤€ X좌표
   int            m_nUMShotY;               // ìƒ· ê¸°ì¤€ Y좌표
   int            m_nShotIndex;
};
struct _akShort
{
   int            m_nUMShotX;               // ìƒ· ê¸°ì¤€ X좌표
   int            m_nUMShotY;               // ìƒ· ê¸°ì¤€ Y좌표
   int            m_nShotIndex;
};
struct _akReviewList
{
   short         m_nDefectID;
   int            m_nDefectIdx;            // ì¹´ë©”라에서의 ê²°í•¨ ì¸ë±ìФ 201207 CJH - ìžë¦¿ ìˆ˜ ë„˜ì¹¨. int형으로 ë³€ê²½
   int            m_nReviewIdx;
   char         m_strAoiImageName[256];         // Defect Image Name(CCD Image)
   CString         m_strReviewImageName;
   CString         m_strGlassID;
   char         m_strAoiImagePath[256];
   char         m_strReviewImagePath[256];
   char         m_strAlignFirst[64];
   char         m_strAlignSecond[64];
   CString m_strInfos[16];
};
struct _akGlassInfo
{
   int            m_nGlassSelect;
   CString         m_strPPID;
   CString         m_strGlassID;
   int            m_nDefectNum;
   int            m_nReviewNum;
   CString         m_strGlassJudge;
   CString         m_strLotID;
   CString         m_strSLotID;
   int            m_nSlot_No;
   int            m_nCellNum;
   int            m_nGlassSizeHeight;
   int            m_nGlassSizeWidth;
   CString m_strInfos[16];
};
struct _akReviewHeader
{
   short         m_nDefectID;
   int            m_nDefectIdx;
   CString         m_strGlassID;
   CString         m_strPPID;
   int            m_nReviewIdx;
   CString         m_strJudge;
   CString         m_strFileTime;
   CString         m_strFileName;
   CString         m_strLoading;
   CString         m_strFilePath;
   CString m_strInfos[16];
};
struct _akFormation
{
   _akFormation()
   {
      m_nFormLabel = -1;
      m_nFormType = 0;
      m_dRectLeft = 0;
      m_dRectTop = 0;
      m_dRectRight = 0;
      m_dRectBottom = 0;
   }
   void MergeDefect(_akDefect* pDefect)
   {
      if (!m_vecForms.empty())
      {
         if(m_dRectLeft > pDefect->dPositionX) m_dRectLeft = pDefect->dPositionX;
         if(m_dRectRight < pDefect->dPositionX) m_dRectRight = pDefect->dPositionX;
         if (m_dRectTop > pDefect->dPositionY) m_dRectTop = pDefect->dPositionY;
         if (m_dRectBottom < pDefect->dPositionY) m_dRectBottom = pDefect->dPositionY;
      }
      else
      {
         m_dRectRight = m_dRectLeft = pDefect->dPositionX;
         m_dRectTop = m_dRectBottom = pDefect->dPositionY;
      }
      m_vecForms.push_back(pDefect);
   }
   void AnalysisDefectInfo()
   {
      m_nDefectNumS=0;
      m_nDefectNumM=0;
      m_nDefectNumL=0;
      m_nDefectNum1Px=0;
      m_nDefectNumWhite=0;
      m_nDefectNumBlack=0;
      m_nDefectNum1PxWhite = 0;
      m_dSizeAvg = 0;
      m_dSizeStdDev = 0;
      m_dDiffStdDev = 0;
      m_dDiffStdDevAbs = 0;
      double dDiffAvg=0;
      double dDiffAvgAbs=0;
      _akDefect* pDefect;
      for (int i = 0; i < m_vecForms.size(); i++)
      {
         pDefect = m_vecForms[i];
         if (pDefect->nSize >= 5) m_nDefectNumL++;
         else if (pDefect->nSize >= 2) m_nDefectNumM++;
         else if (pDefect->nSize >= 0) m_nDefectNumS++;
         if (pDefect->nSize == 1) m_nDefectNum1Px++;
         if (pDefect->nType == 1) m_nDefectNumWhite++;
         else m_nDefectNumBlack++;
         if (pDefect->nType == 1 && pDefect->nSize == 1) m_nDefectNum1PxWhite++;
         m_dSizeAvg += (double)pDefect->nSize;
         dDiffAvg += (double)pDefect->nGrayDiff;
         dDiffAvgAbs += abs((double)pDefect->nGrayDiff);
      }
      m_dSizeAvg /= m_vecForms.size();
      dDiffAvg /= m_vecForms.size();
      dDiffAvgAbs /= m_vecForms.size();
      for (int i = 0; i < m_vecForms.size(); i++)
      {
         pDefect = m_vecForms[i];
         double dDiff = m_dSizeAvg - m_vecForms[i]->nSize;
         m_dSizeStdDev += dDiff * dDiff;
         dDiff = dDiffAvg - m_vecForms[i]->nGrayDiff;
         m_dDiffStdDev += dDiff * dDiff;
         dDiff = dDiffAvgAbs - abs((double)pDefect->nGrayDiff);
         m_dDiffStdDevAbs += dDiff * dDiff;
      }
      m_dSizeStdDev = sqrt(m_dSizeStdDev / (double)m_vecForms.size());
      m_dDiffStdDev = sqrt(m_dDiffStdDev / (double)m_vecForms.size());
      m_dDiffStdDevAbs = sqrt(m_dDiffStdDevAbs / (double)m_vecForms.size());
      int nFilter = FALSE;
      {
         double d1PxRate = 100.0*((double)m_nDefectNum1Px / (double)m_vecForms.size());
         double d1PxWhiteRate = 100.0*((double)m_nDefectNum1PxWhite/(double)m_vecForms.size());
         if (m_nFormType == 0 && d1PxWhiteRate > 50)
         {
            nFilter = TRUE;
         }
         if (m_nFormType == 1 && d1PxWhiteRate > 30)
         {
            nFilter = TRUE;
         }
         if (m_dSizeStdDev == 0)
         {
            nFilter = TRUE;
         }
         if(d1PxRate>50)
         {
            nFilter = TRUE;
         }
      }
      if (nFilter)
      {
         for (int i = 0; i < m_vecForms.size(); i++)
         {
            pDefect = m_vecForms[i];
            pDefect->nFilter = 1;
         }
      }
      m_nFormJudge = nFilter;
   }
   std::vector<_akDefect*> m_vecForms;
   int m_nFormJudge; //0:Normal, 1:Nodefect
   int m_nFormLabel;
   int m_nFormType; //-1:none, 0:round, 1:line
   double m_dRectLeft;
   double m_dRectTop;
   double m_dRectRight;
   double m_dRectBottom;
   //분석 ë°ì´í„°ë“¤ [김태현2021/2/22]
   double m_dSizeAvg;
   double m_dSizeStdDev;
   int m_nDefectNumS;
   int m_nDefectNumM;
   int m_nDefectNumL;
   int m_nDefectNum1Px;
   int m_nDefectNumWhite;
   int m_nDefectNumBlack;
   int m_nDefectNum1PxWhite;
   double m_dDiffStdDev;      //그레이 ì°¨ì´ í‘œì¤€íŽ¸ì°¨
   double m_dDiffStdDevAbs;   //그레이 ì°¨ì´ ì ˆëŒ€ê°’ í‘œì¤€íŽ¸ì°¨
};
class akDefectFormation : public CSingleton< akDefectFormation >
{
public:
   akDefectFormation();
   virtual ~akDefectFormation();
public:
   void Clear();
   void AddDefect(double dPosX, double dPosY);
   void AddDefectTemp(double dPosX, double dPosY);
   void AddDefect2();
   void AddDefectImageTemp();
   void AddDefectImage();
   void AddGlassInfo();
   void AddDefectHeaderTemp();
public:
   std::vector<_akDefect> m_vecDefects;
   std::vector<_akDefect> m_vecTempDefects;
   std::vector<_akFormation> m_vecFormation;
   std::vector<_akReviewList> m_vecImage;
   std::vector<_akReviewList> m_vecTempImage;
   std::vector<_akReviewHeader> m_vecHeader;
   std::vector<_akReviewHeader> m_vecHeaderTemp;
   std::vector<_akGlassInfo> m_vecGlassInfo;
   std::vector<_akDefect> m_vecPath1;
   std::vector<_akDefect> m_vecPath2;
   std::vector<_akDefect> m_vecPath3;
   std::vector<_akDefect> m_vecPath4;
   std::vector<_akDefect> m_vecPath5;
   std::vector<_akDefect> m_vecPath6;
public:
   std::vector< std::vector<_akDefect > > m_vecMoudle;
};