diff --git a/Applications/DataExplorer/DataView/MeshView.cpp b/Applications/DataExplorer/DataView/MeshView.cpp index 556be406e101f6f1e74da489563f2822b1815da9..839e7db2bffc1f1a736308ed71900a8d51e96d27 100644 --- a/Applications/DataExplorer/DataView/MeshView.cpp +++ b/Applications/DataExplorer/DataView/MeshView.cpp @@ -304,7 +304,8 @@ void MeshView::openAddLayerDialog() bool const copy_material_ids = false; double const thickness(dlg.getThickness()); std::unique_ptr<MeshLib::Mesh> result(MeshToolsLib::addLayerToMesh( - *mesh, thickness, dlg.getName(), dlg.isTopLayer(), copy_material_ids)); + *mesh, thickness, dlg.getName(), dlg.isTopLayer(), copy_material_ids, + std::nullopt)); if (result) { diff --git a/Applications/Utils/MeshEdit/AddLayer.cpp b/Applications/Utils/MeshEdit/AddLayer.cpp index 86bc9b8a15b7e6eec4586fb707bfaa1c31c31b92..4f00368bc3f5d91ddb084d9e99ab4fd4815fa25e 100644 --- a/Applications/Utils/MeshEdit/AddLayer.cpp +++ b/Applications/Utils/MeshEdit/AddLayer.cpp @@ -68,8 +68,22 @@ int main(int argc, char* argv[]) false); cmd.add(copy_material_ids_arg); + TCLAP::ValueArg<int> set_material_arg("", "set-material-id", + "the material id of the new layer", + false, 0, "integer value"); + cmd.add(set_material_arg); cmd.parse(argc, argv); + if (set_material_arg.isSet() && copy_material_ids_arg.isSet()) + { + ERR("It is not possiblo to set both options '--copy-material-ids' and " + "'--set-material-id'."); +#ifdef USE_PETSC + MPI_Finalize(); +#endif + return EXIT_FAILURE; + } + #ifdef USE_PETSC MPI_Init(&argc, &argv); #endif @@ -87,9 +101,16 @@ int main(int argc, char* argv[]) } INFO("done."); + std::optional<int> layer_id; + if (set_material_arg.isSet()) + { + layer_id = set_material_arg.getValue(); + } + std::unique_ptr<MeshLib::Mesh> result(MeshToolsLib::addLayerToMesh( *subsfc_mesh, layer_thickness_arg.getValue(), mesh_out_arg.getValue(), - layer_position_arg.getValue(), copy_material_ids_arg.getValue())); + layer_position_arg.getValue(), copy_material_ids_arg.getValue(), + layer_id)); if (!result) { ERR("Failure while adding layer."); diff --git a/MeshToolsLib/MeshEditing/AddLayerToMesh.cpp b/MeshToolsLib/MeshEditing/AddLayerToMesh.cpp index 4c661e58b9fccff7256afcdf2297391081bc1696..8285bf5f228ba7ff1d73ae645a1b8a6f568b61f6 100644 --- a/MeshToolsLib/MeshEditing/AddLayerToMesh.cpp +++ b/MeshToolsLib/MeshEditing/AddLayerToMesh.cpp @@ -81,9 +81,10 @@ MeshLib::Element* extrudeElement( return nullptr; } -MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double thickness, - std::string const& name, bool on_top, - bool copy_material_ids) +MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double const thickness, + std::string const& name, bool const on_top, + bool const copy_material_ids, + std::optional<int> const layer_id) { INFO("Extracting top surface of mesh '{:s}' ... ", mesh.getName()); double const flag = on_top ? -1.0 : 1.0; @@ -199,8 +200,11 @@ MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double thickness, } else { - int const new_layer_id( - *(std::max_element(materials->cbegin(), materials->cend())) + 1); + int const new_layer_id = + layer_id.has_value() + ? layer_id.value() + : *(std::max_element(materials->cbegin(), materials->cend())) + + 1; auto const n_new_props(subsfc_elements.size() - mesh.getNumberOfElements()); std::fill_n(std::back_inserter(*new_materials), n_new_props, diff --git a/MeshToolsLib/MeshEditing/AddLayerToMesh.h b/MeshToolsLib/MeshEditing/AddLayerToMesh.h index 99d3f1ddd29fbd5bdf03d983a3d136953088f963..4a7190dce01fbcb20e0340acd0944c8d141d1a86 100644 --- a/MeshToolsLib/MeshEditing/AddLayerToMesh.h +++ b/MeshToolsLib/MeshEditing/AddLayerToMesh.h @@ -14,6 +14,7 @@ #pragma once +#include <optional> #include <string> #include <vector> @@ -30,8 +31,9 @@ namespace MeshToolsLib /// Adds a layer to the mesh. If on_top is true, the layer is added on top, /// if it is false, the layer is added at the bottom. -MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double thickness, - std::string const& name, bool on_top, - bool copy_material_ids); +MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double const thickness, + std::string const& name, bool const on_top, + bool const copy_material_ids, + std::optional<int> const layer_id); } // namespace MeshToolsLib diff --git a/MeshToolsLib/MeshGenerators/MeshGenerator.cpp b/MeshToolsLib/MeshGenerators/MeshGenerator.cpp index 14cc336d385aff700a0c3d05925c91414ac12258..a48afd206a3f0d7e825548422ce66e7346488139 100644 --- a/MeshToolsLib/MeshGenerators/MeshGenerator.cpp +++ b/MeshToolsLib/MeshGenerators/MeshGenerator.cpp @@ -616,7 +616,8 @@ MeshLib::Mesh* MeshGenerator::generateRegularPrismMesh( for (std::size_t i = 0; i < n_z_cells; ++i) { mesh.reset(MeshToolsLib::addLayerToMesh(*mesh, cell_size_z, mesh_name, - true, copy_material_ids)); + true, copy_material_ids, + std::nullopt)); } std::vector<std::size_t> elem_ids(n_tris); std::iota(elem_ids.begin(), elem_ids.end(), 0); diff --git a/Tests/MeshLib/TestAddLayerToMesh.cpp b/Tests/MeshLib/TestAddLayerToMesh.cpp index 80dff5ca83e7510c6bb97f103afb505abcd65462..52e45cdf7c2f1efe63c72a45717c36d4180c90b4 100644 --- a/Tests/MeshLib/TestAddLayerToMesh.cpp +++ b/Tests/MeshLib/TestAddLayerToMesh.cpp @@ -75,7 +75,7 @@ TEST(MeshLib, AddTopLayerToLineMesh) double const height(1); constexpr bool const copy_material_ids = false; std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh( - *mesh, height, "mesh", true, copy_material_ids)); + *mesh, height, "mesh", true, copy_material_ids, std::nullopt)); ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes()); ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements()); @@ -96,7 +96,7 @@ TEST(MeshLib, AddBottomLayerToLineMesh) double const height(1); constexpr bool const copy_material_ids = false; std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh( - *mesh, height, "mesh", false, copy_material_ids)); + *mesh, height, "mesh", false, copy_material_ids, std::nullopt)); ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes()); ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements()); @@ -131,7 +131,7 @@ TEST(MeshLib, AddTopLayerToTriMesh) double const height(1); constexpr bool copy_material_ids = false; std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh( - *mesh, height, "mesh", true, copy_material_ids)); + *mesh, height, "mesh", true, copy_material_ids, std::nullopt)); ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes()); ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements()); @@ -162,7 +162,7 @@ TEST(MeshLib, AddBottomLayerToTriMesh) double const height(1); constexpr bool copy_material_ids = false; std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh( - *mesh, height, "mesh", false, copy_material_ids)); + *mesh, height, "mesh", false, copy_material_ids, std::nullopt)); ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes()); ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements()); @@ -183,7 +183,7 @@ TEST(MeshLib, AddTopLayerToQuadMesh) double const height(1); constexpr bool copy_material_ids = false; std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh( - *mesh, height, "mesh", true, copy_material_ids)); + *mesh, height, "mesh", true, copy_material_ids, std::nullopt)); ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes()); ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements()); @@ -204,7 +204,7 @@ TEST(MeshLib, AddBottomLayerToQuadMesh) double const height(1); constexpr bool copy_material_ids = false; std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh( - *mesh, height, "mesh", false, copy_material_ids)); + *mesh, height, "mesh", false, copy_material_ids, std::nullopt)); ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes()); ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements()); @@ -225,7 +225,7 @@ TEST(MeshLib, AddTopLayerToHexMesh) double const height(1); constexpr bool copy_material_ids = false; std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh( - *mesh, height, "mesh", true, copy_material_ids)); + *mesh, height, "mesh", true, copy_material_ids, std::nullopt)); ASSERT_EQ(mesh->getNumberOfNodes(), result->getNumberOfNodes() - 36); ASSERT_EQ(mesh->getNumberOfElements(), result->getNumberOfElements() - 25); @@ -250,7 +250,7 @@ TEST(MeshLib, AddBottomLayerToHexMesh) double const height(1); constexpr bool copy_material_ids = false; std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh( - *mesh, height, "mesh", false, copy_material_ids)); + *mesh, height, "mesh", false, copy_material_ids, std::nullopt)); ASSERT_EQ(mesh->getNumberOfNodes(), result->getNumberOfNodes() - 36); ASSERT_EQ(mesh->getNumberOfElements(), result->getNumberOfElements() - 25); @@ -274,10 +274,10 @@ TEST(MeshLib, AddTopLayerToPrismMesh) MeshToolsLib::MeshGenerator::generateRegularTriMesh(5, 5)); constexpr bool copy_material_ids = false; std::unique_ptr<MeshLib::Mesh> const mesh2(MeshToolsLib::addLayerToMesh( - *mesh, 5, "mesh", true, copy_material_ids)); + *mesh, 5, "mesh", true, copy_material_ids, std::nullopt)); double const height(1); std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh( - *mesh2, height, "mesh", true, copy_material_ids)); + *mesh2, height, "mesh", true, copy_material_ids, std::nullopt)); ASSERT_EQ(mesh2->getNumberOfNodes() / 2.0 * 3, result->getNumberOfNodes()); ASSERT_EQ(mesh2->getNumberOfElements() / 2.0 * 3, @@ -303,7 +303,7 @@ TEST(MeshLib, AddBottomLayerToPrismMesh) MeshToolsLib::MeshGenerator::generateRegularTriMesh(5, 5)); constexpr bool copy_material_ids = false; std::unique_ptr<MeshLib::Mesh> const mesh2(MeshToolsLib::addLayerToMesh( - *mesh, 5, "mesh", true, copy_material_ids)); + *mesh, 5, "mesh", true, copy_material_ids, std::nullopt)); double const height(1); std::string const& mat_name("MaterialIDs"); auto* const mats = mesh2->getProperties().createNewPropertyVector<int>( @@ -314,7 +314,7 @@ TEST(MeshLib, AddBottomLayerToPrismMesh) } std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh( - *mesh2, height, "mesh", false, copy_material_ids)); + *mesh2, height, "mesh", false, copy_material_ids, std::nullopt)); ASSERT_EQ(mesh2->getNumberOfNodes() / 2.0 * 3, result->getNumberOfNodes()); ASSERT_EQ(mesh2->getNumberOfElements() / 2.0 * 3, result->getNumberOfElements());