CGBCalculate.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143
  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(CALCULATE_TABLE_TYPE tableType)
  24. {
  25. CGBFieldList listCGBField;
  26. CGridDatasList listGridData;
  27. listGridData.clear();
  28. CGridDatasList multGridList;
  29. multGridList.clear();
  30. // depart compound source name
  31. CPropParamPtr currentProp = m_rptMgrPtr->GetPropertyParamForGrid();
  32. std::vector<CString> listDataSource = currentProp->GetDataSourceList();
  33. int nSelectedDataSourceIndex = currentProp->GetDataSourceId();
  34. CString sDataSourceNames = listDataSource[nSelectedDataSourceIndex];
  35. std::vector<CString> listSelectedDataSource = COTSHelper::SplitString(sDataSourceNames, _T("+"));
  36. for (auto strDataSourceName : listSelectedDataSource)
  37. {
  38. listCGBField.clear();
  39. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  40. // data source id
  41. std::vector<CString> listDataSource;
  42. listDataSource.clear();
  43. listDataSource = currentProp->GetDataSourceList();
  44. pGridData->SetDataSourceList(listDataSource);
  45. int nDataSourceId = currentProp->GetDataSourceId();
  46. pGridData->SetDataSourceId(nDataSourceId);
  47. CSmplMsrResultFileMgrPtr rstFileMgrPrt = m_rptMgrPtr->GetASmplMsrResultMgrByFileName(strDataSourceName);
  48. CSmplMsrResultFilePtr pSmplMsrResultFile = rstFileMgrPrt->GetSmplMsrResultFile();
  49. if (tableType == CALCULATE_TABLE_TYPE::DIN)
  50. {
  51. CGBFieldDataPtr DINFld(new CGBFieldData());
  52. DINFld->CaculateLevelDIN(pSmplMsrResultFile->GetAllParticles());
  53. listGridData = this->GetGridDataListForOneDataSourceDIN(DINFld);//express these result data by grid
  54. }
  55. else
  56. {
  57. GB_METHODE_TYPE t;
  58. switch(tableType)
  59. {
  60. case CALCULATE_TABLE_TYPE::GB_Method1:
  61. t = GB_METHODE_TYPE::METHODE_1;
  62. break;
  63. case CALCULATE_TABLE_TYPE::GB_Method2:
  64. t= GB_METHODE_TYPE::METHODE_2;
  65. break;
  66. case CALCULATE_TABLE_TYPE::ASTM:
  67. t = GB_METHODE_TYPE::ASTM;
  68. break;
  69. default:
  70. t = GB_METHODE_TYPE::METHODE_1;
  71. break;
  72. }
  73. CGBFieldList listRawGBFields = CalGBFields(rstFileMgrPrt,t);
  74. CategoryGBInclutions(listRawGBFields, tableType);
  75. listCGBField = listRawGBFields;
  76. CGBGradeData gradeData = CGBGradeData(listCGBField);
  77. listGridData = this->GetGridDataListForOneDataSource(&gradeData, tableType);//express these result data by grid
  78. }
  79. multGridList.insert (multGridList.end (), listGridData.begin(), listGridData.end());
  80. }
  81. return multGridList;
  82. }
  83. void CGBCalculate::CategoryGBInclutions(CGBFieldList listCGBField, CALCULATE_TABLE_TYPE ty)
  84. {
  85. for (CGBFieldDataPtr GBFld : listCGBField)
  86. {
  87. switch (ty)
  88. {
  89. case CALCULATE_TABLE_TYPE::GB_Method1:
  90. GBFld->CategoryByMethod1();
  91. break;
  92. case CALCULATE_TABLE_TYPE::GB_Method2:
  93. GBFld->CategoryByMethod2();
  94. break;
  95. case CALCULATE_TABLE_TYPE::ASTM:
  96. GBFld->CategoryByASTM();
  97. break;
  98. default:
  99. break;
  100. }
  101. }
  102. }
  103. CGBFieldList CGBCalculate::GetTopGradeGBFieldsByIncCategory(CGBFieldList listGBFields, GBIncCategory incCategory)
  104. {
  105. CGBFieldList fields;
  106. CGBGradeData gradeData = CGBGradeData(listGBFields);
  107. GBGradeCell* categoryRow;
  108. switch (incCategory)
  109. {
  110. case GBIncCategory::AT:
  111. categoryRow = gradeData.ALevel;
  112. break;
  113. case GBIncCategory::AW:
  114. categoryRow = gradeData.ALevel_w;
  115. break;
  116. case GBIncCategory::AS:
  117. categoryRow = gradeData.ALevel_s;
  118. break;
  119. case GBIncCategory::BT:
  120. categoryRow = gradeData.BLevel;
  121. break;
  122. case GBIncCategory::BW:
  123. categoryRow = gradeData.BLevel_w;
  124. break;
  125. case GBIncCategory::BS:
  126. categoryRow = gradeData.BLevel_s;
  127. break;
  128. case GBIncCategory::CT:
  129. categoryRow = gradeData.CLevel;
  130. break;
  131. case GBIncCategory::CW:
  132. categoryRow = gradeData.CLevel_w;
  133. break;
  134. case GBIncCategory::CS:
  135. categoryRow = gradeData.CLevel_s;
  136. break;
  137. case GBIncCategory::DT:
  138. categoryRow = gradeData.DLevel;
  139. break;
  140. case GBIncCategory::DW:
  141. categoryRow = gradeData.DLevel_w;
  142. break;
  143. case GBIncCategory::DS:
  144. categoryRow = gradeData.DLevel_s;
  145. break;
  146. case GBIncCategory::DSulfideT:
  147. categoryRow = gradeData.DSulfideLevel;
  148. break;
  149. case GBIncCategory::DSulfideW:
  150. categoryRow = gradeData.DSulfideLevel_w;
  151. break;
  152. case GBIncCategory::DSulfideS:
  153. categoryRow = gradeData.DSulfideLevel_s;
  154. break;
  155. default:
  156. categoryRow = gradeData.DSulfideLevel_s;
  157. break;
  158. }
  159. for (int i = 10; i > 0; i--)//by invert searching ,the first none zero cell is the toppest grade of this category.
  160. {
  161. if (categoryRow[i].nFldNum > 0)
  162. {
  163. fields = categoryRow[i].GBFlds;
  164. break;
  165. }
  166. }
  167. return fields;
  168. }
  169. CGBFieldList CGBCalculate::GetAllGBFields(CALCULATE_TABLE_TYPE tableType)
  170. {
  171. CPropParamPtr currentProp = m_rptMgrPtr->GetPropertyParamForGrid();
  172. std::vector<CString> listDataSource = currentProp->GetDataSourceList();
  173. int nSelectedDataSourceIndex = currentProp->GetDataSourceId();
  174. CString sDataSourceNames = listDataSource[nSelectedDataSourceIndex];
  175. std::vector<CString> listSelectedDataSource = COTSHelper::SplitString(sDataSourceNames, _T("+"));
  176. CGBFieldList fields;
  177. if (listSelectedDataSource.size() > 1) return fields;
  178. CSmplMsrResultFileMgrPtr rstFileMgrPrt = m_rptMgrPtr->GetASmplMsrResultMgrByFileName(listSelectedDataSource[0]);
  179. GB_METHODE_TYPE t;
  180. switch (tableType)
  181. {
  182. case CALCULATE_TABLE_TYPE::GB_Method1:
  183. t = GB_METHODE_TYPE::METHODE_1;
  184. break;
  185. case CALCULATE_TABLE_TYPE::GB_Method2:
  186. t = GB_METHODE_TYPE::METHODE_2;
  187. break;
  188. case CALCULATE_TABLE_TYPE::ASTM:
  189. t = GB_METHODE_TYPE::ASTM;
  190. break;
  191. default:
  192. t = GB_METHODE_TYPE::METHODE_1;
  193. break;
  194. }
  195. CGBFieldList listGBFields = CalGBFields(rstFileMgrPrt,t);
  196. CategoryGBInclutions(listGBFields, tableType);
  197. return listGBFields;
  198. }
  199. CGridDatasList CGBCalculate::GetGridDataListForOneDataSource(CGBGradeData* gradeData, CALCULATE_TABLE_TYPE tableType)
  200. {
  201. CGridDatasList listGridData;
  202. CGridDataPtr AGrid;
  203. CGridDataPtr BGrid;
  204. CGridDataPtr CGrid;
  205. CGridDataPtr DGrid;
  206. CGridDataPtr DSulfideGrid;
  207. CGridDataPtr DSGrid;
  208. CGridDataPtr GBFieldGrid;
  209. switch (tableType)
  210. {
  211. case CALCULATE_TABLE_TYPE::GB_Method1:
  212. AGrid = GetGridLevel("A", gradeData->ALevel, gradeData->ALevel_w, gradeData->ALevel_s);
  213. BGrid = GetGridLevel("B", gradeData->BLevel, gradeData->BLevel_w, gradeData->BLevel_s);
  214. CGrid = GetGridLevel("C", gradeData->CLevel, gradeData->CLevel_w, gradeData->CLevel_s);
  215. DGrid = GetGridLevel("D", gradeData->DLevel, gradeData->DLevel_w, gradeData->DLevel_s);
  216. DSGrid = GetGridDSLevel(gradeData);
  217. listGridData.push_back(AGrid);
  218. listGridData.push_back(BGrid);
  219. listGridData.push_back(CGrid);
  220. listGridData.push_back(DGrid);
  221. listGridData.push_back(DSGrid);
  222. return listGridData;
  223. break;
  224. case CALCULATE_TABLE_TYPE::GB_Method2:
  225. AGrid = GetGridLevel("A", gradeData->ALevel, gradeData->ALevel_w, gradeData->ALevel_s);
  226. BGrid = GetGridLevel("B", gradeData->BLevel, gradeData->BLevel_w, gradeData->BLevel_s);
  227. CGrid = GetGridLevel("C", gradeData->CLevel, gradeData->CLevel_w, gradeData->CLevel_s);
  228. DGrid = GetGridLevel("D", gradeData->DLevel, gradeData->DLevel_w, gradeData->DLevel_s);
  229. DSulfideGrid = GetGridLevel("DSulfide", gradeData->DSulfideLevel, gradeData->DSulfideLevel_w, gradeData->DSulfideLevel_s);
  230. DSGrid = GetGridDSLevel(gradeData);
  231. listGridData.push_back(AGrid);
  232. listGridData.push_back(BGrid);
  233. listGridData.push_back(CGrid);
  234. listGridData.push_back(DGrid);
  235. listGridData.push_back(DSulfideGrid);
  236. listGridData.push_back(DSGrid);
  237. return listGridData;
  238. break;
  239. case CALCULATE_TABLE_TYPE::ASTM:
  240. AGrid = GetGridLevel("A", gradeData->ALevel, gradeData->ALevel_w, gradeData->ALevel_s);
  241. BGrid = GetGridLevel("B", gradeData->BLevel, gradeData->BLevel_w, gradeData->BLevel_s);
  242. CGrid = GetGridLevel("C", gradeData->CLevel, gradeData->CLevel_w, gradeData->CLevel_s);
  243. DGrid = GetGridLevel("D", gradeData->DLevel, gradeData->DLevel_w, gradeData->DLevel_s);
  244. DSGrid = GetGridDSLevel(gradeData);
  245. listGridData.push_back(AGrid);
  246. listGridData.push_back(BGrid);
  247. listGridData.push_back(CGrid);
  248. listGridData.push_back(DGrid);
  249. listGridData.push_back(DSGrid);
  250. return listGridData;
  251. break;
  252. default:
  253. return listGridData;
  254. break;
  255. }
  256. }
  257. CGridDatasList CGBCalculate::GetGridDataListForOneDataSourceDIN(CGBFieldDataPtr DINFld)
  258. {
  259. CGridDatasList listGridData;
  260. COTSParticleList cotsparticlelistA;
  261. set<COTSParticlePtr> cotsparticlelistB;
  262. COTSParticleList cotsparticlelistC;
  263. COTSParticleList cotsparticlelistD;
  264. cotsparticlelistA = DINFld->listAThinParticles;
  265. cotsparticlelistB = DINFld->listBThinParticles;
  266. cotsparticlelistC = DINFld->listCThinParticles;
  267. cotsparticlelistD = DINFld->listDThinParticles;
  268. CGridDataPtr AGrid;
  269. AGrid = GetGridDIN(cotsparticlelistA, cotsparticlelistB, cotsparticlelistC, cotsparticlelistD);
  270. listGridData.push_back(AGrid);
  271. return listGridData;
  272. }
  273. //get grid with level ABCD
  274. CGridDataPtr CGBCalculate::GetGridLevel(CString GridType, GBGradeCell a_nLevel[], GBGradeCell a_nLevel_w[], GBGradeCell a_nLevel_s[])
  275. {
  276. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  277. std::vector<CString> listDataSource;
  278. listDataSource.clear();
  279. listDataSource = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceList();
  280. pGridData->SetDataSourceList(listDataSource);
  281. int nDataSourceId = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceId();
  282. pGridData->SetDataSourceId(nDataSourceId);
  283. //amounts
  284. CGridColumnsList listCol;
  285. listCol.clear();
  286. int columnNum = 11 + 1 + 1;//表格总列数 12个级别再加上前面的“分类”列和“宽度/um”列
  287. CGridColumnPtr pColumn;
  288. for (int i=0;i< columnNum;i++)
  289. {
  290. CString strName;
  291. CGridRowsList listRows;
  292. CGridRowPtr pRow;
  293. CString strWidthName1, strWidthName2, strWidthName3;
  294. switch( i)
  295. {
  296. case 0:
  297. pColumn = CGridColumnPtr(new CGridColumn());
  298. //strName = MultiLang::GetInstance ().GetCStringByKey (GBStr1);
  299. strName = "Class";
  300. pColumn->SetName(strName);
  301. pRow = CGridRowPtr(new CGridRow());
  302. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  303. pRow->SetStringValue("Thin"); //MultiLang::GetInstance().GetCStringByKey(GBStr2)
  304. listRows.push_back(pRow);
  305. pRow = CGridRowPtr(new CGridRow());
  306. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  307. pRow->SetStringValue("Thick"); //MultiLang::GetInstance().GetCStringByKey(GBStr3)
  308. listRows.push_back(pRow);
  309. pRow = CGridRowPtr(new CGridRow());
  310. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  311. pRow->SetStringValue("OverSize"); //MultiLang::GetInstance().GetCStringByKey(GBStr4)
  312. listRows.push_back(pRow);
  313. pColumn->SetGridRowsList(listRows);
  314. listCol.push_back(pColumn);
  315. break;
  316. case 1:
  317. pColumn = CGridColumnPtr(new CGridColumn());
  318. strName = "Width/um"; //MultiLang::GetInstance().GetCStringByKey(GBStr5);
  319. pColumn->SetName(strName);
  320. if (GridType == "A")
  321. {
  322. strWidthName1 = "2.0~4.0";
  323. strWidthName2 = "4.0~12.0";
  324. strWidthName3 = ">12.0";
  325. }
  326. if (GridType == "B")
  327. {
  328. strWidthName1 = "2.0~9.0";
  329. strWidthName2 = "9.0~15.0";
  330. strWidthName3 = ">15.0";
  331. }
  332. if (GridType == "C")
  333. {
  334. strWidthName1 = "2.0~5.0";
  335. strWidthName2 = "5.0~12.0";
  336. strWidthName3 = ">12.0";
  337. }
  338. if (GridType == "D")
  339. {
  340. strWidthName1 = "2.0~8.0";
  341. strWidthName2 = "8.0~13.0";
  342. strWidthName3 = ">13.0";
  343. }
  344. if (GridType == "DSulfide")
  345. {
  346. strWidthName1 = "2.0~8.0";
  347. strWidthName2 = "8.0~13.0";
  348. strWidthName3 = ">13.0";
  349. }
  350. pRow = CGridRowPtr(new CGridRow());
  351. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  352. pRow->SetStringValue(strWidthName1);
  353. listRows.push_back(pRow);
  354. pRow = CGridRowPtr(new CGridRow());
  355. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  356. pRow->SetStringValue(strWidthName2);
  357. listRows.push_back(pRow);
  358. pRow = CGridRowPtr(new CGridRow());
  359. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  360. pRow->SetStringValue(strWidthName3);
  361. listRows.push_back(pRow);
  362. pColumn->SetGridRowsList(listRows);
  363. listCol.push_back(pColumn);
  364. break;
  365. default:
  366. pColumn = CGridColumnPtr(new CGridColumn());
  367. CString name;
  368. name.Format(_T("%.1f"), (i - 2) / 2.0);//i=2 输出0 i=3 输出0.5 i=4 输出1 以此类推
  369. pColumn->SetName(name);
  370. CGridRowsList listRows;
  371. pRow = CGridRowPtr(new CGridRow());
  372. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  373. pRow->SetIntValue(a_nLevel[i - 2].nFldNum);
  374. listRows.push_back(pRow);
  375. pRow = CGridRowPtr(new CGridRow());
  376. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  377. pRow->SetIntValue(a_nLevel_w[i - 2].nFldNum);
  378. listRows.push_back(pRow);
  379. pRow = CGridRowPtr(new CGridRow());
  380. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  381. pRow->SetIntValue(a_nLevel_s[i - 2].nFldNum);
  382. listRows.push_back(pRow);
  383. pColumn->SetGridRowsList(listRows);
  384. listCol.push_back(pColumn);
  385. break;
  386. }
  387. }
  388. pGridData->SetGridColumnList(listCol);
  389. return pGridData;
  390. }
  391. CGridDataPtr CGBCalculate::GetGridDSLevel(CGBGradeData* gradeData)
  392. {
  393. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  394. std::vector<CString> listDataSource;
  395. listDataSource.clear();
  396. listDataSource = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceList();
  397. pGridData->SetDataSourceList(listDataSource);
  398. int nDataSourceId = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceId();
  399. pGridData->SetDataSourceId(nDataSourceId);
  400. //amounts
  401. CGridColumnsList listCol;
  402. listCol.clear();
  403. int columnNum = 6;
  404. CGridColumnPtr pColumn;
  405. for (int i = 0; i < columnNum; i++)
  406. {
  407. CString strName;
  408. CGridRowsList listRows[6];
  409. CGridRowPtr pRow;
  410. CString strWidthName1, strWidthName2, strWidthName3;
  411. switch (i)
  412. {
  413. case 0:
  414. pColumn = CGridColumnPtr(new CGridColumn());
  415. strName = "No.";
  416. pColumn->SetName(strName);
  417. pColumn->SetGridRowsList(listRows[0]);
  418. listCol.push_back(pColumn);
  419. break;
  420. case 1:
  421. pColumn = CGridColumnPtr(new CGridColumn());
  422. strName = "Area/um2";
  423. pColumn->SetName(strName);
  424. pColumn->SetGridRowsList(listRows[1]);
  425. listCol.push_back(pColumn);
  426. break;
  427. case 2:
  428. pColumn = CGridColumnPtr(new CGridColumn());
  429. strName = "MaxFeret/um";
  430. pColumn->SetName(strName);
  431. pColumn->SetGridRowsList(listRows[2]);
  432. listCol.push_back(pColumn);
  433. break;
  434. case 3:
  435. pColumn = CGridColumnPtr(new CGridColumn());
  436. strName = "X/um";
  437. pColumn->SetName(strName);
  438. pColumn->SetGridRowsList(listRows[3]);
  439. listCol.push_back(pColumn);
  440. break;
  441. case 4:
  442. pColumn = CGridColumnPtr(new CGridColumn());
  443. strName = "Y/um";
  444. pColumn->SetName(strName);
  445. pColumn->SetGridRowsList(listRows[4]);
  446. listCol.push_back(pColumn);
  447. break;
  448. case 5:
  449. pColumn = CGridColumnPtr(new CGridColumn());
  450. strName = "Grade";
  451. pColumn->SetName(strName);
  452. pColumn->SetGridRowsList(listRows[5]);
  453. listCol.push_back(pColumn);
  454. break;
  455. }
  456. }
  457. for (auto part : gradeData->allDSParts)
  458. {
  459. DisplayDSPartRow(part, listCol);
  460. }
  461. pGridData->SetGridColumnList(listCol);
  462. return pGridData;
  463. }
  464. //get grid with level ABCD
  465. CGridDataPtr CGBCalculate::GetGridDIN(COTSParticleList cotsparticlelistA, set<COTSParticlePtr> cotsparticlelistB, COTSParticleList cotsparticlelistC, COTSParticleList cotsparticlelistD)
  466. {
  467. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  468. std::vector<CString> listDataSource;
  469. listDataSource.clear();
  470. listDataSource = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceList();
  471. pGridData->SetDataSourceList(listDataSource);
  472. int nDataSourceId = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceId();
  473. pGridData->SetDataSourceId(nDataSourceId);
  474. //amounts
  475. CGridColumnsList listCol;
  476. listCol.clear();
  477. int columnNum = 12;//表格总列数 11个级别再加上前面的“分类”列
  478. CGridColumnPtr pColumn;
  479. int levA[9] = { 0,0,0,0,0,0,0,0,0 };
  480. int levB[9] = { 0,0,0,0,0,0,0,0,0 };
  481. int levC[9] = { 0,0,0,0,0,0,0,0,0 };
  482. int levD[9] = { 0,0,0,0,0,0,0,0,0 };
  483. double fg[9] = { 0.05,0.1,0.2,0.5,1,2,5,10,20 };
  484. //指数
  485. double ka = 0, kb = 0, kc = 0, kd = 0;
  486. //统计不同大小颗粒出现次数
  487. for (auto pParticle : cotsparticlelistA)
  488. {
  489. double area = pParticle->GetActualArea();
  490. for (int i = 0; i < 8; i++)
  491. {
  492. if (area >= fg[i] && area < fg[i + 1])
  493. {
  494. levA[i] += 1;
  495. ka = ka + fg[i];
  496. }
  497. }
  498. if (area >= fg[8])
  499. {
  500. levA[8] += 1;
  501. ka = ka + fg[8];
  502. }
  503. }
  504. for (auto pParticle : cotsparticlelistB)
  505. {
  506. double area = pParticle->GetActualArea();
  507. for (int i = 0; i < 8; i++)
  508. {
  509. if (area >= fg[i] && area < fg[i + 1])
  510. {
  511. levB[i] += 1;
  512. kb = kb + fg[i];
  513. }
  514. }
  515. if (area >= fg[8])
  516. {
  517. levB[8] += 1;
  518. kb = kb + fg[8];
  519. }
  520. }
  521. for (auto pParticle : cotsparticlelistC)
  522. {
  523. double area = pParticle->GetActualArea();
  524. for (int i = 0; i < 8; i++)
  525. {
  526. if (area >= fg[i] && area < fg[i + 1])
  527. {
  528. levC[i] += 1;
  529. kc = kc + fg[i];
  530. }
  531. }
  532. if (area >= fg[8])
  533. {
  534. levC[8] += 1;
  535. kc = kc + fg[8];
  536. }
  537. }
  538. for (auto pParticle : cotsparticlelistD)
  539. {
  540. double area = pParticle->GetActualArea();
  541. for (int i = 0; i < 8; i++)
  542. {
  543. if (area >= fg[i] && area < fg[i + 1])
  544. {
  545. levD[i] += 1;
  546. kd = kd + fg[i];
  547. }
  548. }
  549. if (area >= fg[8])
  550. {
  551. levD[8] += 1;
  552. kd = kd + fg[8];
  553. }
  554. }
  555. double to = kb + kc + kd;
  556. for (int i = 0; i < columnNum; i++)
  557. {
  558. CString strName;
  559. CGridRowsList listRows;
  560. CGridRowPtr pRow;
  561. CString strWidthName1, strWidthName2, strWidthName3, strWidthName4;
  562. switch (i)
  563. {
  564. case 0:
  565. pColumn = CGridColumnPtr(new CGridColumn());
  566. strName = "Class";
  567. pColumn->SetName(strName);
  568. pRow = CGridRowPtr(new CGridRow());
  569. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  570. pRow->SetStringValue("SS");
  571. listRows.push_back(pRow);
  572. pRow = CGridRowPtr(new CGridRow());
  573. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  574. pRow->SetStringValue("OA");
  575. listRows.push_back(pRow);
  576. pRow = CGridRowPtr(new CGridRow());
  577. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  578. pRow->SetStringValue("OS");
  579. listRows.push_back(pRow);
  580. pRow = CGridRowPtr(new CGridRow());
  581. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  582. pRow->SetStringValue("OG");
  583. listRows.push_back(pRow);
  584. pColumn->SetGridRowsList(listRows);
  585. listCol.push_back(pColumn);
  586. break;
  587. case 10:
  588. pColumn = CGridColumnPtr(new CGridColumn());
  589. strName = "S";
  590. pColumn->SetName(strName);
  591. strWidthName1.Format(_T("%lf"), ka);
  592. strWidthName2 = "";
  593. strWidthName3 = "";
  594. strWidthName4 = "";
  595. pRow = CGridRowPtr(new CGridRow());
  596. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  597. pRow->SetDoubleValue(ka);
  598. listRows.push_back(pRow);
  599. pRow = CGridRowPtr(new CGridRow());
  600. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  601. pRow->SetDoubleValue(0);
  602. listRows.push_back(pRow);
  603. pRow = CGridRowPtr(new CGridRow());
  604. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  605. pRow->SetDoubleValue(0);
  606. listRows.push_back(pRow);
  607. pRow = CGridRowPtr(new CGridRow());
  608. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  609. pRow->SetDoubleValue(0);
  610. listRows.push_back(pRow);
  611. pColumn->SetGridRowsList(listRows);
  612. listCol.push_back(pColumn);
  613. break;
  614. case 11:
  615. pColumn = CGridColumnPtr(new CGridColumn());
  616. strName = "O";
  617. pColumn->SetName(strName);
  618. strWidthName1.Format(_T("%lf"), to);
  619. strWidthName2 = "";
  620. strWidthName3 = "";
  621. strWidthName4 = "";
  622. pRow = CGridRowPtr(new CGridRow());
  623. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  624. pRow->SetDoubleValue(0);
  625. listRows.push_back(pRow);
  626. pRow = CGridRowPtr(new CGridRow());
  627. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  628. pRow->SetDoubleValue(kb);
  629. listRows.push_back(pRow);
  630. pRow = CGridRowPtr(new CGridRow());
  631. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  632. pRow->SetDoubleValue(kc);
  633. listRows.push_back(pRow);
  634. pRow = CGridRowPtr(new CGridRow());
  635. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  636. pRow->SetDoubleValue(kd);
  637. listRows.push_back(pRow);
  638. pColumn->SetGridRowsList(listRows);
  639. listCol.push_back(pColumn);
  640. break;
  641. default:
  642. pColumn = CGridColumnPtr(new CGridColumn());
  643. strName.Format("%d", i - 1);
  644. pColumn->SetName(strName);
  645. CGridRowsList listRows;
  646. pRow = CGridRowPtr(new CGridRow());
  647. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  648. pRow->SetIntValue(levA[i - 1]);
  649. listRows.push_back(pRow);
  650. pRow = CGridRowPtr(new CGridRow());
  651. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  652. pRow->SetIntValue(levB[i - 1]);
  653. listRows.push_back(pRow);
  654. pRow = CGridRowPtr(new CGridRow());
  655. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  656. pRow->SetIntValue(levC[i - 1]);
  657. listRows.push_back(pRow);
  658. pRow = CGridRowPtr(new CGridRow());
  659. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  660. pRow->SetIntValue(levD[i - 1]);
  661. listRows.push_back(pRow);
  662. pColumn->SetGridRowsList(listRows);
  663. listCol.push_back(pColumn);
  664. break;
  665. }
  666. }
  667. pGridData->SetGridColumnList(listCol);
  668. return pGridData;
  669. }
  670. void CGBCalculate::SetFrameLevelNo(GB_GRADE_TYPE a_level, int a_nLevel[])
  671. {
  672. a_nLevel[(int)a_level] += 1;
  673. }
  674. // calculate GB fields
  675. CGBFieldList CGBCalculate::CalGBFields(CSmplMsrResultFileMgrPtr pSmplMgr, GB_METHODE_TYPE calType)
  676. {
  677. CGBFieldList m_listGBFields;
  678. m_listGBFields.clear();
  679. ASSERT(pSmplMgr);
  680. CSmplMsrResultFilePtr pSmplMsrResultFile = pSmplMgr->GetSmplMsrResultFile();
  681. ASSERT(pSmplMsrResultFile);
  682. COTSSamplePtr pOTSSample = pSmplMsrResultFile->GetSample();
  683. ASSERT(pOTSSample);
  684. CSEMDataMsrPtr pEMDataMsrPtr = pOTSSample->GetSEMDataMsr();
  685. ASSERT(pEMDataMsrPtr);
  686. // get field width
  687. int nOTSFieldWidth = pEMDataMsrPtr->GetScanFieldSize();
  688. int nOTSFieldHeight = pEMDataMsrPtr->GetScanFieldHeight();
  689. if (nOTSFieldWidth == 0 || nOTSFieldHeight==0)
  690. {
  691. LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: field width is zero ."));
  692. return m_listGBFields;
  693. }
  694. // scan parameters
  695. CMsrParamsPtr pMsrParam = pOTSSample->GetMsrParams();
  696. //CMsrParamsPtr pMsrParam = pOTSSample->get
  697. COTSImageScanParamPtr pImgScanParam = pMsrParam->GetImageScanParam();
  698. CSize sizePixelImage = pImgScanParam->GetImageResolution();
  699. //use OTSField width cal the OTSField height
  700. //get OTSfilds list
  701. COTSFieldDataList allOTSFields;
  702. allOTSFields = pSmplMsrResultFile->GetFieldData();
  703. // convert ots fields to gb fields
  704. if (!OTSFieldToGBField( allOTSFields, &m_listGBFields, sizePixelImage, nOTSFieldWidth, nOTSFieldHeight))
  705. {
  706. LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: call OTSFieldToGBField failed."));
  707. return m_listGBFields;
  708. }
  709. for (auto fld : m_listGBFields)
  710. {
  711. fld->SetCalcuType(calType);
  712. }
  713. return m_listGBFields;
  714. }
  715. // Turn OTSField to GBField
  716. BOOL CGBCalculate::OTSFieldToGBField(COTSFieldDataList allOTSFields, CGBFieldList* m_listGBFields,CSize sizePixelImage,int nOTSFieldWidth,int nOTSFieldHeight)
  717. {
  718. if (allOTSFields.empty())
  719. {
  720. LogTrace(__FILE__, __LINE__, _T("CalGBFields: listOTSFields is empty ."));
  721. return TRUE;
  722. }
  723. // get topleft point and bottomright point of the measurement convered area
  724. CPoint pointTopleft, pointBottomright;
  725. pointTopleft = pointBottomright = allOTSFields[0]->GetPosition();
  726. //判断有效区域
  727. for (unsigned int i = 0; i< allOTSFields.size(); i++)
  728. {
  729. //get current OTSField Position,the position is in the center of the field
  730. CPoint poiOTSFieldPosition = allOTSFields[i]->GetPosition();
  731. pointTopleft.x = min(poiOTSFieldPosition.x, pointTopleft.x);
  732. pointTopleft.y = max(poiOTSFieldPosition.y, pointTopleft.y);
  733. pointBottomright.x = max(poiOTSFieldPosition.x, pointBottomright.x);
  734. pointBottomright.y = min(poiOTSFieldPosition.y, pointBottomright.y);
  735. }
  736. pointTopleft.x -= nOTSFieldWidth / 2;
  737. pointTopleft.y += nOTSFieldHeight / 2;
  738. pointBottomright.x+= nOTSFieldWidth / 2;
  739. pointBottomright.y-= nOTSFieldHeight / 2;
  740. double totalWidth = pointBottomright.x - pointTopleft.x;
  741. double totalHeight = pointTopleft.y - pointBottomright.y;
  742. int nPossibleGBFieldRowNum = totalHeight /GB_FIELD_WIDTH+0.5;//可能有的国标field行数
  743. int nPossibleGBFieldColNum = totalWidth / GB_FIELD_WIDTH+0.5;//列数
  744. //get possible OTSFields
  745. m_listGBFields->clear();
  746. CPoint pointGBFieldPosition;
  747. for (int i = 0; i < nPossibleGBFieldRowNum; i++)
  748. {
  749. for (int j = 0; j < nPossibleGBFieldColNum; j++)
  750. {
  751. // cal GB field rectangle
  752. CPoint poiCurGBFieldTopLeft, poiCurGBFieldBottomRight;
  753. poiCurGBFieldTopLeft = pointTopleft;
  754. //获得左上角的坐标
  755. poiCurGBFieldTopLeft.x += j * GB_FIELD_WIDTH;
  756. poiCurGBFieldTopLeft.y -= i * GB_FIELD_WIDTH;
  757. //获得右下角的坐标
  758. poiCurGBFieldBottomRight.x = poiCurGBFieldTopLeft.x + GB_FIELD_WIDTH;
  759. poiCurGBFieldBottomRight.y = poiCurGBFieldTopLeft.y - GB_FIELD_WIDTH;
  760. COTSRect rectGBField(poiCurGBFieldTopLeft, poiCurGBFieldBottomRight);
  761. CGBFieldDataPtr pGBFieldData;
  762. pGBFieldData = GetOneGBField(rectGBField, allOTSFields, sizePixelImage, nOTSFieldWidth, nOTSFieldHeight);
  763. if (!pGBFieldData)
  764. {
  765. continue;
  766. }
  767. CPoint poiNewPosition=rectGBField.GetCenterPoint();
  768. pGBFieldData->SetPosition(poiNewPosition);
  769. // add the GBField into the GBFields list
  770. m_listGBFields->push_back(pGBFieldData);
  771. }
  772. }
  773. // ok, return TRUE
  774. return TRUE;
  775. }
  776. // Custom collation rules
  777. BOOL comp(const COTSFieldDataPtr &a, const COTSFieldDataPtr &b)
  778. {
  779. if (a->GetPosition().y <= b->GetPosition().y)
  780. {
  781. if (a->GetPosition().y == b->GetPosition().y)
  782. {
  783. if (a->GetPosition().x < b->GetPosition().x)
  784. {
  785. return TRUE;
  786. }
  787. }
  788. else {
  789. return TRUE;
  790. }
  791. }
  792. return FALSE;
  793. }
  794. // get the GB field within a rectangle
  795. CGBFieldDataPtr CGBCalculate::GetOneGBField(COTSRect a_rectGBField,
  796. COTSFieldDataList& allOTSFields,
  797. CSize a_sizePixelImage,
  798. int nOTSFieldWidth, int nOTSFieldHeight)
  799. {
  800. // GB Field handle
  801. CGBFieldDataPtr pGBFieldData = nullptr;
  802. // get OTS fields within the rectangle
  803. COTSFieldDataList myOTSFields;
  804. myOTSFields.clear();
  805. COTSFieldDataList::iterator itr = allOTSFields.begin();
  806. while (itr != allOTSFields.end())
  807. {
  808. // get an OTS field
  809. CPoint poiOTSField = (*itr)->GetPosition();
  810. COTSRect fldRec = COTSRect(poiOTSField.x - nOTSFieldWidth / 2, poiOTSField.y + nOTSFieldHeight / 2, poiOTSField.x + nOTSFieldWidth / 2, poiOTSField.y - nOTSFieldHeight / 2);
  811. if (a_rectGBField.IntersectOtherRect( fldRec))
  812. {
  813. (*itr)->SetRect(fldRec);
  814. myOTSFields.push_back(*itr);
  815. itr++;
  816. continue;
  817. }
  818. itr++;
  819. }
  820. pGBFieldData = NormalizeParticlesAndIdentifyChemicalType(a_rectGBField, myOTSFields, a_sizePixelImage, nOTSFieldWidth, nOTSFieldHeight);
  821. pGBFieldData->myReleventOTSFlds = myOTSFields;
  822. return pGBFieldData;
  823. }
  824. // normalize particles for the GBFields
  825. CGBFieldDataPtr CGBCalculate::NormalizeParticlesAndIdentifyChemicalType(COTSRect a_rectGBField, COTSFieldDataList myOTSFields, CSize a_sizePixelImage, int nFieldWidth,int nFieldHeight)
  826. {
  827. // inits
  828. CGBFieldDataPtr pGBFieldData(new CGBFieldData);
  829. pGBFieldData->SetMyRect(a_rectGBField);
  830. COTSParticleList listNormalizedParticles;
  831. CPoint pointGBFieldRectTopLeft = a_rectGBField.GetTopLeft();
  832. COTSRect GBRect = a_rectGBField;
  833. int nBeforeCalNo = 0;
  834. int nAfterCalNo = 0;
  835. for (auto OTSField : myOTSFields)
  836. {
  837. for (auto part : OTSField->GetParticleList())
  838. {
  839. CPoint fieldPos = OTSField->GetPosition();
  840. CPoint fieldTopLeft = OTSField->GetRect().GetTopLeft();
  841. double fwidth = nFieldWidth;
  842. double pixelsize = fwidth / a_sizePixelImage.cx;
  843. CPoint xrayPosInFieldByPixel= part->GetXRayPos();
  844. CPoint partPos = CPoint(fieldTopLeft.x + xrayPosInFieldByPixel.x * pixelsize, fieldTopLeft.y - xrayPosInFieldByPixel.y * pixelsize);
  845. if (GBRect.PointInRect(partPos))
  846. {
  847. CRect rectInSinglefld = part->GetParticleRect();
  848. CPoint OTSLeftTop = CPoint(fieldTopLeft.x + rectInSinglefld.left * pixelsize, fieldTopLeft.y - rectInSinglefld.top * pixelsize);
  849. CPoint OTSRightBottom = CPoint(fieldTopLeft.x + rectInSinglefld.right * pixelsize, fieldTopLeft.y - rectInSinglefld.bottom * pixelsize);
  850. COTSRect recInOTSCord = COTSRect(OTSLeftTop, OTSRightBottom);
  851. part->SetOTSRect(recInOTSCord);
  852. pGBFieldData->IdentifyPartChemicalType(part);
  853. listNormalizedParticles.push_back(part);
  854. }
  855. }
  856. }
  857. // put new particle in the GB Field
  858. pGBFieldData->SetParticleList(listNormalizedParticles);
  859. return pGBFieldData;
  860. }
  861. void CGBCalculate::SetPixSize(double p)
  862. {
  863. PixSize = p;
  864. }
  865. void CGBCalculate::DisplayDSPartRow(COTSParticlePtr part, CGridColumnsList listCol)
  866. {
  867. int columnNum = 6;
  868. CGridColumnPtr pColumn;
  869. for (int i = 0; i < columnNum; i++)
  870. {
  871. CString strName;
  872. CGridRowsList listRows;
  873. CGridRowPtr pRow;
  874. CString strWidthName1, strWidthName2, strWidthName3;
  875. CString idstr;
  876. int fldid;
  877. int partId;
  878. switch (i)
  879. {
  880. case 0:
  881. pColumn = listCol.at(0);
  882. pRow = CGridRowPtr(new CGridRow());
  883. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  884. fldid = part->GetFieldId();
  885. partId = part->GetParticleId();
  886. idstr.Format("%d_%d", fldid, partId);
  887. pRow->SetStringValue(idstr);
  888. pColumn->AddGridRow(pRow);
  889. break;
  890. case 1:
  891. pColumn = listCol.at(1);
  892. pRow = CGridRowPtr(new CGridRow());
  893. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  894. pRow->SetIntValue(part->GetActualArea());
  895. pColumn->AddGridRow(pRow);
  896. break;
  897. case 2:
  898. pColumn = listCol.at(2);
  899. pRow = CGridRowPtr(new CGridRow());
  900. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  901. pRow->SetDoubleValue(part->GetFeretDiameter());
  902. pColumn->AddGridRow(pRow);
  903. break;
  904. case 3:
  905. pColumn = listCol.at(3);
  906. pRow = CGridRowPtr(new CGridRow());
  907. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  908. pRow->SetDoubleValue(part->GetAbsolutPos().x);
  909. pColumn->AddGridRow(pRow);
  910. break;
  911. case 4:
  912. pColumn = listCol.at(4);
  913. pRow = CGridRowPtr(new CGridRow());
  914. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  915. pRow->SetDoubleValue(part->GetAbsolutPos().y);
  916. pColumn->AddGridRow(pRow);
  917. break;
  918. case 5:
  919. pColumn = listCol.at(5);
  920. pRow = CGridRowPtr(new CGridRow());
  921. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  922. pRow->SetStringValue(OTSGBCalculate::GetDSGrade(part->GetFeretDiameter()));
  923. pColumn->AddGridRow(pRow);
  924. break;
  925. }
  926. }
  927. }
  928. }