2 # ---------------------------------------------------------------------
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
10 # This software is governed by the CeCILL-B license under French law and
11 # abiding by the rules of distribution of free software. You can use,
12 # modify and/ or redistribute the software under the terms of the CeCILL-B
13 # license as circulated by CEA, CNRS and INRIA at the following URL
14 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15 # or in the file LICENSE.txt.
17 # As a counterpart to the access to the source code and rights to copy,
18 # modify and redistribute granted by the license, users are provided only
19 # with a limited warranty and the software's author, the holder of the
20 # economic rights, and the successive licensors have only limited
23 # The fact that you are presently reading this means that you have had
24 # knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------
28 #include "MeshManagerModel.h"
34 HistoryHandler<T>::HistoryHandler(int maxElements)
36 this->maxElements = maxElements;
39 HistoryHandler<T>::~HistoryHandler()
45 void HistoryHandler<T>::CleanHistory()
47 for (T* element : redoStack)
51 for (T* element : undoStack)
58 T* HistoryHandler<T>::Undo(T* state)
60 if(!undoStack.empty())
62 auto lastElem = undoStack.back();
64 redoStack.push_back(state);
65 return lastElem;//undoStack.back();
73 T* HistoryHandler<T>::Redo(T* state)
75 if(!redoStack.empty())
77 auto lastElem = redoStack.back();
79 undoStack.push_back(state);
88 void HistoryHandler<T>::Save(T* state)
90 undoStack.push_back(state);
91 if(undoStack.size() > maxElements)
93 delete undoStack.front();
94 undoStack.pop_front();
96 if(!redoStack.empty())
98 for (T* element : redoStack)
107 T* HistoryHandler<T>::GetPrevious()
109 if(!undoStack.empty())
111 return undoStack.back();
117 T* HistoryHandler<T>::GetNext()
119 if(!redoStack.empty())
121 return redoStack.back();
127 int HistoryHandler<T>::UndoSize()
129 return undoStack.size();
133 int HistoryHandler<T>::RedoSize()
135 return redoStack.size();
139 /////////////////////// MESH MODEL
142 MeshModel::MeshModel(int id)
147 _name = "mesh-" + std::to_string(id);
150 MeshModel::MeshModel(vtkPolyData* mesh, int id)
154 _meshBase = vtkPolyData::New();//mesh;
155 _meshBase->DeepCopy(mesh);
156 _meshTemp = vtkPolyData::New();
157 _meshTemp->DeepCopy(_meshBase);
159 _name = "mesh-" + std::to_string(id);
163 MeshModel::MeshModel(MeshModel* meshModel)
167 if(meshModel->GetMeshBase() != NULL)
169 _meshBase = vtkPolyData::New();
170 _meshBase->DeepCopy(meshModel->GetMeshBase());
173 _meshId = meshModel->GetId();
174 _name = "mesh-" + std::to_string(meshModel->GetId());
177 MeshModel::~MeshModel()
179 if(_meshBase != NULL)
183 if(_meshTemp != NULL)
189 void MeshModel::ResetMeshTemp_()
197 _meshTemp = vtkPolyData::New();
198 _meshTemp->DeepCopy(_meshBase);
208 void MeshModel::SetMeshBase(vtkPolyData* mesh)
212 if(_meshBase != NULL)
216 _meshBase = vtkPolyData::New();
217 _meshBase->DeepCopy(mesh);
222 void MeshModel::SetMeshMemoryMode(vtkPolyData* mesh)
224 if(_meshBase != NULL)
231 _meshBase = vtkPolyData::New();
232 _meshBase->DeepCopy(mesh);
236 void MeshModel::ResetMeshTemp()
241 void MeshModel::CopySetMeshBase(vtkPolyData* mesh)
245 vtkPolyData *newMesh = vtkPolyData::New();
246 newMesh->DeepCopy( mesh );
247 SetMeshBase(newMesh);
252 vtkPolyData* MeshModel::GetMeshBase()
257 vtkPolyData* MeshModel::GetMeshTemp()
262 int MeshModel::GetId()
267 std::string MeshModel::GetName()
273 /////////////////////// MESH MANAGER
276 MeshManagerModel::MeshManagerModel()
280 history = new HistoryHandler<ManagerState>(15);
284 MeshManagerModel::~MeshManagerModel()
289 void MeshManagerModel::RefreshOutputs(bool signalBox) // virtual
293 void MeshManagerModel::ResetHistory()
295 history->CleanHistory();
299 int MeshManagerModel::GetNumberOfMeshes()
301 return _meshes.size();
304 void MeshManagerModel::AddMesh_(vtkPolyData* mesh)
308 _meshes.push_back(std::make_shared<MeshModel>(mesh, meshId));
311 printf("PG MeshManagerModel::AddMesh Mesh is null \n");
315 void MeshManagerModel::AddMesh(vtkPolyData* mesh)
319 lastModified = currentMesh;
320 RefreshOutputs(true);
323 void MeshManagerModel::AddMeshes_(std::vector<vtkPolyData*> meshList)
325 if(!meshList.empty())
327 MeshModel *meshModel;
328 for(int i = 0; i < meshList.size(); i++){
329 _meshes.push_back(std::make_shared<MeshModel>(meshList[i], meshId));
333 printf("PG MeshManagerModel::AddMeshes Empty list of meshes \n");
337 void MeshManagerModel::AddMeshes(std::vector<vtkPolyData*> meshList)
340 AddMeshes_(meshList);
341 lastModified = currentMesh;
342 RefreshOutputs(true);
345 void MeshManagerModel::AddEmptyMesh_()
347 _meshes.push_back(std::make_shared<MeshModel>(meshId));
351 void MeshManagerModel::AddEmptyMesh()
355 lastModified = currentMesh;
356 RefreshOutputs(true);
359 void MeshManagerModel::InsertMeshesAtCurrent_(std::vector<vtkPolyData*> meshList)
361 if(!meshList.empty())
363 std::vector<std::shared_ptr<MeshModel>> tmpVect;
364 MeshModel *meshModel;
365 for(int i = 0; i < meshList.size(); i++){
366 tmpVect.push_back(std::make_shared<MeshModel>(meshList[i], meshId));
369 _meshes.insert(_meshes.begin() + currentMesh, tmpVect.begin(), tmpVect.end());
371 printf("PG MeshManagerModel::InsertMeshesAtCurrent Empty list of meshes \n");
375 void MeshManagerModel::InsertMeshesAtCurrent(std::vector<vtkPolyData*> meshList)
378 InsertMeshesAtCurrent_(meshList);
379 lastModified = currentMesh;
380 RefreshOutputs(true);
383 void MeshManagerModel::SelectMesh(int i)
385 if(i >= 0 && i < _meshes.size())
387 int prevCurrent = currentMesh;
391 RefreshOutputs(true);
395 printf("PG MeshManagerModel::SelectMesh index out of bounds \n");
399 void MeshManagerModel::SelectMeshByName(std::string meshName)
404 for(int i = 0; i < _meshes.size() && !found; i++){
405 if(_meshes.at(i)->GetName() == meshName)
414 void MeshManagerModel::DeleteMesh_(int position)
416 if(position >= 0 && position < _meshes.size())
418 _meshes.erase(_meshes.begin() + position);
419 currentMesh = currentMesh + (position <= currentMesh?-1:0);
427 void MeshManagerModel::DeleteMesh(int position)
430 DeleteMesh_(position);
431 lastModified = currentMesh;
432 RefreshOutputs(true);
435 void MeshManagerModel::DeleteMeshByName(std::string meshName)
440 for(int i = 0; i < _meshes.size() && !found; i++){
441 if(_meshes.at(i)->GetName() == meshName)
445 RefreshOutputs(true);
451 void MeshManagerModel::DeleteCurrentMesh()
456 DeleteMesh_(currentMesh);
457 lastModified = currentMesh;
458 RefreshOutputs(true);
462 void MeshManagerModel::ReplaceMesh(std::vector<vtkPolyData*> meshList)
465 if(GetNumberOfMeshes() >= 1)
467 DeleteMesh_(currentMesh);
469 InsertMeshesAtCurrent_(meshList);
470 lastModified = currentMesh;
471 RefreshOutputs(true);
474 void MeshManagerModel::DeleteAll_()
480 RefreshOutputs(true);
484 void MeshManagerModel::DeleteAll()
488 lastModified = currentMesh;
489 RefreshOutputs(true);
492 void MeshManagerModel::NextMesh()
495 if(currentMesh >= _meshes.size())
497 currentMesh = _meshes.size()-1;
499 RefreshOutputs(true);
502 void MeshManagerModel::PreviousMesh()
509 RefreshOutputs(true);
512 std::shared_ptr<MeshModel> MeshManagerModel::GetMeshModel()
514 return _meshes.at(currentMesh);
517 vtkPolyData* MeshManagerModel::GetMeshBase()
521 return _meshes.at(currentMesh)->GetMeshBase();
528 vtkPolyData* MeshManagerModel::GetMeshTemp()
532 return _meshes.at(currentMesh)->GetMeshTemp();
539 void MeshManagerModel::SetMeshBase(vtkPolyData* mesh)
544 _meshes.at(currentMesh) = std::make_shared<MeshModel>(_meshes.at(currentMesh).get());
545 _meshes.at(currentMesh)->SetMeshBase(mesh);
546 lastModified = currentMesh;
547 RefreshOutputs(true);
549 printf("PG MeshManagerModel::SetMeshBase Mesh vector is empty \n");
553 void MeshManagerModel::SetMeshMemoryMode(vtkPolyData* mesh)
555 if(_meshes.size() > 1)
559 if(_meshes.size() == 0)
563 _meshes.at(currentMesh)->SetMeshMemoryMode(mesh);
564 RefreshOutputs(true);
567 void MeshManagerModel::ResetMeshTemp()
571 _meshes.at(currentMesh)->ResetMeshTemp();
572 RefreshOutputs(true);
574 printf("PG MeshManagerModel::ResetMeshTemp Mesh vector is empty \n");
578 void MeshManagerModel::CopySetMeshBase(vtkPolyData* mesh)
583 _meshes.at(currentMesh) = std::make_shared<MeshModel>(_meshes.at(currentMesh).get());
584 _meshes.at(currentMesh)->CopySetMeshBase(mesh);
585 lastModified = currentMesh;
586 RefreshOutputs(true);
589 printf("PG MeshManagerModel::CopySetMeshBase Mesh vector is empty \n");
593 std::vector<std::string> MeshManagerModel::GetMeshNames()
595 std::vector<std::string> names;
596 for(int i = 0; i < _meshes.size(); i++){
597 names.push_back(_meshes.at(i)->GetName());
602 std::vector<vtkPolyData*> MeshManagerModel::GetAllPolyDatas()
604 std::vector<vtkPolyData*> polydatas;
605 for(int i = 0; i < _meshes.size(); i++){
606 polydatas.push_back(_meshes.at(i)->GetMeshBase());
611 int MeshManagerModel::GetCurrentMesh()
616 void MeshManagerModel::Undo()
618 if(history->UndoSize() > 0)
620 RestoreState(history->Undo(new ManagerState(_meshes, meshId, lastModified)));
621 RefreshOutputs(true);
625 void MeshManagerModel::Redo()
627 if(history->RedoSize() > 0)
629 RestoreState(history->Redo(new ManagerState(_meshes, meshId, lastModified)));
630 RefreshOutputs(true);
634 void MeshManagerModel::Save()
636 history->Save(new ManagerState(_meshes, meshId, currentMesh));
637 //lastModified = currentMesh;
640 void MeshManagerModel::RestoreState(ManagerState* state)
644 _meshes = state->GetMeshes();
645 meshId = state->GetMeshId();
646 currentMesh = state->GetModifiedPos();
647 lastModified = state->GetModifiedPos();
654 MeshManagerModel::ManagerState::ManagerState(std::vector<std::shared_ptr<MeshModel>> meshesToSave, int meshId, int modifiedPos)
656 savedMeshes = meshesToSave;
658 savedModifiedPos = modifiedPos;
661 MeshManagerModel::ManagerState::~ManagerState()
666 std::vector<std::shared_ptr<MeshModel>>& MeshManagerModel::ManagerState::GetMeshes()
671 int MeshManagerModel::ManagerState::GetMeshId()
675 int MeshManagerModel::ManagerState::GetModifiedPos()
677 return savedModifiedPos;