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; using System.Xml; namespace OTSModelSharp { using COTSFieldDataList = List; public class COTSFieldData:ISlo { protected NLog.Logger log ; // ID int m_nID; // position (from field center manager) protected System.Drawing.PointF 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 conforming particles. protected List m_listXrayParticles = new List();//hold up all the particles that need the xray data. protected List m_listBigParticles = new List(); protected List m_listSmallParticles = new List(); public List ListSmallParticles { get => m_listSmallParticles; set => m_listSmallParticles = value; } public List ListBigParticles { get => m_listBigParticles; set => m_listBigParticles = value; } 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.PointF OTSPos { get => m_otsPos; set => m_otsPos = value; } public bool GetIsMeasureComplete() { return isMeasureComplete; } public void SetIsMeasureComplete(bool value) { isMeasureComplete = value; } private bool isMeasureComplete; public PointF GetSemPos() { return m_semPos; } public void SetSemPos(PointF value) { m_semPos = value; } private PointF m_semPos; public List GetAllParticles() { return m_listAllParticles; } public List GetListAnalysisParticles() { return m_listAnalysisParticles; } public List GetListXrayParticles() { m_listXrayParticles.Clear(); foreach (var p in m_listAnalysisParticles) { if (p.IsXrayParticle()) { m_listXrayParticles.Add(p); } } return m_listXrayParticles; } public void SetListAnalysisParticles(List value) { m_listAnalysisParticles = value; } public COTSFieldData(PointF centerPoint, double a_dPixelSize) { log = NLog.LogManager.GetCurrentClassLogger(); Init(); //m_pBSEImg = a_pBSEImg; m_otsPos = centerPoint; m_pixelSize = a_dPixelSize; } public double GetPixelSize() { return m_pixelSize; } public void SetPixelSize(double size) { m_pixelSize = size; } 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; width = a_pBSEImg.GetWidth(); height = a_pBSEImg.GetHeight(); } public void RemoveImgBGAndGetParticles(COTSImageProcParam a_pImageProcessParam,double a_pixelSize,bool ifXray) { if (m_pBSEImg == null) return; CImageHandler imghandler = new CImageHandler(); List xrayParts = new List(); imghandler.RemoveBGAndGetParts(m_pBSEImg, a_pImageProcessParam,a_pixelSize, ref xrayParts); foreach (var p in xrayParts) { p.SetIsXrayParticle(ifXray); m_listAllParticles.Add(p); } return ; } public void GetPartsBySpecialGray(CIntRangeClr grayRange, CDoubleRangeClr diameterRange,double pixelSize, bool ifXray) { if (m_pBSEImg == null) return; CImageHandler imghandler = new CImageHandler(); List specialParts = new List(); imghandler.GetParticlesBySpecialGray(m_pBSEImg, grayRange,diameterRange,pixelSize, ref specialParts); foreach (var p in specialParts) { p.SetIsXrayParticle(ifXray); m_listAllParticles.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; int nTagId = 0; 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++; } log.Info("Total Particles: (>" + oAreaRange.GetStart().ToString("f2") + "): "+ "<" + oAreaRange.GetEnd().ToString("f2") + "): " + m_listAllParticles.Count); } 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_listAllParticles.Count == 0) { return true; } else { return false; } } public bool PositionEquals(COTSFieldData a_oSource) // CBSEImg& operator=(const CBSEImg&); // =operator { var xoffSet = width * m_pixelSize /2; var yoffSet = height * m_pixelSize/2 ; if (a_oSource.m_otsPos.X < (m_otsPos.X+xoffSet) && a_oSource.m_otsPos.X>( m_otsPos.X-xoffSet)) { if (a_oSource.m_otsPos.Y < (m_otsPos.Y + yoffSet) && a_oSource.m_otsPos.Y > (m_otsPos.Y - yoffSet)) { return true; } return false; } else { return false; } //return OTSPos.X == a_oSource.m_otsPos.X && OTSPos.Y == a_oSource.m_otsPos.Y; } // 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.PointF GetOTSPosition() { return m_otsPos; } public void SetOTSPosition(System.Drawing.PointF 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; // copy data over foreach(var pParticle in a_oSource.m_listAllParticles) { m_listAllParticles.Add(pParticle); } } public override void Serialize(bool isStoring, XmlDocument classDoc, XmlNode rootNode) { xPoint xPos = new xPoint(); Slo slo = new Slo(); slo.Register("OTSPosition", xPos); if (isStoring) { xPos.AssignValue(new Point((int)m_otsPos.X,(int)m_otsPos.Y)); slo.Serialize(true, classDoc, rootNode); } else { slo.Serialize(false, classDoc, rootNode); m_otsPos = xPos.value(); } } } }