OTSSample.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. #include "stdafx.h"
  2. #include "OTSData.h"
  3. #include "OTSSample.h"
  4. namespace OTSMODEL {
  5. // constructor
  6. COTSSample::COTSSample()
  7. {
  8. // initialization
  9. Init();
  10. }
  11. // copy constructor
  12. COTSSample::COTSSample(const COTSSample& a_oSource)
  13. {
  14. // can't copy itself
  15. if (&a_oSource == this)
  16. {
  17. return;
  18. }
  19. // copy data over
  20. Duplicate(a_oSource);
  21. }
  22. // copy constructor
  23. COTSSample::COTSSample(COTSSample* a_poSource)
  24. {
  25. // input check
  26. ASSERT(a_poSource);
  27. if (!a_poSource)
  28. {
  29. return;
  30. }
  31. // can't copy itself
  32. if (a_poSource == this)
  33. {
  34. return;
  35. }
  36. // copy data over
  37. Duplicate(*a_poSource);
  38. }
  39. // =operator
  40. COTSSample& COTSSample::operator=(const COTSSample& a_oSource)
  41. {
  42. // cleanup
  43. Cleanup();
  44. // copy the class data over
  45. Duplicate(a_oSource);
  46. // return class
  47. return *this;
  48. }
  49. // destructor
  50. COTSSample::~COTSSample()
  51. {
  52. // cleanup
  53. Cleanup();
  54. }
  55. // ==operator
  56. BOOL COTSSample::operator==(const COTSSample& a_oSource)
  57. {
  58. return m_strName.Compare(a_oSource.m_strName) == 0 &&
  59. m_strHoleName == a_oSource.m_strHoleName &&
  60. m_bParamLock == a_oSource.m_bParamLock &&
  61. m_bSwitch == a_oSource.m_bSwitch &&
  62. *(m_poMsrArea.get()) == *(a_oSource.m_poMsrArea.get()) &&
  63. *(m_poSEMDataMsr.get()) == *(a_oSource.m_poSEMDataMsr.get());
  64. }
  65. void COTSSample::Serialize(bool isStoring, tinyxml2::XMLDocument* classDoc, tinyxml2::XMLElement* rootNode)
  66. {
  67. xmls::xString xstrName;
  68. xmls::xString xstrHoleName;
  69. xmls::xBool xbParamlock;
  70. xmls::xBool xbSwitch;
  71. xmls::Slo slo;
  72. slo.Register("SampleName", &xstrName);
  73. slo.Register("HoleName", &xstrHoleName);
  74. slo.Register("ParamLock", &xbParamlock);
  75. slo.Register("Switch", &xbSwitch);
  76. slo.Register("MsrParams", m_poMsrParams.get());
  77. slo.Register("MsrArea", m_poMsrArea.get());
  78. slo.Register("SEMDataMsr", m_poSEMDataMsr.get());
  79. /*slo.Register("MsrStatus", m_poMsrStatus.get());
  80. slo.Register("MsrResults", m_poMsrResults.get());*/
  81. if (isStoring)
  82. {
  83. xstrName = m_strName;
  84. xstrHoleName = m_strHoleName;
  85. xbParamlock = m_bParamLock;
  86. xbSwitch = m_bSwitch;
  87. slo.Serialize(true, classDoc, rootNode);
  88. }
  89. else
  90. {
  91. slo.Serialize(false, classDoc, rootNode);
  92. m_strName = xstrName.value().c_str();
  93. m_strHoleName = xstrHoleName.value().c_str();
  94. m_bParamLock = xbParamlock.value();
  95. m_bSwitch = xbSwitch.value();
  96. }
  97. }
  98. COTSParticleList COTSSample::GetAllParticles()
  99. {
  100. COTSParticleList listParticle;
  101. COTSFieldDataList& listFieldData = this->GetFieldsData();
  102. for (auto pFieldData : listFieldData)
  103. {
  104. COTSParticleList listParticlenew = pFieldData->GetParticleList();
  105. for (auto pParticle : listParticlenew)
  106. {
  107. listParticle.push_back(pParticle);
  108. }
  109. }
  110. return listParticle;
  111. }
  112. // measurement parameter
  113. void COTSSample::SetMsrParams(CMsrParamsPtr a_poMsrParams)
  114. {
  115. // make sure that measure parameters is always valid
  116. if (!a_poMsrParams)
  117. {
  118. m_poMsrParams = CMsrParamsPtr(new CMsrParams());
  119. }
  120. else
  121. {
  122. m_poMsrParams = CMsrParamsPtr(new CMsrParams(a_poMsrParams.get()));
  123. }
  124. }
  125. // measurement area
  126. void COTSSample::SetMsrArea(CDomainPtr a_poMsrArea)
  127. {
  128. // make sure that measure area is always valid
  129. if (!a_poMsrArea)
  130. {
  131. m_poMsrArea = CDomainPtr(new CDomain());
  132. }
  133. else
  134. {
  135. m_poMsrArea = CDomainPtr(new CDomain(a_poMsrArea.get()));
  136. }
  137. }
  138. // SEM data (measurement)
  139. void COTSSample::SetSEMDataMsr(CSEMDataMsrPtr a_poSEMDataMsr)
  140. {
  141. // make sure that measure SEM data is always valid
  142. if (!a_poSEMDataMsr)
  143. {
  144. m_poSEMDataMsr = CSEMDataMsrPtr(new CSEMDataMsr());
  145. }
  146. else
  147. {
  148. m_poSEMDataMsr = CSEMDataMsrPtr(new CSEMDataMsr(a_poSEMDataMsr.get()));
  149. }
  150. }
  151. // measure status
  152. void COTSSample::SetMsrStatus(CMsrSampleStatusPtr a_poMsrStatus)
  153. {
  154. // make sure that measure status is always valid
  155. if (!a_poMsrStatus)
  156. {
  157. m_poMsrStatus = CMsrSampleStatusPtr(new CMsrSampleStatus());
  158. }
  159. else
  160. {
  161. m_poMsrStatus = CMsrSampleStatusPtr(new CMsrSampleStatus(a_poMsrStatus.get()));
  162. }
  163. }
  164. // measure results
  165. void COTSSample::SetMsrResults(CMsrResultsPtr a_poMsrResults)
  166. {
  167. // make sure that measure results is always valid
  168. if (!a_poMsrResults)
  169. {
  170. m_poMsrResults = CMsrResultsPtr(new CMsrResults());
  171. }
  172. else
  173. {
  174. m_poMsrResults = CMsrResultsPtr(new CMsrResults(a_poMsrResults.get()));
  175. }
  176. }
  177. // fields
  178. void COTSSample::SetFieldsData(COTSFieldDataList& a_listFieldData)
  179. {
  180. m_listFieldData.clear();
  181. for (auto pFieldData : a_listFieldData)
  182. {
  183. COTSFieldDataPtr pFieldDataNew = pFieldData;
  184. m_listFieldData.push_back(pFieldDataNew);
  185. }
  186. }
  187. // has measure results test
  188. BOOL COTSSample::HasMeasureResult()
  189. {
  190. // result items is not empty
  191. BOOL bHasResult = !(m_poMsrResults->GetResultItems().empty());
  192. return bHasResult;
  193. }
  194. // calculate pixel size
  195. double COTSSample::CalculateAFieldArea()
  196. {
  197. // pixel size
  198. double dAFieldArea = 0.0;
  199. int nImageSize =m_BseSize.cx;
  200. // pixel size (micros)
  201. double dPixelSize = 0;
  202. dPixelSize = m_pixelsize;
  203. // calculate pixel size
  204. dAFieldArea = (double)nImageSize * (double)m_BseSize.cy * dPixelSize * dPixelSize * 0.000001;// mm^2
  205. // return pixel size
  206. return dAFieldArea;
  207. }
  208. BOOL COTSSample::GetBSESize(int& a_nWidth, int& a_nHeight)
  209. {
  210. // get scan field size
  211. a_nWidth = m_BseSize.cx;
  212. a_nHeight = m_BseSize.cy;
  213. return TRUE;
  214. }
  215. // protected
  216. // cleanup
  217. void COTSSample::Cleanup()
  218. {
  219. // need to do nothing at the moment
  220. }
  221. // initialization
  222. void COTSSample::Init()
  223. {
  224. m_strName = _T("");
  225. m_strHoleName = _T("");
  226. m_bParamLock = FALSE;
  227. m_bSwitch = TRUE;
  228. m_poMsrArea = CDomainPtr(new CDomain());
  229. m_poSEMDataMsr = CSEMDataMsrPtr(new CSEMDataMsr());
  230. m_poMsrParams = CMsrParamsPtr(new CMsrParams());
  231. m_poMsrStatus = CMsrSampleStatusPtr(new CMsrSampleStatus());
  232. m_poMsrResults = CMsrResultsPtr(new CMsrResults());
  233. }
  234. // duplication
  235. void COTSSample::Duplicate(const COTSSample& a_oSource)
  236. {
  237. // initialization
  238. Init();
  239. // copy data over
  240. m_strName = a_oSource.m_strName;
  241. m_strHoleName = a_oSource.m_strHoleName;
  242. m_bParamLock = a_oSource.m_bParamLock;
  243. m_bSwitch = a_oSource.m_bSwitch;
  244. m_poMsrArea = CDomainPtr(new CDomain(a_oSource.m_poMsrArea.get()));
  245. m_poSEMDataMsr = CSEMDataMsrPtr(new CSEMDataMsr(a_oSource.m_poSEMDataMsr.get()));
  246. }
  247. // create a property items group
  248. // calculate scan field size
  249. int COTSSample::CalculateScanFieldSize()
  250. {
  251. // scan field size
  252. int nScanFiledSize = 0;
  253. int nImageSize = m_BseSize.cx;
  254. // calculate scan field size
  255. nScanFiledSize = (int)((m_pixelsize * (double)nImageSize) + 0.5);
  256. // return scan field size
  257. return nScanFiledSize;
  258. }
  259. }