COTSSample.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  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. namespace OTSDataType
  13. {
  14. public class COTSSample : ISlo
  15. {
  16. const string NOT_APPLIED = "N/A";
  17. private string m_strName;
  18. private string m_strHoleName;
  19. private bool m_bParamLock;
  20. private bool m_bSwitch;
  21. private CSampleParam m_poMsrParams;
  22. private CDomain m_poMsrArea;
  23. private CSEMDataMsr m_poSEMDataMsr;
  24. private CMsrSampleStatus m_Status;
  25. private CMsrResultItems m_poMsrResults;
  26. private MEMBRANE_TYPE m_membraneType;
  27. private List<COTSFieldData> m_listFieldData;
  28. public COTSSample()
  29. {
  30. // initialization
  31. Init();
  32. }
  33. void Init()
  34. {
  35. m_strName = "";
  36. m_strHoleName = "";
  37. m_bParamLock = false;
  38. m_bSwitch = true;
  39. m_poMsrParams = new CSampleParam();
  40. m_poMsrArea = new CDomain();
  41. m_poSEMDataMsr = new CSEMDataMsr();
  42. m_Status = new CMsrSampleStatus();
  43. m_poMsrResults = new CMsrResultItems();
  44. m_membraneType = MEMBRANE_TYPE.Abrasive;
  45. m_listFieldData = new List<COTSFieldData>();
  46. }
  47. public CDomain GetMsrDomain() { return m_poMsrArea; }
  48. // calculate scan field size
  49. public void CalculateScanFieldSize(double a_dPixelSize,ref int scanFieldWidth,ref int scanFieldHeight)
  50. {
  51. // get image size
  52. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poMsrParams.GetImageScanParam().GetImageResulotion();
  53. long nResulotionId = RESOLUTION_ID_FIRST_TIE + (long)nImageSizeId;
  54. int nImagewidth = RESOLUTION_VALUE[nResulotionId].Width;
  55. int nHeight = RESOLUTION_VALUE[nResulotionId].Height;
  56. // calculate scan field size
  57. scanFieldWidth = (int)((a_dPixelSize * (double)nImagewidth) + 0.5);
  58. scanFieldHeight= (int)((a_dPixelSize * (double)nHeight) + 0.5);
  59. }
  60. public bool GetBSESize(out int a_nWidth, out int a_nHeight)
  61. {
  62. // scan parameters
  63. CSampleParam pMsrParam = GetMsrParams();
  64. COTSImgScanPrm pImgScanParam = pMsrParam.GetImageScanParam();
  65. // get image size
  66. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = pImgScanParam.GetImageResulotion();
  67. int nResulotionId = RESOLUTION_ID_FIRST_TIE + (int)nImageSizeId;
  68. Size sizePixelImage = RESOLUTION_VALUE[nResulotionId];
  69. // get scan field size
  70. a_nWidth = sizePixelImage.Width;
  71. a_nHeight = sizePixelImage.Height;
  72. return true;
  73. }
  74. // name
  75. public string GetName() { return m_strName; }
  76. public void SetName(string a_strName) { m_strName = a_strName; }
  77. // sample hole
  78. public string GetSampleHoleName() { return m_strHoleName; }
  79. public void SetSampleHoleName(string a_strHoleName) { m_strHoleName = a_strHoleName; }
  80. // param modify lock
  81. public bool GetParamLock() { return m_bParamLock; }
  82. public void SetParamLock(bool a_bParamLock) { m_bParamLock = a_bParamLock; }
  83. // switch
  84. public bool GetSwitch() { return m_bSwitch; }
  85. public void SetSwitch(bool a_bSwitch) { m_bSwitch = a_bSwitch; }
  86. // measurement parameter
  87. public CSampleParam GetMsrParams() { return m_poMsrParams; }
  88. public void SetMsrParams(CSampleParam a_poMsrParams)
  89. {
  90. m_poMsrParams = a_poMsrParams;
  91. }
  92. // measurement area
  93. public void SetMsrDomain(CDomain a_poMsrArea)
  94. {
  95. m_poMsrArea = a_poMsrArea;
  96. }
  97. // SEM data (measurement)
  98. public CSEMDataMsr GetSEMDataMsr() { return m_poSEMDataMsr; }
  99. public void SetSEMDataMsr(CSEMDataMsr a_poSEMDataMsr)
  100. {
  101. m_poSEMDataMsr = a_poSEMDataMsr;
  102. }
  103. // measure status
  104. public CMsrSampleStatus GetMsrStatus() { return m_Status; }
  105. public void SetMsrStatus(CMsrSampleStatus a_poMsrStatus)
  106. {
  107. m_Status = a_poMsrStatus;
  108. }
  109. // fields
  110. public List<COTSFieldData> GetFieldsData() { return m_listFieldData; }
  111. public void SetFieldsData(List<COTSFieldData> a_listFieldData)
  112. {
  113. m_listFieldData = a_listFieldData;
  114. for (int i = 0; i < m_listFieldData.Count; i++)
  115. {
  116. m_listFieldData[i].SetId(i);
  117. }
  118. var mySemdata = GetSEMDataMsr();
  119. mySemdata.SetTotalFields(m_listFieldData.Count);
  120. }
  121. public void AddFieldData(PointF centerPoint )
  122. {
  123. var pixelsize = CalculatePixelSize();
  124. var newfld = new COTSFieldData(centerPoint, pixelsize);
  125. int nNewFieldId;
  126. nNewFieldId =GetIdForANewField();
  127. newfld.SetId(nNewFieldId);
  128. m_listFieldData.Add(newfld);
  129. var mySemdata = GetSEMDataMsr();
  130. mySemdata.SetTotalFields(m_listFieldData.Count);
  131. }
  132. public void ClearFields()
  133. {
  134. m_listFieldData.Clear();
  135. }
  136. public int GetIdForANewField()
  137. {
  138. List<COTSFieldData> listFieldData = GetFieldsData();
  139. // new field id
  140. int nNewFieldId = listFieldData.Count;
  141. do
  142. {
  143. bool iffound = false;
  144. COTSFieldData cOTSFieldData;
  145. for (int i = 0; i < listFieldData.Count; i++)
  146. {
  147. cOTSFieldData = listFieldData[i];
  148. if (cOTSFieldData.GetId() == nNewFieldId)
  149. {
  150. iffound = true;
  151. }
  152. }
  153. if (iffound == true)
  154. {
  155. ++nNewFieldId;
  156. }
  157. else
  158. {
  159. break;
  160. }
  161. } while (true);
  162. return nNewFieldId;
  163. }
  164. // measure results
  165. public CMsrResultItems GetMsrResults() { return m_poMsrResults; }
  166. public void SetMsrResults(CMsrResultItems a_poMsrResults)
  167. {
  168. m_poMsrResults = a_poMsrResults;
  169. }
  170. // has measure results test
  171. public bool HasMeasureResult()
  172. {
  173. // result items is not empty
  174. bool bHasResult = (m_poMsrResults.GetResultItems().Count != 0);
  175. return bHasResult;
  176. }
  177. public MEMBRANE_TYPE GetMembraneType() { return m_membraneType; }
  178. public void SetMembraneType(MEMBRANE_TYPE val) { m_membraneType = val; }
  179. public double CalculatePixelSize()
  180. {
  181. // pixel size
  182. double dPixelSize = 0.0;
  183. // make sure SEM is valid
  184. if (m_poSEMDataMsr != new CSEMDataMsr())
  185. {
  186. // get scan field size
  187. int nScanFieldSize = m_poSEMDataMsr.GetScanFieldSize();
  188. // get image size
  189. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poMsrParams.GetImageScanParam().GetImageResulotion();
  190. long nResulotionId = RESOLUTION_ID_FIRST_TIE + (long)nImageSizeId;
  191. int nImageSize = RESOLUTION_VALUE[nResulotionId].Width;
  192. // calculate pixel size
  193. dPixelSize = (double)nScanFieldSize / (double)nImageSize;
  194. }
  195. // return pixel size
  196. return dPixelSize;
  197. }
  198. public Size GetResolutionSize()
  199. {
  200. // get scan field size
  201. int nScanFieldSize = m_poSEMDataMsr.GetScanFieldSize();
  202. // get image size
  203. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poMsrParams.GetImageScanParam().GetImageResulotion();
  204. long nResulotionId = RESOLUTION_ID_FIRST_TIE + (long)nImageSizeId;
  205. return RESOLUTION_VALUE[nResulotionId];
  206. }
  207. // calculate field area
  208. public double CalculateAFieldArea()
  209. {
  210. // pixel size
  211. double dAFieldArea = 0.0;
  212. // make sure SEM is valid
  213. if (m_poSEMDataMsr != new CSEMDataMsr())
  214. {
  215. // get image size
  216. OTS_IMAGE_RESULOTION_OPTIONS nImageSizeId = m_poMsrParams.GetImageScanParam().GetImageResulotion();
  217. long nResulotionId = RESOLUTION_ID_FIRST_TIE + (long)nImageSizeId;
  218. int nImageSize = RESOLUTION_VALUE[nResulotionId].Width;
  219. int nHeight = RESOLUTION_VALUE[nResulotionId].Height;
  220. // pixel size (micros)
  221. double dPixelSize = 0;
  222. dPixelSize = CalculatePixelSize();
  223. // calculate pixel size
  224. dAFieldArea = (double)nImageSize * nHeight * dPixelSize * dPixelSize * 0.000001;// mm^2
  225. }
  226. // return pixel size
  227. return dAFieldArea;
  228. }
  229. public bool CalculateFieldData(out List<Point> pFields, out Size iSzie)
  230. {
  231. pFields = new List<Point>();
  232. iSzie = new Size();
  233. CDomain pMsrArea = GetMsrDomain();
  234. COTSImgScanPrm pImgScanParam =GetMsrParams().GetImageScanParam();
  235. var pImgProcParam = GetMsrParams().GetImageProcessParam();
  236. CSEMDataMsr pSEMDataMsr = GetSEMDataMsr();
  237. CFieldPositionMgr pFieldMgr = new CFieldPositionMgr();
  238. List<PointF> listPoint = new List<PointF>();
  239. listPoint.Clear();
  240. ////计算所有的帧图位置 calculate all the field position point in OTS coordination.
  241. if (!pFieldMgr.Init(pMsrArea, pImgScanParam, pImgProcParam, pSEMDataMsr, listPoint))
  242. {
  243. return false;
  244. }
  245. //获取幁图的中心点
  246. pFields = pFieldMgr.GetFieldCentrePoints();
  247. //获取幁图数
  248. int iFieldCount = pFieldMgr.GetTotalFields();
  249. var oValue = new Rectangle();
  250. if (!pFieldMgr.GetFieldRectByIndex(0, ref oValue))
  251. {
  252. return false;
  253. }
  254. iSzie = oValue.Size;
  255. GetSEMDataMsr().SetTotalFields(iFieldCount);
  256. return true;
  257. }
  258. public override void Serialize(bool isStoring, XmlDocument classDoc, XmlNode rootNode)
  259. {
  260. xString xstrSampleName = new xString();
  261. xString xstrHoleName = new xString();
  262. xBool xParamLock = new xBool();
  263. xBool xSwitch = new xBool();
  264. Collection<COTSFieldData> fielddata = new Collection<COTSFieldData>();
  265. Slo slo = new Slo();
  266. slo.Register("SampleName", xstrSampleName);
  267. slo.Register("HoleName", xstrHoleName);
  268. slo.Register("ParamLock", xParamLock);
  269. slo.Register("Switch", xSwitch);
  270. slo.Register("MsrArea", m_poMsrArea);
  271. slo.Register("MsrParams", m_poMsrParams);
  272. slo.Register("SEMDataMsr", m_poSEMDataMsr);
  273. slo.Register("AllFields", fielddata);
  274. if (isStoring)
  275. {
  276. xstrSampleName.AssignValue(m_strName);
  277. xstrHoleName.AssignValue(m_strHoleName);
  278. xParamLock.AssignValue(m_bParamLock);
  279. xSwitch.AssignValue(m_bSwitch);
  280. foreach (var f in m_listFieldData)
  281. {
  282. fielddata.addItem(f);
  283. }
  284. slo.Serialize(true, classDoc, rootNode);
  285. }
  286. else
  287. {
  288. slo.Serialize(false, classDoc, rootNode);
  289. m_strName = xstrSampleName.value();
  290. m_strHoleName = xstrHoleName.value();
  291. m_bParamLock = xParamLock.value();
  292. m_bSwitch = xSwitch.value();
  293. foreach (var f in fielddata.m_vCollection)
  294. {
  295. var fld = (COTSFieldData)f;
  296. int w, h;
  297. this.GetBSESize(out w,out h);
  298. fld.Width = w;fld.Height = h;
  299. fld.SetPixelSize(CalculatePixelSize());
  300. m_listFieldData.Add((COTSFieldData)f);
  301. }
  302. }
  303. }
  304. }
  305. }