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