| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394 |
- #pragma once
- #include "stdafx.h"
- #include "CGBCalculate.h"
- #include "OTSFieldData.h"
- #include "GBImgPropCal.h"
- #include "OTSHelper.h"
- #include "OTSImageProcess.h"
- #include "CGBLevel.h"
- #include <GBFieldData.h>
- namespace OTSGBCalculate
- {
- using namespace OTSDATA;
- using namespace OTSIMGPROC;
- CGBCalculate::CGBCalculate(CReportMgr* rptMgrPtr)
- {
- m_rptMgrPtr = rptMgrPtr;
- }
- CGBCalculate::~CGBCalculate()
- {
- }
- // class methods
- // public
- CGridDatasList CGBCalculate::GetGBInclusion()
- {
-
- CGBFieldList listCGBField;
-
-
- COTSParticleList listOTSParticle;
- COTSParticlePtr pOTSParticle;
- CGBImgPropCal pGBImgPropCal;
- CGridDatasList listGridData;
- listGridData.clear();
- CGridDatasList multGridList;
- multGridList.clear();
- // depart compound source name
- CPropParamPtr currentProp = m_rptMgrPtr->GetPropertyParamForGrid();
- std::vector<CString> listDataSource = currentProp->GetDataSourceList();
- int nSelectedDataSourceIndex = currentProp->GetDataSourceId();
- CString sDataSourceNames = listDataSource[nSelectedDataSourceIndex];
- std::vector<CString> listSelectedDataSource = COTSHelper::SplitString(sDataSourceNames, _T("+"));
-
- for (auto strDataSourceName : listSelectedDataSource)
- {
- listCGBField.clear();
- CGridDataPtr pGridData = CGridDataPtr(new CGridData());
- // data source id
- std::vector<CString> listDataSource;
- listDataSource.clear();
- listDataSource = currentProp->GetDataSourceList();
- pGridData->SetDataSourceList(listDataSource);
- int nDataSourceId = currentProp->GetDataSourceId();
- pGridData->SetDataSourceId(nDataSourceId);
-
- CSmplMsrResultFileMgrPtr rstFileMgrPrt = m_rptMgrPtr->GetASmplMsrResultMgrByFileName(strDataSourceName);
-
-
- CSmplMsrResultFilePtr pSmplMsrResultFile = rstFileMgrPrt->GetSmplMsrResultFile();
- COTSSamplePtr pSample = pSmplMsrResultFile->GetSample();
-
- CGBFieldList listRawGBFields=CalGBFields(rstFileMgrPrt);
- listCGBField = listRawGBFields;
-
- CALCULATE_TABLE_TYPE ty = m_rptMgrPtr->GetPropertyParamForGrid()->GetCalTableType();
- if (ty == CALCULATE_TABLE_TYPE::DIN)
- {
- listGridData = this->GetGridDataListForOneDataSourceDIN(pSmplMsrResultFile->GetAllParticles(), ty);
- }
- else
- {
- listGridData = this->GetGridDataListForOneDataSource(listCGBField, ty);
- }
- multGridList.insert (multGridList.end (), listGridData.begin(), listGridData.end());
- }
- return multGridList;
- }
- CGridDatasList CGBCalculate::GetGridDataListForOneDataSource(CGBFieldList listCGBField, CALCULATE_TABLE_TYPE tableType)
- {
- CGridDatasList listGridData;
-
- //Definition numbers
- //use the nXLevel array to memory how many fields in each level.
- CONST int LEVEL_LENGTH = 11;
- 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 ;
- 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;
- int nALevel_s[LEVEL_LENGTH];
- 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;
- 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;
- int nBLevel_s[LEVEL_LENGTH];
- 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;
- 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;
- int nCLevel_s[LEVEL_LENGTH];
- 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;
- 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;
- int nDLevel_s[LEVEL_LENGTH];
- //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;
- //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;
- //int nDSLevel_s[LEVEL_LENGTH];
- 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;
- 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;
- int nDSulfideLevel_s[LEVEL_LENGTH];
- CGBFieldList listDSFrame;
- //initlize
- for (int i = 0; i < LEVEL_LENGTH; i++)
- {
- nALevel[i]= 0;
- nALevel_w[i] = 0;
- nALevel_s[i] = 0;
- nBLevel[i]=0;
- nBLevel_w[i] = 0;
- nBLevel_s[i]=0;
- nCLevel[i]=0;
- nCLevel_w[i]=0;
- nCLevel_s[i]=0;
- nDLevel[i]=0;
- nDLevel_w[i]=0;
- nDLevel_s[i] = 0;
- /*nDSLevel[i] = 0;
- nDSLevel_w[i] = 0;
- nDSLevel_s[i] = 0;*/
- nDSulfideLevel[i] = 0;
- nDSulfideLevel_w[i] = 0;
- nDSulfideLevel_s[i] = 0;
- }
-
- //loop CGBField list and cal the level numbers
- for (CGBFieldDataPtr GBFld : listCGBField)
- {
- //CalLevel mode
- switch (tableType)
- {
- case CALCULATE_TABLE_TYPE::GB_Method1:
- GBFld->CaculateLevelByMethod1();
- break;
- case CALCULATE_TABLE_TYPE::GB_Method2:
- GBFld->CaculateLevelByMethod2();
- break;
- case CALCULATE_TABLE_TYPE::ASTM:
- GBFld->CaculateLevelASTM();
- break;
- default:
- break;
- }
- //update the A class grid data
- GB_GRADE_TYPE levelt = GBFld->GetALevel()->GetThinGrade();
- GB_GRADE_TYPE levelw = GBFld->GetALevel()->GetWideGrade();
- GB_GRADE_TYPE levels = GBFld->GetALevel()->GetSuperGrade();
-
- SetFrameLevelNo(levelt, nALevel);
-
- SetFrameLevelNo(levelw, nALevel_w);
-
- SetFrameLevelNo(levels, nALevel_s);
- //update the B class grid data
- levelt = GBFld->GetBLevel()->GetThinGrade();
- levelw = GBFld->GetBLevel()->GetWideGrade();
- levels = GBFld->GetBLevel()->GetSuperGrade();
-
-
- SetFrameLevelNo(levelt, nBLevel);
-
- SetFrameLevelNo(levelw, nBLevel_w);
-
- SetFrameLevelNo(levels, nBLevel_s);
- //update the C class grid data
- levelt = GBFld->GetCLevel()->GetThinGrade();
- levelw = GBFld->GetCLevel()->GetWideGrade();
- levels = GBFld->GetCLevel()->GetSuperGrade();
-
-
- SetFrameLevelNo(levelt, nCLevel);
-
- SetFrameLevelNo(levelw, nCLevel_w);
-
- SetFrameLevelNo(levels, nCLevel_s);
- //update the D class grid data
- levelt = GBFld->GetDLevel()->GetThinGrade();
- levelw = GBFld->GetDLevel()->GetWideGrade();
- levels = GBFld->GetDLevel()->GetSuperGrade();
-
- SetFrameLevelNo(levelt, nDLevel);
-
- SetFrameLevelNo(levelw, nDLevel_w);
-
- SetFrameLevelNo(levels, nDLevel_s);
- //update the Ds class grid data
- /*levelt = GBFld->GetDSLevel()->GetThinGrade();
- levelw = GBFld->GetDSLevel()->GetWideGrade();
- levels = GBFld->GetDSLevel()->GetSuperGrade();
- SetFrameLevelNo(levelt, nDSLevel);
- SetFrameLevelNo(levelw, nDSLevel_w);
- SetFrameLevelNo(levels, nDSLevel_s);*/
- //update the Ds class grid data
- levelt = GBFld->GetDSulfideLevel()->GetThinGrade();
- levelw = GBFld->GetDSulfideLevel()->GetWideGrade();
- levels = GBFld->GetDSulfideLevel()->GetSuperGrade();
- SetFrameLevelNo(levelt, nDSulfideLevel);
- SetFrameLevelNo(levelw, nDSulfideLevel_w);
- SetFrameLevelNo(levels, nDSulfideLevel_s);
-
- }
- //Get ListGrid for Level
- //CalLevel mode
- CGridDataPtr AGrid;
- CGridDataPtr BGrid;
- CGridDataPtr CGrid;
- CGridDataPtr DGrid;
- CGridDataPtr DSulfideGrid;
- CGridDataPtr DSGrid;
- CGridDataPtr GBFieldGrid;
- switch (tableType)
- {
- case CALCULATE_TABLE_TYPE::GB_Method1:
-
- AGrid = GetGridLevel("A", nALevel, nALevel_w, nALevel_s);
-
- BGrid = GetGridLevel("B", nBLevel, nBLevel_w, nBLevel_s);
-
- CGrid = GetGridLevel("C", nCLevel, nCLevel_w, nCLevel_s);
-
- DGrid = GetGridLevel("D", nDLevel, nDLevel_w, nDLevel_s);
-
- DSGrid = GetGridDSLevel(listCGBField);
- GBFieldGrid = GetGBFieldGrid(listCGBField);
- listGridData.push_back(AGrid);
- listGridData.push_back(BGrid);
- listGridData.push_back(CGrid);
- listGridData.push_back(DGrid);
- listGridData.push_back(DSGrid);
- listGridData.push_back(GBFieldGrid);
- //listGridData
- return listGridData;
- break;
- case CALCULATE_TABLE_TYPE::GB_Method2:
-
- AGrid = GetGridLevel("A", nALevel, nALevel_w, nALevel_s);
-
- BGrid = GetGridLevel("B", nBLevel, nBLevel_w, nBLevel_s);
-
- CGrid = GetGridLevel("C", nCLevel, nCLevel_w, nCLevel_s);
-
- DGrid = GetGridLevel("D", nDLevel, nDLevel_w, nDLevel_s);
- DSulfideGrid = GetGridLevel("DSulfide", nDSulfideLevel, nDSulfideLevel_w, nDSulfideLevel_s);
-
- DSGrid = GetGridDSLevel(listCGBField);
- GBFieldGrid = GetGBFieldGrid(listCGBField);
- listGridData.push_back(AGrid);
- listGridData.push_back(BGrid);
- listGridData.push_back(CGrid);
- listGridData.push_back(DGrid);
- listGridData.push_back(DSulfideGrid);
- listGridData.push_back(DSGrid);
- listGridData.push_back(GBFieldGrid);
- //listGridData
- return listGridData;
- break;
- case CALCULATE_TABLE_TYPE::ASTM:
- AGrid = GetGridLevel("A", nALevel, nALevel_w, nALevel_s);
- BGrid = GetGridLevel("B", nBLevel, nBLevel_w, nBLevel_s);
- CGrid = GetGridLevel("C", nCLevel, nCLevel_w, nCLevel_s);
- DGrid = GetGridLevel("D", nDLevel, nDLevel_w, nDLevel_s);
- DSGrid = GetGridDSLevel(listCGBField);
- GBFieldGrid = GetGBFieldGrid(listCGBField);
- listGridData.push_back(AGrid);
- listGridData.push_back(BGrid);
- listGridData.push_back(CGrid);
- listGridData.push_back(DGrid);
- listGridData.push_back(DSGrid);
- listGridData.push_back(GBFieldGrid);
- //listGridData
- return listGridData;
- break;
- default:
- return listGridData;
- break;
- }
-
- }
- CGridDatasList CGBCalculate::GetGridDataListForOneDataSourceDIN(COTSParticleList listParticle, CALCULATE_TABLE_TYPE tableType )
- {
- CGridDatasList listGridData;
- COTSParticleList cotsparticlelistA;
- set<COTSParticlePtr> cotsparticlelistB;
- COTSParticleList cotsparticlelistC;
- COTSParticleList cotsparticlelistD;
- //loop CGBField list and cal the level numbers
- CGBFieldDataPtr GBFld(new CGBFieldData());
- GBFld->SetParticleList(listParticle, TRUE);
- GBFld->CaculateLevelDIN(listParticle);
- cotsparticlelistA = GBFld->listAThinParticles;
- cotsparticlelistB = GBFld->listBThinParticles;
- cotsparticlelistC = GBFld->listCThinParticles;
- cotsparticlelistD = GBFld->listDThinParticles;
- //Get ListGrid for Level
- //CalLevel mode
- CGridDataPtr AGrid;
- AGrid = GetGridDIN(cotsparticlelistA, cotsparticlelistB, cotsparticlelistC, cotsparticlelistD);
- listGridData.push_back(AGrid);
- //listGridData
- return listGridData;
- }
- //CGridDataPtr CGBFieldMgr::GetGBFieldGrid(CGBFieldList listCGBField, CGridInPtr a_pGridIn);
- CGridDataPtr CGBCalculate::GetGBFieldGrid(CGBFieldList listCGBField)
- {
- CGridDataPtr pGridData = CGridDataPtr(new CGridData());
- std::vector<CString> listDataSource;
- listDataSource.clear();
- listDataSource = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceList();
- pGridData->SetDataSourceList(listDataSource);
- int nDataSourceId = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceId();
- pGridData->SetDataSourceId(nDataSourceId);
- //amounts
- CGridColumnsList listCol;
- listCol.clear();
- int columnNum = 11;//表格总列数 fieldpos 占2列,ABCDDS 占5列,particle占1列,particle 类别占1列,particle宽度占1列
- CGridColumnPtr pColumn;
- for (int i = 0; i < columnNum; i++)
- {
- CString strName;
- CGridRowsList listRows;
- CGridRowPtr pRow;
- switch (i)
- {
- case 0:
- pColumn = CGridColumnPtr(new CGridColumn());
- pColumn->SetName("FieldPosX");
- for (auto GBF : listCGBField)
- {
- for (auto p : GBF->GetParticleList())
- {
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(GBF->GetPosition().x);
- listRows.push_back(pRow);
- }
- }
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 1:
- pColumn = CGridColumnPtr(new CGridColumn());
- pColumn->SetName("FieldPosY");
- for (auto GBF : listCGBField)
- {
- for (auto p : GBF->GetParticleList())
- {
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(GBF->GetPosition().y);
- listRows.push_back(pRow);
- }
- }
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 2:
- pColumn = CGridColumnPtr(new CGridColumn());
- pColumn->SetName("ALevel");
- for (auto GBF : listCGBField)
- {
- for (auto p : GBF->GetParticleList())
- {
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
- std::string Athin, Awide, Asuper;
- auto Alevel = GBF->GetALevel();
- auto thin = Alevel->GetThinGrade();
- Athin = GetLevelStr(thin);
- Awide = GetLevelStr(Alevel->GetWideGrade());
- Asuper = GetLevelStr(Alevel->GetSuperGrade());
- pRow->SetStringValue((Athin + "," + Awide + "," + Asuper).c_str());
- listRows.push_back(pRow);
- }
- }
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 3:
- pColumn = CGridColumnPtr(new CGridColumn());
- pColumn->SetName("BLevel");
- for (auto GBF : listCGBField)
- {
- for (auto p : GBF->GetParticleList())
- {
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
- std::string thin, wide, super;
- auto level = GBF->GetBLevel();
-
- thin = GetLevelStr(level->GetThinGrade());
- wide = GetLevelStr(level->GetWideGrade());
- super = GetLevelStr(level->GetSuperGrade());
- pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
- listRows.push_back(pRow);
- }
- }
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 4:
- pColumn = CGridColumnPtr(new CGridColumn());
- pColumn->SetName("CLevel");
- for (auto GBF : listCGBField)
- {
- for (auto p : GBF->GetParticleList())
- {
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
- std::string thin, wide, super;
- auto level = GBF->GetCLevel();
- thin = GetLevelStr(level->GetThinGrade());
- wide = GetLevelStr(level->GetWideGrade());
- super = GetLevelStr(level->GetSuperGrade());
- pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
- listRows.push_back(pRow);
- }
- }
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 5:
- pColumn = CGridColumnPtr(new CGridColumn());
- pColumn->SetName("DLevel");
- for (auto GBF : listCGBField)
- {
- for (auto p : GBF->GetParticleList())
- {
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
- std::string thin, wide, super;
- auto level = GBF->GetDLevel();
- thin = GetLevelStr(level->GetThinGrade());
- wide = GetLevelStr(level->GetWideGrade());
- super = GetLevelStr(level->GetSuperGrade());
- pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
- listRows.push_back(pRow);
- }
- }
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 6:
- pColumn = CGridColumnPtr(new CGridColumn());
- pColumn->SetName("DSLevel");
- for (auto GBF : listCGBField)
- {
- for (auto p : GBF->GetParticleList())
- {
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
- std::string thin, wide, super;
- auto level = GBF->GetDSLevel();
- thin = GetLevelStr(level->GetThinGrade());
- wide = GetLevelStr(level->GetWideGrade());
- super = GetLevelStr(level->GetSuperGrade());
- pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
- listRows.push_back(pRow);
- }
- }
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 7:
- pColumn = CGridColumnPtr(new CGridColumn());
- pColumn->SetName("DSulfideLevel");
- for (auto GBF : listCGBField)
- {
- for (auto p : GBF->GetParticleList())
- {
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING );
- std::string thin, wide, super;
- auto level = GBF->GetDSulfideLevel();
- thin = GetLevelStr(level->GetThinGrade());
- wide = GetLevelStr(level->GetWideGrade());
- super = GetLevelStr(level->GetSuperGrade());
- pRow->SetStringValue((thin + "," + wide + "," + super).c_str());
- listRows.push_back(pRow);
- }
- }
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 8:
- pColumn = CGridColumnPtr(new CGridColumn());
- pColumn->SetName("Particle");
- for (auto GBF : listCGBField)
- {
- for (auto p : GBF->GetParticleList())
- {
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetParticle(p);
- listRows.push_back(pRow);
- }
- }
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 9:
- pColumn = CGridColumnPtr(new CGridColumn());
- pColumn->SetName("ParticleGBClass");
- for (auto GBF : listCGBField)
- {
- for (auto p : GBF->GetParticleList())
- {
- int l = (int)GBF->mapAllParticles[p].myType;
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(l);
- listRows.push_back(pRow);
- }
- }
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 10:
- pColumn = CGridColumnPtr(new CGridColumn());
- pColumn->SetName("ParticleGBWidthClass");
- for (auto GBF : listCGBField)
- {
- for (auto p : GBF->GetParticleList())
- {
- int w = (int)GBF->mapAllParticles[p].myWidth;
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(w);
- listRows.push_back(pRow);
- }
- }
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- default:
- break;
- }
- }
- pGridData->SetGridColumnList(listCol);
- return pGridData;
-
- }
- std::string CGBCalculate::GetLevelStr(GB_GRADE_TYPE l)
- {
- std::string s;
- switch (l)
- {
- case GB_GRADE_TYPE::POINT_0_0 :
- s = "0";
- break;
- case GB_GRADE_TYPE::POINT_0_5:
- s = "0.5";
- break;
- case GB_GRADE_TYPE::POINT_1_0:
- s = "1";
- break;
- case GB_GRADE_TYPE::POINT_1_5:
- s = "1.5";
- break;
- case GB_GRADE_TYPE::POINT_2_0:
- s = "2";
- break;
- case GB_GRADE_TYPE::POINT_2_5:
- s = "2.5";
- break;
- case GB_GRADE_TYPE::POINT_3_0:
- s = "3";
- break;
- case GB_GRADE_TYPE::POINT_3_5:
- s = "3.5";
- break;
- case GB_GRADE_TYPE::POINT_4_0:
- s = "4";
- break;
- case GB_GRADE_TYPE::POINT_4_5:
- s = "4.5";
- break;
- case GB_GRADE_TYPE::POINT_5_0:
- s = "5";
- break;
- default:
- s = "0";
- break;
- }
- return s;
- }
- //get grid with level ABCD
- CGridDataPtr CGBCalculate::GetGridLevel(CString GridType,int a_nLevel[], int a_nLevel_w[], int a_nLevel_s[])
- {
- CGridDataPtr pGridData = CGridDataPtr(new CGridData());
- std::vector<CString> listDataSource;
- listDataSource.clear();
- listDataSource = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceList();
- pGridData->SetDataSourceList(listDataSource);
- int nDataSourceId = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceId();
- pGridData->SetDataSourceId(nDataSourceId);
- //amounts
- CGridColumnsList listCol;
- listCol.clear();
- int columnNum = 11 + 1 + 1;//表格总列数 12个级别再加上前面的“分类”列和“宽度/um”列
- CGridColumnPtr pColumn;
- for (int i=0;i< columnNum;i++)
- {
- CString strName;
- CGridRowsList listRows;
- CGridRowPtr pRow;
- CString strWidthName1, strWidthName2, strWidthName3;
- switch( i)
- {
- case 0:
- pColumn = CGridColumnPtr(new CGridColumn());
-
- //strName = MultiLang::GetInstance ().GetCStringByKey (GBStr1);
- strName = "Class";
- pColumn->SetName(strName);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue("Thin"); //MultiLang::GetInstance().GetCStringByKey(GBStr2)
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue("Thick"); //MultiLang::GetInstance().GetCStringByKey(GBStr3)
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue("OverSize"); //MultiLang::GetInstance().GetCStringByKey(GBStr4)
- listRows.push_back(pRow);
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 1:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "Width/um"; //MultiLang::GetInstance().GetCStringByKey(GBStr5);
- pColumn->SetName(strName);
- if (GridType == "A")
- {
- strWidthName1 = "2.0~4.0";
- strWidthName2 = "4.0~12.0";
- strWidthName3 = ">12.0";
- }
- if (GridType == "B")
- {
- strWidthName1 = "2.0~9.0";
- strWidthName2 = "9.0~15.0";
- strWidthName3 = ">15.0";
- }
- if (GridType == "C")
- {
- strWidthName1 = "2.0~5.0";
- strWidthName2 = "5.0~12.0";
- strWidthName3 = ">12.0";
- }
- if (GridType == "D")
- {
- strWidthName1 = "2.0~8.0";
- strWidthName2 = "8.0~13.0";
- strWidthName3 = ">13.0";
- }
- if (GridType == "DSulfide")
- {
- strWidthName1 = "2.0~8.0";
- strWidthName2 = "8.0~13.0";
- strWidthName3 = ">13.0";
- }
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue(strWidthName1);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue(strWidthName2);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue(strWidthName3);
- listRows.push_back(pRow);
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- default:
- pColumn = CGridColumnPtr(new CGridColumn());
- CString name;
- name.Format(_T("%.1f"), (i - 2) / 2.0);//i=2 输出0 i=3 输出0.5 i=4 输出1 以此类推
- pColumn->SetName(name);
- CGridRowsList listRows;
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(a_nLevel[i - 2]);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(a_nLevel_w[i - 2]);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(a_nLevel_s[i - 2]);
- listRows.push_back(pRow);
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- }
- }
- pGridData->SetGridColumnList(listCol);
- return pGridData;
- }
- CGridDataPtr CGBCalculate::GetGridDSLevel(CGBFieldList listCGBField)
- {
- CGridDataPtr pGridData = CGridDataPtr(new CGridData());
- std::vector<CString> listDataSource;
- listDataSource.clear();
- listDataSource = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceList();
- pGridData->SetDataSourceList(listDataSource);
- int nDataSourceId = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceId();
- pGridData->SetDataSourceId(nDataSourceId);
- //amounts
- CGridColumnsList listCol;
- listCol.clear();
- int columnNum = 6;
- CGridColumnPtr pColumn;
- for (int i = 0; i < columnNum; i++)
- {
- CString strName;
- CGridRowsList listRows[6];
- CGridRowPtr pRow;
- CString strWidthName1, strWidthName2, strWidthName3;
- switch (i)
- {
- case 0:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "No."; //MultiLang::GetInstance().GetCStringByKey(GBStr6);
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[0]);
- listCol.push_back(pColumn);
- break;
- case 1:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "Area/um2"; //MultiLang::GetInstance().GetCStringByKey(GBStr7);
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[1]);
- listCol.push_back(pColumn);
- break;
- case 2:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "MaxFeret/um";// MultiLang::GetInstance().GetCStringByKey(GBStr8);
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[2]);
- listCol.push_back(pColumn);
- break;
- case 3:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "X/mm";
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[3]);
- listCol.push_back(pColumn);
- break;
- case 4:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "Y/mm";
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[4]);
- listCol.push_back(pColumn);
- break;
- case 5:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "Grade";// MultiLang::GetInstance().GetCStringByKey(GBStr9);
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[5]);
- listCol.push_back(pColumn);
- break;
- }
- }
- for (CGBFieldDataPtr frame : listCGBField)
- {
- auto dsparticles = frame->listDSParticles;
- for (auto part : dsparticles)
- {
- for (int i = 0; i < columnNum; i++)
- {
- CString strName;
- CGridRowsList listRows;
- CGridRowPtr pRow;
- CString strWidthName1, strWidthName2, strWidthName3;
- CString idstr;
- int fldid;
- int partId;
- switch (i)
- {
- case 0:
- pColumn = listCol.at(0);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- fldid = part->GetFieldId();
- partId = part->GetTagId();
-
- idstr.Format("%d_%d", fldid,partId);
-
- pRow->SetStringValue(idstr);
- pColumn->AddGridRow(pRow);
- break;
- case 1:
- pColumn = listCol.at(1);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(part->GetActualArea());
- pColumn->AddGridRow(pRow);
- break;
- case 2:
- pColumn = listCol.at(2);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
- pRow->SetDoubleValue(part->GetFeretDiameter());
- pColumn->AddGridRow(pRow);
- break;
- case 3:
- pColumn = listCol.at(3);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(part->GetAbsolutPos().x);
- pColumn->AddGridRow(pRow);
- break;
- case 4:
- pColumn = listCol.at(4);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(part->GetAbsolutPos().y);
- pColumn->AddGridRow(pRow);
- break;
- case 5:
- pColumn = listCol.at(5);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue((int)OTSGBCalculate::GetDSGrade(part->GetFeretDiameter()));
- pColumn->AddGridRow(pRow);
- break;
- }
- }
- }
-
- }
- pGridData->SetGridColumnList(listCol);
- return pGridData;
- }
-
- //get grid with level ABCD
- CGridDataPtr CGBCalculate::GetGridDIN(COTSParticleList cotsparticlelistA, set<COTSParticlePtr> cotsparticlelistB, COTSParticleList cotsparticlelistC, COTSParticleList cotsparticlelistD)
- {
- CGridDataPtr pGridData = CGridDataPtr(new CGridData());
- std::vector<CString> listDataSource;
- listDataSource.clear();
- listDataSource = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceList();
- pGridData->SetDataSourceList(listDataSource);
- int nDataSourceId = m_rptMgrPtr->GetPropertyParamForGrid()->GetDataSourceId();
- pGridData->SetDataSourceId(nDataSourceId);
- //amounts
- CGridColumnsList listCol;
- listCol.clear();
- int columnNum = 12;//表格总列数 11个级别再加上前面的“分类”列
- CGridColumnPtr pColumn;
- int levA[9] = { 0,0,0,0,0,0,0,0,0 };
- int levB[9] = { 0,0,0,0,0,0,0,0,0 };
- int levC[9] = { 0,0,0,0,0,0,0,0,0 };
- int levD[9] = { 0,0,0,0,0,0,0,0,0 };
- double fg[9] = { 0.05,0.1,0.2,0.5,1,2,5,10,20 };
- //指数
- double ka = 0, kb = 0, kc = 0, kd = 0;
- //统计不同大小颗粒出现次数
- for (auto pParticle : cotsparticlelistA)
- {
- double area = pParticle->GetActualArea();
- for (int i = 0; i < 8; i++)
- {
- if (area >= fg[i] && area < fg[i + 1])
- {
- levA[i] += 1;
- ka = ka + fg[i];
- }
- }
- if (area >= fg[8])
- {
- levA[8] += 1;
- ka = ka + fg[8];
- }
- }
- for (auto pParticle : cotsparticlelistB)
- {
- double area = pParticle->GetActualArea();
- for (int i = 0; i < 8; i++)
- {
- if (area >= fg[i] && area < fg[i + 1])
- {
- levB[i] += 1;
- kb = kb + fg[i];
- }
- }
- if (area >= fg[8])
- {
- levB[8] += 1;
- kb = kb + fg[8];
- }
- }
- for (auto pParticle : cotsparticlelistC)
- {
- double area = pParticle->GetActualArea();
- for (int i = 0; i < 8; i++)
- {
- if (area >= fg[i] && area < fg[i + 1])
- {
- levC[i] += 1;
- kc = kc + fg[i];
- }
- }
- if (area >= fg[8])
- {
- levC[8] += 1;
- kc = kc + fg[8];
- }
- }
- for (auto pParticle : cotsparticlelistD)
- {
- double area = pParticle->GetActualArea();
- for (int i = 0; i < 8; i++)
- {
- if (area >= fg[i] && area < fg[i + 1])
- {
- levD[i] += 1;
- kd = kd + fg[i];
- }
- }
- if (area >= fg[8])
- {
- levD[8] += 1;
- kd = kd + fg[8];
- }
- }
- double to = kb + kc + kd;
- for (int i = 0; i < columnNum; i++)
- {
- CString strName;
- CGridRowsList listRows;
- CGridRowPtr pRow;
- CString strWidthName1, strWidthName2, strWidthName3, strWidthName4;
- switch (i)
- {
- case 0:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "Class";
- pColumn->SetName(strName);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue("SS");
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue("OA");
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue("OS");
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue("OG");
- listRows.push_back(pRow);
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 10:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "S";
- pColumn->SetName(strName);
- strWidthName1.Format(_T("%lf"), ka);
- strWidthName2 = "";
- strWidthName3 = "";
- strWidthName4 = "";
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
- pRow->SetDoubleValue(ka);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
- pRow->SetDoubleValue(0);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
- pRow->SetDoubleValue(0);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
- pRow->SetDoubleValue(0);
- listRows.push_back(pRow);
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 11:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "O";
- pColumn->SetName(strName);
- strWidthName1.Format(_T("%lf"), to);
- strWidthName2 = "";
- strWidthName3 = "";
- strWidthName4 = "";
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
- pRow->SetDoubleValue(0);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
- pRow->SetDoubleValue(kb);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
- pRow->SetDoubleValue(kc);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
- pRow->SetDoubleValue(kd);
- listRows.push_back(pRow);
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- default:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName.Format("%d", i - 1);
- pColumn->SetName(strName);
- CGridRowsList listRows;
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(levA[i - 1]);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(levB[i - 1]);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(levC[i - 1]);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(levD[i - 1]);
- listRows.push_back(pRow);
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- }
- }
- pGridData->SetGridColumnList(listCol);
- return pGridData;
- }
- void CGBCalculate::SetFrameLevelNo(GB_GRADE_TYPE a_level, int a_nLevel[])
- {
- a_nLevel[(int)a_level] += 1;
-
- }
-
- // calculate GB fields
- CGBFieldList CGBCalculate::CalGBFields(CSmplMsrResultFileMgrPtr pSmplMgr)
- {
- CGBFieldList m_listGBFields;
- m_listGBFields.clear();
- ASSERT(pSmplMgr);
- CSmplMsrResultFilePtr pSmplMsrResultFile = pSmplMgr->GetSmplMsrResultFile();
- ASSERT(pSmplMsrResultFile);
-
- COTSSamplePtr pOTSSample = pSmplMsrResultFile->GetSample();
- ASSERT(pOTSSample);
-
- CSEMDataMsrPtr pEMDataMsrPtr = pOTSSample->GetSEMDataMsr();
- ASSERT(pEMDataMsrPtr);
-
- // get field width
- int nOTSFieldWidth = pEMDataMsrPtr->GetScanFieldSize();
- int nOTSFieldHeight = pEMDataMsrPtr->GetScanFieldHeight();
- if (nOTSFieldWidth == 0 || nOTSFieldHeight==0)
- {
- LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: field width is zero ."));
- return m_listGBFields;
- }
-
- // scan parameters
- CMsrParamsPtr pMsrParam = pOTSSample->GetMsrParams();
- //CMsrParamsPtr pMsrParam = pOTSSample->get
- COTSImageScanParamPtr pImgScanParam = pMsrParam->GetImageScanParam();
-
- CSize sizePixelImage = pImgScanParam->GetImageResolution();
- //use OTSField width cal the OTSField height
-
- //get OTSfilds list
- COTSFieldDataList allOTSFields;
- allOTSFields = pSmplMsrResultFile->GetFieldData();
- // convert ots fields to gb fields
- if (!OTSFieldToGBField( allOTSFields, &m_listGBFields, sizePixelImage, nOTSFieldWidth, nOTSFieldHeight))
- {
- LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: call OTSFieldToGBField failed."));
- return m_listGBFields;
- }
- return m_listGBFields;
- }
- // Turn OTSField to GBField
- BOOL CGBCalculate::OTSFieldToGBField(COTSFieldDataList allOTSFields, CGBFieldList* m_listGBFields,CSize sizePixelImage,int nOTSFieldWidth,int nOTSFieldHeight)
- {
-
- if (allOTSFields.empty())
- {
- LogTrace(__FILE__, __LINE__, _T("CalGBFields: listOTSFields is empty ."));
- return TRUE;
- }
- // get topleft point and bottomright point of the measurement convered area
- CPoint pointTopleft, pointBottomright;
- pointTopleft = pointBottomright = allOTSFields[0]->GetPosition();
- //判断有效区域
- for (unsigned int i = 0; i< allOTSFields.size(); i++)
- {
- //get current OTSField Position,the position is in the center of the field
- CPoint poiOTSFieldPosition = allOTSFields[i]->GetPosition();
- pointTopleft.x = min(poiOTSFieldPosition.x, pointTopleft.x);
- pointTopleft.y = max(poiOTSFieldPosition.y, pointTopleft.y);
- pointBottomright.x = max(poiOTSFieldPosition.x, pointBottomright.x);
- pointBottomright.y = min(poiOTSFieldPosition.y, pointBottomright.y);
- }
- pointTopleft.x -= nOTSFieldWidth / 2;
- pointTopleft.y += nOTSFieldHeight / 2;
- pointBottomright.x+= nOTSFieldWidth / 2;
- pointBottomright.y-= nOTSFieldHeight / 2;
- double totalWidth = pointBottomright.x - pointTopleft.x;
- double totalHeight = pointTopleft.y - pointBottomright.y;
- int nPossibleGBFieldRowNum = totalHeight /GB_FIELD_WIDTH+0.5;//可能有的国标field行数
- int nPossibleGBFieldColNum = totalWidth / GB_FIELD_WIDTH+0.5;//列数
- //get possible OTSFields
- m_listGBFields->clear();
- CPoint pointGBFieldPosition;
- for (int i = 0; i < nPossibleGBFieldRowNum; i++)
- {
- for (int j = 0; j < nPossibleGBFieldColNum; j++)
- {
-
- // cal GB field rectangle
- CPoint poiCurGBFieldTopLeft, poiCurGBFieldBottomRight;
- poiCurGBFieldTopLeft = pointTopleft;
- //获得左上角的坐标
- poiCurGBFieldTopLeft.x += j * GB_FIELD_WIDTH;
- poiCurGBFieldTopLeft.y -= i * GB_FIELD_WIDTH;
- //获得右下角的坐标
- poiCurGBFieldBottomRight.x = poiCurGBFieldTopLeft.x + GB_FIELD_WIDTH;
- poiCurGBFieldBottomRight.y = poiCurGBFieldTopLeft.y - GB_FIELD_WIDTH;
- COTSRect rectGBField(poiCurGBFieldTopLeft, poiCurGBFieldBottomRight);
-
- CGBFieldDataPtr pGBFieldData;
-
-
- pGBFieldData = GetOneGBField(rectGBField, allOTSFields, sizePixelImage, nOTSFieldWidth, nOTSFieldHeight);
- if (!pGBFieldData)
- {
- continue;
- }
-
-
-
- CPoint poiNewPosition=rectGBField.GetCenterPoint();
-
-
- pGBFieldData->SetPosition(poiNewPosition);
- // add the GBField into the GBFields list
- m_listGBFields->push_back(pGBFieldData);
-
- }
- }
- // ok, return TRUE
- return TRUE;
- }
- // Custom collation rules
- BOOL comp(const COTSFieldDataPtr &a, const COTSFieldDataPtr &b)
- {
- if (a->GetPosition().y <= b->GetPosition().y)
- {
- if (a->GetPosition().y == b->GetPosition().y)
- {
- if (a->GetPosition().x < b->GetPosition().x)
- {
- return TRUE;
- }
- }
- else {
- return TRUE;
- }
- }
- return FALSE;
- }
- // get the GB field within a rectangle
- CGBFieldDataPtr CGBCalculate::GetOneGBField(COTSRect a_rectGBField,
- COTSFieldDataList& allOTSFields,
- CSize a_sizePixelImage,
- int nOTSFieldWidth, int nOTSFieldHeight)
- {
- // GB Field handle
- CGBFieldDataPtr pGBFieldData = nullptr;
- // get OTS fields within the rectangle
- COTSFieldDataList myOTSFields;
- myOTSFields.clear();
- COTSFieldDataList::iterator itr = allOTSFields.begin();
- while (itr != allOTSFields.end())
- {
- // get an OTS field
- CPoint poiOTSField = (*itr)->GetPosition();
-
- COTSRect fldRec = COTSRect(poiOTSField.x - nOTSFieldWidth / 2, poiOTSField.y + nOTSFieldHeight / 2, poiOTSField.x + nOTSFieldWidth / 2, poiOTSField.y - nOTSFieldHeight / 2);
-
- if (a_rectGBField.IntersectOtherRect( fldRec))
- {
-
-
- (*itr)->SetRect(fldRec);
- myOTSFields.push_back(*itr);
-
- itr++;
-
- continue;
- }
-
- itr++;
-
- }
-
- pGBFieldData = NormalizeParticles(a_rectGBField, myOTSFields, a_sizePixelImage, nOTSFieldWidth, nOTSFieldHeight);
- pGBFieldData->myReleventOTSFlds = myOTSFields;
-
- return pGBFieldData;
- }
- // normalize particles for the GBFields
- CGBFieldDataPtr CGBCalculate::NormalizeParticles(COTSRect a_rectGBField, COTSFieldDataList myOTSFields, CSize a_sizePixelImage, int nFieldWidth,int nFieldHeight)
- {
- // inits
- CGBFieldDataPtr pGBFieldData(new CGBFieldData);
- pGBFieldData->SetMyRect(a_rectGBField);
- COTSParticleList listNormalizedParticles;
-
- CPoint pointGBFieldRectTopLeft = a_rectGBField.GetTopLeft();
- COTSRect GBRect = a_rectGBField;
- int nBeforeCalNo = 0;
- int nAfterCalNo = 0;
- for (auto OTSField : myOTSFields)
- {
- for (auto part : OTSField->GetParticleList())
- {
- CPoint fieldPos = OTSField->GetPosition();
- //CPoint fieldTopLeft = CPoint(fieldPos.x - nFieldWidth / 2, fieldPos.y + nFieldHeight/2);
- CPoint fieldTopLeft = OTSField->GetRect().GetTopLeft();
- double fwidth = nFieldWidth;
- double pixelsize = fwidth / a_sizePixelImage.cx;
- CPoint xrayPosInFieldByPixel= part->GetXRayPos();
- CPoint partPos = CPoint(fieldTopLeft.x + xrayPosInFieldByPixel.x * pixelsize, fieldTopLeft.y - xrayPosInFieldByPixel.y * pixelsize);
-
- if (GBRect.PointInRect(partPos))
- {
- CRect rectInSinglefld = part->GetParticleRect();
- CPoint OTSLeftTop = CPoint(fieldTopLeft.x + rectInSinglefld.left * pixelsize, fieldTopLeft.y - rectInSinglefld.top * pixelsize);
- CPoint OTSRightBottom = CPoint(fieldTopLeft.x + rectInSinglefld.right * pixelsize, fieldTopLeft.y - rectInSinglefld.bottom * pixelsize);
- COTSRect recInOTSCord = COTSRect(OTSLeftTop, OTSRightBottom);
- part->SetOTSRect(recInOTSCord);
- pGBFieldData->IdentifyPartChemicalType(part);
- listNormalizedParticles.push_back(part);
- }
- }
-
- }
-
- // put new particle in the GB Field
- pGBFieldData->SetParticleList(listNormalizedParticles);
- return pGBFieldData;
- }
-
- void CGBCalculate::SetPixSize(double p)
- {
- PixSize = p;
- }
- }
|