CFieldPositionMgr.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. using OTSCLRINTERFACE;
  2. using OTSDataType;
  3. using OTSIMGPROC;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows;
  11. using static OTSDataType.otsdataconst;
  12. namespace OTSModelSharp
  13. {
  14. public class CFieldPositionMgr
  15. {
  16. public enum SORTING_DIRECTION
  17. {
  18. LEFT = 1,
  19. DOWN = 2,
  20. RIGHT = 3,
  21. UP = 4
  22. };
  23. // measure area
  24. CDomain m_pMeasureArea;
  25. // measured field centre points list
  26. List<System.Drawing.Point> m_listMeasuredFieldCentrePoints;
  27. // image scan parameter
  28. COTSImgScanPrm m_poImageScanParam;
  29. const int RESOLUTION_ID_FIRST_TIE = 0;
  30. // field centre points list
  31. List<System.Drawing.Point> m_listFieldCentrePoints;
  32. // SEM data (measurement)
  33. CSEMDataMsr m_poSEMDataMsr;
  34. // unmeasured field centre points list
  35. List<System.Drawing.Point> m_listUnmeasuredFieldCentrePoints;
  36. CFieldMgrClr fieldmgrclr;
  37. public bool Init(CDomain a_pMeasureArea, COTSImgScanPrm a_poImageScanParam, CSEMDataMsr a_poSEMDataMsr, List<System.Drawing.Point> a_listMeasuredFieldCentrePoints)
  38. {
  39. // assign class member
  40. m_pMeasureArea = new CDomain(a_pMeasureArea);
  41. m_poImageScanParam = new COTSImgScanPrm (a_poImageScanParam);
  42. m_poSEMDataMsr = new CSEMDataMsr(a_poSEMDataMsr);
  43. if (m_listFieldCentrePoints == null)
  44. {
  45. m_listFieldCentrePoints = new List<System.Drawing.Point>();
  46. }
  47. if (m_listUnmeasuredFieldCentrePoints == null)
  48. {
  49. m_listUnmeasuredFieldCentrePoints = new List<System.Drawing.Point>();
  50. }
  51. if (m_listMeasuredFieldCentrePoints == null)
  52. {
  53. m_listMeasuredFieldCentrePoints = new List<System.Drawing.Point>();
  54. }
  55. var scanfieldsize = m_poSEMDataMsr.GetScanFieldSize();
  56. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = GetImageScanParam().GetImageResulotion();
  57. long nResulotionId = RESOLUTION_ID_FIRST_TIE + (long)nImageSizeId;
  58. fieldmgrclr = new CFieldMgrClr(scanfieldsize, RESOLUTION_VALUE[nResulotionId]);
  59. CDomain domainclr = new CDomain(a_pMeasureArea.GetShape(),a_pMeasureArea.GetRectDomain());
  60. domainclr.SetPolygonPoint(a_pMeasureArea.GetPolygonPoint());
  61. System.Drawing.Size sizePixelImage = RESOLUTION_VALUE[nResulotionId];
  62. fieldmgrclr.Init(domainclr.GetClrDomainObj(), sizePixelImage,scanfieldsize, (int)m_poImageScanParam.GetFieldStartMode());
  63. m_listUnmeasuredFieldCentrePoints = fieldmgrclr.GetUnmeasuredFieldCentrePoints(a_listMeasuredFieldCentrePoints);
  64. m_listFieldCentrePoints = fieldmgrclr.GetFieldCentrePoints();
  65. return true;
  66. }
  67. // test if field is in the measured field centre points list
  68. public bool IsInMeasuredFieldList(System.Drawing.Point a_poiField)
  69. {
  70. for (int itr = 0; itr < m_listMeasuredFieldCentrePoints.Count; itr++)
  71. {
  72. if (m_listMeasuredFieldCentrePoints[itr] == a_poiField)
  73. {
  74. return a_poiField == m_listMeasuredFieldCentrePoints[itr];
  75. }
  76. }
  77. return false;
  78. }
  79. // calculate total fields
  80. public double CalculateTotalFields(CDomain a_pMeasureArea, double a_dScanFieldSizeX, System.Drawing.Size a_sizePixelImage)
  81. {
  82. CDomainClr domainclr = new CDomainClr((int)a_pMeasureArea.GetShape(), a_pMeasureArea.GetRectDomain());
  83. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poImageScanParam.GetImageResulotion();
  84. int nResulotionId = RESOLUTION_ID_FIRST_TIE + (int)nImageSizeId;
  85. System.Drawing.Size sizePixelImage = RESOLUTION_VALUE[nResulotionId];
  86. return fieldmgrclr.CalculateTotalFields(domainclr, a_dScanFieldSizeX, sizePixelImage);
  87. }
  88. // field centre points list
  89. public List<System.Drawing.Point> GetFieldCentrePoints()
  90. {
  91. return m_listFieldCentrePoints;
  92. }
  93. // field centre points list
  94. public bool GetFieldRectByIndex(int a_nIndex,ref System.Drawing.Rectangle a_rectField)
  95. {
  96. // check input
  97. if (a_nIndex < 0 || a_nIndex > (int)m_listFieldCentrePoints.Count)
  98. {
  99. return false;
  100. }
  101. // get image size
  102. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poImageScanParam.GetImageResulotion();
  103. int nResulotionId = RESOLUTION_ID_FIRST_TIE + (int)nImageSizeId;
  104. System.Drawing.Size sizePixelImage = RESOLUTION_VALUE[nResulotionId];
  105. // scan field size (x, y)
  106. System.Drawing.Size sizeImage = new System.Drawing.Size();
  107. sizeImage.Width = m_poSEMDataMsr.GetScanFieldSize();
  108. sizeImage.Height = sizeImage.Width * sizePixelImage.Height/ sizePixelImage.Width;
  109. // get left top
  110. System.Drawing.Point ptLeftTop = m_listFieldCentrePoints[a_nIndex];
  111. // get field rectangle
  112. a_rectField =new Rectangle(ptLeftTop, sizeImage);
  113. return true;
  114. }
  115. public int GetTotalFields()
  116. {
  117. return (int)m_listFieldCentrePoints.Count;
  118. }
  119. public void SetFieldCentrePoints(List<System.Drawing.Point> listPoint)
  120. {
  121. foreach (var opt in listPoint)
  122. {
  123. m_listFieldCentrePoints.Add(opt);
  124. }
  125. }
  126. // unmeasured field centre points list
  127. public List<System.Drawing.Point> GetUnmeasuredFieldCentrePoints()
  128. {
  129. return m_listUnmeasuredFieldCentrePoints;
  130. }
  131. public void SetUnmeasuredFieldCentrePoints(List<System.Drawing.Point> listPoint)
  132. {
  133. m_listUnmeasuredFieldCentrePoints.Clear();
  134. foreach (var opt in listPoint)
  135. {
  136. m_listUnmeasuredFieldCentrePoints.Add(opt);
  137. }
  138. }
  139. // measured field centre points list
  140. public List<System.Drawing.Point> GetMeasuredFieldCentrePoints()
  141. {
  142. return m_listMeasuredFieldCentrePoints;
  143. }
  144. // measured field centre points list
  145. public void SetMeasuredFieldCentrePoints(List<System.Drawing.Point> listPoint)
  146. {
  147. foreach (var opt in listPoint)
  148. {
  149. m_listMeasuredFieldCentrePoints.Add(opt);
  150. }
  151. }
  152. // measure area
  153. public CDomain GetMeasureArea()
  154. {
  155. return m_pMeasureArea;
  156. }
  157. // measure area
  158. public void SetMeasureArea(CDomain a_pMeasureArea)
  159. {
  160. m_pMeasureArea = new CDomain(a_pMeasureArea);
  161. }
  162. // image scan parameter
  163. public COTSImgScanPrm GetImageScanParam()
  164. {
  165. return m_poImageScanParam;
  166. }
  167. // image scan parameter
  168. public void SetImageScanParam(COTSImgScanPrm a_poImageScanParam)
  169. {
  170. m_poImageScanParam = new COTSImgScanPrm (a_poImageScanParam);
  171. }
  172. // SEM data (measurement)
  173. public CSEMDataMsr GetSEMDataMsr()
  174. {
  175. return m_poSEMDataMsr;
  176. }
  177. // SEM data (measurement)
  178. public void SetSEMDataMsr(CSEMDataMsr a_poSEMDataMsr)
  179. {
  180. m_poSEMDataMsr = new CSEMDataMsr(a_poSEMDataMsr);
  181. }
  182. // check if this is a neighbor field centre
  183. // test if field is in or partly in the measure domain area
  184. public bool IsInMeasureArea(System.Drawing.Point a_poiField, System.Drawing.Size a_sizeImageSize)
  185. {
  186. // test field centre point first
  187. if (m_pMeasureArea.PtInDomain(a_poiField))
  188. {
  189. // centre in the measure domain area, return TRUE
  190. return true;
  191. }
  192. // get measure field centre
  193. System.Drawing.Point poiMsrAreaCentre = m_pMeasureArea.GetDomainCenter();
  194. // move to left top postion.
  195. a_poiField.X = a_poiField.X - (a_sizeImageSize.Width / 2);
  196. a_poiField.Y = a_poiField.Y - (a_sizeImageSize.Height / 2);
  197. Rectangle rectFiled = new Rectangle(a_poiField, a_sizeImageSize);
  198. // check field position
  199. if (rectFiled.Left <= poiMsrAreaCentre.X && rectFiled.Right>= poiMsrAreaCentre.X)
  200. {
  201. // centre column field or centre field
  202. return true;
  203. }
  204. else if (rectFiled.Top <= poiMsrAreaCentre.Y && rectFiled.Bottom>= poiMsrAreaCentre.Y)
  205. {
  206. // centre row field?
  207. return true;
  208. }
  209. else if (rectFiled.Right <= poiMsrAreaCentre.X)
  210. {
  211. // on the left side
  212. //up
  213. if (rectFiled.Top>= poiMsrAreaCentre.Y)
  214. {
  215. // on the top left side, need to test the bottom right corner
  216. if (m_pMeasureArea.PtInDomain(new System.Drawing.Point(rectFiled.Right, rectFiled.Top)))
  217. {
  218. return true;
  219. }
  220. }
  221. else if (rectFiled.Bottom <= poiMsrAreaCentre.Y) //down//
  222. {
  223. // on the bottom left side, need to test the top right corner
  224. if (m_pMeasureArea.PtInDomain(new System.Drawing.Point(rectFiled.Right,rectFiled.Bottom)))
  225. {
  226. return true;
  227. }
  228. }
  229. }
  230. else if (rectFiled.Left >= poiMsrAreaCentre.X)
  231. {
  232. // on the right side
  233. //up
  234. if (rectFiled.Top >= poiMsrAreaCentre.Y)
  235. {
  236. // on the top left side, need to test the bottom right corner
  237. if (m_pMeasureArea.PtInDomain(new System.Drawing.Point(rectFiled.Left , rectFiled.Top)))
  238. {
  239. return true;
  240. }
  241. }
  242. else if (rectFiled.Bottom <= poiMsrAreaCentre.Y) //down//
  243. {
  244. // on the bottom left side, need to test the top right corner
  245. if (m_pMeasureArea.PtInDomain(new System.Drawing.Point(rectFiled.Left, rectFiled.Bottom)))
  246. {
  247. return true;
  248. }
  249. }
  250. }
  251. // this field is not in the area at all, return FALSE.
  252. return false;
  253. }
  254. }
  255. }