STDFileMgr.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. #include "stdafx.h"
  2. #include "STDFileMgr.h"
  3. #include "OTSFileSys.h"
  4. //#include "OTSHelper.h"
  5. namespace OTSClassifyEngine {
  6. const CString strInclutionPathName = ".\\Config\\SysData\\IncSysLib\\IncASTDData.db";
  7. // constructor
  8. CSTDFileMgr::CSTDFileMgr()
  9. {
  10. // initialization
  11. void Init();
  12. }
  13. // destructor
  14. CSTDFileMgr::~CSTDFileMgr()
  15. {
  16. // cleanup
  17. Cleanup();
  18. }
  19. // public
  20. BOOL CSTDFileMgr::CreateSTDFile()
  21. {
  22. // check file name
  23. m_strPathName.Trim();
  24. if (m_strPathName.IsEmpty())
  25. {
  26. // error, wrong file name
  27. LogErrorTrace(__FILE__, __LINE__, _T("Empty file path name"));
  28. ASSERT(FALSE);
  29. return FALSE;
  30. }
  31. // get database name
  32. CString sDatabaseName = GetPathName();
  33. if (OTSTools::COTSFileSys::Exists(sDatabaseName))
  34. {
  35. if (!Open(m_strPathName, FALSE))
  36. {
  37. LogErrorTrace(__FILE__, __LINE__, _T("Open STD file failed."));
  38. ASSERT(FALSE);
  39. return FALSE;
  40. }
  41. }
  42. else
  43. {
  44. if (!Create(m_strPathName))
  45. {
  46. LogErrorTrace(__FILE__, __LINE__, _T("Create X-ray file failed."));
  47. ASSERT(FALSE);
  48. return FALSE;
  49. }
  50. }
  51. return TRUE;
  52. }
  53. // Load/Save
  54. BOOL CSTDFileMgr::Load(BOOL a_bClear /*= TRUE*/)
  55. {
  56. CString a_strPathName=strInclutionPathName;
  57. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  58. // clear all data if necessary
  59. if (a_bClear)
  60. {
  61. Init();
  62. }
  63. // check file pathname
  64. a_strPathName.Trim();
  65. if (a_strPathName.IsEmpty())
  66. {
  67. // file open dialog
  68. CFileDialog dlg(TRUE, STD_FILE_EXT, NULL, OFN_FILEMUSTEXIST, STD_FILE_FILTER);
  69. if (dlg.DoModal() != IDOK)
  70. {
  71. return FALSE;
  72. }
  73. // get file pathname
  74. a_strPathName = dlg.GetPathName();
  75. }
  76. // file pathname
  77. m_strPathName = a_strPathName;
  78. if (!CreateSTDFile())
  79. {
  80. LogErrorTrace(__FILE__, __LINE__, _T("Create or open STD file failed."));
  81. return FALSE;
  82. }
  83. if (!GetListSTDItem())
  84. {
  85. LogErrorTrace(__FILE__, __LINE__, _T("Get STD Item list failed."));
  86. return FALSE;
  87. }
  88. // ok, return TRUE
  89. return TRUE;
  90. }
  91. void CSTDFileMgr::SetSTDItemList(CSTDItemsList& a_listSTDItem, BOOL a_bClear)
  92. {
  93. // clear holes list if necessary
  94. if (a_bClear)
  95. {
  96. m_listSTDItem.clear();
  97. }
  98. // copy the list
  99. for (auto pSTDItem : a_listSTDItem)
  100. {
  101. //CSTDItemPtr pSTDItemNew = CSTDItemPtr(new CSTDItem(*pSTDItem.get()));
  102. m_listSTDItem.push_back(pSTDItem);
  103. }
  104. }
  105. //add code by 2018-12-7
  106. CInclutionSTDDataPtr CSTDFileMgr::GetSysSTDLibByType(SYS_STD_TYPE a_nIdentifyType)
  107. {
  108. CSTDFileMgrPtr m_poSTDFileMgr = CSTDFileMgrPtr(new CSTDFileMgr());
  109. ASSERT(m_poSTDFileMgr);
  110. CInclutionSTDDataPtr a_pSTDlib;
  111. switch (a_nIdentifyType)
  112. {
  113. case SYS_STD_TYPE::GENERAL:
  114. a_pSTDlib = m_poSTDFileMgr->GenerateSTDLib(IDENTIFY_KIND::ALL);
  115. break;
  116. case SYS_STD_TYPE::SPECIAL1:
  117. a_pSTDlib = m_poSTDFileMgr->GenerateSTDLib(IDENTIFY_KIND::ALL);
  118. break;
  119. case SYS_STD_TYPE::SPECIAL2:
  120. a_pSTDlib = m_poSTDFileMgr->GenerateSTDLib(IDENTIFY_KIND::ALL);
  121. break;
  122. case SYS_STD_TYPE::SPECIAL3:
  123. a_pSTDlib = m_poSTDFileMgr->GenerateSTDLib(IDENTIFY_KIND::ALL);
  124. break;
  125. case SYS_STD_TYPE::SPECIAL4:
  126. a_pSTDlib = m_poSTDFileMgr->GenerateSTDLib(IDENTIFY_KIND::ALL);
  127. break;
  128. case SYS_STD_TYPE::SPECIAL5:
  129. a_pSTDlib = m_poSTDFileMgr->GenerateSTDLib(IDENTIFY_KIND::ALL);
  130. break;
  131. case SYS_STD_TYPE::SPECIAL6:
  132. a_pSTDlib = m_poSTDFileMgr->GenerateSTDLib(IDENTIFY_KIND::ALL);
  133. break;
  134. case SYS_STD_TYPE::SPECIAL7:
  135. a_pSTDlib = m_poSTDFileMgr->GenerateSTDLib(IDENTIFY_KIND::ALL);
  136. break;
  137. default:
  138. //error log
  139. break;
  140. }
  141. ASSERT(a_pSTDlib);
  142. if (!a_pSTDlib)
  143. {
  144. //error log
  145. }
  146. return a_pSTDlib;
  147. }
  148. CInclutionSTDDataPtr CSTDFileMgr::GenerateSTDLib(IDENTIFY_KIND a_nIdentifyKind)
  149. {
  150. CInclutionSTDDataPtr pPartSTDData = CInclutionSTDDataPtr(new CInclutionSTDData());
  151. if (a_nIdentifyKind < IDENTIFY_KIND::MIN || a_nIdentifyKind > IDENTIFY_KIND::MAX)
  152. {
  153. return nullptr;
  154. }
  155. if (m_listSTDItem.empty())
  156. {
  157. LogErrorTrace(__FILE__, __LINE__, _T("GenerateSTDLib: system STD lib data is empty."));
  158. return nullptr;
  159. }
  160. CSTDItemsList listSTDItems;
  161. if (!((int)a_nIdentifyKind == (int)IDENTIFY_KIND::ALL))
  162. {
  163. for (auto Item : m_listSTDItem)
  164. {
  165. int nSTDId = Item->GetSTDId();
  166. int nStartId = (int)STD_START_ID + 100 * ((int)a_nIdentifyKind - 1) + 1;
  167. int nStopId = (int)STD_START_ID + 100 * (int)a_nIdentifyKind;
  168. if (nSTDId >= nStartId && nSTDId <= nStopId)
  169. {
  170. CSTDItemPtr newItem = CSTDItemPtr(new CSTDItem(*Item.get()));
  171. listSTDItems.push_back(newItem);
  172. }
  173. }
  174. }
  175. else
  176. {
  177. for (auto Item : m_listSTDItem)
  178. {
  179. CSTDItemPtr newItem = CSTDItemPtr(new CSTDItem(*Item.get()));
  180. listSTDItems.push_back(newItem);
  181. }
  182. }
  183. pPartSTDData->SetSTDItemsList(listSTDItems, TRUE);
  184. // version
  185. CString strVersion = PART_STD_FILE_VERSION;
  186. pPartSTDData->SetFileVersion(strVersion);
  187. CString strName = _T("");
  188. switch ((int)a_nIdentifyKind)
  189. {
  190. case (int)IDENTIFY_KIND::ALL:
  191. strName = STD_FILE_SYS_ALL;
  192. break;
  193. case (int)IDENTIFY_KIND::SIMPLE_OXIDE:
  194. strName = STD_FILE_SYS_SIMPLE_OXIDE;
  195. break;
  196. case (int)IDENTIFY_KIND::COMPLEX_OXIDE:
  197. strName = STD_FILE_SYS_COMPLEX_OXIDE;
  198. break;
  199. case (int)IDENTIFY_KIND::SULFIDE:
  200. strName = STD_FILE_SYS_SULFIDE;
  201. break;
  202. case (int)IDENTIFY_KIND::NITRIDES:
  203. strName = STD_FILE_SYS_NITRIDES;
  204. break;
  205. }
  206. pPartSTDData->SetName(strName);
  207. //CElementsList m_listElements;
  208. //not used at this moment
  209. return pPartSTDData;
  210. }
  211. BOOL CSTDFileMgr::GetListSTDItem()
  212. {
  213. //get x-ray info list
  214. CSTDItemsList listInfo;
  215. listInfo.clear();
  216. if (!GetListSTDItem(listInfo))
  217. {
  218. LogErrorTrace(__FILE__, __LINE__, _T("GetListSTDItem: get STD item list failed."));
  219. return FALSE;
  220. }
  221. if (listInfo.empty())
  222. {
  223. LogErrorTrace(__FILE__, __LINE__, _T("GetListSTDItem: get STD item list failed."));
  224. return FALSE;
  225. }
  226. for (auto pInfo : listInfo)
  227. {
  228. //get x-ray data
  229. CSTDItemPtr pItem = CSTDItemPtr(new CSTDItem(*pInfo.get()));
  230. const long a_STDId = pInfo->GetSTDId();
  231. if (!GetSTDData(a_STDId, pItem))
  232. {
  233. LogErrorTrace(__FILE__, __LINE__, _T("GetXrayList: get STD item data failed."));
  234. return FALSE;
  235. }
  236. //get element list
  237. /*long nElementSize = pInfo->GetElementRange();
  238. if (nElementSize == 0)
  239. {
  240. m_listSTDItem.push_back(pItem);
  241. continue;
  242. }*/
  243. /*CElementRangeList listElementRange;
  244. if (!GetElementRange(a_STDId, nElementSize, listElementRange))
  245. {
  246. LogErrorTrace(__FILE__, __LINE__, _T("GetXrayList: get x-ray data failed."));
  247. return FALSE;
  248. }
  249. pItem->SetElementRangeList(listElementRange);*/
  250. m_listSTDItem.push_back(pItem);
  251. }
  252. return TRUE;
  253. }
  254. //Get XrayInfoList
  255. BOOL CSTDFileMgr::GetListSTDItem(CSTDItemsList& a_listSTDItem)
  256. {
  257. auto STDDataDB = GetSTDDataDB();
  258. if (!STDDataDB)
  259. {
  260. LogErrorTrace(__FILE__, __LINE__, _T("Failed to open STD data table"));
  261. ASSERT(FALSE);
  262. return FALSE;
  263. }
  264. a_listSTDItem = STDDataDB->GetSTDItemList(FALSE);
  265. return TRUE;
  266. }
  267. /*BOOL CSTDFileMgr::GetElementRange(const long a_nSTDId, const long a_nElementSize, CElementRangeList& a_listElementRange)
  268. {
  269. auto ElementRangeDB = GetElementRangeDB();
  270. if (!ElementRangeDB)
  271. {
  272. LogErrorTrace(__FILE__, __LINE__, _T("Failed to open element range table"));
  273. ASSERT(FALSE);
  274. return FALSE;
  275. }
  276. a_listElementRange.clear();
  277. a_listElementRange = ElementRangeDB->GetElementRangeListById(a_nSTDId, a_nElementSize);
  278. return TRUE;
  279. }*/
  280. BOOL CSTDFileMgr::GetSTDData(const long a_nSTDId, CSTDItemPtr a_pSTDItem)
  281. {
  282. ASSERT(a_pSTDItem);
  283. if (!a_pSTDItem)
  284. {
  285. LogErrorTrace(__FILE__, __LINE__, _T("Invalid STD data point."));
  286. return FALSE;
  287. }
  288. auto STDDataDB = GetSTDDataDB();
  289. if (!STDDataDB)
  290. {
  291. LogErrorTrace(__FILE__, __LINE__, _T("Failed to open STD data table"));
  292. ASSERT(FALSE);
  293. return FALSE;
  294. }
  295. a_pSTDItem = STDDataDB->GetSTDItemById(a_nSTDId);
  296. return TRUE;
  297. }
  298. CSTDDataDBPtr CSTDFileMgr::GetSTDDataDB()
  299. {
  300. if (!m_pSTDDataDB)
  301. {
  302. auto datastorePtr = GetDatastore();
  303. if (datastorePtr)
  304. {
  305. m_pSTDDataDB = std::make_shared<CSTDDataDB>(datastorePtr);
  306. }
  307. }
  308. ASSERT(m_pSTDDataDB);
  309. return m_pSTDDataDB;
  310. }
  311. /*CElementRangeDBPtr CSTDFileMgr::GetElementRangeDB()
  312. {
  313. if (!m_pElementRangeDB)
  314. {
  315. auto datastorePtr = GetDatastore();
  316. if (datastorePtr)
  317. {
  318. m_pElementRangeDB = std::make_shared<CElementRangeDB>(datastorePtr);
  319. }
  320. }
  321. ASSERT(m_pElementRangeDB);
  322. return m_pElementRangeDB;
  323. }*/
  324. // cleanup
  325. void CSTDFileMgr::Cleanup()
  326. {
  327. // need to do nothing at the moment
  328. m_listSTDItem.clear();
  329. }
  330. // initialization
  331. void CSTDFileMgr::Init()
  332. {
  333. // initialization
  334. m_listSTDItem.clear();
  335. }
  336. // duplication
  337. void CSTDFileMgr::Duplicate(const CSTDFileMgr& a_oSource)
  338. {
  339. // initialization
  340. Init();
  341. // copy data over
  342. for (auto pSTDItem : a_oSource.m_listSTDItem)
  343. {
  344. CSTDItemPtr pSTDItemNew = CSTDItemPtr(new CSTDItem(*pSTDItem.get()));
  345. m_listSTDItem.push_back(pSTDItemNew);
  346. }
  347. }
  348. }