CFieldPositionMgr.cs 12 KB

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