From 5ab7d17f67969b12c53b7bb8715f198093fcf56b Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 12 Apr 2022 16:32:54 +0200 Subject: [PATCH] PD: issue #6641: polar pattern fails --- src/Mod/PartDesign/App/FeatureTransformed.cpp | 39 ++++++++----------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/src/Mod/PartDesign/App/FeatureTransformed.cpp b/src/Mod/PartDesign/App/FeatureTransformed.cpp index 8db5f246ef..faac868ffb 100644 --- a/src/Mod/PartDesign/App/FeatureTransformed.cpp +++ b/src/Mod/PartDesign/App/FeatureTransformed.cpp @@ -170,7 +170,6 @@ short Transformed::mustExecute() const App::DocumentObjectExecReturn *Transformed::execute(void) { std::string overlapMode = Overlap.getValueAsString(); - bool overlapDetectionMode = overlapMode == "Detect"; std::vector originals = Originals.getValues(); if (originals.empty()) // typically InsideMultiTransform @@ -226,7 +225,6 @@ App::DocumentObjectExecReturn *Transformed::execute(void) for (std::vector::const_iterator o = originals.begin(); o != originals.end(); ++o) { // Extract the original shape and determine whether to cut or to fuse - TopoDS_Shape shape; Part::TopoShape fuseShape; Part::TopoShape cutShape; @@ -248,23 +246,19 @@ App::DocumentObjectExecReturn *Transformed::execute(void) TopoDS_Shape current = support; - BRep_Builder builder; - TopoDS_Compound compShape; - builder.MakeCompound(compShape); std::vector shapes; - bool overlapping = false; std::vector::const_iterator transformIter = transformations.begin(); // First transformation is skipped since it should not be part of the toolShape. - transformIter++; + ++transformIter; for (; transformIter != transformations.end(); ++transformIter) { // Make an explicit copy of the shape because the "true" parameter to BRepBuilderAPI_Transform // seems to be pretty broken BRepBuilderAPI_Copy copy(origShape); - shape = copy.Shape(); + TopoDS_Shape shape = copy.Shape(); BRepBuilderAPI_Transform mkTrf(shape, *transformIter, false); // No need to copy, now if (!mkTrf.IsDone()) @@ -272,30 +266,26 @@ App::DocumentObjectExecReturn *Transformed::execute(void) shape = mkTrf.Shape(); shapes.emplace_back(shape); - builder.Add(compShape, shape); - - if (overlapDetectionMode) - overlapping = overlapping || (countSolids(TopoShape(origShape).fuse(shape))==1); - } - TopoDS_Shape toolShape; - - #ifdef FC_DEBUG - if (overlapping || overlapMode == "Overlap mode") + if (overlapMode == "Overlap mode") Base::Console().Message("Transformed: Overlapping feature mode (fusing tool shapes)\n"); else Base::Console().Message("Transformed: Non-Overlapping feature mode (compound of tool shapes)\n"); #endif - if (overlapping || overlapMode == "Overlap mode") - toolShape = TopoShape(shape).fuse(shapes, Precision::Confusion()); - else - toolShape = compShape; + TopTools_ListOfShape shapeArguments; + shapeArguments.Append(current); + TopTools_ListOfShape shapeTools; + for (auto shape : shapes) + shapeTools.Append(shape); if (!fuseShape.isNull()) { - std::unique_ptr mkBool(new BRepAlgoAPI_Fuse(current, toolShape)); + std::unique_ptr mkBool(new BRepAlgoAPI_Fuse()); + mkBool->SetArguments(shapeArguments); + mkBool->SetTools(shapeTools); + mkBool->Build(); if (!mkBool->IsDone()) { std::stringstream error; error << "Boolean operation failed"; @@ -303,7 +293,10 @@ App::DocumentObjectExecReturn *Transformed::execute(void) } current = mkBool->Shape(); } else { - std::unique_ptr mkBool(new BRepAlgoAPI_Cut(current, toolShape)); + std::unique_ptr mkBool(new BRepAlgoAPI_Cut()); + mkBool->SetArguments(shapeArguments); + mkBool->SetTools(shapeTools); + mkBool->Build(); if (!mkBool->IsDone()) { std::stringstream error; error << "Boolean operation failed";