MeasureResultInfo.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. #include "stdafx.h"
  2. #include "MeasureResultInfo.h"
  3. #include "OTSFileSys.h"
  4. #include "OTSHelper.h"
  5. #include "PropParam.h"
  6. #include "ReportProjFile.h"
  7. #include "SmplMsrResultFileMgr.h"
  8. //#include "GridIn.h"
  9. #include "GridData.h"
  10. #include<math.h>
  11. #include<list>
  12. #include "MultiLang.h"
  13. //测量结果信息表格
  14. namespace OTSMODEL
  15. {
  16. using namespace std;
  17. MeasureResultInfo::MeasureResultInfo(CReportProjFileMgr* rptMgrPtr)
  18. {
  19. m_RptMgrPtr = rptMgrPtr;
  20. }
  21. MeasureResultInfo::~MeasureResultInfo()
  22. {
  23. }
  24. CGridDatasList MeasureResultInfo::GetMeasureResultInfo()
  25. {
  26. // use the dll resource
  27. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  28. CGridDatasList listGridData;
  29. listGridData.clear();
  30. // depart compound source name
  31. std::vector<int> listWorkIndex;
  32. std::vector<int> listPos;
  33. //std::vector<CString> listDataSourceOut = m_rptMgrPtr->GetFullDataSource(a_pGridIn, listWorkIndex, listPos);
  34. std::vector<CString> listDataSource = m_RptMgrPtr->GetCurrentPropParam()->GetDataSourceList();
  35. int nSelectedDataSourceIndex = m_RptMgrPtr->GetCurrentPropParam()->GetDataSourceId();
  36. CString sDataSourceNames = listDataSource[nSelectedDataSourceIndex];
  37. std::vector<CString> listSelectedDataSource = COTSHelper::SplitString(sDataSourceNames, _T("+"));
  38. for (auto strDataSourceName : listSelectedDataSource)
  39. {
  40. CGridDataPtr pGridData = CGridDataPtr(new CGridData());
  41. // data source id
  42. std::vector<CString> listDataSource;
  43. listDataSource.clear();
  44. listDataSource = m_RptMgrPtr->GetCurrentPropParam()->GetDataSourceList();
  45. pGridData->SetDataSourceList(listDataSource);
  46. int nDataSourceId = m_RptMgrPtr->GetCurrentPropParam()->GetDataSourceId();
  47. pGridData->SetDataSourceId(nDataSourceId);
  48. int nColumnNum = 2;
  49. CGridColumnsList listGridColumn;
  50. for (int i = 0; i < nColumnNum; i++)
  51. {
  52. CGridColumnPtr pColumn = CGridColumnPtr(new CGridColumn);
  53. CGridRowsList listGridRows;
  54. listGridRows.clear();
  55. switch (i)
  56. {
  57. case (int)REPORT_MEASURE_RESULT_INFO_GRID_CLUMN::NAME:
  58. {
  59. pColumn->SetName("infoName");
  60. listGridRows.clear();
  61. std::list<CString> listMsrResultReport;
  62. for (int i = 0; i < RESULT_INFOR_STRING_NUMBER; i++)
  63. {
  64. CString str;
  65. str=MultiLang::GetInstance ().GetCStringByKey (IDS_RESULT_INFOR_NAME_FIRST + i);
  66. listMsrResultReport.push_back(str);
  67. }
  68. list<CString>::iterator it;
  69. for (it = listMsrResultReport.begin(); it != listMsrResultReport.end(); it++)
  70. {
  71. CGridRowPtr pGridRow = CGridRowPtr(new CGridRow());
  72. pGridRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  73. pGridRow->SetStringValue(*it);
  74. listGridRows.push_back(pGridRow);
  75. }
  76. break;
  77. }
  78. case (int)REPORT_MEASURE_RESULT_INFO_GRID_CLUMN::INFORMATIN:
  79. {
  80. pColumn->SetName("Sample");
  81. listGridRows.clear();
  82. list<CString> ListValue;
  83. //获得指针的值
  84. CSmplMsrResultFileMgrPtr rstFilePtr = m_RptMgrPtr->GetASmplMsrResultMgrByFileName(strDataSourceName);
  85. ASSERT(rstFilePtr);
  86. if (!rstFilePtr) {
  87. LogErrorTrace(__FILE__, __LINE__, _T("MeasureResultInfo: invalid rstFilePtr."));
  88. return listGridData;
  89. }
  90. CSmplMsrResultFilePtr rstFile = rstFilePtr->GetSmplMsrResultFile();
  91. ASSERT(rstFile);
  92. if (!rstFile) {
  93. LogErrorTrace(__FILE__, __LINE__, _T("MeasureResultInfo: invalid rstFile."));
  94. return listGridData;
  95. }
  96. COTSSamplePtr smpRst = rstFile->GetSample();
  97. ASSERT(smpRst);
  98. if (!smpRst) {
  99. LogErrorTrace(__FILE__, __LINE__, _T("MeasureResultInfo: invalid smpRst."));
  100. return listGridData;
  101. }
  102. double dPixelSize = smpRst->CalculatePixelSize();
  103. double dAFieldArea = smpRst->CalculateAFieldArea();
  104. //数据源名称
  105. ListValue.push_back(strDataSourceName);
  106. //运行已开始
  107. COleDateTime ole_startTime = smpRst->GetMsrStatus()->GetStartTime();
  108. ASSERT(ole_startTime);
  109. if (!ole_startTime) {
  110. LogErrorTrace(__FILE__, __LINE__, _T("MeasureResultInfo: invalid ole_startTime."));
  111. return listGridData;
  112. }
  113. CString strStartTime;
  114. strStartTime = ole_startTime.Format(MSR_RESULT_INFOR_YMD);
  115. CGridRowPtr pGridRow = CGridRowPtr(new CGridRow());
  116. pGridRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  117. ListValue.push_back(strStartTime);
  118. //运行已结束
  119. COleDateTime ole_endTime = smpRst->GetMsrStatus()->GetEndTime();
  120. ASSERT(ole_endTime);
  121. if (!ole_endTime) {
  122. LogErrorTrace(__FILE__, __LINE__, _T("MeasureResultInfo: invalid ole_endTime."));
  123. return listGridData;
  124. }
  125. CString strEndTime;
  126. strEndTime = ole_endTime.Format(MSR_RESULT_INFOR_YMD);
  127. ListValue.push_back(strEndTime);
  128. //运行时间
  129. COleDateTimeSpan ts = ole_endTime - ole_startTime;
  130. CString str;
  131. str.Format(MSR_RESULT_INFOR_FOUR, ts.m_span * 1440);
  132. CString Character = MSR_RESULT_INFOR_MINUTES;
  133. CString strRunTime = str + Character;
  134. ListValue.push_back(strRunTime);
  135. //视场总数
  136. int allFieldsNum = smpRst->GetMsrStatus()->GetCompletedFields();
  137. ASSERT(allFieldsNum);
  138. if (!allFieldsNum) {
  139. LogErrorTrace(__FILE__, __LINE__, _T("MeasureResultInfo: invalid allFieldsNum."));
  140. return listGridData;
  141. }
  142. CString HallFieldsNum;
  143. HallFieldsNum.Format(_T("%d"), allFieldsNum);
  144. ListValue.push_back(HallFieldsNum);
  145. //分类方案
  146. CString classifyMethod = _T("InclCleanSteel(1)");
  147. ListValue.push_back(classifyMethod);
  148. //已检测特征
  149. int featureNum = smpRst->GetMsrResults()->GetTotalParticleNumber();
  150. ASSERT(featureNum);
  151. if (!featureNum) {
  152. LogErrorTrace(__FILE__, __LINE__, _T("MeasureResultInfo: invalid featureNum."));
  153. return listGridData;
  154. }
  155. CString HfeatureNum;
  156. HfeatureNum.Format(_T("%d"), featureNum);
  157. ListValue.push_back(HfeatureNum);
  158. CSmplMsrResultFilePtr restFile = rstFilePtr->GetSmplMsrResultFile();
  159. COTSFieldDataList FieldData = restFile->GetFieldData();
  160. double dFieldArea = smpRst->CalculateAFieldArea();
  161. //获取有效的分析颗粒数量
  162. int nEffectiveParticleNum = GetEffectiveParticleNum(FieldData);
  163. CString strEffectiveParticleNum;
  164. strEffectiveParticleNum.Format(_T("%d"), nEffectiveParticleNum);
  165. ListValue.push_back(strEffectiveParticleNum);
  166. //视场面积
  167. int fieldArea = smpRst->GetMsrResults()->GetMeasuredArea();
  168. CString HfieldArea;
  169. HfieldArea.Format(_T("%d"), fieldArea);
  170. ListValue.push_back(HfieldArea);
  171. //已分析的特征面积
  172. int MsrPArea = smpRst->GetMsrResults()->GetTotalParticleArea();
  173. CString HMsrPArea;
  174. HMsrPArea.Format(_T("%d"), MsrPArea);
  175. ListValue.push_back(HMsrPArea);
  176. //已检测的特征面积
  177. double MsrArea;
  178. double dScale = m_RptMgrPtr->GetReportProjFile()->GetScale();
  179. if (0 == fieldArea)
  180. {
  181. MsrArea = 0;
  182. }
  183. else
  184. {
  185. MsrArea = dScale * (double)MsrPArea / (double)fieldArea;
  186. }
  187. //面积为零的情况判断
  188. CString HMsrArea;
  189. if (0 == MsrArea)
  190. {
  191. HMsrArea = _T("0");
  192. ListValue.push_back(HMsrArea);
  193. }
  194. else
  195. {
  196. HMsrArea.Format(_T("%f"), MsrArea);
  197. ListValue.push_back(HMsrArea);
  198. }
  199. //纳入指数
  200. CString sScale;
  201. sScale.Format(_T("%f"), dScale);
  202. ListValue.push_back(sScale);
  203. //参考标准
  204. CString refStandard = _T("GB/T30834-2014");
  205. ListValue.push_back(refStandard);
  206. //单个Field夹杂物面积占比
  207. int nPerMicroNum = GetNumPerMicro(FieldData, dFieldArea);
  208. CString strPerMicroNum;
  209. strPerMicroNum.Format(_T("%d"), nPerMicroNum);
  210. ListValue.push_back(strPerMicroNum);
  211. //单个Field夹杂物面积占比
  212. double dPerMicroArea = GetAreaPerMicro(FieldData, dFieldArea);
  213. CString strPerMicroArea;
  214. strPerMicroArea.Format(_T("%f"), dPerMicroArea);
  215. ListValue.push_back(strPerMicroArea);
  216. // insert value to grid list
  217. for (list<CString>::iterator its = ListValue.begin(); its != ListValue.end(); its++)
  218. {
  219. CGridRowPtr pGridRow = CGridRowPtr(new CGridRow());
  220. pGridRow->SetDataType(REPORT_GRID_DATA_TYPE::STRING);
  221. pGridRow->SetStringValue(*its);
  222. listGridRows.push_back(pGridRow);
  223. }
  224. break;
  225. }
  226. }
  227. pColumn->SetGridRowsList(listGridRows);
  228. listGridColumn.push_back(pColumn);
  229. }
  230. pGridData->SetGridColumnList(listGridColumn);
  231. listGridData.push_back(pGridData);
  232. }
  233. return listGridData;
  234. }
  235. int MeasureResultInfo::GetNumPerMicro(COTSFieldDataList a_listFieldData, double a_dFieldArea)
  236. {
  237. int nPartNumMax = 0;
  238. for (auto pField : a_listFieldData)
  239. {
  240. COTSParticleList listPart = pField->GetParticleList();
  241. if (nPartNumMax < (int)listPart.size())
  242. {
  243. nPartNumMax = (int)listPart.size();
  244. }
  245. }
  246. int nResult = 0;
  247. if(0!= a_dFieldArea)
  248. {
  249. nResult = ceil((double)nPartNumMax / a_dFieldArea);
  250. }
  251. return nResult;
  252. }
  253. //获取有效的分析颗粒数量
  254. int MeasureResultInfo::GetEffectiveParticleNum(COTSFieldDataList a_listFieldData)
  255. {
  256. int retEffectiveParticleNum = 0;
  257. for (auto pField : a_listFieldData)
  258. {
  259. COTSParticleList listPart = pField->GetParticleList();
  260. for (auto pPart : listPart)
  261. {
  262. //大于识别颗粒的分类都是有效颗粒
  263. if (pPart->GetType() > (int)OTS_PARTCLE_TYPE::IDENTIFIED)
  264. {
  265. retEffectiveParticleNum++;
  266. }
  267. }
  268. }
  269. return retEffectiveParticleNum;
  270. }
  271. double MeasureResultInfo::GetAreaPerMicro(COTSFieldDataList a_listFieldData, double a_dFieldArea)
  272. {
  273. double dPartArea = 0;
  274. double dPartSumArea = 0;
  275. double dPartAreaMax = 0;
  276. for (auto pField : a_listFieldData)
  277. {
  278. COTSParticleList listPart = pField->GetParticleList();
  279. for (auto pParticle : listPart)
  280. {
  281. dPartArea = (double)pParticle->GetArea();
  282. dPartSumArea += dPartArea;
  283. if (dPartSumArea > dPartAreaMax)
  284. {
  285. dPartAreaMax = dPartSumArea;
  286. }
  287. }
  288. }
  289. double dResult = 0;
  290. if(0!= a_dFieldArea)
  291. {
  292. dResult = dPartAreaMax / (1000000 * a_dFieldArea);
  293. }
  294. return dResult;
  295. }
  296. }