diff --git a/InSituLib/VtkMappedMeshSource.cpp b/InSituLib/VtkMappedMeshSource.cpp index e325c698830b613d913973fb536b171e09c4419c..aba3d878e85d03f1c0bc36d389d50350d7ca02c1 100644 --- a/InSituLib/VtkMappedMeshSource.cpp +++ b/InSituLib/VtkMappedMeshSource.cpp @@ -114,6 +114,23 @@ int VtkMappedMeshSource::RequestData(vtkInformation *, output->GetCellData()->AddArray(dataArray.GetPointer()); } + // int + for(std::vector<std::string>::const_iterator it = propertyNames.begin(); it != propertyNames.end(); ++it) + { + boost::optional<MeshLib::PropertyVector<int> const &> propertyVector(properties.getPropertyVector<int>(*it)); + if(!propertyVector) + continue; + + vtkNew<VtkMappedElementDataArrayTemplate<int> > dataArray; + dataArray->SetPropertyVector(const_cast<MeshLib::PropertyVector<int> &>(*propertyVector)); + dataArray->SetName(it->c_str()); + + if(propertyVector->getMeshItemType() == MeshLib::MeshItemType::Node) + output->GetPointData()->AddArray(dataArray.GetPointer()); + else if(propertyVector->getMeshItemType() == MeshLib::MeshItemType::Cell) + output->GetCellData()->AddArray(dataArray.GetPointer()); + } + return 1; } diff --git a/Tests/InSituLib/TestVtkMappedElementDataDouble.cpp b/Tests/InSituLib/TestVtkMappedElementDataDouble.cpp index f60a4f66bae8ae87c822b590d19803e59adb98ea..67742df773b9930d18f77e83ee914a3aab4fd142 100644 --- a/Tests/InSituLib/TestVtkMappedElementDataDouble.cpp +++ b/Tests/InSituLib/TestVtkMappedElementDataDouble.cpp @@ -23,7 +23,7 @@ #include "VtkMappedElementDataArrayTemplate.h" -TEST(InSituLibDoubleArray, Init) +TEST(InSituLibMappedArrays, Double) { const size_t mesh_size = 5; const double length = 1.0; @@ -46,8 +46,41 @@ TEST(InSituLibDoubleArray, Init) ASSERT_EQ(dataArray->GetNumberOfComponents(), 1); ASSERT_EQ(dataArray->GetNumberOfTuples(), size); - // First array entry ASSERT_EQ(dataArray->GetValueReference(0), 1.0); + double* range = dataArray->GetRange(0); + ASSERT_EQ(range[0], 1.0); + ASSERT_EQ(range[1], 1.0 + mesh->getNElements() - 1.0); + + delete mesh; +} + +TEST(InSituLibMappedArrays, Int) +{ + const size_t mesh_size = 5; + const double length = 1.0; + + MeshLib::Mesh* mesh = MeshLib::MeshGenerator::generateRegularHexMesh(length, mesh_size); + + ASSERT_TRUE(mesh != nullptr); + const std::size_t size(mesh_size*mesh_size*mesh_size); + + std::string const prop_name("TestProperty"); + boost::optional<MeshLib::PropertyVector<int> &> properties( + mesh->getProperties().createNewPropertyVector<int>(prop_name, + MeshLib::MeshItemType::Cell)); + (*properties).resize(size); + std::iota((*properties).begin(), (*properties).end(), 1); + + vtkNew<InSituLib::VtkMappedElementDataArrayTemplate<int> > dataArray; + dataArray->SetPropertyVector(*properties); + + ASSERT_EQ(dataArray->GetNumberOfComponents(), 1); + ASSERT_EQ(dataArray->GetNumberOfTuples(), size); + + ASSERT_EQ(dataArray->GetValueReference(0), 1); + double* range = dataArray->GetRange(0); + ASSERT_EQ(range[0], 1); + ASSERT_EQ(range[1], 1 + mesh->getNElements() - 1); delete mesh; } \ No newline at end of file diff --git a/Tests/InSituLib/TestVtkMappedMeshSource.cpp b/Tests/InSituLib/TestVtkMappedMeshSource.cpp index e134b4f642cce8ba314d28780622c3942ce5bb8e..b66e9027cabcd2c323d1e40264a6c5d1b1a6bae2 100644 --- a/Tests/InSituLib/TestVtkMappedMeshSource.cpp +++ b/Tests/InSituLib/TestVtkMappedMeshSource.cpp @@ -59,6 +59,22 @@ class InSituMesh : public ::testing::Test ); (*cell_double_properties).resize(mesh->getNElements()); std::iota((*cell_double_properties).begin(), (*cell_double_properties).end(), 1); + + std::string const point_int_prop_name("PointIntProperty"); + boost::optional<MeshLib::PropertyVector<int> &> point_int_properties( + mesh->getProperties().createNewPropertyVector<int>(point_int_prop_name, + MeshLib::MeshItemType::Node) + ); + (*point_int_properties).resize(mesh->getNNodes()); + std::iota((*point_int_properties).begin(), (*point_int_properties).end(), 1); + + std::string const cell_int_prop_name("CellIntProperty"); + boost::optional<MeshLib::PropertyVector<int> &> cell_int_properties( + mesh->getProperties().createNewPropertyVector<int>(cell_int_prop_name, + MeshLib::MeshItemType::Cell) + ); + (*cell_int_properties).resize(mesh->getNElements()); + std::iota((*cell_int_properties).begin(), (*cell_int_properties).end(), 1); } ~InSituMesh() @@ -114,7 +130,7 @@ TEST_F(InSituMesh, MappedMeshSourceRoundtrip) ASSERT_EQ((subdivisions+1)*(subdivisions+1)*(subdivisions+1), output->GetNumberOfPoints()); ASSERT_EQ(subdivisions*subdivisions*subdivisions, output->GetNumberOfCells()); - // Point data array + // Point data arrays vtkDataArray* pointDoubleArray = output->GetPointData()->GetScalars("PointDoubleProperty"); ASSERT_EQ(pointDoubleArray->GetSize(), mesh->getNNodes()); ASSERT_EQ(pointDoubleArray->GetComponent(0, 0), 1.0); @@ -122,13 +138,27 @@ TEST_F(InSituMesh, MappedMeshSourceRoundtrip) ASSERT_EQ(range[0], 1.0); ASSERT_EQ(range[1], 1.0 + mesh->getNNodes() - 1.0); - // Cell data array + vtkDataArray* pointIntArray = output->GetPointData()->GetScalars("PointIntProperty"); + ASSERT_EQ(pointIntArray->GetSize(), mesh->getNNodes()); + ASSERT_EQ(pointIntArray->GetComponent(0, 0), 1.0); + range = pointIntArray->GetRange(0); + ASSERT_EQ(range[0], 1.0); + ASSERT_EQ(range[1], 1 + mesh->getNNodes() - 1); + + // Cell data arrays vtkDataArray* cellDoubleArray = output->GetCellData()->GetScalars("CellDoubleProperty"); ASSERT_EQ(cellDoubleArray->GetSize(), mesh->getNElements()); ASSERT_EQ(cellDoubleArray->GetComponent(0, 0), 1.0); - double* range2 = cellDoubleArray->GetRange(0); - ASSERT_EQ(range2[0], 1.0); - ASSERT_EQ(range2[1], 1.0 + mesh->getNElements() - 1.0); + range = cellDoubleArray->GetRange(0); + ASSERT_EQ(range[0], 1.0); + ASSERT_EQ(range[1], 1.0 + mesh->getNElements() - 1.0); + + vtkDataArray* cellIntArray = output->GetCellData()->GetScalars("CellIntProperty"); + ASSERT_EQ(cellIntArray->GetSize(), mesh->getNElements()); + ASSERT_EQ(cellIntArray->GetComponent(0, 0), 1.0); + range = cellIntArray->GetRange(0); + ASSERT_EQ(range[0], 1.0); + ASSERT_EQ(range[1], 1 + mesh->getNElements() - 1); // -- Write VTK mesh to file (in all combinations of binary, appended and compressed) // atm vtkXMLWriter::Appended does not work, see http://www.paraview.org/Bug/view.php?id=13382 @@ -152,7 +182,9 @@ TEST_F(InSituMesh, MappedMeshSourceRoundtrip) ASSERT_EQ(vtkMesh->GetNumberOfPoints(), output->GetNumberOfPoints()); ASSERT_EQ(vtkMesh->GetNumberOfCells(), output->GetNumberOfCells()); ASSERT_EQ(vtkMesh->GetPointData()->GetScalars("PointDoubleProperty")->GetNumberOfTuples(), pointDoubleArray->GetNumberOfTuples()); + ASSERT_EQ(vtkMesh->GetPointData()->GetScalars("PointIntProperty")->GetNumberOfTuples(), pointIntArray->GetNumberOfTuples()); ASSERT_EQ(vtkMesh->GetCellData()->GetScalars("CellDoubleProperty")->GetNumberOfTuples(), cellDoubleArray->GetNumberOfTuples()); + ASSERT_EQ(vtkMesh->GetCellData()->GetScalars("CellIntProperty")->GetNumberOfTuples(), cellIntArray->GetNumberOfTuples()); // Both OGS meshes should be identical MeshLib::Mesh* newMesh = MeshLib::VtkMeshConverter::convertUnstructuredGrid(vtkMesh);