+int MeshModel::GetId()
+{
+ return _meshId;
+}
+
+std::string MeshModel::GetName()
+{
+ return _name;
+}
+
+////////////////////
+/////////////////////// MESH MANAGER
+////////////////////
+
+MeshManagerModel::MeshManagerModel()
+{
+ currentMesh = 0;
+ meshId = 0;
+ history = new HistoryHandler<ManagerState>(15);
+ lastModified = 0;
+ memoryMode = false;
+ referencePoint = {0, 0, 0};
+ referenceNormal = {0, 0, 1};
+}
+
+MeshManagerModel::~MeshManagerModel()
+{
+ DeleteAll();
+ history->CleanHistory();
+ delete history;
+}
+
+void MeshManagerModel::RefreshOutputs(bool signalBox) // virtual
+{
+}
+
+void MeshManagerModel::SetHistory(int maxCapacity)
+{
+ if(history != NULL){
+ ResetHistory();
+ delete history;
+ }
+ history = new HistoryHandler<ManagerState>(maxCapacity);
+}
+
+void MeshManagerModel::ResetHistory()
+{
+ history->CleanHistory();
+}
+
+void MeshManagerModel::SetReferencePoint(std::vector<double> point)
+{
+ referencePoint = point;
+}
+
+std::vector<double> MeshManagerModel::GetReferencePoint()
+{
+ return referencePoint;
+}
+
+void MeshManagerModel::SetReferenceNormal(std::vector<double> normal)
+{
+ referenceNormal = normal;
+}
+
+std::vector<double> MeshManagerModel::GetReferenceNormal()
+{
+ return referenceNormal;
+}
+
+int MeshManagerModel::GetNumberOfMeshes()
+{
+ return _meshes.size();
+}
+
+void MeshManagerModel::AddMesh_(vtkPolyData* mesh)
+{
+ if(mesh != NULL)
+ {
+ _meshes.push_back(std::make_shared<MeshModel>(mesh, meshId));
+ meshId++;
+ }else{
+ printf("PG MeshManagerModel::AddMesh Mesh is null \n");
+ }
+}
+
+void MeshManagerModel::AddMesh(vtkPolyData* mesh)
+{
+ Save();
+ AddMesh_(mesh);
+ lastModified = currentMesh;
+ RefreshOutputs(true);
+}
+
+void MeshManagerModel::AddMeshes_(std::vector<vtkPolyData*> meshList)
+{
+ if(!meshList.empty())
+ {
+ MeshModel *meshModel;
+ for(int i = 0; i < meshList.size(); i++){
+ _meshes.push_back(std::make_shared<MeshModel>(meshList[i], meshId));
+ meshId++;
+ }
+ }else{
+ printf("PG MeshManagerModel::AddMeshes Empty list of meshes \n");
+ }
+}
+
+void MeshManagerModel::AddMeshes(std::vector<vtkPolyData*> meshList)
+{
+ Save();
+ AddMeshes_(meshList);
+ lastModified = currentMesh;
+ RefreshOutputs(true);
+}
+
+void MeshManagerModel::AddEmptyMesh_()
+{
+ _meshes.push_back(std::make_shared<MeshModel>(meshId));
+ meshId++;
+}
+
+void MeshManagerModel::AddEmptyMesh()
+{
+ Save();
+ AddEmptyMesh_();
+ lastModified = currentMesh;
+ RefreshOutputs(true);
+}
+
+void MeshManagerModel::InsertMeshesAtCurrent_(std::vector<vtkPolyData*> meshList)
+{
+ if(!meshList.empty())
+ {
+ std::vector<std::shared_ptr<MeshModel>> tmpVect;
+ MeshModel *meshModel;
+ for(int i = 0; i < meshList.size(); i++){
+ tmpVect.push_back(std::make_shared<MeshModel>(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<vtkPolyData*> meshList)
+{
+ Save();
+ InsertMeshesAtCurrent_(meshList);
+ lastModified = currentMesh;
+ 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)
+{
+ Save();
+ DeleteMesh_(position);
+ lastModified = currentMesh;
+ 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())
+ {
+ Save();
+ DeleteMesh_(currentMesh);
+ lastModified = currentMesh;
+ RefreshOutputs(true);
+ }
+}
+
+void MeshManagerModel::ReplaceMesh(std::vector<vtkPolyData*> meshList)
+{
+ Save();
+ if(GetNumberOfMeshes() >= 1)
+ {
+ DeleteMesh_(currentMesh);
+ }
+ InsertMeshesAtCurrent_(meshList);
+ lastModified = currentMesh;
+ RefreshOutputs(true);
+}
+
+void MeshManagerModel::DeleteAll_()
+{
+ if(!_meshes.empty())
+ {
+ currentMesh = 0;
+ _meshes.clear();
+ RefreshOutputs(true);
+ }
+}
+
+void MeshManagerModel::DeleteAll()
+{
+ Save();
+ DeleteAll_();
+ lastModified = currentMesh;
+ 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<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())
+ {
+ Save();
+ _meshes.at(currentMesh) = std::make_shared<MeshModel>(_meshes.at(currentMesh).get());
+ _meshes.at(currentMesh)->SetMeshBase(mesh);
+ lastModified = currentMesh;
+ RefreshOutputs(true);
+ }else{
+ printf("PG MeshManagerModel::SetMeshBase Mesh vector is empty \n");
+ }
+}
+
+void MeshManagerModel::MeshMemoryModeOn()
+{
+ memoryMode = true;
+}
+
+void MeshManagerModel::MeshMemoryModeOff()
+{
+ memoryMode = false;
+}
+
+void MeshManagerModel::SetMeshMemoryMode(vtkPolyData* mesh)
+{
+ if(_meshes.size() > 1)
+ {
+ DeleteAll_();
+ }
+ if(_meshes.size() == 0)
+ {
+ AddEmptyMesh_();
+ }
+ _meshes.at(currentMesh)->SetMeshMemoryMode(mesh);
+ ResetHistory();
+ SaveMemoryMode();
+ 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())
+ {
+ Save();
+ _meshes.at(currentMesh) = std::make_shared<MeshModel>(_meshes.at(currentMesh).get());
+ _meshes.at(currentMesh)->CopySetMeshBase(mesh);
+ lastModified = currentMesh;
+ 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;
+}
+
+std::vector<vtkPolyData*> MeshManagerModel::GetAllPolyDatas()
+{
+ std::vector<vtkPolyData*> polydatas;
+ for(int i = 0; i < _meshes.size(); i++){
+ polydatas.push_back(_meshes.at(i)->GetMeshBase());
+ }
+ return polydatas;
+}
+
+int MeshManagerModel::GetCurrentMesh()
+{
+ return currentMesh;
+}
+
+void MeshManagerModel::Undo()
+{
+ if(history->UndoSize() > 0)
+ {
+ if(memoryMode == false){
+ RestoreState(history->Undo(new ManagerState(_meshes, meshId, lastModified)));
+ RefreshOutputs(true);
+ }
+ else if(history->UndoSize() > 1){
+ RestoreStateMemoryMode(history->UndoKeepCurrent());
+ }
+ }
+}
+
+void MeshManagerModel::Redo()
+{
+ if(history->RedoSize() > 0)
+ {
+ if(memoryMode == false){
+ RestoreState(history->Redo(new ManagerState(_meshes, meshId, lastModified)));
+ RefreshOutputs(true);
+ }
+ else{
+ RestoreStateMemoryMode(history->RedoKeepCurrent());
+ }
+ }
+}
+
+void MeshManagerModel::Save()
+{
+ history->Save(new ManagerState(_meshes, meshId, currentMesh));
+}
+
+void MeshManagerModel::SaveMemoryMode()
+{
+ if(_meshes.size() == 1 && memoryMode)
+ {
+ std::vector<std::shared_ptr<MeshModel>> savedMesh;
+ savedMesh.push_back(std::make_shared<MeshModel>(_meshes.at(0).get()));
+ history->Save(new ManagerState(savedMesh, meshId, 0, referencePoint, referenceNormal));
+ }
+ else{
+ printf("PG MeshManagerModel::SaveMemoryMode WARNING Mesh vector has invalid size or memoryMode is not set \n");
+ }
+}
+
+void MeshManagerModel::RestoreState(ManagerState* state)
+{
+ if(state != NULL)
+ {
+ _meshes = state->GetMeshes();
+ meshId = state->GetMeshId();
+ currentMesh = state->GetModifiedPos();
+ lastModified = state->GetModifiedPos();
+ delete state;
+ }
+ else{
+ printf("PG MeshManagerModel::RestoreState WARNING State is NULL \n");
+ }
+}
+
+void MeshManagerModel::RestoreStateMemoryMode(ManagerState* state){
+ if(_meshes.size() == 1 && state != NULL)
+ {
+ vtkPoints* statePoints = vtkPoints::New();
+ statePoints->DeepCopy(state->GetMeshes().at(0)->GetMeshBase()->GetPoints());
+ _meshes.at(0)->GetMeshBase()->SetPoints(statePoints);
+ _meshes.at(0)->GetMeshBase()->GetPoints()->Modified();
+ _meshes.at(0)->GetMeshBase()->Modified();
+ referencePoint = state->GetReferencePoint();
+ referenceNormal = state->referenceNormal;
+ }else{
+ printf("PG MeshManagerModel::RestoreStateMemoryMode WARNING Mesh vector has invalid size or state is NULL\n");
+ }
+}
+
+//
+//Manager State
+//
+MeshManagerModel::ManagerState::ManagerState(std::vector<std::shared_ptr<MeshModel>> meshesToSave, int meshId, int modifiedPos)
+{
+ savedMeshes = meshesToSave;
+ savedId = meshId;
+ savedModifiedPos = modifiedPos;
+}
+
+MeshManagerModel::ManagerState::ManagerState(std::vector<std::shared_ptr<MeshModel>> meshesToSave, int meshId, int modifiedPos, std::vector<double> refPoint, std::vector<double> refNormal)
+{
+ savedMeshes = meshesToSave;
+ savedId = meshId;
+ savedModifiedPos = modifiedPos;
+ referencePoint = refPoint;
+ referenceNormal = refNormal;
+}
+
+MeshManagerModel::ManagerState::~ManagerState()
+{
+ savedMeshes.clear();
+}
+
+std::vector<std::shared_ptr<MeshModel>>& MeshManagerModel::ManagerState::GetMeshes()
+{
+ return savedMeshes;
+}
+
+int MeshManagerModel::ManagerState::GetMeshId()
+{
+ return savedId;
+}
+int MeshManagerModel::ManagerState::GetModifiedPos()
+{
+ return savedModifiedPos;
+}
+
+std::vector<double>& MeshManagerModel::ManagerState::GetReferencePoint()