CGBLevel.cpp 11 KB

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