CGBCalculate.cpp 32 KB

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