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