CGBCalculate.cpp 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148
  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. COTSParticleList cotsparticlelistA;
  262. set<COTSParticlePtr> cotsparticlelistB;
  263. COTSParticleList cotsparticlelistC;
  264. COTSParticleList cotsparticlelistD;
  265. cotsparticlelistA = DINFld->listAThinParticles;
  266. cotsparticlelistB = DINFld->listBThinParticles;
  267. cotsparticlelistC = DINFld->listCThinParticles;
  268. cotsparticlelistD = DINFld->listDThinParticles;
  269. CGridDataPtr AGrid;
  270. AGrid = GetGridDIN(cotsparticlelistA, cotsparticlelistB, cotsparticlelistC, cotsparticlelistD);
  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(COTSParticleList cotsparticlelistA, set<COTSParticlePtr> cotsparticlelistB, COTSParticleList cotsparticlelistC, COTSParticleList 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. // get field width
  688. int nOTSFieldWidth = pEMDataMsrPtr->GetScanFieldSize();
  689. int nOTSFieldHeight = pEMDataMsrPtr->GetScanFieldHeight();
  690. if (nOTSFieldWidth == 0 || nOTSFieldHeight==0)
  691. {
  692. LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: field width is zero ."));
  693. return m_listGBFields;
  694. }
  695. // scan parameters
  696. CMsrParamsPtr pMsrParam = pOTSSample->GetMsrParams();
  697. //CMsrParamsPtr pMsrParam = pOTSSample->get
  698. COTSImageScanParamPtr pImgScanParam = pMsrParam->GetImageScanParam();
  699. CSize sizePixelImage = pImgScanParam->GetImageResolution();
  700. //use OTSField width cal the OTSField height
  701. //get OTSfilds list
  702. COTSFieldDataList allOTSFields;
  703. allOTSFields = pSmplMsrResultFile->GetFieldData();
  704. // convert ots fields to gb fields
  705. if (!OTSFieldToGBField( allOTSFields, &m_listGBFields, sizePixelImage, nOTSFieldWidth, nOTSFieldHeight))
  706. {
  707. LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: call OTSFieldToGBField failed."));
  708. return m_listGBFields;
  709. }
  710. for (auto fld : m_listGBFields)
  711. {
  712. fld->SetCalcuType(calType);
  713. }
  714. return m_listGBFields;
  715. }
  716. // Turn OTSField to GBField
  717. BOOL CGBCalculate::OTSFieldToGBField(COTSFieldDataList allOTSFields, CGBFieldList* m_listGBFields,CSize sizePixelImage,int nOTSFieldWidth,int nOTSFieldHeight)
  718. {
  719. if (allOTSFields.empty())
  720. {
  721. LogTrace(__FILE__, __LINE__, _T("CalGBFields: listOTSFields is empty ."));
  722. return TRUE;
  723. }
  724. // get topleft point and bottomright point of the measurement convered area
  725. CPoint pointTopleft, pointBottomright;
  726. pointTopleft = pointBottomright = allOTSFields[0]->GetPosition();
  727. //判断有效区域
  728. for (unsigned int i = 0; i< allOTSFields.size(); i++)
  729. {
  730. //get current OTSField Position,the position is in the center of the field
  731. CPoint poiOTSFieldPosition = allOTSFields[i]->GetPosition();
  732. pointTopleft.x = min(poiOTSFieldPosition.x, pointTopleft.x);
  733. pointTopleft.y = max(poiOTSFieldPosition.y, pointTopleft.y);
  734. pointBottomright.x = max(poiOTSFieldPosition.x, pointBottomright.x);
  735. pointBottomright.y = min(poiOTSFieldPosition.y, pointBottomright.y);
  736. }
  737. pointTopleft.x -= nOTSFieldWidth / 2;
  738. pointTopleft.y += nOTSFieldHeight / 2;
  739. pointBottomright.x+= nOTSFieldWidth / 2;
  740. pointBottomright.y-= nOTSFieldHeight / 2;
  741. double totalWidth = pointBottomright.x - pointTopleft.x;
  742. double totalHeight = pointTopleft.y - pointBottomright.y;
  743. int nPossibleGBFieldRowNum = totalHeight /GB_FIELD_WIDTH+0.5;//可能有的国标field行数
  744. int nPossibleGBFieldColNum = totalWidth / GB_FIELD_WIDTH+0.5;//列数
  745. //get possible OTSFields
  746. m_listGBFields->clear();
  747. CPoint pointGBFieldPosition;
  748. for (int i = 0; i < nPossibleGBFieldRowNum; i++)
  749. {
  750. for (int j = 0; j < nPossibleGBFieldColNum; j++)
  751. {
  752. // cal GB field rectangle
  753. CPoint poiCurGBFieldTopLeft, poiCurGBFieldBottomRight;
  754. poiCurGBFieldTopLeft = pointTopleft;
  755. //获得左上角的坐标
  756. poiCurGBFieldTopLeft.x += j * GB_FIELD_WIDTH;
  757. poiCurGBFieldTopLeft.y -= i * GB_FIELD_WIDTH;
  758. //获得右下角的坐标
  759. poiCurGBFieldBottomRight.x = poiCurGBFieldTopLeft.x + GB_FIELD_WIDTH;
  760. poiCurGBFieldBottomRight.y = poiCurGBFieldTopLeft.y - GB_FIELD_WIDTH;
  761. COTSRect rectGBField(poiCurGBFieldTopLeft, poiCurGBFieldBottomRight);
  762. CGBFieldDataPtr pGBFieldData;
  763. pGBFieldData = GetOneGBField(rectGBField, allOTSFields, sizePixelImage, nOTSFieldWidth, nOTSFieldHeight);
  764. if (!pGBFieldData)
  765. {
  766. continue;
  767. }
  768. CPoint poiNewPosition=rectGBField.GetCenterPoint();
  769. pGBFieldData->SetPosition(poiNewPosition);
  770. // add the GBField into the GBFields list
  771. m_listGBFields->push_back(pGBFieldData);
  772. }
  773. }
  774. // ok, return TRUE
  775. return TRUE;
  776. }
  777. // Custom collation rules
  778. BOOL comp(const COTSFieldDataPtr &a, const COTSFieldDataPtr &b)
  779. {
  780. if (a->GetPosition().y <= b->GetPosition().y)
  781. {
  782. if (a->GetPosition().y == b->GetPosition().y)
  783. {
  784. if (a->GetPosition().x < b->GetPosition().x)
  785. {
  786. return TRUE;
  787. }
  788. }
  789. else {
  790. return TRUE;
  791. }
  792. }
  793. return FALSE;
  794. }
  795. // get the GB field within a rectangle
  796. CGBFieldDataPtr CGBCalculate::GetOneGBField(COTSRect a_rectGBField,
  797. COTSFieldDataList& allOTSFields,
  798. CSize a_sizePixelImage,
  799. int nOTSFieldWidth, int nOTSFieldHeight)
  800. {
  801. // GB Field handle
  802. CGBFieldDataPtr pGBFieldData = nullptr;
  803. // get OTS fields within the rectangle
  804. COTSFieldDataList myOTSFields;
  805. myOTSFields.clear();
  806. COTSFieldDataList::iterator itr = allOTSFields.begin();
  807. while (itr != allOTSFields.end())
  808. {
  809. // get an OTS field
  810. CPoint poiOTSField = (*itr)->GetPosition();
  811. COTSRect fldRec = COTSRect(poiOTSField.x - nOTSFieldWidth / 2, poiOTSField.y + nOTSFieldHeight / 2, poiOTSField.x + nOTSFieldWidth / 2, poiOTSField.y - nOTSFieldHeight / 2);
  812. if (a_rectGBField.IntersectOtherRect( fldRec))
  813. {
  814. (*itr)->SetOTSRect(fldRec);
  815. myOTSFields.push_back(*itr);
  816. itr++;
  817. continue;
  818. }
  819. itr++;
  820. }
  821. pGBFieldData = NormalizeParticlesAndIdentifyChemicalType(a_rectGBField, myOTSFields, a_sizePixelImage, nOTSFieldWidth, nOTSFieldHeight);
  822. pGBFieldData->myReleventOTSFlds = myOTSFields;
  823. return pGBFieldData;
  824. }
  825. // normalize particles for the GBFields
  826. CGBFieldDataPtr CGBCalculate::NormalizeParticlesAndIdentifyChemicalType(COTSRect a_rectGBField, COTSFieldDataList myOTSFields, CSize a_sizePixelImage, int nFieldWidth,int nFieldHeight)
  827. {
  828. // inits
  829. CGBFieldDataPtr pGBFieldData(new CGBFieldData);
  830. pGBFieldData->SetMyRect(a_rectGBField);
  831. COTSParticleList listNormalizedParticles;
  832. CPoint pointGBFieldRectTopLeft = a_rectGBField.GetTopLeft();
  833. COTSRect GBRect = a_rectGBField;
  834. int nBeforeCalNo = 0;
  835. int nAfterCalNo = 0;
  836. for (auto OTSField : myOTSFields)
  837. {
  838. auto fldParts = OTSField->GetParticleList();
  839. for (auto part : fldParts)
  840. {
  841. CPoint fieldPos = OTSField->GetPosition();
  842. CPoint fieldTopLeft = OTSField->GetOTSRect().GetTopLeft();
  843. double fwidth = nFieldWidth;
  844. double pixelsize = fwidth / a_sizePixelImage.cx;
  845. CPoint xrayPosInFieldByPixel= part->GetXRayPos();
  846. CPoint partPos = CPoint(fieldTopLeft.x + xrayPosInFieldByPixel.x * pixelsize, fieldTopLeft.y - xrayPosInFieldByPixel.y * pixelsize);
  847. if (GBRect.PointInRect(partPos))
  848. {
  849. CRect rectInSinglefld = part->GetParticleRect();
  850. CPoint OTSLeftTop = CPoint(fieldTopLeft.x + rectInSinglefld.left * pixelsize, fieldTopLeft.y - rectInSinglefld.top * pixelsize);
  851. CPoint OTSRightBottom = CPoint(fieldTopLeft.x + rectInSinglefld.right * pixelsize, fieldTopLeft.y - rectInSinglefld.bottom * pixelsize);
  852. COTSRect recInOTSCord = COTSRect(OTSLeftTop, OTSRightBottom);
  853. part->SetOTSRect(recInOTSCord);
  854. pGBFieldData->IdentifyPartChemicalType(part);
  855. listNormalizedParticles.push_back(part);
  856. }
  857. }
  858. }
  859. // put new particle in the GB Field
  860. pGBFieldData->SetParticleList(listNormalizedParticles);
  861. return pGBFieldData;
  862. }
  863. void CGBCalculate::SetPixSize(double p)
  864. {
  865. PixSize = p;
  866. }
  867. void CGBCalculate::DisplayDSPartRow(COTSParticlePtr part, CGridColumnsList listCol)
  868. {
  869. int columnNum = 6;
  870. CGridColumnPtr pColumn;
  871. for (int i = 0; i < columnNum; i++)
  872. {
  873. CString strName;
  874. CGridRowsList listRows;
  875. CGridRowPtr pRow;
  876. CString strWidthName1, strWidthName2, strWidthName3;
  877. CString idstr;
  878. int fldid;
  879. int partId;
  880. switch (i)
  881. {
  882. case 0:
  883. pColumn = listCol.at(0);
  884. pRow = CGridRowPtr(new CGridRow());
  885. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  886. fldid = part->GetFieldId();
  887. partId = part->GetParticleId();
  888. idstr.Format("%d_%d", fldid, partId);
  889. pRow->SetStringValue(idstr);
  890. pColumn->AddGridRow(pRow);
  891. break;
  892. case 1:
  893. pColumn = listCol.at(1);
  894. pRow = CGridRowPtr(new CGridRow());
  895. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  896. pRow->SetIntValue(part->GetActualArea());
  897. pColumn->AddGridRow(pRow);
  898. break;
  899. case 2:
  900. pColumn = listCol.at(2);
  901. pRow = CGridRowPtr(new CGridRow());
  902. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  903. pRow->SetDoubleValue(part->GetFeretDiameter());
  904. pColumn->AddGridRow(pRow);
  905. break;
  906. case 3:
  907. pColumn = listCol.at(3);
  908. pRow = CGridRowPtr(new CGridRow());
  909. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  910. pRow->SetDoubleValue(part->GetAbsolutPos().x);
  911. pColumn->AddGridRow(pRow);
  912. break;
  913. case 4:
  914. pColumn = listCol.at(4);
  915. pRow = CGridRowPtr(new CGridRow());
  916. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  917. pRow->SetDoubleValue(part->GetAbsolutPos().y);
  918. pColumn->AddGridRow(pRow);
  919. break;
  920. case 5:
  921. pColumn = listCol.at(5);
  922. pRow = CGridRowPtr(new CGridRow());
  923. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  924. pRow->SetStringValue(OTSGBCalculate::GetDSGrade(part->GetFeretDiameter()));
  925. pColumn->AddGridRow(pRow);
  926. break;
  927. }
  928. }
  929. }
  930. }