CGBCalculate.cpp 35 KB

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