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(!redoStack.empty())
93 for (T* element : redoStack)
102 T* HistoryHandler<T>::GetPrevious()
104 if(!undoStack.empty()){
105 return undoStack.back();
111 T* HistoryHandler<T>::GetNext()
113 if(!redoStack.empty()){
114 return redoStack.back();
120 int HistoryHandler<T>::UndoSize()
122 return undoStack.size();
126 int HistoryHandler<T>::RedoSize()
128 return redoStack.size();
132 /////////////////////// MESH MODEL
135 MeshModel::MeshModel(int id)
140 _name = "mesh-" + std::to_string(id);
143 MeshModel::MeshModel(vtkPolyData* mesh, int id)
146 _meshBase = vtkPolyData::New();//mesh;
147 _meshBase->DeepCopy(mesh);
148 _meshTemp = vtkPolyData::New();
149 _meshTemp->DeepCopy(_meshBase);
151 _name = "mesh-" + std::to_string(id);
155 MeshModel::MeshModel(MeshModel* meshModel)
159 if(meshModel->GetMeshBase() != NULL)
161 _meshBase = vtkPolyData::New();
162 _meshBase->DeepCopy(meshModel->GetMeshBase());
165 _meshId = meshModel->GetId();
166 _name = "mesh-" + std::to_string(meshModel->GetId());
169 MeshModel::~MeshModel(){
170 if(_meshBase != NULL){
173 if(_meshTemp != NULL){
178 void MeshModel::ResetMeshTemp_()
186 _meshTemp = vtkPolyData::New();
187 _meshTemp->DeepCopy(_meshBase);
197 void MeshModel::SetMeshBase(vtkPolyData* mesh)
201 if(_meshBase != NULL){
204 _meshBase = vtkPolyData::New();
205 _meshBase->DeepCopy(mesh);
210 void MeshModel::SetMeshMemoryMode(vtkPolyData* mesh)
212 if(_meshBase != NULL)
219 _meshBase = vtkPolyData::New();
220 _meshBase->DeepCopy(mesh);
224 void MeshModel::ResetMeshTemp()
229 void MeshModel::CopySetMeshBase(vtkPolyData* mesh)
233 vtkPolyData *newMesh = vtkPolyData::New();
234 newMesh->DeepCopy( mesh );
235 SetMeshBase(newMesh);
240 vtkPolyData* MeshModel::GetMeshBase()
245 vtkPolyData* MeshModel::GetMeshTemp()
250 int MeshModel::GetId()
255 std::string MeshModel::GetName()
261 /////////////////////// MESH MANAGER
264 MeshManagerModel::MeshManagerModel()
268 history = new HistoryHandler<ManagerState>(20);
272 MeshManagerModel::~MeshManagerModel()
277 void MeshManagerModel::RefreshOutputs(bool signalBox) // virtual
281 void MeshManagerModel::ResetHistory()
283 history->CleanHistory();
287 int MeshManagerModel::GetNumberOfMeshes()
289 return _meshes.size();
292 void MeshManagerModel::AddMesh_(vtkPolyData* mesh)
295 _meshes.push_back(std::make_shared<MeshModel>(mesh, meshId));
299 printf("PG MeshManagerModel::AddMesh Mesh is null \n");
303 void MeshManagerModel::AddMesh(vtkPolyData* mesh)
307 lastModified = currentMesh;
308 RefreshOutputs(true);
311 void MeshManagerModel::AddMeshes_(std::vector<vtkPolyData*> meshList)
313 if(!meshList.empty())
315 MeshModel *meshModel;
316 for(int i = 0; i < meshList.size(); i++){
317 _meshes.push_back(std::make_shared<MeshModel>(meshList[i], meshId));
321 printf("PG MeshManagerModel::AddMeshes Empty list of meshes \n");
325 void MeshManagerModel::AddMeshes(std::vector<vtkPolyData*> meshList)
328 AddMeshes_(meshList);
329 lastModified = currentMesh;
330 RefreshOutputs(true);
333 void MeshManagerModel::AddEmptyMesh_()
335 _meshes.push_back(std::make_shared<MeshModel>(meshId));
339 void MeshManagerModel::AddEmptyMesh()
343 lastModified = currentMesh;
344 RefreshOutputs(true);
347 void MeshManagerModel::InsertMeshesAtCurrent_(std::vector<vtkPolyData*> meshList)
349 if(!meshList.empty())
351 std::vector<std::shared_ptr<MeshModel>> tmpVect;
352 MeshModel *meshModel;
353 for(int i = 0; i < meshList.size(); i++){
354 tmpVect.push_back(std::make_shared<MeshModel>(meshList[i], meshId));
357 _meshes.insert(_meshes.begin() + currentMesh, tmpVect.begin(), tmpVect.end());
359 printf("PG MeshManagerModel::InsertMeshesAtCurrent Empty list of meshes \n");
363 void MeshManagerModel::InsertMeshesAtCurrent(std::vector<vtkPolyData*> meshList)
366 InsertMeshesAtCurrent_(meshList);
367 lastModified = currentMesh;
368 RefreshOutputs(true);
371 void MeshManagerModel::SelectMesh(int i)
373 if(i >= 0 && i < _meshes.size()){
374 int prevCurrent = currentMesh;
376 if(prevCurrent != i){
377 RefreshOutputs(true);
381 printf("PG MeshManagerModel::SelectMesh index out of bounds \n");
385 void MeshManagerModel::SelectMeshByName(std::string meshName)
387 if(!_meshes.empty()){
389 for(int i = 0; i < _meshes.size() && !found; i++){
390 if(_meshes.at(i)->GetName() == meshName){
398 void MeshManagerModel::DeleteMesh_(int position)
400 if(position >= 0 && position < _meshes.size()){
401 _meshes.erase(_meshes.begin() + position);
402 currentMesh = currentMesh + (position <= currentMesh?-1:0);
409 void MeshManagerModel::DeleteMesh(int position)
412 DeleteMesh_(position);
413 lastModified = currentMesh;
414 RefreshOutputs(true);
417 void MeshManagerModel::DeleteMeshByName(std::string meshName)
419 if(!_meshes.empty()){
421 for(int i = 0; i < _meshes.size() && !found; i++){
422 if(_meshes.at(i)->GetName() == meshName){
425 RefreshOutputs(true);
431 void MeshManagerModel::DeleteCurrentMesh()
433 if(!_meshes.empty()){
435 DeleteMesh_(currentMesh);
436 lastModified = currentMesh;
437 RefreshOutputs(true);
441 void MeshManagerModel::ReplaceMesh(std::vector<vtkPolyData*> meshList)
444 if(GetNumberOfMeshes() >= 1)
446 DeleteMesh_(currentMesh);
448 InsertMeshesAtCurrent_(meshList);
449 lastModified = currentMesh;
450 RefreshOutputs(true);
453 void MeshManagerModel::DeleteAll_()
459 RefreshOutputs(true);
463 void MeshManagerModel::DeleteAll()
467 lastModified = currentMesh;
468 RefreshOutputs(true);
471 void MeshManagerModel::NextMesh()
474 if(currentMesh >= _meshes.size()){
475 currentMesh = _meshes.size()-1;
477 RefreshOutputs(true);
480 void MeshManagerModel::PreviousMesh()
486 RefreshOutputs(true);
489 std::shared_ptr<MeshModel> MeshManagerModel::GetMeshModel()
491 return _meshes.at(currentMesh);
494 vtkPolyData* MeshManagerModel::GetMeshBase()
496 if(!_meshes.empty()){
497 return _meshes.at(currentMesh)->GetMeshBase();
504 vtkPolyData* MeshManagerModel::GetMeshTemp()
506 if(!_meshes.empty()){
507 return _meshes.at(currentMesh)->GetMeshTemp();
514 void MeshManagerModel::SetMeshBase(vtkPolyData* mesh)
516 if(!_meshes.empty()){
518 _meshes.at(currentMesh) = std::make_shared<MeshModel>(_meshes.at(currentMesh).get());
519 _meshes.at(currentMesh)->SetMeshBase(mesh);
520 lastModified = currentMesh;
521 RefreshOutputs(true);
523 printf("PG MeshManagerModel::SetMeshBase Mesh vector is empty \n");
527 void MeshManagerModel::SetMeshMemoryMode(vtkPolyData* mesh)
529 if(_meshes.size() > 1)
533 if(_meshes.size() == 0)
537 _meshes.at(currentMesh)->SetMeshMemoryMode(mesh);
538 RefreshOutputs(true);
541 void MeshManagerModel::ResetMeshTemp()
545 _meshes.at(currentMesh)->ResetMeshTemp();
546 RefreshOutputs(true);
548 printf("PG MeshManagerModel::ResetMeshTemp Mesh vector is empty \n");
552 void MeshManagerModel::CopySetMeshBase(vtkPolyData* mesh)
557 _meshes.at(currentMesh) = std::make_shared<MeshModel>(_meshes.at(currentMesh).get());
558 _meshes.at(currentMesh)->CopySetMeshBase(mesh);
559 lastModified = currentMesh;
560 RefreshOutputs(true);
563 printf("PG MeshManagerModel::CopySetMeshBase Mesh vector is empty \n");
567 std::vector<std::string> MeshManagerModel::GetMeshNames()
569 std::vector<std::string> names;
570 for(int i = 0; i < _meshes.size(); i++){
571 names.push_back(_meshes.at(i)->GetName());
576 std::vector<vtkPolyData*> MeshManagerModel::GetAllPolyDatas()
578 std::vector<vtkPolyData*> polydatas;
579 for(int i = 0; i < _meshes.size(); i++){
580 polydatas.push_back(_meshes.at(i)->GetMeshBase());
585 int MeshManagerModel::GetCurrentMesh()
590 void MeshManagerModel::Undo()
592 if(history->UndoSize() > 0){
593 RestoreState(history->Undo(new ManagerState(_meshes, meshId, lastModified)));
594 RefreshOutputs(true);
598 void MeshManagerModel::Redo()
600 if(history->RedoSize() > 0)
602 RestoreState(history->Redo(new ManagerState(_meshes, meshId, lastModified)));
603 RefreshOutputs(true);
607 void MeshManagerModel::Save()
609 history->Save(new ManagerState(_meshes, meshId, currentMesh));
610 //lastModified = currentMesh;
613 void MeshManagerModel::RestoreState(ManagerState* state)
617 _meshes = state->GetMeshes();
618 meshId = state->GetMeshId();
619 currentMesh = state->GetModifiedPos();
620 lastModified = state->GetModifiedPos();
621 // cout << "PG MeshManagerModel::RestoreState currentMesh: " << currentMesh << endl;
628 MeshManagerModel::ManagerState::ManagerState(std::vector<std::shared_ptr<MeshModel>> meshesToSave, int meshId, int modifiedPos)
630 savedMeshes = meshesToSave;
632 savedModifiedPos = modifiedPos;
635 MeshManagerModel::ManagerState::~ManagerState()
639 std::vector<std::shared_ptr<MeshModel>>& MeshManagerModel::ManagerState::GetMeshes()
644 int MeshManagerModel::ManagerState::GetMeshId()
648 int MeshManagerModel::ManagerState::GetModifiedPos()
650 return savedModifiedPos;