From 3195581475280cde4f7bf351f22a32aa20e9ee2a Mon Sep 17 00:00:00 2001
From: rinkk <karsten.rink@ufz.de>
Date: Fri, 27 Apr 2018 14:47:23 +0200
Subject: [PATCH] adjusted removeMeshElements-tool to also accept value ranges
 (and double arrays)

---
 .../Utils/MeshEdit/removeMeshElements.cpp     | 127 ++++++++++++++----
 1 file changed, 102 insertions(+), 25 deletions(-)

diff --git a/Applications/Utils/MeshEdit/removeMeshElements.cpp b/Applications/Utils/MeshEdit/removeMeshElements.cpp
index b255fdd0465..c35f221bb78 100644
--- a/Applications/Utils/MeshEdit/removeMeshElements.cpp
+++ b/Applications/Utils/MeshEdit/removeMeshElements.cpp
@@ -28,26 +28,46 @@
 #include "MeshLib/MeshEditing/RemoveMeshComponents.h"
 
 template <typename PROPERTY_TYPE>
-void searchByProperty(std::string const& property_name,
-                      std::vector<PROPERTY_TYPE> const& property_values,
-                      MeshLib::ElementSearch& searcher)
+void searchByPropertyValue(std::string const& property_name,
+                           std::vector<PROPERTY_TYPE> const& property_values,
+                           MeshLib::ElementSearch& searcher)
 {
-    for (auto const& property_value : property_values) {
-        const std::size_t n_marked_elements =
-            searcher.searchByPropertyValue(property_name, property_value);
+    for (auto const& property_value : property_values)
+    {
+        std::size_t n_marked_elements = searcher.searchByPropertyValue<double>(
+            property_name, property_value);
+        if (n_marked_elements == 0)
+            std::size_t n_marked_elements = searcher.searchByPropertyValue<int>(
+                property_name, property_value);
         INFO("%d elements with property value %s found.", n_marked_elements,
              std::to_string(property_value).c_str());
     }
 }
 
+void searchByPropertyRange(std::string const& property_name,
+                           double const& min_value, double const& max_value,
+                           bool const& outside,
+                           MeshLib::ElementSearch& searcher)
+{
+    std::size_t n_marked_elements = searcher.searchByPropertyValueRange<double>(
+        property_name, min_value, max_value, outside);
+
+    if (n_marked_elements == 0)
+        n_marked_elements = searcher.searchByPropertyValueRange<int>(
+            property_name, static_cast<int>(min_value),
+            static_cast<int>(max_value), outside);
+
+    INFO("%d elements in range [%s, %s] found.", n_marked_elements,
+         std::to_string(min_value).c_str(), std::to_string(max_value).c_str());
+}
+
 int main (int argc, char* argv[])
 {
     ApplicationsLib::LogogSetup logog_setup;
 
-    TCLAP::CmdLine cmd(
-        "Remove mesh elements. The documentation is available at "
-        "https://docs.opengeosys.org/docs/tools/meshing/remove-mesh-elements.",
-        ' ', "0.1");
+    TCLAP::CmdLine cmd("Removes mesh elements based on element type, element volume, scalar "
+        "arrays, or bounding box . The documentation is available at "
+        "https://docs.opengeosys.org/docs/tools/meshing/remove-mesh-elements.", ' ', "0.1");
 
     // Bounding box params
     TCLAP::ValueArg<double> zLargeArg("", "z-max", "largest allowed extent in z-dimension",
@@ -76,15 +96,31 @@ int main (int argc, char* argv[])
                                           "element type to be removed", false, "element type");
     cmd.add(eleTypeArg);
 
-    TCLAP::MultiArg<int> int_property_arg("", "int-property-value",
-                                          "new property value (data type int)",
-                                          false, "number");
-    cmd.add(int_property_arg);
+    // scalar array params
     TCLAP::ValueArg<std::string> property_name_arg(
-        "n", "property-name", "name of property in the mesh", false,
-        "MaterialIDs", "string");
+        "n", "property-name", "name of property in the mesh", false, "MaterialIDs", "string");
     cmd.add(property_name_arg);
 
+    TCLAP::MultiArg<int> property_arg(
+        "", "property-value", "value of selected property to be removed", false, "number");
+    cmd.add(property_arg);
+
+    TCLAP::ValueArg<double> min_property_arg(
+        "", "min-value", "minimum value of range for selected property", false, 0, "number");
+    cmd.add(min_property_arg);
+
+    TCLAP::ValueArg<double> max_property_arg(
+        "", "max-value", "maximum value of range for selected property", false, 0, "number");
+    cmd.add(max_property_arg);
+
+    TCLAP::SwitchArg outside_property_arg(
+        "", "outside", "remove all elements outside the given property range");
+    cmd.add(outside_property_arg);
+
+    TCLAP::SwitchArg inside_property_arg(
+        "", "inside", "remove all elements inside the given property range");
+    cmd.add(inside_property_arg);
+
     // I/O params
     TCLAP::ValueArg<std::string> mesh_out("o", "mesh-output-file",
                                           "the name of the file the mesh will be written to", true,
@@ -94,11 +130,13 @@ int main (int argc, char* argv[])
                                          "the name of the file containing the input mesh", true,
                                          "", "file name of input mesh");
     cmd.add(mesh_in);
-
     cmd.parse(argc, argv);
 
     std::unique_ptr<MeshLib::Mesh const> mesh(
         MeshLib::IO::readMeshFromFile(mesh_in.getValue()));
+    if (mesh == nullptr)
+        return EXIT_FAILURE;
+
     INFO("Mesh read: %d nodes, %d elements.", mesh->getNumberOfNodes(), mesh->getNumberOfElements());
     MeshLib::ElementSearch searcher(*mesh);
 
@@ -116,9 +154,52 @@ int main (int argc, char* argv[])
         }
     }
 
-    if (int_property_arg.isSet()) {
-        searchByProperty(property_name_arg.getValue(),
-                         int_property_arg.getValue(), searcher);
+    if (property_name_arg.isSet() || property_arg.isSet() ||
+        min_property_arg.isSet() || max_property_arg.isSet())
+    {
+        if ((property_arg.isSet() || min_property_arg.isSet() || max_property_arg.isSet()) &&
+            !property_name_arg.isSet())
+        {
+            ERR("Specify a property name for the value/range selected.");
+            return EXIT_FAILURE;
+        }
+
+        if (property_name_arg.isSet() &&
+            !((min_property_arg.isSet() && max_property_arg.isSet()) || property_arg.isSet()))
+        {
+            ERR("Specify a value or range (\"-min-value\" and \"-max_value\") "
+                "for the property selected.");
+            return EXIT_FAILURE;
+        }
+
+        // name + value
+        if (property_arg.isSet() && property_name_arg.isSet())
+        {
+            searchByPropertyValue(property_name_arg.getValue(),
+                                  property_arg.getValue(), searcher);
+        }
+
+        // name + range
+        if (property_name_arg.isSet() && min_property_arg.isSet() &&
+            max_property_arg.isSet())
+        {
+            if ((!outside_property_arg.isSet() &&
+                 !inside_property_arg.isSet()) ||
+                (outside_property_arg.isSet() && inside_property_arg.isSet()))
+            {
+                ERR("Specify if the inside or the outside of the selected "
+                    "range should be removed.");
+                return EXIT_FAILURE;
+            }
+
+            bool outside = false;
+            if (outside_property_arg.isSet())
+                outside = true;
+
+            searchByPropertyRange(
+                property_name_arg.getValue(), min_property_arg.getValue(),
+                max_property_arg.getValue(), outside, searcher);
+        }
     }
 
     if (xSmallArg.isSet() || xLargeArg.isSet() ||
@@ -150,8 +231,7 @@ int main (int argc, char* argv[])
             MathLib::Point3d(std::array<double,3>{{xLargeArg.getValue(),
                 yLargeArg.getValue(), zLargeArg.getValue()}})}});
         INFO("%d elements found.",
-             searcher.searchByBoundingBox(
-                 GeoLib::AABB(extent.begin(), extent.end())));
+             searcher.searchByBoundingBox(GeoLib::AABB(extent.begin(), extent.end())));
     }
 
     // remove the elements and create a new mesh object.
@@ -166,6 +246,3 @@ int main (int argc, char* argv[])
 
     return EXIT_SUCCESS;
 }
-
-
-
-- 
GitLab