MsrResults.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. // MsrResults.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "OTSData.h"
  5. #include "MsrResults.h"
  6. #include "otsdataconst.h"
  7. namespace OTSMODEL {
  8. using namespace OTSDATA;
  9. // CMsrResultItem
  10. // constructor
  11. CMsrResultItem::CMsrResultItem()
  12. {
  13. // initialization
  14. Init();
  15. }
  16. // copy constructor
  17. CMsrResultItem::CMsrResultItem(const CMsrResultItem& a_oSource)
  18. {
  19. // can't copy itself
  20. if (&a_oSource == this)
  21. {
  22. return;
  23. }
  24. // copy data over
  25. Duplicate(a_oSource);
  26. }
  27. // copy constructor
  28. CMsrResultItem::CMsrResultItem(CMsrResultItem* a_poSource)
  29. {
  30. // input check
  31. ASSERT(a_poSource);
  32. if (!a_poSource)
  33. {
  34. return;
  35. }
  36. // can't copy itself
  37. if (a_poSource == this)
  38. {
  39. return;
  40. }
  41. // copy data over
  42. Duplicate(*a_poSource);
  43. }
  44. // =operator
  45. CMsrResultItem& CMsrResultItem::operator=(const CMsrResultItem& a_oSource)
  46. {
  47. // cleanup
  48. Cleanup();
  49. // copy the class data over
  50. Duplicate(a_oSource);
  51. // return class
  52. return *this;
  53. }
  54. // destructor
  55. CMsrResultItem::~CMsrResultItem()
  56. {
  57. // cleanup
  58. Cleanup();
  59. }
  60. // ==operator
  61. BOOL CMsrResultItem::operator==(const CMsrResultItem& a_oSource)
  62. {
  63. return m_nTypeId == a_oSource.m_nTypeId &&
  64. m_nArea == a_oSource.m_nArea &&
  65. m_nNumber == a_oSource.m_nNumber;
  66. }
  67. // CMsrResultItem member functions
  68. // public
  69. // serialization
  70. void CMsrResultItem::Serialize(bool isStoring, tinyxml2::XMLDocument * classDoc, tinyxml2::XMLElement * rootNode)
  71. {
  72. xmls::xInt xTypeId;
  73. xmls::xDouble xArea;
  74. xmls::xDWORD xNumber;
  75. xmls::Slo slo;
  76. slo.Register("TypeId", &xTypeId);
  77. slo.Register("Area", &xArea);
  78. slo.Register("Number", &xNumber);
  79. if (isStoring)
  80. {
  81. xTypeId = m_nTypeId;
  82. xArea = m_nArea;
  83. xNumber = m_nNumber;
  84. slo.Serialize(true, classDoc, rootNode);
  85. }
  86. else
  87. {
  88. slo.Serialize(false, classDoc, rootNode);
  89. m_nTypeId = xTypeId.value();
  90. m_nArea = xArea.value();
  91. m_nNumber = xNumber.value();
  92. }
  93. }
  94. // protected
  95. // cleanup
  96. void CMsrResultItem::Cleanup()
  97. {
  98. // need to do nothing at the moment
  99. }
  100. // initialization
  101. void CMsrResultItem::Init()
  102. {
  103. m_nTypeId = -1;
  104. m_nArea = 0;
  105. m_nNumber = 0;
  106. }
  107. // duplication
  108. void CMsrResultItem::Duplicate(const CMsrResultItem& a_oSource)
  109. {
  110. // initialization
  111. Init();
  112. // copy data over
  113. m_nTypeId = a_oSource.m_nTypeId;
  114. m_nArea = a_oSource.m_nArea;
  115. m_nNumber = a_oSource.m_nNumber;
  116. }
  117. // CMsrResults
  118. // constructor
  119. CMsrResults::CMsrResults()
  120. {
  121. // initialization
  122. Init();
  123. }
  124. // copy constructor
  125. CMsrResults::CMsrResults(const CMsrResults& a_oSource)
  126. {
  127. // can't copy itself
  128. if (&a_oSource == this)
  129. {
  130. return;
  131. }
  132. // copy data over
  133. Duplicate(a_oSource);
  134. }
  135. // copy constructor
  136. CMsrResults::CMsrResults(CMsrResults* a_poSource)
  137. {
  138. // can't copy itself
  139. if (a_poSource == this)
  140. {
  141. return;
  142. }
  143. // copy data over
  144. Duplicate(*a_poSource);
  145. }
  146. // =operator
  147. CMsrResults& CMsrResults::operator=(const CMsrResults& a_oSource)
  148. {
  149. // cleanup
  150. Cleanup();
  151. // copy the class data over
  152. Duplicate(a_oSource);
  153. // return class
  154. return *this;
  155. }
  156. // destructor
  157. CMsrResults::~CMsrResults()
  158. {
  159. // cleanup
  160. Cleanup();
  161. }
  162. // ==operator
  163. BOOL CMsrResults::operator==(const CMsrResults& a_oSource)
  164. {
  165. // return FASLE, if the two holes list are in different size
  166. int nSize = (int)m_listResultItems.size();
  167. if (nSize != (int)a_oSource.m_listResultItems.size())
  168. {
  169. return FALSE;
  170. }
  171. // return FALSE if any of the pare holes are different
  172. for (int i = 0; i < nSize; ++i)
  173. {
  174. if (!(*(m_listResultItems[i].get()) == *(a_oSource.m_listResultItems[i].get())))
  175. {
  176. return FALSE;
  177. }
  178. }
  179. // members check
  180. return ( ( abs(m_dRadio - a_oSource.m_dRadio) <MIN_DOUBLE_VALUE )&& (m_nMeasuredArea == a_oSource.m_nMeasuredArea));
  181. }
  182. // CMsrResults member functions
  183. // public
  184. // serialization
  185. void CMsrResults::Serialize(bool isStoring, tinyxml2::XMLDocument * classDoc, tinyxml2::XMLElement * rootNode)
  186. {
  187. xmls::xDouble xdRadio;
  188. xmls::xDWORD xnMeasuredArea;
  189. xmls::Collection<CMsrResultItem> xResultItemlist;
  190. xmls::Slo slo;
  191. slo.Register("Ratio", &xdRadio);
  192. slo.Register("MeasuredArea", &xnMeasuredArea);
  193. slo.Register("ResultItems", &xResultItemlist);
  194. if (isStoring)
  195. {
  196. xdRadio = m_dRadio;
  197. xnMeasuredArea = m_nMeasuredArea;
  198. xResultItemlist.Clear();
  199. for (unsigned int i = 0; i < m_listResultItems.size(); i++)
  200. {
  201. xResultItemlist.addItem(m_listResultItems[i].get());
  202. }
  203. slo.Serialize(true, classDoc, rootNode);
  204. }
  205. else
  206. {
  207. slo.Serialize(false, classDoc, rootNode);
  208. m_dRadio = xdRadio.value();
  209. m_nMeasuredArea = xnMeasuredArea.value();
  210. m_listResultItems.clear();
  211. for (unsigned int i = 0; i < xResultItemlist.size(); i++)
  212. {
  213. m_listResultItems.push_back(CMsrResultItemPtr(xResultItemlist.getItem(i)));
  214. }
  215. }
  216. }
  217. // results item list
  218. void CMsrResults::SetResultItems(CMsrResultItemsList& a_listResultItems)
  219. {
  220. // set results item list
  221. m_listResultItems.clear();
  222. for (auto poResultItem : a_listResultItems)
  223. {
  224. CMsrResultItemPtr poResultItemNew(new CMsrResultItem(poResultItem.get()));
  225. m_listResultItems.push_back(poResultItemNew);
  226. }
  227. }
  228. DWORD CMsrResults::GetTotalParticleArea()
  229. {
  230. DWORD nArea = 0;
  231. for (auto poResultItem : m_listResultItems)
  232. {
  233. nArea += poResultItem->GetArea();
  234. }
  235. return nArea;
  236. }
  237. DWORD CMsrResults::GetTotalparticleIdentifyArea()
  238. {
  239. DWORD nArea = 0;
  240. for (auto poResultItem : m_listResultItems)
  241. {
  242. if (poResultItem->GetTypeId() > 7)
  243. {
  244. nArea += poResultItem->GetArea();
  245. }
  246. }
  247. return nArea;
  248. }
  249. DWORD CMsrResults::GetTotalParticleNumber()
  250. {
  251. DWORD nParticleNum = 0;
  252. for (auto poResultItem : m_listResultItems)
  253. {
  254. nParticleNum += poResultItem->GetNumber();
  255. }
  256. return nParticleNum;
  257. }
  258. // calculate display radio
  259. double CMsrResults::CalDisplayRadio()
  260. {
  261. double dDisplayRadio = 0;
  262. if (m_nMeasuredArea == 0)
  263. {
  264. return dDisplayRadio;
  265. }
  266. DWORD nTotalParticleArea = GetTotalParticleArea();
  267. dDisplayRadio = (double)nTotalParticleArea / (double)m_nMeasuredArea * m_dRadio;
  268. return dDisplayRadio;
  269. }
  270. // cumulate measure results
  271. void CMsrResults::CumulateMeasureResults(CMsrResultItemPtr a_poResultItem)
  272. {
  273. // input check
  274. ASSERT(a_poResultItem);
  275. if (!a_poResultItem)
  276. {
  277. return;
  278. }
  279. // find if same type item already in the list
  280. int nTypeId = a_poResultItem->GetTypeId();
  281. if (nTypeId == -1)
  282. {
  283. // invalid item
  284. return;
  285. }
  286. auto itr = std::find_if(m_listResultItems.begin(), m_listResultItems.end(), [nTypeId](CMsrResultItemPtr& poResultItem) { return poResultItem->GetTypeId() == nTypeId; });
  287. if (itr != m_listResultItems.end())
  288. {
  289. // same type item already in the list
  290. // get the item
  291. CMsrResultItemPtr poResultItem = *(itr);
  292. poResultItem->SetArea(poResultItem->GetArea() + a_poResultItem->GetArea());
  293. poResultItem->SetNumber(poResultItem->GetNumber() + a_poResultItem->GetNumber());
  294. // get out
  295. return;
  296. }
  297. else
  298. {
  299. m_listResultItems.push_back(a_poResultItem);
  300. }
  301. }
  302. void CMsrResults::CumulateMeasureResults(CMsrResultItemsList& a_listResultItems)
  303. {
  304. for (auto poResultItem : a_listResultItems)
  305. {
  306. CumulateMeasureResults(poResultItem);
  307. }
  308. }
  309. // protected
  310. // cleanup
  311. void CMsrResults::Cleanup()
  312. {
  313. // need to do nothing at the moment
  314. }
  315. // initialization
  316. void CMsrResults::Init()
  317. {
  318. m_dRadio = DEFAULT_RADIO;
  319. m_nMeasuredArea = 0;
  320. m_listResultItems.clear();
  321. }
  322. // duplication
  323. void CMsrResults::Duplicate(const CMsrResults& a_oSource)
  324. {
  325. // initialization
  326. Init();
  327. // copy data over
  328. m_dRadio = a_oSource.m_dRadio;
  329. m_nMeasuredArea = a_oSource.m_nMeasuredArea;
  330. for(auto poResultItem : a_oSource.m_listResultItems)
  331. {
  332. CMsrResultItemPtr poResultItem(new CMsrResultItem(poResultItem.get()));
  333. m_listResultItems.push_back(poResultItem);
  334. }
  335. }
  336. }