]> Creatis software - creaVtk.git/blobdiff - lib/creaVtk/MeshManagerModel.cpp
#3504 Mesh Manager handle multiple meshes
[creaVtk.git] / lib / creaVtk / MeshManagerModel.cpp
index cf0b3dd2384da5f2e7b1b01847a5fbcc3a840e4e..677727c6057a054b06ecb097298ba36977c1f78a 100644 (file)
 
 #include "MeshManagerModel.h"
 
-MeshManagerModel::MeshManagerModel()
+////////////////////
+/////////////////////// MESH MODEL
+////////////////////
+
+MeshModel::MeshModel(int id)
 {
-    _meshBase = NULL;
+       _meshBase = NULL;
     _meshTemp = NULL;
+    _meshId = id;
+    _name = "mesh-" + std::to_string(id);
 }
 
-MeshManagerModel::~MeshManagerModel()
+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);
+       }
 }
 
-void MeshManagerModel::ResetMeshTemp_()
+MeshModel::~MeshModel(){
+       if(_meshBase != NULL){
+               _meshBase->Delete();
+       }
+       if(_meshTemp != NULL){
+               _meshTemp->Delete();
+       }
+}
+
+void MeshModel::ResetMeshTemp_()
 {
     if (_meshBase!=NULL)
     {
@@ -52,29 +74,26 @@ void MeshManagerModel::ResetMeshTemp_()
     }
 }
 
-void MeshManagerModel::SetMeshBase(vtkPolyData* mesh)
+void MeshModel::SetMeshBase(vtkPolyData* mesh)
 {
     if (mesh!=NULL)
     {
         _meshBase = mesh;
         ResetMeshTemp_();
-        RefreshOutputs();
     } // if mesh
 }
 
-void MeshManagerModel::SetMeshMemoryMode(vtkPolyData* mesh)
+void MeshModel::SetMeshMemoryMode(vtkPolyData* mesh)
 {
     _meshBase = mesh;
-    RefreshOutputs();
 }
 
-void MeshManagerModel::ResetMeshTemp()
+void MeshModel::ResetMeshTemp()
 {
     ResetMeshTemp_();
-    RefreshOutputs();
 }
 
-void MeshManagerModel::CopySetMeshBase(vtkPolyData* mesh)
+void MeshModel::CopySetMeshBase(vtkPolyData* mesh)
 {
     if (mesh!=NULL)
     {
@@ -85,16 +104,291 @@ void MeshManagerModel::CopySetMeshBase(vtkPolyData* mesh)
 }
 
 
-vtkPolyData*  MeshManagerModel::GetMeshBase()
+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()
+{
+       //MeshModel* firstMesh = new MeshModel();
+       //_meshes.push_back(firstMesh);
+       currentMesh = 0;
+       meshId = 0;
+}
+
+MeshManagerModel::~MeshManagerModel()
+{
+       DeleteAll();
+}
+
+void MeshManagerModel::RefreshOutputs(bool signalBox) // virtual
+{
+}
+
+int MeshManagerModel::GetNumberOfMeshes(){
+       return _meshes.size();
+}
+
+void MeshManagerModel::AddMesh_(vtkPolyData* mesh){
+       if(mesh != NULL){
+               MeshModel *meshModel = new MeshModel(mesh, meshId);
+               _meshes.push_back(meshModel);
+               meshId++;
+       }
+       else{
+               printf("PG MeshManagerModel::AddMesh Mesh is null \n");
+       }
+}
+
+void MeshManagerModel::AddMesh(vtkPolyData* mesh){
+       AddMesh_(mesh);
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::AddMeshes_(std::vector<vtkPolyData*> meshList){
+       if(!meshList.empty())
+       {
+               MeshModel *meshModel;
+               for(int i = 0; i < meshList.size(); i++){
+                       meshModel = new MeshModel(meshList[i], meshId);
+                       _meshes.push_back(meshModel);
+                       meshId++;
+               }
+       }else{
+               printf("PG MeshManagerModel::AddMeshes Empty list of meshes \n");
+       }
+}
+
+void MeshManagerModel::AddMeshes(std::vector<vtkPolyData*> meshList){
+       AddMeshes_(meshList);
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::AddEmptyMesh_(){
+       MeshModel *meshModel = new MeshModel(meshId);
+       _meshes.push_back(meshModel);
+       meshId++;
+}
+
+void MeshManagerModel::AddEmptyMesh(){
+       AddEmptyMesh_();
+       RefreshOutputs(true);
+}
+
+void MeshManagerModel::InsertMeshesAtCurrent_(std::vector<vtkPolyData*> meshList)
+{
+       if(!meshList.empty())
+       {
+               std::vector<MeshModel*> tmpVect;
+               MeshModel *meshModel;
+               for(int i = 0; i < meshList.size(); i++){
+                       meshModel = new MeshModel(meshList[i], meshId);
+                       tmpVect.push_back(meshModel);
+                       meshId++;
+               }
+               _meshes.insert(_meshes.begin() + currentMesh, tmpVect.begin(), tmpVect.end());
+       }else{
+               printf("PG MeshManagerModel::AddMeshes Empty list of meshes \n");
+       }
+}
+
+void MeshManagerModel::InsertMeshesAtCurrent(std::vector<vtkPolyData*> meshList)
+{
+       InsertMeshesAtCurrent_(meshList);
+       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()){
+               delete _meshes.at(position);
+               _meshes.erase(_meshes.begin() + position);
+               currentMesh = currentMesh + (position <= currentMesh?-1:0);
+               if(currentMesh < 0){
+                       currentMesh = 0;
+               }
+               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;
+                               delete _meshes.at(i);
+                               _meshes.erase(_meshes.begin() + i);
+                               currentMesh = currentMesh + (i <= currentMesh?-1:0);
+                               if(currentMesh < 0){
+                                       currentMesh = 0;
+                               }
+                               RefreshOutputs(true);
+                       }
+               }
+       }
+}
+
+void MeshManagerModel::DeleteCurrentMesh(){
+       if(!_meshes.empty()){   
+               delete _meshes.at(currentMesh);
+               _meshes.erase(_meshes.begin() + currentMesh);
+               currentMesh--;
+               if(currentMesh < 0){
+                       currentMesh = 0;
+               }
+               RefreshOutputs(true);
+       }
+}
+
+void MeshManagerModel::DeleteAll(){
+       if(!_meshes.empty()){   
+               for (MeshModel* element : _meshes)
+               {
+                       delete element;
+               } 
+               _meshes.clear();
+               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);
+}
+
+MeshModel* 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)->SetMeshBase(mesh);
+        RefreshOutputs(true);
+    }else{
+       printf("PG MeshManagerModel::SetMeshMemoryMode Mesh vector is empty \n");
+    }
+}
+
+void MeshManagerModel::SetMeshMemoryMode(vtkPolyData* mesh)
+{
+       //if(!_meshes.empty()){
+       if(_meshes.size() > 1){
+               DeleteAll();
+       }
+       if(_meshes.size() == 0){
+               AddEmptyMesh_();
+       }
+       _meshes.at(currentMesh)->SetMeshMemoryMode(mesh);
+       RefreshOutputs(true);
+    //}else{
+    // printf("PG MeshManagerModel::SetMeshMemoryMode Mesh vector is empty \n");
+    //}
+}
+
+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)->CopySetMeshBase(mesh);
+               RefreshOutputs(true);
+       }
+       else{
+               printf("PG MeshManagerModel::CopySetMeshBase Mesh vector is empty \n");
+       }
+}
+
+std::vector<std::string> MeshManagerModel::GetMeshNames()
 {
+       std::vector<std::string> names;
+       for(int i = 0; i < _meshes.size(); i++){
+               names.push_back(_meshes.at(i)->GetName());
+       }
+       return names;
 }