X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FcreaVtk%2FMeshManagerModel.cpp;fp=lib%2FcreaVtk%2FMeshManagerModel.cpp;h=c03e9e8b2268567199c8b62237d72bd8fb469b35;hb=cc1075b3a78bdc5339b919450b88178bbf9ff1f7;hp=677727c6057a054b06ecb097298ba36977c1f78a;hpb=55562d4298417f4a15442868fbc2dcf9a80535bf;p=creaVtk.git diff --git a/lib/creaVtk/MeshManagerModel.cpp b/lib/creaVtk/MeshManagerModel.cpp index 677727c..c03e9e8 100644 --- a/lib/creaVtk/MeshManagerModel.cpp +++ b/lib/creaVtk/MeshManagerModel.cpp @@ -27,6 +27,82 @@ #include "MeshManagerModel.h" +template +HistoryHandler::HistoryHandler(int maxElements) +{ + this->maxElements = maxElements; +} +template +HistoryHandler::~HistoryHandler() +{ + CleanHistory(); +} + +template +void HistoryHandler::CleanHistory() +{ + for (T* element : redoStack) + { + delete element; + } + for (T* element : undoStack) + { + delete element; + } +} + +template +T* HistoryHandler::Undo() +{ + if(!undoStack.empty() && undoStack.size()>1) + { + auto lastElem = undoStack.back(); + undoStack.pop_back(); + redoStack.push_back(lastElem); + return undoStack.back(); + } + return NULL; +} + +template +T* HistoryHandler::Redo() +{ + if(!redoStack.empty()) + { + auto lastElem = redoStack.back(); + redoStack.pop_back(); + undoStack.push_back(lastElem); + return lastElem; + } + return NULL; +} + +template +void HistoryHandler::Save(T* state) +{ + undoStack.push_back(state); + if(!redoStack.empty()) + { + for (T* element : redoStack) + { + delete element; + } + redoStack.clear(); + } +} + +template +int HistoryHandler::UndoSize() +{ + return undoStack.size(); +} + +template +int HistoryHandler::RedoSize() +{ + return redoStack.size(); +} + //////////////////// /////////////////////// MESH MODEL //////////////////// @@ -50,6 +126,20 @@ MeshModel::MeshModel(vtkPolyData* mesh, int 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(); @@ -70,7 +160,11 @@ void MeshModel::ResetMeshTemp_() _meshTemp = vtkPolyData::New(); _meshTemp->DeepCopy(_meshBase); } else { - _meshTemp=NULL; + if (_meshTemp!=NULL) + { + _meshTemp->Delete(); + _meshTemp = NULL; + } } } @@ -78,6 +172,9 @@ void MeshModel::SetMeshBase(vtkPolyData* mesh) { if (mesh!=NULL) { + if(_meshBase != NULL){ + _meshBase->Delete(); + } _meshBase = mesh; ResetMeshTemp_(); } // if mesh @@ -85,7 +182,17 @@ void MeshModel::SetMeshBase(vtkPolyData* mesh) void MeshModel::SetMeshMemoryMode(vtkPolyData* mesh) { - _meshBase = mesh; + //if(_meshBase != NULL) + //{ + // _meshBase->Delete(); + // _meshBase = NULL; + //} + //if (_meshTemp != NULL) + //{ + // _meshTemp->Delete(); + // _meshTemp = NULL; + //} + _meshBase = mesh; } void MeshModel::ResetMeshTemp() @@ -104,12 +211,12 @@ void MeshModel::CopySetMeshBase(vtkPolyData* mesh) } -vtkPolyData* MeshModel::GetMeshBase() +vtkPolyData* MeshModel::GetMeshBase() { return _meshBase; } -vtkPolyData* MeshModel::GetMeshTemp() +vtkPolyData* MeshModel::GetMeshTemp() { return _meshTemp; } @@ -130,10 +237,9 @@ std::string MeshModel::GetName() MeshManagerModel::MeshManagerModel() { - //MeshModel* firstMesh = new MeshModel(); - //_meshes.push_back(firstMesh); currentMesh = 0; meshId = 0; + history = new HistoryHandler(20); } MeshManagerModel::~MeshManagerModel() @@ -145,14 +251,27 @@ void MeshManagerModel::RefreshOutputs(bool signalBox) // virtual { } -int MeshManagerModel::GetNumberOfMeshes(){ +void MeshManagerModel::ResetHistory() +{ + history->CleanHistory(); + Save(); +} + +void MeshManagerModel::UpdateMeshReference(vtkPolyData* mesh) +{ + _meshes.at(currentMesh)->SetMeshBase(mesh); + RefreshOutputs(true); +} + +int MeshManagerModel::GetNumberOfMeshes() +{ return _meshes.size(); } -void MeshManagerModel::AddMesh_(vtkPolyData* mesh){ +void MeshManagerModel::AddMesh_(vtkPolyData* mesh) +{ if(mesh != NULL){ - MeshModel *meshModel = new MeshModel(mesh, meshId); - _meshes.push_back(meshModel); + _meshes.push_back(std::make_shared(mesh, meshId)); meshId++; } else{ @@ -160,18 +279,20 @@ void MeshManagerModel::AddMesh_(vtkPolyData* mesh){ } } -void MeshManagerModel::AddMesh(vtkPolyData* mesh){ +void MeshManagerModel::AddMesh(vtkPolyData* mesh) +{ AddMesh_(mesh); + Save(); RefreshOutputs(true); } -void MeshManagerModel::AddMeshes_(std::vector meshList){ +void MeshManagerModel::AddMeshes_(std::vector meshList) +{ if(!meshList.empty()) { MeshModel *meshModel; for(int i = 0; i < meshList.size(); i++){ - meshModel = new MeshModel(meshList[i], meshId); - _meshes.push_back(meshModel); + _meshes.push_back(std::make_shared(meshList[i], meshId)); meshId++; } }else{ @@ -179,19 +300,23 @@ void MeshManagerModel::AddMeshes_(std::vector meshList){ } } -void MeshManagerModel::AddMeshes(std::vector meshList){ +void MeshManagerModel::AddMeshes(std::vector meshList) +{ AddMeshes_(meshList); + Save(); RefreshOutputs(true); } -void MeshManagerModel::AddEmptyMesh_(){ - MeshModel *meshModel = new MeshModel(meshId); - _meshes.push_back(meshModel); +void MeshManagerModel::AddEmptyMesh_() +{ + _meshes.push_back(std::make_shared(meshId)); meshId++; } -void MeshManagerModel::AddEmptyMesh(){ +void MeshManagerModel::AddEmptyMesh() +{ AddEmptyMesh_(); + Save(); RefreshOutputs(true); } @@ -199,26 +324,27 @@ void MeshManagerModel::InsertMeshesAtCurrent_(std::vector meshList { if(!meshList.empty()) { - std::vector tmpVect; + std::vector> tmpVect; MeshModel *meshModel; for(int i = 0; i < meshList.size(); i++){ - meshModel = new MeshModel(meshList[i], meshId); - tmpVect.push_back(meshModel); + tmpVect.push_back(std::make_shared(meshList[i], meshId)); meshId++; } _meshes.insert(_meshes.begin() + currentMesh, tmpVect.begin(), tmpVect.end()); }else{ - printf("PG MeshManagerModel::AddMeshes Empty list of meshes \n"); + printf("PG MeshManagerModel::InsertMeshesAtCurrent Empty list of meshes \n"); } } void MeshManagerModel::InsertMeshesAtCurrent(std::vector meshList) { InsertMeshesAtCurrent_(meshList); + Save(); RefreshOutputs(true); } -void MeshManagerModel::SelectMesh(int i) { +void MeshManagerModel::SelectMesh(int i) +{ if(i >= 0 && i < _meshes.size()){ int prevCurrent = currentMesh; currentMesh = i; @@ -231,7 +357,8 @@ void MeshManagerModel::SelectMesh(int i) { } } -void MeshManagerModel::SelectMeshByName(std::string meshName) { +void MeshManagerModel::SelectMeshByName(std::string meshName) +{ if(!_meshes.empty()){ bool found = false; for(int i = 0; i < _meshes.size() && !found; i++){ @@ -243,60 +370,77 @@ void MeshManagerModel::SelectMeshByName(std::string meshName) { } } -void MeshManagerModel::DeleteMesh(int position){ +void MeshManagerModel::DeleteMesh_(int position) +{ if(position >= 0 && position < _meshes.size()){ - delete _meshes.at(position); _meshes.erase(_meshes.begin() + position); currentMesh = currentMesh + (position <= currentMesh?-1:0); if(currentMesh < 0){ currentMesh = 0; } - RefreshOutputs(true); } } -void MeshManagerModel::DeleteMeshByName(std::string meshName){ +void MeshManagerModel::DeleteMesh(int position) +{ + DeleteMesh_(position); + Save(); + 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; - delete _meshes.at(i); - _meshes.erase(_meshes.begin() + i); - currentMesh = currentMesh + (i <= currentMesh?-1:0); - if(currentMesh < 0){ - currentMesh = 0; - } + DeleteMesh_(i); RefreshOutputs(true); } } } } -void MeshManagerModel::DeleteCurrentMesh(){ - if(!_meshes.empty()){ - delete _meshes.at(currentMesh); - _meshes.erase(_meshes.begin() + currentMesh); - currentMesh--; - if(currentMesh < 0){ - currentMesh = 0; - } +void MeshManagerModel::DeleteCurrentMesh() +{ + if(!_meshes.empty()){ + DeleteMesh_(currentMesh); + Save(); RefreshOutputs(true); } } -void MeshManagerModel::DeleteAll(){ - if(!_meshes.empty()){ - for (MeshModel* element : _meshes) - { - delete element; - } +void MeshManagerModel::ReplaceMesh(std::vector meshList) +{ + if(GetNumberOfMeshes() >= 1) + { + DeleteMesh_(currentMesh); + } + InsertMeshesAtCurrent_(meshList); + Save(); + RefreshOutputs(true); +} + +void MeshManagerModel::DeleteAll_() +{ + if(!_meshes.empty()) + { + currentMesh = 0; _meshes.clear(); RefreshOutputs(true); } } -void MeshManagerModel::NextMesh(){ +void MeshManagerModel::DeleteAll() +{ + DeleteAll_(); + Save(); + RefreshOutputs(true); +} + +void MeshManagerModel::NextMesh() +{ currentMesh++; if(currentMesh >= _meshes.size()){ currentMesh = _meshes.size()-1; @@ -304,7 +448,8 @@ void MeshManagerModel::NextMesh(){ RefreshOutputs(true); } -void MeshManagerModel::PreviousMesh(){ +void MeshManagerModel::PreviousMesh() +{ currentMesh--; if(currentMesh < 0){ currentMesh = 0; @@ -312,7 +457,8 @@ void MeshManagerModel::PreviousMesh(){ RefreshOutputs(true); } -MeshModel* MeshManagerModel::GetMeshModel(){ +std::shared_ptr MeshManagerModel::GetMeshModel() +{ return _meshes.at(currentMesh); } @@ -339,44 +485,47 @@ vtkPolyData* MeshManagerModel::GetMeshTemp() void MeshManagerModel::SetMeshBase(vtkPolyData* mesh) { if(!_meshes.empty()){ + _meshes.at(currentMesh) = std::make_shared(_meshes.at(currentMesh).get()); _meshes.at(currentMesh)->SetMeshBase(mesh); + Save(); RefreshOutputs(true); }else{ - printf("PG MeshManagerModel::SetMeshMemoryMode Mesh vector is empty \n"); + printf("PG MeshManagerModel::SetMeshBase Mesh vector is empty \n"); } } void MeshManagerModel::SetMeshMemoryMode(vtkPolyData* mesh) { - //if(!_meshes.empty()){ - if(_meshes.size() > 1){ - DeleteAll(); + if(_meshes.size() > 1) + { + DeleteAll_(); } - if(_meshes.size() == 0){ + if(_meshes.size() == 0) + { AddEmptyMesh_(); } _meshes.at(currentMesh)->SetMeshMemoryMode(mesh); RefreshOutputs(true); - //}else{ - // printf("PG MeshManagerModel::SetMeshMemoryMode Mesh vector is empty \n"); - //} } void MeshManagerModel::ResetMeshTemp() { - if(!_meshes.empty()){ + 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()){ + if(!_meshes.empty()) + { + _meshes.at(currentMesh) = std::make_shared(_meshes.at(currentMesh).get()); _meshes.at(currentMesh)->CopySetMeshBase(mesh); + Save(); RefreshOutputs(true); } else{ @@ -392,3 +541,59 @@ std::vector MeshManagerModel::GetMeshNames() } return names; } + +void MeshManagerModel::Undo() +{ + RestoreState(history->Undo()); + RefreshOutputs(true); +} + +void MeshManagerModel::Redo() +{ + RestoreState(history->Redo()); + RefreshOutputs(true); +} + +void MeshManagerModel::Save() +{ + history->Save(new ManagerState(_meshes, meshId, currentMesh)); +} + +void MeshManagerModel::RestoreState(ManagerState* state) +{ + if(state != NULL) + { + _meshes = state->GetMeshes(); + meshId = state->GetMeshId(); + currentMesh = state->GetCurrentMesh(); + } +} + +// +//Manager State +// +MeshManagerModel::ManagerState::ManagerState(std::vector> meshesToSave, int meshId, int currentMesh) +{ + savedMeshes = meshesToSave; + savedId = meshId; + savedCurrentMesh = currentMesh; +} + +MeshManagerModel::ManagerState::~ManagerState() +{ +} + +std::vector>& MeshManagerModel::ManagerState::GetMeshes() +{ + return savedMeshes; +} + +int MeshManagerModel::ManagerState::GetMeshId() +{ + return savedId; +} +int MeshManagerModel::ManagerState::GetCurrentMesh() +{ + return savedCurrentMesh; +} +