From f23cbdcec728fada533c42f0bae262a4023389a1 Mon Sep 17 00:00:00 2001 From: Alberto-o Date: Tue, 9 Jun 2026 12:21:07 +0200 Subject: [PATCH 1/7] Adds MesherBase options to have stair and conf options derived from it. Adds bool isVolume to options --- src/meshers/CMakeLists.txt | 6 +++++- src/meshers/ConformalMesherOptions.h | 5 +++-- src/meshers/MesherBaseOptions.h | 14 ++++++++++++++ src/meshers/StaircaserMesherOptions.h | 13 +++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/meshers/MesherBaseOptions.h create mode 100644 src/meshers/StaircaserMesherOptions.h diff --git a/src/meshers/CMakeLists.txt b/src/meshers/CMakeLists.txt index dfdd88c..32eed77 100644 --- a/src/meshers/CMakeLists.txt +++ b/src/meshers/CMakeLists.txt @@ -6,7 +6,11 @@ add_library(tessellator-meshers "OffgridMesher.cpp" "ConformalMesher.cpp" ) -target_link_libraries(tessellator-meshers tessellator-core tessellator-utils) +target_link_libraries(tessellator-meshers + tessellator-core + tessellator-utils + tessellator-cgal + CGAL::CGAL) if(TESSELLATOR_EXECUTION_POLICIES) add_definitions(-DTESSELLATOR_EXECUTION_POLICIES) diff --git a/src/meshers/ConformalMesherOptions.h b/src/meshers/ConformalMesherOptions.h index 86f31d2..5a38c18 100644 --- a/src/meshers/ConformalMesherOptions.h +++ b/src/meshers/ConformalMesherOptions.h @@ -1,14 +1,15 @@ #pragma once #include "types/Mesh.h" +#include "MesherBaseOptions.h" #include "core/SnapperOptions.h" namespace meshlib::meshers { -class ConformalMesherOptions { +class ConformalMesherOptions : public MesherBaseOptions { public: core::SnapperOptions snapperOptions; - std::set volumeGroups{}; + // std::set volumeGroups{}; }; } diff --git a/src/meshers/MesherBaseOptions.h b/src/meshers/MesherBaseOptions.h new file mode 100644 index 0000000..f647815 --- /dev/null +++ b/src/meshers/MesherBaseOptions.h @@ -0,0 +1,14 @@ +#pragma once + +#include "types/Mesh.h" +#include "core/SnapperOptions.h" + +namespace meshlib::meshers { + +class MesherBaseOptions { +public: + bool isVolume; + std::set volumeGroups{}; +}; + +} diff --git a/src/meshers/StaircaserMesherOptions.h b/src/meshers/StaircaserMesherOptions.h new file mode 100644 index 0000000..6418a7b --- /dev/null +++ b/src/meshers/StaircaserMesherOptions.h @@ -0,0 +1,13 @@ +#pragma once + +#include "types/Mesh.h" +#include "MesherBaseOptions.h" +#include "core/SnapperOptions.h" + +namespace meshlib::meshers { + +class ConformalMesherOptions : public MesherBaseOptions { +public: +}; + +} From 66cddaa870c558c04f8747e93789daf867374bf7 Mon Sep 17 00:00:00 2001 From: Alberto-o Date: Tue, 9 Jun 2026 16:11:09 +0200 Subject: [PATCH 2/7] StaircaseMesher fills volume is body marked as volume. Some changes pending to pass the option --- src/app/launcher.cpp | 21 ++++++++++++++++++- src/meshers/MesherBase.h | 4 ++++ src/meshers/MesherBaseOptions.h | 2 +- src/meshers/StaircaseMesher.cpp | 18 ++++++++++++++-- src/meshers/StaircaseMesher.h | 4 +++- ...sherOptions.h => StaircaseMesherOptions.h} | 2 +- 6 files changed, 45 insertions(+), 6 deletions(-) rename src/meshers/{StaircaserMesherOptions.h => StaircaseMesherOptions.h} (71%) diff --git a/src/app/launcher.cpp b/src/app/launcher.cpp index b8dd444..6f4cb2c 100644 --- a/src/app/launcher.cpp +++ b/src/app/launcher.cpp @@ -95,6 +95,20 @@ std::string readExtension(const std::string &fn) } } +meshlib::meshers::StaircaseMesherOptions readStaircaseMesherOptions(const std::string &fn) +{ + nlohmann::json j; + { + std::ifstream i(fn); + i >> j; + } + meshlib::meshers::StaircaseMesherOptions res; + if (j["object"].contains("volume")) { + res.isVolume = j["object"]["volume"]; + } + return res; +} + meshlib::meshers::ConformalMesherOptions readConformalMesherOptions(const std::string &fn) { nlohmann::json j; @@ -103,6 +117,11 @@ meshlib::meshers::ConformalMesherOptions readConformalMesherOptions(const std::s i >> j; } meshlib::meshers::ConformalMesherOptions res; + if (j["object"].contains("volume")) { + res.isVolume = j["object"]["volume"]; + } + + if (j["mesher"].contains("options")) { res.snapperOptions.edgePoints = j["mesher"]["options"]["edgePoints"]; res.snapperOptions.forbiddenLength = j["mesher"]["options"]["forbiddenLength"]; @@ -113,7 +132,7 @@ std::unique_ptr buildMesher(const Mesh &in, const { auto mesherType = readMesherType(fn); if (mesherType == meshlib::app::staircase_mesher) { - return std::make_unique(meshlib::meshers::StaircaseMesher{in}); + return std::make_unique(meshlib::meshers::StaircaseMesher{in, 4, readStaircaseMesherOptions(fn)}); } else if (mesherType == meshlib::app::conformal_mesher) { return std::make_unique(meshlib::meshers::ConformalMesher{in, readConformalMesherOptions(fn)}); } else { diff --git a/src/meshers/MesherBase.h b/src/meshers/MesherBase.h index a688c29..938f949 100644 --- a/src/meshers/MesherBase.h +++ b/src/meshers/MesherBase.h @@ -1,6 +1,7 @@ #pragma once #include "types/Mesh.h" +#include "MesherBaseOptions.h" namespace meshlib { namespace meshers { @@ -29,6 +30,9 @@ class MesherBase { Grid originalGrid_; Grid enlargedGrid_; + MesherBaseOptions opts_; + + }; } diff --git a/src/meshers/MesherBaseOptions.h b/src/meshers/MesherBaseOptions.h index f647815..7403619 100644 --- a/src/meshers/MesherBaseOptions.h +++ b/src/meshers/MesherBaseOptions.h @@ -7,7 +7,7 @@ namespace meshlib::meshers { class MesherBaseOptions { public: - bool isVolume; + bool isVolume = false; std::set volumeGroups{}; }; diff --git a/src/meshers/StaircaseMesher.cpp b/src/meshers/StaircaseMesher.cpp index 7ad6458..89588e3 100644 --- a/src/meshers/StaircaseMesher.cpp +++ b/src/meshers/StaircaseMesher.cpp @@ -7,6 +7,8 @@ #include "core/Collapser.h" #include "core/Staircaser.h" +#include "cgal/filler/Filler.h" + #include "utils/RedundancyCleaner.h" #include "utils/MeshTools.h" #include "utils/GridTools.h" @@ -17,9 +19,10 @@ using namespace utils; using namespace core; using namespace meshTools; -StaircaseMesher::StaircaseMesher(const Mesh& inputMesh, int decimalPlacesInCollapser) : +StaircaseMesher::StaircaseMesher(const Mesh& inputMesh, int decimalPlacesInCollapser, StaircaseMesherOptions opts) : MesherBase(inputMesh), - decimalPlacesInCollapser_(decimalPlacesInCollapser) + decimalPlacesInCollapser_(decimalPlacesInCollapser), + opts_(opts) { log("Preparing surfaces."); surfaceMesh_ = buildMeshFilteringElements(inputMesh, isNotTetrahedron); @@ -49,6 +52,17 @@ void StaircaseMesher::process(Mesh& mesh) const auto dimensions = getHighestDimensionByGroup(mesh); + if (opts_.isVolume){ + std::cout<<"isvolume"< Date: Tue, 9 Jun 2026 16:23:25 +0200 Subject: [PATCH 3/7] Enables CGAL --- CMakePresets.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CMakePresets.json b/CMakePresets.json index 322d7c9..853ceb1 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -9,7 +9,9 @@ "CMAKE_TOOLCHAIN_FILE": { "type": "FILEPATH", "value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" - } + }, + "TESSELLATOR_ENABLE_CGAL": true + } }, { From 3c8ff72644ed046b19500df2470fc071c39c9e22 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 9 Jun 2026 14:30:36 +0000 Subject: [PATCH 4/7] Disable GHA vcpkg binary source in CI --- .github/workflows/build-and-test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 73d442b..a942e69 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -24,6 +24,8 @@ jobs: name: ${{ matrix.preset.os }} / ${{matrix.preset.name}} / ${{matrix.build-type}} runs-on: ${{ matrix.preset.os }} + env: + VCPKG_BINARY_SOURCES: clear steps: - name: checkout repository From 477090fbcc62f4948fa2ea133d2ca1731fbf8fe9 Mon Sep 17 00:00:00 2001 From: Alberto-o Date: Tue, 9 Jun 2026 16:52:52 +0200 Subject: [PATCH 5/7] Adds test to launcher --- test/app/launcherTest.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/app/launcherTest.cpp b/test/app/launcherTest.cpp index 3942428..e5dd3f7 100644 --- a/test/app/launcherTest.cpp +++ b/test/app/launcherTest.cpp @@ -77,6 +77,15 @@ TEST_F(LauncherTest, launches_sphere_case) EXPECT_EQ(exitCode, EXIT_SUCCESS); } +TEST_F(LauncherTest, launches_closed_sphere_case) +{ + int ac = 3; + const char* av[] = { NULL, "-i", "testData/cases/sphere/closed_sphere.tessellator.json"}; + int exitCode; + EXPECT_NO_THROW(exitCode = meshlib::app::launcher(ac, av)); + EXPECT_EQ(exitCode, EXIT_SUCCESS); +} + TEST_F(LauncherTest, launches_conformal_sphere_case) { int ac = 3; From 4472beb79df8ea8ca028585648ed80c25e724913 Mon Sep 17 00:00:00 2001 From: Alberto-o Date: Wed, 10 Jun 2026 10:16:26 +0200 Subject: [PATCH 6/7] Adds missing json file --- testData/cases/sphere/closed_sphere.tessellator.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 testData/cases/sphere/closed_sphere.tessellator.json diff --git a/testData/cases/sphere/closed_sphere.tessellator.json b/testData/cases/sphere/closed_sphere.tessellator.json new file mode 100644 index 0000000..d95ebfe --- /dev/null +++ b/testData/cases/sphere/closed_sphere.tessellator.json @@ -0,0 +1,10 @@ +{ + "grid": { + "numberOfCells": [50, 50, 50], + "boundingBox": [ + [-100.0, -100.0, -100.0], + [ 100.0, 100.0, 100.0] + ] + }, + "object": {"filename": "sphere.stl", "volume" : true} +} \ No newline at end of file From e44a7a3884fb40077ebdefcc60c64b55a25b4084 Mon Sep 17 00:00:00 2001 From: Alberto-o Date: Wed, 10 Jun 2026 10:45:19 +0200 Subject: [PATCH 7/7] Adds test to check that filled volume has more quads than surface --- src/meshers/StaircaseMesher.cpp | 1 - test/meshers/StaircaseMesherTest.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/meshers/StaircaseMesher.cpp b/src/meshers/StaircaseMesher.cpp index 89588e3..cd9f753 100644 --- a/src/meshers/StaircaseMesher.cpp +++ b/src/meshers/StaircaseMesher.cpp @@ -53,7 +53,6 @@ void StaircaseMesher::process(Mesh& mesh) const auto dimensions = getHighestDimensionByGroup(mesh); if (opts_.isVolume){ - std::cout<<"isvolume"< countMeshElementsIf(staircasedMesh, isQuad)); + +} + TEST_F(StaircaseMesherTest, preserves_topological_closedness_for_alhambra) { auto mesh = vtkIO::readInputMesh("testData/cases/alhambra/alhambra.stl");