]> Creatis software - creaVtk.git/blobdiff - lib/creaVtk/MeshManagerModel.cpp
#3507 Undo and Redo Meshes
[creaVtk.git] / lib / creaVtk / MeshManagerModel.cpp
index 5c214513a31053d8e3328cb6560c0f6a99e65ea6..41b97706d227b76b8a5c27aec1e8f406befcdcd4 100644 (file)
 
 #include "MeshManagerModel.h"
 
-MeshManagerModel::MeshManagerModel()
+//
+//HISTORY HANDLER
+//
+template <class T>
+HistoryHandler<T>::HistoryHandler(int maxElements)
+{
+       this->maxElements = maxElements;
+}
+template <class T>
+HistoryHandler<T>::~HistoryHandler()
+{
+       CleanHistory();
+}
+
+template <class T>
+void HistoryHandler<T>::CleanHistory()
+{
+       for (T* element : redoStack)
+       {
+               delete element;
+       }
+       for (T* element : undoStack)
+       {
+               delete element;
+       }
+}
+
+template <class T>
+T* HistoryHandler<T>::Undo(T* state)
+{
+       if(!undoStack.empty())
+       {
+               auto lastElem = undoStack.back();
+               undoStack.pop_back();
+               redoStack.push_back(state);
+               return lastElem;//undoStack.back();
+       }else{
+               delete state;
+       }
+       return NULL;
+}
+
+template <class T>
+T* HistoryHandler<T>::Redo(T* state)
+{
+       if(!redoStack.empty())
+       {
+               auto lastElem = redoStack.back();
+               redoStack.pop_back();
+               undoStack.push_back(state);
+               return lastElem;
+       }else{
+               delete state;
+       }
+       return NULL;
+}
+
+template <class T>
+void HistoryHandler<T>::Save(T* state)
+{
+       undoStack.push_back(state);
+       if(undoStack.size() > maxElements)
+       {
+               delete undoStack.front();
+               undoStack.pop_front();
+       }
+       if(!redoStack.empty())
+       {
+               for (T* element : redoStack)
+               {
+                       delete element;
+               } 
+               redoStack.clear();
+       }
+}
+
+template <class T>
+T* HistoryHandler<T>::GetPrevious()
+{
+       if(!undoStack.empty())
+       {       
+               return undoStack.back();
+       }
+       return NULL;
+}
+
+template <class T>
+T* HistoryHandler<T>::GetNext()
+{
+       if(!redoStack.empty())
+       {       
+               return redoStack.back();
+       }
+       return NULL;
+}
+
+template <class T>
+int HistoryHandler<T>::UndoSize()
 {
-    _meshBase = NULL;
+       return undoStack.size();
+}
+
+template <class T>
+int HistoryHandler<T>::RedoSize()
+{
+       return redoStack.size();
+}
+
+////////////////////
+/////////////////////// MESH MODEL
+////////////////////
+
+MeshModel::MeshModel(int id)
+{
+       _meshBase = NULL;
     _meshTemp = NULL;
+    _meshId = id;
+    _name = "mesh-" + std::to_string(id);
 }
 
-MeshManagerModel::~MeshManagerModel()
+MeshModel::MeshModel(vtkPolyData* mesh, int id)
+{
+       if(mesh != NULL)
+       {
+               _meshBase = vtkPolyData::New();//mesh;
+               _meshBase->DeepCopy(mesh);
+               _meshTemp = vtkPolyData::New();
+               _meshTemp->DeepCopy(_meshBase);
+               _meshId = id;
+       _name = "mesh-" + std::to_string(id);
+       }
+}
+
+MeshModel::MeshModel(MeshModel* meshModel)
+{
+       _meshBase = NULL;
+    _meshTemp = NULL;
+       if(meshModel->GetMeshBase() != NULL)
+       {
+               _meshBase = vtkPolyData::New();
+               _meshBase->DeepCopy(meshModel->GetMeshBase());
+               ResetMeshTemp_();
+       }
+       _meshId = meshModel->GetId();
+       _name = "mesh-" + std::to_string(meshModel->GetId());
+}
+
+MeshModel::~MeshModel()
 {
+       if(_meshBase != NULL)
+       {
+               _meshBase->Delete();
+       }
+       if(_meshTemp != NULL)
+       {
+               _meshTemp->Delete();
+       }
 }
 
-void MeshManagerModel::ResetMeshTemp_()
+void MeshModel::ResetMeshTemp_()
 {
-    printf("EED MeshManagerModel::Process ResetMeshTemp_ Start\n");
     if (_meshBase!=NULL)
     {
         if (_meshTemp!=NULL)
@@ -47,41 +195,50 @@ void MeshManagerModel::ResetMeshTemp_()
             _meshTemp->Delete();
         } // if
         _meshTemp = vtkPolyData::New();
-        printf("EED MeshManagerModel::Process ResetMeshTemp_ 1\n");
         _meshTemp->DeepCopy(_meshBase);
-        printf("EED MeshManagerModel::Process ResetMeshTemp_ 2\n");
     } else {
-        _meshTemp=NULL;
+        if (_meshTemp!=NULL)
+        {
+            _meshTemp->Delete();
+            _meshTemp = NULL;
+        }
     }
-    printf("EED MeshManagerModel::Process ResetMeshTemp_ End\n");
 }
 
-void MeshManagerModel::SetMeshBase(vtkPolyData* mesh)
+void MeshModel::SetMeshBase(vtkPolyData* mesh)
 {
     if (mesh!=NULL)
     {
-        _meshBase = mesh;
+       if(_meshBase != NULL)
+       {
+               _meshBase->Delete();
+       }
+        _meshBase = vtkPolyData::New();
+        _meshBase->DeepCopy(mesh);
         ResetMeshTemp_();
-        RefreshOutputs();
     } // if mesh
 }
 
-void MeshManagerModel::SetMeshMemoryMode(vtkPolyData* mesh)
+void MeshModel::SetMeshMemoryMode(vtkPolyData* mesh)
 {
-    _meshBase = mesh;
-    RefreshOutputs();
+       if(_meshBase != NULL)
+       {
+               _meshBase->Delete();
+               _meshBase = NULL;
+       }
+       if(mesh != NULL)
+       {
+               _meshBase = vtkPolyData::New();
+               _meshBase->DeepCopy(mesh);
+       }
 }
 
-void MeshManagerModel::ResetMeshTemp()
+void MeshModel::ResetMeshTemp()
 {
-    printf("EED MeshManagerModel::Process ResetMeshTemp 1\n");
     ResetMeshTemp_();
-    printf("EED MeshManagerModel::Process ResetMeshTemp 2\n");
-    RefreshOutputs();
-    printf("EED MeshManagerModel::Process ResetMeshTemp 3\n");
 }
 
-void MeshManagerModel::CopySetMeshBase(vtkPolyData* mesh)
+void MeshModel::CopySetMeshBase(vtkPolyData* mesh)
 {
     if (mesh!=NULL)
     {
@@ -92,16 +249,431 @@ void MeshManagerModel::CopySetMeshBase(vtkPolyData* mesh)
 }
 
 
-vtkPolyData*  MeshManagerModel::GetMeshBase()
+vtkPolyData* MeshModel::GetMeshBase()
 {
    return _meshBase;
 }
 
-vtkPolyData*  MeshManagerModel::GetMeshTemp()
+vtkPolyData* MeshModel::GetMeshTemp()
 {
    return _meshTemp;
 }
 
-void MeshManagerModel::RefreshOutputs() // virtula
+int MeshModel::GetId()
+{
+       return _meshId;
+}
+
+std::string MeshModel::GetName()
+{
+       return _name;
+}
+
+////////////////////
+/////////////////////// MESH MANAGER
+////////////////////
+
+MeshManagerModel::MeshManagerModel()
+{
+       currentMesh = 0;
+       meshId = 0;
+       history = new HistoryHandler<ManagerState>(15);
+       lastModified = 0;
+}
+
+MeshManagerModel::~MeshManagerModel()
+{
+       DeleteAll();
+}
+
+void MeshManagerModel::RefreshOutputs(bool signalBox) // virtual
+{
+}
+
+void MeshManagerModel::ResetHistory()
+{
+       history->CleanHistory();
+       //Save();
+}
+
+int MeshManagerModel::GetNumberOfMeshes()
+{
+       return _meshes.size();
+}
+
+void MeshManagerModel::AddMesh_(vtkPolyData* mesh)
+{
+       if(mesh != NULL)
+       {
+               _meshes.push_back(std::make_shared<MeshModel>(mesh, meshId));
+               meshId++;
+       }else{
+               printf("PG MeshManagerModel::AddMesh Mesh is null \n");
+       }
+}
+
+void MeshManagerModel::AddMesh(vtkPolyData* mesh)
+{
+       Save();
+       AddMesh_(mesh);
+       lastModified = currentMesh;
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::AddMeshes_(std::vector<vtkPolyData*> meshList)
+{
+       if(!meshList.empty())
+       {
+               MeshModel *meshModel;
+               for(int i = 0; i < meshList.size(); i++){
+                       _meshes.push_back(std::make_shared<MeshModel>(meshList[i], meshId));
+                       meshId++;
+               }
+       }else{
+               printf("PG MeshManagerModel::AddMeshes Empty list of meshes \n");
+       }
+}
+
+void MeshManagerModel::AddMeshes(std::vector<vtkPolyData*> meshList)
+{
+       Save();
+       AddMeshes_(meshList);
+       lastModified = currentMesh;
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::AddEmptyMesh_()
+{
+       _meshes.push_back(std::make_shared<MeshModel>(meshId));
+       meshId++;
+}
+
+void MeshManagerModel::AddEmptyMesh()
+{
+       Save();
+       AddEmptyMesh_();
+       lastModified = currentMesh;
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::InsertMeshesAtCurrent_(std::vector<vtkPolyData*> meshList)
+{
+       if(!meshList.empty())
+       {
+               std::vector<std::shared_ptr<MeshModel>> tmpVect;
+               MeshModel *meshModel;
+               for(int i = 0; i < meshList.size(); i++){
+                       tmpVect.push_back(std::make_shared<MeshModel>(meshList[i], meshId));
+                       meshId++;
+               }
+               _meshes.insert(_meshes.begin() + currentMesh, tmpVect.begin(), tmpVect.end());
+       }else{
+               printf("PG MeshManagerModel::InsertMeshesAtCurrent Empty list of meshes \n");
+       }
+}
+
+void MeshManagerModel::InsertMeshesAtCurrent(std::vector<vtkPolyData*> meshList)
+{
+       Save();
+       InsertMeshesAtCurrent_(meshList);
+       lastModified = currentMesh;
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::SelectMesh(int i) 
 {
+       if(i >= 0 && i < _meshes.size())
+       {
+               int prevCurrent = currentMesh;
+               currentMesh = i;
+               if(prevCurrent != i)
+               {
+                       RefreshOutputs(true);           
+               }
+       }
+       else{
+               printf("PG MeshManagerModel::SelectMesh index out of bounds \n");
+       }
 }
+
+void MeshManagerModel::SelectMeshByName(std::string meshName) 
+{
+       if(!_meshes.empty())
+       {
+               bool found = false;
+               for(int i = 0; i < _meshes.size() && !found; i++){
+                       if(_meshes.at(i)->GetName() == meshName)
+                       {
+                               found = true;
+                               SelectMesh(i);
+                       }
+               }
+       }
+}
+
+void MeshManagerModel::DeleteMesh_(int position)
+{
+       if(position >= 0 && position < _meshes.size())
+       {
+               _meshes.erase(_meshes.begin() + position);
+               currentMesh = currentMesh + (position <= currentMesh?-1:0);
+               if(currentMesh < 0)
+               {
+                       currentMesh = 0;
+               }
+       }
+}
+
+void MeshManagerModel::DeleteMesh(int position)
+{
+       Save();
+       DeleteMesh_(position);
+       lastModified = currentMesh;
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::DeleteMeshByName(std::string meshName)
+{
+       if(!_meshes.empty())
+       {
+               bool found = false;
+               for(int i = 0; i < _meshes.size() && !found; i++){
+                       if(_meshes.at(i)->GetName() == meshName)
+                       {
+                               found = true;
+                               DeleteMesh_(i);
+                               RefreshOutputs(true);
+                       }
+               }
+       }
+}
+
+void MeshManagerModel::DeleteCurrentMesh()
+{
+       if(!_meshes.empty())
+       {
+               Save();
+               DeleteMesh_(currentMesh);
+               lastModified = currentMesh;
+               RefreshOutputs(true);
+       }
+}
+
+void MeshManagerModel::ReplaceMesh(std::vector<vtkPolyData*> meshList)
+{
+       Save();
+       if(GetNumberOfMeshes() >= 1)
+       {
+               DeleteMesh_(currentMesh);
+       }
+       InsertMeshesAtCurrent_(meshList);
+       lastModified = currentMesh;
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::DeleteAll_()
+{
+       if(!_meshes.empty())
+       {
+               currentMesh = 0;
+               _meshes.clear();
+               RefreshOutputs(true);
+       }
+}
+
+void MeshManagerModel::DeleteAll()
+{
+       Save();
+       DeleteAll_();
+       lastModified = currentMesh;
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::NextMesh()
+{
+       currentMesh++;
+       if(currentMesh >= _meshes.size())
+       {
+               currentMesh = _meshes.size()-1;
+       }
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::PreviousMesh()
+{
+       currentMesh--;
+       if(currentMesh < 0)
+       {
+               currentMesh = 0;
+       }
+       RefreshOutputs(true);
+}
+
+std::shared_ptr<MeshModel> MeshManagerModel::GetMeshModel()
+{
+       return _meshes.at(currentMesh);
+}
+
+vtkPolyData*  MeshManagerModel::GetMeshBase()
+{
+       if(!_meshes.empty())
+       {
+               return _meshes.at(currentMesh)->GetMeshBase();
+       }
+       else{
+               return NULL;
+       }
+}
+
+vtkPolyData*  MeshManagerModel::GetMeshTemp()
+{
+       if(!_meshes.empty())
+       {
+               return _meshes.at(currentMesh)->GetMeshTemp();
+       }
+       else{
+               return NULL;
+       }
+}
+
+void MeshManagerModel::SetMeshBase(vtkPolyData* mesh)
+{
+    if(!_meshes.empty())
+    {
+        Save();
+        _meshes.at(currentMesh) = std::make_shared<MeshModel>(_meshes.at(currentMesh).get());
+        _meshes.at(currentMesh)->SetMeshBase(mesh);
+        lastModified = currentMesh;
+        RefreshOutputs(true);
+    }else{
+       printf("PG MeshManagerModel::SetMeshBase Mesh vector is empty \n");
+    }
+}
+
+void MeshManagerModel::SetMeshMemoryMode(vtkPolyData* mesh)
+{
+       if(_meshes.size() > 1)
+       {
+               DeleteAll_();
+       }
+       if(_meshes.size() == 0)
+       {
+               AddEmptyMesh_();
+       }
+       _meshes.at(currentMesh)->SetMeshMemoryMode(mesh);
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::ResetMeshTemp()
+{
+       if(!_meshes.empty())
+       {
+       _meshes.at(currentMesh)->ResetMeshTemp();
+       RefreshOutputs(true);
+    }else{
+       printf("PG MeshManagerModel::ResetMeshTemp Mesh vector is empty \n");
+    }
+}
+
+void MeshManagerModel::CopySetMeshBase(vtkPolyData* mesh)
+{
+       if(!_meshes.empty())
+       {
+               Save();
+               _meshes.at(currentMesh) = std::make_shared<MeshModel>(_meshes.at(currentMesh).get());
+               _meshes.at(currentMesh)->CopySetMeshBase(mesh);
+               lastModified = currentMesh;
+               RefreshOutputs(true);
+       }
+       else{
+               printf("PG MeshManagerModel::CopySetMeshBase Mesh vector is empty \n");
+       }
+}
+
+std::vector<std::string> MeshManagerModel::GetMeshNames()
+{
+       std::vector<std::string> names;
+       for(int i = 0; i < _meshes.size(); i++){
+               names.push_back(_meshes.at(i)->GetName());
+       }
+       return names;
+}
+
+std::vector<vtkPolyData*> MeshManagerModel::GetAllPolyDatas()
+{
+       std::vector<vtkPolyData*> polydatas;
+       for(int i = 0; i < _meshes.size(); i++){
+               polydatas.push_back(_meshes.at(i)->GetMeshBase());
+       }
+       return polydatas;
+}
+
+int MeshManagerModel::GetCurrentMesh()
+{
+       return currentMesh;
+}
+
+void MeshManagerModel::Undo()
+{      
+       if(history->UndoSize() > 0)
+       {       
+               RestoreState(history->Undo(new ManagerState(_meshes, meshId, lastModified)));
+               RefreshOutputs(true);
+       }
+}
+
+void MeshManagerModel::Redo()
+{
+       if(history->RedoSize() > 0)
+       {       
+               RestoreState(history->Redo(new ManagerState(_meshes, meshId, lastModified)));
+               RefreshOutputs(true);
+       }
+}
+
+void MeshManagerModel::Save()
+{
+       history->Save(new ManagerState(_meshes, meshId, currentMesh));
+       //lastModified = currentMesh;
+}
+
+void MeshManagerModel::RestoreState(ManagerState* state)
+{
+       if(state != NULL)
+       {       
+               _meshes = state->GetMeshes();
+               meshId = state->GetMeshId();
+               currentMesh = state->GetModifiedPos();
+               lastModified = state->GetModifiedPos();
+       }
+}
+
+//
+//Manager State
+//
+MeshManagerModel::ManagerState::ManagerState(std::vector<std::shared_ptr<MeshModel>> meshesToSave, int meshId, int modifiedPos)
+{
+       savedMeshes = meshesToSave;
+       savedId = meshId;
+       savedModifiedPos = modifiedPos;
+}
+
+MeshManagerModel::ManagerState::~ManagerState()
+{
+       savedMeshes.clear();
+}
+
+std::vector<std::shared_ptr<MeshModel>>& MeshManagerModel::ManagerState::GetMeshes()
+{
+       return savedMeshes;
+}
+
+int MeshManagerModel::ManagerState::GetMeshId()
+{
+       return savedId;
+}
+int MeshManagerModel::ManagerState::GetModifiedPos()
+{
+       return savedModifiedPos;
+}
+