EdgeInspector_App/View/EdgeImageViewer.cpp
@@ -667,6 +667,8 @@
   memDC.SetStretchBltMode(COLORONCOLOR);
   pOldBitmap = (CBitmap*)memDC.SelectObject(&Bitmap);
   DimensionDir eDim = (DimensionDir)m_nSideIdx;
   bool bIsRipSide = (DIMENSION_A_RIP == m_nSideIdx) || (DIMENSION_B_RIP == eDim) || (DIMENSION_C_RIP == eDim) || (DIMENSION_D_RIP == eDim);
   // 1. Draw Buffer Image
   UpdateView_Image(&memDC);
@@ -688,7 +690,7 @@
   // 7. Draw Exception : MODE_VIEW_EXCEPTION_AREA
   UpdateView_ExceptionArea(&memDC);
   // 8. Draw Inspect : MODE_VIEW_INSPECT_AREA
   UpdateView_InspectArea(&memDC);
@@ -722,6 +724,8 @@
   UpdateView_VisionResult(&memDC);
#endif // HALCON_VISION_KEY
   // 18. Side Rip Thickness : MODE_VIEW_MEASURE
   UpdateView_SideRipThickness(&memDC);
   pDC->BitBlt(0,0,m_rtWnd.Width(),m_rtWnd.Height(),&memDC,0,0,SRCCOPY);
   memDC.SelectObject(pOldBitmap);
@@ -2160,6 +2164,99 @@
   memDC->SelectObject(pOldPen);
}
void CEdgeImageViewer::UpdateView_SideRipThickness(CDC* memDC)
{
   if (m_pBuffer == NULL || memDC == NULL || m_pGlassData == NULL || m_pRecipe == NULL) {
      return;
   }
   DimensionDir eDim = (DimensionDir)m_nSideIdx;
   bool bIsRipSide = (DIMENSION_A_RIP == eDim) || (DIMENSION_B_RIP == eDim) || (DIMENSION_C_RIP == eDim) || (DIMENSION_D_RIP == eDim);
   if (!bIsRipSide) {
      return;
   }
   CRIP_THICKNESS_PARM& rip = m_pRecipe->m_SideParam[eDim].m_RipThk;
   if (rip.m_bUseInspect != TRUE) {
      return;
   }
   CSide_Data* pSideData = m_pGlassData->GetSideData(eDim);
   if (pSideData == NULL) {
      return;
   }
   if (m_MenuStatus[MODE_VIEW_MEASURE] == FALSE) {
      return;
   }
   CPen penOK(PS_SOLID, 1, RGB(0, 255, 0));
   CPen penNG(PS_SOLID, 1, RGB(255, 0, 0));
   CPen penNone(PS_DOT, 1, RGB(180, 180, 180));
   CBrush brNull; brNull.CreateStockObject(NULL_BRUSH);
   CPen* pOldPen = memDC->SelectObject(&penOK);
   CBrush* pOldBrush = memDC->SelectObject(&brNull);
   auto DrawOne = [&](const CPoint(&pts)[RIP_POINT_COUNT], int nStatus, LPCTSTR label, double value_um, int index, int nAnchorX, int dy) {
      if (nStatus == 0) {
         return;
      }
      if (nStatus == 1) {
         memDC->SelectObject(&penOK);
         memDC->SetTextColor(RGB(0, 255, 0));
      }
      else {
         memDC->SelectObject(&penNG);
         memDC->SetTextColor(RGB(255, 0, 0));
      }
      CPoint p0 = GetWndPos(pts[0]);
      CPoint p1 = GetWndPos(pts[1]);
      memDC->MoveTo(p0); memDC->LineTo(p1);
      auto Cross = [&](const CPoint& p) {
         memDC->MoveTo(p.x - 3, p.y - 3); memDC->LineTo(p.x + 3, p.y + 3);
         memDC->MoveTo(p.x + 3, p.y - 3); memDC->LineTo(p.x - 3, p.y + 3);
      };
      Cross(p0); Cross(p1);
      CPoint mid{ (p0.x + p1.x) / 2, (p0.y + p1.y) / 2 };
      CString s; s.Format(_T("%s[%02d]: %.1f um"), label, index + 1, value_um);
      memDC->TextOut(nAnchorX, mid.y + dy, s);
   };
   const int DY = 16;
   for (int i = 0; i < MAX_RIP_SAMPLE_COUNT; ++i) {
      CPoint L0 = GetWndPos(pSideData->m_ptSideRip_Left_pxl[i][0]);
      CPoint L1 = GetWndPos(pSideData->m_ptSideRip_Left_pxl[i][1]);
      CPoint R0 = GetWndPos(pSideData->m_ptSideRip_Right_pxl[i][0]);
      CPoint R1 = GetWndPos(pSideData->m_ptSideRip_Right_pxl[i][1]);
      CPoint G0 = GetWndPos(pSideData->m_ptSideRip_Glass_pxl[i][0]);
      CPoint G1 = GetWndPos(pSideData->m_ptSideRip_Glass_pxl[i][1]);
      int nAnchorX = max(max(max(L0.x, L1.x), max(R0.x, R1.x)), max(G0.x, G1.x)) + 6;
      if (nAnchorX > DISPLAY_FRAME_WIDTH / 2) {
         nAnchorX = DISPLAY_FRAME_WIDTH / 2 - 100;
      }
      // Left
      DrawOne(pSideData->m_ptSideRip_Left_pxl[i], pSideData->m_nSideRip_Left_Status[i], _T("Rip-Left"), pSideData->m_dSideRip_Left_um[i], i, nAnchorX , -DY);
      // Glass
      DrawOne(pSideData->m_ptSideRip_Glass_pxl[i], pSideData->m_nSideRip_Glass_Status[i], _T("Rip-Glass"), pSideData->m_dSideRip_Glass_um[i], i, nAnchorX, 0);
      // Right
      DrawOne(pSideData->m_ptSideRip_Right_pxl[i], pSideData->m_nSideRip_Right_Status[i], _T("Rip-Right"), pSideData->m_dSideRip_Right_um[i], i, nAnchorX, +DY);
   }
   memDC->SelectObject(pOldPen);
   memDC->SelectObject(pOldBrush);
   brNull.DeleteObject();
}
CRect CEdgeImageViewer::GetManualMeasureRect()
{
   bool bManualMeasure = m_MenuStatus[MODE_USER_SELECT];