SmplMsrResultFileMgr.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  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(m_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. //CMsrSampleStatusPtr poMsrStatus = CMsrSampleStatusPtr(new CMsrSampleStatus());
  193. CMsrResultsPtr poMsrResults= m_pSmplMsrResultFile->GetSample()->GetMsrResults();
  194. //CMsrResultsPtr poMsrResults = CMsrResultsPtr(new CMsrResults());
  195. double aFldArea = m_pSmplMsrResultFile->GetSample()->CalculateAFieldArea();
  196. if (pIncAFileMgr->GetAllFieldsFromDB(allFlds, poMsrStatus, poMsrResults, aFldArea))
  197. {
  198. m_pSmplMsrResultFile->SetFieldData(allFlds);
  199. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  200. for (auto pFieldData : listFieldData)
  201. {
  202. pFieldData->SetFieldFileFolder(strFieldFileSubFolder);
  203. }
  204. return TRUE;
  205. }
  206. else
  207. {
  208. return FALSE;
  209. }
  210. // ok, return TRUE
  211. }
  212. // Save
  213. BOOL CSmplMsrResultFileMgr::Save(CString a_strPathname /*= _T("")*/)
  214. {
  215. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  216. // safety check
  217. ASSERT(m_pSmplMsrResultFile);
  218. if (!m_pSmplMsrResultFile)
  219. {
  220. // invalid sample measure result file pointer
  221. LogErrorTrace(__FILE__, __LINE__, _T("Save: invalid sample measure result file pointer."));
  222. return FALSE;
  223. }
  224. // check the pathname string
  225. a_strPathname.Trim();
  226. if (a_strPathname.IsEmpty())
  227. {
  228. // file save as dialog
  229. CFileDialog dlg(FALSE, SMPL_MSR_RESULT_FILE_EXT, NULL, OFN_OVERWRITEPROMPT, SMPL_MSR_RESULT_FILE_FILTER);
  230. if (dlg.DoModal() != IDOK)
  231. {
  232. // user canceled loading
  233. LogTrace(__FILE__, __LINE__, _T("Save: user canceled save."));
  234. return FALSE;
  235. }
  236. // get file pathname
  237. a_strPathname = dlg.GetPathName();
  238. }
  239. // get path of the pathname
  240. CString strFilePath = COTSHelper::GetFolderName(a_strPathname);
  241. if (strFilePath.IsEmpty())
  242. {
  243. // file path string is an empty string
  244. LogErrorTrace(__FILE__, __LINE__, _T("Save: file path string is an empty string."));
  245. return FALSE;
  246. }
  247. // check if the path exists
  248. if (!COTSFileSys::Exists(strFilePath))
  249. {
  250. // file path doesn't exist create it
  251. if (!COTSFileSys::CreateFolder(strFilePath))
  252. {
  253. // failed to create file path
  254. LogErrorTrace(__FILE__, __LINE__, _T("Save: failed to create file path (%s)."), strFilePath);
  255. return FALSE;
  256. }
  257. }
  258. tinyxml2::XMLDocument doc;
  259. if (COTSFileSys::Exists(a_strPathname))
  260. {
  261. doc.LoadFile(a_strPathname);//载入xml文件
  262. }
  263. doc.Clear();
  264. tinyxml2::XMLDeclaration* declaration = doc.NewDeclaration();//添加xml文件头申明
  265. doc.InsertFirstChild(declaration);
  266. tinyxml2::XMLElement *rootNode;
  267. rootNode = doc.NewElement(RootClassName);
  268. doc.InsertEndChild(rootNode);
  269. m_pSmplMsrResultFile->Serialize(true, &doc, rootNode);
  270. int result = doc.SaveFile(a_strPathname);
  271. // ok, return TRUE
  272. return TRUE;
  273. }
  274. // field file sub folder string
  275. CString CSmplMsrResultFileMgr::GetFieldFileSubFolderStr()
  276. {
  277. // return empty string if working folder
  278. if (m_strWorkingFolder.IsEmpty())
  279. {
  280. return _T("");
  281. }
  282. // add "\\" at the string end if it is not "\\"
  283. if (m_strWorkingFolder.Right(1) != _T('\\'))
  284. {
  285. m_strWorkingFolder += _T("\\");
  286. }
  287. // field file sub folder string
  288. CString strFieldFileSubFolder = m_strWorkingFolder;
  289. CString strFIELDS_FILE_SUBFOLDER = _T("FIELD_FILES");
  290. if (strFieldFileSubFolder.Find(_T(strFIELDS_FILE_SUBFOLDER)) <= 0)
  291. {
  292. strFieldFileSubFolder = m_strWorkingFolder + SMPL_MSR_RESULT_FIELDS_FILE_SUBFOLDER + _T("\\");
  293. }
  294. else
  295. {
  296. strFieldFileSubFolder = m_strWorkingFolder;
  297. }
  298. // return field file sub folder string
  299. return strFieldFileSubFolder;
  300. }
  301. // save a BSE file for a field
  302. BOOL CSmplMsrResultFileMgr::SaveBSEFileForAField(COTSFieldMgrPtr a_pField)
  303. {
  304. // check input
  305. ASSERT(a_pField);
  306. if (!a_pField)
  307. {
  308. LogErrorTrace(__FILE__, __LINE__, _T("SaveBSEFileForAField: invalid field data pointer."));
  309. return FALSE;
  310. }
  311. // get field BSE file pathname
  312. CString strBSEFilePathname = m_strWorkingFolder + _T("\\") + SMPL_MSR_RESULT_FIELDS_FILE_SUBFOLDER + _T("\\");
  313. // save BSE file for the field
  314. CBSEImgPtr pBSEImage = a_pField->GetBSEImage();
  315. CBSEImgFileMgrPtr pBSEImgFileMgr = CBSEImgFileMgrPtr(new CBSEImgFileMgr());
  316. pBSEImgFileMgr->SetBSEImg(pBSEImage);
  317. pBSEImgFileMgr->Save(strBSEFilePathname);
  318. // ok, return TRUE
  319. return TRUE;
  320. }
  321. // save a x-ray file for a field
  322. BOOL CSmplMsrResultFileMgr::SaveXRayFileForAField(COTSFieldMgrPtr a_pField)
  323. {
  324. // check input
  325. ASSERT(a_pField);
  326. if (!a_pField)
  327. {
  328. LogErrorTrace(__FILE__, __LINE__, _T("SaveXRayFileForAField: invalid field data pointer."));
  329. return FALSE;
  330. }
  331. // get field x-ray file pathname
  332. CString strXRayFilePathname = m_strWorkingFolder + _T("\\") + SMPL_MSR_RESULT_FIELDS_FILE_SUBFOLDER + _T("\\");
  333. CString strXRaySearchFilename = strXRayFilePathname + SMPL_MSR_RESULT_SEARCH_X_RAY_FILE;
  334. CString strXRayAnalysisFilename = strXRayFilePathname + SMPL_MSR_RESULT_ANALYSIS_X_RAY_FILE;
  335. // save x-ray file for the field
  336. CPosXrayFileMgrPtr pPosXrayFileMgr = CPosXrayFileMgrPtr(new CPosXrayFileMgr(strXRayAnalysisFilename));
  337. CPosXraysList listSearchXray = a_pField->GetSearchPosXrayList();
  338. pPosXrayFileMgr->SetPosXrayList(listSearchXray,TRUE);
  339. pPosXrayFileMgr->SetHasElement(FALSE);
  340. if (!pPosXrayFileMgr->Save())
  341. {
  342. LogErrorTrace(__FILE__, __LINE__, _T("SaveXRayFileForAField: save search x-ray failed."));
  343. return FALSE;
  344. }
  345. CPosXraysList listAnalysisXray = a_pField->GetAnalysisPosXrayList();
  346. pPosXrayFileMgr->SetPosXrayList(listAnalysisXray, TRUE);
  347. pPosXrayFileMgr->SetHasElement(TRUE);
  348. if (!pPosXrayFileMgr->Save())
  349. {
  350. LogErrorTrace(__FILE__, __LINE__, _T("SaveXRayFileForAField: save analysis x-ray failed."));
  351. return FALSE;
  352. }
  353. // ok, return TRUE
  354. return TRUE;
  355. }
  356. // fields
  357. COTSFieldDataPtr CSmplMsrResultFileMgr::GetFieldById(int a_nID)
  358. {
  359. COTSFieldDataList listFieldData = m_pSmplMsrResultFile->GetFieldData();
  360. if (a_nID <0 || a_nID >(int)listFieldData.size())
  361. {
  362. return nullptr;
  363. }
  364. COTSFieldDataPtr pFieldData = listFieldData[a_nID];
  365. return pFieldData;
  366. }
  367. BOOL CSmplMsrResultFileMgr::AddAField(COTSFieldDataPtr a_pFieldData)
  368. {
  369. ASSERT(a_pFieldData);
  370. if (!a_pFieldData)
  371. {
  372. // empty field data pointer
  373. LogErrorTrace(__FILE__, __LINE__, _T("AddAField: empty field data pointer."));
  374. return FALSE;
  375. }
  376. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  377. listFieldData.push_back(a_pFieldData);
  378. return TRUE;
  379. }
  380. BOOL CSmplMsrResultFileMgr::DeleteAFieldById(int a_nID)
  381. {
  382. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  383. if (a_nID <0 || a_nID > (int)listFieldData.size())
  384. {
  385. return FALSE;
  386. }
  387. listFieldData.erase(listFieldData.begin()+a_nID);
  388. return TRUE;
  389. }
  390. void CSmplMsrResultFileMgr::SetSample(COTSSamplePtr a_pSample)
  391. {
  392. ASSERT(a_pSample);
  393. if (!a_pSample)
  394. {
  395. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample."));
  396. return;
  397. }
  398. ASSERT(m_pSmplMsrResultFile);
  399. if (!m_pSmplMsrResultFile)
  400. {
  401. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  402. return;
  403. }
  404. m_pSmplMsrResultFile->SetSample(a_pSample);
  405. }
  406. void CSmplMsrResultFileMgr::SetSEMGnr(CSEMDataGnrPtr a_pSEMGnr)
  407. {
  408. ASSERT(a_pSEMGnr);
  409. if (!a_pSEMGnr)
  410. {
  411. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid SEM general data pointer."));
  412. return;
  413. }
  414. ASSERT(m_pSmplMsrResultFile);
  415. if (!m_pSmplMsrResultFile)
  416. {
  417. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  418. return;
  419. }
  420. m_pSmplMsrResultFile->SetSEMStage(a_pSEMGnr);
  421. }
  422. // get id for a new field
  423. int CSmplMsrResultFileMgr::GetIdForANewField(int a_nLastFieldId)
  424. {
  425. // new field id
  426. int nNewFieldId = a_nLastFieldId;// +this->m_pSmplMsrResultFile->GetSample()->GetMsrStatus()->GetCompletedFields();
  427. // safety check
  428. ASSERT(m_pSmplMsrResultFile);
  429. if (!m_pSmplMsrResultFile)
  430. {
  431. // shouldn't be here, invalid sample measure result file
  432. LogErrorTrace(__FILE__, __LINE__, _T("GetIdForANewField: invalid sample measure result file."));
  433. return nNewFieldId;
  434. }
  435. // make the new field id is unit
  436. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  437. BOOL bUnit = FALSE;
  438. do
  439. {
  440. auto itr = std::find_if(listFieldData.begin(), listFieldData.end(), [nNewFieldId](COTSFieldDataPtr p) { return p->GetId() == nNewFieldId; });
  441. bUnit = (itr == listFieldData.end());
  442. if (!bUnit)
  443. {
  444. ++nNewFieldId;
  445. }
  446. }
  447. while (!bUnit);
  448. // return new field id
  449. return nNewFieldId;
  450. }
  451. // set SEMStageData
  452. void CSmplMsrResultFileMgr::SetSEMStageData(CSEMStageDataPtr a_pSEMStageData)
  453. {
  454. ASSERT(a_pSEMStageData);
  455. if (!a_pSEMStageData)
  456. {
  457. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid SEM stage data pointer."));
  458. return;
  459. }
  460. ASSERT(m_pSmplMsrResultFile);
  461. if (!m_pSmplMsrResultFile)
  462. {
  463. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  464. return;
  465. }
  466. m_pSmplMsrResultFile->SetSEMStageData(a_pSEMStageData);
  467. }
  468. // set SEMStage
  469. void CSmplMsrResultFileMgr::SetSEMStage(CStagePtr a_pStage)
  470. {
  471. ASSERT(a_pStage);
  472. if (!a_pStage)
  473. {
  474. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid stage pointer."));
  475. return;
  476. }
  477. ASSERT(m_pSmplMsrResultFile);
  478. if (!m_pSmplMsrResultFile)
  479. {
  480. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  481. return;
  482. }
  483. m_pSmplMsrResultFile->SetStage(a_pStage);
  484. }
  485. COTSFieldMgrList CSmplMsrResultFileMgr::GetOTSFldMgrListAndAnalysisXrayList()
  486. {
  487. 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.
  488. {
  489. return m_listFieldMgr;
  490. }
  491. m_listFieldMgr.clear();
  492. ASSERT(m_pSmplMsrResultFile);
  493. if (!m_pSmplMsrResultFile)
  494. {
  495. LogErrorTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: invalid sample measure result file pointer."));
  496. return m_listFieldMgr;
  497. }
  498. //Get FieldDataList
  499. COTSFieldDataList listFieldData = m_pSmplMsrResultFile->GetFieldData();
  500. int nFieldNum = (int)listFieldData.size();
  501. m_listAnalysisXray.clear();
  502. // get field number
  503. for (auto pFieldData : listFieldData)
  504. {
  505. COTSFieldMgrPtr pFieldMgr = COTSFieldMgrPtr(new COTSFieldMgr());
  506. // get FieldData
  507. pFieldMgr->SetOTSFieldData(pFieldData);
  508. COTSParticleList& listParticle = pFieldData->GetParticleList();
  509. if (listParticle.empty())
  510. {
  511. LogInfoTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: there is no particle in this field."));
  512. continue;
  513. }
  514. // get BSE
  515. CString strFieldFileFolder = pFieldData->GetFieldFileFolder();
  516. int nId = pFieldData->GetId();
  517. CString sFieldId;
  518. sFieldId.Format(_T("%d"), nId);
  519. CString strBSEFilePathname = strFieldFileFolder + SMPL_MSR_RESULT_FIELDS_BSE + sFieldId + BMP_IMG_FILE_EXT;
  520. CBSEImgFileMgrPtr pBSEImgFile = CBSEImgFileMgrPtr(new CBSEImgFileMgr());
  521. if (!pBSEImgFile->LoadFromBitmap(strBSEFilePathname))
  522. {
  523. LogErrorTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: can't load BSE File."));
  524. CMsrResultsPtr pMsrResults = CMsrResultsPtr(new CMsrResults());
  525. pFieldMgr->SetMsrResult(pMsrResults);
  526. m_listFieldMgr.push_back(pFieldMgr);
  527. continue;
  528. }
  529. CBSEImgPtr pBSEImg = pBSEImgFile->GetBSEImg();
  530. //pFieldMgr->SetBSEImage(CBSEImgPtr(new CBSEImg(*pBSEImg.get())));
  531. pFieldMgr->SetBSEImage(pBSEImg);
  532. // get analysis X-ray list
  533. CString strXRayAnalysisFilename = strFieldFileFolder + _T("\\") + SMPL_MSR_RESULT_ANALYSIS_X_RAY_FILE;
  534. CPosXrayFileMgrPtr pPosAnalysisXrayFileMgr = CPosXrayFileMgrPtr(new CPosXrayFileMgr(strXRayAnalysisFilename));
  535. pPosAnalysisXrayFileMgr->SetHasElement(TRUE);
  536. if (!pPosAnalysisXrayFileMgr->Load(pFieldData->GetId(),strXRayAnalysisFilename))
  537. {
  538. LogTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: load analysis x-ray of field %d failed."), pFieldData->GetId());
  539. CMsrResultsPtr pMsrResults = CMsrResultsPtr(new CMsrResults());
  540. pFieldMgr->SetMsrResult(pMsrResults);
  541. m_listFieldMgr.push_back(pFieldMgr);
  542. continue;
  543. }
  544. CPosXraysList listAnalysisXray = pPosAnalysisXrayFileMgr->GetPosXrayList();
  545. pFieldMgr->SetAnalysisPosXayList(listAnalysisXray);
  546. SetAnalysisXrayToList(listAnalysisXray);
  547. //Mrs result need compute
  548. CMsrResultsPtr pMsrResults = CMsrResultsPtr(new CMsrResults());
  549. pFieldMgr->SetMsrResult(pMsrResults);
  550. m_listFieldMgr.push_back(pFieldMgr);
  551. }
  552. return m_listFieldMgr;
  553. }
  554. void CSmplMsrResultFileMgr::SetParticleList(COTSParticleList& a_listParticle)
  555. {
  556. m_listParticle.clear();
  557. for (auto pParticle : a_listParticle)
  558. {
  559. //COTSParticlePtr pParticleNew = COTSParticlePtr(new COTSParticle(*pParticle.get()));
  560. //COTSParticlePtr pParticleNew = pParticle;
  561. m_listParticle.push_back(pParticle);
  562. }
  563. }
  564. BOOL CSmplMsrResultFileMgr::ComputeParticleList()
  565. {
  566. ASSERT(m_pSmplMsrResultFile);
  567. if (!m_pSmplMsrResultFile)
  568. {
  569. LogErrorTrace(__FILE__, __LINE__, _T("GetParticleList: invalid sample measure result file pointer."));
  570. return FALSE;
  571. }
  572. m_listParticle.clear();
  573. //Get FieldDataList
  574. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  575. for (auto pFieldData : listFieldData)
  576. {
  577. COTSParticleList listParticle = pFieldData->GetParticleList();
  578. for (auto pParticle : listParticle)
  579. {
  580. //COTSParticlePtr pParticleNew = COTSParticlePtr(new COTSParticle(*pParticle.get()));
  581. //COTSParticlePtr pParticleNew =pParticle;
  582. m_listParticle.push_back(pParticle);
  583. }
  584. }
  585. return TRUE;
  586. }
  587. BOOL CSmplMsrResultFileMgr::SetAnalysisXrayToList(CPosXraysList a_listAnalysisXray)
  588. {
  589. //m_listAnalysisXray.clear();
  590. for (auto pXray: a_listAnalysisXray)
  591. {
  592. //CPosXrayPtr pXrayNew = pXray;
  593. m_listAnalysisXray.push_back(pXray);
  594. }
  595. return TRUE;
  596. }
  597. // protected
  598. // create a new file
  599. BOOL CSmplMsrResultFileMgr::CreateFileMgr(CString a_strPathname)
  600. {
  601. // check the file pathname
  602. a_strPathname.Trim();
  603. if (a_strPathname.IsEmpty())
  604. {
  605. // file pathname is an empty string
  606. LogTrace(__FILE__, __LINE__, _T("Init: file pathname string is an empty string."));
  607. return FALSE;
  608. }
  609. // create sample measure result file
  610. m_pSmplMsrResultFile = CSmplMsrResultFilePtr(new CSmplMsrResultFile());
  611. SetPathName(a_strPathname);
  612. // ok, return TRUE
  613. return TRUE;
  614. }
  615. }