CGBCalculate.cpp 41 KB

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