X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FcreaVtk%2FMeshManagerModel.cpp;h=6af6e932b42bbd438df149c21b3ff977ebb7a03b;hb=b00e934a843a756fb0d6d5f763642816df0aaff4;hp=f87f714e34d69de8cfe8893f507999e182612c2c;hpb=be32fd3f21cae7088663d1fcb50c32a62ec078b9;p=creaVtk.git diff --git a/lib/creaVtk/MeshManagerModel.cpp b/lib/creaVtk/MeshManagerModel.cpp index f87f714..6af6e93 100644 --- a/lib/creaVtk/MeshManagerModel.cpp +++ b/lib/creaVtk/MeshManagerModel.cpp @@ -27,47 +27,626 @@ #include "MeshManagerModel.h" -MeshManagerModel::MeshManagerModel() +// +//HISTORY HANDLER +// +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(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 +T* HistoryHandler::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 +void HistoryHandler::Save(T* state) +{ + undoStack.push_back(state); + if(!redoStack.empty()) + { + for (T* element : redoStack) + { + delete element; + } + redoStack.clear(); + } +} + +template +T* HistoryHandler::GetPrevious() +{ + if(!undoStack.empty()){ + return undoStack.back(); + } + return NULL; +} + +template +T* HistoryHandler::GetNext() +{ + if(!redoStack.empty()){ + return redoStack.back(); + } + return NULL; +} + +template +int HistoryHandler::UndoSize() +{ + return undoStack.size(); +} + +template +int HistoryHandler::RedoSize() { - _meshBase = NULL; + 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); + } } -void MeshManagerModel::SetMeshBase(vtkPolyData* mesh) +MeshModel::MeshModel(MeshModel* meshModel) { - if (mesh!=NULL) + _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 MeshModel::ResetMeshTemp_() +{ + if (_meshBase!=NULL) { - _meshBase = mesh; if (_meshTemp!=NULL) { _meshTemp->Delete(); } // if _meshTemp = vtkPolyData::New(); _meshTemp->DeepCopy(_meshBase); - RefreshOutputs(); + } else { + if (_meshTemp!=NULL) + { + _meshTemp->Delete(); + _meshTemp = NULL; + } + } +} + +void MeshModel::SetMeshBase(vtkPolyData* mesh) +{ + if (mesh!=NULL) + { + if(_meshBase != NULL){ + _meshBase->Delete(); + } + _meshBase = vtkPolyData::New(); + _meshBase->DeepCopy(mesh); + ResetMeshTemp_(); } // 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); + } } -vtkPolyData* MeshManagerModel::GetMeshBase() +void MeshModel::ResetMeshTemp() +{ + ResetMeshTemp_(); +} + +void MeshModel::CopySetMeshBase(vtkPolyData* mesh) +{ + if (mesh!=NULL) + { + vtkPolyData *newMesh = vtkPolyData::New(); + newMesh->DeepCopy( mesh ); + SetMeshBase(newMesh); + } // if mesh +} + + +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(20); + 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(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 meshList) +{ + if(!meshList.empty()) + { + MeshModel *meshModel; + for(int i = 0; i < meshList.size(); i++){ + _meshes.push_back(std::make_shared(meshList[i], meshId)); + meshId++; + } + }else{ + printf("PG MeshManagerModel::AddMeshes Empty list of meshes \n"); + } +} + +void MeshManagerModel::AddMeshes(std::vector meshList) +{ + Save(); + AddMeshes_(meshList); + lastModified = currentMesh; + RefreshOutputs(true); +} + +void MeshManagerModel::AddEmptyMesh_() +{ + _meshes.push_back(std::make_shared(meshId)); + meshId++; +} + +void MeshManagerModel::AddEmptyMesh() { + Save(); + AddEmptyMesh_(); + lastModified = currentMesh; + RefreshOutputs(true); } + +void MeshManagerModel::InsertMeshesAtCurrent_(std::vector meshList) +{ + if(!meshList.empty()) + { + std::vector> tmpVect; + MeshModel *meshModel; + for(int i = 0; i < meshList.size(); i++){ + tmpVect.push_back(std::make_shared(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 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 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 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(_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(_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 MeshManagerModel::GetMeshNames() +{ + std::vector names; + for(int i = 0; i < _meshes.size(); i++){ + names.push_back(_meshes.at(i)->GetName()); + } + return names; +} + +std::vector MeshManagerModel::GetAllPolyDatas() +{ + std::vector 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(); +// cout << "PG MeshManagerModel::RestoreState currentMesh: " << currentMesh << endl; + } +} + +// +//Manager State +// +MeshManagerModel::ManagerState::ManagerState(std::vector> meshesToSave, int meshId, int modifiedPos) +{ + savedMeshes = meshesToSave; + savedId = meshId; + savedModifiedPos = modifiedPos; +} + +MeshManagerModel::ManagerState::~ManagerState() +{ +} + +std::vector>& MeshManagerModel::ManagerState::GetMeshes() +{ + return savedMeshes; +} + +int MeshManagerModel::ManagerState::GetMeshId() +{ + return savedId; +} +int MeshManagerModel::ManagerState::GetModifiedPos() +{ + return savedModifiedPos; +} +