PosXrayFileMgr.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. #pragma once
  2. #include "stdafx.h"
  3. #include "PosXrayFileMgr.h"
  4. #include "OTSFileSys.h"
  5. #include "OTSHelper.h"
  6. namespace OTSMODEL {
  7. using namespace OTSTools;
  8. // project file extension
  9. const CString POS_XRAY_FILE_EXT = _T("db");
  10. // project file filter
  11. const CString POS_XRAY_FILE_FILTER = _T("Position X-ray Files (*.db)|*.db|All Files (*.*)|*.*||");
  12. // constructor
  13. CPosXrayFileMgr::CPosXrayFileMgr(CString fileName)
  14. {
  15. // initialization
  16. m_strPathName = fileName;
  17. Init();/*because this database has been merged into Inclution.db,so there's no need to create again.*/
  18. }
  19. // destructor
  20. CPosXrayFileMgr::~CPosXrayFileMgr()
  21. {
  22. // cleanup
  23. Cleanup();
  24. //delete m_listPosXray;
  25. }
  26. // public
  27. BOOL CPosXrayFileMgr::CreateXrayFile()
  28. {
  29. // check file name
  30. m_strPathName.Trim();
  31. if (m_strPathName.IsEmpty())
  32. {
  33. // error, wrong file name
  34. LogErrorTrace(__FILE__,__LINE__,_T("Empty file path name"));
  35. ASSERT(FALSE);
  36. return FALSE;
  37. }
  38. // get database name
  39. CString sDatabaseName = GetPathName();
  40. if (COTSFileSys::Exists(sDatabaseName))
  41. {
  42. if (!Open(m_strPathName, FALSE))
  43. {
  44. LogErrorTrace(__FILE__, __LINE__, _T("Open X-ray file failed."));
  45. ASSERT(FALSE);
  46. return FALSE;
  47. }
  48. }
  49. else
  50. {
  51. if (!Create(m_strPathName))
  52. {
  53. LogErrorTrace(__FILE__, __LINE__, _T("Create X-ray file failed."));
  54. ASSERT(FALSE);
  55. return FALSE;
  56. }
  57. }
  58. return TRUE;
  59. }
  60. // Load/Save
  61. BOOL CPosXrayFileMgr::Load(int fldId,CString a_strPathName /*= _T("")*/, BOOL a_bClear /*= TRUE*/)
  62. {
  63. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  64. // clear all data if necessary
  65. if (a_bClear)
  66. {
  67. Init();
  68. }
  69. // check file pathname
  70. a_strPathName.Trim();
  71. if (a_strPathName.IsEmpty())
  72. {
  73. // file open dialog
  74. CFileDialog dlg(TRUE, POS_XRAY_FILE_EXT, NULL, OFN_FILEMUSTEXIST, POS_XRAY_FILE_FILTER);
  75. if (dlg.DoModal() != IDOK)
  76. {
  77. return FALSE;
  78. }
  79. // get file pathname
  80. a_strPathName = dlg.GetPathName();
  81. }
  82. // file pathname
  83. m_strPathName = a_strPathName;
  84. if (!GetXrayList(fldId))
  85. {
  86. //LogTrace(__FILE__, __LINE__, _T("Get X-ray list of field %d failed."), fldId);
  87. return FALSE;
  88. }
  89. // ok, return TRUE
  90. return TRUE;
  91. }
  92. BOOL CPosXrayFileMgr::Save()
  93. {
  94. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  95. CString a_strPathName = m_strPathName;
  96. // check file pathname
  97. a_strPathName.Trim();
  98. if (a_strPathName.IsEmpty())
  99. {
  100. // file save as dialog
  101. CFileDialog dlg(FALSE, POS_XRAY_FILE_EXT, NULL, OFN_OVERWRITEPROMPT, POS_XRAY_FILE_FILTER);
  102. if (dlg.DoModal() != IDOK)
  103. {
  104. return FALSE;
  105. }
  106. // get file pathname
  107. a_strPathName = dlg.GetPathName();
  108. }
  109. // file pathname
  110. m_strPathName = a_strPathName;
  111. if (!SaveXrayList())
  112. {
  113. LogErrorTrace(__FILE__, __LINE__, _T("Get X-ray list failed."));
  114. return FALSE;
  115. }
  116. // ok, return TRUE
  117. return TRUE;
  118. }
  119. // check if a xray containing any element of the elements list
  120. BOOL CPosXrayFileMgr::IsXrayContainElements(CPosXrayPtr a_pXray, CElementsList& a_listElements, BOOL& a_bResult)
  121. {
  122. // safety check
  123. ASSERT(a_pXray);
  124. if (!a_pXray)
  125. {
  126. // invalid x-ray pointer
  127. LogErrorTrace(__FILE__, __LINE__, _T("IsXrayContainElements: invalid x-ray pointer."));
  128. return FALSE;
  129. }
  130. // get peak list of the x-ray
  131. COTSPeakList a_listPeaks;
  132. if (!CPosXrayFileMgr::GetPeaksList(a_pXray, a_listPeaks))
  133. {
  134. // failed to get peaks list of x-ray
  135. LogErrorTrace(__FILE__, __LINE__, _T("IsXrayContainElements: failed to call GetPeaksList method."));
  136. return FALSE;
  137. }
  138. // x-ray has no peaks
  139. if (a_listPeaks.empty())
  140. {
  141. // x-ray has no peaks means that this x-ray data is empty, result set to FALSE.
  142. a_bResult = FALSE;
  143. }
  144. else if (a_listElements.empty())
  145. {
  146. // result set to TRUE if element list is empty
  147. a_bResult = TRUE;
  148. }
  149. else
  150. {
  151. for (auto pElement : a_listElements)
  152. {
  153. // check if the peaks list contains peaks of the element
  154. a_bResult = TRUE;
  155. }
  156. }
  157. // ok, return TRUE
  158. return TRUE;
  159. }
  160. // CPosXrayFileMgr::get peaks list of a x-ray
  161. BOOL CPosXrayFileMgr::GetPeaksList(CPosXrayPtr a_pXray, COTSPeakList& a_listPeaks)
  162. {
  163. // safety check
  164. ASSERT(a_pXray);
  165. if (!a_pXray)
  166. {
  167. // invalid x-ray pointer
  168. LogErrorTrace(__FILE__, __LINE__, _T("GetPeaksList: invalid x-ray pointer."));
  169. return FALSE;
  170. }
  171. // clear list
  172. a_listPeaks.clear();
  173. DWORD* nXrayData;
  174. DWORD* nXrayDataOld;
  175. nXrayData = new DWORD[GENERALXRAYCHANNELS];
  176. nXrayDataOld = new DWORD[GENERALXRAYCHANNELS];
  177. DWORD* nXrayDataSrc = a_pXray->GetXrayData();
  178. // copy data
  179. memcpy(nXrayData, nXrayDataSrc, sizeof(DWORD)*GENERALXRAYCHANNELS);
  180. memcpy(nXrayDataOld, nXrayDataSrc, sizeof(DWORD)*GENERALXRAYCHANNELS);
  181. // find max value
  182. DWORD nMax = nXrayData[0];
  183. for (unsigned int i = 0; i < GENERALXRAYCHANNELS; i++)
  184. {
  185. if (nXrayData[i] > nMax)
  186. nMax = nXrayData[i];
  187. }
  188. // set threshold
  189. DWORD nThreshold = (DWORD)(nMax * 0.1 + 0.5);
  190. for (unsigned int i = 0; i < GENERALXRAYCHANNELS; i++)
  191. {
  192. if (nXrayData[i] > nThreshold)
  193. {
  194. nXrayData[i] = nMax;
  195. }
  196. else
  197. {
  198. nXrayData[i] = 0;
  199. }
  200. }
  201. // find range
  202. std::vector<DWORD> listUp;
  203. std::vector<DWORD> listDown;
  204. listUp.clear();
  205. for(int i = 0; i < GENERALXRAYCHANNELS - 1; i++)
  206. {
  207. if (nXrayData[i] == 0 && nXrayData[i + 1] == nMax)
  208. listUp.push_back(i);
  209. }
  210. listDown.clear();
  211. for (int i = 1; i < GENERALXRAYCHANNELS; i++)
  212. {
  213. if (nXrayData[i] == nMax && nXrayData[i + 1] == 0)
  214. listDown.push_back(i);
  215. }
  216. // find peak
  217. if (listUp.size() == listDown.size())
  218. {
  219. if (listUp[0] > listDown[0])
  220. {
  221. listUp.erase(listUp.begin());
  222. listDown.erase(listDown.end());
  223. }
  224. }
  225. else if ((int)listUp.size() == ((int)listDown.size() + 1))
  226. {
  227. listUp.erase(listUp.end());
  228. }
  229. else if ((int)listDown.size() == ((int)listUp.size() + 1))
  230. {
  231. listDown.erase(listDown.begin());
  232. }
  233. if (listUp.size() != listDown.size())
  234. {
  235. LogErrorTrace(__FILE__, __LINE__, _T("Can't fix the range."));
  236. return FALSE;
  237. }
  238. int nLength = (int)listUp.size();
  239. for (unsigned int i = 0; i < nLength; i++)
  240. {
  241. COTSPeakPtr pPeak = COTSPeakPtr(new COTSPeak());
  242. CIntRange oIntRang;
  243. oIntRang.SetEnd(listDown[i]);
  244. oIntRang.SetStart(listUp[i]);
  245. pPeak->SetRange(oIntRang);
  246. // record the last max position
  247. DWORD nMaxTemp = *(nXrayDataOld + listUp[i]);
  248. int nPos;
  249. for (int p = (int)listUp[i]; p < (int)listDown[i]; p++)
  250. {
  251. if (nXrayDataOld[p] > nMaxTemp)
  252. {
  253. nMaxTemp = nXrayDataOld[p];
  254. nPos = p;
  255. }
  256. }
  257. pPeak->SetHeight(nMaxTemp);
  258. pPeak->SetPosition(nPos);
  259. a_listPeaks.push_back(pPeak);
  260. }
  261. delete[]nXrayData;
  262. delete[]nXrayDataOld;
  263. // ok, return TRUE
  264. return TRUE;
  265. }
  266. void CPosXrayFileMgr::SetPosXrayList(CPosXraysList& a_listPosXray, BOOL a_bClear)
  267. {
  268. // clear holes list if necessary
  269. if (a_bClear)
  270. {
  271. m_listPosXray.clear();
  272. }
  273. // copy the list
  274. for (auto pPosXray : a_listPosXray)
  275. {
  276. m_listPosXray.push_back(pPosXray);
  277. }
  278. }
  279. BOOL CPosXrayFileMgr::GetXrayList(int fldId)
  280. {
  281. //get x-ray info list
  282. CPosXrayInfoList listInfo;
  283. listInfo.clear();
  284. if (!GetXrayInfoList(listInfo,fldId))
  285. {
  286. LogErrorTrace(__FILE__, __LINE__, _T("GetXrayList: get x-ray info failed."));
  287. return FALSE;
  288. }
  289. if (listInfo.empty())
  290. {
  291. return FALSE;
  292. }
  293. for (auto pInfo : listInfo)
  294. {
  295. //get x-ray data
  296. CPosXrayPtr pXray = CPosXrayPtr(new CPosXray());
  297. pXray->SetIndex(pInfo->GetIndex());
  298. pXray->SetPartTagId(pInfo->GetPartTagId());
  299. pXray->SetPosition(pInfo->GetPosition());
  300. pXray->SetScanFieldId(pInfo->GetScanFieldId());
  301. pXray->SetFeatureId(pInfo->GetFeatureId());
  302. const long a_nXrayId = pInfo->GetIndex();
  303. const long a_nFieldId = pInfo->GetScanFieldId();
  304. if (!GetXrayData(a_nXrayId, a_nFieldId, pXray))
  305. {
  306. LogErrorTrace(__FILE__, __LINE__, _T("GetXrayList: get x-ray data failed."));
  307. return FALSE;
  308. }
  309. //get element list
  310. if (m_bHasElement)
  311. {
  312. long nElementSize = pInfo->GetElementNum();
  313. if (nElementSize == 0)
  314. {
  315. m_listPosXray.push_back(pXray);
  316. continue;
  317. }
  318. CElementChemistriesList listElementChemistry;
  319. if (!GetElementChemistry(a_nXrayId, a_nFieldId, nElementSize, listElementChemistry))
  320. {
  321. LogErrorTrace(__FILE__, __LINE__, _T("GetXrayList: get x-ray data failed."));
  322. return FALSE;
  323. }
  324. pXray->SetElementQuantifyData(listElementChemistry);
  325. }
  326. m_listPosXray.push_back(pXray);
  327. }
  328. return TRUE;
  329. }
  330. BOOL CPosXrayFileMgr::SaveXrayList()
  331. {
  332. if (!m_listPosXray.empty())
  333. {
  334. auto XrayDataDB = GetXrayDataDB();
  335. if (!XrayDataDB)
  336. {
  337. LogErrorTrace(__FILE__, __LINE__, _T("Failed to open result setting table"));
  338. ASSERT(FALSE);
  339. return FALSE;
  340. }
  341. auto XElementChemistryDB = GetElementChemistryDB();
  342. if (!XElementChemistryDB)
  343. {
  344. LogErrorTrace(__FILE__, __LINE__, _T("Failed to open element chemistry table"));
  345. ASSERT(FALSE);
  346. return FALSE;
  347. }
  348. XrayDataDB->GetDatastore()->CloseSynchronous();
  349. XrayDataDB->GetDatastore()->BeginTransaction();
  350. //save info list
  351. SaveXrayInfoList();
  352. for (auto pPosXray : m_listPosXray)
  353. {
  354. if (!XrayDataDB->SavePosXrayPtr(pPosXray))
  355. {
  356. LogErrorTrace(__FILE__, __LINE__, _T("Failed to save x-ray data."));
  357. return FALSE;
  358. }
  359. //save element
  360. if (m_bHasElement)
  361. {
  362. if (!XElementChemistryDB->SaveElementChemistriesList(pPosXray))
  363. {
  364. LogErrorTrace(__FILE__, __LINE__, _T("Failed to save element chemistry list data."));
  365. return FALSE;
  366. }
  367. }
  368. }
  369. XrayDataDB->GetDatastore()->CommitTransaction();
  370. }
  371. return TRUE;
  372. }
  373. BOOL CPosXrayFileMgr::SaveXrayInfoList()
  374. {
  375. auto XrayInfoDB = GetXrayInfoDB();
  376. if (!XrayInfoDB)
  377. {
  378. LogErrorTrace(__FILE__, __LINE__, _T("Failed to open result setting table"));
  379. ASSERT(FALSE);
  380. return FALSE;
  381. }
  382. if (m_listPosXray.empty())
  383. {
  384. LogErrorTrace(__FILE__, __LINE__, _T("current xray info is empty."));
  385. return FALSE;
  386. }
  387. if (!XrayInfoDB->SaveXrayInfoList(m_listPosXray))
  388. {
  389. LogErrorTrace(__FILE__, __LINE__, _T("Failed to save xray info list."));
  390. return FALSE;
  391. }
  392. return TRUE;
  393. }
  394. //Get XrayInfoList
  395. BOOL CPosXrayFileMgr::GetXrayInfoList(CPosXrayInfoList& a_listXray,int fldId)
  396. {
  397. auto XrayInfoDB = GetXrayInfoDB();
  398. if (!XrayInfoDB)
  399. {
  400. LogErrorTrace(__FILE__,__LINE__,_T("Failed to open result setting table"));
  401. ASSERT(FALSE);
  402. return FALSE;
  403. }
  404. a_listXray = XrayInfoDB->GetXrayInfoListByFieldId(fldId);
  405. return TRUE;
  406. }
  407. BOOL CPosXrayFileMgr::GetXrayData(const long a_nXrayId, const long a_nFieldId, CPosXrayPtr a_pPosXray)
  408. {
  409. ASSERT(a_pPosXray);
  410. if (!a_pPosXray)
  411. {
  412. LogErrorTrace(__FILE__, __LINE__, _T("Invalid x-ray point."));
  413. return FALSE;
  414. }
  415. auto XrayDataDB = GetXrayDataDB();
  416. if (!XrayDataDB)
  417. {
  418. LogErrorTrace(__FILE__, __LINE__, _T("Failed to open result setting table"));
  419. ASSERT(FALSE);
  420. return FALSE;
  421. }
  422. CPosXrayPtr pPosXray = XrayDataDB->GetXRayDataById(a_nXrayId, a_nFieldId);
  423. a_pPosXray->SetXrayData(pPosXray->GetXrayData());
  424. return TRUE;
  425. }
  426. BOOL CPosXrayFileMgr::GetElementChemistry(const long a_nXrayId, const long a_nFieldId, const long a_nElementSize, CElementChemistriesList& a_listElementChemistry)
  427. {
  428. auto XElementChemistryDB = GetElementChemistryDB();
  429. if (!XElementChemistryDB)
  430. {
  431. LogErrorTrace(__FILE__, __LINE__, _T("Failed to open result setting table"));
  432. ASSERT(FALSE);
  433. return FALSE;
  434. }
  435. a_listElementChemistry.clear();
  436. a_listElementChemistry = XElementChemistryDB->GetElementChemistryListById(a_nXrayId, a_nFieldId, a_nElementSize);
  437. return TRUE;
  438. }
  439. CXRayDataDBPtr CPosXrayFileMgr::GetXrayDataDB()
  440. {
  441. if (!m_pXrayDataDB)
  442. {
  443. auto datastorePtr = GetDatastore();
  444. if (datastorePtr)
  445. {
  446. m_pXrayDataDB = std::make_shared<CXRayDataDB>(datastorePtr);
  447. }
  448. }
  449. ASSERT(m_pXrayDataDB);
  450. return m_pXrayDataDB;
  451. }
  452. CElementChemistryDBPtr CPosXrayFileMgr::GetElementChemistryDB()
  453. {
  454. if (!m_pElementChemistryDB)
  455. {
  456. auto datastorePtr = GetDatastore();
  457. if (datastorePtr)
  458. {
  459. m_pElementChemistryDB = std::make_shared<CElementChemistryDB>(datastorePtr);
  460. }
  461. }
  462. ASSERT(m_pElementChemistryDB);
  463. return m_pElementChemistryDB;
  464. }
  465. CPosXrayInfoDBPtr CPosXrayFileMgr::GetXrayInfoDB()
  466. {
  467. if (!m_pXrayInfoDB)
  468. {
  469. auto datastorePtr = GetDatastore();
  470. if (datastorePtr)
  471. {
  472. m_pXrayInfoDB = std::make_shared<CPosXrayInfoDB>(datastorePtr);
  473. }
  474. }
  475. ASSERT(m_pXrayInfoDB);
  476. return m_pXrayInfoDB;
  477. }
  478. // cleanup
  479. void CPosXrayFileMgr::Cleanup()
  480. {
  481. // need to do nothing at the moment
  482. m_listPosXray.clear();
  483. }
  484. // initialization
  485. void CPosXrayFileMgr::Init()
  486. {
  487. // initialization
  488. m_listPosXray.clear();
  489. if (!CreateXrayFile())
  490. {
  491. ASSERT(false);
  492. }
  493. }
  494. // duplication
  495. void CPosXrayFileMgr::Duplicate(const CPosXrayFileMgr& a_oSource)
  496. {
  497. // initialization
  498. m_listPosXray.clear();
  499. // copy data over
  500. for (auto pPosXray : a_oSource.m_listPosXray)
  501. {
  502. CPosXrayPtr pPosXrayNew = CPosXrayPtr(new CPosXray(*pPosXray.get()));
  503. m_listPosXray.push_back(pPosXrayNew);
  504. }
  505. }
  506. }