From 12c02f064db12d6d94063bf6dd9e4eb80f4252b8 Mon Sep 17 00:00:00 2001
From: LYW <leeyeanwoo@diteam.co.kr>
Date: 월, 11 10월 2021 15:30:00 +0900
Subject: [PATCH] Ongoing60 #3662 CF AOI Review 전설비 알람 발생 조치 - Review History File Mapping 해제 - Review Inner History 다운 현상 예외처리 추가 - Review End 시 Review 다운 현상 예외처리 추가

---
 ReviewHistory/ReveiwHistory/akDefectFormation.h |  431 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 431 insertions(+), 0 deletions(-)

diff --git a/ReviewHistory/ReveiwHistory/akDefectFormation.h b/ReviewHistory/ReveiwHistory/akDefectFormation.h
new file mode 100644
index 0000000..56533b9
--- /dev/null
+++ b/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;
+};
+
+

--
Gitblit v1.9.3