From 5b438efca7448b6ee7b0bfbe7f17a01d97adb5b3 Mon Sep 17 00:00:00 2001
From: Thomas Fischer <thomas.fischer@ufz.de>
Date: Mon, 8 Jun 2020 17:16:46 +0200
Subject: [PATCH] [A / MeL / T] Add switch to addLayerToMesh().

---
 .../DataExplorer/DataView/MeshView.cpp        |  8 ++--
 Applications/Utils/MeshEdit/AddTopLayer.cpp   | 12 ++++-
 MeshLib/MeshGenerators/MeshGenerator.cpp      |  4 +-
 Tests/MeshLib/TestAddLayerToMesh.cpp          | 46 ++++++++++++++-----
 4 files changed, 53 insertions(+), 17 deletions(-)

diff --git a/Applications/DataExplorer/DataView/MeshView.cpp b/Applications/DataExplorer/DataView/MeshView.cpp
index 3259e2a1595..8515b5656ee 100644
--- a/Applications/DataExplorer/DataView/MeshView.cpp
+++ b/Applications/DataExplorer/DataView/MeshView.cpp
@@ -287,9 +287,11 @@ void MeshView::openAddLayerDialog()
         return;
     }
 
-    double const thickness (dlg.getThickness());
-    std::unique_ptr<MeshLib::Mesh> result(MeshLib::addLayerToMesh(
-        *mesh, thickness, dlg.getName(), dlg.isTopLayer()));
+    bool const copy_material_ids = false;
+    double const thickness(dlg.getThickness());
+    std::unique_ptr<MeshLib::Mesh> result(
+        MeshLib::addLayerToMesh(*mesh, thickness, dlg.getName(),
+                                dlg.isTopLayer(), copy_material_ids));
 
     if (result)
     {
diff --git a/Applications/Utils/MeshEdit/AddTopLayer.cpp b/Applications/Utils/MeshEdit/AddTopLayer.cpp
index 3c2b38651d5..24f287488e9 100644
--- a/Applications/Utils/MeshEdit/AddTopLayer.cpp
+++ b/Applications/Utils/MeshEdit/AddTopLayer.cpp
@@ -46,6 +46,15 @@ int main (int argc, char* argv[])
         "the thickness of the new layer", false, 10, "floating point value");
     cmd.add(layer_thickness_arg);
 
+    TCLAP::ValueArg<bool> copy_material_ids_arg(
+        "", "copy_material_ids",
+        "copy the existing material distribution of the layer which is to "
+        "be extented ",
+        false, false,
+        "bool value: either true for copying or false for adding new "
+        "material ID");
+    cmd.add(copy_material_ids_arg);
+
     cmd.parse(argc, argv);
 
     INFO("Reading mesh '{:s}' ... ", mesh_arg.getValue());
@@ -58,7 +67,8 @@ int main (int argc, char* argv[])
     INFO("done.");
 
     std::unique_ptr<MeshLib::Mesh> result(MeshLib::addTopLayerToMesh(
-        *subsfc_mesh, layer_thickness_arg.getValue(), mesh_out_arg.getValue()));
+        *subsfc_mesh, layer_thickness_arg.getValue(), mesh_out_arg.getValue(),
+        copy_material_ids_arg.getValue()));
     if (!result) {
         ERR("Failure while adding top layer.");
         return EXIT_FAILURE;
diff --git a/MeshLib/MeshGenerators/MeshGenerator.cpp b/MeshLib/MeshGenerators/MeshGenerator.cpp
index a3e730983c1..61467561405 100644
--- a/MeshLib/MeshGenerators/MeshGenerator.cpp
+++ b/MeshLib/MeshGenerators/MeshGenerator.cpp
@@ -588,9 +588,11 @@ Mesh* MeshGenerator::generateRegularPrismMesh(
     std::unique_ptr<MeshLib::Mesh> mesh (
         generateRegularTriMesh(n_x_cells, n_y_cells, cell_size_x, cell_size_y, origin, mesh_name));
     std::size_t const n_tris (mesh->getNumberOfElements());
+    bool const copy_material_ids = false;
     for (std::size_t i = 0; i < n_z_cells; ++i)
     {
-        mesh.reset(MeshLib::addTopLayerToMesh(*mesh, cell_size_z, mesh_name));
+        mesh.reset(MeshLib::addTopLayerToMesh(*mesh, cell_size_z, mesh_name,
+                                              copy_material_ids));
     }
     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 d0a0e610d37..77a30369335 100644
--- a/Tests/MeshLib/TestAddLayerToMesh.cpp
+++ b/Tests/MeshLib/TestAddLayerToMesh.cpp
@@ -66,7 +66,9 @@ TEST(MeshLib, AddTopLayerToLineMesh)
 {
     std::unique_ptr<MeshLib::Mesh> const mesh (MeshLib::MeshGenerator::generateLineMesh(1.0, 5));
     double const height (1);
-    std::unique_ptr<MeshLib::Mesh> const result (MeshLib::addLayerToMesh(*mesh, height, "mesh", true));
+    constexpr bool const copy_material_ids = false;
+    std::unique_ptr<MeshLib::Mesh> const result(MeshLib::addLayerToMesh(
+        *mesh, height, "mesh", true, copy_material_ids));
 
     ASSERT_EQ(2*mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2*mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -84,7 +86,9 @@ TEST(MeshLib, AddBottomLayerToLineMesh)
 {
     std::unique_ptr<MeshLib::Mesh> const mesh (MeshLib::MeshGenerator::generateLineMesh(1.0, 5));
     double const height (1);
-    std::unique_ptr<MeshLib::Mesh> const result (MeshLib::addLayerToMesh(*mesh, height, "mesh", false));
+    constexpr bool const copy_material_ids = false;
+    std::unique_ptr<MeshLib::Mesh> const result(MeshLib::addLayerToMesh(
+        *mesh, height, "mesh", false, copy_material_ids));
 
     ASSERT_EQ(2*mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2*mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -116,7 +120,9 @@ TEST(MeshLib, AddTopLayerToTriMesh)
     }
     ASSERT_EQ(2, mesh->getProperties().getPropertyVectorNames().size());
     double const height (1);
-    std::unique_ptr<MeshLib::Mesh> const result (MeshLib::addLayerToMesh(*mesh, height, "mesh", true));
+    constexpr bool copy_material_ids = false;
+    std::unique_ptr<MeshLib::Mesh> const result (MeshLib::addLayerToMesh(*mesh,
+    height, "mesh", true, copy_material_ids));
 
     ASSERT_EQ(2*mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2*mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -142,7 +148,9 @@ TEST(MeshLib, AddBottomLayerToTriMesh)
 {
     std::unique_ptr<MeshLib::Mesh> const mesh (MeshLib::MeshGenerator::generateRegularTriMesh(5, 5));
     double const height (1);
-    std::unique_ptr<MeshLib::Mesh> const result (MeshLib::addLayerToMesh(*mesh, height, "mesh", false));
+    constexpr bool copy_material_ids = false;
+    std::unique_ptr<MeshLib::Mesh> const result(MeshLib::addLayerToMesh(
+        *mesh, height, "mesh", false, copy_material_ids));
 
     ASSERT_EQ(2*mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2*mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -160,7 +168,9 @@ TEST(MeshLib, AddTopLayerToQuadMesh)
 {
     std::unique_ptr<MeshLib::Mesh> const mesh (MeshLib::MeshGenerator::generateRegularQuadMesh(5, 5));
     double const height (1);
-    std::unique_ptr<MeshLib::Mesh> const result (MeshLib::addLayerToMesh(*mesh, height, "mesh", true));
+    constexpr bool copy_material_ids = false;
+    std::unique_ptr<MeshLib::Mesh> const result(MeshLib::addLayerToMesh(
+        *mesh, height, "mesh", true, copy_material_ids));
 
     ASSERT_EQ(2*mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2*mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -178,7 +188,9 @@ TEST(MeshLib, AddBottomLayerToQuadMesh)
 {
     std::unique_ptr<MeshLib::Mesh> const mesh (MeshLib::MeshGenerator::generateRegularQuadMesh(5, 5));
     double const height (1);
-    std::unique_ptr<MeshLib::Mesh> const result (MeshLib::addLayerToMesh(*mesh, height, "mesh", false));
+    constexpr bool copy_material_ids = false;
+    std::unique_ptr<MeshLib::Mesh> const result(MeshLib::addLayerToMesh(
+        *mesh, height, "mesh", false, copy_material_ids));
 
     ASSERT_EQ(2*mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2*mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -196,7 +208,9 @@ TEST(MeshLib, AddTopLayerToHexMesh)
 {
     std::unique_ptr<MeshLib::Mesh> const mesh (MeshLib::MeshGenerator::generateRegularHexMesh(5, 5));
     double const height (1);
-    std::unique_ptr<MeshLib::Mesh> const result (MeshLib::addLayerToMesh(*mesh, height, "mesh", true));
+    constexpr bool copy_material_ids = false;
+    std::unique_ptr<MeshLib::Mesh> const result(MeshLib::addLayerToMesh(
+        *mesh, height, "mesh", true, copy_material_ids));
 
     ASSERT_EQ(mesh->getNumberOfNodes(), result->getNumberOfNodes()-36);
     ASSERT_EQ(mesh->getNumberOfElements(), result->getNumberOfElements()-25);
@@ -218,7 +232,9 @@ TEST(MeshLib, AddBottomLayerToHexMesh)
 {
     std::unique_ptr<MeshLib::Mesh> const mesh (MeshLib::MeshGenerator::generateRegularHexMesh(5, 5));
     double const height (1);
-    std::unique_ptr<MeshLib::Mesh> const result (MeshLib::addLayerToMesh(*mesh, height, "mesh", false));
+    constexpr bool copy_material_ids = false;
+    std::unique_ptr<MeshLib::Mesh> const result(MeshLib::addLayerToMesh(
+        *mesh, height, "mesh", false, copy_material_ids));
 
     ASSERT_EQ(mesh->getNumberOfNodes(), result->getNumberOfNodes()-36);
     ASSERT_EQ(mesh->getNumberOfElements(), result->getNumberOfElements()-25);
@@ -239,9 +255,12 @@ TEST(MeshLib, AddBottomLayerToHexMesh)
 TEST(MeshLib, AddTopLayerToPrismMesh)
 {
     std::unique_ptr<MeshLib::Mesh> const mesh (MeshLib::MeshGenerator::generateRegularTriMesh(5, 5));
-    std::unique_ptr<MeshLib::Mesh> const mesh2 (MeshLib::addLayerToMesh(*mesh, 5, "mesh", true));
+    constexpr bool copy_material_ids = false;
+    std::unique_ptr<MeshLib::Mesh> const mesh2(MeshLib::addLayerToMesh(
+        *mesh, 5, "mesh", true, copy_material_ids));
     double const height (1);
-    std::unique_ptr<MeshLib::Mesh> const result (MeshLib::addLayerToMesh(*mesh2, height, "mesh", true));
+    std::unique_ptr<MeshLib::Mesh> const result(MeshLib::addLayerToMesh(
+        *mesh2, height, "mesh", true, copy_material_ids));
 
     ASSERT_EQ(mesh2->getNumberOfNodes()/2.0 * 3, result->getNumberOfNodes());
     ASSERT_EQ(mesh2->getNumberOfElements()/2.0 * 3, result->getNumberOfElements());
@@ -263,7 +282,9 @@ TEST(MeshLib, AddTopLayerToPrismMesh)
 TEST(MeshLib, AddBottomLayerToPrismMesh)
 {
     std::unique_ptr<MeshLib::Mesh> const mesh (MeshLib::MeshGenerator::generateRegularTriMesh(5, 5));
-    std::unique_ptr<MeshLib::Mesh> const mesh2 (MeshLib::addLayerToMesh(*mesh, 5, "mesh", true));
+    constexpr bool copy_material_ids = false;
+    std::unique_ptr<MeshLib::Mesh> const mesh2(MeshLib::addLayerToMesh(
+        *mesh, 5, "mesh", true, copy_material_ids));
     double const height (1);
     std::string const& mat_name ("MaterialIDs");
     auto* const mats = mesh2->getProperties().createNewPropertyVector<int>(
@@ -273,7 +294,8 @@ TEST(MeshLib, AddBottomLayerToPrismMesh)
         mats->resize(mesh2->getNumberOfElements(), 0);
     }
 
-    std::unique_ptr<MeshLib::Mesh> const result (MeshLib::addLayerToMesh(*mesh2, height, "mesh", false));
+    std::unique_ptr<MeshLib::Mesh> const result(MeshLib::addLayerToMesh(
+        *mesh2, height, "mesh", false, copy_material_ids));
     ASSERT_EQ(mesh2->getNumberOfNodes()/2.0 * 3, result->getNumberOfNodes());
     ASSERT_EQ(mesh2->getNumberOfElements()/2.0 * 3, result->getNumberOfElements());
 
-- 
GitLab