CGBLevel.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  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->listAWideParticles)
  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->listBWideParticles)
  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. double CGBLevel::GetMaxFeretDiameter()
  193. {
  194. if (m_FeretDiameterMax == 0)
  195. {
  196. double dFeretDiameterMax = 0;
  197. for (auto pDSParticles : m_GBField->listDSParticles)
  198. {
  199. double dFeretDiameter = pDSParticles->GetFeretDiameter();
  200. if (dFeretDiameter > dFeretDiameterMax)
  201. {
  202. dFeretDiameterMax = dFeretDiameter;
  203. }
  204. }
  205. m_FeretDiameterMax = dFeretDiameterMax;
  206. }
  207. return m_FeretDiameterMax;
  208. }
  209. GB_GRADE_TYPE GetAGrade(double dLengthAll)
  210. {
  211. if (dLengthAll < 37)
  212. {
  213. return (GB_GRADE_TYPE::POINT_0_0);
  214. }
  215. else if (dLengthAll < 127 && dLengthAll >= 37)
  216. {
  217. return (GB_GRADE_TYPE::POINT_0_5);
  218. }
  219. else if (dLengthAll < 261 && dLengthAll >= 127)
  220. {
  221. return (GB_GRADE_TYPE::POINT_1_0);
  222. }
  223. else if (dLengthAll < 436 && dLengthAll >= 261)
  224. {
  225. return (GB_GRADE_TYPE::POINT_1_5);
  226. }
  227. else if (dLengthAll < 649 && dLengthAll >= 436)
  228. {
  229. return (GB_GRADE_TYPE::POINT_2_0);
  230. }
  231. else if (dLengthAll < 898 && dLengthAll >= 649)
  232. {
  233. return (GB_GRADE_TYPE::POINT_2_5);
  234. }
  235. else if (dLengthAll < 1181 && dLengthAll >= 898)
  236. {
  237. return (GB_GRADE_TYPE::POINT_3_0);
  238. }
  239. else if (dLengthAll < 1498 && dLengthAll >= 1181)
  240. {
  241. return (GB_GRADE_TYPE::POINT_3_5);
  242. }
  243. else if (dLengthAll < 1898 && dLengthAll >= 1489)
  244. {
  245. return (GB_GRADE_TYPE::POINT_4_0);
  246. }
  247. else if (dLengthAll < 2230 && dLengthAll >= 1898)
  248. {
  249. return (GB_GRADE_TYPE::POINT_4_5);
  250. }
  251. else if (dLengthAll >= 2230)
  252. {
  253. return (GB_GRADE_TYPE::POINT_5_0);
  254. }
  255. return GB_GRADE_TYPE::INVALID;
  256. }
  257. GB_GRADE_TYPE GetBGrade(double dLengthAll)
  258. {
  259. if (dLengthAll < 17)
  260. {
  261. return (GB_GRADE_TYPE::POINT_0_0);
  262. }
  263. else if (dLengthAll < 77 && dLengthAll >= 17)
  264. {
  265. return (GB_GRADE_TYPE::POINT_0_5);
  266. }
  267. else if (dLengthAll <= 184 && dLengthAll >= 77)
  268. {
  269. return (GB_GRADE_TYPE::POINT_1_0);
  270. }
  271. else if (dLengthAll < 343 && dLengthAll >= 184)
  272. {
  273. return (GB_GRADE_TYPE::POINT_1_5);
  274. }
  275. else if (dLengthAll < 555 && dLengthAll >= 343)
  276. {
  277. return (GB_GRADE_TYPE::POINT_2_0);
  278. }
  279. else if (dLengthAll < 822 && dLengthAll >= 555)
  280. {
  281. return (GB_GRADE_TYPE::POINT_2_5);
  282. }
  283. else if (dLengthAll < 1147 && dLengthAll >= 822)
  284. {
  285. return (GB_GRADE_TYPE::POINT_3_0);
  286. }
  287. else if (dLengthAll < 1530 && dLengthAll >= 1147)
  288. {
  289. return (GB_GRADE_TYPE::POINT_3_5);
  290. }
  291. else if (dLengthAll < 1973 && dLengthAll >= 1530)
  292. {
  293. return (GB_GRADE_TYPE::POINT_4_0);
  294. }
  295. else if (dLengthAll < 2476 && dLengthAll >= 1973)
  296. {
  297. return (GB_GRADE_TYPE::POINT_4_5);
  298. }
  299. else if (dLengthAll >= 2476)
  300. {
  301. return (GB_GRADE_TYPE::POINT_5_0);
  302. }
  303. return GB_GRADE_TYPE::INVALID;
  304. }
  305. GB_GRADE_TYPE GetCGrade(double dLengthAll)
  306. {
  307. if (dLengthAll < 18)
  308. {
  309. return (GB_GRADE_TYPE::POINT_0_0);
  310. }
  311. else if (dLengthAll < 76 && dLengthAll >= 18)
  312. {
  313. return (GB_GRADE_TYPE::POINT_0_5);
  314. }
  315. else if (dLengthAll < 176 && dLengthAll >= 76)
  316. {
  317. return (GB_GRADE_TYPE::POINT_1_0);
  318. }
  319. else if (dLengthAll < 320 && dLengthAll >= 176)
  320. {
  321. return (GB_GRADE_TYPE::POINT_1_5);
  322. }
  323. else if (dLengthAll < 510 && dLengthAll >= 320)
  324. {
  325. return (GB_GRADE_TYPE::POINT_2_0);
  326. }
  327. else if (dLengthAll < 746 && dLengthAll >= 510)
  328. {
  329. return (GB_GRADE_TYPE::POINT_2_5);
  330. }
  331. else if (dLengthAll < 1029 && dLengthAll >= 746)
  332. {
  333. return (GB_GRADE_TYPE::POINT_3_0);
  334. }
  335. else if (dLengthAll < 1359 && dLengthAll >= 1029)
  336. {
  337. return (GB_GRADE_TYPE::POINT_3_5);
  338. }
  339. else if (dLengthAll < 1737 && dLengthAll >= 1359)
  340. {
  341. return (GB_GRADE_TYPE::POINT_4_0);
  342. }
  343. else if (dLengthAll <= 2163 && dLengthAll >= 1737)
  344. {
  345. return (GB_GRADE_TYPE::POINT_4_5);
  346. }
  347. else if (dLengthAll >= 2163)
  348. {
  349. return (GB_GRADE_TYPE::POINT_5_0);
  350. }
  351. return GB_GRADE_TYPE::INVALID;
  352. }
  353. GB_GRADE_TYPE GetDGrade(int nSize)
  354. {
  355. if (nSize < 1)
  356. {
  357. return (GB_GRADE_TYPE::POINT_0_0);
  358. }
  359. else if (nSize < 4 && nSize >= 1)
  360. {
  361. return (GB_GRADE_TYPE::POINT_0_5);
  362. }
  363. else if (nSize < 9 && nSize >= 4)
  364. {
  365. return (GB_GRADE_TYPE::POINT_1_0);
  366. }
  367. else if (nSize < 16 && nSize >= 9)
  368. {
  369. return (GB_GRADE_TYPE::POINT_1_5);
  370. }
  371. else if (nSize < 25 && nSize >= 16)
  372. {
  373. return (GB_GRADE_TYPE::POINT_2_0);
  374. }
  375. else if (nSize < 36 && nSize >= 25)
  376. {
  377. return (GB_GRADE_TYPE::POINT_2_5);
  378. }
  379. else if (nSize < 49 && nSize >= 36)
  380. {
  381. return (GB_GRADE_TYPE::POINT_3_0);
  382. }
  383. else if (nSize < 64 && nSize >= 49)
  384. {
  385. return (GB_GRADE_TYPE::POINT_3_5);
  386. }
  387. else if (nSize < 81 && nSize >= 64)
  388. {
  389. return (GB_GRADE_TYPE::POINT_4_0);
  390. }
  391. else if (nSize < 100 && nSize >= 81)
  392. {
  393. return (GB_GRADE_TYPE::POINT_4_5);
  394. }
  395. else if (nSize >= 100)
  396. {
  397. return (GB_GRADE_TYPE::POINT_5_0);
  398. }
  399. return GB_GRADE_TYPE::INVALID;
  400. }
  401. CString GetDSGrade(double dFeretDiameterMax)
  402. {
  403. if (dFeretDiameterMax < 13)
  404. {
  405. return _T("0");
  406. }
  407. else if (dFeretDiameterMax < 19 && dFeretDiameterMax >= 13)
  408. {
  409. return _T("0.5");
  410. }
  411. else if (dFeretDiameterMax < 27 && dFeretDiameterMax >= 19)
  412. {
  413. return _T("1.0");
  414. }
  415. else if (dFeretDiameterMax < 38 && dFeretDiameterMax >= 27)
  416. {
  417. return _T("1.5");
  418. }
  419. else if (dFeretDiameterMax < 53 && dFeretDiameterMax >= 38)
  420. {
  421. return _T("2.0");
  422. }
  423. else if (dFeretDiameterMax < 76 && dFeretDiameterMax >= 53)
  424. {
  425. return _T("2.5");
  426. }
  427. else if (dFeretDiameterMax < 107 && dFeretDiameterMax >= 76)
  428. {
  429. return _T("3.0");
  430. }
  431. else if (dFeretDiameterMax < 151 && dFeretDiameterMax >= 107)
  432. {
  433. return _T("3.5");
  434. }
  435. else if (dFeretDiameterMax < 214 && dFeretDiameterMax >= 151)
  436. {
  437. return _T("4.0");
  438. }
  439. else if (dFeretDiameterMax < 303 && dFeretDiameterMax >= 214)
  440. {
  441. return _T("4.5");
  442. }
  443. else if (dFeretDiameterMax >= 303)
  444. {
  445. return _T("5.0");
  446. }
  447. return _T("0.0");
  448. }
  449. /*void CGBLevel::Serialize(bool isStoring, tinyxml2::XMLDocument * classDoc, tinyxml2::XMLElement * rootNode)
  450. {
  451. xmls::xInt xLevel;
  452. xmls::Slo slo;
  453. slo.Register("Level", &xLevel);
  454. if (isStoring)
  455. {
  456. xLevel = (int)m_nLevel;
  457. slo.Serialize(true, classDoc, rootNode);
  458. }
  459. else
  460. {
  461. slo.Serialize(false, classDoc, rootNode);
  462. m_nLevel = (GB_LEVEL_TYPE)xLevel.value();
  463. }
  464. }*/
  465. // cleanup
  466. void CGBLevel::Cleanup()
  467. {
  468. }
  469. // initialization
  470. void CGBLevel::Init()
  471. {
  472. m_nLevel = GB_LEVEL_TYPE::INVALID;
  473. }
  474. // duplication
  475. void CGBLevel::Duplicate(const CGBLevel& a_oSource)
  476. {
  477. // initialization
  478. Init();
  479. // copy data over
  480. m_nLevel = a_oSource.m_nLevel;
  481. }
  482. }