CFieldPositionMgr.cs 11 KB

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