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 m_listFieldCentrePoints; // SEM data (measurement) CSEMDataMsr m_poSEMDataMsr; int overLap; // unmeasured field centre points list List m_listUnmeasuredFieldCentrePoints; CFieldMgrClr fieldmgrclr; public bool Init(CDomain a_pMeasureArea, COTSImgScanPrm a_poImageScanParam, int overlap, CSEMDataMsr a_poSEMDataMsr, List 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(); } if (m_listUnmeasuredFieldCentrePoints == null) { m_listUnmeasuredFieldCentrePoints = new List(); } 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 fieldpoints = new List(); 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 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 GetUnmeasuredFieldCentrePoints() { return m_listUnmeasuredFieldCentrePoints; } public void CalculateFieldNeighbour(List previousFields, COTSField currentfld) { List allFldPoints = new List(); Dictionary allflds = new Dictionary(); 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]; } } public bool IsThisPointInMeasureArea(Point p) { return fieldmgrclr.IsThisPointInMeasureArea(p); } } }