1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153 |
- #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(CALCULATE_TABLE_TYPE tableType)
- {
-
- CGBFieldList listCGBField;
-
- 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();
-
-
-
- if (tableType == CALCULATE_TABLE_TYPE::DIN)
- {
- CGBFieldDataPtr DINFld(new CGBFieldData());
-
- DINFld->CaculateLevelDIN(pSmplMsrResultFile->GetAllParticles());
- listGridData = this->GetGridDataListForOneDataSourceDIN(DINFld);//express these result data by grid
- }
- else
- {
- GB_METHODE_TYPE t;
- switch(tableType)
- {
- case CALCULATE_TABLE_TYPE::GB_Method1:
- t = GB_METHODE_TYPE::METHODE_1;
- break;
- case CALCULATE_TABLE_TYPE::GB_Method2:
- t= GB_METHODE_TYPE::METHODE_2;
- break;
- case CALCULATE_TABLE_TYPE::ASTM:
- t = GB_METHODE_TYPE::ASTM;
- break;
- default:
- t = GB_METHODE_TYPE::METHODE_1;
- break;
- }
- CGBFieldList listRawGBFields = CalGBFields(rstFileMgrPrt,t);
- CategoryGBInclutions(listRawGBFields, tableType);
- listCGBField = listRawGBFields;
- CGBGradeData gradeData = CGBGradeData(listCGBField);
- listGridData = this->GetGridDataListForOneDataSource(&gradeData, tableType);//express these result data by grid
- }
- multGridList.insert (multGridList.end (), listGridData.begin(), listGridData.end());
- }
- return multGridList;
- }
- void CGBCalculate::CategoryGBInclutions(CGBFieldList listCGBField, CALCULATE_TABLE_TYPE ty)
- {
-
- for (CGBFieldDataPtr GBFld : listCGBField)
- {
- switch (ty)
- {
-
- case CALCULATE_TABLE_TYPE::GB_Method1:
- GBFld->CategoryByMethod1();
- break;
- case CALCULATE_TABLE_TYPE::GB_Method2:
- GBFld->CategoryByMethod2();
- break;
- case CALCULATE_TABLE_TYPE::ASTM:
- GBFld->CategoryByASTM();
- break;
- default:
- break;
- }
- }
-
- }
- CGBFieldList CGBCalculate::GetTopGradeGBFieldsByIncCategory(CGBFieldList listGBFields, GBIncCategory incCategory)
- {
- CGBFieldList fields;
- CGBGradeData gradeData = CGBGradeData(listGBFields);
- GBGradeCell* categoryRow;
-
-
- switch (incCategory)
- {
- case GBIncCategory::AT:
- categoryRow = gradeData.ALevel;
-
- break;
- case GBIncCategory::AW:
- categoryRow = gradeData.ALevel_w;
- break;
- case GBIncCategory::AS:
- categoryRow = gradeData.ALevel_s;
- break;
- case GBIncCategory::BT:
- categoryRow = gradeData.BLevel;
- break;
- case GBIncCategory::BW:
- categoryRow = gradeData.BLevel_w;
- break;
- case GBIncCategory::BS:
- categoryRow = gradeData.BLevel_s;
- break;
- case GBIncCategory::CT:
- categoryRow = gradeData.CLevel;
- break;
- case GBIncCategory::CW:
- categoryRow = gradeData.CLevel_w;
- break;
- case GBIncCategory::CS:
- categoryRow = gradeData.CLevel_s;
- break;
- case GBIncCategory::DT:
- categoryRow = gradeData.DLevel;
- break;
- case GBIncCategory::DW:
- categoryRow = gradeData.DLevel_w;
- break;
- case GBIncCategory::DS:
- categoryRow = gradeData.DLevel_s;
- break;
- case GBIncCategory::DSulfideT:
- categoryRow = gradeData.DSulfideLevel;
- break;
- case GBIncCategory::DSulfideW:
- categoryRow = gradeData.DSulfideLevel_w;
- break;
- case GBIncCategory::DSulfideS:
- categoryRow = gradeData.DSulfideLevel_s;
- break;
- default:
- categoryRow = gradeData.DSulfideLevel_s;
- break;
- }
- for (int i = 10; i > 0; i--)//by invert searching ,the first none zero cell is the toppest grade of this category.
- {
- if (categoryRow[i].nFldNum > 0)
- {
- fields = categoryRow[i].GBFlds;
- break;
- }
- }
- return fields;
- }
- CGBFieldList CGBCalculate::GetAllGBFields(CALCULATE_TABLE_TYPE tableType)
- {
- CGBFieldList listGBFields;
-
- 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("+"));
- CGBFieldList fields;
- if (listSelectedDataSource.size() > 1) return fields;
- CSmplMsrResultFileMgrPtr rstFileMgrPrt = m_rptMgrPtr->GetASmplMsrResultMgrByFileName(listSelectedDataSource[0]);
- GB_METHODE_TYPE t;
- switch (tableType)
- {
- case CALCULATE_TABLE_TYPE::GB_Method1:
- t = GB_METHODE_TYPE::METHODE_1;
- break;
- case CALCULATE_TABLE_TYPE::GB_Method2:
- t = GB_METHODE_TYPE::METHODE_2;
- break;
- case CALCULATE_TABLE_TYPE::ASTM:
- t = GB_METHODE_TYPE::ASTM;
- break;
- default:
- t = GB_METHODE_TYPE::METHODE_1;
- break;
- }
- listGBFields = CalGBFields(rstFileMgrPrt, t);
- CategoryGBInclutions(listGBFields, tableType);
-
-
- return listGBFields;
-
-
- }
- CGridDatasList CGBCalculate::GetGridDataListForOneDataSource(CGBGradeData* gradeData, CALCULATE_TABLE_TYPE tableType)
- {
-
-
- CGridDatasList listGridData;
-
-
- 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", gradeData->ALevel, gradeData->ALevel_w, gradeData->ALevel_s);
-
- BGrid = GetGridLevel("B", gradeData->BLevel, gradeData->BLevel_w, gradeData->BLevel_s);
-
- CGrid = GetGridLevel("C", gradeData->CLevel, gradeData->CLevel_w, gradeData->CLevel_s);
-
- DGrid = GetGridLevel("D", gradeData->DLevel, gradeData->DLevel_w, gradeData->DLevel_s);
-
- DSGrid = GetGridDSLevel(gradeData);
-
- listGridData.push_back(AGrid);
- listGridData.push_back(BGrid);
- listGridData.push_back(CGrid);
- listGridData.push_back(DGrid);
- listGridData.push_back(DSGrid);
-
- return listGridData;
- break;
- case CALCULATE_TABLE_TYPE::GB_Method2:
-
- AGrid = GetGridLevel("A", gradeData->ALevel, gradeData->ALevel_w, gradeData->ALevel_s);
-
- BGrid = GetGridLevel("B", gradeData->BLevel, gradeData->BLevel_w, gradeData->BLevel_s);
-
- CGrid = GetGridLevel("C", gradeData->CLevel, gradeData->CLevel_w, gradeData->CLevel_s);
-
- DGrid = GetGridLevel("D", gradeData->DLevel, gradeData->DLevel_w, gradeData->DLevel_s);
- DSulfideGrid = GetGridLevel("DSulfide", gradeData->DSulfideLevel, gradeData->DSulfideLevel_w, gradeData->DSulfideLevel_s);
-
- DSGrid = GetGridDSLevel(gradeData);
-
- listGridData.push_back(AGrid);
- listGridData.push_back(BGrid);
- listGridData.push_back(CGrid);
- listGridData.push_back(DGrid);
- listGridData.push_back(DSulfideGrid);
- listGridData.push_back(DSGrid);
-
-
- return listGridData;
- break;
- case CALCULATE_TABLE_TYPE::ASTM:
- AGrid = GetGridLevel("A", gradeData->ALevel, gradeData->ALevel_w, gradeData->ALevel_s);
- BGrid = GetGridLevel("B", gradeData->BLevel, gradeData->BLevel_w, gradeData->BLevel_s);
- CGrid = GetGridLevel("C", gradeData->CLevel, gradeData->CLevel_w, gradeData->CLevel_s);
- DGrid = GetGridLevel("D", gradeData->DLevel, gradeData->DLevel_w, gradeData->DLevel_s);
- DSGrid = GetGridDSLevel(gradeData);
-
- listGridData.push_back(AGrid);
- listGridData.push_back(BGrid);
- listGridData.push_back(CGrid);
- listGridData.push_back(DGrid);
- listGridData.push_back(DSGrid);
-
- return listGridData;
- break;
- default:
- return listGridData;
- break;
- }
-
- }
- CGridDatasList CGBCalculate::GetGridDataListForOneDataSourceDIN(CGBFieldDataPtr DINFld)
- {
- CGridDatasList listGridData;
- CGBParticleList cGBparticlelistA;
- CGBParticleList cGBparticlelistB;
- CGBParticleList cGBparticlelistC;
- CGBParticleList cGBparticlelistD;
-
- cGBparticlelistA = DINFld->listAThinParticles;
- cGBparticlelistB = DINFld->listBThinParticles;
- cGBparticlelistC = DINFld->listCThinParticles;
- cGBparticlelistD = DINFld->listDThinParticles;
- CGridDataPtr AGrid;
- AGrid = GetGridDIN(cGBparticlelistA, cGBparticlelistB, cGBparticlelistC, cGBparticlelistD);
- listGridData.push_back(AGrid);
- return listGridData;
- }
-
- //get grid with level ABCD
- CGridDataPtr CGBCalculate::GetGridLevel(CString GridType, GBGradeCell a_nLevel[], GBGradeCell a_nLevel_w[], GBGradeCell 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");
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue("Thick");
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue("OverSize");
- listRows.push_back(pRow);
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- case 1:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "Width/um";
- 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].nFldNum);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(a_nLevel_w[i - 2].nFldNum);
- listRows.push_back(pRow);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::INT);
- pRow->SetIntValue(a_nLevel_s[i - 2].nFldNum);
- listRows.push_back(pRow);
- pColumn->SetGridRowsList(listRows);
- listCol.push_back(pColumn);
- break;
- }
- }
- pGridData->SetGridColumnList(listCol);
- return pGridData;
- }
- CGridDataPtr CGBCalculate::GetGridDSLevel(CGBGradeData* gradeData)
- {
- 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.";
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[0]);
- listCol.push_back(pColumn);
- break;
- case 1:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "Area/um2";
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[1]);
- listCol.push_back(pColumn);
- break;
- case 2:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "MaxFeret/um";
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[2]);
- listCol.push_back(pColumn);
- break;
- case 3:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "X/um";
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[3]);
- listCol.push_back(pColumn);
- break;
- case 4:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "Y/um";
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[4]);
- listCol.push_back(pColumn);
- break;
- case 5:
- pColumn = CGridColumnPtr(new CGridColumn());
- strName = "Grade";
- pColumn->SetName(strName);
- pColumn->SetGridRowsList(listRows[5]);
- listCol.push_back(pColumn);
- break;
- }
- }
-
-
-
-
- for (auto part : gradeData->allDSParts)
- {
- DisplayDSPartRow(part, listCol);
-
- }
-
-
- pGridData->SetGridColumnList(listCol);
- return pGridData;
- }
-
- //get grid with level ABCD
- CGridDataPtr CGBCalculate::GetGridDIN(CGBParticleList cotsparticlelistA, CGBParticleList cotsparticlelistB, CGBParticleList cotsparticlelistC, CGBParticleList 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, GB_METHODE_TYPE calType)
- {
- 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);
- // scan parameters
- CMsrParamsPtr pMsrParam = pOTSSample->GetMsrParams();
- //CMsrParamsPtr pMsrParam = pOTSSample->get
- COTSImageScanParamPtr pImgScanParam = pMsrParam->GetImageScanParam();
- CSize sizePixelImage = pImgScanParam->GetImageResolution();
- COTSImageProcessParamPtr pImgProcessParam = pMsrParam->GetImageProcessParam();
- double overlap = pImgProcessParam->GetOverlapParam();
- double scanfldsize = pEMDataMsrPtr->GetScanFieldSize();
- double pixelsize = scanfldsize / sizePixelImage.cx;
- // get field width
- int nOTSFieldWidth = pEMDataMsrPtr->GetScanFieldSize()-2*overlap;
- int nOTSFieldHeight = pEMDataMsrPtr->GetScanFieldHeight()-2*overlap;
- if (nOTSFieldWidth == 0 || nOTSFieldHeight==0)
- {
- LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: field width is zero ."));
- return m_listGBFields;
- }
-
-
- //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, pixelsize, nOTSFieldWidth, nOTSFieldHeight))
- {
- LogErrorTrace(__FILE__, __LINE__, _T("CalGBFields: call OTSFieldToGBField failed."));
- return m_listGBFields;
- }
- for (auto fld : m_listGBFields)
- {
- fld->SetCalcuType(calType);
- }
- return m_listGBFields;
- }
- // Turn OTSField to GBField
- BOOL CGBCalculate::OTSFieldToGBField(COTSFieldDataList allOTSFields, CGBFieldList* m_listGBFields,double pixelsize,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, pixelsize, 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,
- double pixelsize,
- 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)->SetOTSRect(fldRec);
- myOTSFields.push_back(*itr);
-
- itr++;
-
- continue;
- }
-
- itr++;
-
- }
-
- pGBFieldData = NormalizeParticlesAndIdentifyChemicalType(a_rectGBField, myOTSFields, pixelsize, nOTSFieldWidth, nOTSFieldHeight);
- pGBFieldData->myReleventOTSFlds = myOTSFields;
-
- return pGBFieldData;
- }
- // normalize particles for the GBFields
- CGBFieldDataPtr CGBCalculate::NormalizeParticlesAndIdentifyChemicalType(COTSRect a_rectGBField, COTSFieldDataList myOTSFields, double pixelsize, 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)
- {
- auto fldParts = OTSField->GetParticleList();
- for (auto part : fldParts)
- {
- CPoint fieldPos = OTSField->GetPosition();
-
- CPoint fieldTopLeft = OTSField->GetOTSRect().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);
-
- listNormalizedParticles.push_back(part);
- }
- }
-
- }
-
- // put new particle in the GB Field
- pGBFieldData->SetOTSParticleList(listNormalizedParticles);
- return pGBFieldData;
- }
-
- void CGBCalculate::SetPixSize(double p)
- {
- PixSize = p;
- }
- void CGBCalculate::DisplayDSPartRow(CGBParticlePtr part, CGridColumnsList listCol)
- {
- int columnNum = 6;
- CGridColumnPtr pColumn;
- 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->myOTSParts[0]->GetFieldId();
- partId = part->myOTSParts[0]->GetParticleId();
- 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::FLOAT);
- pRow->SetDoubleValue(part->myOTSParts[0]->GetSEMPos().x);
- pColumn->AddGridRow(pRow);
- break;
- case 4:
- pColumn = listCol.at(4);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::FLOAT);
- pRow->SetDoubleValue(part->myOTSParts[0]->GetSEMPos().y);
- pColumn->AddGridRow(pRow);
- break;
- case 5:
- pColumn = listCol.at(5);
- pRow = CGridRowPtr(new CGridRow());
- pRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
- pRow->SetStringValue(OTSGBCalculate::GetDSGrade(part->GetFeretDiameter()));
- pColumn->AddGridRow(pRow);
- break;
- }
- }
- }
- }
|