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"
31 HistoryHandler<T>::HistoryHandler(int maxElements)
33 this->maxElements = maxElements;
36 HistoryHandler<T>::~HistoryHandler()
42 void HistoryHandler<T>::CleanHistory()
44 for (T* element : redoStack)
48 for (T* element : undoStack)
55 T* HistoryHandler<T>::Undo()
57 if(!undoStack.empty() && undoStack.size()>1)
59 auto lastElem = undoStack.back();
61 redoStack.push_back(lastElem);
62 return undoStack.back();
68 T* HistoryHandler<T>::Redo()
70 if(!redoStack.empty())
72 auto lastElem = redoStack.back();
74 undoStack.push_back(lastElem);
81 void HistoryHandler<T>::Save(T* state)
83 undoStack.push_back(state);
84 if(!redoStack.empty())
86 for (T* element : redoStack)
95 int HistoryHandler<T>::UndoSize()
97 return undoStack.size();
101 int HistoryHandler<T>::RedoSize()
103 return redoStack.size();
107 /////////////////////// MESH MODEL
110 MeshModel::MeshModel(int id)
115 _name = "mesh-" + std::to_string(id);
118 MeshModel::MeshModel(vtkPolyData* mesh, int id)
122 _meshTemp = vtkPolyData::New();
123 _meshTemp->DeepCopy(_meshBase);
125 _name = "mesh-" + std::to_string(id);
129 MeshModel::MeshModel(MeshModel* meshModel)
133 if(meshModel->GetMeshBase() != NULL)
135 _meshBase = vtkPolyData::New();
136 _meshBase->DeepCopy(meshModel->GetMeshBase());
139 _meshId = meshModel->GetId();
140 _name = "mesh-" + std::to_string(meshModel->GetId());
143 MeshModel::~MeshModel(){
144 if(_meshBase != NULL){
147 if(_meshTemp != NULL){
152 void MeshModel::ResetMeshTemp_()
160 _meshTemp = vtkPolyData::New();
161 _meshTemp->DeepCopy(_meshBase);
171 void MeshModel::SetMeshBase(vtkPolyData* mesh)
175 if(_meshBase != NULL){
183 void MeshModel::SetMeshMemoryMode(vtkPolyData* mesh)
185 //if(_meshBase != NULL)
187 // _meshBase->Delete();
190 //if (_meshTemp != NULL)
192 // _meshTemp->Delete();
198 void MeshModel::ResetMeshTemp()
203 void MeshModel::CopySetMeshBase(vtkPolyData* mesh)
207 vtkPolyData *newMesh = vtkPolyData::New();
208 newMesh->DeepCopy( mesh );
209 SetMeshBase(newMesh);
214 vtkPolyData* MeshModel::GetMeshBase()
219 vtkPolyData* MeshModel::GetMeshTemp()
224 int MeshModel::GetId()
229 std::string MeshModel::GetName()
235 /////////////////////// MESH MANAGER
238 MeshManagerModel::MeshManagerModel()
242 history = new HistoryHandler<ManagerState>(20);
245 MeshManagerModel::~MeshManagerModel()
250 void MeshManagerModel::RefreshOutputs(bool signalBox) // virtual
254 void MeshManagerModel::ResetHistory()
256 history->CleanHistory();
260 void MeshManagerModel::UpdateMeshReference(vtkPolyData* mesh)
262 _meshes.at(currentMesh)->SetMeshBase(mesh);
263 RefreshOutputs(true);
266 int MeshManagerModel::GetNumberOfMeshes()
268 return _meshes.size();
271 void MeshManagerModel::AddMesh_(vtkPolyData* mesh)
274 _meshes.push_back(std::make_shared<MeshModel>(mesh, meshId));
278 printf("PG MeshManagerModel::AddMesh Mesh is null \n");
282 void MeshManagerModel::AddMesh(vtkPolyData* mesh)
286 RefreshOutputs(true);
289 void MeshManagerModel::AddMeshes_(std::vector<vtkPolyData*> meshList)
291 if(!meshList.empty())
293 MeshModel *meshModel;
294 for(int i = 0; i < meshList.size(); i++){
295 _meshes.push_back(std::make_shared<MeshModel>(meshList[i], meshId));
299 printf("PG MeshManagerModel::AddMeshes Empty list of meshes \n");
303 void MeshManagerModel::AddMeshes(std::vector<vtkPolyData*> meshList)
305 AddMeshes_(meshList);
307 RefreshOutputs(true);
310 void MeshManagerModel::AddEmptyMesh_()
312 _meshes.push_back(std::make_shared<MeshModel>(meshId));
316 void MeshManagerModel::AddEmptyMesh()
320 RefreshOutputs(true);
323 void MeshManagerModel::InsertMeshesAtCurrent_(std::vector<vtkPolyData*> meshList)
325 if(!meshList.empty())
327 std::vector<std::shared_ptr<MeshModel>> tmpVect;
328 MeshModel *meshModel;
329 for(int i = 0; i < meshList.size(); i++){
330 tmpVect.push_back(std::make_shared<MeshModel>(meshList[i], meshId));
333 _meshes.insert(_meshes.begin() + currentMesh, tmpVect.begin(), tmpVect.end());
335 printf("PG MeshManagerModel::InsertMeshesAtCurrent Empty list of meshes \n");
339 void MeshManagerModel::InsertMeshesAtCurrent(std::vector<vtkPolyData*> meshList)
341 InsertMeshesAtCurrent_(meshList);
343 RefreshOutputs(true);
346 void MeshManagerModel::SelectMesh(int i)
348 if(i >= 0 && i < _meshes.size()){
349 int prevCurrent = currentMesh;
351 if(prevCurrent != i){
352 RefreshOutputs(true);
356 printf("PG MeshManagerModel::SelectMesh index out of bounds \n");
360 void MeshManagerModel::SelectMeshByName(std::string meshName)
362 if(!_meshes.empty()){
364 for(int i = 0; i < _meshes.size() && !found; i++){
365 if(_meshes.at(i)->GetName() == meshName){
373 void MeshManagerModel::DeleteMesh_(int position)
375 if(position >= 0 && position < _meshes.size()){
376 _meshes.erase(_meshes.begin() + position);
377 currentMesh = currentMesh + (position <= currentMesh?-1:0);
384 void MeshManagerModel::DeleteMesh(int position)
386 DeleteMesh_(position);
388 RefreshOutputs(true);
391 void MeshManagerModel::DeleteMeshByName(std::string meshName)
393 if(!_meshes.empty()){
395 for(int i = 0; i < _meshes.size() && !found; i++){
396 if(_meshes.at(i)->GetName() == meshName){
399 RefreshOutputs(true);
405 void MeshManagerModel::DeleteCurrentMesh()
407 if(!_meshes.empty()){
408 DeleteMesh_(currentMesh);
410 RefreshOutputs(true);
414 void MeshManagerModel::ReplaceMesh(std::vector<vtkPolyData*> meshList)
416 if(GetNumberOfMeshes() >= 1)
418 DeleteMesh_(currentMesh);
420 InsertMeshesAtCurrent_(meshList);
422 RefreshOutputs(true);
425 void MeshManagerModel::DeleteAll_()
431 RefreshOutputs(true);
435 void MeshManagerModel::DeleteAll()
439 RefreshOutputs(true);
442 void MeshManagerModel::NextMesh()
445 if(currentMesh >= _meshes.size()){
446 currentMesh = _meshes.size()-1;
448 RefreshOutputs(true);
451 void MeshManagerModel::PreviousMesh()
457 RefreshOutputs(true);
460 std::shared_ptr<MeshModel> MeshManagerModel::GetMeshModel()
462 return _meshes.at(currentMesh);
465 vtkPolyData* MeshManagerModel::GetMeshBase()
467 if(!_meshes.empty()){
468 return _meshes.at(currentMesh)->GetMeshBase();
475 vtkPolyData* MeshManagerModel::GetMeshTemp()
477 if(!_meshes.empty()){
478 return _meshes.at(currentMesh)->GetMeshTemp();
485 void MeshManagerModel::SetMeshBase(vtkPolyData* mesh)
487 if(!_meshes.empty()){
488 _meshes.at(currentMesh) = std::make_shared<MeshModel>(_meshes.at(currentMesh).get());
489 _meshes.at(currentMesh)->SetMeshBase(mesh);
491 RefreshOutputs(true);
493 printf("PG MeshManagerModel::SetMeshBase Mesh vector is empty \n");
497 void MeshManagerModel::SetMeshMemoryMode(vtkPolyData* mesh)
499 if(_meshes.size() > 1)
503 if(_meshes.size() == 0)
507 _meshes.at(currentMesh)->SetMeshMemoryMode(mesh);
508 RefreshOutputs(true);
511 void MeshManagerModel::ResetMeshTemp()
515 _meshes.at(currentMesh)->ResetMeshTemp();
516 RefreshOutputs(true);
518 printf("PG MeshManagerModel::ResetMeshTemp Mesh vector is empty \n");
522 void MeshManagerModel::CopySetMeshBase(vtkPolyData* mesh)
526 _meshes.at(currentMesh) = std::make_shared<MeshModel>(_meshes.at(currentMesh).get());
527 _meshes.at(currentMesh)->CopySetMeshBase(mesh);
529 RefreshOutputs(true);
532 printf("PG MeshManagerModel::CopySetMeshBase Mesh vector is empty \n");
536 std::vector<std::string> MeshManagerModel::GetMeshNames()
538 std::vector<std::string> names;
539 for(int i = 0; i < _meshes.size(); i++){
540 names.push_back(_meshes.at(i)->GetName());
545 void MeshManagerModel::Undo()
547 RestoreState(history->Undo());
548 RefreshOutputs(true);
551 void MeshManagerModel::Redo()
553 RestoreState(history->Redo());
554 RefreshOutputs(true);
557 void MeshManagerModel::Save()
559 history->Save(new ManagerState(_meshes, meshId, currentMesh));
562 void MeshManagerModel::RestoreState(ManagerState* state)
566 _meshes = state->GetMeshes();
567 meshId = state->GetMeshId();
568 currentMesh = state->GetCurrentMesh();
575 MeshManagerModel::ManagerState::ManagerState(std::vector<std::shared_ptr<MeshModel>> meshesToSave, int meshId, int currentMesh)
577 savedMeshes = meshesToSave;
579 savedCurrentMesh = currentMesh;
582 MeshManagerModel::ManagerState::~ManagerState()
586 std::vector<std::shared_ptr<MeshModel>>& MeshManagerModel::ManagerState::GetMeshes()
591 int MeshManagerModel::ManagerState::GetMeshId()
595 int MeshManagerModel::ManagerState::GetCurrentMesh()
597 return savedCurrentMesh;