COTSSample.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using static OTSDataType.otsdataconst;
  8. using OTSModelSharp;
  9. using System.Xml;
  10. using OTSModelSharp.ResourceManage;
  11. using static OTSModelSharp.ResourceManage.ResourceID;
  12. using OTSMeasureApp;
  13. using OTSMeasureApp._0_OTSModel.OTSDataType;
  14. namespace OTSDataType
  15. {
  16. public class COTSSample : ISlo
  17. {
  18. const string NOT_APPLIED = "N/A";
  19. private string m_strName;
  20. private string m_strHoleName;
  21. //private bool m_bParamLock;
  22. private bool m_bSwitch;
  23. private CSampleParam m_poMsrParams;
  24. private CDomain m_poMsrArea;
  25. private CSEMDataMsr m_poSEMDataMsr;
  26. private CMsrSampleStatus m_Status;
  27. private CMsrResultItems m_poMsrResults;
  28. //private MEMBRANE_TYPE m_membraneType;
  29. private List<COTSField> m_listFieldData;
  30. public CFieldPositionHelper pFieldMgr=new CFieldPositionHelper();
  31. public COTSSample()
  32. {
  33. // initialization
  34. Init();
  35. }
  36. void Init()
  37. {
  38. m_strName = "";
  39. m_strHoleName = "";
  40. m_bSwitch = true;
  41. m_poMsrParams = new CSampleParam();
  42. m_poMsrArea = new CDomain();
  43. m_poSEMDataMsr = new CSEMDataMsr();
  44. m_Status = new CMsrSampleStatus();
  45. m_poMsrResults = new CMsrResultItems();
  46. m_listFieldData = new List<COTSField>();
  47. }
  48. public CDomain GetMsrDomain() { return m_poMsrArea; }
  49. // calculate scan field size
  50. public void CalculateScanFieldSize(double a_dPixelSize,ref int scanFieldWidth,ref int scanFieldHeight)
  51. {
  52. // get image size
  53. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poMsrParams.GetImageScanParam().GetImageResulotion();
  54. long nResulotionId = RESOLUTION_ID_FIRST_TIE + (long)nImageSizeId;
  55. int nImagewidth = otsdataconst.RESOLUTION_VALUE[nResulotionId].Width;
  56. int nHeight = RESOLUTION_VALUE[nResulotionId].Height;
  57. // calculate scan field size
  58. scanFieldWidth = (int)((a_dPixelSize * (double)nImagewidth) + 0.5);
  59. scanFieldHeight= (int)((a_dPixelSize * (double)nHeight) + 0.5);
  60. }
  61. public bool GetBSESize(out int a_nWidth, out int a_nHeight)
  62. {
  63. // scan parameters
  64. CSampleParam pMsrParam = GetMsrParams();
  65. COTSImgScanPrm pImgScanParam = pMsrParam.GetImageScanParam();
  66. // get image size
  67. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = pImgScanParam.GetImageResulotion();
  68. int nResulotionId = RESOLUTION_ID_FIRST_TIE + (int)nImageSizeId;
  69. Size sizePixelImage = RESOLUTION_VALUE[nResulotionId];
  70. // get scan field size
  71. a_nWidth = sizePixelImage.Width;
  72. a_nHeight = sizePixelImage.Height;
  73. return true;
  74. }
  75. // name
  76. public string GetName() { return m_strName; }
  77. public void SetName(string a_strName) { m_strName = a_strName; }
  78. // sample hole
  79. public string GetSampleHoleName() { return m_strHoleName; }
  80. public void SetSampleHoleName(string a_strHoleName) { m_strHoleName = a_strHoleName; }
  81. // param modify lock
  82. //public bool GetParamLock() { return m_bParamLock; }
  83. //public void SetParamLock(bool a_bParamLock) { m_bParamLock = a_bParamLock; }
  84. // switch
  85. public bool GetSwitch() { return m_bSwitch; }
  86. public void SetSwitch(bool a_bSwitch) { m_bSwitch = a_bSwitch; }
  87. // measurement parameter
  88. public CSampleParam GetMsrParams() { return m_poMsrParams; }
  89. public void SetMsrParams(CSampleParam a_poMsrParams)
  90. {
  91. m_poMsrParams = a_poMsrParams;
  92. }
  93. // measurement area
  94. public void SetMsrDomain(CDomain a_poMsrArea)
  95. {
  96. m_poMsrArea = a_poMsrArea;
  97. }
  98. // SEM data (measurement)
  99. public CSEMDataMsr GetSEMDataMsr() { return m_poSEMDataMsr; }
  100. public void SetSEMDataMsr(CSEMDataMsr a_poSEMDataMsr)
  101. {
  102. m_poSEMDataMsr = a_poSEMDataMsr;
  103. }
  104. // measure status
  105. public CMsrSampleStatus GetMsrStatus() { return m_Status; }
  106. public void SetMsrStatus(CMsrSampleStatus a_poMsrStatus)
  107. {
  108. m_Status = a_poMsrStatus;
  109. }
  110. // fields
  111. public List<COTSField> GetFieldsData() { return m_listFieldData; }
  112. public void SetFieldsData(List<COTSField> a_listFieldData)
  113. {
  114. m_listFieldData = a_listFieldData;
  115. for (int i = 0; i < m_listFieldData.Count; i++)
  116. {
  117. m_listFieldData[i].SetId(i);
  118. m_listFieldData[i].Sample = this;
  119. }
  120. var mySemdata = GetSEMDataMsr();
  121. mySemdata.SetTotalFields(m_listFieldData.Count);
  122. }
  123. public void AddNewField(PointF centerPoint ,int measureSequence)
  124. {
  125. var pixelsize = CalculatePixelSize();
  126. var newfld = new COTSField(centerPoint, pixelsize);
  127. newfld.SetMeasureSequence(measureSequence);
  128. int nNewFieldId;
  129. nNewFieldId =GetIdForANewField();
  130. newfld.SetId(nNewFieldId);
  131. newfld.Sample = this;
  132. m_listFieldData.Add(newfld);
  133. var mySemdata = GetSEMDataMsr();
  134. mySemdata.SetTotalFields(m_listFieldData.Count);
  135. }
  136. public void AddNewField(COTSField newfld)
  137. {
  138. int nNewFieldId;
  139. nNewFieldId = GetIdForANewField();
  140. newfld.SetId(nNewFieldId);
  141. newfld.Sample = this;
  142. m_listFieldData.Add(newfld);
  143. var mySemdata = GetSEMDataMsr();
  144. mySemdata.SetTotalFields(m_listFieldData.Count);
  145. }
  146. public void ClearFields()
  147. {
  148. m_listFieldData.Clear();
  149. }
  150. public void SetFieldEnable(Point OTScoord, bool enable)
  151. {
  152. foreach (var fld in m_listFieldData)
  153. {
  154. if (fld.GetOTSRect().PointInRect(OTScoord))
  155. {
  156. fld.Enable = enable;
  157. if (enable == false)
  158. {
  159. NLog.LogManager.GetCurrentClassLogger().Info("Field " + fld.GetId() + " Disabled");
  160. }
  161. }
  162. }
  163. }
  164. public int GetIdForANewField()
  165. {
  166. List<COTSField> listFieldData = GetFieldsData();
  167. // new field id
  168. int nNewFieldId = listFieldData.Count;
  169. do
  170. {
  171. bool iffound = false;
  172. COTSField cOTSFieldData;
  173. for (int i = 0; i < listFieldData.Count; i++)
  174. {
  175. cOTSFieldData = listFieldData[i];
  176. if (cOTSFieldData.GetId() == nNewFieldId)
  177. {
  178. iffound = true;
  179. }
  180. }
  181. if (iffound == true)
  182. {
  183. ++nNewFieldId;
  184. }
  185. else
  186. {
  187. break;
  188. }
  189. } while (true);
  190. return nNewFieldId;
  191. }
  192. // measure results
  193. public CMsrResultItems GetMsrResults() { return m_poMsrResults; }
  194. public void SetMsrResults(CMsrResultItems a_poMsrResults)
  195. {
  196. m_poMsrResults = a_poMsrResults;
  197. }
  198. // has measure results test
  199. public bool HasMeasureResult()
  200. {
  201. // result items is not empty
  202. bool bHasResult = (m_poMsrResults.GetResultItems().Count != 0);
  203. return bHasResult;
  204. }
  205. public bool IsThisPointInMeasureArea(Point p)
  206. {
  207. return pFieldMgr.IsThisPointInMeasureArea(p,this.GetMsrDomain().GetClrDomainObj());
  208. }
  209. public double CalculatePixelSize()
  210. {
  211. // pixel size
  212. double dPixelSize = 0.0;
  213. // make sure SEM is valid
  214. if (m_poSEMDataMsr != new CSEMDataMsr())
  215. {
  216. // get scan field size
  217. int nScanFieldSize = m_poSEMDataMsr.GetScanFieldSize();
  218. // get image size
  219. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poMsrParams.GetImageScanParam().GetImageResulotion();
  220. long nResulotionId = RESOLUTION_ID_FIRST_TIE + (long)nImageSizeId;
  221. int nImageSize = RESOLUTION_VALUE[nResulotionId].Width;
  222. // calculate pixel size
  223. dPixelSize = (double)nScanFieldSize / (double)nImageSize;
  224. }
  225. // return pixel size
  226. return dPixelSize;
  227. }
  228. // calculate field area
  229. public double CalculateAFieldArea()
  230. {
  231. // pixel size
  232. double dAFieldArea = 0.0;
  233. // make sure SEM is valid
  234. if (m_poSEMDataMsr != new CSEMDataMsr())
  235. {
  236. // get image size
  237. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poMsrParams.GetImageScanParam().GetImageResulotion();
  238. long nResulotionId = RESOLUTION_ID_FIRST_TIE + (long)nImageSizeId;
  239. int nWidth = RESOLUTION_VALUE[nResulotionId].Width;
  240. int nHeight = RESOLUTION_VALUE[nResulotionId].Height;
  241. // pixel size (micros)
  242. double dPixelSize = CalculatePixelSize();
  243. // calculate pixel size
  244. dAFieldArea = (double)nWidth * nHeight * dPixelSize * dPixelSize * 0.000001;// mm^2
  245. }
  246. // return pixel size
  247. return dAFieldArea;
  248. }
  249. public double GetTotalToMeasureArea()
  250. {
  251. double totalArea;
  252. if (m_poMsrArea.GetShape() == DOMAIN_SHAPE.RECTANGLE)
  253. {
  254. totalArea = m_poMsrArea.GetRectDomain().Width * m_poMsrArea.GetRectDomain().Height * 0.000001;
  255. }
  256. else if (m_poMsrArea.GetShape() == DOMAIN_SHAPE.ROUND)
  257. {
  258. totalArea = (m_poMsrArea.GetRectDomain().Width / 2) * (m_poMsrArea.GetRectDomain().Width / 2) * 3.14159 * 0.000001;
  259. }
  260. else
  261. {
  262. double singleFldarea= CalculateAFieldArea();
  263. totalArea = m_listFieldData.Count * singleFldarea;
  264. }
  265. return totalArea ;
  266. }
  267. public bool InitFieldPosData( out List<Point> lisFieldPos, out Size iSzie)
  268. {
  269. lisFieldPos = new List<Point>();
  270. iSzie = new Size();
  271. CDomain pMsrArea = this.GetMsrDomain();
  272. COTSImgScanPrm pImgScanParam = this.GetMsrParams().GetImageScanParam();
  273. COTSImageProcParam pImgProcParam = this.GetMsrParams().GetImageProcessParam();
  274. CSEMDataMsr pSEMDataMsr = this.GetSEMDataMsr();
  275. List<PointF> listPoint = new List<PointF>();
  276. listPoint.Clear();
  277. //calculate all the field position point in OTS coordination.
  278. if (!pFieldMgr.Init(pMsrArea, pImgScanParam, pImgProcParam.GetOverlapParam(), pSEMDataMsr, listPoint))
  279. {
  280. return false;
  281. }
  282. lisFieldPos = pFieldMgr.GetFieldCentrePoints();
  283. var oValue = new COTSRect();
  284. if (!pFieldMgr.GetOTSRectByIndex(0, ref oValue))
  285. {
  286. return false;
  287. }
  288. iSzie = new Size((int)oValue.GetWidth(), (int)oValue.GetHeight());
  289. return true;
  290. }
  291. public override void Serialize(bool isStoring, XmlDocument classDoc, XmlNode rootNode)
  292. {
  293. xString xstrSampleName = new xString();
  294. xString xstrHoleName = new xString();
  295. //xBool xParamLock = new xBool();
  296. xBool xSwitch = new xBool();
  297. xDouble xTotalArea = new xDouble();
  298. Collection<COTSField> fielddata = new Collection<COTSField>();
  299. Slo slo = new Slo();
  300. slo.Register("SampleName", xstrSampleName);
  301. slo.Register("HoleName", xstrHoleName);
  302. //slo.Register("ParamLock", xParamLock);
  303. slo.Register("Switch", xSwitch);
  304. slo.Register("MsrArea", m_poMsrArea);
  305. slo.Register("MsrParams", m_poMsrParams);
  306. slo.Register("SEMDataMsr", m_poSEMDataMsr);
  307. slo.Register("TotalArea", xTotalArea);
  308. slo.Register("AllFields", fielddata);
  309. if (isStoring)
  310. {
  311. xstrSampleName.AssignValue(m_strName);
  312. xstrHoleName.AssignValue(m_strHoleName);
  313. //xParamLock.AssignValue(m_bParamLock);
  314. xSwitch.AssignValue(m_bSwitch);
  315. xTotalArea.AssignValue(this.GetTotalToMeasureArea());
  316. foreach (var f in m_listFieldData)
  317. {
  318. fielddata.addItem(f);
  319. }
  320. slo.Serialize(true, classDoc, rootNode);
  321. }
  322. else
  323. {
  324. slo.Serialize(false, classDoc, rootNode);
  325. m_strName = xstrSampleName.value();
  326. m_strHoleName = xstrHoleName.value();
  327. //m_bParamLock = xParamLock.value();
  328. m_bSwitch = xSwitch.value();
  329. int i = 0;
  330. foreach (var f in fielddata.m_vCollection)
  331. {
  332. var fld = (COTSField)f;
  333. int w, h;
  334. this.GetBSESize(out w,out h);
  335. fld.ImgWidth = w;fld.ImgHeight = h;
  336. fld.SetPixelSize(CalculatePixelSize());
  337. fld.SetId(i);
  338. i++;
  339. m_listFieldData.Add(fld);
  340. }
  341. }
  342. }
  343. }
  344. }