#include "stdafx.h" #include "TriTempFileMgr.h" #include "OTSFileSys.h" #include "OTSHelper.h" #include "COTSUtilityDllFunExport.h" namespace OTSMODEL { using namespace OTSDATA; // constructor CTriTempFileMgr::CTriTempFileMgr() { // initialization Init(); } // copy constructor CTriTempFileMgr::CTriTempFileMgr(const CTriTempFileMgr& a_oSource) { // can't copy itself if (&a_oSource == this) { return; } // copy data over Duplicate(a_oSource); } // copy constructor CTriTempFileMgr::CTriTempFileMgr(CTriTempFileMgr* a_poSource) { // can't copy itself if (a_poSource == this) { return; } // copy data over Duplicate(*a_poSource); } // =operator CTriTempFileMgr& CTriTempFileMgr::operator=(const CTriTempFileMgr& a_oSource) { // cleanup Cleanup(); // copy the class data over Duplicate(a_oSource); // return class return *this; } // ==operator BOOL CTriTempFileMgr::operator==(const CTriTempFileMgr& a_oSource) { // members return *(m_poTriTempFile.get()) == *(a_oSource.m_poTriTempFile.get()); } // destructor CTriTempFileMgr::~CTriTempFileMgr() { // cleanup Cleanup(); } // public // Load/Save BOOL CTriTempFileMgr::Load(CString a_strPathName /*= _T("")*/, BOOL a_bClear /*= TRUE*/) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // clear all data if necessary if (a_bClear) { Init(); } // check file pathname a_strPathName.Trim(); if (a_strPathName.IsEmpty()) { // file open dialog CFileDialog dlg(TRUE, TRIA_TEMP_FILE_EXT, NULL, OFN_FILEMUSTEXIST, TRIA_TEMP_FILE_FILTER); if (dlg.DoModal() != IDOK) { return FALSE; } // get file pathname a_strPathName = dlg.GetPathName(); } // open the particle analysis standard file // create a new triangle template point CTriTempFilePtr poTriTempFile = CTriTempFilePtr(new CTriTempFile()); // create a loading archive tinyxml2::XMLDocument doc; doc.LoadFile(a_strPathName);//载入xml文件 tinyxml2::XMLElement *rootNode; rootNode = doc.FirstChildElement(RootClassName); poTriTempFile->Serialize(false, &doc, rootNode); // file version CString strFileVersion = poTriTempFile->GetVersion(); DWORD nFileVersion = COTSHelper::GetVersionFromString(strFileVersion); if (nFileVersion == 0) { // invalid file LogErrorTrace(__FILE__, __LINE__, _T("Load: invalid particle size level file %s"), a_strPathName); return FALSE; } m_poTriTempFile = poTriTempFile ; // file pathname m_strPathName = a_strPathName; // set file modify flag to FALSE m_bModify = FALSE; // ok, return TRUE return TRUE; } BOOL CTriTempFileMgr::Save(CString a_strPathName /*= _T("")*/) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // check file pathname a_strPathName.Trim(); if (a_strPathName.IsEmpty()) { // file save as dialog CFileDialog dlg(FALSE, TRIA_TEMP_FILE_EXT, NULL, OFN_OVERWRITEPROMPT, TRIA_TEMP_FILE_FILTER); if (dlg.DoModal() != IDOK) { return FALSE; } // get file pathname a_strPathName = dlg.GetPathName(); } // create the file tinyxml2::XMLDocument doc; doc.LoadFile(a_strPathName);//载入xml文件 doc.Clear(); tinyxml2::XMLDeclaration* declaration = doc.NewDeclaration();//添加xml文件头申明 doc.InsertFirstChild(declaration); tinyxml2::XMLElement *rootNode; rootNode = doc.NewElement(RootClassName); doc.InsertEndChild(rootNode); m_poTriTempFile->Serialize(true, &doc, rootNode); int result = doc.SaveFile(a_strPathName); // file pathname m_strPathName = a_strPathName; // set file modify flag to FALSE m_bModify = FALSE; // ok, return TRUE return TRUE; } // part size items list void CTriTempFileMgr::SetTriTempItemList(CTriTempItemList& a_listTriTempItems, BOOL a_bClear/* = TRUE*/) { CTriTempItemList listTriTemp; ASSERT(m_poTriTempFile); if (!m_poTriTempFile) { LogErrorTrace(__FILE__, __LINE__, _T("SetTriTempItemList: invalid triangle template pointer.")); return; } m_poTriTempFile->SetTriTempItemList(a_listTriTempItems, a_bClear); } CTriTempItemPtr CTriTempFileMgr::GetTriTempItemByIndex(int a_nIndex) { CTriTempItemList listTriTemp = m_poTriTempFile->GetTriTempItemList(); if (a_nIndex < 0 || a_nIndex >(int)listTriTemp.size()) { LogErrorTrace(__FILE__, __LINE__, _T("GetTriTempItemByIndex: invalid index.")); return nullptr; } CTriTempItemPtr pTriTempItem = CTriTempItemPtr(new CTriTempItem(*(listTriTemp[a_nIndex].get()))); return pTriTempItem; } CTriTempItemPtr CTriTempFileMgr::GetTriTempItemByName(CString a_strName) { CTriTempItemList listTriTemp = m_poTriTempFile->GetTriTempItemList(); // make sure there is no a same name item in the list auto itr = std::find_if(listTriTemp.begin(), listTriTemp.end(), [a_strName](CTriTempItemPtr& poPartSizeItem) { return poPartSizeItem->GetTemplateName().CompareNoCase(a_strName) == 0; }); if (itr != listTriTemp.end()) { // same name std item already in the list LogErrorTrace(__FILE__, __LINE__, _T("GetTriTempItemByName: can't find the same name in the list. name is %s"), a_strName); return FALSE; } CTriTempItemPtr pTriTemp = *itr; return CTriTempItemPtr(new CTriTempItem(*(pTriTemp.get()))); } BOOL CTriTempFileMgr::DeleteTriTempItemByIndex(int a_nIndex) { CTriTempItemList listTriTemp = m_poTriTempFile->GetTriTempItemList(); if (a_nIndex >= 0 && a_nIndex < (int)listTriTemp.size()) { listTriTemp.erase(listTriTemp.begin() + a_nIndex); } SetTriTempItemList(listTriTemp); return TRUE; } BOOL CTriTempFileMgr::AddTriTempItem(CTriTempItemPtr a_poTriTempItem) { ASSERT(a_poTriTempItem); if (!a_poTriTempItem) { LogErrorTrace(__FILE__, __LINE__, _T("AddTriTempItem: empty triangle template item.")); return FALSE; } CTriTempItemList listTriTemp = m_poTriTempFile->GetTriTempItemList(); // make sure there is no a same name item in the list CString strName = a_poTriTempItem->GetTemplateName(); auto itr = std::find_if(listTriTemp.begin(), listTriTemp.end(), [strName](CTriTempItemPtr& poTriTempItem) { return poTriTempItem->GetTemplateName().CompareNoCase(strName) == 0; }); if (itr != listTriTemp.end()) { // same name std item already in the list LogErrorTrace(__FILE__, __LINE__, _T("AddSTDItem: same name std item already in the list. %s"), strName); return FALSE; } listTriTemp.push_back(a_poTriTempItem); SetTriTempItemList(listTriTemp); return TRUE; } BOOL CTriTempFileMgr::InsertTriTempItem(int a_nIndex, CTriTempItemPtr a_poTriTempItem) { ASSERT(a_poTriTempItem); if (!a_poTriTempItem) { LogErrorTrace(__FILE__, __LINE__, _T("InsertTriTempItem: empty triangle template item.")); return FALSE; } CTriTempItemList listTriTemp = m_poTriTempFile->GetTriTempItemList(); if (a_nIndex < 0 || a_nIndex >(int)listTriTemp.size()) { LogErrorTrace(__FILE__, __LINE__, _T("InsertTriTempItem: invalid index.")); return FALSE; } // make sure there is no a same name item in the list CString strName = a_poTriTempItem->GetTemplateName(); auto itr = std::find_if(listTriTemp.begin(), listTriTemp.end(), [strName](CTriTempItemPtr& poTriTempItem) { return poTriTempItem->GetTemplateName().CompareNoCase(strName) == 0; }); if (itr != listTriTemp.end()) { // same name std item already in the list LogErrorTrace(__FILE__, __LINE__, _T("InsertTriTempItem: same name triangle item already in the list. %s"), strName); return FALSE; } listTriTemp.insert(listTriTemp.begin() + a_nIndex, a_poTriTempItem); return TRUE; } BOOL CTriTempFileMgr::EditTriTempItem(int a_nIndex, CTriTempItemPtr a_poTriTempItem) { // input check ASSERT(a_poTriTempItem); if (!a_poTriTempItem) { // invalid std item pointer LogErrorTrace(__FILE__, __LINE__, _T("EditTriTempItem: invalid input triangle item pointer.")); return FALSE; } // get part size items list CTriTempItemList listTriTemp = m_poTriTempFile->GetTriTempItemList(); // check index value if (a_nIndex < 0 || a_nIndex >(int)listTriTemp.size()) { // invalid index LogErrorTrace(__FILE__, __LINE__, _T("EditTriTempItem: invalid index.")); return FALSE; } // make sure there is no a same name item in the list CString strName = a_poTriTempItem->GetTemplateName(); if (a_nIndex > 0) { auto itr = std::find_if(listTriTemp.begin(), listTriTemp.begin() + a_nIndex - 1, [strName](CTriTempItemPtr& poTriTempItem) { return poTriTempItem->GetTemplateName().CompareNoCase(strName) == 0; }); if (itr != listTriTemp.end()) { // same name item already in the list LogErrorTrace(__FILE__, __LINE__, _T("EditTriTempItem: same name triangle template item already in the list. %s"), strName); return FALSE; } } else if (a_nIndex != (int)listTriTemp.size() - 1) { auto itr = std::find_if(listTriTemp.begin() + a_nIndex + 1, listTriTemp.end(), [strName](CTriTempItemPtr& poTriTempItem) { return poTriTempItem->GetTemplateName().CompareNoCase(strName) == 0; }); if (itr != listTriTemp.end()) { // same name std item already in the list LogErrorTrace(__FILE__, __LINE__, _T("EditSTDItem: same name std item already in the list. %s"), strName); return FALSE; } } // replace the part size item *(listTriTemp[a_nIndex].get()) = *(a_poTriTempItem.get()); // ok, return TRUE return TRUE; } void CTriTempFileMgr::SetTriTempFile(CTriTempFilePtr a_poTriTempFile) { ASSERT(a_poTriTempFile); if (!a_poTriTempFile) { LogErrorTrace(__FILE__, __LINE__, _T("SetPartSizeFile: empty triangle template file pointer.")); return; } m_poTriTempFile = CTriTempFilePtr(new CTriTempFile(*a_poTriTempFile.get())); } // protected // cleanup void CTriTempFileMgr::Cleanup() { // need to do nothing at the moment } // initialization void CTriTempFileMgr::Init() { // initialization m_strPathName = _T(""); m_bModify = FALSE; m_poTriTempFile = CTriTempFilePtr(new CTriTempFile()); } // duplication void CTriTempFileMgr::Duplicate(const CTriTempFileMgr& a_oSource) { // initialization Init(); // copy data over m_strPathName = a_oSource.m_strPathName; m_bModify = a_oSource.m_bModify; m_poTriTempFile = CTriTempFilePtr(new CTriTempFile(a_oSource.m_poTriTempFile.get())); } }