CFieldPositionMgr.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. using OTSCLRINTERFACE;
  2. using OTSDataType;
  3. using System.Collections.Generic;
  4. using System.Drawing;
  5. using static OTSDataType.otsdataconst;
  6. namespace OTSModelSharp
  7. {//provide fieldpos calculate service
  8. public class CFieldPositionMgr
  9. {
  10. enum SORTING_DIRECTION
  11. {
  12. LEFT = 1,
  13. DOWN = 2,
  14. RIGHT = 3,
  15. UP = 4
  16. }
  17. // measure area
  18. CDomain m_pMeasureArea;
  19. // measured field centre points list
  20. List<System.Drawing.Point> m_listMeasuredFieldCentrePoints;
  21. // image scan parameter
  22. COTSImgScanPrm m_poImageScanParam;
  23. const int RESOLUTION_ID_FIRST_TIE = 0;
  24. // field centre points list
  25. List<System.Drawing.Point> m_listFieldCentrePoints;
  26. // SEM data (measurement)
  27. CSEMDataMsr m_poSEMDataMsr;
  28. int overLap;
  29. // unmeasured field centre points list
  30. List<System.Drawing.Point> m_listUnmeasuredFieldCentrePoints;
  31. CFieldMgrClr fieldmgrclr;
  32. public bool Init(CDomain a_pMeasureArea, COTSImgScanPrm a_poImageScanParam,int overlap, CSEMDataMsr a_poSEMDataMsr, List<System.Drawing.PointF> a_listMeasuredFieldCentrePoints)
  33. {
  34. // assign class member
  35. m_pMeasureArea = a_pMeasureArea;
  36. m_poImageScanParam = a_poImageScanParam;
  37. m_poSEMDataMsr = a_poSEMDataMsr;
  38. overLap = overlap;
  39. if (m_listFieldCentrePoints == null)
  40. {
  41. m_listFieldCentrePoints = new List<System.Drawing.Point>();
  42. }
  43. if (m_listUnmeasuredFieldCentrePoints == null)
  44. {
  45. m_listUnmeasuredFieldCentrePoints = new List<System.Drawing.Point>();
  46. }
  47. var scanfieldsize = m_poSEMDataMsr.GetScanFieldSize();
  48. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poImageScanParam.GetImageResulotion();
  49. long nResulotionId = RESOLUTION_ID_FIRST_TIE + (long)nImageSizeId;
  50. fieldmgrclr = new CFieldMgrClr(scanfieldsize, RESOLUTION_VALUE[nResulotionId]);
  51. CDomain domainclr = new CDomain(a_pMeasureArea.GetShape(),a_pMeasureArea.GetRectDomain());
  52. domainclr.SetPolygonPoint(a_pMeasureArea.GetPolygonPoint());
  53. System.Drawing.Size sizePixelImage = RESOLUTION_VALUE[nResulotionId];
  54. fieldmgrclr.Init(domainclr.GetClrDomainObj(), sizePixelImage,scanfieldsize, (int)m_poImageScanParam.GetFieldStartMode());
  55. fieldmgrclr.SetOverlap(overlap);
  56. List<System.Drawing.Point> fieldpoints = new List<System.Drawing.Point>();
  57. for(int i=0;i<a_listMeasuredFieldCentrePoints.Count;i++)
  58. {
  59. var p = a_listMeasuredFieldCentrePoints[i];
  60. fieldpoints.Add(new System.Drawing.Point((int)p.X, (int)p.Y));
  61. }
  62. var sortedlistUnmeasuredFieldCentrePoints = fieldmgrclr.GetUnmeasuredFieldCentrePoints(fieldpoints);
  63. for (int i = 0; i < sortedlistUnmeasuredFieldCentrePoints.Count; i++)
  64. {
  65. var p = sortedlistUnmeasuredFieldCentrePoints[i];
  66. m_listUnmeasuredFieldCentrePoints.Add(p);
  67. }
  68. m_listFieldCentrePoints = fieldmgrclr.GetFieldCentrePoints();
  69. return true;
  70. }
  71. // field centre points list
  72. public List<System.Drawing.Point> GetFieldCentrePoints()
  73. {
  74. return m_listFieldCentrePoints;
  75. }
  76. // field centre points list
  77. public bool GetFieldRectByIndex(int a_nIndex, ref System.Drawing.Rectangle a_rectField)
  78. {
  79. // check input
  80. if (a_nIndex < 0 || a_nIndex > (int)m_listFieldCentrePoints.Count)
  81. {
  82. return false;
  83. }
  84. // get image size
  85. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poImageScanParam.GetImageResulotion();
  86. int nResulotionId = RESOLUTION_ID_FIRST_TIE + (int)nImageSizeId;
  87. System.Drawing.Size sizePixelImage = RESOLUTION_VALUE[nResulotionId];
  88. // scan field size (x, y)
  89. System.Drawing.Size sizeImage = new System.Drawing.Size();
  90. sizeImage.Width = m_poSEMDataMsr.GetScanFieldSize() - overLap;
  91. sizeImage.Height = m_poSEMDataMsr.GetScanFieldSize() * sizePixelImage.Height/ sizePixelImage.Width-overLap;
  92. // get left top
  93. System.Drawing.Point ptcenter = m_listFieldCentrePoints[a_nIndex];
  94. Point ptLt = new Point(ptcenter.X - sizeImage.Width / 2, ptcenter.Y + sizeImage.Height / 2);
  95. // get field rectangle
  96. a_rectField =new System.Drawing.Rectangle(ptLt, sizeImage);
  97. return true;
  98. }
  99. // unmeasured field centre points list
  100. public List<System.Drawing.Point> GetUnmeasuredFieldCentrePoints()
  101. {
  102. return m_listUnmeasuredFieldCentrePoints;
  103. }
  104. public void CalculateBorderParticleBias(List<COTSField> previousFields,COTSField currentfld)
  105. {
  106. List<Point> allFldPoints = new List<Point>();
  107. Dictionary<Point, COTSField> allflds = new Dictionary<Point, COTSField>();
  108. foreach (var f in previousFields)
  109. {
  110. PointF p = f.GetOTSPosition();
  111. Point p1 = new Point((int)p.X, (int)p.Y);
  112. allFldPoints.Add(p1);
  113. allflds.Add(p1, f);
  114. }
  115. PointF curPos = currentfld.GetOTSPosition();
  116. Point curFld = new Point((int)curPos.X, (int)curPos.Y);
  117. Point neighbor = new Point();
  118. if (fieldmgrclr.FindNeighborField(allFldPoints, curFld, neighbor, (int)SORTING_DIRECTION.LEFT))
  119. {
  120. if (allflds[neighbor].GetMeasureSequence() < currentfld.GetMeasureSequence())
  121. {
  122. currentfld.SetLeftBorderParticlesBiasDefine(false);
  123. }
  124. }
  125. if (fieldmgrclr.FindNeighborField(allFldPoints, curFld, neighbor, (int)SORTING_DIRECTION.RIGHT))
  126. {
  127. if (allflds[neighbor].GetMeasureSequence() < currentfld.GetMeasureSequence())
  128. {
  129. currentfld.SetRightBorderParticlesBiasDefine(false);
  130. }
  131. }
  132. if (fieldmgrclr.FindNeighborField(allFldPoints, curFld, neighbor, (int)SORTING_DIRECTION.UP))
  133. {
  134. if (allflds[neighbor].GetMeasureSequence() < currentfld.GetMeasureSequence())
  135. {
  136. currentfld.SetUpBorderParticlesBiasDefine(false);
  137. }
  138. }
  139. if (fieldmgrclr.FindNeighborField(allFldPoints, curFld, neighbor, (int)SORTING_DIRECTION.DOWN))
  140. {
  141. if (allflds[neighbor].GetMeasureSequence() < currentfld.GetMeasureSequence())
  142. {
  143. currentfld.SetDownBorderParticlesBiasDefine(false);
  144. }
  145. }
  146. }
  147. }
  148. }