SmplMsrResultFileMgr.cpp 21 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. //
  314. // // save BSE file for the field
  315. // CBSEImgPtr pBSEImage = a_pField->GetBSEImage();
  316. // CBSEImgFileMgrPtr pBSEImgFileMgr = CBSEImgFileMgrPtr(new CBSEImgFileMgr());
  317. // pBSEImgFileMgr->SetBSEImg(pBSEImage);
  318. // pBSEImgFileMgr->Save(strBSEFilePathname);
  319. // // ok, return TRUE
  320. // return TRUE;
  321. //}
  322. // save a x-ray file for a field
  323. BOOL CSmplMsrResultFileMgr::SaveXRayFileForAField(COTSFieldMgrPtr a_pField)
  324. {
  325. // check input
  326. ASSERT(a_pField);
  327. if (!a_pField)
  328. {
  329. LogErrorTrace(__FILE__, __LINE__, _T("SaveXRayFileForAField: invalid field data pointer."));
  330. return FALSE;
  331. }
  332. // get field x-ray file pathname
  333. CString strXRayFilePathname = m_strWorkingFolder + _T("\\") + SMPL_MSR_RESULT_FIELDS_FILE_SUBFOLDER + _T("\\");
  334. CString strXRaySearchFilename = strXRayFilePathname + SMPL_MSR_RESULT_SEARCH_X_RAY_FILE;
  335. CString strXRayAnalysisFilename = strXRayFilePathname + SMPL_MSR_RESULT_ANALYSIS_X_RAY_FILE;
  336. // save x-ray file for the field
  337. CPosXrayFileMgrPtr pPosXrayFileMgr = CPosXrayFileMgrPtr(new CPosXrayFileMgr(strXRayAnalysisFilename));
  338. CPosXraysList listSearchXray = a_pField->GetSearchPosXrayList();
  339. pPosXrayFileMgr->SetPosXrayList(listSearchXray,TRUE);
  340. pPosXrayFileMgr->SetHasElement(FALSE);
  341. if (!pPosXrayFileMgr->Save())
  342. {
  343. LogErrorTrace(__FILE__, __LINE__, _T("SaveXRayFileForAField: save search x-ray failed."));
  344. return FALSE;
  345. }
  346. CPosXraysList listAnalysisXray = a_pField->GetAnalysisPosXrayList();
  347. pPosXrayFileMgr->SetPosXrayList(listAnalysisXray, TRUE);
  348. pPosXrayFileMgr->SetHasElement(TRUE);
  349. if (!pPosXrayFileMgr->Save())
  350. {
  351. LogErrorTrace(__FILE__, __LINE__, _T("SaveXRayFileForAField: save analysis x-ray failed."));
  352. return FALSE;
  353. }
  354. // ok, return TRUE
  355. return TRUE;
  356. }
  357. // fields
  358. COTSFieldDataPtr CSmplMsrResultFileMgr::GetFieldById(int a_nID)
  359. {
  360. COTSFieldDataList listFieldData = m_pSmplMsrResultFile->GetFieldData();
  361. if (a_nID <0 || a_nID >(int)listFieldData.size())
  362. {
  363. return nullptr;
  364. }
  365. COTSFieldDataPtr pFieldData = listFieldData[a_nID];
  366. return pFieldData;
  367. }
  368. BOOL CSmplMsrResultFileMgr::AddAField(COTSFieldDataPtr a_pFieldData)
  369. {
  370. ASSERT(a_pFieldData);
  371. if (!a_pFieldData)
  372. {
  373. // empty field data pointer
  374. LogErrorTrace(__FILE__, __LINE__, _T("AddAField: empty field data pointer."));
  375. return FALSE;
  376. }
  377. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  378. listFieldData.push_back(a_pFieldData);
  379. return TRUE;
  380. }
  381. BOOL CSmplMsrResultFileMgr::DeleteAFieldById(int a_nID)
  382. {
  383. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  384. if (a_nID <0 || a_nID > (int)listFieldData.size())
  385. {
  386. return FALSE;
  387. }
  388. listFieldData.erase(listFieldData.begin()+a_nID);
  389. return TRUE;
  390. }
  391. void CSmplMsrResultFileMgr::SetSample(COTSSamplePtr a_pSample)
  392. {
  393. ASSERT(a_pSample);
  394. if (!a_pSample)
  395. {
  396. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample."));
  397. return;
  398. }
  399. ASSERT(m_pSmplMsrResultFile);
  400. if (!m_pSmplMsrResultFile)
  401. {
  402. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  403. return;
  404. }
  405. m_pSmplMsrResultFile->SetSample(a_pSample);
  406. }
  407. void CSmplMsrResultFileMgr::SetSEMGnr(CSEMDataGnrPtr a_pSEMGnr)
  408. {
  409. ASSERT(a_pSEMGnr);
  410. if (!a_pSEMGnr)
  411. {
  412. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid SEM general data pointer."));
  413. return;
  414. }
  415. ASSERT(m_pSmplMsrResultFile);
  416. if (!m_pSmplMsrResultFile)
  417. {
  418. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  419. return;
  420. }
  421. m_pSmplMsrResultFile->SetSEMStage(a_pSEMGnr);
  422. }
  423. // get id for a new field
  424. int CSmplMsrResultFileMgr::GetIdForANewField(int a_nLastFieldId)
  425. {
  426. // new field id
  427. int nNewFieldId = a_nLastFieldId;// +this->m_pSmplMsrResultFile->GetSample()->GetMsrStatus()->GetCompletedFields();
  428. // safety check
  429. ASSERT(m_pSmplMsrResultFile);
  430. if (!m_pSmplMsrResultFile)
  431. {
  432. // shouldn't be here, invalid sample measure result file
  433. LogErrorTrace(__FILE__, __LINE__, _T("GetIdForANewField: invalid sample measure result file."));
  434. return nNewFieldId;
  435. }
  436. // make the new field id is unit
  437. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  438. BOOL bUnit = FALSE;
  439. do
  440. {
  441. auto itr = std::find_if(listFieldData.begin(), listFieldData.end(), [nNewFieldId](COTSFieldDataPtr p) { return p->GetId() == nNewFieldId; });
  442. bUnit = (itr == listFieldData.end());
  443. if (!bUnit)
  444. {
  445. ++nNewFieldId;
  446. }
  447. }
  448. while (!bUnit);
  449. // return new field id
  450. return nNewFieldId;
  451. }
  452. // set SEMStageData
  453. void CSmplMsrResultFileMgr::SetSEMStageData(CSEMStageDataPtr a_pSEMStageData)
  454. {
  455. ASSERT(a_pSEMStageData);
  456. if (!a_pSEMStageData)
  457. {
  458. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid SEM stage data pointer."));
  459. return;
  460. }
  461. ASSERT(m_pSmplMsrResultFile);
  462. if (!m_pSmplMsrResultFile)
  463. {
  464. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  465. return;
  466. }
  467. m_pSmplMsrResultFile->SetSEMStageData(a_pSEMStageData);
  468. }
  469. // set SEMStage
  470. void CSmplMsrResultFileMgr::SetSEMStage(CStagePtr a_pStage)
  471. {
  472. ASSERT(a_pStage);
  473. if (!a_pStage)
  474. {
  475. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid stage pointer."));
  476. return;
  477. }
  478. ASSERT(m_pSmplMsrResultFile);
  479. if (!m_pSmplMsrResultFile)
  480. {
  481. LogErrorTrace(__FILE__, __LINE__, _T("input a invalid sample result file manager."));
  482. return;
  483. }
  484. m_pSmplMsrResultFile->SetStage(a_pStage);
  485. }
  486. //COTSFieldMgrList CSmplMsrResultFileMgr::GetOTSFldMgrListAndAnalysisXrayList()
  487. //{
  488. //
  489. // 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.
  490. // {
  491. // return m_listFieldMgr;
  492. // }
  493. // m_listFieldMgr.clear();
  494. // ASSERT(m_pSmplMsrResultFile);
  495. // if (!m_pSmplMsrResultFile)
  496. // {
  497. // LogErrorTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: invalid sample measure result file pointer."));
  498. // return m_listFieldMgr;
  499. // }
  500. // //Get FieldDataList
  501. // COTSFieldDataList listFieldData = m_pSmplMsrResultFile->GetFieldData();
  502. // int nFieldNum = (int)listFieldData.size();
  503. // m_listAnalysisXray.clear();
  504. // // get field number
  505. // for (auto pFieldData : listFieldData)
  506. // {
  507. // COTSFieldMgrPtr pFieldMgr = COTSFieldMgrPtr(new COTSFieldMgr());
  508. // // get FieldData
  509. // pFieldMgr->SetOTSFieldData(pFieldData);
  510. //
  511. // COTSParticleList& listParticle = pFieldData->GetParticleList();
  512. // if (listParticle.empty())
  513. // {
  514. // LogInfoTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: there is no particle in this field."));
  515. // continue;
  516. // }
  517. // // get BSE
  518. // CString strFieldFileFolder = pFieldData->GetFieldFileFolder();
  519. // int nId = pFieldData->GetId();
  520. // CString sFieldId;
  521. // sFieldId.Format(_T("%d"), nId);
  522. // CString strBSEFilePathname = strFieldFileFolder + SMPL_MSR_RESULT_FIELDS_BSE + sFieldId + BMP_IMG_FILE_EXT;
  523. // CBSEImgFileMgrPtr pBSEImgFile = CBSEImgFileMgrPtr(new CBSEImgFileMgr());
  524. // if (!pBSEImgFile->LoadFromBitmap(strBSEFilePathname))
  525. // {
  526. // LogErrorTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: can't load BSE File."));
  527. // CMsrResultsPtr pMsrResults = CMsrResultsPtr(new CMsrResults());
  528. // pFieldMgr->SetMsrResult(pMsrResults);
  529. // m_listFieldMgr.push_back(pFieldMgr);
  530. // continue;
  531. // }
  532. // CBSEImgPtr pBSEImg = pBSEImgFile->GetBSEImg();
  533. // //pFieldMgr->SetBSEImage(CBSEImgPtr(new CBSEImg(*pBSEImg.get())));
  534. // pFieldMgr->SetBSEImage(pBSEImg);
  535. // // get analysis X-ray list
  536. // CString strXRayAnalysisFilename = strFieldFileFolder + _T("\\") + SMPL_MSR_RESULT_ANALYSIS_X_RAY_FILE;
  537. // CPosXrayFileMgrPtr pPosAnalysisXrayFileMgr = CPosXrayFileMgrPtr(new CPosXrayFileMgr(strXRayAnalysisFilename));
  538. // pPosAnalysisXrayFileMgr->SetHasElement(TRUE);
  539. // if (!pPosAnalysisXrayFileMgr->Load(pFieldData->GetId(),strXRayAnalysisFilename))
  540. // {
  541. // LogTrace(__FILE__, __LINE__, _T("GetOTSFieldMgrList: load analysis x-ray of field %d failed."), pFieldData->GetId());
  542. // CMsrResultsPtr pMsrResults = CMsrResultsPtr(new CMsrResults());
  543. // pFieldMgr->SetMsrResult(pMsrResults);
  544. // m_listFieldMgr.push_back(pFieldMgr);
  545. // continue;
  546. // }
  547. // CPosXraysList listAnalysisXray = pPosAnalysisXrayFileMgr->GetPosXrayList();
  548. // pFieldMgr->SetAnalysisPosXayList(listAnalysisXray);
  549. // SetAnalysisXrayToList(listAnalysisXray);
  550. // //Mrs result need compute
  551. // CMsrResultsPtr pMsrResults = CMsrResultsPtr(new CMsrResults());
  552. // pFieldMgr->SetMsrResult(pMsrResults);
  553. // m_listFieldMgr.push_back(pFieldMgr);
  554. // }
  555. // return m_listFieldMgr;
  556. //}
  557. void CSmplMsrResultFileMgr::SetParticleList(COTSParticleList& a_listParticle)
  558. {
  559. m_listParticle.clear();
  560. for (auto pParticle : a_listParticle)
  561. {
  562. //COTSParticlePtr pParticleNew = COTSParticlePtr(new COTSParticle(*pParticle.get()));
  563. //COTSParticlePtr pParticleNew = pParticle;
  564. m_listParticle.push_back(pParticle);
  565. }
  566. }
  567. BOOL CSmplMsrResultFileMgr::ComputeParticleList()
  568. {
  569. ASSERT(m_pSmplMsrResultFile);
  570. if (!m_pSmplMsrResultFile)
  571. {
  572. LogErrorTrace(__FILE__, __LINE__, _T("GetParticleList: invalid sample measure result file pointer."));
  573. return FALSE;
  574. }
  575. m_listParticle.clear();
  576. //Get FieldDataList
  577. COTSFieldDataList& listFieldData = m_pSmplMsrResultFile->GetFieldData();
  578. for (auto pFieldData : listFieldData)
  579. {
  580. COTSParticleList listParticle = pFieldData->GetParticleList();
  581. for (auto pParticle : listParticle)
  582. {
  583. //COTSParticlePtr pParticleNew = COTSParticlePtr(new COTSParticle(*pParticle.get()));
  584. //COTSParticlePtr pParticleNew =pParticle;
  585. m_listParticle.push_back(pParticle);
  586. }
  587. }
  588. return TRUE;
  589. }
  590. BOOL CSmplMsrResultFileMgr::SetAnalysisXrayToList(CPosXraysList a_listAnalysisXray)
  591. {
  592. //m_listAnalysisXray.clear();
  593. for (auto pXray: a_listAnalysisXray)
  594. {
  595. //CPosXrayPtr pXrayNew = pXray;
  596. m_listAnalysisXray.push_back(pXray);
  597. }
  598. return TRUE;
  599. }
  600. // protected
  601. // create a new file
  602. BOOL CSmplMsrResultFileMgr::CreateFileMgr(CString a_strPathname)
  603. {
  604. // check the file pathname
  605. a_strPathname.Trim();
  606. if (a_strPathname.IsEmpty())
  607. {
  608. // file pathname is an empty string
  609. LogTrace(__FILE__, __LINE__, _T("Init: file pathname string is an empty string."));
  610. return FALSE;
  611. }
  612. // create sample measure result file
  613. m_pSmplMsrResultFile = CSmplMsrResultFilePtr(new CSmplMsrResultFile());
  614. SetPathName(a_strPathname);
  615. // ok, return TRUE
  616. return TRUE;
  617. }
  618. }