CGBCalculate.cpp 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404
  1. #pragma once
  2. #include "stdafx.h"
  3. #include "CGBCalculate.h"
  4. #include "OTSFieldData.h"
  5. #include "GBImgPropCal.h"
  6. #include "OTSHelper.h"
  7. #include "OTSImageProcess.h"
  8. #include "CGBLevel.h"
  9. #include <GBFieldData.h>
  10. namespace OTSGBCalculate
  11. {
  12. using namespace OTSDATA;
  13. using namespace OTSIMGPROC;
  14. CGBCalculate::CGBCalculate(CReportMgr* rptMgrPtr)
  15. {
  16. m_rptMgrPtr = rptMgrPtr;
  17. }
  18. CGBCalculate::~CGBCalculate()
  19. {
  20. }
  21. // class methods
  22. // public
  23. CGridDatasList CGBCalculate::GetGBInclusion()
  24. {
  25. CGBFieldList listCGBField;
  26. COTSParticleList listOTSParticle;
  27. COTSParticlePtr pOTSParticle;
  28. CGBImgPropCal pGBImgPropCal;
  29. CGridDatasList listGridData;
  30. listGridData.clear();
  31. CGridDatasList multGridList;
  32. multGridList.clear();
  33. // depart compound source name
  34. CPropParamPtr currentProp = m_rptMgrPtr->GetPropertyParamForGrid();
  35. std::vector<CString> listDataSource = currentProp->GetDataSourceList();
  36. int nSelectedDataSourceIndex = currentProp->GetDataSourceId();
  37. CString sDataSourceNames = listDataSource[nSelectedDataSourceIndex];
  38. std::vector<CString> listSelectedDataSource = COTSHelper::SplitString(sDataSourceNames, _T("+"));
  39. for (auto strDataSourceName : listSelectedDataSource)
  40. {
  41. listCGBField.clear();
  42. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  43. // data source id
  44. std::vector<CString> listDataSource;
  45. listDataSource.clear();
  46. listDataSource = currentProp->GetDataSourceList();
  47. pGridData->SetDataSourceList(listDataSource);
  48. int nDataSourceId = currentProp->GetDataSourceId();
  49. pGridData->SetDataSourceId(nDataSourceId);
  50. CSmplMsrResultFileMgrPtr rstFileMgrPrt = m_rptMgrPtr->GetASmplMsrResultMgrByFileName(strDataSourceName);
  51. CSmplMsrResultFilePtr pSmplMsrResultFile = rstFileMgrPrt->GetSmplMsrResultFile();
  52. COTSSamplePtr pSample = pSmplMsrResultFile->GetSample();
  53. CGBFieldList listRawGBFields=CalGBFields(rstFileMgrPrt);
  54. listCGBField = listRawGBFields;
  55. CALCULATE_TABLE_TYPE ty = m_rptMgrPtr->GetPropertyParamForGrid()->GetCalTableType();
  56. if (ty == CALCULATE_TABLE_TYPE::DIN)
  57. {
  58. listGridData = this->GetGridDataListForOneDataSourceDIN(pSmplMsrResultFile->GetAllParticles(), ty);
  59. }
  60. else
  61. {
  62. listGridData = this->GetGridDataListForOneDataSource(listCGBField, ty);
  63. }
  64. multGridList.insert (multGridList.end (), listGridData.begin(), listGridData.end());
  65. }
  66. return multGridList;
  67. }
  68. CGridDatasList CGBCalculate::GetGridDataListForOneDataSource(CGBFieldList listCGBField, CALCULATE_TABLE_TYPE tableType)
  69. {
  70. CGridDatasList listGridData;
  71. //Definition numbers
  72. //use the nXLevel array to memory how many fields in each level.
  73. CONST int LEVEL_LENGTH = 11;
  74. int nALevel[LEVEL_LENGTH]; //nALevelZero, nALevel_0_5, nALevel_1_0, nALevel_1_5, nALevel_2_0, nALevel_2_5, nALevel_3_0, nALevel_3_5, nALevel_4_0, nALevel_4_5, nALevel_5_0 ;
  75. int nALevel_w[LEVEL_LENGTH]; //nALevelZero_f, nALevel_0_5_f, nALevel_1_0_f, nALevel_1_5_f, nALevel_2_0_f, nALevel_2_5_f, nALevel_3_0_f, nALevel_3_5_f, nALevel_4_0_f, nALevel_4_5_f, nALevel_5_0_f;
  76. int nALevel_s[LEVEL_LENGTH];
  77. int nBLevel[LEVEL_LENGTH]; //nBLevelZero, nBLevel_0_5, nBLevel_1_0, nBLevel_1_5, nBLevel_2_0, nBLevel_2_5, nBLevel_3_0, nBLevel_3_5, nBLevel_4_0, nBLevel_4_5, nBLevel_5_0;
  78. int nBLevel_w[LEVEL_LENGTH]; //nBLevelZero_f, nBLevel_0_5_f, nBLevel_1_0_f, nBLevel_1_5_f, nBLevel_2_0_f, nBLevel_2_5_f, nBLevel_3_0_f, nBLevel_3_5_f, nBLevel_4_0_f, nBLevel_4_5_f, nBLevel_5_0_f;
  79. int nBLevel_s[LEVEL_LENGTH];
  80. int nCLevel[LEVEL_LENGTH]; //nCLevelZero, nCLevel_0_5, nCLevel_1_0, nCLevel_1_5, nCLevel_2_0, nCLevel_2_5, nCLevel_3_0, nCLevel_3_5, nCLevel_4_0, nCLevel_4_5, nCLevel_5_0;
  81. int nCLevel_w[LEVEL_LENGTH]; //nCLevelZero_f, nCLevel_0_5_f, nCLevel_1_0_f, nCLevel_1_5_f, nCLevel_2_0_f, nCLevel_2_5_f, nCLevel_3_0_f, nCLevel_3_5_f, nCLevel_4_0_f, nCLevel_4_5_f, nCLevel_5_0_f;
  82. int nCLevel_s[LEVEL_LENGTH];
  83. int nDLevel[LEVEL_LENGTH];// nDLevelZero, nDLevel_0_5, nDLevel_1_0, nDLevel_1_5, nDLevel_2_0, nDLevel_2_5, nDLevel_3_0, nDLevel_3_5, nDLevel_4_0, nDLevel_4_5, nDLevel_5_0;
  84. int nDLevel_w[LEVEL_LENGTH]; //nDLevelZero_f, nDLevel_0_5_f, nDLevel_1_0_f, nDLevel_1_5_f, nDLevel_2_0_f, nDLevel_2_5_f, nDLevel_3_0_f, nDLevel_3_5_f, nDLevel_4_0_f, nDLevel_4_5_f, nDLevel_5_0_f;
  85. int nDLevel_s[LEVEL_LENGTH];
  86. int nDSulfideLevel[LEVEL_LENGTH];// nDLevelZero, nDLevel_0_5, nDLevel_1_0, nDLevel_1_5, nDLevel_2_0, nDLevel_2_5, nDLevel_3_0, nDLevel_3_5, nDLevel_4_0, nDLevel_4_5, nDLevel_5_0;
  87. int nDSulfideLevel_w[LEVEL_LENGTH]; //nDLevelZero_f, nDLevel_0_5_f, nDLevel_1_0_f, nDLevel_1_5_f, nDLevel_2_0_f, nDLevel_2_5_f, nDLevel_3_0_f, nDLevel_3_5_f, nDLevel_4_0_f, nDLevel_4_5_f, nDLevel_5_0_f;
  88. int nDSulfideLevel_s[LEVEL_LENGTH];
  89. CGBFieldList listDSFrame;
  90. //initlize
  91. for (int i = 0; i < LEVEL_LENGTH; i++)
  92. {
  93. nALevel[i]= 0;
  94. nALevel_w[i] = 0;
  95. nALevel_s[i] = 0;
  96. nBLevel[i]=0;
  97. nBLevel_w[i] = 0;
  98. nBLevel_s[i]=0;
  99. nCLevel[i]=0;
  100. nCLevel_w[i]=0;
  101. nCLevel_s[i]=0;
  102. nDLevel[i]=0;
  103. nDLevel_w[i]=0;
  104. nDLevel_s[i] = 0;
  105. nDSulfideLevel[i] = 0;
  106. nDSulfideLevel_w[i] = 0;
  107. nDSulfideLevel_s[i] = 0;
  108. }
  109. //loop CGBField list and cal the level numbers
  110. for (CGBFieldDataPtr GBFld : listCGBField)
  111. {
  112. //CalLevel mode
  113. switch (tableType)
  114. {
  115. case CALCULATE_TABLE_TYPE::GB_Method1:
  116. GBFld->CaculateLevelByMethod1();
  117. break;
  118. case CALCULATE_TABLE_TYPE::GB_Method2:
  119. GBFld->CaculateLevelByMethod2();
  120. break;
  121. case CALCULATE_TABLE_TYPE::ASTM:
  122. GBFld->CaculateLevelASTM();
  123. break;
  124. default:
  125. break;
  126. }
  127. //update the A class grid data
  128. GB_GRADE_TYPE levelt = GBFld->GetALevel()->GetThinGrade();
  129. GB_GRADE_TYPE levelw = GBFld->GetALevel()->GetWideGrade();
  130. GB_GRADE_TYPE levels = GBFld->GetALevel()->GetSuperGrade();
  131. SetFrameLevelNo(levelt, nALevel);
  132. SetFrameLevelNo(levelw, nALevel_w);
  133. SetFrameLevelNo(levels, nALevel_s);
  134. //update the B class grid data
  135. levelt = GBFld->GetBLevel()->GetThinGrade();
  136. levelw = GBFld->GetBLevel()->GetWideGrade();
  137. levels = GBFld->GetBLevel()->GetSuperGrade();
  138. SetFrameLevelNo(levelt, nBLevel);
  139. SetFrameLevelNo(levelw, nBLevel_w);
  140. SetFrameLevelNo(levels, nBLevel_s);
  141. //update the C class grid data
  142. levelt = GBFld->GetCLevel()->GetThinGrade();
  143. levelw = GBFld->GetCLevel()->GetWideGrade();
  144. levels = GBFld->GetCLevel()->GetSuperGrade();
  145. SetFrameLevelNo(levelt, nCLevel);
  146. SetFrameLevelNo(levelw, nCLevel_w);
  147. SetFrameLevelNo(levels, nCLevel_s);
  148. //update the D class grid data
  149. levelt = GBFld->GetDLevel()->GetThinGrade();
  150. levelw = GBFld->GetDLevel()->GetWideGrade();
  151. levels = GBFld->GetDLevel()->GetSuperGrade();
  152. SetFrameLevelNo(levelt, nDLevel);
  153. SetFrameLevelNo(levelw, nDLevel_w);
  154. SetFrameLevelNo(levels, nDLevel_s);
  155. //update the Ds class grid data
  156. levelt = GBFld->GetDSulfideLevel()->GetThinGrade();
  157. levelw = GBFld->GetDSulfideLevel()->GetWideGrade();
  158. levels = GBFld->GetDSulfideLevel()->GetSuperGrade();
  159. SetFrameLevelNo(levelt, nDSulfideLevel);
  160. SetFrameLevelNo(levelw, nDSulfideLevel_w);
  161. SetFrameLevelNo(levels, nDSulfideLevel_s);
  162. }
  163. //Get ListGrid for Level
  164. //CalLevel mode
  165. CGridDataPtr AGrid;
  166. CGridDataPtr BGrid;
  167. CGridDataPtr CGrid;
  168. CGridDataPtr DGrid;
  169. CGridDataPtr DSulfideGrid;
  170. CGridDataPtr DSGrid;
  171. CGridDataPtr GBFieldGrid;
  172. switch (tableType)
  173. {
  174. case CALCULATE_TABLE_TYPE::GB_Method1:
  175. AGrid = GetGridLevel("A", nALevel, nALevel_w, nALevel_s);
  176. BGrid = GetGridLevel("B", nBLevel, nBLevel_w, nBLevel_s);
  177. CGrid = GetGridLevel("C", nCLevel, nCLevel_w, nCLevel_s);
  178. DGrid = GetGridLevel("D", nDLevel, nDLevel_w, nDLevel_s);
  179. DSGrid = GetGridDSLevel(listCGBField);
  180. GBFieldGrid = GetGBFieldGrid(listCGBField);
  181. listGridData.push_back(AGrid);
  182. listGridData.push_back(BGrid);
  183. listGridData.push_back(CGrid);
  184. listGridData.push_back(DGrid);
  185. listGridData.push_back(DSGrid);
  186. listGridData.push_back(GBFieldGrid);
  187. //listGridData
  188. return listGridData;
  189. break;
  190. case CALCULATE_TABLE_TYPE::GB_Method2:
  191. AGrid = GetGridLevel("A", nALevel, nALevel_w, nALevel_s);
  192. BGrid = GetGridLevel("B", nBLevel, nBLevel_w, nBLevel_s);
  193. CGrid = GetGridLevel("C", nCLevel, nCLevel_w, nCLevel_s);
  194. DGrid = GetGridLevel("D", nDLevel, nDLevel_w, nDLevel_s);
  195. DSulfideGrid = GetGridLevel("DSulfide", nDSulfideLevel, nDSulfideLevel_w, nDSulfideLevel_s);
  196. DSGrid = GetGridDSLevel(listCGBField);
  197. GBFieldGrid = GetGBFieldGrid(listCGBField);
  198. listGridData.push_back(AGrid);
  199. listGridData.push_back(BGrid);
  200. listGridData.push_back(CGrid);
  201. listGridData.push_back(DGrid);
  202. listGridData.push_back(DSulfideGrid);
  203. listGridData.push_back(DSGrid);
  204. listGridData.push_back(GBFieldGrid);
  205. //listGridData
  206. return listGridData;
  207. break;
  208. case CALCULATE_TABLE_TYPE::ASTM:
  209. AGrid = GetGridLevel("A", nALevel, nALevel_w, nALevel_s);
  210. BGrid = GetGridLevel("B", nBLevel, nBLevel_w, nBLevel_s);
  211. CGrid = GetGridLevel("C", nCLevel, nCLevel_w, nCLevel_s);
  212. DGrid = GetGridLevel("D", nDLevel, nDLevel_w, nDLevel_s);
  213. DSGrid = GetGridDSLevel(listCGBField);
  214. GBFieldGrid = GetGBFieldGrid(listCGBField);
  215. listGridData.push_back(AGrid);
  216. listGridData.push_back(BGrid);
  217. listGridData.push_back(CGrid);
  218. listGridData.push_back(DGrid);
  219. listGridData.push_back(DSGrid);
  220. listGridData.push_back(GBFieldGrid);
  221. //listGridData
  222. return listGridData;
  223. break;
  224. default:
  225. return listGridData;
  226. break;
  227. }
  228. }
  229. CGridDatasList CGBCalculate::GetGridDataListForOneDataSourceDIN(COTSParticleList listParticle, CALCULATE_TABLE_TYPE tableType )
  230. {
  231. CGridDatasList listGridData;
  232. COTSParticleList cotsparticlelistA;
  233. set<COTSParticlePtr> cotsparticlelistB;
  234. COTSParticleList cotsparticlelistC;
  235. COTSParticleList cotsparticlelistD;
  236. //loop CGBField list and cal the level numbers
  237. CGBFieldDataPtr GBFld(new CGBFieldData());
  238. GBFld->SetParticleList(listParticle, TRUE);
  239. GBFld->CaculateLevelDIN(listParticle);
  240. cotsparticlelistA = GBFld->listAThinParticles;
  241. cotsparticlelistB = GBFld->listBThinParticles;
  242. cotsparticlelistC = GBFld->listCThinParticles;
  243. cotsparticlelistD = GBFld->listDThinParticles;
  244. //Get ListGrid for Level
  245. //CalLevel mode
  246. CGridDataPtr AGrid;
  247. AGrid = GetGridDIN(cotsparticlelistA, cotsparticlelistB, cotsparticlelistC, cotsparticlelistD);
  248. listGridData.push_back(AGrid);
  249. //listGridData
  250. return listGridData;
  251. }
  252. //CGridDataPtr CGBFieldMgr::GetGBFieldGrid(CGBFieldList listCGBField, CGridInPtr a_pGridIn);
  253. CGridDataPtr CGBCalculate::GetGBFieldGrid(CGBFieldList listCGBField)
  254. {
  255. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  256. std::vector<CString> listDataSource;
  257. listDataSource.clear();
  258. listDataSource = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceList();
  259. pGridData->SetDataSourceList(listDataSource);
  260. int nDataSourceId = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceId();
  261. pGridData->SetDataSourceId(nDataSourceId);
  262. //amounts
  263. CGridColumnsList listCol;
  264. listCol.clear();
  265. int columnNum = 11;//表格总列数 fieldpos 占2列,ABCDDS 占5列,particle占1列,particle 类别占1列,particle宽度占1列
  266. CGridColumnPtr pColumn;
  267. for (int i = 0; i < columnNum; i++)
  268. {
  269. CString strName;
  270. CGridRowsList listRows;
  271. CGridRowPtr pRow;
  272. switch (i)
  273. {
  274. case 0:
  275. pColumn = CGridColumnPtr(new CGridColumn());
  276. pColumn->SetName("FieldPosX");
  277. for (auto GBF : listCGBField)
  278. {
  279. for (auto p : GBF->GetParticleList())
  280. {
  281. pRow = CGridRowPtr(new CGridRow());
  282. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  283. pRow->SetIntValue(GBF->GetPosition().x);
  284. listRows.push_back(pRow);
  285. }
  286. }
  287. pColumn->SetGridRowsList(listRows);
  288. listCol.push_back(pColumn);
  289. break;
  290. case 1:
  291. pColumn = CGridColumnPtr(new CGridColumn());
  292. pColumn->SetName("FieldPosY");
  293. for (auto GBF : listCGBField)
  294. {
  295. for (auto p : GBF->GetParticleList())
  296. {
  297. pRow = CGridRowPtr(new CGridRow());
  298. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  299. pRow->SetIntValue(GBF->GetPosition().y);
  300. listRows.push_back(pRow);
  301. }
  302. }
  303. pColumn->SetGridRowsList(listRows);
  304. listCol.push_back(pColumn);
  305. break;
  306. case 2:
  307. pColumn = CGridColumnPtr(new CGridColumn());
  308. pColumn->SetName("ALevel");
  309. for (auto GBF : listCGBField)
  310. {
  311. for (auto p : GBF->GetParticleList())
  312. {
  313. pRow = CGridRowPtr(new CGridRow());
  314. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  315. std::string Athin, Awide, Asuper;
  316. auto Alevel = GBF->GetALevel();
  317. auto thin = Alevel->GetThinGrade();
  318. Athin = GetLevelStr(thin);
  319. Awide = GetLevelStr(Alevel->GetWideGrade());
  320. Asuper = GetLevelStr(Alevel->GetSuperGrade());
  321. pRow->SetStringValue((Athin + "," + Awide + "," + Asuper).c_str());
  322. listRows.push_back(pRow);
  323. }
  324. }
  325. pColumn->SetGridRowsList(listRows);
  326. listCol.push_back(pColumn);
  327. break;
  328. case 3:
  329. pColumn = CGridColumnPtr(new CGridColumn());
  330. pColumn->SetName("BLevel");
  331. for (auto GBF : listCGBField)
  332. {
  333. for (auto p : GBF->GetParticleList())
  334. {
  335. pRow = CGridRowPtr(new CGridRow());
  336. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  337. std::string thin, wide, super;
  338. auto level = GBF->GetBLevel();
  339. thin = GetLevelStr(level->GetThinGrade());
  340. wide = GetLevelStr(level->GetWideGrade());
  341. super = GetLevelStr(level->GetSuperGrade());
  342. pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
  343. listRows.push_back(pRow);
  344. }
  345. }
  346. pColumn->SetGridRowsList(listRows);
  347. listCol.push_back(pColumn);
  348. break;
  349. case 4:
  350. pColumn = CGridColumnPtr(new CGridColumn());
  351. pColumn->SetName("CLevel");
  352. for (auto GBF : listCGBField)
  353. {
  354. for (auto p : GBF->GetParticleList())
  355. {
  356. pRow = CGridRowPtr(new CGridRow());
  357. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  358. std::string thin, wide, super;
  359. auto level = GBF->GetCLevel();
  360. thin = GetLevelStr(level->GetThinGrade());
  361. wide = GetLevelStr(level->GetWideGrade());
  362. super = GetLevelStr(level->GetSuperGrade());
  363. pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
  364. listRows.push_back(pRow);
  365. }
  366. }
  367. pColumn->SetGridRowsList(listRows);
  368. listCol.push_back(pColumn);
  369. break;
  370. case 5:
  371. pColumn = CGridColumnPtr(new CGridColumn());
  372. pColumn->SetName("DLevel");
  373. for (auto GBF : listCGBField)
  374. {
  375. for (auto p : GBF->GetParticleList())
  376. {
  377. pRow = CGridRowPtr(new CGridRow());
  378. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  379. std::string thin, wide, super;
  380. auto level = GBF->GetDLevel();
  381. thin = GetLevelStr(level->GetThinGrade());
  382. wide = GetLevelStr(level->GetWideGrade());
  383. super = GetLevelStr(level->GetSuperGrade());
  384. pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
  385. listRows.push_back(pRow);
  386. }
  387. }
  388. pColumn->SetGridRowsList(listRows);
  389. listCol.push_back(pColumn);
  390. break;
  391. case 6:
  392. pColumn = CGridColumnPtr(new CGridColumn());
  393. pColumn->SetName("DSLevel");
  394. for (auto GBF : listCGBField)
  395. {
  396. for (auto p : GBF->GetParticleList())
  397. {
  398. pRow = CGridRowPtr(new CGridRow());
  399. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  400. std::string thin, wide, super;
  401. auto level = GBF->GetDSLevel();
  402. thin = GetLevelStr(level->GetThinGrade());
  403. wide = GetLevelStr(level->GetWideGrade());
  404. super = GetLevelStr(level->GetSuperGrade());
  405. pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
  406. listRows.push_back(pRow);
  407. }
  408. }
  409. pColumn->SetGridRowsList(listRows);
  410. listCol.push_back(pColumn);
  411. break;
  412. case 7:
  413. pColumn = CGridColumnPtr(new CGridColumn());
  414. pColumn->SetName("DSulfideLevel");
  415. for (auto GBF : listCGBField)
  416. {
  417. for (auto p : GBF->GetParticleList())
  418. {
  419. pRow = CGridRowPtr(new CGridRow());
  420. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  421. std::string thin, wide, super;
  422. auto level = GBF->GetDSulfideLevel();
  423. thin = GetLevelStr(level->GetThinGrade());
  424. wide = GetLevelStr(level->GetWideGrade());
  425. super = GetLevelStr(level->GetSuperGrade());
  426. pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
  427. listRows.push_back(pRow);
  428. }
  429. }
  430. pColumn->SetGridRowsList(listRows);
  431. listCol.push_back(pColumn);
  432. break;
  433. case 8:
  434. pColumn = CGridColumnPtr(new CGridColumn());
  435. pColumn->SetName("Particle");
  436. for (auto GBF : listCGBField)
  437. {
  438. for (auto p : GBF->GetParticleList())
  439. {
  440. pRow = CGridRowPtr(new CGridRow());
  441. pRow->SetParticle(p);
  442. listRows.push_back(pRow);
  443. }
  444. }
  445. pColumn->SetGridRowsList(listRows);
  446. listCol.push_back(pColumn);
  447. break;
  448. case 9:
  449. pColumn = CGridColumnPtr(new CGridColumn());
  450. pColumn->SetName("ParticleGBClass");
  451. for (auto GBF : listCGBField)
  452. {
  453. for (auto p : GBF->GetParticleList())
  454. {
  455. int l = (int)GBF->mapAllParticles[p].myType;
  456. pRow = CGridRowPtr(new CGridRow());
  457. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  458. pRow->SetIntValue(l);
  459. listRows.push_back(pRow);
  460. }
  461. }
  462. pColumn->SetGridRowsList(listRows);
  463. listCol.push_back(pColumn);
  464. break;
  465. case 10:
  466. pColumn = CGridColumnPtr(new CGridColumn());
  467. pColumn->SetName("ParticleGBWidthClass");
  468. for (auto GBF : listCGBField)
  469. {
  470. for (auto p : GBF->GetParticleList())
  471. {
  472. int w = (int)GBF->mapAllParticles[p].myWidth;
  473. pRow = CGridRowPtr(new CGridRow());
  474. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  475. pRow->SetIntValue(w);
  476. listRows.push_back(pRow);
  477. }
  478. }
  479. pColumn->SetGridRowsList(listRows);
  480. listCol.push_back(pColumn);
  481. break;
  482. default:
  483. break;
  484. }
  485. }
  486. pGridData->SetGridColumnList(listCol);
  487. return pGridData;
  488. }
  489. std::string CGBCalculate::GetLevelStr(GB_GRADE_TYPE l)
  490. {
  491. std::string s;
  492. switch (l)
  493. {
  494. case GB_GRADE_TYPE::POINT_0_0 :
  495. s = "0";
  496. break;
  497. case GB_GRADE_TYPE::POINT_0_5:
  498. s = "0.5";
  499. break;
  500. case GB_GRADE_TYPE::POINT_1_0:
  501. s = "1";
  502. break;
  503. case GB_GRADE_TYPE::POINT_1_5:
  504. s = "1.5";
  505. break;
  506. case GB_GRADE_TYPE::POINT_2_0:
  507. s = "2";
  508. break;
  509. case GB_GRADE_TYPE::POINT_2_5:
  510. s = "2.5";
  511. break;
  512. case GB_GRADE_TYPE::POINT_3_0:
  513. s = "3";
  514. break;
  515. case GB_GRADE_TYPE::POINT_3_5:
  516. s = "3.5";
  517. break;
  518. case GB_GRADE_TYPE::POINT_4_0:
  519. s = "4";
  520. break;
  521. case GB_GRADE_TYPE::POINT_4_5:
  522. s = "4.5";
  523. break;
  524. case GB_GRADE_TYPE::POINT_5_0:
  525. s = "5";
  526. break;
  527. default:
  528. s = "0";
  529. break;
  530. }
  531. return s;
  532. }
  533. //get grid with level ABCD
  534. CGridDataPtr CGBCalculate::GetGridLevel(CString GridType,int a_nLevel[], int a_nLevel_w[], int a_nLevel_s[])
  535. {
  536. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  537. std::vector<CString> listDataSource;
  538. listDataSource.clear();
  539. listDataSource = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceList();
  540. pGridData->SetDataSourceList(listDataSource);
  541. int nDataSourceId = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceId();
  542. pGridData->SetDataSourceId(nDataSourceId);
  543. //amounts
  544. CGridColumnsList listCol;
  545. listCol.clear();
  546. int columnNum = 11 + 1 + 1;//表格总列数 12个级别再加上前面的“分类”列和“宽度/um”列
  547. CGridColumnPtr pColumn;
  548. for (int i=0;i< columnNum;i++)
  549. {
  550. CString strName;
  551. CGridRowsList listRows;
  552. CGridRowPtr pRow;
  553. CString strWidthName1, strWidthName2, strWidthName3;
  554. switch( i)
  555. {
  556. case 0:
  557. pColumn = CGridColumnPtr(new CGridColumn());
  558. //strName = MultiLang::GetInstance ().GetCStringByKey (GBStr1);
  559. strName = "Class";
  560. pColumn->SetName(strName);
  561. pRow = CGridRowPtr(new CGridRow());
  562. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  563. pRow->SetStringValue("Thin"); //MultiLang::GetInstance().GetCStringByKey(GBStr2)
  564. listRows.push_back(pRow);
  565. pRow = CGridRowPtr(new CGridRow());
  566. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  567. pRow->SetStringValue("Thick"); //MultiLang::GetInstance().GetCStringByKey(GBStr3)
  568. listRows.push_back(pRow);
  569. pRow = CGridRowPtr(new CGridRow());
  570. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  571. pRow->SetStringValue("OverSize"); //MultiLang::GetInstance().GetCStringByKey(GBStr4)
  572. listRows.push_back(pRow);
  573. pColumn->SetGridRowsList(listRows);
  574. listCol.push_back(pColumn);
  575. break;
  576. case 1:
  577. pColumn = CGridColumnPtr(new CGridColumn());
  578. strName = "Width/um"; //MultiLang::GetInstance().GetCStringByKey(GBStr5);
  579. pColumn->SetName(strName);
  580. if (GridType == "A")
  581. {
  582. strWidthName1 = "2.0~4.0";
  583. strWidthName2 = "4.0~12.0";
  584. strWidthName3 = ">12.0";
  585. }
  586. if (GridType == "B")
  587. {
  588. strWidthName1 = "2.0~9.0";
  589. strWidthName2 = "9.0~15.0";
  590. strWidthName3 = ">15.0";
  591. }
  592. if (GridType == "C")
  593. {
  594. strWidthName1 = "2.0~5.0";
  595. strWidthName2 = "5.0~12.0";
  596. strWidthName3 = ">12.0";
  597. }
  598. if (GridType == "D")
  599. {
  600. strWidthName1 = "2.0~8.0";
  601. strWidthName2 = "8.0~13.0";
  602. strWidthName3 = ">13.0";
  603. }
  604. if (GridType == "DSulfide")
  605. {
  606. strWidthName1 = "2.0~8.0";
  607. strWidthName2 = "8.0~13.0";
  608. strWidthName3 = ">13.0";
  609. }
  610. pRow = CGridRowPtr(new CGridRow());
  611. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  612. pRow->SetStringValue(strWidthName1);
  613. listRows.push_back(pRow);
  614. pRow = CGridRowPtr(new CGridRow());
  615. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  616. pRow->SetStringValue(strWidthName2);
  617. listRows.push_back(pRow);
  618. pRow = CGridRowPtr(new CGridRow());
  619. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  620. pRow->SetStringValue(strWidthName3);
  621. listRows.push_back(pRow);
  622. pColumn->SetGridRowsList(listRows);
  623. listCol.push_back(pColumn);
  624. break;
  625. default:
  626. pColumn = CGridColumnPtr(new CGridColumn());
  627. CString name;
  628. name.Format(_T("%.1f"), (i - 2) / 2.0);//i=2 输出0 i=3 输出0.5 i=4 输出1 以此类推
  629. pColumn->SetName(name);
  630. CGridRowsList listRows;
  631. pRow = CGridRowPtr(new CGridRow());
  632. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  633. pRow->SetIntValue(a_nLevel[i - 2]);
  634. listRows.push_back(pRow);
  635. pRow = CGridRowPtr(new CGridRow());
  636. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  637. pRow->SetIntValue(a_nLevel_w[i - 2]);
  638. listRows.push_back(pRow);
  639. pRow = CGridRowPtr(new CGridRow());
  640. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  641. pRow->SetIntValue(a_nLevel_s[i - 2]);
  642. listRows.push_back(pRow);
  643. pColumn->SetGridRowsList(listRows);
  644. listCol.push_back(pColumn);
  645. break;
  646. }
  647. }
  648. pGridData->SetGridColumnList(listCol);
  649. return pGridData;
  650. }
  651. CGridDataPtr CGBCalculate::GetGridDSLevel(CGBFieldList listCGBField)
  652. {
  653. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  654. std::vector<CString> listDataSource;
  655. listDataSource.clear();
  656. listDataSource = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceList();
  657. pGridData->SetDataSourceList(listDataSource);
  658. int nDataSourceId = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceId();
  659. pGridData->SetDataSourceId(nDataSourceId);
  660. //amounts
  661. CGridColumnsList listCol;
  662. listCol.clear();
  663. int columnNum = 6;
  664. CGridColumnPtr pColumn;
  665. for (int i = 0; i < columnNum; i++)
  666. {
  667. CString strName;
  668. CGridRowsList listRows[6];
  669. CGridRowPtr pRow;
  670. CString strWidthName1, strWidthName2, strWidthName3;
  671. switch (i)
  672. {
  673. case 0:
  674. pColumn = CGridColumnPtr(new CGridColumn());
  675. strName = "No."; //MultiLang::GetInstance().GetCStringByKey(GBStr6);
  676. pColumn->SetName(strName);
  677. pColumn->SetGridRowsList(listRows[0]);
  678. listCol.push_back(pColumn);
  679. break;
  680. case 1:
  681. pColumn = CGridColumnPtr(new CGridColumn());
  682. strName = "Area/um2"; //MultiLang::GetInstance().GetCStringByKey(GBStr7);
  683. pColumn->SetName(strName);
  684. pColumn->SetGridRowsList(listRows[1]);
  685. listCol.push_back(pColumn);
  686. break;
  687. case 2:
  688. pColumn = CGridColumnPtr(new CGridColumn());
  689. strName = "MaxFeret/um";// MultiLang::GetInstance().GetCStringByKey(GBStr8);
  690. pColumn->SetName(strName);
  691. pColumn->SetGridRowsList(listRows[2]);
  692. listCol.push_back(pColumn);
  693. break;
  694. case 3:
  695. pColumn = CGridColumnPtr(new CGridColumn());
  696. strName = "X/mm";
  697. pColumn->SetName(strName);
  698. pColumn->SetGridRowsList(listRows[3]);
  699. listCol.push_back(pColumn);
  700. break;
  701. case 4:
  702. pColumn = CGridColumnPtr(new CGridColumn());
  703. strName = "Y/mm";
  704. pColumn->SetName(strName);
  705. pColumn->SetGridRowsList(listRows[4]);
  706. listCol.push_back(pColumn);
  707. break;
  708. case 5:
  709. pColumn = CGridColumnPtr(new CGridColumn());
  710. strName = "Grade";// MultiLang::GetInstance().GetCStringByKey(GBStr9);
  711. pColumn->SetName(strName);
  712. pColumn->SetGridRowsList(listRows[5]);
  713. listCol.push_back(pColumn);
  714. break;
  715. }
  716. }
  717. COTSParticleList allDSParts;
  718. for (CGBFieldDataPtr frame : listCGBField)
  719. {
  720. auto dsparticles = frame->listDSParticles;
  721. for (auto part : dsparticles)
  722. {
  723. allDSParts.push_back(part);
  724. }
  725. }
  726. for (auto part : allDSParts)
  727. {
  728. DisplayDSPartRow(part, listCol);
  729. }
  730. pGridData->SetGridColumnList(listCol);
  731. return pGridData;
  732. }
  733. //get grid with level ABCD
  734. CGridDataPtr CGBCalculate::GetGridDIN(COTSParticleList cotsparticlelistA, set<COTSParticlePtr> cotsparticlelistB, COTSParticleList cotsparticlelistC, COTSParticleList cotsparticlelistD)
  735. {
  736. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  737. std::vector<CString> listDataSource;
  738. listDataSource.clear();
  739. listDataSource = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceList();
  740. pGridData->SetDataSourceList(listDataSource);
  741. int nDataSourceId = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceId();
  742. pGridData->SetDataSourceId(nDataSourceId);
  743. //amounts
  744. CGridColumnsList listCol;
  745. listCol.clear();
  746. int columnNum = 12;//表格总列数 11个级别再加上前面的“分类”列
  747. CGridColumnPtr pColumn;
  748. int levA[9] = { 0,0,0,0,0,0,0,0,0 };
  749. int levB[9] = { 0,0,0,0,0,0,0,0,0 };
  750. int levC[9] = { 0,0,0,0,0,0,0,0,0 };
  751. int levD[9] = { 0,0,0,0,0,0,0,0,0 };
  752. double fg[9] = { 0.05,0.1,0.2,0.5,1,2,5,10,20 };
  753. //指数
  754. double ka = 0, kb = 0, kc = 0, kd = 0;
  755. //统计不同大小颗粒出现次数
  756. for (auto pParticle : cotsparticlelistA)
  757. {
  758. double area = pParticle->GetActualArea();
  759. for (int i = 0; i < 8; i++)
  760. {
  761. if (area >= fg[i] && area < fg[i + 1])
  762. {
  763. levA[i] += 1;
  764. ka = ka + fg[i];
  765. }
  766. }
  767. if (area >= fg[8])
  768. {
  769. levA[8] += 1;
  770. ka = ka + fg[8];
  771. }
  772. }
  773. for (auto pParticle : cotsparticlelistB)
  774. {
  775. double area = pParticle->GetActualArea();
  776. for (int i = 0; i < 8; i++)
  777. {
  778. if (area >= fg[i] && area < fg[i + 1])
  779. {
  780. levB[i] += 1;
  781. kb = kb + fg[i];
  782. }
  783. }
  784. if (area >= fg[8])
  785. {
  786. levB[8] += 1;
  787. kb = kb + fg[8];
  788. }
  789. }
  790. for (auto pParticle : cotsparticlelistC)
  791. {
  792. double area = pParticle->GetActualArea();
  793. for (int i = 0; i < 8; i++)
  794. {
  795. if (area >= fg[i] && area < fg[i + 1])
  796. {
  797. levC[i] += 1;
  798. kc = kc + fg[i];
  799. }
  800. }
  801. if (area >= fg[8])
  802. {
  803. levC[8] += 1;
  804. kc = kc + fg[8];
  805. }
  806. }
  807. for (auto pParticle : cotsparticlelistD)
  808. {
  809. double area = pParticle->GetActualArea();
  810. for (int i = 0; i < 8; i++)
  811. {
  812. if (area >= fg[i] && area < fg[i + 1])
  813. {
  814. levD[i] += 1;
  815. kd = kd + fg[i];
  816. }
  817. }
  818. if (area >= fg[8])
  819. {
  820. levD[8] += 1;
  821. kd = kd + fg[8];
  822. }
  823. }
  824. double to = kb + kc + kd;
  825. for (int i = 0; i < columnNum; i++)
  826. {
  827. CString strName;
  828. CGridRowsList listRows;
  829. CGridRowPtr pRow;
  830. CString strWidthName1, strWidthName2, strWidthName3, strWidthName4;
  831. switch (i)
  832. {
  833. case 0:
  834. pColumn = CGridColumnPtr(new CGridColumn());
  835. strName = "Class";
  836. pColumn->SetName(strName);
  837. pRow = CGridRowPtr(new CGridRow());
  838. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  839. pRow->SetStringValue("SS");
  840. listRows.push_back(pRow);
  841. pRow = CGridRowPtr(new CGridRow());
  842. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  843. pRow->SetStringValue("OA");
  844. listRows.push_back(pRow);
  845. pRow = CGridRowPtr(new CGridRow());
  846. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  847. pRow->SetStringValue("OS");
  848. listRows.push_back(pRow);
  849. pRow = CGridRowPtr(new CGridRow());
  850. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  851. pRow->SetStringValue("OG");
  852. listRows.push_back(pRow);
  853. pColumn->SetGridRowsList(listRows);
  854. listCol.push_back(pColumn);
  855. break;
  856. case 10:
  857. pColumn = CGridColumnPtr(new CGridColumn());
  858. strName = "S";
  859. pColumn->SetName(strName);
  860. strWidthName1.Format(_T("%lf"), ka);
  861. strWidthName2 = "";
  862. strWidthName3 = "";
  863. strWidthName4 = "";
  864. pRow = CGridRowPtr(new CGridRow());
  865. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  866. pRow->SetDoubleValue(ka);
  867. listRows.push_back(pRow);
  868. pRow = CGridRowPtr(new CGridRow());
  869. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  870. pRow->SetDoubleValue(0);
  871. listRows.push_back(pRow);
  872. pRow = CGridRowPtr(new CGridRow());
  873. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  874. pRow->SetDoubleValue(0);
  875. listRows.push_back(pRow);
  876. pRow = CGridRowPtr(new CGridRow());
  877. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  878. pRow->SetDoubleValue(0);
  879. listRows.push_back(pRow);
  880. pColumn->SetGridRowsList(listRows);
  881. listCol.push_back(pColumn);
  882. break;
  883. case 11:
  884. pColumn = CGridColumnPtr(new CGridColumn());
  885. strName = "O";
  886. pColumn->SetName(strName);
  887. strWidthName1.Format(_T("%lf"), to);
  888. strWidthName2 = "";
  889. strWidthName3 = "";
  890. strWidthName4 = "";
  891. pRow = CGridRowPtr(new CGridRow());
  892. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  893. pRow->SetDoubleValue(0);
  894. listRows.push_back(pRow);
  895. pRow = CGridRowPtr(new CGridRow());
  896. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  897. pRow->SetDoubleValue(kb);
  898. listRows.push_back(pRow);
  899. pRow = CGridRowPtr(new CGridRow());
  900. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  901. pRow->SetDoubleValue(kc);
  902. listRows.push_back(pRow);
  903. pRow = CGridRowPtr(new CGridRow());
  904. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  905. pRow->SetDoubleValue(kd);
  906. listRows.push_back(pRow);
  907. pColumn->SetGridRowsList(listRows);
  908. listCol.push_back(pColumn);
  909. break;
  910. default:
  911. pColumn = CGridColumnPtr(new CGridColumn());
  912. strName.Format("%d", i - 1);
  913. pColumn->SetName(strName);
  914. CGridRowsList listRows;
  915. pRow = CGridRowPtr(new CGridRow());
  916. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  917. pRow->SetIntValue(levA[i - 1]);
  918. listRows.push_back(pRow);
  919. pRow = CGridRowPtr(new CGridRow());
  920. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  921. pRow->SetIntValue(levB[i - 1]);
  922. listRows.push_back(pRow);
  923. pRow = CGridRowPtr(new CGridRow());
  924. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  925. pRow->SetIntValue(levC[i - 1]);
  926. listRows.push_back(pRow);
  927. pRow = CGridRowPtr(new CGridRow());
  928. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  929. pRow->SetIntValue(levD[i - 1]);
  930. listRows.push_back(pRow);
  931. pColumn->SetGridRowsList(listRows);
  932. listCol.push_back(pColumn);
  933. break;
  934. }
  935. }
  936. pGridData->SetGridColumnList(listCol);
  937. return pGridData;
  938. }
  939. void CGBCalculate::SetFrameLevelNo(GB_GRADE_TYPE a_level, int a_nLevel[])
  940. {
  941. a_nLevel[(int)a_level] += 1;
  942. }
  943. // calculate GB fields
  944. CGBFieldList CGBCalculate::CalGBFields(CSmplMsrResultFileMgrPtr pSmplMgr)
  945. {
  946. CGBFieldList m_listGBFields;
  947. m_listGBFields.clear();
  948. ASSERT(pSmplMgr);
  949. CSmplMsrResultFilePtr pSmplMsrResultFile = pSmplMgr->GetSmplMsrResultFile();
  950. ASSERT(pSmplMsrResultFile);
  951. COTSSamplePtr pOTSSample = pSmplMsrResultFile->GetSample();
  952. ASSERT(pOTSSample);
  953. CSEMDataMsrPtr pEMDataMsrPtr = pOTSSample->GetSEMDataMsr();
  954. ASSERT(pEMDataMsrPtr);
  955. // get field width
  956. int nOTSFieldWidth = pEMDataMsrPtr->GetScanFieldSize();
  957. int nOTSFieldHeight = pEMDataMsrPtr->GetScanFieldHeight();
  958. if (nOTSFieldWidth == 0 || nOTSFieldHeight==0)
  959. {
  960. LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: field width is zero ."));
  961. return m_listGBFields;
  962. }
  963. // scan parameters
  964. CMsrParamsPtr pMsrParam = pOTSSample->GetMsrParams();
  965. //CMsrParamsPtr pMsrParam = pOTSSample->get
  966. COTSImageScanParamPtr pImgScanParam = pMsrParam->GetImageScanParam();
  967. CSize sizePixelImage = pImgScanParam->GetImageResolution();
  968. //use OTSField width cal the OTSField height
  969. //get OTSfilds list
  970. COTSFieldDataList allOTSFields;
  971. allOTSFields = pSmplMsrResultFile->GetFieldData();
  972. // convert ots fields to gb fields
  973. if (!OTSFieldToGBField( allOTSFields, &m_listGBFields, sizePixelImage, nOTSFieldWidth, nOTSFieldHeight))
  974. {
  975. LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: call OTSFieldToGBField failed."));
  976. return m_listGBFields;
  977. }
  978. return m_listGBFields;
  979. }
  980. // Turn OTSField to GBField
  981. BOOL CGBCalculate::OTSFieldToGBField(COTSFieldDataList allOTSFields, CGBFieldList* m_listGBFields,CSize sizePixelImage,int nOTSFieldWidth,int nOTSFieldHeight)
  982. {
  983. if (allOTSFields.empty())
  984. {
  985. LogTrace(__FILE__, __LINE__, _T("CalGBFields: listOTSFields is empty ."));
  986. return TRUE;
  987. }
  988. // get topleft point and bottomright point of the measurement convered area
  989. CPoint pointTopleft, pointBottomright;
  990. pointTopleft = pointBottomright = allOTSFields[0]->GetPosition();
  991. //判断有效区域
  992. for (unsigned int i = 0; i< allOTSFields.size(); i++)
  993. {
  994. //get current OTSField Position,the position is in the center of the field
  995. CPoint poiOTSFieldPosition = allOTSFields[i]->GetPosition();
  996. pointTopleft.x = min(poiOTSFieldPosition.x, pointTopleft.x);
  997. pointTopleft.y = max(poiOTSFieldPosition.y, pointTopleft.y);
  998. pointBottomright.x = max(poiOTSFieldPosition.x, pointBottomright.x);
  999. pointBottomright.y = min(poiOTSFieldPosition.y, pointBottomright.y);
  1000. }
  1001. pointTopleft.x -= nOTSFieldWidth / 2;
  1002. pointTopleft.y += nOTSFieldHeight / 2;
  1003. pointBottomright.x+= nOTSFieldWidth / 2;
  1004. pointBottomright.y-= nOTSFieldHeight / 2;
  1005. double totalWidth = pointBottomright.x - pointTopleft.x;
  1006. double totalHeight = pointTopleft.y - pointBottomright.y;
  1007. int nPossibleGBFieldRowNum = totalHeight /GB_FIELD_WIDTH+0.5;//可能有的国标field行数
  1008. int nPossibleGBFieldColNum = totalWidth / GB_FIELD_WIDTH+0.5;//列数
  1009. //get possible OTSFields
  1010. m_listGBFields->clear();
  1011. CPoint pointGBFieldPosition;
  1012. for (int i = 0; i < nPossibleGBFieldRowNum; i++)
  1013. {
  1014. for (int j = 0; j < nPossibleGBFieldColNum; j++)
  1015. {
  1016. // cal GB field rectangle
  1017. CPoint poiCurGBFieldTopLeft, poiCurGBFieldBottomRight;
  1018. poiCurGBFieldTopLeft = pointTopleft;
  1019. //获得左上角的坐标
  1020. poiCurGBFieldTopLeft.x += j * GB_FIELD_WIDTH;
  1021. poiCurGBFieldTopLeft.y -= i * GB_FIELD_WIDTH;
  1022. //获得右下角的坐标
  1023. poiCurGBFieldBottomRight.x = poiCurGBFieldTopLeft.x + GB_FIELD_WIDTH;
  1024. poiCurGBFieldBottomRight.y = poiCurGBFieldTopLeft.y - GB_FIELD_WIDTH;
  1025. COTSRect rectGBField(poiCurGBFieldTopLeft, poiCurGBFieldBottomRight);
  1026. CGBFieldDataPtr pGBFieldData;
  1027. pGBFieldData = GetOneGBField(rectGBField, allOTSFields, sizePixelImage, nOTSFieldWidth, nOTSFieldHeight);
  1028. if (!pGBFieldData)
  1029. {
  1030. continue;
  1031. }
  1032. CPoint poiNewPosition=rectGBField.GetCenterPoint();
  1033. pGBFieldData->SetPosition(poiNewPosition);
  1034. // add the GBField into the GBFields list
  1035. m_listGBFields->push_back(pGBFieldData);
  1036. }
  1037. }
  1038. // ok, return TRUE
  1039. return TRUE;
  1040. }
  1041. // Custom collation rules
  1042. BOOL comp(const COTSFieldDataPtr &a, const COTSFieldDataPtr &b)
  1043. {
  1044. if (a->GetPosition().y <= b->GetPosition().y)
  1045. {
  1046. if (a->GetPosition().y == b->GetPosition().y)
  1047. {
  1048. if (a->GetPosition().x < b->GetPosition().x)
  1049. {
  1050. return TRUE;
  1051. }
  1052. }
  1053. else {
  1054. return TRUE;
  1055. }
  1056. }
  1057. return FALSE;
  1058. }
  1059. // get the GB field within a rectangle
  1060. CGBFieldDataPtr CGBCalculate::GetOneGBField(COTSRect a_rectGBField,
  1061. COTSFieldDataList& allOTSFields,
  1062. CSize a_sizePixelImage,
  1063. int nOTSFieldWidth, int nOTSFieldHeight)
  1064. {
  1065. // GB Field handle
  1066. CGBFieldDataPtr pGBFieldData = nullptr;
  1067. // get OTS fields within the rectangle
  1068. COTSFieldDataList myOTSFields;
  1069. myOTSFields.clear();
  1070. COTSFieldDataList::iterator itr = allOTSFields.begin();
  1071. while (itr != allOTSFields.end())
  1072. {
  1073. // get an OTS field
  1074. CPoint poiOTSField = (*itr)->GetPosition();
  1075. COTSRect fldRec = COTSRect(poiOTSField.x - nOTSFieldWidth / 2, poiOTSField.y + nOTSFieldHeight / 2, poiOTSField.x + nOTSFieldWidth / 2, poiOTSField.y - nOTSFieldHeight / 2);
  1076. if (a_rectGBField.IntersectOtherRect( fldRec))
  1077. {
  1078. (*itr)->SetRect(fldRec);
  1079. myOTSFields.push_back(*itr);
  1080. itr++;
  1081. continue;
  1082. }
  1083. itr++;
  1084. }
  1085. pGBFieldData = NormalizeParticles(a_rectGBField, myOTSFields, a_sizePixelImage, nOTSFieldWidth, nOTSFieldHeight);
  1086. pGBFieldData->myReleventOTSFlds = myOTSFields;
  1087. return pGBFieldData;
  1088. }
  1089. // normalize particles for the GBFields
  1090. CGBFieldDataPtr CGBCalculate::NormalizeParticles(COTSRect a_rectGBField, COTSFieldDataList myOTSFields, CSize a_sizePixelImage, int nFieldWidth,int nFieldHeight)
  1091. {
  1092. // inits
  1093. CGBFieldDataPtr pGBFieldData(new CGBFieldData);
  1094. pGBFieldData->SetMyRect(a_rectGBField);
  1095. COTSParticleList listNormalizedParticles;
  1096. CPoint pointGBFieldRectTopLeft = a_rectGBField.GetTopLeft();
  1097. COTSRect GBRect = a_rectGBField;
  1098. int nBeforeCalNo = 0;
  1099. int nAfterCalNo = 0;
  1100. for (auto OTSField : myOTSFields)
  1101. {
  1102. for (auto part : OTSField->GetParticleList())
  1103. {
  1104. CPoint fieldPos = OTSField->GetPosition();
  1105. //CPoint fieldTopLeft = CPoint(fieldPos.x - nFieldWidth / 2, fieldPos.y + nFieldHeight/2);
  1106. CPoint fieldTopLeft = OTSField->GetRect().GetTopLeft();
  1107. double fwidth = nFieldWidth;
  1108. double pixelsize = fwidth / a_sizePixelImage.cx;
  1109. CPoint xrayPosInFieldByPixel= part->GetXRayPos();
  1110. CPoint partPos = CPoint(fieldTopLeft.x + xrayPosInFieldByPixel.x * pixelsize, fieldTopLeft.y - xrayPosInFieldByPixel.y * pixelsize);
  1111. if (GBRect.PointInRect(partPos))
  1112. {
  1113. CRect rectInSinglefld = part->GetParticleRect();
  1114. CPoint OTSLeftTop = CPoint(fieldTopLeft.x + rectInSinglefld.left * pixelsize, fieldTopLeft.y - rectInSinglefld.top * pixelsize);
  1115. CPoint OTSRightBottom = CPoint(fieldTopLeft.x + rectInSinglefld.right * pixelsize, fieldTopLeft.y - rectInSinglefld.bottom * pixelsize);
  1116. COTSRect recInOTSCord = COTSRect(OTSLeftTop, OTSRightBottom);
  1117. part->SetOTSRect(recInOTSCord);
  1118. pGBFieldData->IdentifyPartChemicalType(part);
  1119. listNormalizedParticles.push_back(part);
  1120. }
  1121. }
  1122. }
  1123. // put new particle in the GB Field
  1124. pGBFieldData->SetParticleList(listNormalizedParticles);
  1125. return pGBFieldData;
  1126. }
  1127. void CGBCalculate::SetPixSize(double p)
  1128. {
  1129. PixSize = p;
  1130. }
  1131. void CGBCalculate::DisplayDSPartRow(COTSParticlePtr part, CGridColumnsList listCol)
  1132. {
  1133. int columnNum = 6;
  1134. CGridColumnPtr pColumn;
  1135. for (int i = 0; i < columnNum; i++)
  1136. {
  1137. CString strName;
  1138. CGridRowsList listRows;
  1139. CGridRowPtr pRow;
  1140. CString strWidthName1, strWidthName2, strWidthName3;
  1141. CString idstr;
  1142. int fldid;
  1143. int partId;
  1144. switch (i)
  1145. {
  1146. case 0:
  1147. pColumn = listCol.at(0);
  1148. pRow = CGridRowPtr(new CGridRow());
  1149. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  1150. fldid = part->GetFieldId();
  1151. partId = part->GetTagId();
  1152. idstr.Format("%d_%d", fldid, partId);
  1153. pRow->SetStringValue(idstr);
  1154. pColumn->AddGridRow(pRow);
  1155. break;
  1156. case 1:
  1157. pColumn = listCol.at(1);
  1158. pRow = CGridRowPtr(new CGridRow());
  1159. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  1160. pRow->SetIntValue(part->GetActualArea());
  1161. pColumn->AddGridRow(pRow);
  1162. break;
  1163. case 2:
  1164. pColumn = listCol.at(2);
  1165. pRow = CGridRowPtr(new CGridRow());
  1166. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  1167. pRow->SetDoubleValue(part->GetFeretDiameter());
  1168. pColumn->AddGridRow(pRow);
  1169. break;
  1170. case 3:
  1171. pColumn = listCol.at(3);
  1172. pRow = CGridRowPtr(new CGridRow());
  1173. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  1174. pRow->SetIntValue(part->GetAbsolutPos().x);
  1175. pColumn->AddGridRow(pRow);
  1176. break;
  1177. case 4:
  1178. pColumn = listCol.at(4);
  1179. pRow = CGridRowPtr(new CGridRow());
  1180. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  1181. pRow->SetIntValue(part->GetAbsolutPos().y);
  1182. pColumn->AddGridRow(pRow);
  1183. break;
  1184. case 5:
  1185. pColumn = listCol.at(5);
  1186. pRow = CGridRowPtr(new CGridRow());
  1187. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  1188. pRow->SetIntValue((int)OTSGBCalculate::GetDSGrade(part->GetFeretDiameter()));
  1189. pColumn->AddGridRow(pRow);
  1190. break;
  1191. }
  1192. }
  1193. }
  1194. }