|  | @@ -0,0 +1,305 @@
 | 
	
		
			
				|  |  | +using OTSDataType;
 | 
	
		
			
				|  |  | +using System;
 | 
	
		
			
				|  |  | +using System.Collections.Generic;
 | 
	
		
			
				|  |  | +using System.Drawing;
 | 
	
		
			
				|  |  | +using System.Linq;
 | 
	
		
			
				|  |  | +using System.Text;
 | 
	
		
			
				|  |  | +using System.Threading.Tasks;
 | 
	
		
			
				|  |  | +using static OTSDataType.otsdataconst;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +namespace OTSMeasureApp._7_OTSProgMgrInfo.Stage
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    class StageDisplayHelp
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        public const int RATIO_RECT_LEFT = 22;   //ratio rect left edge
 | 
	
		
			
				|  |  | +        public const int PIC_EDGE = 12;		  //edge width
 | 
	
		
			
				|  |  | +        public const int RATIO_RECT_HEIGHT = 30; //ratio rect height
 | 
	
		
			
				|  |  | +        public const int RATIO_RECT_DOWN = 10;   //ratio rect down edge
 | 
	
		
			
				|  |  | +        public const int DOMAIN_ITEM_NUMBER = 5;
 | 
	
		
			
				|  |  | +        public StageDisplayHelp()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        public void DrawStageBoundery(CStage a_pStage, int a_nWidth, int a_nHeight, Object pDC, double a_dPixSize)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if (a_pStage == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            CDomain pBoundery = a_pStage.GetBoundary();
 | 
	
		
			
				|  |  | +            otsdataconst.DOMAIN_SHAPE nShape = (otsdataconst.DOMAIN_SHAPE)(-1);
 | 
	
		
			
				|  |  | +            nShape = pBoundery.GetShape();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Rectangle PixRect = new Rectangle();
 | 
	
		
			
				|  |  | +            GetPixRect(pBoundery, a_nWidth, a_nHeight, a_dPixSize, ref PixRect);
 | 
	
		
			
				|  |  | +            DrawShape(PixRect, pDC, nShape, true);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // draw stage hole
 | 
	
		
			
				|  |  | +        public void DrawStageHole(CStage a_pStage, int a_nWidth, int a_nHeight, Object pDC, double a_dPixSize)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if (a_pStage == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (a_pStage.GetHoleList().Count == 0)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            foreach (var pHole in a_pStage.GetHoleList())
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                otsdataconst.DOMAIN_SHAPE nShape = (otsdataconst.DOMAIN_SHAPE)(-1);
 | 
	
		
			
				|  |  | +                nShape = pHole.GetShape();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                Rectangle PixRect = new Rectangle();
 | 
	
		
			
				|  |  | +                GetPixRect(pHole, a_nWidth, a_nHeight, a_dPixSize, ref PixRect);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                DrawShape(PixRect, pDC, nShape, true);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                int nHeight = PixRect.Height * 2 / 3;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //设置文字对齐方式
 | 
	
		
			
				|  |  | +                StringFormat sf = new StringFormat();
 | 
	
		
			
				|  |  | +                sf.Alignment = StringAlignment.Center;
 | 
	
		
			
				|  |  | +                sf.LineAlignment = StringAlignment.Center;
 | 
	
		
			
				|  |  | +                //文字颜色
 | 
	
		
			
				|  |  | +                string ColorStr = "#90ee90";
 | 
	
		
			
				|  |  | +                Color myColor = ColorTranslator.FromHtml(ColorStr);
 | 
	
		
			
				|  |  | +                System.Drawing.SolidBrush sampleBrush = new System.Drawing.SolidBrush(myColor);
 | 
	
		
			
				|  |  | +                SolidBrush solidBrush = new SolidBrush(Color.FromArgb(50, Color.Black));
 | 
	
		
			
				|  |  | +                //字体大小 根据样品孔Rectangle大小
 | 
	
		
			
				|  |  | +                float fontSize = PixRect.Width / 4;
 | 
	
		
			
				|  |  | +                Font font = new Font("宋体", fontSize, FontStyle.Regular);
 | 
	
		
			
				|  |  | +                if (fontSize == 0)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    font = new Font("宋体", fontSize, FontStyle.Regular);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                //绘制文字阴影
 | 
	
		
			
				|  |  | +                Rectangle rectFont = PixRect;
 | 
	
		
			
				|  |  | +                rectFont.X += 2;
 | 
	
		
			
				|  |  | +                rectFont.Y += 2;
 | 
	
		
			
				|  |  | +                ((Graphics)pDC).DrawString(pHole.GetName(), font, solidBrush, rectFont, sf);
 | 
	
		
			
				|  |  | +                ((Graphics)pDC).DrawString(pHole.GetName(), font, sampleBrush, PixRect, sf);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // draw ratio
 | 
	
		
			
				|  |  | +        public void DrawRatio(int a_nBounderyWidth, int a_nWidth, int a_nHeight, Object pDC, IntPtr pWnd, Rectangle rc)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if (pDC == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (pWnd == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            int nRatio = a_nBounderyWidth * (a_nWidth / 2 - RATIO_RECT_LEFT - 10) / (a_nWidth - PIC_EDGE * 2) / 1000; //显示在标尺上的mm数
 | 
	
		
			
				|  |  | +            string sRatio;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Point oRatioStart = new Point();
 | 
	
		
			
				|  |  | +            oRatioStart.X = RATIO_RECT_LEFT;
 | 
	
		
			
				|  |  | +            oRatioStart.Y = a_nHeight - RATIO_RECT_HEIGHT - RATIO_RECT_DOWN;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Point oRatioEnd = new Point();
 | 
	
		
			
				|  |  | +            oRatioEnd.X = a_nWidth / 2;
 | 
	
		
			
				|  |  | +            oRatioEnd.Y = a_nHeight - RATIO_RECT_DOWN;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //标尺
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //Pen pen = new Pen(Color.Black, 10f);
 | 
	
		
			
				|  |  | +            //((Graphics)pDC).DrawLine(pen,new Point(oRatioStart.X + 5, oRatioStart.Y + 5),new Point(oRatioStart.X + 5, oRatioEnd.Y - 15));
 | 
	
		
			
				|  |  | +            //((Graphics)pDC).DrawLine(pen, new Point(oRatioStart.X + 5, oRatioStart.Y + 10),new Point(oRatioEnd.X - 5, oRatioStart.Y + 10));
 | 
	
		
			
				|  |  | +            //((Graphics)pDC).DrawLine(pen, new Point(oRatioEnd.X - 5, oRatioStart.Y + 5),new Point(oRatioEnd.X - 5, oRatioEnd.Y - 15));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //pDC->MoveTo(CPoint(oRatioStart.x + 5, oRatioStart.y + 5));
 | 
	
		
			
				|  |  | +            //pDC->LineTo(CPoint(oRatioStart.x + 5, oRatioEnd.y - 15));
 | 
	
		
			
				|  |  | +            //pDC->MoveTo(CPoint(oRatioStart.x + 5, oRatioStart.y + 10));
 | 
	
		
			
				|  |  | +            //pDC->LineTo(CPoint(oRatioEnd.x - 5, oRatioStart.y + 10));
 | 
	
		
			
				|  |  | +            //pDC->MoveTo(CPoint(oRatioEnd.x - 5, oRatioStart.y + 5));
 | 
	
		
			
				|  |  | +            //pDC->LineTo(CPoint(oRatioEnd.x - 5, oRatioEnd.y - 15));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //CFont font;
 | 
	
		
			
				|  |  | +            //VERIFY(font.CreateFont(
 | 
	
		
			
				|  |  | +            //    12,                        // nHeight
 | 
	
		
			
				|  |  | +            //    0,                         // nWidth
 | 
	
		
			
				|  |  | +            //    0,                         // nEscapement
 | 
	
		
			
				|  |  | +            //    0,                         // nOrientation
 | 
	
		
			
				|  |  | +            //    FW_THIN,                 // 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
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //CFont* def_font = pDC->SelectObject(&font);
 | 
	
		
			
				|  |  | +            //pDC->TextOut(oRatioStart.x + 70, oRatioStart.y + 15, sRatio);
 | 
	
		
			
				|  |  | +            //pDC->SelectObject(def_font);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //// Done with the font.  Delete the font object.
 | 
	
		
			
				|  |  | +            //font.DeleteObject();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //CRect oRect(oRatioStart, oRatioEnd);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //HDC hDC;
 | 
	
		
			
				|  |  | +            //hDC = ::GetDC(pWnd->m_hWnd);
 | 
	
		
			
				|  |  | +            //HDC hBitmapDC = CreateCompatibleDC(hDC);
 | 
	
		
			
				|  |  | +            //HBITMAP hBitmap = CreateCompatibleBitmap(hDC, rc.Width(), rc.Height());
 | 
	
		
			
				|  |  | +            //SelectObject(hBitmapDC, hBitmap);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //BLENDFUNCTION bf;
 | 
	
		
			
				|  |  | +            //bf.BlendOp = AC_SRC_OVER;
 | 
	
		
			
				|  |  | +            //bf.BlendFlags = 0;
 | 
	
		
			
				|  |  | +            //bf.AlphaFormat = 0;
 | 
	
		
			
				|  |  | +            //bf.SourceConstantAlpha = 10;
 | 
	
		
			
				|  |  | +            //AlphaBlend(hDC, oRect.left, oRect.top, oRect.Width(), oRect.Height(), hBitmapDC, 0, 0, oRect.Width(), oRect.Height(), bf);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // get pixle rect
 | 
	
		
			
				|  |  | +        public bool GetPixRect(CDomain a_pDomain, int a_nWidth, int a_nHeight, double a_dPixSize, ref Rectangle PixRect)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if (a_pDomain == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return false;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Rectangle DomainRect = a_pDomain.GetDomainRect();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            int CenterX = a_nWidth / 2;     //pixle center
 | 
	
		
			
				|  |  | +            int CenterY = a_nHeight / 2;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Point DomainCenter = a_pDomain.GetDomainCenter();  // um center
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Point PixCenter = new Point();
 | 
	
		
			
				|  |  | +            PixCenter.X = (int)((double)DomainCenter.X / a_dPixSize);
 | 
	
		
			
				|  |  | +            PixCenter.Y = (int)((double)DomainCenter.Y / a_dPixSize); // um to pixle
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            int PixRectCenterX = CenterX + PixCenter.X;
 | 
	
		
			
				|  |  | +            int PixRectCenterY = CenterY - PixCenter.Y;//OTS y dirction is different with pixle direction
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            int delteX = PixRectCenterX - PixCenter.X;
 | 
	
		
			
				|  |  | +            int delteY = PixRectCenterY - PixCenter.Y;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            int Left = (int)(DomainRect.Left / a_dPixSize + delteX);
 | 
	
		
			
				|  |  | +            int Top = (int)(DomainRect.Top / a_dPixSize + delteY);
 | 
	
		
			
				|  |  | +            int Right = (int)(DomainRect.Right / a_dPixSize + delteX);
 | 
	
		
			
				|  |  | +            int Bottom = (int)(DomainRect.Bottom / a_dPixSize + delteY);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            PixRect.Location = new Point(Left, Top);
 | 
	
		
			
				|  |  | +            PixRect.Size = new Size(Math.Abs(Right - Left), Math.Abs(Bottom - Top));
 | 
	
		
			
				|  |  | +            return true;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // draw shape
 | 
	
		
			
				|  |  | +        public void DrawShape(Rectangle a_PixRect, Object a_pDC, otsdataconst.DOMAIN_SHAPE a_nShape, bool a_bIsRand)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if (a_pDC == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            Graphics graphicsShape = (Graphics)a_pDC;
 | 
	
		
			
				|  |  | +            switch ((int)a_nShape)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                case (int)otsdataconst.DOMAIN_SHAPE.ROUND:
 | 
	
		
			
				|  |  | +                    graphicsShape.DrawEllipse(new Pen(Color.Black), a_PixRect);
 | 
	
		
			
				|  |  | +                    break;
 | 
	
		
			
				|  |  | +                case (int)otsdataconst.DOMAIN_SHAPE.RECTANGLE:
 | 
	
		
			
				|  |  | +                    if (a_bIsRand)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        //graphicsShape.DrawRectangle(new Pen(Color.Black), a_PixRect, new Point(ROUND_VALUE, ROUND_VALUE));
 | 
	
		
			
				|  |  | +                        graphicsShape.DrawRectangle(new Pen(Color.Black), a_PixRect);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    else
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        graphicsShape.DrawEllipse(new Pen(Color.Black), a_PixRect);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    break;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // get domain
 | 
	
		
			
				|  |  | +        public CDomain GetDomain(String a_strValue)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            // domain
 | 
	
		
			
				|  |  | +            CDomain pDomain = null;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // check value string
 | 
	
		
			
				|  |  | +            a_strValue.Trim();
 | 
	
		
			
				|  |  | +            if (a_strValue == "")
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return pDomain;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // split the value string   
 | 
	
		
			
				|  |  | +            List<string> listStr = new List<string>(a_strValue.Split(','));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            pDomain = GetDomain(listStr);
 | 
	
		
			
				|  |  | +            // return the domain pointer
 | 
	
		
			
				|  |  | +            return pDomain;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        CDomain GetDomain(List<string> a_listString)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            // domain
 | 
	
		
			
				|  |  | +            CDomain pDomain = null;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // check value string list size
 | 
	
		
			
				|  |  | +            if ((int)a_listString.Count != DOMAIN_ITEM_NUMBER)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return pDomain;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // shape 
 | 
	
		
			
				|  |  | +            int nValue;
 | 
	
		
			
				|  |  | +            string strValue = a_listString[0];
 | 
	
		
			
				|  |  | +            nValue = Convert.ToInt32(strValue);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // check the shape value
 | 
	
		
			
				|  |  | +            if (nValue < (int)DOMAIN_SHAPE.ROUND || nValue > (int)DOMAIN_SHAPE.RECTANGLE)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return pDomain;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            DOMAIN_SHAPE nShape = (DOMAIN_SHAPE)nValue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // position 
 | 
	
		
			
				|  |  | +            strValue = a_listString[1];
 | 
	
		
			
				|  |  | +            nValue = Convert.ToInt32(strValue);
 | 
	
		
			
				|  |  | +            int nCentreX = nValue;
 | 
	
		
			
				|  |  | +            strValue = a_listString[2];
 | 
	
		
			
				|  |  | +            nValue = Convert.ToInt32(strValue);
 | 
	
		
			
				|  |  | +            int nCentreY = nValue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // diameter/width
 | 
	
		
			
				|  |  | +            strValue = a_listString[3];
 | 
	
		
			
				|  |  | +            nValue = Convert.ToInt32(strValue);
 | 
	
		
			
				|  |  | +            int nDiameter_Width = nValue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // height/spare
 | 
	
		
			
				|  |  | +            strValue = a_listString[4];
 | 
	
		
			
				|  |  | +            if (nShape == DOMAIN_SHAPE.RECTANGLE)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                nValue = Convert.ToInt32(strValue);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            int nDiameter_nHeight = nValue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // create domain
 | 
	
		
			
				|  |  | +            Rectangle rectDomain = new Rectangle(0, 0, nDiameter_Width, nDiameter_nHeight);
 | 
	
		
			
				|  |  | +            pDomain = new CDomain(nShape, rectDomain);
 | 
	
		
			
				|  |  | +            pDomain.OffsetDomain(new Point(nCentreX - (nDiameter_Width / 2), nCentreY - (nDiameter_nHeight / 2)));
 | 
	
		
			
				|  |  | +            // return the domain pointer
 | 
	
		
			
				|  |  | +            return pDomain;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |