| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 | using OTSCLRINTERFACE;using OTSDataType;using OTSMeasureApp._0_OTSModel.OTSDataType;using System.Collections.Generic;using System.Drawing;using static OTSDataType.otsdataconst;namespace OTSModelSharp{//provide fieldpos calculate service    public enum SORTING_DIRECTION    {        LEFT = 1,        DOWN = 2,        RIGHT = 3,        UP = 4,        CENTER=5    }    public class CFieldPositionHelper    {               // measure area        CDomain m_pMeasureArea;        // image scan parameter        COTSImgScanPrm m_poImageScanParam;        const int RESOLUTION_ID_FIRST_TIE = 0;        // field centre points list        List<System.Drawing.Point> m_listFieldCentrePoints;        // SEM data (measurement)        CSEMDataMsr m_poSEMDataMsr;        int overLap;        // unmeasured field centre points list        List<System.Drawing.Point> m_listUnmeasuredFieldCentrePoints;        CFieldMgrClr fieldmgrclr;        public bool Init(CDomain a_pMeasureArea, COTSImgScanPrm a_poImageScanParam, int overlap, CSEMDataMsr a_poSEMDataMsr, List<System.Drawing.PointF> a_listMeasuredFieldCentrePoints)        {            // assign class member            m_pMeasureArea = a_pMeasureArea;            m_poImageScanParam = a_poImageScanParam;            m_poSEMDataMsr = a_poSEMDataMsr;            overLap = overlap;            if (m_listFieldCentrePoints == null)            {                m_listFieldCentrePoints = new List<System.Drawing.Point>();            }            if (m_listUnmeasuredFieldCentrePoints == null)            {                m_listUnmeasuredFieldCentrePoints = new List<System.Drawing.Point>();            }            var scanfieldsize = m_poSEMDataMsr.GetScanFieldSize();            OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = a_poImageScanParam.GetImageResulotion();            long nResulotionId = RESOLUTION_ID_FIRST_TIE + (long)nImageSizeId;            fieldmgrclr = new CFieldMgrClr(scanfieldsize, RESOLUTION_VALUE[nResulotionId]);            CDomain domainclr = new CDomain(a_pMeasureArea.GetShape(), a_pMeasureArea.GetRectDomain());            domainclr.SetPolygonPoint(a_pMeasureArea.GetPolygonPoint());            fieldmgrclr.Init(domainclr.GetClrDomainObj(), (int)a_poImageScanParam.GetFieldStartMode());            fieldmgrclr.SetOverlap(overlap);            List<System.Drawing.Point> fieldpoints = new List<System.Drawing.Point>();            for (int i = 0; i < a_listMeasuredFieldCentrePoints.Count; i++)            {                var p = a_listMeasuredFieldCentrePoints[i];                fieldpoints.Add(new System.Drawing.Point((int)p.X, (int)p.Y));            }            var sortedlistUnmeasuredFieldCentrePoints = fieldmgrclr.GetUnmeasuredFieldCentrePoints(fieldpoints);            for (int i = 0; i < sortedlistUnmeasuredFieldCentrePoints.Count; i++)            {                var p = sortedlistUnmeasuredFieldCentrePoints[i];                m_listUnmeasuredFieldCentrePoints.Add(p);            }            m_listFieldCentrePoints = fieldmgrclr.GetFieldCentrePoints();            return true;        }        // field centre points list        public List<System.Drawing.Point> GetFieldCentrePoints()        {            return m_listFieldCentrePoints;        }        // field centre points list        public bool GetOTSRectByIndex(int a_nIndex, ref COTSRect a_rectField)        {            // check input            if (a_nIndex < 0 || a_nIndex > (int)m_listFieldCentrePoints.Count)            {                return false;            }            // get image size            OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poImageScanParam.GetImageResulotion();            int nResulotionId = RESOLUTION_ID_FIRST_TIE + (int)nImageSizeId;            System.Drawing.Size sizePixelImage = RESOLUTION_VALUE[nResulotionId];            // scan field size (x, y)            System.Drawing.Size sizeImage = new System.Drawing.Size();            sizeImage.Width = fieldmgrclr.GetEffectiveFieldWidth();            sizeImage.Height = fieldmgrclr.GetEffectiveFieldHeight();            // get left top            System.Drawing.Point ptcenter = m_listFieldCentrePoints[a_nIndex];            Point ptLt = new Point(ptcenter.X - sizeImage.Width / 2, ptcenter.Y + sizeImage.Height / 2);            Point ptRb=new Point(ptcenter.X + sizeImage.Width / 2, ptcenter.Y - sizeImage.Height / 2);            // get field rectangle            a_rectField = new COTSRect(ptLt, ptRb);            return true;        }        // unmeasured field centre points list        public List<System.Drawing.Point> GetUnmeasuredFieldCentrePoints()        {            return m_listUnmeasuredFieldCentrePoints;        }        public void CalculateFieldNeighbour(List<COTSField> previousFields, COTSField currentfld)        {            List<Point> allFldPoints = new List<Point>();            Dictionary<Point, COTSField> allflds = new Dictionary<Point, COTSField>();            foreach (var f in previousFields)            {                PointF p = f.GetOTSPosition();                Point p1 = new Point((int)p.X, (int)p.Y);                allFldPoints.Add(p1);                allflds.Add(p1, f);            }            PointF curPos = currentfld.GetOTSPosition();            Point curFld = new Point((int)curPos.X, (int)curPos.Y);            Point neighbor = new Point();            if (fieldmgrclr.FindNeighborField(allFldPoints, curFld, ref neighbor, (int)SORTING_DIRECTION.LEFT))            {                    currentfld.leftField = allflds[neighbor];                            }            if (fieldmgrclr.FindNeighborField(allFldPoints, curFld, ref neighbor, (int)SORTING_DIRECTION.RIGHT))            {                    currentfld.rightField = allflds[neighbor];                           }            if (fieldmgrclr.FindNeighborField(allFldPoints, curFld, ref neighbor, (int)SORTING_DIRECTION.UP))            {                    currentfld.upField = allflds[neighbor];                           }            if (fieldmgrclr.FindNeighborField(allFldPoints, curFld, ref neighbor, (int)SORTING_DIRECTION.DOWN))            {                    currentfld.downField = allflds[neighbor];                           }        }    }}
 |