using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Drawing; using OTSModelSharp.ImageProcess; using OTSModelSharp.ServiceInterface; using OTSDataType; using OTSCLRINTERFACE; namespace OTSModelSharp { using COTSFieldDataList = List; public class COTSFieldData { protected NLog.Logger log ; // ID int m_nID; // position (from field center manager) protected System.Drawing.Point m_otsPos ; protected CBSEImgClr m_pBSEImg; protected double m_pixelSize; IImageProcess m_ImagePro; protected List m_listAllParticles = new List();//hold up all the particles abstracted from bse image; protected List m_listAnalysisParticles = new List();// according to the size (the diameter) constraint,pick out all the conform particles. protected List m_listXrayParticles = new List();//hold up all the particles that need the xray data. private int height; private int width; public int Height { get => height; set => height = value; } public int Width { get => width; set => width = value; } public System.Drawing.Point OTSPos { get => m_otsPos; set => m_otsPos = value; } public Point SemPos { get => m_semPos; set => m_semPos = value; } private Point m_semPos; public List GetListAnalysisParticles() { return m_listAnalysisParticles; } public List GetListXrayParticles() { return m_listXrayParticles; } public void SetListAnalysisParticles(List value) { m_listAnalysisParticles = value; } public COTSFieldData(CBSEImgClr a_pBSEImg, double a_dPixelSize) { log = NLog.LogManager.GetCurrentClassLogger(); Init(); m_pBSEImg = a_pBSEImg; m_pixelSize = a_dPixelSize; width = a_pBSEImg.GetWidth(); height = a_pBSEImg.GetHeight(); } public COTSFieldData() { log = NLog.LogManager.GetCurrentClassLogger(); Init(); } // initialization void Init() { // initialization m_nID = -1; OTSPos =new System.Drawing.Point(0, 0); m_listAllParticles.Clear(); } public void CCOTSFieldData(COTSFieldData a_oSource) { // can't copy itself if (a_oSource == this) { return; } Duplicate(a_oSource); } public COTSFieldData(COTSFieldData a_poSource) { // can't copy itself if (a_poSource == this) { return; } Duplicate(a_poSource); } public CBSEImgClr GetBSEImage() { return m_pBSEImg; } public void SetBSEImage(CBSEImgClr a_pBSEImg) { if (a_pBSEImg == null) { // invalid BSE image. log.Error("SetBSEImage: invalid BSE image."); return; } m_pBSEImg = a_pBSEImg; } public void RemoveImgBGAndGetParticles(COTSImageProcParam a_pImageProcessParam,double a_pixelSize) { CImageHandler imghandler = new CImageHandler(); List xrayParts = new List(); imghandler.RemoveBGAndGetParts(m_pBSEImg, a_pImageProcessParam,a_pixelSize, ref xrayParts); foreach (var p in xrayParts) { m_listAllParticles.Add(p); m_listXrayParticles.Add(p); } return ; } public void GetPartsBySpecialGray(CIntRangeClr grayRange, CIntRangeClr diameterRange,double pixelSize, bool ifXray) { CImageHandler imghandler = new CImageHandler(); List specialParts = new List(); imghandler.GetParticlesBySpecialGray(m_pBSEImg, grayRange,diameterRange,pixelSize, ref specialParts); foreach (var p in specialParts) { m_listAllParticles.Add(p); if (ifXray) { m_listXrayParticles.Add(p); } } return; } public bool CalParticleImageProp(List particles) { m_ImagePro = new CImageHandler(); foreach (COTSParticleClr part in particles) { m_ImagePro.CalParticleImageProp( part, m_pixelSize); } return true; } public void InitParticles(COTSImageProcParam a_pImageProcessParam,double a_dPixelSize) { m_listAnalysisParticles = new List(); // get area range CDoubleRange oAreaRange = a_pImageProcessParam.GetIncAreaRange(); double rMin = oAreaRange.GetStart() / 2.0; double rMax = oAreaRange.GetEnd() / 2.0; double dAreaLow = rMin * rMin * 3.14159; double dAreaHigh = rMax * rMax * 3.14159; int nTagId = 0; //int nAnalysisPartId = 0; int tooSmallnum = 0; int overSizenum = 0; log.Info("Total Particles: " + m_listAllParticles.Count); foreach (COTSParticleClr pParticle in m_listAllParticles)//m_listAllParticles memorize all the particles . { pParticle.SetTagId(nTagId);//give all the conforming particles a unified sequence no. pParticle.SetFieldId(GetId()); pParticle.SetType((int)otsdataconst.OTS_PARTCLE_TYPE.NO_ANALYSIS_X_RAY); pParticle.SetTypeName("Not Identified"); pParticle.SetAnalysisId(nTagId); // the same as the tagId no use now. nTagId++; m_listAnalysisParticles.Add(pParticle); } log.Info("Normal Particles (>"+ oAreaRange.GetStart().ToString("f2") + "): "+ "<" + oAreaRange.GetEnd().ToString("f2") + "): " + m_listAnalysisParticles.Count); List xrayParts = new List(); foreach (var p in m_listXrayParticles)//m_listXrayParticles memorize all the particles which needs xray analysis. { if (p.GetTagId() > -1)//it has been initialized and it's a valid particle. { xrayParts.Add(p); } } m_listXrayParticles = xrayParts; } public bool CreateXrayList(List a_listParticles) { ; foreach (COTSParticleClr pPart in a_listParticles) { System.Drawing.Point poi = (System.Drawing.Point)pPart.GetXRayPos(); CPosXrayClr pPosXray = new CPosXrayClr(); pPosXray.SetPosition(poi); pPosXray.SetPartTagId(pPart.GetTagId()); pPosXray.SetIndex(pPart.GetAnalysisId()); pPosXray.SetScanFieldId(pPart.GetFieldId()); pPart.SetXray(pPosXray); } return true; } public bool NoParticle() { if (m_listAllParticles.Count == 0) { return true; } else { return false; } } public bool NoAnalysisParticle() { if (m_listAnalysisParticles.Count == 0) { return true; } else { return false; } } public bool Equals(COTSFieldData a_oSource) // CBSEImg& operator=(const CBSEImg&); // =operator { int nSize = m_listAllParticles.Count; if (nSize != a_oSource.m_listAllParticles.Count) { return false; } for (int i = 0; i < nSize; ++i) { if (!m_listAllParticles[i] .Equals( a_oSource.m_listAllParticles[i])) { return false; } } return m_nID == a_oSource.m_nID && OTSPos == a_oSource.OTSPos; } // destructor // ID public int GetId() { return m_nID; } public void SetId(int a_nID) { m_nID = a_nID; } // position (from field center manager) public System.Drawing.Point GetOTSPosition() { return m_otsPos; } public void SetOTSPosition(System.Drawing.Point a_poiPos) { m_otsPos = a_poiPos; } public List GetTopBorderedParticles() { List parts = new List(); foreach (var p in m_listAllParticles) { var segs = p.GetFeature().GetSegmentsList();//COTSSegment foreach (var seg in segs) { if (seg.GetHeight() == 0) { parts.Add(p); break; } } } return parts; } public List< COTSParticleClr > GetBottomBorderedParticles() { List parts = new List(); foreach (var p in m_listAllParticles) { var segs = p.GetFeature().GetSegmentsList(); foreach (var seg in segs) { if (seg.GetHeight() == this.Height - 1)//the lowest height is 767(height-1),cause starting from 0. { parts.Add(p); break; } } } return parts; } public List GetLeftBorderedParticles() { List parts = new List(); foreach (var p in m_listAllParticles) { var segs = p.GetFeature().GetSegmentsList(); foreach (var seg in segs) { if (seg.GetStart() == 0) { parts.Add(p); break; } } } return parts; } public List GetRightBorderedParticles() { List parts = new List(); foreach (var p in m_listAllParticles) { var segs = p.GetFeature().GetSegmentsList(); foreach (var seg in segs) { if (seg.GetStart() + seg.GetLength() == this.Width) { parts.Add(p); break; } } } return parts; } // is empty public bool IsEmpty() { return m_listAllParticles.Count == 0; } void Duplicate( COTSFieldData a_oSource) { m_nID = a_oSource.m_nID; OTSPos = a_oSource.OTSPos; //m_strFieldFileFolder = a_oSource.m_strFieldFileFolder; // copy data over foreach(var pParticle in a_oSource.m_listAllParticles) { m_listAllParticles.Add(pParticle); } } } }