/* # --------------------------------------------------------------------- # # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image # pour la Sante) # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton # Previous Authors : Laurent Guigues, Jean-Pierre Roux # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil # # This software is governed by the CeCILL-B license under French law and # abiding by the rules of distribution of free software. You can use, # modify and/ or redistribute the software under the terms of the CeCILL-B # license as circulated by CEA, CNRS and INRIA at the following URL # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html # or in the file LICENSE.txt. # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only # with a limited warranty and the software's author, the holder of the # economic rights, and the successive licensors have only limited # liability. # # The fact that you are presently reading this means that you have had # knowledge of the CeCILL-B license and that you accept its terms. # ------------------------------------------------------------------------ */ #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 //////////////////// MeshModel::MeshModel(int id) { _meshBase = NULL; _meshTemp = NULL; _meshId = id; _name = "mesh-" + std::to_string(id); } MeshModel::MeshModel(vtkPolyData* mesh, int id) { if(mesh != NULL){ _meshBase = 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 MeshModel::ResetMeshTemp_() { if (_meshBase!=NULL) { if (_meshTemp!=NULL) { _meshTemp->Delete(); } // if _meshTemp = vtkPolyData::New(); _meshTemp->DeepCopy(_meshBase); } else { if (_meshTemp!=NULL) { _meshTemp->Delete(); _meshTemp = NULL; } } } void MeshModel::SetMeshBase(vtkPolyData* mesh) { if (mesh!=NULL) { if(_meshBase != NULL){ _meshBase->Delete(); } _meshBase = mesh; ResetMeshTemp_(); } // if mesh } void MeshModel::SetMeshMemoryMode(vtkPolyData* mesh) { //if(_meshBase != NULL) //{ // _meshBase->Delete(); // _meshBase = NULL; //} //if (_meshTemp != NULL) //{ // _meshTemp->Delete(); // _meshTemp = NULL; //} _meshBase = mesh; } 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* MeshModel::GetMeshTemp() { return _meshTemp; } int MeshModel::GetId() { return _meshId; } std::string MeshModel::GetName() { return _name; } //////////////////// /////////////////////// MESH MANAGER //////////////////// MeshManagerModel::MeshManagerModel() { currentMesh = 0; meshId = 0; history = new HistoryHandler(20); } MeshManagerModel::~MeshManagerModel() { DeleteAll(); } void MeshManagerModel::RefreshOutputs(bool signalBox) // virtual { } 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) { 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) { AddMesh_(mesh); Save(); 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) { AddMeshes_(meshList); Save(); RefreshOutputs(true); } void MeshManagerModel::AddEmptyMesh_() { _meshes.push_back(std::make_shared(meshId)); meshId++; } void MeshManagerModel::AddEmptyMesh() { AddEmptyMesh_(); Save(); 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) { InsertMeshesAtCurrent_(meshList); Save(); 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) { 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; DeleteMesh_(i); RefreshOutputs(true); } } } } void MeshManagerModel::DeleteCurrentMesh() { if(!_meshes.empty()){ DeleteMesh_(currentMesh); Save(); RefreshOutputs(true); } } 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::DeleteAll() { DeleteAll_(); Save(); 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()){ _meshes.at(currentMesh) = std::make_shared(_meshes.at(currentMesh).get()); _meshes.at(currentMesh)->SetMeshBase(mesh); Save(); 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()) { _meshes.at(currentMesh) = std::make_shared(_meshes.at(currentMesh).get()); _meshes.at(currentMesh)->CopySetMeshBase(mesh); Save(); 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; } 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; }