CGBCalculate.cpp 41 KB

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