SmplMsrResultFileMgr.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. #pragma once
  2. #define _CRTDBG_MAP_ALLOC
  3. #include <stdlib.h>
  4. #include <crtdbg.h>
  5. #include "stdafx.h"
  6. #include "SmplMsrResultFileMgr.h"
  7. #include "PosXrayFileMgr.h"
  8. #include "BSEImgFileMgr.h"
  9. #include "IncAFileMgr.h"
  10. #include "OTSHelper.h"
  11. #include "OTSFileSys.h"
  12. namespace OTSMODEL
  13. {
  14. using namespace OTSDATA;
  15. // constructor
  16. CSmplMsrResultFileMgr::CSmplMsrResultFileMgr(CString workingFolder)
  17. {
  18. m_strWorkingFolder = workingFolder;
  19. m_listAnalysisXray.clear();
  20. }
  21. // destructor
  22. CSmplMsrResultFileMgr::~CSmplMsrResultFileMgr()
  23. {
  24. }
  25. // class methods
  26. // public
  27. // initialization
  28. // this method needs to be called before measurement
  29. BOOL CSmplMsrResultFileMgr::Init(COTSSamplePtr a_pSample)
  30. {
  31. // sample check
  32. ASSERT(a_pSample);
  33. if (!a_pSample)
  34. {
  35. // invalid sample pointer
  36. LogErrorTrace(__FILE__, __LINE__, _T("Init: failed to create the working directory."));
  37. return FALSE;
  38. }
  39. // sample name
  40. CString strSmplName = a_pSample->GetName();
  41. strSmplName.Trim();
  42. if (strSmplName.IsEmpty())
  43. {
  44. // the sample name string can't be an empty string
  45. LogErrorTrace(__FILE__, __LINE__, _T("Init: the sample name string is an empty string."));
  46. return FALSE;
  47. }
  48. // the working directory string can't be an empty string
  49. if (m_strWorkingFolder.IsEmpty())
  50. {
  51. // the working directory is empty
  52. LogTrace(__FILE__, __LINE__, _T("Init: the woring folder directory string is an empty string."));
  53. return FALSE;
  54. }
  55. // check if the working directory is there
  56. if (!COTSFileSys::Exists(m_strWorkingFolder))
  57. {
  58. // the working directory is not exit, create it
  59. if (!COTSFileSys::CreateFolder(m_strWorkingFolder))
  60. {
  61. // failed to create the working directory
  62. LogTrace(__FILE__, __LINE__, _T("Init: failed to create the working directory."));
  63. return FALSE;
  64. }
  65. }
  66. // sample measure file pathname
  67. CString strPathname = m_strWorkingFolder + strSmplName + SMPL_MSR_RESULT_FILE_EXT;
  68. // file not exists, creates it
  69. if (!CreateFileMgr(strPathname))
  70. {
  71. // failed to create the file
  72. LogErrorTrace(__FILE__, __LINE__, _T("Init: can't create file manager(%s). error: %s"), strPathname);
  73. return FALSE;
  74. }
  75. // get field files directory string
  76. CString strFieldFileSubFolder = GetFieldFileSubFolderStr();
  77. // check if the field files directory exists
  78. if (!COTSFileSys::Exists(strFieldFileSubFolder))
  79. {
  80. // field files directory exists not exists, creates it
  81. if (!COTSFileSys::CreateFolder(strFieldFileSubFolder))
  82. {
  83. // failed to create the field files directory
  84. LogErrorTrace(__FILE__, __LINE__, _T("Init: failed to create field files directory (%s). error: %s"), strFieldFileSubFolder);
  85. return FALSE;
  86. }
  87. }
  88. // ok, return TRUE
  89. SetSample(a_pSample);
  90. return TRUE;
  91. }
  92. // Load
  93. BOOL CSmplMsrResultFileMgr::Load(CString a_strPathname /*= _T("")*/)
  94. {
  95. /* int tmpFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
  96. tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
  97. _CrtSetDbgFlag(tmpFlag);*/
  98. //_CrtSetBreakAlloc(7415416);
  99. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  100. // check the pathname string
  101. a_strPathname.Trim();
  102. if (a_strPathname.IsEmpty())
  103. {
  104. // open
  105. CFileDialog dlg(TRUE, SMPL_MSR_RESULT_FILE_EXT, NULL, OFN_FILEMUSTEXIST, SMPL_MSR_RESULT_FILE_FILTER);
  106. if (dlg.DoModal() != IDOK)
  107. {
  108. // user canceled loading
  109. LogTrace(__FILE__, __LINE__, _T("Load: user canceled loading."));
  110. return FALSE;
  111. }
  112. a_strPathname = dlg.GetPathName();
  113. }
  114. // get path of the pathname
  115. CString strFilePath = COTSHelper::GetFolderName(a_strPathname);
  116. if (strFilePath.IsEmpty())
  117. {
  118. // file path string is an empty string
  119. LogErrorTrace(__FILE__, __LINE__, _T("Load: file path string is an empty string."));
  120. return FALSE;
  121. }
  122. // field file sub folder string
  123. CString strFieldFileSubFolder = strFilePath + _T("\\") + SMPL_MSR_RESULT_FIELDS_FILE_SUBFOLDER + _T("\\");
  124. // check if the field file sub folder exists
  125. if (!COTSFileSys::Exists(strFieldFileSubFolder))
  126. {
  127. // field files folder doesn't exist
  128. LogErrorTrace(__FILE__, __LINE__, _T("Load: field files folder doesn't exist (%s)."), strFieldFileSubFolder);
  129. return FALSE;
  130. }
  131. SetWorkingFolderStr(strFieldFileSubFolder);
  132. // create sample measure result file
  133. CSmplMsrResultFilePtr pSmplMsrResultFile = CSmplMsrResultFilePtr(new CSmplMsrResultFile());
  134. tinyxml2::XMLDocument doc;
  135. doc.LoadFile(a_strPathname);//载入xml文件
  136. tinyxml2::XMLElement *rootNode;
  137. rootNode = doc.FirstChildElement(RootClassName);
  138. pSmplMsrResultFile->Serialize(false, &doc, rootNode);
  139. // file version
  140. CString strFileVersion = pSmplMsrResultFile->GetFileVersion();
  141. DWORD nFileVersion = COTSHelper::GetVersionFromString(strFileVersion);
  142. if (nFileVersion == 0)
  143. {// invalid file
  144. LogErrorTrace(__FILE__, __LINE__, _T("Load: invalid sample measure result file %s"), a_strPathname);
  145. return FALSE;
  146. }
  147. // sample measure result file
  148. m_pSmplMsrResultFile = pSmplMsrResultFile;
  149. SetPathName(a_strPathname);
  150. this->LoadFieldDataFromDB(a_strPathname);
  151. // ok, return TRUE
  152. return TRUE;
  153. }
  154. // Load
  155. BOOL CSmplMsrResultFileMgr::LoadFieldDataFromDB(CString a_strPathname /*= _T("")*/)
  156. {
  157. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  158. // check the pathname string
  159. a_strPathname.Trim();
  160. if (a_strPathname.IsEmpty())
  161. {
  162. // open
  163. CFileDialog dlg(TRUE, SMPL_MSR_RESULT_FILE_EXT, NULL, OFN_FILEMUSTEXIST, SMPL_MSR_RESULT_FILE_FILTER);
  164. if (dlg.DoModal() != IDOK)
  165. {
  166. // user canceled loading
  167. LogTrace(__FILE__, __LINE__, _T("Load: user canceled loading."));
  168. return FALSE;
  169. }
  170. a_strPathname = dlg.GetPathName();
  171. }
  172. // get path of the pathname
  173. CString strFilePath = COTSHelper::GetFolderName(a_strPathname);
  174. if (strFilePath.IsEmpty())
  175. {
  176. // file path string is an empty string
  177. LogErrorTrace(__FILE__, __LINE__, _T("Load: file path string is an empty string."));
  178. return FALSE;
  179. }
  180. // field file sub folder string
  181. CString strFieldFileSubFolder = strFilePath + _T("\\") + SMPL_MSR_RESULT_FIELDS_FILE_SUBFOLDER + _T("\\");
  182. // check if the field file sub folder exists
  183. if (!COTSFileSys::Exists(strFieldFileSubFolder))
  184. {// field files folder doesn't exist
  185. LogErrorTrace(__FILE__, __LINE__, _T("Load: field files folder doesn't exist (%s)."), strFieldFileSubFolder);
  186. return FALSE;
  187. }
  188. CString strIncAFilename = strFieldFileSubFolder + _T("\\") + SMPL_MSR_RESULT_INCLUSION_FILE;
  189. CIncAFileMgrPtr pIncAFileMgr = CIncAFileMgrPtr(new CIncAFileMgr(strIncAFilename));
  190. COTSFieldDataList allFlds;
  191. CMsrSampleStatusPtr poMsrStatus= m_pSmplMsrResultFile->GetSample()->GetMsrStatus();
  192. CMsrResultsPtr poMsrResults= m_pSmplMsrResultFile->GetSample()->GetMsrResults();
  193. double aFldArea = m_pSmplMsrResultFile->GetSample()->CalculateAFieldArea();
  194. if (pIncAFileMgr->GetAllFieldsFromDB(allFlds, poMsrStatus, poMsrResults, aFldArea))
  195. {
  196. m_pSmplMsrResultFile->SetFieldData(allFlds);
  197. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  198. for (auto pFieldData : listFieldData)
  199. {
  200. pFieldData->SetFieldFileFolder(strFieldFileSubFolder);
  201. }
  202. return TRUE;
  203. }
  204. else
  205. {
  206. return FALSE;
  207. }
  208. // ok, return TRUE
  209. }
  210. // Save
  211. BOOL CSmplMsrResultFileMgr::Save(CString a_strPathname /*= _T("")*/)
  212. {
  213. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  214. // safety check
  215. ASSERT(m_pSmplMsrResultFile);
  216. if (!m_pSmplMsrResultFile)
  217. {
  218. // invalid sample measure result file pointer
  219. LogErrorTrace(__FILE__, __LINE__, _T("Save: invalid sample measure result file pointer."));
  220. return FALSE;
  221. }
  222. // check the pathname string
  223. a_strPathname.Trim();
  224. if (a_strPathname.IsEmpty())
  225. {
  226. // file save as dialog
  227. CFileDialog dlg(FALSE, SMPL_MSR_RESULT_FILE_EXT, NULL, OFN_OVERWRITEPROMPT, SMPL_MSR_RESULT_FILE_FILTER);
  228. if (dlg.DoModal() != IDOK)
  229. {
  230. // user canceled loading
  231. LogTrace(__FILE__, __LINE__, _T("Save: user canceled save."));
  232. return FALSE;
  233. }
  234. // get file pathname
  235. a_strPathname = dlg.GetPathName();
  236. }
  237. // get path of the pathname
  238. CString strFilePath = COTSHelper::GetFolderName(a_strPathname);
  239. if (strFilePath.IsEmpty())
  240. {
  241. // file path string is an empty string
  242. LogErrorTrace(__FILE__, __LINE__, _T("Save: file path string is an empty string."));
  243. return FALSE;
  244. }
  245. // check if the path exists
  246. if (!COTSFileSys::Exists(strFilePath))
  247. {
  248. // file path doesn't exist create it
  249. if (!COTSFileSys::CreateFolder(strFilePath))
  250. {
  251. // failed to create file path
  252. LogErrorTrace(__FILE__, __LINE__, _T("Save: failed to create file path (%s)."), strFilePath);
  253. return FALSE;
  254. }
  255. }
  256. tinyxml2::XMLDocument doc;
  257. if (COTSFileSys::Exists(a_strPathname))
  258. {
  259. doc.LoadFile(a_strPathname);//载入xml文件
  260. }
  261. doc.Clear();
  262. tinyxml2::XMLDeclaration* declaration = doc.NewDeclaration();//添加xml文件头申明
  263. doc.InsertFirstChild(declaration);
  264. tinyxml2::XMLElement *rootNode;
  265. rootNode = doc.NewElement(RootClassName);
  266. doc.InsertEndChild(rootNode);
  267. m_pSmplMsrResultFile->Serialize(true, &doc, rootNode);
  268. int result = doc.SaveFile(a_strPathname);
  269. // ok, return TRUE
  270. return TRUE;
  271. }
  272. // get particle STD data
  273. CPartSTDDataPtr CSmplMsrResultFileMgr::GetPartSTDData()
  274. {
  275. CPartSTDDataPtr pPartSTDData = nullptr;
  276. if (!m_pSmplMsrResultFile)
  277. {
  278. return pPartSTDData;
  279. }
  280. COTSSamplePtr pSample = m_pSmplMsrResultFile->GetSample();
  281. if(!pSample)
  282. {
  283. return pPartSTDData;
  284. }
  285. CMsrParamsPtr pMsrParams = pSample->GetMsrParams();
  286. if(!pMsrParams)
  287. {
  288. return pPartSTDData;
  289. }
  290. pPartSTDData = pMsrParams->GetPartSTDData();
  291. return pPartSTDData;
  292. }
  293. // field file sub folder string
  294. CString CSmplMsrResultFileMgr::GetFieldFileSubFolderStr()
  295. {
  296. // return empty string if working folder
  297. if (m_strWorkingFolder.IsEmpty())
  298. {
  299. return _T("");
  300. }
  301. // add "\\" at the string end if it is not "\\"
  302. if (m_strWorkingFolder.Right(1) != _T('\\'))
  303. {
  304. m_strWorkingFolder += _T("\\");
  305. }
  306. // field file sub folder string
  307. CString strFieldFileSubFolder = m_strWorkingFolder;
  308. CString strFIELDS_FILE_SUBFOLDER = _T("FIELD_FILES");
  309. if (strFieldFileSubFolder.Find(_T(strFIELDS_FILE_SUBFOLDER)) <= 0)
  310. {
  311. strFieldFileSubFolder = m_strWorkingFolder + SMPL_MSR_RESULT_FIELDS_FILE_SUBFOLDER + _T("\\");
  312. }
  313. else
  314. {
  315. strFieldFileSubFolder = m_strWorkingFolder;
  316. }
  317. // return field file sub folder string
  318. return strFieldFileSubFolder;
  319. }
  320. // save a BSE file for a field
  321. BOOL CSmplMsrResultFileMgr::SaveBSEFileForAField(COTSFieldMgrPtr a_pField)
  322. {
  323. // check input
  324. ASSERT(a_pField);
  325. if (!a_pField)
  326. {
  327. LogErrorTrace(__FILE__, __LINE__, _T("SaveBSEFileForAField: invalid field data pointer."));
  328. return FALSE;
  329. }
  330. // get field BSE file pathname
  331. CString strBSEFilePathname = m_strWorkingFolder + _T("\\") + SMPL_MSR_RESULT_FIELDS_FILE_SUBFOLDER + _T("\\");
  332. // save BSE file for the field
  333. CBSEImgPtr pBSEImage = a_pField->GetBSEImage();
  334. CBSEImgFileMgrPtr pBSEImgFileMgr = CBSEImgFileMgrPtr(new CBSEImgFileMgr());
  335. pBSEImgFileMgr->SetBSEImg(pBSEImage);
  336. pBSEImgFileMgr->Save(strBSEFilePathname);
  337. // ok, return TRUE
  338. return TRUE;
  339. }
  340. // save a x-ray file for a field
  341. BOOL CSmplMsrResultFileMgr::SaveXRayFileForAField(COTSFieldMgrPtr a_pField)
  342. {
  343. // check input
  344. ASSERT(a_pField);
  345. if (!a_pField)
  346. {
  347. LogErrorTrace(__FILE__, __LINE__, _T("SaveXRayFileForAField: invalid field data pointer."));
  348. return FALSE;
  349. }
  350. // get field x-ray file pathname
  351. CString strXRayFilePathname = m_strWorkingFolder + _T("\\") + SMPL_MSR_RESULT_FIELDS_FILE_SUBFOLDER + _T("\\");
  352. CString strXRaySearchFilename = strXRayFilePathname + SMPL_MSR_RESULT_SEARCH_X_RAY_FILE;
  353. CString strXRayAnalysisFilename = strXRayFilePathname + SMPL_MSR_RESULT_ANALYSIS_X_RAY_FILE;
  354. // save x-ray file for the field
  355. CPosXrayFileMgrPtr pPosXrayFileMgr = CPosXrayFileMgrPtr(new CPosXrayFileMgr(strXRayAnalysisFilename));
  356. CPosXraysList listSearchXray = a_pField->GetSearchPosXrayList();
  357. pPosXrayFileMgr->SetPosXrayList(listSearchXray,TRUE);
  358. pPosXrayFileMgr->SetHasElement(FALSE);
  359. if (!pPosXrayFileMgr->Save(strXRayAnalysisFilename))
  360. {
  361. LogErrorTrace(__FILE__, __LINE__, _T("SaveXRayFileForAField: save search x-ray failed."));
  362. return FALSE;
  363. }
  364. CPosXraysList listAnalysisXray = a_pField->GetAnalysisPosXrayList();
  365. pPosXrayFileMgr->SetPosXrayList(listAnalysisXray, TRUE);
  366. pPosXrayFileMgr->SetHasElement(TRUE);
  367. if (!pPosXrayFileMgr->Save(strXRayAnalysisFilename))
  368. {
  369. LogErrorTrace(__FILE__, __LINE__, _T("SaveXRayFileForAField: save analysis x-ray failed."));
  370. return FALSE;
  371. }
  372. // ok, return TRUE
  373. return TRUE;
  374. }
  375. // fields
  376. COTSFieldDataPtr CSmplMsrResultFileMgr::GetFieldById(int a_nID)
  377. {
  378. COTSFieldDataList listFieldData = m_pSmplMsrResultFile->GetFieldData();
  379. if (a_nID <0 || a_nID >(int)listFieldData.size())
  380. {
  381. return nullptr;
  382. }
  383. COTSFieldDataPtr pFieldData = listFieldData[a_nID];
  384. return pFieldData;
  385. }
  386. BOOL CSmplMsrResultFileMgr::AddAField(COTSFieldDataPtr a_pFieldData)
  387. {
  388. ASSERT(a_pFieldData);
  389. if (!a_pFieldData)
  390. {
  391. // empty field data pointer
  392. LogErrorTrace(__FILE__, __LINE__, _T("AddAField: empty field data pointer."));
  393. return FALSE;
  394. }
  395. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  396. listFieldData.push_back(a_pFieldData);
  397. return TRUE;
  398. }
  399. BOOL CSmplMsrResultFileMgr::DeleteAFieldById(int a_nID)
  400. {
  401. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  402. if (a_nID <0 || a_nID > (int)listFieldData.size())
  403. {
  404. return FALSE;
  405. }
  406. listFieldData.erase(listFieldData.begin()+a_nID);
  407. return TRUE;
  408. }
  409. void CSmplMsrResultFileMgr::SetSample(COTSSamplePtr a_pSample)
  410. {
  411. ASSERT(a_pSample);
  412. if (!a_pSample)
  413. {
  414. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample."));
  415. return;
  416. }
  417. ASSERT(m_pSmplMsrResultFile);
  418. if (!m_pSmplMsrResultFile)
  419. {
  420. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  421. return;
  422. }
  423. m_pSmplMsrResultFile->SetSample(a_pSample);
  424. }
  425. void CSmplMsrResultFileMgr::SetSEMGnr(CSEMDataGnrPtr a_pSEMGnr)
  426. {
  427. ASSERT(a_pSEMGnr);
  428. if (!a_pSEMGnr)
  429. {
  430. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid SEM general data pointer."));
  431. return;
  432. }
  433. ASSERT(m_pSmplMsrResultFile);
  434. if (!m_pSmplMsrResultFile)
  435. {
  436. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  437. return;
  438. }
  439. m_pSmplMsrResultFile->SetSEMStage(a_pSEMGnr);
  440. }
  441. // get id for a new field
  442. int CSmplMsrResultFileMgr::GetIdForANewField(int a_nLastFieldId)
  443. {
  444. // new field id
  445. int nNewFieldId = a_nLastFieldId;// +this->m_pSmplMsrResultFile->GetSample()->GetMsrStatus()->GetCompletedFields();
  446. // safety check
  447. ASSERT(m_pSmplMsrResultFile);
  448. if (!m_pSmplMsrResultFile)
  449. {
  450. // shouldn't be here, invalid sample measure result file
  451. LogErrorTrace(__FILE__, __LINE__, _T("GetIdForANewField: invalid sample measure result file."));
  452. return nNewFieldId;
  453. }
  454. // make the new field id is unit
  455. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  456. BOOL bUnit = FALSE;
  457. do
  458. {
  459. auto itr = std::find_if(listFieldData.begin(), listFieldData.end(), [nNewFieldId](COTSFieldDataPtr p) { return p->GetId() == nNewFieldId; });
  460. bUnit = (itr == listFieldData.end());
  461. if (!bUnit)
  462. {
  463. ++nNewFieldId;
  464. }
  465. }
  466. while (!bUnit);
  467. // return new field id
  468. return nNewFieldId;
  469. }
  470. // set SEMStageData
  471. void CSmplMsrResultFileMgr::SetSEMStageData(CSEMStageDataPtr a_pSEMStageData)
  472. {
  473. ASSERT(a_pSEMStageData);
  474. if (!a_pSEMStageData)
  475. {
  476. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid SEM stage data pointer."));
  477. return;
  478. }
  479. ASSERT(m_pSmplMsrResultFile);
  480. if (!m_pSmplMsrResultFile)
  481. {
  482. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  483. return;
  484. }
  485. m_pSmplMsrResultFile->SetSEMStageData(a_pSEMStageData);
  486. }
  487. // set SEMStage
  488. void CSmplMsrResultFileMgr::SetSEMStage(CStagePtr a_pStage)
  489. {
  490. ASSERT(a_pStage);
  491. if (!a_pStage)
  492. {
  493. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid stage pointer."));
  494. return;
  495. }
  496. ASSERT(m_pSmplMsrResultFile);
  497. if (!m_pSmplMsrResultFile)
  498. {
  499. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  500. return;
  501. }
  502. m_pSmplMsrResultFile->SetStage(a_pStage);
  503. }
  504. COTSFieldMgrList CSmplMsrResultFileMgr::GetOTSFldMgrListAndAnalysisXrayList()
  505. {
  506. if (m_listFieldMgr.size() > 0)//if the list is not empty ,prove that we've already load all the dada.so there's no need to load again.
  507. {
  508. return m_listFieldMgr;
  509. }
  510. m_listFieldMgr.clear();
  511. ASSERT(m_pSmplMsrResultFile);
  512. if (!m_pSmplMsrResultFile)
  513. {
  514. LogErrorTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: invalid sample measure result file pointer."));
  515. return m_listFieldMgr;
  516. }
  517. //Get FieldDataList
  518. COTSFieldDataList listFieldData = m_pSmplMsrResultFile->GetFieldData();
  519. int nFieldNum = (int)listFieldData.size();
  520. m_listAnalysisXray.clear();
  521. // get field number
  522. for (auto pFieldData : listFieldData)
  523. {
  524. COTSFieldMgrPtr pFieldMgr = COTSFieldMgrPtr(new COTSFieldMgr());
  525. // get FieldData
  526. //pFieldMgr->SetOTSFieldData(COTSFieldDataPtr(new COTSFieldData(*pFieldData.get())));
  527. pFieldMgr->SetOTSFieldData(pFieldData);
  528. COTSParticleList& listParticle = pFieldData->GetParticleList();
  529. if (listParticle.empty())
  530. {
  531. LogInfoTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: there is no particle in this field."));
  532. continue;
  533. }
  534. // get BSE
  535. CString strFieldFileFolder = pFieldData->GetFieldFileFolder();
  536. int nId = pFieldData->GetId();
  537. CString sFieldId;
  538. sFieldId.Format(_T("%d"), nId);
  539. CString strBSEFilePathname = strFieldFileFolder + SMPL_MSR_RESULT_FIELDS_BSE + sFieldId + BMP_IMG_FILE_EXT;
  540. CBSEImgFileMgrPtr pBSEImgFile = CBSEImgFileMgrPtr(new CBSEImgFileMgr());
  541. if (!pBSEImgFile->LoadFromBitmap(strBSEFilePathname))
  542. {
  543. LogErrorTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: can't load BSE File."));
  544. CMsrResultsPtr pMsrResults = CMsrResultsPtr(new CMsrResults());
  545. pFieldMgr->SetMsrResult(pMsrResults);
  546. m_listFieldMgr.push_back(pFieldMgr);
  547. continue;
  548. }
  549. CBSEImgPtr pBSEImg = pBSEImgFile->GetBSEImg();
  550. //pFieldMgr->SetBSEImage(CBSEImgPtr(new CBSEImg(*pBSEImg.get())));
  551. pFieldMgr->SetBSEImage(pBSEImg);
  552. // get analysis X-ray list
  553. CString strXRayAnalysisFilename = strFieldFileFolder + _T("\\") + SMPL_MSR_RESULT_ANALYSIS_X_RAY_FILE;
  554. CPosXrayFileMgrPtr pPosAnalysisXrayFileMgr = CPosXrayFileMgrPtr(new CPosXrayFileMgr(strXRayAnalysisFilename));
  555. pPosAnalysisXrayFileMgr->SetHasElement(TRUE);
  556. if (!pPosAnalysisXrayFileMgr->Load(pFieldData->GetId(),strXRayAnalysisFilename))
  557. {
  558. LogTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: load analysis x-ray of field %d failed."), pFieldData->GetId());
  559. CMsrResultsPtr pMsrResults = CMsrResultsPtr(new CMsrResults());
  560. pFieldMgr->SetMsrResult(pMsrResults);
  561. m_listFieldMgr.push_back(pFieldMgr);
  562. continue;
  563. }
  564. CPosXraysList listAnalysisXray = pPosAnalysisXrayFileMgr->GetPosXrayList();
  565. pFieldMgr->SetAnalysisPosXayList(listAnalysisXray);
  566. SetAnalysisXrayToList(listAnalysisXray);
  567. //Mrs result need compute
  568. CMsrResultsPtr pMsrResults = CMsrResultsPtr(new CMsrResults());
  569. pFieldMgr->SetMsrResult(pMsrResults);
  570. m_listFieldMgr.push_back(pFieldMgr);
  571. }
  572. return m_listFieldMgr;
  573. }
  574. void CSmplMsrResultFileMgr::SetParticleList(COTSParticleList& a_listParticle)
  575. {
  576. m_listParticle.clear();
  577. for (auto pParticle : a_listParticle)
  578. {
  579. //COTSParticlePtr pParticleNew = COTSParticlePtr(new COTSParticle(*pParticle.get()));
  580. //COTSParticlePtr pParticleNew = pParticle;
  581. m_listParticle.push_back(pParticle);
  582. }
  583. }
  584. BOOL CSmplMsrResultFileMgr::ComputeParticleList()
  585. {
  586. ASSERT(m_pSmplMsrResultFile);
  587. if (!m_pSmplMsrResultFile)
  588. {
  589. LogErrorTrace(__FILE__, __LINE__, _T("GetParticleList: invalid sample measure result file pointer."));
  590. return FALSE;
  591. }
  592. m_listParticle.clear();
  593. //Get FieldDataList
  594. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  595. for (auto pFieldData : listFieldData)
  596. {
  597. COTSParticleList listParticle = pFieldData->GetParticleList();
  598. for (auto pParticle : listParticle)
  599. {
  600. //COTSParticlePtr pParticleNew = COTSParticlePtr(new COTSParticle(*pParticle.get()));
  601. //COTSParticlePtr pParticleNew =pParticle;
  602. m_listParticle.push_back(pParticle);
  603. }
  604. }
  605. return TRUE;
  606. }
  607. BOOL CSmplMsrResultFileMgr::SetAnalysisXrayToList(CPosXraysList a_listAnalysisXray)
  608. {
  609. //m_listAnalysisXray.clear();
  610. for (auto pXray: a_listAnalysisXray)
  611. {
  612. //CPosXrayPtr pXrayNew = pXray;
  613. m_listAnalysisXray.push_back(pXray);
  614. }
  615. return TRUE;
  616. }
  617. // protected
  618. // create a new file
  619. BOOL CSmplMsrResultFileMgr::CreateFileMgr(CString a_strPathname)
  620. {
  621. // check the file pathname
  622. a_strPathname.Trim();
  623. if (a_strPathname.IsEmpty())
  624. {
  625. // file pathname is an empty string
  626. LogTrace(__FILE__, __LINE__, _T("Init: file pathname string is an empty string."));
  627. return FALSE;
  628. }
  629. // create sample measure result file
  630. m_pSmplMsrResultFile = CSmplMsrResultFilePtr(new CSmplMsrResultFile());
  631. SetPathName(a_strPathname);
  632. // ok, return TRUE
  633. return TRUE;
  634. }
  635. }