CGBCalculate.cpp 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681
  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. namespace OTSGBCalculate
  9. {
  10. using namespace OTSDATA;
  11. using namespace OTSIMGPROC;
  12. CGBCalculate::CGBCalculate(CReportMgr* rptMgrPtr)
  13. {
  14. m_rptMgrPtr = rptMgrPtr;
  15. }
  16. CGBCalculate::~CGBCalculate()
  17. {
  18. }
  19. // class methods
  20. // public
  21. CGridDatasList CGBCalculate::GetGBInclusion()
  22. {
  23. // use the dll resource
  24. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  25. CGBFieldList listCGBField;
  26. //CGBFieldMgr pCGBFieldMgr;
  27. COTSParticleList listOTSParticle;
  28. COTSParticlePtr pOTSParticle;
  29. CGBImgPropCal pGBImgPropCal;
  30. CGridDatasList listGridData;
  31. listGridData.clear();
  32. CGridDatasList multGridList;
  33. multGridList.clear();
  34. // depart compound source name
  35. CPropParamPtr currentProp = m_rptMgrPtr->GetPropertyParamGrid();
  36. std::vector<CString> listDataSource = currentProp->GetDataSourceList();
  37. int nSelectedDataSourceIndex = currentProp->GetDataSourceId();
  38. CString sDataSourceNames = listDataSource[nSelectedDataSourceIndex];
  39. std::vector<CString> listSelectedDataSource = COTSHelper::SplitString(sDataSourceNames, _T("+"));
  40. for (auto strDataSourceName : listSelectedDataSource)
  41. {
  42. listCGBField.clear();
  43. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  44. // data source id
  45. std::vector<CString> listDataSource;
  46. listDataSource.clear();
  47. listDataSource = currentProp->GetDataSourceList();
  48. pGridData->SetDataSourceList(listDataSource);
  49. int nDataSourceId = currentProp->GetDataSourceId();
  50. pGridData->SetDataSourceId(nDataSourceId);
  51. CSmplMsrResultFileMgrPtr rstFileMgrPrt = m_rptMgrPtr->GetASmplMsrResultMgrByFileName(strDataSourceName);
  52. // sample measurment result file manager
  53. CSmplMsrResultFileMgr* pSmplMsrResultFileMgr;
  54. pSmplMsrResultFileMgr = rstFileMgrPrt.get();
  55. CSmplMsrResultFilePtr pSmplMsrResultFile = pSmplMsrResultFileMgr->GetSmplMsrResultFile();
  56. COTSSamplePtr pSample = pSmplMsrResultFile->GetSample();
  57. double dPixelSize = pSample->GetPixelSize();
  58. SetPixSize(dPixelSize);
  59. CGBFieldList listRawGBFields=CalGBFields(pSmplMsrResultFileMgr);
  60. listCGBField = listRawGBFields;
  61. //for each (COTSFieldDataPtr GBfield in listRawGBFields)
  62. //{
  63. // listOTSParticle = GBfield->GetParticleList();
  64. // for each (COTSParticlePtr Particle in listOTSParticle)
  65. // {
  66. // double a_dPartFTD;
  67. // double a_dMinWidth;
  68. // double a_dMaxLength;
  69. // double a_dRatio;
  70. // /*pGBImgPropCal.GetParticleFTD(Particle, dPixelSize, a_dPartFTD, a_dMinWidth , a_dMaxLength, a_dRatio);
  71. //
  72. // Particle->SetFeretDiameter(a_dPartFTD);
  73. //
  74. // Particle->SetWidth(a_dMinWidth);
  75. // Particle->SetHeight(a_dMaxLength);*/
  76. // }
  77. // //cal stdFrame
  78. // CGBFieldDataPtr GBFld(new CGBFieldData());
  79. // GBFld->SetParticleList(listOTSParticle,TRUE);
  80. // GBFld->SetPosition(GBfield->GetPosition());
  81. //
  82. // listCGBField.push_back(GBFld);
  83. //}
  84. CALCULATE_TABLE_TYPE ty = m_rptMgrPtr->GetPropertyParamGrid()->GetCalTableType();
  85. if (ty == CALCULATE_TABLE_TYPE::DIN)
  86. {
  87. listGridData = this->GetGridDataListForOneDataSourceDIN(pSmplMsrResultFile->GetAllParticles(), ty);
  88. }
  89. else
  90. {
  91. listGridData = this->GetGridDataListForOneDataSource(listCGBField, ty);
  92. }
  93. multGridList.insert (multGridList.end (), listGridData.begin(), listGridData.end());
  94. }
  95. return multGridList;
  96. }
  97. CGridDatasList CGBCalculate::GetGridDataListForOneDataSource(CGBFieldList listCGBField, CALCULATE_TABLE_TYPE tableType)
  98. {
  99. CGridDatasList listGridData;
  100. //Definition numbers
  101. //use the nXLevel array to memory how many fields in each level.
  102. CONST int LEVEL_LENGTH = 11;
  103. 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 ;
  104. 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;
  105. int nALevel_s[LEVEL_LENGTH];
  106. 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;
  107. 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;
  108. int nBLevel_s[LEVEL_LENGTH];
  109. 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;
  110. 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;
  111. int nCLevel_s[LEVEL_LENGTH];
  112. 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;
  113. 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;
  114. int nDLevel_s[LEVEL_LENGTH];
  115. 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;
  116. 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;
  117. int nDSulfideLevel_s[LEVEL_LENGTH];
  118. CGBFieldList listDSFrame;
  119. //initlize
  120. for (int i = 0; i < LEVEL_LENGTH; i++)
  121. {
  122. nALevel[i]= 0;
  123. nALevel_w[i] = 0;
  124. nALevel_s[i] = 0;
  125. nBLevel[i]=0;
  126. nBLevel_w[i] = 0;
  127. nBLevel_s[i]=0;
  128. nCLevel[i]=0;
  129. nCLevel_w[i]=0;
  130. nCLevel_s[i]=0;
  131. nDLevel[i]=0;
  132. nDLevel_w[i]=0;
  133. nDLevel_s[i] = 0;
  134. nDSulfideLevel[i] = 0;
  135. nDSulfideLevel_w[i] = 0;
  136. nDSulfideLevel_s[i] = 0;
  137. }
  138. //loop CGBField list and cal the level numbers
  139. for (CGBFieldDataPtr GBFld : listCGBField)
  140. {
  141. //CalLevel mode
  142. switch (tableType)
  143. {
  144. case CALCULATE_TABLE_TYPE::GB_Method1:
  145. GBFld->CaculateLevelByMethod1();
  146. break;
  147. case CALCULATE_TABLE_TYPE::GB_Method2:
  148. GBFld->CaculateLevelByMethod2();
  149. break;
  150. case CALCULATE_TABLE_TYPE::ASTM:
  151. GBFld->CaculateLevelASTM();
  152. break;
  153. default:
  154. break;
  155. }
  156. GB_GRADE_TYPE levelt = GBFld->GetALevel()->GetThinGrade();
  157. GB_GRADE_TYPE levelw = GBFld->GetALevel()->GetWideGrade();
  158. GB_GRADE_TYPE levels = GBFld->GetALevel()->GetSuperGrade();
  159. SetFrameLevelNo(levelt, nALevel);
  160. SetFrameLevelNo(levelw, nALevel_w);
  161. SetFrameLevelNo(levels, nALevel_s);
  162. levelt = GBFld->GetBLevel()->GetThinGrade();
  163. levelw = GBFld->GetBLevel()->GetWideGrade();
  164. levels = GBFld->GetBLevel()->GetSuperGrade();
  165. SetFrameLevelNo(levelt, nBLevel);
  166. SetFrameLevelNo(levelw, nBLevel_w);
  167. SetFrameLevelNo(levels, nBLevel_s);
  168. levelt = GBFld->GetCLevel()->GetThinGrade();
  169. levelw = GBFld->GetCLevel()->GetWideGrade();
  170. levels = GBFld->GetCLevel()->GetSuperGrade();
  171. SetFrameLevelNo(levelt, nCLevel);
  172. SetFrameLevelNo(levelw, nCLevel_w);
  173. SetFrameLevelNo(levels, nCLevel_s);
  174. levelt = GBFld->GetDLevel()->GetThinGrade();
  175. levelw = GBFld->GetDLevel()->GetWideGrade();
  176. levels = GBFld->GetDLevel()->GetSuperGrade();
  177. SetFrameLevelNo(levelt, nDLevel);
  178. SetFrameLevelNo(levelw, nDLevel_w);
  179. SetFrameLevelNo(levels, nDLevel_s);
  180. }
  181. //Get ListGrid for Level
  182. //CalLevel mode
  183. CGridDataPtr AGrid;
  184. CGridDataPtr BGrid;
  185. CGridDataPtr CGrid;
  186. CGridDataPtr DGrid;
  187. CGridDataPtr DSulfideGrid;
  188. CGridDataPtr DSGrid;
  189. CGridDataPtr GBFieldGrid;
  190. switch (tableType)
  191. {
  192. case CALCULATE_TABLE_TYPE::GB_Method1:
  193. AGrid = GetGridLevel("A", nALevel, nALevel_w, nALevel_s);
  194. BGrid = GetGridLevel("B", nBLevel, nBLevel_w, nBLevel_s);
  195. CGrid = GetGridLevel("C", nCLevel, nCLevel_w, nCLevel_s);
  196. DGrid = GetGridLevel("D", nDLevel, nDLevel_w, nDLevel_s);
  197. DSGrid = GetGridDSLevel(listCGBField);
  198. GBFieldGrid = GetGBFieldGrid(listCGBField);
  199. listGridData.push_back(AGrid);
  200. listGridData.push_back(BGrid);
  201. listGridData.push_back(CGrid);
  202. listGridData.push_back(DGrid);
  203. listGridData.push_back(DSGrid);
  204. listGridData.push_back(GBFieldGrid);
  205. //listGridData
  206. return listGridData;
  207. break;
  208. case CALCULATE_TABLE_TYPE::GB_Method2:
  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. DSulfideGrid = GetGridLevel("DSulfide", nDSulfideLevel, nDSulfideLevel_w, nDSulfideLevel_s);
  214. DSGrid = GetGridDSLevel(listCGBField);
  215. GBFieldGrid = GetGBFieldGrid(listCGBField);
  216. listGridData.push_back(AGrid);
  217. listGridData.push_back(BGrid);
  218. listGridData.push_back(CGrid);
  219. listGridData.push_back(DGrid);
  220. listGridData.push_back(DSulfideGrid);
  221. listGridData.push_back(DSGrid);
  222. listGridData.push_back(GBFieldGrid);
  223. //listGridData
  224. return listGridData;
  225. break;
  226. case CALCULATE_TABLE_TYPE::ASTM:
  227. AGrid = GetGridLevel("A", nALevel, nALevel_w, nALevel_s);
  228. BGrid = GetGridLevel("B", nBLevel, nBLevel_w, nBLevel_s);
  229. CGrid = GetGridLevel("C", nCLevel, nCLevel_w, nCLevel_s);
  230. DGrid = GetGridLevel("D", nDLevel, nDLevel_w, nDLevel_s);
  231. DSGrid = GetGridDSLevel(listCGBField);
  232. GBFieldGrid = GetGBFieldGrid(listCGBField);
  233. listGridData.push_back(AGrid);
  234. listGridData.push_back(BGrid);
  235. listGridData.push_back(CGrid);
  236. listGridData.push_back(DGrid);
  237. listGridData.push_back(DSGrid);
  238. listGridData.push_back(GBFieldGrid);
  239. //listGridData
  240. return listGridData;
  241. break;
  242. default:
  243. return listGridData;
  244. break;
  245. }
  246. }
  247. CGridDatasList CGBCalculate::GetGridDataListForOneDataSourceDIN(COTSParticleList listParticle, CALCULATE_TABLE_TYPE tableType )
  248. {
  249. CGridDatasList listGridData;
  250. COTSParticleList cotsparticlelistA;
  251. set<COTSParticlePtr> cotsparticlelistB;
  252. COTSParticleList cotsparticlelistC;
  253. COTSParticleList cotsparticlelistD;
  254. //loop CGBField list and cal the level numbers
  255. CGBFieldDataPtr GBFld(new CGBFieldData());
  256. GBFld->SetParticleList(listParticle, TRUE);
  257. GBFld->CaculateLevelDIN(listParticle);
  258. cotsparticlelistA = GBFld->listAThinParticles;
  259. cotsparticlelistB = GBFld->listBThinParticles;
  260. cotsparticlelistC = GBFld->listCThinParticles;
  261. cotsparticlelistD = GBFld->listDThinParticles;
  262. //Get ListGrid for Level
  263. //CalLevel mode
  264. CGridDataPtr AGrid;
  265. AGrid = GetGridDIN(cotsparticlelistA, cotsparticlelistB, cotsparticlelistC, cotsparticlelistD);
  266. listGridData.push_back(AGrid);
  267. //listGridData
  268. return listGridData;
  269. }
  270. //CGridDataPtr CGBFieldMgr::GetGBFieldGrid(CGBFieldList listCGBField, CGridInPtr a_pGridIn);
  271. CGridDataPtr CGBCalculate::GetGBFieldGrid(CGBFieldList listCGBField)
  272. {
  273. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  274. std::vector<CString> listDataSource;
  275. listDataSource.clear();
  276. listDataSource = m_rptMgrPtr->GetPropertyParamGrid()->GetDataSourceList();
  277. pGridData->SetDataSourceList(listDataSource);
  278. int nDataSourceId = m_rptMgrPtr->GetPropertyParamGrid()->GetDataSourceId();
  279. pGridData->SetDataSourceId(nDataSourceId);
  280. //amounts
  281. CGridColumnsList listCol;
  282. listCol.clear();
  283. int columnNum = 11;//表格总列数 fieldpos 占2列,ABCDDS 占5列,particle占1列,particle 类别占1列,particle宽度占1列
  284. CGridColumnPtr pColumn;
  285. for (int i = 0; i < columnNum; i++)
  286. {
  287. CString strName;
  288. CGridRowsList listRows;
  289. CGridRowPtr pRow;
  290. switch (i)
  291. {
  292. case 0:
  293. pColumn = CGridColumnPtr(new CGridColumn());
  294. pColumn->SetName("FieldPosX");
  295. for (auto GBF : listCGBField)
  296. {
  297. for (auto p : GBF->GetParticleList())
  298. {
  299. pRow = CGridRowPtr(new CGridRow());
  300. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  301. pRow->SetIntValue(GBF->GetPosition().x);
  302. listRows.push_back(pRow);
  303. }
  304. }
  305. pColumn->SetGridRowsList(listRows);
  306. listCol.push_back(pColumn);
  307. break;
  308. case 1:
  309. pColumn = CGridColumnPtr(new CGridColumn());
  310. pColumn->SetName("FieldPosY");
  311. for (auto GBF : listCGBField)
  312. {
  313. for (auto p : GBF->GetParticleList())
  314. {
  315. pRow = CGridRowPtr(new CGridRow());
  316. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  317. pRow->SetIntValue(GBF->GetPosition().y);
  318. listRows.push_back(pRow);
  319. }
  320. }
  321. pColumn->SetGridRowsList(listRows);
  322. listCol.push_back(pColumn);
  323. break;
  324. case 2:
  325. pColumn = CGridColumnPtr(new CGridColumn());
  326. pColumn->SetName("ALevel");
  327. for (auto GBF : listCGBField)
  328. {
  329. for (auto p : GBF->GetParticleList())
  330. {
  331. pRow = CGridRowPtr(new CGridRow());
  332. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  333. std::string Athin, Awide, Asuper;
  334. auto Alevel = GBF->GetALevel();
  335. auto thin = Alevel->GetThinGrade();
  336. Athin = GetLevelStr(thin);
  337. Awide = GetLevelStr(Alevel->GetWideGrade());
  338. Asuper = GetLevelStr(Alevel->GetSuperGrade());
  339. pRow->SetStringValue((Athin + "," + Awide + "," + Asuper).c_str());
  340. listRows.push_back(pRow);
  341. }
  342. }
  343. pColumn->SetGridRowsList(listRows);
  344. listCol.push_back(pColumn);
  345. break;
  346. case 3:
  347. pColumn = CGridColumnPtr(new CGridColumn());
  348. pColumn->SetName("BLevel");
  349. for (auto GBF : listCGBField)
  350. {
  351. for (auto p : GBF->GetParticleList())
  352. {
  353. pRow = CGridRowPtr(new CGridRow());
  354. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  355. std::string thin, wide, super;
  356. auto level = GBF->GetBLevel();
  357. thin = GetLevelStr(level->GetThinGrade());
  358. wide = GetLevelStr(level->GetWideGrade());
  359. super = GetLevelStr(level->GetSuperGrade());
  360. pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
  361. listRows.push_back(pRow);
  362. }
  363. }
  364. pColumn->SetGridRowsList(listRows);
  365. listCol.push_back(pColumn);
  366. break;
  367. case 4:
  368. pColumn = CGridColumnPtr(new CGridColumn());
  369. pColumn->SetName("CLevel");
  370. for (auto GBF : listCGBField)
  371. {
  372. for (auto p : GBF->GetParticleList())
  373. {
  374. pRow = CGridRowPtr(new CGridRow());
  375. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  376. std::string thin, wide, super;
  377. auto level = GBF->GetCLevel();
  378. thin = GetLevelStr(level->GetThinGrade());
  379. wide = GetLevelStr(level->GetWideGrade());
  380. super = GetLevelStr(level->GetSuperGrade());
  381. pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
  382. listRows.push_back(pRow);
  383. }
  384. }
  385. pColumn->SetGridRowsList(listRows);
  386. listCol.push_back(pColumn);
  387. break;
  388. case 5:
  389. pColumn = CGridColumnPtr(new CGridColumn());
  390. pColumn->SetName("DLevel");
  391. for (auto GBF : listCGBField)
  392. {
  393. for (auto p : GBF->GetParticleList())
  394. {
  395. pRow = CGridRowPtr(new CGridRow());
  396. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  397. std::string thin, wide, super;
  398. auto level = GBF->GetDLevel();
  399. thin = GetLevelStr(level->GetThinGrade());
  400. wide = GetLevelStr(level->GetWideGrade());
  401. super = GetLevelStr(level->GetSuperGrade());
  402. pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
  403. listRows.push_back(pRow);
  404. }
  405. }
  406. pColumn->SetGridRowsList(listRows);
  407. listCol.push_back(pColumn);
  408. break;
  409. case 6:
  410. pColumn = CGridColumnPtr(new CGridColumn());
  411. pColumn->SetName("DSLevel");
  412. for (auto GBF : listCGBField)
  413. {
  414. for (auto p : GBF->GetParticleList())
  415. {
  416. pRow = CGridRowPtr(new CGridRow());
  417. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  418. std::string thin, wide, super;
  419. auto level = GBF->GetDSLevel();
  420. thin = GetLevelStr(level->GetThinGrade());
  421. wide = GetLevelStr(level->GetWideGrade());
  422. super = GetLevelStr(level->GetSuperGrade());
  423. pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
  424. listRows.push_back(pRow);
  425. }
  426. }
  427. pColumn->SetGridRowsList(listRows);
  428. listCol.push_back(pColumn);
  429. break;
  430. case 7:
  431. pColumn = CGridColumnPtr(new CGridColumn());
  432. pColumn->SetName("DSulfideLevel");
  433. for (auto GBF : listCGBField)
  434. {
  435. for (auto p : GBF->GetParticleList())
  436. {
  437. pRow = CGridRowPtr(new CGridRow());
  438. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
  439. std::string thin, wide, super;
  440. auto level = GBF->GetDSulfideLevel();
  441. thin = GetLevelStr(level->GetThinGrade());
  442. wide = GetLevelStr(level->GetWideGrade());
  443. super = GetLevelStr(level->GetSuperGrade());
  444. pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
  445. listRows.push_back(pRow);
  446. }
  447. }
  448. pColumn->SetGridRowsList(listRows);
  449. listCol.push_back(pColumn);
  450. break;
  451. case 8:
  452. pColumn = CGridColumnPtr(new CGridColumn());
  453. pColumn->SetName("Particle");
  454. for (auto GBF : listCGBField)
  455. {
  456. for (auto p : GBF->GetParticleList())
  457. {
  458. pRow = CGridRowPtr(new CGridRow());
  459. pRow->SetParticle(p);
  460. listRows.push_back(pRow);
  461. }
  462. }
  463. pColumn->SetGridRowsList(listRows);
  464. listCol.push_back(pColumn);
  465. break;
  466. case 9:
  467. pColumn = CGridColumnPtr(new CGridColumn());
  468. pColumn->SetName("ParticleGBClass");
  469. for (auto GBF : listCGBField)
  470. {
  471. for (auto p : GBF->GetParticleList())
  472. {
  473. int l = (int)GBF->mapAllParticles[p].myType;
  474. pRow = CGridRowPtr(new CGridRow());
  475. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  476. pRow->SetIntValue(l);
  477. listRows.push_back(pRow);
  478. }
  479. }
  480. pColumn->SetGridRowsList(listRows);
  481. listCol.push_back(pColumn);
  482. break;
  483. case 10:
  484. pColumn = CGridColumnPtr(new CGridColumn());
  485. pColumn->SetName("ParticleGBWidthClass");
  486. for (auto GBF : listCGBField)
  487. {
  488. for (auto p : GBF->GetParticleList())
  489. {
  490. int w = (int)GBF->mapAllParticles[p].myWidth;
  491. pRow = CGridRowPtr(new CGridRow());
  492. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  493. pRow->SetIntValue(w);
  494. listRows.push_back(pRow);
  495. }
  496. }
  497. pColumn->SetGridRowsList(listRows);
  498. listCol.push_back(pColumn);
  499. break;
  500. default:
  501. break;
  502. }
  503. }
  504. pGridData->SetGridColumnList(listCol);
  505. return pGridData;
  506. }
  507. std::string CGBCalculate::GetLevelStr(GB_GRADE_TYPE l)
  508. {
  509. std::string s;
  510. switch (l)
  511. {
  512. case GB_GRADE_TYPE::POINT_0_0 :
  513. s = "0";
  514. break;
  515. case GB_GRADE_TYPE::POINT_0_5:
  516. s = "0.5";
  517. break;
  518. case GB_GRADE_TYPE::POINT_1_0:
  519. s = "1";
  520. break;
  521. case GB_GRADE_TYPE::POINT_1_5:
  522. s = "1.5";
  523. break;
  524. case GB_GRADE_TYPE::POINT_2_0:
  525. s = "2";
  526. break;
  527. case GB_GRADE_TYPE::POINT_2_5:
  528. s = "2.5";
  529. break;
  530. case GB_GRADE_TYPE::POINT_3_0:
  531. s = "3";
  532. break;
  533. case GB_GRADE_TYPE::POINT_3_5:
  534. s = "3.5";
  535. break;
  536. case GB_GRADE_TYPE::POINT_4_0:
  537. s = "4";
  538. break;
  539. case GB_GRADE_TYPE::POINT_4_5:
  540. s = "4.5";
  541. break;
  542. case GB_GRADE_TYPE::POINT_5_0:
  543. s = "5";
  544. break;
  545. default:
  546. s = "0";
  547. break;
  548. }
  549. return s;
  550. }
  551. //get grid with level ABCD
  552. CGridDataPtr CGBCalculate::GetGridLevel(CString GridType,int a_nLevel[], int a_nLevel_w[], int a_nLevel_s[])
  553. {
  554. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  555. std::vector<CString> listDataSource;
  556. listDataSource.clear();
  557. listDataSource = m_rptMgrPtr->GetPropertyParamGrid()->GetDataSourceList();
  558. pGridData->SetDataSourceList(listDataSource);
  559. int nDataSourceId = m_rptMgrPtr->GetPropertyParamGrid()->GetDataSourceId();
  560. pGridData->SetDataSourceId(nDataSourceId);
  561. //amounts
  562. CGridColumnsList listCol;
  563. listCol.clear();
  564. int columnNum = 11 + 1 + 1;//表格总列数 12个级别再加上前面的“分类”列和“宽度/um”列
  565. CGridColumnPtr pColumn;
  566. for (int i=0;i< columnNum;i++)
  567. {
  568. CString strName;
  569. CGridRowsList listRows;
  570. CGridRowPtr pRow;
  571. CString strWidthName1, strWidthName2, strWidthName3;
  572. switch( i)
  573. {
  574. case 0:
  575. pColumn = CGridColumnPtr(new CGridColumn());
  576. //strName = MultiLang::GetInstance ().GetCStringByKey (GBStr1);
  577. strName = "Class";
  578. pColumn->SetName(strName);
  579. pRow = CGridRowPtr(new CGridRow());
  580. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  581. pRow->SetStringValue("Thin"); //MultiLang::GetInstance().GetCStringByKey(GBStr2)
  582. listRows.push_back(pRow);
  583. pRow = CGridRowPtr(new CGridRow());
  584. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  585. pRow->SetStringValue("Thick"); //MultiLang::GetInstance().GetCStringByKey(GBStr3)
  586. listRows.push_back(pRow);
  587. pRow = CGridRowPtr(new CGridRow());
  588. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  589. pRow->SetStringValue("OverSize"); //MultiLang::GetInstance().GetCStringByKey(GBStr4)
  590. listRows.push_back(pRow);
  591. pColumn->SetGridRowsList(listRows);
  592. listCol.push_back(pColumn);
  593. break;
  594. case 1:
  595. pColumn = CGridColumnPtr(new CGridColumn());
  596. strName = "Width/um"; //MultiLang::GetInstance().GetCStringByKey(GBStr5);
  597. pColumn->SetName(strName);
  598. if (GridType == "A")
  599. {
  600. strWidthName1 = "2.0~4.0";
  601. strWidthName2 = "4.0~12.0";
  602. strWidthName3 = ">12.0";
  603. }
  604. if (GridType == "B")
  605. {
  606. strWidthName1 = "2.0~9.0";
  607. strWidthName2 = "9.0~15.0";
  608. strWidthName3 = ">15.0";
  609. }
  610. if (GridType == "C")
  611. {
  612. strWidthName1 = "2.0~5.0";
  613. strWidthName2 = "5.0~12.0";
  614. strWidthName3 = ">12.0";
  615. }
  616. if (GridType == "D")
  617. {
  618. strWidthName1 = "2.0~8.0";
  619. strWidthName2 = "8.0~13.0";
  620. strWidthName3 = ">13.0";
  621. }
  622. if (GridType == "DSulfide")
  623. {
  624. strWidthName1 = "2.0~8.0";
  625. strWidthName2 = "8.0~13.0";
  626. strWidthName3 = ">13.0";
  627. }
  628. pRow = CGridRowPtr(new CGridRow());
  629. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  630. pRow->SetStringValue(strWidthName1);
  631. listRows.push_back(pRow);
  632. pRow = CGridRowPtr(new CGridRow());
  633. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  634. pRow->SetStringValue(strWidthName2);
  635. listRows.push_back(pRow);
  636. pRow = CGridRowPtr(new CGridRow());
  637. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  638. pRow->SetStringValue(strWidthName3);
  639. listRows.push_back(pRow);
  640. pColumn->SetGridRowsList(listRows);
  641. listCol.push_back(pColumn);
  642. break;
  643. default:
  644. pColumn = CGridColumnPtr(new CGridColumn());
  645. CString name;
  646. name.Format(_T("%.1f"), (i - 2) / 2.0);//i=2 输出0 i=3 输出0.5 i=4 输出1 以此类推
  647. pColumn->SetName(name);
  648. CGridRowsList listRows;
  649. pRow = CGridRowPtr(new CGridRow());
  650. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  651. pRow->SetIntValue(a_nLevel[i - 2]);
  652. listRows.push_back(pRow);
  653. pRow = CGridRowPtr(new CGridRow());
  654. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  655. pRow->SetIntValue(a_nLevel_w[i - 2]);
  656. listRows.push_back(pRow);
  657. pRow = CGridRowPtr(new CGridRow());
  658. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  659. pRow->SetIntValue(a_nLevel_s[i - 2]);
  660. listRows.push_back(pRow);
  661. pColumn->SetGridRowsList(listRows);
  662. listCol.push_back(pColumn);
  663. break;
  664. }
  665. }
  666. pGridData->SetGridColumnList(listCol);
  667. return pGridData;
  668. }
  669. CGridDataPtr CGBCalculate::GetGridDSLevel(CGBFieldList listCGBField)
  670. {
  671. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  672. std::vector<CString> listDataSource;
  673. listDataSource.clear();
  674. listDataSource = m_rptMgrPtr->GetPropertyParamGrid()->GetDataSourceList();
  675. pGridData->SetDataSourceList(listDataSource);
  676. int nDataSourceId = m_rptMgrPtr->GetPropertyParamGrid()->GetDataSourceId();
  677. pGridData->SetDataSourceId(nDataSourceId);
  678. //amounts
  679. CGridColumnsList listCol;
  680. listCol.clear();
  681. int columnNum = 6;
  682. CGridColumnPtr pColumn;
  683. for (int i = 0; i < columnNum; i++)
  684. {
  685. CString strName;
  686. CGridRowsList listRows[6];
  687. CGridRowPtr pRow;
  688. CString strWidthName1, strWidthName2, strWidthName3;
  689. switch (i)
  690. {
  691. case 0:
  692. pColumn = CGridColumnPtr(new CGridColumn());
  693. strName = "No."; //MultiLang::GetInstance().GetCStringByKey(GBStr6);
  694. pColumn->SetName(strName);
  695. pColumn->SetGridRowsList(listRows[0]);
  696. listCol.push_back(pColumn);
  697. break;
  698. case 1:
  699. pColumn = CGridColumnPtr(new CGridColumn());
  700. strName = "Area/um2"; //MultiLang::GetInstance().GetCStringByKey(GBStr7);
  701. pColumn->SetName(strName);
  702. pColumn->SetGridRowsList(listRows[1]);
  703. listCol.push_back(pColumn);
  704. break;
  705. case 2:
  706. pColumn = CGridColumnPtr(new CGridColumn());
  707. strName = "MaxFeret/um";// MultiLang::GetInstance().GetCStringByKey(GBStr8);
  708. pColumn->SetName(strName);
  709. pColumn->SetGridRowsList(listRows[2]);
  710. listCol.push_back(pColumn);
  711. break;
  712. case 3:
  713. pColumn = CGridColumnPtr(new CGridColumn());
  714. strName = "X/mm";
  715. pColumn->SetName(strName);
  716. pColumn->SetGridRowsList(listRows[3]);
  717. listCol.push_back(pColumn);
  718. break;
  719. case 4:
  720. pColumn = CGridColumnPtr(new CGridColumn());
  721. strName = "Y/mm";
  722. pColumn->SetName(strName);
  723. pColumn->SetGridRowsList(listRows[4]);
  724. listCol.push_back(pColumn);
  725. break;
  726. case 5:
  727. pColumn = CGridColumnPtr(new CGridColumn());
  728. strName = "Grade";// MultiLang::GetInstance().GetCStringByKey(GBStr9);
  729. pColumn->SetName(strName);
  730. pColumn->SetGridRowsList(listRows[5]);
  731. listCol.push_back(pColumn);
  732. break;
  733. }
  734. }
  735. for (CGBFieldDataPtr frame : listCGBField)
  736. {
  737. for (int i = 0; i < columnNum; i++)
  738. {
  739. CString strName;
  740. CGridRowsList listRows;
  741. CGridRowPtr pRow;
  742. CString strWidthName1, strWidthName2, strWidthName3;
  743. switch (i)
  744. {
  745. case 0:
  746. pColumn = listCol.at(0);
  747. pRow = CGridRowPtr(new CGridRow());
  748. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  749. pRow->SetIntValue(frame->GetFrameId());
  750. pColumn->GetRowList ().push_back(pRow);
  751. break;
  752. case 1:
  753. pColumn = listCol.at(1);
  754. pRow = CGridRowPtr(new CGridRow());
  755. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  756. pRow->SetIntValue(0);
  757. pColumn->GetRowList().push_back(pRow);
  758. break;
  759. case 2:
  760. pColumn = listCol.at(2);
  761. pRow = CGridRowPtr(new CGridRow());
  762. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  763. pRow->SetIntValue((int)frame->GetDSLevel()->GetMaxFeretDiameter());
  764. pColumn->GetRowList().push_back(pRow);
  765. break;
  766. case 3:
  767. pColumn = listCol.at(3);
  768. pRow = CGridRowPtr(new CGridRow());
  769. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  770. pRow->SetIntValue(0);
  771. pColumn->GetRowList().push_back(pRow);
  772. break;
  773. case 4:
  774. pColumn = listCol.at(4);
  775. pRow = CGridRowPtr(new CGridRow());
  776. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  777. pRow->SetIntValue(0);
  778. pColumn->GetRowList().push_back(pRow);
  779. break;
  780. case 5:
  781. pColumn = listCol.at(5);
  782. pRow = CGridRowPtr(new CGridRow());
  783. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  784. pRow->SetDoubleValue((double)frame->GetDSLevel()->GetMyDSGrade());
  785. pColumn->GetRowList().push_back(pRow);
  786. break;
  787. }
  788. }
  789. }
  790. pGridData->SetGridColumnList(listCol);
  791. return pGridData;
  792. }
  793. //get grid with level ABCD
  794. CGridDataPtr CGBCalculate::GetGridDIN(COTSParticleList cotsparticlelistA, set<COTSParticlePtr> cotsparticlelistB, COTSParticleList cotsparticlelistC, COTSParticleList cotsparticlelistD)
  795. {
  796. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  797. std::vector<CString> listDataSource;
  798. listDataSource.clear();
  799. listDataSource = m_rptMgrPtr->GetPropertyParamGrid()->GetDataSourceList();
  800. pGridData->SetDataSourceList(listDataSource);
  801. int nDataSourceId = m_rptMgrPtr->GetPropertyParamGrid()->GetDataSourceId();
  802. pGridData->SetDataSourceId(nDataSourceId);
  803. //amounts
  804. CGridColumnsList listCol;
  805. listCol.clear();
  806. int columnNum = 12;//表格总列数 11个级别再加上前面的“分类”列
  807. CGridColumnPtr pColumn;
  808. int levA[9] = { 0,0,0,0,0,0,0,0,0 };
  809. int levB[9] = { 0,0,0,0,0,0,0,0,0 };
  810. int levC[9] = { 0,0,0,0,0,0,0,0,0 };
  811. int levD[9] = { 0,0,0,0,0,0,0,0,0 };
  812. double fg[9] = { 0.05,0.1,0.2,0.5,1,2,5,10,20 };
  813. //指数
  814. double ka = 0, kb = 0, kc = 0, kd = 0;
  815. //统计不同大小颗粒出现次数
  816. for (auto pParticle : cotsparticlelistA)
  817. {
  818. double area = pParticle->GetActualArea();
  819. for (int i = 0; i < 8; i++)
  820. {
  821. if (area >= fg[i] && area < fg[i + 1])
  822. {
  823. levA[i] += 1;
  824. ka = ka + fg[i];
  825. }
  826. }
  827. if (area >= fg[8])
  828. {
  829. levA[8] += 1;
  830. ka = ka + fg[8];
  831. }
  832. }
  833. for (auto pParticle : cotsparticlelistB)
  834. {
  835. double area = pParticle->GetActualArea();
  836. for (int i = 0; i < 8; i++)
  837. {
  838. if (area >= fg[i] && area < fg[i + 1])
  839. {
  840. levB[i] += 1;
  841. kb = kb + fg[i];
  842. }
  843. }
  844. if (area >= fg[8])
  845. {
  846. levB[8] += 1;
  847. kb = kb + fg[8];
  848. }
  849. }
  850. for (auto pParticle : cotsparticlelistC)
  851. {
  852. double area = pParticle->GetActualArea();
  853. for (int i = 0; i < 8; i++)
  854. {
  855. if (area >= fg[i] && area < fg[i + 1])
  856. {
  857. levC[i] += 1;
  858. kc = kc + fg[i];
  859. }
  860. }
  861. if (area >= fg[8])
  862. {
  863. levC[8] += 1;
  864. kc = kc + fg[8];
  865. }
  866. }
  867. for (auto pParticle : cotsparticlelistD)
  868. {
  869. double area = pParticle->GetActualArea();
  870. for (int i = 0; i < 8; i++)
  871. {
  872. if (area >= fg[i] && area < fg[i + 1])
  873. {
  874. levD[i] += 1;
  875. kd = kd + fg[i];
  876. }
  877. }
  878. if (area >= fg[8])
  879. {
  880. levD[8] += 1;
  881. kd = kd + fg[8];
  882. }
  883. }
  884. double to = kb + kc + kd;
  885. for (int i = 0; i < columnNum; i++)
  886. {
  887. CString strName;
  888. CGridRowsList listRows;
  889. CGridRowPtr pRow;
  890. CString strWidthName1, strWidthName2, strWidthName3, strWidthName4;
  891. switch (i)
  892. {
  893. case 0:
  894. pColumn = CGridColumnPtr(new CGridColumn());
  895. strName = "Class";
  896. pColumn->SetName(strName);
  897. pRow = CGridRowPtr(new CGridRow());
  898. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  899. pRow->SetStringValue("SS");
  900. listRows.push_back(pRow);
  901. pRow = CGridRowPtr(new CGridRow());
  902. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  903. pRow->SetStringValue("OA");
  904. listRows.push_back(pRow);
  905. pRow = CGridRowPtr(new CGridRow());
  906. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  907. pRow->SetStringValue("OS");
  908. listRows.push_back(pRow);
  909. pRow = CGridRowPtr(new CGridRow());
  910. pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  911. pRow->SetStringValue("OG");
  912. listRows.push_back(pRow);
  913. pColumn->SetGridRowsList(listRows);
  914. listCol.push_back(pColumn);
  915. break;
  916. case 10:
  917. pColumn = CGridColumnPtr(new CGridColumn());
  918. strName = "S";
  919. pColumn->SetName(strName);
  920. strWidthName1.Format(_T("%lf"), ka);
  921. strWidthName2 = "";
  922. strWidthName3 = "";
  923. strWidthName4 = "";
  924. pRow = CGridRowPtr(new CGridRow());
  925. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  926. pRow->SetDoubleValue(ka);
  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. pRow = CGridRowPtr(new CGridRow());
  933. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  934. pRow->SetDoubleValue(0);
  935. listRows.push_back(pRow);
  936. pRow = CGridRowPtr(new CGridRow());
  937. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  938. pRow->SetDoubleValue(0);
  939. listRows.push_back(pRow);
  940. pColumn->SetGridRowsList(listRows);
  941. listCol.push_back(pColumn);
  942. break;
  943. case 11:
  944. pColumn = CGridColumnPtr(new CGridColumn());
  945. strName = "O";
  946. pColumn->SetName(strName);
  947. strWidthName1.Format(_T("%lf"), to);
  948. strWidthName2 = "";
  949. strWidthName3 = "";
  950. strWidthName4 = "";
  951. pRow = CGridRowPtr(new CGridRow());
  952. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  953. pRow->SetDoubleValue(0);
  954. listRows.push_back(pRow);
  955. pRow = CGridRowPtr(new CGridRow());
  956. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  957. pRow->SetDoubleValue(kb);
  958. listRows.push_back(pRow);
  959. pRow = CGridRowPtr(new CGridRow());
  960. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  961. pRow->SetDoubleValue(kc);
  962. listRows.push_back(pRow);
  963. pRow = CGridRowPtr(new CGridRow());
  964. pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
  965. pRow->SetDoubleValue(kd);
  966. listRows.push_back(pRow);
  967. pColumn->SetGridRowsList(listRows);
  968. listCol.push_back(pColumn);
  969. break;
  970. default:
  971. pColumn = CGridColumnPtr(new CGridColumn());
  972. strName.Format("%d", i - 1);
  973. pColumn->SetName(strName);
  974. CGridRowsList listRows;
  975. pRow = CGridRowPtr(new CGridRow());
  976. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  977. pRow->SetIntValue(levA[i - 1]);
  978. listRows.push_back(pRow);
  979. pRow = CGridRowPtr(new CGridRow());
  980. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  981. pRow->SetIntValue(levB[i - 1]);
  982. listRows.push_back(pRow);
  983. pRow = CGridRowPtr(new CGridRow());
  984. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  985. pRow->SetIntValue(levC[i - 1]);
  986. listRows.push_back(pRow);
  987. pRow = CGridRowPtr(new CGridRow());
  988. pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
  989. pRow->SetIntValue(levD[i - 1]);
  990. listRows.push_back(pRow);
  991. pColumn->SetGridRowsList(listRows);
  992. listCol.push_back(pColumn);
  993. break;
  994. }
  995. }
  996. pGridData->SetGridColumnList(listCol);
  997. return pGridData;
  998. }
  999. void CGBCalculate::SetFrameLevelNo(GB_GRADE_TYPE a_level, int a_nLevel[])
  1000. {
  1001. a_nLevel[(int)a_level] += 1;
  1002. }
  1003. // calculate GB fields
  1004. CGBFieldList CGBCalculate::CalGBFields(CSmplMsrResultFileMgr* pSmplMgr)
  1005. {
  1006. CGBFieldList m_listGBFields;
  1007. m_listGBFields.clear();
  1008. ASSERT(pSmplMgr);
  1009. CSmplMsrResultFilePtr pSmplMsrResultFile = pSmplMgr->GetSmplMsrResultFile();
  1010. ASSERT(pSmplMsrResultFile);
  1011. COTSSamplePtr pOTSSample = pSmplMsrResultFile->GetSample();
  1012. ASSERT(pOTSSample);
  1013. CSEMDataMsrPtr pEMDataMsrPtr = pOTSSample->GetSEMDataMsr();
  1014. ASSERT(pEMDataMsrPtr);
  1015. // get field width
  1016. int nOTSFieldWidth = pEMDataMsrPtr->GetScanFieldSize();
  1017. if (nOTSFieldWidth == 0)
  1018. {
  1019. LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: field width is zero ."));
  1020. return m_listGBFields;
  1021. }
  1022. // cal a gb field need how many ots fields rows and columns
  1023. int nOTSRowsForGBFld, nOTSColumnsForGBFld;
  1024. CalOTSFieldsNo(nOTSRowsForGBFld, nOTSColumnsForGBFld, nOTSFieldWidth);
  1025. if (nOTSRowsForGBFld == 0 || nOTSColumnsForGBFld == 0)
  1026. {
  1027. LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: nOTSRow|nOTSColumn is zero ."));
  1028. return m_listGBFields;
  1029. }
  1030. // scan parameters
  1031. CMsrParamsPtr pMsrParam = pOTSSample->GetMsrParams();
  1032. //CMsrParamsPtr pMsrParam = pOTSSample->get
  1033. COTSImageScanParamPtr pImgScanParam = pMsrParam->GetImageScanParam();
  1034. // get image size
  1035. OTS_FIVE_TIES_OPTIONS nImageSizeId = pImgScanParam->GetImagePixelSize();
  1036. int nResulotionId = RESOLUTION_ID_FIRST_TIE + (int)nImageSizeId;
  1037. CSize sizePixelImage = RESOLUTION_VALUE[nResulotionId];
  1038. //use OTSField width cal the OTSField height
  1039. //get OTSfilds list
  1040. COTSFieldDataList allOTSFields;
  1041. allOTSFields = pSmplMsrResultFile->GetFieldData();
  1042. // convert ots fields to gb fields
  1043. if (!OTSFieldToGBField( allOTSFields, &m_listGBFields, nOTSRowsForGBFld, nOTSColumnsForGBFld,sizePixelImage, nOTSFieldWidth))
  1044. {
  1045. LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: call OTSFieldToGBField failed."));
  1046. return m_listGBFields;
  1047. }
  1048. return m_listGBFields;
  1049. }
  1050. // protected
  1051. // cal a gb field need how many ots fields rows and columns
  1052. void CGBCalculate::CalOTSFieldsNo(int& a_nRow, int& a_nColumn, int a_nFieldWidth)
  1053. {
  1054. a_nRow = 0;
  1055. a_nColumn = 0;
  1056. if (a_nFieldWidth > 0)
  1057. {
  1058. a_nColumn = (int)ceil((double)GB_FIELD_WIDTH / (double)a_nFieldWidth);
  1059. //OTSField Height always equal to 3 / 4 OTSField Width
  1060. double dFieldHeight = (double)a_nFieldWidth * 3 / 4;
  1061. a_nRow = (int)ceil((double)GB_FIELD_WIDTH / dFieldHeight);
  1062. }
  1063. }
  1064. // Turn OTSField to GBField
  1065. BOOL CGBCalculate::OTSFieldToGBField(COTSFieldDataList allOTSFields, CGBFieldList* m_listGBFields,int nOTSRowsPerGBfld, int nOTSColumnsPerGBFld,CSize sizePixelImage,int nOTSFieldWidth)
  1066. {
  1067. int nFieldHeight = (int)((double)nOTSFieldWidth * 3 / 4);
  1068. // doing nothing if no field at all
  1069. if (allOTSFields.empty())
  1070. {
  1071. LogTrace(__FILE__, __LINE__, _T("CalGBFields: listOTSFields is empty ."));
  1072. return TRUE;
  1073. }
  1074. // get topleft point and bottomright point of the measurement convered area
  1075. CPoint pointTopleft, pointBottomright;
  1076. pointTopleft = pointBottomright = allOTSFields[0]->GetPosition();
  1077. //判断有效区域
  1078. for (unsigned int i = 0; i< allOTSFields.size(); i++)
  1079. {
  1080. //get current OTSField Position,the position is in the center of the field
  1081. CPoint poiOTSFieldPosition = allOTSFields[i]->GetPosition();
  1082. pointTopleft.x = min(poiOTSFieldPosition.x, pointTopleft.x);
  1083. pointTopleft.y = min(poiOTSFieldPosition.y, pointTopleft.y);
  1084. pointBottomright.x = max(poiOTSFieldPosition.x, pointBottomright.x);
  1085. pointBottomright.y = max(poiOTSFieldPosition.y, pointBottomright.y);
  1086. }
  1087. // cal ots columns 有效区域内所有的OTScolumn数
  1088. int nOTSColumnNum = ((pointBottomright.x - pointTopleft.x) / nOTSFieldWidth) + 1;
  1089. // cal ots rows有效区域内所有的OTSRow数
  1090. int nOTSRowNum = ((pointBottomright.y - pointTopleft.y) / nFieldHeight) + 1;
  1091. int nPossibleGBFieldRowNum = nOTSRowNum /nOTSRowsPerGBfld;//可能有的国标field行数
  1092. int nPossibleGBFieldColNum = nOTSColumnNum / nOTSColumnsPerGBFld;//列数
  1093. // cal possible GBFields area
  1094. CPoint pointPosibleAreaTopLeft = pointTopleft;
  1095. //CPoint poiPosAreaBottomRight = poiBottomright;
  1096. CPoint pointPossibleAreaBottomRight = pointTopleft;
  1097. pointPosibleAreaTopLeft.x -= nOTSFieldWidth / 2;
  1098. pointPosibleAreaTopLeft.y -= nFieldHeight / 2;
  1099. //pointPossibleAreaBottomRight.x += (nPossibleGBFieldColNum * nOTSColumnsPerGBFld * nOTSFieldWidth - nOTSFieldWidth / 2);
  1100. pointPossibleAreaBottomRight.x += (nPossibleGBFieldColNum * nOTSColumnsPerGBFld * nOTSFieldWidth );
  1101. //pointPossibleAreaBottomRight.y += (nPossibleGBFieldRowNum * nOTSRowsPerGBfld * nFieldHeight - nFieldHeight / 2);
  1102. pointPossibleAreaBottomRight.y += (nPossibleGBFieldRowNum * nOTSRowsPerGBfld * nFieldHeight);
  1103. // form rectangle of GBFields area
  1104. CRect rectOTSFieldsCuted(pointPosibleAreaTopLeft, pointPossibleAreaBottomRight);
  1105. rectOTSFieldsCuted.NormalizeRect();
  1106. if (rectOTSFieldsCuted.IsRectEmpty())
  1107. {
  1108. LogTrace(__FILE__, __LINE__, _T("CalGBFields: GBFields area is empty ."));
  1109. return TRUE;
  1110. }
  1111. // find all OTSFields inside GBFields area
  1112. COTSFieldDataList OTSFieldsInGBFieldsArea;
  1113. OTSFieldsInGBFieldsArea.clear();
  1114. CPoint poiOTSFieldPosition;
  1115. for (auto OTSField : allOTSFields)
  1116. {
  1117. poiOTSFieldPosition = OTSField->GetPosition();
  1118. //if over the edge
  1119. if (rectOTSFieldsCuted.PtInRect(poiOTSFieldPosition))
  1120. {
  1121. OTSFieldsInGBFieldsArea.push_back(OTSField);
  1122. }
  1123. }
  1124. //get possible OTSFields
  1125. m_listGBFields->clear();
  1126. CPoint pointGBFieldPosition;
  1127. int nOTSFieldsPerGBField = nOTSRowsPerGBfld * nOTSColumnsPerGBFld;
  1128. for (int i = 0; i < nPossibleGBFieldRowNum; i++)
  1129. {
  1130. for (int j = 0; j < nPossibleGBFieldColNum; j++)
  1131. {
  1132. // cal GB field rectangle
  1133. CPoint poiCurGBFieldTopLeft, poiCurGBFieldBottomRight;
  1134. poiCurGBFieldTopLeft = pointPosibleAreaTopLeft;
  1135. //获得左上角的坐标
  1136. poiCurGBFieldTopLeft.x += nOTSColumnsPerGBFld * j * nOTSFieldWidth;
  1137. poiCurGBFieldTopLeft.y += nOTSRowsPerGBfld * i * nFieldHeight;
  1138. //获得右下角的坐标
  1139. poiCurGBFieldBottomRight.x = poiCurGBFieldTopLeft.x + nOTSColumnsPerGBFld * nOTSFieldWidth;
  1140. poiCurGBFieldBottomRight.y = poiCurGBFieldTopLeft.y + nOTSRowsPerGBfld * nFieldHeight;
  1141. CRect rectGBField(poiCurGBFieldTopLeft, poiCurGBFieldBottomRight);
  1142. rectGBField.NormalizeRect();
  1143. CGBFieldDataPtr pGBFieldData;
  1144. //切割组合的矩形成为GBfield,并处理其中的segment
  1145. pGBFieldData = GetOneGBField(rectGBField, OTSFieldsInGBFieldsArea, nOTSRowsPerGBfld, nOTSColumnsPerGBFld, sizePixelImage, nOTSFieldWidth);
  1146. if (!pGBFieldData)
  1147. {
  1148. continue;
  1149. }
  1150. rectGBField.bottom = rectGBField.top + GB_FIELD_WIDTH;
  1151. rectGBField.right = rectGBField.left + GB_FIELD_WIDTH;
  1152. CPoint poiNewPosition;
  1153. poiNewPosition.x = rectGBField.left + GB_FIELD_WIDTH / 2;
  1154. poiNewPosition.y = rectGBField.top + GB_FIELD_WIDTH / 2;
  1155. pGBFieldData->SetPosition(poiNewPosition);
  1156. // add the GBField into the GBFields list
  1157. m_listGBFields->push_back(pGBFieldData);
  1158. }
  1159. }
  1160. // ok, return TRUE
  1161. return TRUE;
  1162. }
  1163. // Custom collation rules
  1164. BOOL comp(const COTSFieldDataPtr &a, const COTSFieldDataPtr &b)
  1165. {
  1166. if (a->GetPosition().y <= b->GetPosition().y)
  1167. {
  1168. if (a->GetPosition().y == b->GetPosition().y)
  1169. {
  1170. if (a->GetPosition().x < b->GetPosition().x)
  1171. {
  1172. return TRUE;
  1173. }
  1174. }
  1175. else {
  1176. return TRUE;
  1177. }
  1178. }
  1179. return FALSE;
  1180. }
  1181. // get the GB field within a rectangle
  1182. CGBFieldDataPtr CGBCalculate::GetOneGBField( CRect a_rectGBField,
  1183. COTSFieldDataList& allOTSFields,
  1184. int nOTSRowsPerGBFld,
  1185. int nOTSColumnsPerGBFld,
  1186. CSize a_sizePixelImage,
  1187. int nOTSFieldWidth)
  1188. {
  1189. // GB Field handle
  1190. CGBFieldDataPtr pGBFieldData = nullptr;
  1191. // get OTS fields within the rectangle
  1192. COTSFieldDataList myOTSFields;
  1193. myOTSFields.clear();
  1194. COTSFieldDataList::iterator itr = allOTSFields.begin();
  1195. while (itr != allOTSFields.end())
  1196. {
  1197. // get an OTS field
  1198. CPoint poiOTSField = (*itr)->GetPosition();
  1199. //check if the field is within the rectangle
  1200. if(a_rectGBField.PtInRect(poiOTSField))
  1201. {
  1202. // found a field
  1203. // add into the list
  1204. myOTSFields.push_back(*itr);
  1205. // remove the field from the measurement field list
  1206. // move to the next item
  1207. //itr = allOTSFields.erase(itr);//There's no need to delete the field. gsp
  1208. itr++;
  1209. // jump over
  1210. continue;
  1211. }
  1212. // move to the next item
  1213. itr++;
  1214. }
  1215. // make sure GBFields list has enough OTSFields
  1216. int nOTSFieldsOfAGBField = nOTSRowsPerGBFld * nOTSColumnsPerGBFld;
  1217. if (myOTSFields.size() == nOTSFieldsOfAGBField)
  1218. {
  1219. // sort the GBFields list
  1220. sort(myOTSFields.begin(), myOTSFields.end(), comp);
  1221. // normalize particles for the GBFields
  1222. pGBFieldData = NormalizeParticles(a_rectGBField, myOTSFields, a_sizePixelImage, nOTSFieldWidth);
  1223. pGBFieldData->myReleventOTSFlds = myOTSFields;
  1224. }
  1225. // return GB Field handle
  1226. return pGBFieldData;
  1227. }
  1228. // Custom collation rules
  1229. BOOL compSegment(const COTSSegmentPtr &a, const COTSSegmentPtr &b)
  1230. {
  1231. if (a->GetHeight() <= b->GetHeight())
  1232. {
  1233. if (a->GetHeight() == b->GetHeight())
  1234. {
  1235. if (a->GetStart() < b->GetStart())
  1236. {
  1237. return TRUE;
  1238. }
  1239. }
  1240. else {
  1241. return TRUE;
  1242. }
  1243. }
  1244. return FALSE;
  1245. }
  1246. // normalize particles for the GBFields
  1247. CGBFieldDataPtr CGBCalculate::NormalizeParticles(CRect a_rectGBField, COTSFieldDataList myOTSFields, CSize a_sizePixelImage, int nOTSFieldWidth)
  1248. {
  1249. // inits
  1250. CGBFieldDataPtr pGBFieldData(new CGBFieldData);
  1251. int nFieldHeight = (int)((double)nOTSFieldWidth * 3 / 4);
  1252. //go through all OTS fields form the GB field to get all segments of the GB field
  1253. COTSSegmentsList listGBFieldSegments;
  1254. CPoint pointGBFieldRectTopLeft = a_rectGBField.TopLeft();
  1255. int nBeforeCalNo = 0;
  1256. int nAfterCalNo = 0;
  1257. for (auto OTSField : myOTSFields)
  1258. {
  1259. CPoint pointField = OTSField->GetPosition();
  1260. COTSParticleList myOTSParticles = OTSField->GetParticleList();
  1261. long fieldLeftTopX, fieldLeftTopY;
  1262. CPoint pointCalculate;
  1263. fieldLeftTopX = pointField.x - (nOTSFieldWidth/2);
  1264. fieldLeftTopY = pointField.y - (nFieldHeight/2);
  1265. pointCalculate.x = fieldLeftTopX - pointGBFieldRectTopLeft.x;
  1266. pointCalculate.y = fieldLeftTopY - pointGBFieldRectTopLeft.y;
  1267. //found the field's Column and Row
  1268. int nColum = (int)(((double)pointCalculate.x/ (double)nOTSFieldWidth)+0.5);
  1269. int nRow = (int)(((double)pointCalculate.y/ (double)nFieldHeight)+0.5);
  1270. //function Get GBField's FieldSegments List
  1271. nBeforeCalNo = (int)listGBFieldSegments.size();
  1272. GetGBFieldSegmentsList(nColum, nRow, myOTSParticles, nAfterCalNo,listGBFieldSegments, a_sizePixelImage, nOTSFieldWidth);
  1273. nAfterCalNo = nBeforeCalNo;
  1274. }
  1275. COTSParticleList listNormalizedParticles;
  1276. // get new particles
  1277. GetGBParticles(listGBFieldSegments, listNormalizedParticles);
  1278. // put new particle in the GB Field
  1279. pGBFieldData->SetParticleList(listNormalizedParticles);
  1280. return pGBFieldData;
  1281. }
  1282. //function Get GBField's FieldSegments List
  1283. BOOL CGBCalculate::GetGBFieldSegmentsList(int a_nColum, int a_nRow, COTSParticleList a_listOTSFieldParticles, int a_nCalNo, COTSSegmentsList &a_listGBFieldSegments, CSize a_sizePixelImage, int a_nFieldWidth)
  1284. {
  1285. CRect rectParticle;
  1286. CPoint poiParticleTopLeft;
  1287. COTSSegmentsList listOTSFieldSegments;
  1288. long nNewStart = 0, nNewLength = 0, nNewHeight;
  1289. long nOffsetX = a_nColum * a_sizePixelImage.cx;
  1290. long nOffsetY = a_nRow * a_sizePixelImage.cy;
  1291. // get one pixel width
  1292. //double dPixelsize = (double)a_nFieldWidth / a_sizePixelImage.cx;
  1293. double dPixelsize = (double)a_sizePixelImage.cx/a_nFieldWidth ;
  1294. double dGBwidth = sqrt(0.5) * 1000;
  1295. long nGBpixcel = (long)(dGBwidth * dPixelsize);
  1296. //cal the new segment coordinate
  1297. for (auto Particle : a_listOTSFieldParticles)
  1298. {
  1299. //get the Particle rect
  1300. rectParticle = Particle->GetParticleRect();
  1301. poiParticleTopLeft = rectParticle.TopLeft();
  1302. listOTSFieldSegments = Particle->GetFeature()->GetSegmentsList();
  1303. for (auto Segment : listOTSFieldSegments)
  1304. {
  1305. BOOL bMerge = (a_nColum > 0) && (Segment->GetStart() == 0);
  1306. // off set the segment
  1307. nNewStart = Segment->GetStart() + nOffsetX;
  1308. nNewHeight= Segment->GetHeight() + nOffsetY;
  1309. // check should we need to keep the segment
  1310. // cal if the Segment in the GB 0.5/m2
  1311. if (nNewStart > nGBpixcel)
  1312. {
  1313. continue;
  1314. }
  1315. if (nNewHeight > nGBpixcel)
  1316. {
  1317. continue;
  1318. }
  1319. // do we need to cut the segment
  1320. //if over 0.5m2 cut it
  1321. //get GBField's a_nHeight, long a_nStart, long a_nLength
  1322. nNewLength = Segment->GetLength();
  1323. if (nNewStart + Segment->GetLength() > nGBpixcel)
  1324. {
  1325. nNewLength = (long)(nGBpixcel - nNewStart);
  1326. }
  1327. COTSSegmentPtr pGBFieldSegment(new COTSSegment(nNewHeight, nNewStart, nNewLength));
  1328. //merge the segment
  1329. if (bMerge && MergSegment(a_listGBFieldSegments, pGBFieldSegment, a_nCalNo))
  1330. {
  1331. continue;
  1332. }
  1333. a_listGBFieldSegments.push_back(pGBFieldSegment);
  1334. }
  1335. }
  1336. return TRUE;
  1337. }
  1338. // merge the segment
  1339. BOOL CGBCalculate::MergSegment(COTSSegmentsList &a_listGBFieldSegments, COTSSegmentPtr a_pGBFieldSegment, int a_nCalNo)
  1340. {
  1341. //search merge segments only on last field
  1342. COTSSegmentsList::iterator itr = a_listGBFieldSegments.begin()+ a_nCalNo;
  1343. while (itr != a_listGBFieldSegments.end())
  1344. {
  1345. COTSSegmentPtr pSegmentHead = *itr;
  1346. long nNextX = pSegmentHead->GetStart() + pSegmentHead->GetLength();
  1347. //merge only when height are the same
  1348. if (pSegmentHead->GetHeight() == a_pGBFieldSegment->GetHeight())
  1349. {
  1350. //end to start
  1351. if ((nNextX + 1) == a_pGBFieldSegment->GetStart())
  1352. {
  1353. //merge and return true
  1354. pSegmentHead->SetLength(pSegmentHead->GetLength() + a_pGBFieldSegment->GetLength());
  1355. return TRUE;
  1356. }
  1357. }
  1358. itr++;
  1359. }
  1360. //didn't merge return false
  1361. return FALSE;
  1362. }
  1363. // merge the segment,get new particles
  1364. BOOL CGBCalculate::GetGBParticles(COTSSegmentsList a_listGBFieldSegments, COTSParticleList &a_listNormalizedParticles)
  1365. {
  1366. //change segments to Particles
  1367. COTSFeatureList listFeatures;
  1368. if (a_listGBFieldSegments.size() == 0)
  1369. {
  1370. return FALSE;
  1371. }
  1372. GetFeatureList1(a_listGBFieldSegments, listFeatures);
  1373. ChangeFeaturelist(listFeatures, a_listNormalizedParticles);
  1374. for (auto p : a_listNormalizedParticles)
  1375. {
  1376. COTSImageProcess::CalcuParticleImagePropertes(p, PixSize);
  1377. }
  1378. return TRUE;
  1379. }
  1380. BOOL CGBCalculate::GetFeatureList1(COTSSegmentsList& a_listSegments, COTSFeatureList& a_listFeatures)
  1381. {
  1382. COTSSegmentsList listSegmentNew;
  1383. std::map<long, COTSSegmentsList > mapOneLineSegments;
  1384. for (auto s : a_listSegments)
  1385. {
  1386. mapOneLineSegments[s->GetHeight()].push_back(s);
  1387. }
  1388. std::map<long, COTSSegmentsList >::iterator lineItr = mapOneLineSegments.begin();//find the highest line
  1389. while (lineItr!=mapOneLineSegments.end ())
  1390. {
  1391. for (auto s = lineItr->second.begin(); s < lineItr->second.end(); )//find one segment of this line.
  1392. {
  1393. COTSSegmentPtr bottomSeg= *s;
  1394. listSegmentNew.clear();
  1395. listSegmentNew.push_back(*s);
  1396. s=lineItr->second.erase(s);
  1397. std::map<long, COTSSegmentsList >::iterator tempItr = lineItr;
  1398. tempItr++;
  1399. for (; tempItr !=mapOneLineSegments.end(); tempItr++)//find all other lines of segments
  1400. {
  1401. for (auto nextLineSegment = tempItr->second.begin(); nextLineSegment < tempItr->second.end();)//find next line's all segments
  1402. {
  1403. if (bottomSeg->UpDownConection(**nextLineSegment))
  1404. {
  1405. listSegmentNew.push_back(*nextLineSegment);
  1406. bottomSeg = *nextLineSegment;
  1407. nextLineSegment=tempItr->second.erase(nextLineSegment);
  1408. break;
  1409. }
  1410. if (tempItr->second.size() > 0)
  1411. {
  1412. nextLineSegment++;
  1413. }
  1414. else
  1415. {
  1416. break;
  1417. }
  1418. }
  1419. }
  1420. COTSFeaturePtr pFeature = COTSFeaturePtr(new COTSFeature());
  1421. pFeature->SetSegmentsList(listSegmentNew);
  1422. //check if this new feature is connected with other found feature.
  1423. COTSSegmentPtr topSeg = listSegmentNew[0];//find the toppest segment of this new feature.
  1424. COTSSegmentPtr bottomSegment= listSegmentNew[listSegmentNew.size()-1];//find the lowest segment of this new feature.
  1425. bool haveMerged=false;
  1426. for (auto f : a_listFeatures)
  1427. {
  1428. for (auto seg : f->GetSegmentsList())
  1429. {
  1430. if (bottomSegment->UpDownConection(*seg)|| topSeg->UpDownConection (*seg))
  1431. {
  1432. COTSSegmentsList segs = f->GetSegmentsList();
  1433. for (auto s : listSegmentNew)
  1434. {
  1435. segs.push_back(s);
  1436. }
  1437. f->SetSegmentsList(segs);
  1438. haveMerged = true;
  1439. break ;
  1440. }
  1441. }
  1442. if (haveMerged)
  1443. {
  1444. break;
  1445. }
  1446. }
  1447. if (!haveMerged)
  1448. {
  1449. a_listFeatures.push_back(pFeature);
  1450. }
  1451. if (lineItr->second.size()==0)
  1452. {
  1453. break;
  1454. }
  1455. }
  1456. lineItr++;
  1457. }
  1458. return true;
  1459. }
  1460. // change feature into particle
  1461. BOOL CGBCalculate::ChangeFeaturelist(COTSFeatureList& a_listFeatures, COTSParticleList& a_listParticle)
  1462. {
  1463. if (a_listFeatures.size() == 0)
  1464. {
  1465. LogErrorTrace(__FILE__, __LINE__, _T("ChangeFeaturelist: there is no feature in the list."));
  1466. return FALSE;
  1467. }
  1468. // compute Rect
  1469. for (auto pFeature : a_listFeatures)
  1470. {
  1471. COTSParticlePtr pParticle = COTSParticlePtr(new COTSParticle());
  1472. COTSFeaturePtr pFeatureNew = COTSFeaturePtr(new COTSFeature(*pFeature.get()));
  1473. pParticle->SetFeature(pFeatureNew);
  1474. if (!pParticle->CalCoverRect())
  1475. {
  1476. LogErrorTrace(__FILE__, __LINE__, _T("ChangeFeaturelist: failed to get particle rect."));
  1477. return FALSE;
  1478. }
  1479. a_listParticle.push_back(pParticle);
  1480. }
  1481. if ((int)a_listParticle.size() == 0)
  1482. {
  1483. LogErrorTrace(__FILE__, __LINE__, _T("Can't get particle."));
  1484. return FALSE;
  1485. }
  1486. return TRUE;
  1487. }
  1488. void CGBCalculate::SetPixSize(double p)
  1489. {
  1490. PixSize = p;
  1491. }
  1492. }