From 1e64f6279358f5c838463497894e020857b37311 Mon Sep 17 00:00:00 2001
From: LYW <leeyeanwoo@diteam.co.kr>
Date: 화, 21 12월 2021 09:37:24 +0900
Subject: [PATCH] Ongoing90 #3835 CF AOI Review Offset Grid 클릭시 해당 되는 결함 DefectMap표시

---
 ReviewHistory/ReveiwHistory/akImageView.cpp |  524 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 524 insertions(+), 0 deletions(-)

diff --git a/ReviewHistory/ReveiwHistory/akImageView.cpp b/ReviewHistory/ReveiwHistory/akImageView.cpp
new file mode 100644
index 0000000..fda76d2
--- /dev/null
+++ b/ReviewHistory/ReveiwHistory/akImageView.cpp
@@ -0,0 +1,524 @@
+#include "stdafx.h"
+#include "akImageView.h"
+#include "akGraph/akGraphUtil.h"
+
+CakImageView::CakImageView()
+{
+	SetReverseModeY(true);
+	{
+		CakGraphBase::setAK();
+		m_AxisX.m_Size = 80;
+		m_AxisX.m_TickGabStep = 1;
+		m_AxisX.m_MinorTickNum = 4;
+		m_AxisY.m_MinorTickNum = 4;
+		//m_AxisX.m_TickGabPixel = 30;
+		//m_AxisX.m_FontTick.DeleteObject();
+		//m_AxisX.m_FontTick.CreatePointFont(120, _T("Tahoma"));
+		//m_AxisX.SetRotateFont(&m_AxisX.m_FontTick, 270);
+		m_AxisY.SetRotateFont(&m_AxisY.m_FontTick, 90);
+		m_AxisY2.SetRotateFont(&m_AxisY2.m_FontTick, 270);
+		SetClossLine(false);
+		SetDragStyle(DS_All_HOR);
+		m_bGrid = false;
+
+		m_AxisY.m_TickGabPixel = 70;
+		m_AxisX.m_Size = 20;
+		m_AxisY.m_Size = 20;
+		m_AxisY2.m_Size = 20;
+		m_Title.m_Size = 20;
+
+		m_AxisX.m_strTitle = "";
+		m_AxisY.m_strTitle = "";
+		m_Title.m_strTitle = "  ";
+
+		m_MouseMoveInfo.m_nType = 0;
+	}
+}
+
+
+CakImageView::~CakImageView()
+{
+}
+
+void CakImageView::RenderSeries(Graphics* grfx, CDC* pDC)
+{
+	RenderImage(grfx, pDC);
+}
+
+void CakImageView::SetAutoScale()
+{
+	CakGraphBasic3::SetAutoScale();
+
+	if (1)//글라스 크기 및 그리기 방향 결정 태현[2016/3/23]
+	{
+		double nGlassSizeX = 2400;
+		double nGlassSizeY = 2048;
+
+		if (!m_vecImageData.empty())
+		{
+			nGlassSizeX = m_vecImageData[0]->m_Bits.bmWidth;
+			nGlassSizeY = m_vecImageData[0]->m_Bits.bmHeight;
+		}
+
+		double dWindowRate = (double)m_rectData.Width() / (double)m_rectData.Height();
+		double dValueRate = (double)nGlassSizeX / (double)nGlassSizeY;
+
+		if (dWindowRate < dValueRate)//가로풀 기준 태현[2016/3/25]
+		{
+			m_AxisX.m_RangeValueMin = 0;
+			m_AxisX.m_RangeValueMax = nGlassSizeX;
+			m_AxisY.m_RangeValueMin = 0;
+			m_AxisY.m_RangeValueMax = (float)nGlassSizeX*((float)m_rectData.Height() / (float)m_rectData.Width());
+			m_AxisY.SetRangePos(nGlassSizeY / 2);
+		}
+		else //세로풀기준 태현[2016/3/25]
+		{
+
+			m_AxisX.m_RangeValueMin = 0;
+			m_AxisX.m_RangeValueMax = (float)nGlassSizeY*((float)m_rectData.Width() / (float)m_rectData.Height());
+			m_AxisY.m_RangeValueMin = 0;
+			m_AxisY.m_RangeValueMax = nGlassSizeY;
+
+			m_AxisX.SetRangePos(nGlassSizeX / 2);
+		}
+
+		//0,0이 중앙에 오도록 [김태현2021/2/16]
+		m_AxisX.SetRangePos(0);
+		m_AxisY.SetRangePos(0);
+	}
+}
+
+void CakImageView::SetResize()
+{
+	double dPosOldX = m_AxisX.m_RangeValueMin + m_AxisX.GetRangeValue() / 2.0;
+	double dPosOldY = m_AxisY.m_RangeValueMin + m_AxisY.GetRangeValue() / 2.0;
+	CakGraphBasic3::SetAutoScale();
+
+	if (1)//글라스 크기 및 그리기 방향 결정 태현[2016/3/23]
+	{
+		double nGlassSizeX = 2400;
+		double nGlassSizeY = 2048;
+
+		if (!m_vecImageData.empty())
+		{
+			nGlassSizeX = m_vecImageData[0]->m_Bits.bmWidth;
+			nGlassSizeY = m_vecImageData[0]->m_Bits.bmHeight;
+		}
+
+		double dWindowRate = (double)m_rectData.Width() / (double)m_rectData.Height();
+		double dValueRate = (double)nGlassSizeX / (double)nGlassSizeY;
+
+		//double dPosOldX = m_AxisX.m_RangeValueMin + m_AxisX.GetRangeValue() / 2.0;
+		//double dPosOldY = m_AxisY.m_RangeValueMin + m_AxisY.GetRangeValue() / 2.0;
+		if (dWindowRate < dValueRate)//가로풀 기준 태현[2016/3/25]
+		{
+			m_AxisX.m_RangeValueMin = 0;
+			m_AxisX.m_RangeValueMax = nGlassSizeX;
+			m_AxisY.m_RangeValueMin = 0;
+			m_AxisY.m_RangeValueMax = (float)nGlassSizeX*((float)m_rectData.Height() / (float)m_rectData.Width());
+			m_AxisY.SetRangePos(nGlassSizeY / 2);
+
+
+		}
+		else //세로풀기준 태현[2016/3/25]
+		{
+
+			m_AxisX.m_RangeValueMin = 0;
+			m_AxisX.m_RangeValueMax = (float)nGlassSizeY*((float)m_rectData.Width() / (float)m_rectData.Height());
+			m_AxisY.m_RangeValueMin = 0;
+			m_AxisY.m_RangeValueMax = nGlassSizeY;
+
+			m_AxisX.SetRangePos(nGlassSizeX / 2);
+		}
+
+		m_AxisX.SetRangePos(dPosOldX);
+		m_AxisY.SetRangePos(dPosOldY);
+	}
+}
+
+void CakImageView::RenderImage(Graphics* grfx, CDC* pDC)
+{
+	if (m_vecImageData.empty()) return;
+
+	//pDC->SetStretchBltMode(HALFTONE); //<-- 최대 확대시 그리는 시간 과다 소요
+	pDC->SetStretchBltMode(COLORONCOLOR);// <--최대 확대시 이미지 표시 안됨
+
+
+	CRgn rgn;
+	rgn.CreateRectRgnIndirect(CakRectToCRect(m_rectData));
+	pDC->SelectClipRgn(&rgn);
+
+	CBitmap* pOldBitmap;
+	CDC BitmapDC;
+	BitmapDC.CreateCompatibleDC(pDC);
+
+	_DataImage2* pImageData;
+
+	double dAlignX, dAlignY;
+	for (int i = 0; i < m_vecImageData.size(); i++)
+	{
+		dAlignX = dAlignY = 0;
+
+		int x1, x2, y1, y2;
+		pImageData = m_vecImageData[i];
+		x1 = pImageData->m_nDrawPosX-dAlignX;
+		y1 = pImageData->m_nDrawPosY-dAlignY;
+		x2 = pImageData->m_nDrawPosX + pImageData->m_Bits.bmWidth;
+		y2 = pImageData->m_nDrawPosY + pImageData->m_Bits.bmHeight;
+
+
+		CakRect rectImage(x1, y1, x2, y2);
+
+
+		CakRect rectOutRangeTemp, rectOutRange;
+		rectOutRangeTemp.left = m_AxisX.m_RangeValueMin;
+		rectOutRangeTemp.right = ceil(m_AxisX.m_RangeValueMax);
+		rectOutRangeTemp.top = m_AxisY.m_RangeValueMin;
+		rectOutRangeTemp.bottom = ceil(m_AxisY.m_RangeValueMax);
+
+		if (rectOutRange.IntersectRect(&rectOutRangeTemp, &rectImage) == FALSE)
+		{
+			continue;
+		}
+
+		pOldBitmap = BitmapDC.SelectObject(&pImageData->m_Bitmap);
+
+		/*< LYW 20211018 - #3684 MOD Start >*/
+		m_dOnePixelX =  m_AxisX.GetRangeValue() / (double)m_rectData.Width();
+		m_dOnePixelY =  m_AxisY.GetRangeValue() / (double)m_rectData.Height();
+		/*< LYW 20211018 - #3684 MOD End >*/
+		/*< Origin Code >*/
+		//double dOnePixelX = (double)m_rectData.Width() / m_AxisX.GetRangeValue();
+		//double dOnePixelY = (double)m_rectData.Height() / m_AxisY.GetRangeValue();
+
+		if (1)//dOnePixelX > 2 && dOnePixelY > 2)
+		{
+			CakRect rectDraw;
+			rectDraw.set(
+				GetWindowPosX(rectOutRange.left),
+				GetWindowPosY(rectOutRange.top),
+				GetWindowPosX(rectOutRange.right),
+				GetWindowPosY(rectOutRange.bottom)
+			);
+			CakRect rectImage;
+			rectImage.set(
+				rectOutRange.left - x1,
+				rectOutRange.top - y1,
+				rectOutRange.right - x1,
+				rectOutRange.bottom - y1
+			);
+
+			if (m_bReverseY == FALSE)
+			{
+				AKSWAP_INT(rectDraw.top, rectDraw.bottom);
+				rectImage.top = pImageData->m_Bits.bmHeight - rectOutRange.bottom + y1;
+				rectImage.bottom = rectImage.top + rectOutRange.getHeight();
+			}
+			if (m_bReverseX == TRUE)
+			{
+				AKSWAP_INT(rectDraw.left, rectDraw.right);
+				rectImage.left = pImageData->m_Bits.bmWidth - rectOutRange.right + x1;
+				rectImage.right = rectImage.left + rectOutRange.getWidth();
+			}
+
+
+			pDC->StretchBlt(rectDraw.left, rectDraw.top, rectDraw.Width(), rectDraw.Height(), &BitmapDC,
+				rectImage.left, rectImage.top,
+				rectImage.getWidth(), rectImage.getHeight(), SRCCOPY);
+
+		}
+		else
+		{
+			//좌표축 그대로 그릴때 [김태현 2018/12/10]
+			/*pDC->StretchBlt(GetWindowPosX(x1), GetWindowPosY(y1), GetWindowPosX(x2)-GetWindowPosX(x1),GetWindowPosY(y2)-GetWindowPosY(y1), &BitmapDC,
+				0, 0,
+				pImageData->m_Bits.bmWidth, pImageData->m_Bits.bmHeight, SRCCOPY);*/
+			pDC->StretchBlt(GetWindowPosX(x1), GetWindowPosY(y1), GetWindowPosX(x2) - GetWindowPosX(x1), GetWindowPosY(y2) - GetWindowPosY(y1), &BitmapDC,
+				0, 0,
+				pImageData->m_Bits.bmWidth, pImageData->m_Bits.bmHeight, SRCCOPY);
+		}
+
+
+		BitmapDC.SelectObject(pOldBitmap);
+		continue;
+
+	}
+
+	BitmapDC.DeleteDC();
+
+
+	if(m_vecImageData.empty() == FALSE)
+	{
+		
+		pImageData = m_vecImageData[0];
+		
+
+		double nGlassSizeX = pImageData->m_Bits.bmWidth;
+		double nGlassSizeY = pImageData->m_Bits.bmHeight;
+
+
+		CBrush BrushGlass, *pOldBrush;
+		BrushGlass.CreateSolidBrush(RGB(255, 255, 255));
+
+
+		CakRectd rectGlass;
+		rectGlass.set(0, 0, nGlassSizeX, nGlassSizeY);
+		rectGlass.MoveToXY(-nGlassSizeX / 2, -nGlassSizeY / 2);
+
+		//글라스 외각선 그리기 태현[2016/3/23]
+		{
+			pOldBrush = (CBrush*)pDC->SelectObject(&BrushGlass);
+			CPen pen, CenterLinePen;
+			pen.CreatePen(PS_SOLID, 1, RGB(64, 191, 79));
+			/*< LYW 20211029 - #3684 ADD Start >*/
+			CenterLinePen.CreatePen(PS_DOT, 1, RGB(255, 0, 0));
+			/*< LYW 20211029 - #3684 ADD End >*/
+			pDC->SelectObject(&pen);
+
+			pDC->MoveTo(GetWindowPosX(rectGlass.left), GetWindowPosY(rectGlass.top));
+			pDC->LineTo(GetWindowPosX(rectGlass.right), GetWindowPosY(rectGlass.top));
+			pDC->LineTo(GetWindowPosX(rectGlass.right), GetWindowPosY(rectGlass.bottom));
+			pDC->LineTo(GetWindowPosX(rectGlass.left), GetWindowPosY(rectGlass.bottom));
+			pDC->LineTo(GetWindowPosX(rectGlass.left), GetWindowPosY(rectGlass.top));
+
+			/*< LYW 20211029 - #3684 ADD Start >*/
+			pDC->SelectObject(&CenterLinePen);
+			pDC->MoveTo(GetWindowPosX((rectGlass.left + rectGlass.right) / 2), GetWindowPosY(rectGlass.top));
+			pDC->LineTo(GetWindowPosX((rectGlass.left + rectGlass.right) / 2), GetWindowPosY(rectGlass.bottom));
+			pDC->MoveTo(GetWindowPosX(rectGlass.left), GetWindowPosY((rectGlass.top + rectGlass.bottom) / 2));
+			pDC->LineTo(GetWindowPosX(rectGlass.right), GetWindowPosY((rectGlass.top + rectGlass.bottom) / 2));
+			/*< LYW 20211029 - #3684 ADD End >*/
+			
+			pDC->SelectObject(&pOldBrush);
+
+		}
+	}
+	pDC->SelectClipRgn(NULL);	
+
+	//DrawROIRect(pDC);
+}
+
+void CakImageView::OnMouseInput(akMouseEvent mouseevent, CPoint point)
+{
+	CakGraphBasic3::OnMouseInput(mouseevent, point);
+
+	switch (mouseevent)
+	{
+	case MouseMove:
+	{
+		break;
+	}
+	case MouseLeftButtonDown:
+	{
+		if (point.x > -1 && point.x < GetScaleWidth() &&
+			point.y > -1 && point.y < GetScaleHeight())
+		{
+// 			if (m_rectTracker.HitTest(point) < 0)
+// 			{
+// 				// just to demonstrate CRectTracker::TrackRubberBand
+// 				if (m_rectTracker.TrackRubberBand(this, point, TRUE))
+// 				{
+// 					Invalidate();
+// 				}
+// 			}
+// 			else if (m_rectTracker.Track(this, point, TRUE))
+// 			{
+// 				Invalidate();
+// 			}
+		}
+
+		CRect rect;
+		this->GetClientRect(rect);
+		
+		/*< LYW 20211018 - #3684 ADD Start >*/
+		CPoint Center;
+		Center.x = rect.Width() / 2;
+		Center.y = rect.Height() / 2;
+		/*< LYW 20211018 - #3684 ADD End >*/
+
+		/*< LYW 20211018 - #3684 MOD Start >*/
+		point.x = (point.x - Center.x) * m_dOnePixelX;
+		point.y = (point.y - Center.y) * m_dOnePixelY;
+		/*< LYW 20211018 - #3684 MOD End >*/
+		/*< Origin Code >*/
+		GetParent()->PostMessage(UM_FORMMAP_IMAGEMOUSECLICK, static_cast<WPARAM>(0), MAKELPARAM(point.x, point.y));
+		/*m_pParentWnd->SendMessage(WM_LBUTTONDOWN, static_cast<WPARAM>(nFlags), MAKELPARAM(point.x, point.y));*/
+	}
+	break;
+	case MouseLeftButtonUp:
+	{
+		CRect rect;
+		this->GetClientRect(rect);
+
+		point.x += m_nHScroll;
+		point.y += m_nVScroll;
+	/*	m_pParentWnd->SendMessage(WM_LBUTTONUP, static_cast<WPARAM>(nFlags), MAKELPARAM(point.x, point.y));*/
+
+		if (GetTrackerRect(m_rtROIRect))
+		{
+			m_sROIInfo.nWidthPixel = m_rtROIRect.Width();
+			m_sROIInfo.nHeightPixel = m_rtROIRect.Height();
+			m_sROIInfo.dDiagonalPixel = sqrt(double(m_sROIInfo.nWidthPixel*m_sROIInfo.nWidthPixel + m_sROIInfo.nHeightPixel*m_sROIInfo.nHeightPixel));
+
+			m_sROIInfo.dWidthRealUM = m_sROIInfo.nWidthPixel * (m_dResolution / m_dWidthScale);
+			m_sROIInfo.dHeightRealUM = m_sROIInfo.nHeightPixel * (m_dResolution / m_dHeightScale);
+			m_sROIInfo.dDiagonalRealUM = sqrt((m_sROIInfo.dWidthRealUM*m_sROIInfo.dWidthRealUM) + (m_sROIInfo.dHeightRealUM*m_sROIInfo.dHeightRealUM));
+
+			Invalidate(TRUE);
+		}
+	}
+	break;
+	}
+}
+
+CakDataImage2::CakDataImage2(void)
+{
+}
+
+CakDataImage2::~CakDataImage2(void)
+{
+}
+
+int CakDataImage2::SetImageData(char* pFileName, int nImageIndex /*= 0*/)
+{
+	HBITMAP hBitmap = NULL;
+	hBitmap = (HBITMAP)LoadImage(NULL, pFileName, IMAGE_BITMAP, 0, 0,
+		LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
+
+	_DataImage2* pNewImage;
+
+	if (hBitmap)
+	{
+		pNewImage = new _DataImage2;
+
+		pNewImage->m_Bitmap.Attach(hBitmap);
+		pNewImage->m_Bitmap.GetBitmap(&pNewImage->m_Bits);
+		pNewImage->m_pBitmapData = (unsigned char*)pNewImage->m_Bits.bmBits;
+		pNewImage->m_nDrawPosX = -pNewImage->m_Bits.bmWidth / 2;
+		pNewImage->m_nDrawPosY = -pNewImage->m_Bits.bmHeight / 2;
+	}
+	else
+	{
+		CImage imgJPG;
+		HRESULT ret = imgJPG.Load(pFileName);
+		if (ret == S_OK)
+		{
+			pNewImage = new _DataImage2;
+			pNewImage->m_Bitmap.Attach(imgJPG.Detach());
+			pNewImage->m_Bitmap.GetBitmap(&pNewImage->m_Bits);
+			pNewImage->m_pBitmapData = (unsigned char*)pNewImage->m_Bits.bmBits;
+			pNewImage->m_nDrawPosX = -pNewImage->m_Bits.bmWidth / 2;
+			pNewImage->m_nDrawPosY = -pNewImage->m_Bits.bmHeight / 2;
+		}
+		else
+		{
+			return 0;
+		}
+	}	
+	
+	if (m_vecImageData.size() <= nImageIndex)
+	{
+		m_vecImageData.push_back(pNewImage);
+	}
+	else
+	{
+		_DataImage2* pDelImage = m_vecImageData[nImageIndex];
+		m_vecImageData[nImageIndex] = pNewImage;
+		pDelImage->m_Bitmap.DeleteObject();
+		delete pDelImage;
+	}
+	return 1;
+}
+
+int	CakDataImage2::GetScaleWidth()
+{
+	CRect rect;
+	int nWidth;
+
+	//GetClientRect(rect);
+	if (nWidth != 0)
+		m_dWidthScale = double(rect.Width()) / double(nWidth);
+	return int(double(nWidth) * m_dWidthScale + 0.5);
+}
+
+int	CakDataImage2::GetScaleHeight()
+{
+	CRect rect;
+	int nHeight;// = GetHeight();
+
+	//GetClientRect(rect);
+	if (nHeight != 0)
+		m_dHeightScale = double(rect.Height()) / double(nHeight);
+	return int(double(nHeight) * m_dHeightScale + 0.5);
+}
+
+BOOL CakDataImage2::GetTrackerRect(CRect& rtRect)
+{
+// 	if (m_rectTracker.m_rect.Width() < 0 || m_rectTracker.m_rect.Height() < 0)
+// 	{
+// 		return FALSE;
+// 	}
+// 
+// 	rtRect = m_rectTracker.m_rect;
+
+	return TRUE;
+}
+
+void CakDataImage2::DrawROIRect(CDC *pDC)
+{
+	if (m_rtROIRect.Width() == 0 || m_rtROIRect.Height() == 0) return;
+
+	// 	CPen pen, *pOldPen;
+	// 	pen.CreatePen(PS_DOT, 1, RGB(255,255,255));
+	// 	pOldPen = pDC->SelectObject(&pen);
+	// 	pDC->SelectStockObject(NULL_BRUSH);
+	// 
+	// 	pDC->Rectangle(m_rtROIRect);
+
+	CFont font;
+	VERIFY(font.CreateFont(
+		15,                        // nHeight
+		6,                         // nWidth
+		0,                         // nEscapement
+		0,                         // nOrientation
+		FW_NORMAL,                 // nWeight
+		FALSE,                     // bItalic
+		FALSE,                     // bUnderline
+		0,                         // cStrikeOut
+		ANSI_CHARSET,              // nCharSet
+		OUT_DEFAULT_PRECIS,        // nOutPrecision
+		CLIP_DEFAULT_PRECIS,       // nClipPrecision
+		DEFAULT_QUALITY,           // nQuality
+		DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
+		_T("Arial")));                 // lpszFacename
+
+	// Do something with the font just created...
+	CFont* def_font = pDC->SelectObject(&font);
+	// 	pDC->SetTextColor(RGB(255,255,255));
+	// 	pDC->SetBkMode(TRANSPARENT);
+	pDC->SetTextColor(RGB(255, 255, 0));
+	pDC->SetBkColor(RGB(0, 0, 0));
+	pDC->SetBkMode(OPAQUE);
+
+	CString strValue = _T("");
+	strValue.Format(_T("[Region] %d, %d, %d, %d"), m_rtROIRect.left, m_rtROIRect.top, m_rtROIRect.right, m_rtROIRect.bottom);
+	pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 5, strValue);
+
+	strValue.Format(_T("[Width] %d pix, %.3lf um"), m_sROIInfo.nWidthPixel, m_sROIInfo.dWidthRealUM);
+	pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 25, strValue);
+
+	strValue.Format(_T("[Height] %d pix, %.3lf um"), m_sROIInfo.nHeightPixel, m_sROIInfo.dHeightRealUM);
+	pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 45, strValue);
+
+	strValue.Format(_T("[Diagonal] %.3lf pix, %.3lf um"), m_sROIInfo.dDiagonalPixel, m_sROIInfo.dDiagonalRealUM);
+	pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 65, strValue);
+
+	strValue.Format(_T("[Resol_X] %.6lf um/pixel"), (m_dResolution / m_dWidthScale));
+	pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 85, strValue);
+
+	strValue.Format(_T("[Resol_Y] %.6lf um/pixel"), (m_dResolution / m_dHeightScale));
+	pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 105, strValue);
+
+	pDC->SelectObject(def_font);
+
+}
\ No newline at end of file

--
Gitblit v1.9.3