using OTSCLRINTERFACE; using OTSDataType; using OTSIMGPROC; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using static OTSDataType.otsdataconst; namespace OTSModelSharp { public class CFieldPositionMgr { public enum SORTING_DIRECTION { LEFT = 1, DOWN = 2, RIGHT = 3, UP = 4 }; // measure area CDomain m_pMeasureArea; // measured field centre points list List m_listMeasuredFieldCentrePoints; // 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; // unmeasured field centre points list List m_listUnmeasuredFieldCentrePoints; CFieldMgrClr fieldmgrclr; public bool Init(CDomain a_pMeasureArea, COTSImgScanPrm a_poImageScanParam, CSEMDataMsr a_poSEMDataMsr, List a_listMeasuredFieldCentrePoints) { // assign class member m_pMeasureArea = new CDomain(a_pMeasureArea); m_poImageScanParam = new COTSImgScanPrm (a_poImageScanParam); m_poSEMDataMsr = new CSEMDataMsr(a_poSEMDataMsr); if (m_listFieldCentrePoints == null) { m_listFieldCentrePoints = new List(); } if (m_listUnmeasuredFieldCentrePoints == null) { m_listUnmeasuredFieldCentrePoints = new List(); } if (m_listMeasuredFieldCentrePoints == null) { m_listMeasuredFieldCentrePoints = new List(); } var scanfieldsize = m_poSEMDataMsr.GetScanFieldSize(); OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = GetImageScanParam().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()); System.Drawing.Size sizePixelImage = RESOLUTION_VALUE[nResulotionId]; fieldmgrclr.Init(domainclr.GetClrDomainObj(), sizePixelImage,scanfieldsize, (int)m_poImageScanParam.GetFieldStartMode()); m_listUnmeasuredFieldCentrePoints = fieldmgrclr.GetUnmeasuredFieldCentrePoints(a_listMeasuredFieldCentrePoints); m_listFieldCentrePoints = fieldmgrclr.GetFieldCentrePoints(); return true; } // test if field is in the measured field centre points list public bool IsInMeasuredFieldList(System.Drawing.Point a_poiField) { for (int itr = 0; itr < m_listMeasuredFieldCentrePoints.Count; itr++) { if (m_listMeasuredFieldCentrePoints[itr] == a_poiField) { return a_poiField == m_listMeasuredFieldCentrePoints[itr]; } } return false; } // calculate total fields public double CalculateTotalFields(CDomain a_pMeasureArea, double a_dScanFieldSizeX, System.Drawing.Size a_sizePixelImage) { CDomainClr domainclr = new CDomainClr((int)a_pMeasureArea.GetShape(), a_pMeasureArea.GetRectDomain()); OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poImageScanParam.GetImageResulotion(); int nResulotionId = RESOLUTION_ID_FIRST_TIE + (int)nImageSizeId; System.Drawing.Size sizePixelImage = RESOLUTION_VALUE[nResulotionId]; return fieldmgrclr.CalculateTotalFields(domainclr, a_dScanFieldSizeX, sizePixelImage); } // field centre points list public List GetFieldCentrePoints() { return m_listFieldCentrePoints; } // field centre points list public bool GetFieldRectByIndex(int a_nIndex,ref System.Drawing.Rectangle 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 = m_poSEMDataMsr.GetScanFieldSize(); sizeImage.Height = sizeImage.Width * sizePixelImage.Height/ sizePixelImage.Width; // get left top System.Drawing.Point ptLeftTop = m_listFieldCentrePoints[a_nIndex]; // get field rectangle a_rectField =new Rectangle(ptLeftTop, sizeImage); return true; } public int GetTotalFields() { return (int)m_listFieldCentrePoints.Count; } public void SetFieldCentrePoints(List listPoint) { foreach (var opt in listPoint) { m_listFieldCentrePoints.Add(opt); } } // unmeasured field centre points list public List GetUnmeasuredFieldCentrePoints() { return m_listUnmeasuredFieldCentrePoints; } public void SetUnmeasuredFieldCentrePoints(List listPoint) { m_listUnmeasuredFieldCentrePoints.Clear(); foreach (var opt in listPoint) { m_listUnmeasuredFieldCentrePoints.Add(opt); } } // measured field centre points list public List GetMeasuredFieldCentrePoints() { return m_listMeasuredFieldCentrePoints; } // measured field centre points list public void SetMeasuredFieldCentrePoints(List listPoint) { foreach (var opt in listPoint) { m_listMeasuredFieldCentrePoints.Add(opt); } } // measure area public CDomain GetMeasureArea() { return m_pMeasureArea; } // measure area public void SetMeasureArea(CDomain a_pMeasureArea) { m_pMeasureArea = new CDomain(a_pMeasureArea); } // image scan parameter public COTSImgScanPrm GetImageScanParam() { return m_poImageScanParam; } // image scan parameter public void SetImageScanParam(COTSImgScanPrm a_poImageScanParam) { m_poImageScanParam = new COTSImgScanPrm (a_poImageScanParam); } // SEM data (measurement) public CSEMDataMsr GetSEMDataMsr() { return m_poSEMDataMsr; } // SEM data (measurement) public void SetSEMDataMsr(CSEMDataMsr a_poSEMDataMsr) { m_poSEMDataMsr = new CSEMDataMsr(a_poSEMDataMsr); } // check if this is a neighbor field centre // test if field is in or partly in the measure domain area public bool IsInMeasureArea(System.Drawing.Point a_poiField, System.Drawing.Size a_sizeImageSize) { // test field centre point first if (m_pMeasureArea.PtInDomain(a_poiField)) { // centre in the measure domain area, return TRUE return true; } // get measure field centre System.Drawing.Point poiMsrAreaCentre = m_pMeasureArea.GetDomainCenter(); // move to left top postion. a_poiField.X = a_poiField.X - (a_sizeImageSize.Width / 2); a_poiField.Y = a_poiField.Y - (a_sizeImageSize.Height / 2); Rectangle rectFiled = new Rectangle(a_poiField, a_sizeImageSize); // check field position if (rectFiled.Left <= poiMsrAreaCentre.X && rectFiled.Right>= poiMsrAreaCentre.X) { // centre column field or centre field return true; } else if (rectFiled.Top <= poiMsrAreaCentre.Y && rectFiled.Bottom>= poiMsrAreaCentre.Y) { // centre row field? return true; } else if (rectFiled.Right <= poiMsrAreaCentre.X) { // on the left side //up if (rectFiled.Top>= poiMsrAreaCentre.Y) { // on the top left side, need to test the bottom right corner if (m_pMeasureArea.PtInDomain(new System.Drawing.Point(rectFiled.Right, rectFiled.Top))) { return true; } } else if (rectFiled.Bottom <= poiMsrAreaCentre.Y) //down// { // on the bottom left side, need to test the top right corner if (m_pMeasureArea.PtInDomain(new System.Drawing.Point(rectFiled.Right,rectFiled.Bottom))) { return true; } } } else if (rectFiled.Left >= poiMsrAreaCentre.X) { // on the right side //up if (rectFiled.Top >= poiMsrAreaCentre.Y) { // on the top left side, need to test the bottom right corner if (m_pMeasureArea.PtInDomain(new System.Drawing.Point(rectFiled.Left , rectFiled.Top))) { return true; } } else if (rectFiled.Bottom <= poiMsrAreaCentre.Y) //down// { // on the bottom left side, need to test the top right corner if (m_pMeasureArea.PtInDomain(new System.Drawing.Point(rectFiled.Left, rectFiled.Bottom))) { return true; } } } // this field is not in the area at all, return FALSE. return false; } } }