CGBLevel.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. #pragma once
  2. #include "stdafx.h"
  3. #include "otsdataconst.h"
  4. #include "CGBLevel.h"
  5. #include "GBFieldData.h"
  6. #include <map>
  7. namespace OTSGBCalculate
  8. {
  9. using namespace std;
  10. using namespace OTSDATA;
  11. CGBLevel::CGBLevel() // constructor
  12. {
  13. Init();
  14. }
  15. CGBLevel::CGBLevel(CGBFieldData* GBField, GB_LEVEL_TYPE a_nLevel)
  16. {
  17. m_GBField = GBField;
  18. m_nLevel = a_nLevel;
  19. }
  20. CGBLevel::CGBLevel(const CGBLevel& a_oSource) // copy constructor
  21. {
  22. // can't copy itself
  23. if (&a_oSource == this)
  24. {
  25. return;
  26. }
  27. // copy data over
  28. Duplicate(a_oSource);
  29. }
  30. CGBLevel::CGBLevel(CGBLevel* a_poSource) // copy constructor
  31. {
  32. // input check
  33. ASSERT(a_poSource);
  34. if (!a_poSource)
  35. {
  36. return;
  37. }
  38. // can't copy itself
  39. if (a_poSource == this)
  40. {
  41. return;
  42. }
  43. // copy data over
  44. Duplicate(*a_poSource);
  45. }
  46. CGBLevel& CGBLevel::operator=(const CGBLevel& a_oSource) // =operator
  47. {
  48. // cleanup
  49. Cleanup();
  50. // copy the class data over
  51. Duplicate(a_oSource);
  52. // return class
  53. return *this;
  54. }
  55. BOOL CGBLevel::operator==(const CGBLevel& a_oSource) // =operator
  56. {
  57. // return test result
  58. return(m_nLevel == a_oSource.m_nLevel);
  59. }
  60. CGBLevel::~CGBLevel() // detractor
  61. {
  62. Cleanup();
  63. }
  64. GB_GRADE_TYPE CGBLevel::GetThinGrade()
  65. {
  66. // get grade
  67. // A
  68. double dLengthAll = 0;
  69. int nSize;
  70. switch (m_nLevel)
  71. {
  72. case GB_LEVEL_TYPE::A_TYPE:
  73. for (auto pAparticle : m_GBField->listAThinParticles)
  74. {
  75. double dLength = pAparticle->GetDMax();
  76. dLengthAll += dLength;
  77. }
  78. return GetAGrade(dLengthAll);
  79. break;
  80. case GB_LEVEL_TYPE::B_TYPE:
  81. dLengthAll = 0;
  82. for (auto pBparticle : m_GBField->listBThinParticles)
  83. {
  84. double dLength = pBparticle->GetDMax();
  85. dLengthAll += dLength;
  86. }
  87. return GetBGrade(dLengthAll);
  88. case GB_LEVEL_TYPE::C_TYPE:
  89. dLengthAll = 0;
  90. for (auto pCparticle : m_GBField->listCThinParticles)
  91. {
  92. double dLength = pCparticle->GetDMax();
  93. dLengthAll += dLength;
  94. }
  95. return GetCGrade(dLengthAll);
  96. break;
  97. case GB_LEVEL_TYPE::D_TYPE:
  98. nSize = (int)m_GBField->listDThinParticles.size();
  99. return GetDGrade(nSize);
  100. break;
  101. case GB_LEVEL_TYPE::DSulfide_TYPE:
  102. nSize = (int)m_GBField->listDSulfideThinParticles.size();
  103. return GetDGrade(nSize);
  104. break;
  105. }
  106. return GB_GRADE_TYPE::INVALID;
  107. }
  108. GB_GRADE_TYPE CGBLevel::GetWideGrade()
  109. {
  110. double dLengthAll = 0;
  111. int nSize;
  112. switch (m_nLevel)
  113. {
  114. case GB_LEVEL_TYPE::A_TYPE:
  115. for (auto pAparticle : m_GBField->listAThinParticles)
  116. {
  117. double dLength = pAparticle->GetDMax();
  118. dLengthAll += dLength;
  119. }
  120. return GetAGrade(dLengthAll);
  121. break;
  122. case GB_LEVEL_TYPE::B_TYPE:
  123. dLengthAll = 0;
  124. for (auto pBparticle : m_GBField->listBThinParticles)
  125. {
  126. double dLength = pBparticle->GetDMax();
  127. dLengthAll += dLength;
  128. }
  129. return GetBGrade(dLengthAll);
  130. case GB_LEVEL_TYPE::C_TYPE:
  131. dLengthAll = 0;
  132. for (auto pCparticle : m_GBField->listCWideParticles)
  133. {
  134. double dLength = pCparticle->GetDMax();
  135. dLengthAll += dLength;
  136. }
  137. return GetCGrade(dLengthAll);
  138. break;
  139. case GB_LEVEL_TYPE::D_TYPE:
  140. nSize = (int)m_GBField->listDWideParticles.size();
  141. return GetDGrade(nSize);
  142. break;
  143. case GB_LEVEL_TYPE::DSulfide_TYPE:
  144. nSize = (int)m_GBField->listDSulfideWideParticles.size();
  145. return GetDGrade(nSize);
  146. break;
  147. }
  148. return GB_GRADE_TYPE::INVALID;
  149. }
  150. GB_GRADE_TYPE CGBLevel::GetSuperGrade()
  151. {
  152. double dLengthAll = 0;
  153. int nSize;
  154. switch (m_nLevel)
  155. {
  156. case GB_LEVEL_TYPE::A_TYPE:
  157. for (auto pAparticle : m_GBField->listASuperParticles)
  158. {
  159. double dLength = pAparticle->GetDMax();
  160. dLengthAll += dLength;
  161. }
  162. return GetAGrade(dLengthAll);
  163. break;
  164. case GB_LEVEL_TYPE::B_TYPE:
  165. dLengthAll = 0;
  166. for (auto pBparticle : m_GBField->listBSuperParticles)
  167. {
  168. double dLength = pBparticle->GetDMax();
  169. dLengthAll += dLength;
  170. }
  171. return GetBGrade(dLengthAll);
  172. case GB_LEVEL_TYPE::C_TYPE:
  173. dLengthAll = 0;
  174. for (auto pParticle : m_GBField->listCSuperParticles)
  175. {
  176. double dLength = pParticle->GetDMax();
  177. dLengthAll += dLength;
  178. }
  179. return GetCGrade(dLengthAll);
  180. break;
  181. case GB_LEVEL_TYPE::D_TYPE:
  182. nSize = (int)m_GBField->listDSuperParticles.size();
  183. return GetDGrade(nSize);
  184. break;
  185. case GB_LEVEL_TYPE::DSulfide_TYPE:
  186. nSize = (int)m_GBField->listDSulfideSuperParticles.size();
  187. return GetDGrade(nSize);
  188. break;
  189. }
  190. return GB_GRADE_TYPE::INVALID;
  191. }
  192. GB_GRADE_TYPE CGBLevel::GetMyDSGrade()
  193. {
  194. switch (m_nLevel)
  195. {
  196. case GB_LEVEL_TYPE::DS_TYPE:
  197. double dFeretDiameterMax = 0;
  198. for (auto pDSParticles : m_GBField->listDSParticles)
  199. {
  200. double dFeretDiameter = pDSParticles->GetFeretDiameter();
  201. if (dFeretDiameter > dFeretDiameterMax)
  202. {
  203. dFeretDiameterMax = dFeretDiameter;
  204. }
  205. }
  206. m_FeretDiameterMax = dFeretDiameterMax;
  207. return GetDSGrade(dFeretDiameterMax);
  208. }
  209. return GB_GRADE_TYPE::INVALID;
  210. }
  211. double CGBLevel::GetMaxFeretDiameter()
  212. {
  213. if (m_FeretDiameterMax == 0)
  214. {
  215. double dFeretDiameterMax = 0;
  216. for (auto pDSParticles : m_GBField->listDSParticles)
  217. {
  218. double dFeretDiameter = pDSParticles->GetFeretDiameter();
  219. if (dFeretDiameter > dFeretDiameterMax)
  220. {
  221. dFeretDiameterMax = dFeretDiameter;
  222. }
  223. }
  224. m_FeretDiameterMax = dFeretDiameterMax;
  225. }
  226. return m_FeretDiameterMax;
  227. }
  228. GB_GRADE_TYPE GetAGrade(double dLengthAll)
  229. {
  230. if (dLengthAll < 37)
  231. {
  232. return (GB_GRADE_TYPE::POINT_0_0);
  233. }
  234. else if (dLengthAll < 127 && dLengthAll >= 37)
  235. {
  236. return (GB_GRADE_TYPE::POINT_0_5);
  237. }
  238. else if (dLengthAll < 261 && dLengthAll >= 127)
  239. {
  240. return (GB_GRADE_TYPE::POINT_1_0);
  241. }
  242. else if (dLengthAll < 436 && dLengthAll >= 261)
  243. {
  244. return (GB_GRADE_TYPE::POINT_1_5);
  245. }
  246. else if (dLengthAll < 649 && dLengthAll >= 436)
  247. {
  248. return (GB_GRADE_TYPE::POINT_2_0);
  249. }
  250. else if (dLengthAll < 898 && dLengthAll >= 649)
  251. {
  252. return (GB_GRADE_TYPE::POINT_2_5);
  253. }
  254. else if (dLengthAll < 1181 && dLengthAll >= 898)
  255. {
  256. return (GB_GRADE_TYPE::POINT_3_0);
  257. }
  258. else if (dLengthAll < 1498 && dLengthAll >= 1181)
  259. {
  260. return (GB_GRADE_TYPE::POINT_3_5);
  261. }
  262. else if (dLengthAll < 1898 && dLengthAll >= 1489)
  263. {
  264. return (GB_GRADE_TYPE::POINT_4_0);
  265. }
  266. else if (dLengthAll < 2230 && dLengthAll >= 1898)
  267. {
  268. return (GB_GRADE_TYPE::POINT_4_5);
  269. }
  270. else if (dLengthAll >= 2230)
  271. {
  272. return (GB_GRADE_TYPE::POINT_5_0);
  273. }
  274. return GB_GRADE_TYPE::INVALID;
  275. }
  276. GB_GRADE_TYPE GetBGrade(double dLengthAll)
  277. {
  278. if (dLengthAll < 17)
  279. {
  280. return (GB_GRADE_TYPE::POINT_0_0);
  281. }
  282. else if (dLengthAll < 77 && dLengthAll >= 17)
  283. {
  284. return (GB_GRADE_TYPE::POINT_0_5);
  285. }
  286. else if (dLengthAll <= 184 && dLengthAll >= 77)
  287. {
  288. return (GB_GRADE_TYPE::POINT_1_0);
  289. }
  290. else if (dLengthAll < 343 && dLengthAll >= 184)
  291. {
  292. return (GB_GRADE_TYPE::POINT_1_5);
  293. }
  294. else if (dLengthAll < 555 && dLengthAll >= 343)
  295. {
  296. return (GB_GRADE_TYPE::POINT_2_0);
  297. }
  298. else if (dLengthAll < 822 && dLengthAll >= 555)
  299. {
  300. return (GB_GRADE_TYPE::POINT_2_5);
  301. }
  302. else if (dLengthAll < 1147 && dLengthAll >= 822)
  303. {
  304. return (GB_GRADE_TYPE::POINT_3_0);
  305. }
  306. else if (dLengthAll < 1530 && dLengthAll >= 1147)
  307. {
  308. return (GB_GRADE_TYPE::POINT_3_5);
  309. }
  310. else if (dLengthAll < 1973 && dLengthAll >= 1530)
  311. {
  312. return (GB_GRADE_TYPE::POINT_4_0);
  313. }
  314. else if (dLengthAll < 2476 && dLengthAll >= 1973)
  315. {
  316. return (GB_GRADE_TYPE::POINT_4_5);
  317. }
  318. else if (dLengthAll >= 2476)
  319. {
  320. return (GB_GRADE_TYPE::POINT_5_0);
  321. }
  322. return GB_GRADE_TYPE::INVALID;
  323. }
  324. GB_GRADE_TYPE GetCGrade(double dLengthAll)
  325. {
  326. if (dLengthAll < 18)
  327. {
  328. return (GB_GRADE_TYPE::POINT_0_0);
  329. }
  330. else if (dLengthAll < 76 && dLengthAll >= 18)
  331. {
  332. return (GB_GRADE_TYPE::POINT_0_5);
  333. }
  334. else if (dLengthAll < 176 && dLengthAll >= 76)
  335. {
  336. return (GB_GRADE_TYPE::POINT_1_0);
  337. }
  338. else if (dLengthAll < 320 && dLengthAll >= 176)
  339. {
  340. return (GB_GRADE_TYPE::POINT_1_5);
  341. }
  342. else if (dLengthAll < 510 && dLengthAll >= 320)
  343. {
  344. return (GB_GRADE_TYPE::POINT_2_0);
  345. }
  346. else if (dLengthAll < 746 && dLengthAll >= 510)
  347. {
  348. return (GB_GRADE_TYPE::POINT_2_5);
  349. }
  350. else if (dLengthAll < 1029 && dLengthAll >= 746)
  351. {
  352. return (GB_GRADE_TYPE::POINT_3_0);
  353. }
  354. else if (dLengthAll < 1359 && dLengthAll >= 1029)
  355. {
  356. return (GB_GRADE_TYPE::POINT_3_5);
  357. }
  358. else if (dLengthAll < 1737 && dLengthAll >= 1359)
  359. {
  360. return (GB_GRADE_TYPE::POINT_4_0);
  361. }
  362. else if (dLengthAll <= 2163 && dLengthAll >= 1737)
  363. {
  364. return (GB_GRADE_TYPE::POINT_4_5);
  365. }
  366. else if (dLengthAll >= 2163)
  367. {
  368. return (GB_GRADE_TYPE::POINT_5_0);
  369. }
  370. return GB_GRADE_TYPE::INVALID;
  371. }
  372. GB_GRADE_TYPE GetDGrade(int nSize)
  373. {
  374. if (nSize < 1)
  375. {
  376. return (GB_GRADE_TYPE::POINT_0_0);
  377. }
  378. else if (nSize < 4 && nSize >= 1)
  379. {
  380. return (GB_GRADE_TYPE::POINT_0_5);
  381. }
  382. else if (nSize < 9 && nSize >= 4)
  383. {
  384. return (GB_GRADE_TYPE::POINT_1_0);
  385. }
  386. else if (nSize < 16 && nSize >= 9)
  387. {
  388. return (GB_GRADE_TYPE::POINT_1_5);
  389. }
  390. else if (nSize < 25 && nSize >= 16)
  391. {
  392. return (GB_GRADE_TYPE::POINT_2_0);
  393. }
  394. else if (nSize < 36 && nSize >= 25)
  395. {
  396. return (GB_GRADE_TYPE::POINT_2_5);
  397. }
  398. else if (nSize < 49 && nSize >= 36)
  399. {
  400. return (GB_GRADE_TYPE::POINT_3_0);
  401. }
  402. else if (nSize < 64 && nSize >= 49)
  403. {
  404. return (GB_GRADE_TYPE::POINT_3_5);
  405. }
  406. else if (nSize < 81 && nSize >= 64)
  407. {
  408. return (GB_GRADE_TYPE::POINT_4_0);
  409. }
  410. else if (nSize < 100 && nSize >= 81)
  411. {
  412. return (GB_GRADE_TYPE::POINT_4_5);
  413. }
  414. else if (nSize >= 100)
  415. {
  416. return (GB_GRADE_TYPE::POINT_5_0);
  417. }
  418. return GB_GRADE_TYPE::INVALID;
  419. }
  420. GB_GRADE_TYPE GetDSGrade(double dFeretDiameterMax)
  421. {
  422. if (dFeretDiameterMax < 13)
  423. {
  424. return (GB_GRADE_TYPE::POINT_0_0);
  425. }
  426. else if (dFeretDiameterMax < 19 && dFeretDiameterMax >= 13)
  427. {
  428. return (GB_GRADE_TYPE::POINT_0_5);
  429. }
  430. else if (dFeretDiameterMax < 27 && dFeretDiameterMax >= 19)
  431. {
  432. return (GB_GRADE_TYPE::POINT_1_0);
  433. }
  434. else if (dFeretDiameterMax < 38 && dFeretDiameterMax >= 27)
  435. {
  436. return (GB_GRADE_TYPE::POINT_1_5);
  437. }
  438. else if (dFeretDiameterMax < 53 && dFeretDiameterMax >= 38)
  439. {
  440. return (GB_GRADE_TYPE::POINT_2_0);
  441. }
  442. else if (dFeretDiameterMax < 76 && dFeretDiameterMax >= 53)
  443. {
  444. return (GB_GRADE_TYPE::POINT_2_5);
  445. }
  446. else if (dFeretDiameterMax < 107 && dFeretDiameterMax >= 76)
  447. {
  448. return (GB_GRADE_TYPE::POINT_3_0);
  449. }
  450. else if (dFeretDiameterMax < 151 && dFeretDiameterMax >= 107)
  451. {
  452. return (GB_GRADE_TYPE::POINT_3_5);
  453. }
  454. else if (dFeretDiameterMax < 214 && dFeretDiameterMax >= 151)
  455. {
  456. return (GB_GRADE_TYPE::POINT_4_0);
  457. }
  458. else if (dFeretDiameterMax < 303 && dFeretDiameterMax >= 214)
  459. {
  460. return (GB_GRADE_TYPE::POINT_4_5);
  461. }
  462. else if (dFeretDiameterMax >= 303)
  463. {
  464. return (GB_GRADE_TYPE::POINT_5_0);
  465. }
  466. return GB_GRADE_TYPE::INVALID;
  467. }
  468. void CGBLevel::Serialize(bool isStoring, tinyxml2::XMLDocument * classDoc, tinyxml2::XMLElement * rootNode)
  469. {
  470. xmls::xInt xLevel;
  471. xmls::Slo slo;
  472. slo.Register("Level", &xLevel);
  473. if (isStoring)
  474. {
  475. xLevel = (int)m_nLevel;
  476. slo.Serialize(true, classDoc, rootNode);
  477. }
  478. else
  479. {
  480. slo.Serialize(false, classDoc, rootNode);
  481. m_nLevel = (GB_LEVEL_TYPE)xLevel.value();
  482. }
  483. }
  484. // cleanup
  485. void CGBLevel::Cleanup()
  486. {
  487. }
  488. // initialization
  489. void CGBLevel::Init()
  490. {
  491. m_nLevel = GB_LEVEL_TYPE::INVALID;
  492. }
  493. // duplication
  494. void CGBLevel::Duplicate(const CGBLevel& a_oSource)
  495. {
  496. // initialization
  497. Init();
  498. // copy data over
  499. m_nLevel = a_oSource.m_nLevel;
  500. }
  501. }