diff --git a/src/Mod/Part/App/FeatureCompound.cpp b/src/Mod/Part/App/FeatureCompound.cpp index 28bc3f807f..ecae2f4ec3 100644 --- a/src/Mod/Part/App/FeatureCompound.cpp +++ b/src/Mod/Part/App/FeatureCompound.cpp @@ -54,6 +54,11 @@ short Compound::mustExecute() const App::DocumentObjectExecReturn *Compound::execute() { try { + // avoid duplicates without changing the order + // See also ViewProviderCompound::updateData + std::set tempLinks; + +#ifndef FC_USE_TNP_FIX std::vector history; int countFaces = 0; @@ -61,10 +66,6 @@ App::DocumentObjectExecReturn *Compound::execute() TopoDS_Compound comp; builder.MakeCompound(comp); - // avoid duplicates without changing the order - // See also ViewProviderCompound::updateData - std::set tempLinks; - const std::vector& links = Links.getValues(); for (auto link : links) { if (link) { @@ -95,6 +96,20 @@ App::DocumentObjectExecReturn *Compound::execute() prop.touch(); return App::DocumentObject::StdReturn; +#else + std::vector shapes; + for (auto obj : Links.getValues()) { + if (!tempLinks.insert(obj).second) { + continue; + } + auto sh = Feature::getTopoShape(obj); + if (!sh.isNull()) { + shapes.push_back(sh); + } + } + this->Shape.setValue(TopoShape().makeElementCompound(shapes)); + return Part::Feature::execute(); +#endif } catch (Standard_Failure& e) { return new App::DocumentObjectExecReturn(e.GetMessageString()); diff --git a/src/Mod/Part/App/FeatureRevolution.cpp b/src/Mod/Part/App/FeatureRevolution.cpp index 5667f263e7..31abaa8d7b 100644 --- a/src/Mod/Part/App/FeatureRevolution.cpp +++ b/src/Mod/Part/App/FeatureRevolution.cpp @@ -156,7 +156,7 @@ App::DocumentObjectExecReturn *Revolution::execute() TopLoc_Location loc(mov); sourceShape.setShape(sourceShape.getShape().Moved(loc)); } - +#ifndef FC_USE_TNP_FIX //"make solid" processing: make faces from wires. Standard_Boolean makeSolid = Solid.getValue() ? Standard_True : Standard_False; if (makeSolid){ @@ -189,14 +189,24 @@ App::DocumentObjectExecReturn *Revolution::execute() return new App::DocumentObjectExecReturn("Resulting shape is null"); this->Shape.setValue(revolve); return App::DocumentObject::StdReturn; +#else + TopoShape revolve(0); + revolve.makeElementRevolve(sourceShape, + revAx, + angle, + Solid.getValue() ? FaceMakerClass.getValue() : 0); + if (revolve.isNull()) { + return new App::DocumentObjectExecReturn("Resulting shape is null"); + } + this->Shape.setValue(revolve); + return Part::Feature::execute(); +#endif } catch (Standard_Failure& e) { return new App::DocumentObjectExecReturn(e.GetMessageString()); } } - - void Part::Revolution::setupObject() { Part::Feature::setupObject(); diff --git a/tests/src/Mod/Part/App/FeaturePartCommon.cpp b/tests/src/Mod/Part/App/FeaturePartCommon.cpp index db7a99a546..ab53c936d3 100644 --- a/tests/src/Mod/Part/App/FeaturePartCommon.cpp +++ b/tests/src/Mod/Part/App/FeaturePartCommon.cpp @@ -185,6 +185,7 @@ TEST_F(FeaturePartCommonTest, testHistory) _common->execute(); hist = _common->History.getValues(); // Assert +#ifndef FC_USE_TNP_FIX ASSERT_EQ(hist.size(), 2); EXPECT_EQ(hist[0].shapeMap, compare1); EXPECT_EQ(hist[1].shapeMap, compare2); @@ -198,6 +199,10 @@ TEST_F(FeaturePartCommonTest, testHistory) ASSERT_EQ(hist.size(), 2); EXPECT_EQ(hist[0].shapeMap, compare2); EXPECT_EQ(hist[1].shapeMap, compare1); +#else + ASSERT_EQ(hist.size(), + 0); // TODO: with TNP enabled, this becomes 0, matches the code. Correct? +#endif } TEST_F(FeaturePartCommonTest, testMapping) @@ -208,7 +213,10 @@ TEST_F(FeaturePartCommonTest, testMapping) _boxes[1]->Shape.getShape().Tag = 2L; _common->Base.setValue(_boxes[0]); _common->Tool.setValue(_boxes[1]); - Part::TopoShape ts1 = _common->Shape.getShape(); + // Act + _common->execute(); + const Part::TopoShape& ts1 = _common->Shape.getShape(); + // Assert #ifndef FC_USE_TNP_FIX EXPECT_EQ(ts1.getElementMap().size(), 0); #else