diff --git a/src/Mod/CAM/App/Area.cpp b/src/Mod/CAM/App/Area.cpp
index 46c53279e4..3264cfdc0c 100644
--- a/src/Mod/CAM/App/Area.cpp
+++ b/src/Mod/CAM/App/Area.cpp
@@ -74,6 +74,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -1920,7 +1921,13 @@ std::vector> Area::makeSections(PARAM_ARGS(PARAM_FARG, AREA_PAR
showShape(xp.Current(), nullptr, "section_%u_shape", i);
std::list wires;
Part::CrossSection section(a, b, c, xp.Current());
- wires = section.slice(-d);
+ Part::FuzzyHelper::withBooleanFuzzy(.0, [&]() {
+ // Workaround for https://github.com/FreeCAD/FreeCAD/issues/17748
+ // needed to make finish pass work.
+ // This fix might be better to move into Part::CrossSection but it is kept
+ // here for now to be on the safe side.
+ wires = section.slice(-d);
+ });
showShapes(wires, nullptr, "section_%u_wire", i);
if (wires.empty()) {
AREA_LOG("Section returns no wires");
diff --git a/src/Mod/Part/App/FuzzyHelper.cpp b/src/Mod/Part/App/FuzzyHelper.cpp
index de192700cd..59afcd4965 100644
--- a/src/Mod/Part/App/FuzzyHelper.cpp
+++ b/src/Mod/Part/App/FuzzyHelper.cpp
@@ -27,12 +27,21 @@
using namespace Part;
-double FuzzyHelper::BooleanFuzzy = 1.0;
+namespace {
+ double BooleanFuzzy = 1.0;
+}
double FuzzyHelper::getBooleanFuzzy() {
return BooleanFuzzy;
}
-void FuzzyHelper::setBooleanFuzzy(const double fuzzy) {
- BooleanFuzzy = fuzzy;
+
+void FuzzyHelper::setBooleanFuzzy(const double base) {
+ BooleanFuzzy = base;
}
+void FuzzyHelper::withBooleanFuzzy(double base, std::function func) {
+ double oldValue = getBooleanFuzzy();
+ setBooleanFuzzy(base);
+ func();
+ setBooleanFuzzy(oldValue);
+}
diff --git a/src/Mod/Part/App/FuzzyHelper.h b/src/Mod/Part/App/FuzzyHelper.h
index 153676771a..96ffbd8c45 100644
--- a/src/Mod/Part/App/FuzzyHelper.h
+++ b/src/Mod/Part/App/FuzzyHelper.h
@@ -26,22 +26,20 @@
#define PART_FUZZYHELPER_H
#include
+#include
namespace Part
{
/**
- * @brief The FuzzyHelper class provides a static helper function to determine fuzzy value for a boolean operation
+ * @brief The FuzzyHelper provides helper functions to determine fuzzy value for a boolean operation
*/
-class PartExport FuzzyHelper
+namespace FuzzyHelper
{
-public:
- static double getBooleanFuzzy();
- static void setBooleanFuzzy(const double base);
-private:
- static double BooleanFuzzy;
-};
-
+ double PartExport getBooleanFuzzy();
+ void PartExport setBooleanFuzzy(double base);
+ void PartExport withBooleanFuzzy(double base, std::function func);
+}
}