From 199fbfb91a897933d0b5373738745adefd34c483 Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Tue, 6 Jan 2026 13:29:56 +0100 Subject: [PATCH] PartDesign: Apply pattern transform in Feature not VP This is followup for https://github.com/FreeCAD/FreeCAD/pull/26563 which fixed previews for a given file but broke it for others. This approach should be more robust as it is applied in the Feature itself and not on view provider level which should give us more precise control and per feature transform ability. (cherry picked from commit 4fae2b83f8be2186d6f248b4d988fa3f7da2b8b3) --- src/Mod/PartDesign/App/FeatureTransformed.cpp | 28 ++++++++++++++++--- .../Gui/ViewProviderTransformed.cpp | 15 +--------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/Mod/PartDesign/App/FeatureTransformed.cpp b/src/Mod/PartDesign/App/FeatureTransformed.cpp index 904cd79796..adaff0c4a4 100644 --- a/src/Mod/PartDesign/App/FeatureTransformed.cpp +++ b/src/Mod/PartDesign/App/FeatureTransformed.cpp @@ -227,19 +227,34 @@ App::DocumentObjectExecReturn* Transformed::recomputePreview() { const auto mode = static_cast(TransformMode.getValue()); - const auto makeCompoundOfToolShapes = [this]() { + const Part::Feature* supportFeature = getBaseObject(); + const Part::TopoShape supportShape = supportFeature->Shape.getShape(); + + if (supportShape.isNull()) { + return App::DocumentObject::StdReturn; + } + + gp_Trsf supportTransform = supportShape.getShape().Location().Transformation(); + + const auto makeCompoundOfToolShapes = [this, &supportTransform]() { BRep_Builder builder; TopoDS_Compound compound; builder.MakeCompound(compound); for (const auto& original : getOriginals()) { if (auto* feature = freecad_cast(original)) { - const auto& shape = feature->AddSubShape.getShape(); + auto shape = feature->AddSubShape.getShape(); + + gp_Trsf trsf = feature->getLocation().Transformation().Multiplied( + supportTransform.Inverted() + ); if (shape.isNull()) { continue; } + shape = shape.makeElementTransform(trsf); + builder.Add(compound, shape.getShape()); } } @@ -252,9 +267,14 @@ App::DocumentObjectExecReturn* Transformed::recomputePreview() PreviewShape.setValue(makeCompoundOfToolShapes()); return StdReturn; - case Mode::WholeShape: - PreviewShape.setValue(getBaseShape()); + case Mode::WholeShape: { + auto shape = getBaseTopoShape(); + shape = shape.makeElementTransform(supportTransform.Inverted()); + + PreviewShape.setValue(shape.getShape()); + return StdReturn; + } default: return FeatureRefine::recomputePreview(); diff --git a/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp b/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp index 50c6f6ca15..d5e203d228 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp @@ -104,19 +104,6 @@ void ViewProviderTransformed::updatePreview() try { if (auto feature = getObject()) { - const Part::Feature* supportFeature = feature->getBaseObject(); - const Part::TopoShape& supportShape = supportFeature->Shape.getShape(); - - if (supportShape.isNull()) { - return; - } - - Base::Matrix4D invertedSupportMatrix; - Part::TopoShape::convertToMatrix( - supportShape.getShape().Location().Transformation().Inverted(), - invertedSupportMatrix - ); - auto originals = feature->getOriginals(); auto transforms = feature->getTransformations(originals); @@ -133,7 +120,7 @@ void ViewProviderTransformed::updatePreview() auto sep = new SoSeparator; auto transformNode = new SoTransform; - transformNode->setMatrix(convert(transformMatrix * invertedSupportMatrix)); + transformNode->setMatrix(convert(transformMatrix)); sep->addChild(transformNode); sep->addChild(pcPreviewShape);