| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 | 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<COTSFieldData>;   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<COTSParticleClr> m_listAllParticles = new List<COTSParticleClr>();//hold up all the particles abstracted from bse image;       protected  List<COTSParticleClr> m_listAnalysisParticles = new List<COTSParticleClr>();// according to the size (the diameter) constraint,pick out all the conform particles.        protected List<COTSParticleClr> m_listXrayParticles = new List<COTSParticleClr>();//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<COTSParticleClr> GetListAnalysisParticles()        {            return m_listAnalysisParticles;        }        public List<COTSParticleClr> GetListXrayParticles()        {            return m_listXrayParticles;        }        public void SetListAnalysisParticles(List<COTSParticleClr> 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<COTSParticleClr> xrayParts = new List<COTSParticleClr>();            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<COTSParticleClr> specialParts = new List<COTSParticleClr>();            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<COTSParticleClr> 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<COTSParticleClr>();            // 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<COTSParticleClr> xrayParts = new List<COTSParticleClr>();            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<COTSParticleClr> 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<COTSParticleClr>    GetTopBorderedParticles()        {            List<COTSParticleClr> parts = new List<COTSParticleClr>();            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<COTSParticleClr> parts = new List<COTSParticleClr>();            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<COTSParticleClr> GetLeftBorderedParticles()        {            List<COTSParticleClr> parts = new List<COTSParticleClr>();            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 <COTSParticleClr> GetRightBorderedParticles()        {            List<COTSParticleClr> parts = new List<COTSParticleClr>();            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);		}        }    }      }
 |