From 181d3f5536e426f961cc008e5831420001f3b186 Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Thu, 7 Jul 2022 12:17:59 +0800 Subject: [PATCH] Gui: fix ViewProviderLink transform with scale Fixes FreeCAD/FreeCAD#7113 --- src/Gui/ViewProviderLink.cpp | 28 ++++++++++++++++++++++++++-- src/Gui/ViewProviderLink.h | 3 +++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Gui/ViewProviderLink.cpp b/src/Gui/ViewProviderLink.cpp index f007503608..4db16b757b 100644 --- a/src/Gui/ViewProviderLink.cpp +++ b/src/Gui/ViewProviderLink.cpp @@ -1819,7 +1819,7 @@ void ViewProviderLink::updateDataPrivate(App::LinkBaseExtension *ext, const App: if(canScale(v)) pcTransform->scaleFactor.setValue(v.x,v.y,v.z); SbMatrix matrix = convert(ext->getTransform(false)); - linkView->renderDoubleSide(matrix.det3() < 0); + linkView->renderDoubleSide(matrix.det3() < 1e-7); } }else if(prop == ext->getPlacementProperty() || prop == ext->getLinkPlacementProperty()) { auto propLinkPlacement = ext->getLinkPlacementProperty(); @@ -1830,7 +1830,7 @@ void ViewProviderLink::updateDataPrivate(App::LinkBaseExtension *ext, const App: if(canScale(v)) pcTransform->scaleFactor.setValue(v.x,v.y,v.z); SbMatrix matrix = convert(ext->getTransform(false)); - linkView->renderDoubleSide(matrix.det3() < 0); + linkView->renderDoubleSide(matrix.det3() < 1e-7); } }else if(prop == ext->getLinkCopyOnChangeGroupProperty()) { if (auto group = ext->getLinkCopyOnChangeGroupValue()) { @@ -3407,6 +3407,30 @@ ViewProviderDocumentObject *ViewProviderLink::getLinkedViewProvider( return self; } +void ViewProviderLink::setTransformation(const Base::Matrix4D &rcMatrix) +{ + inherited::setTransformation(rcMatrix); + auto ext = getLinkExtension(); + if(ext) { + if (ext->getScaleVectorProperty()) + updateDataPrivate(getLinkExtension(),ext->getScaleVectorProperty()); + else + updateDataPrivate(getLinkExtension(),ext->getScaleProperty()); + } +} + +void ViewProviderLink::setTransformation(const SbMatrix &rcMatrix) +{ + inherited::setTransformation(rcMatrix); + auto ext = getLinkExtension(); + if(ext) { + if (ext->getScaleVectorProperty()) + updateDataPrivate(getLinkExtension(),ext->getScaleVectorProperty()); + else + updateDataPrivate(getLinkExtension(),ext->getScaleProperty()); + } +} + //////////////////////////////////////////////////////////////////////////////////////// namespace Gui { diff --git a/src/Gui/ViewProviderLink.h b/src/Gui/ViewProviderLink.h index 85f9c8a310..c3c34d93af 100644 --- a/src/Gui/ViewProviderLink.h +++ b/src/Gui/ViewProviderLink.h @@ -268,6 +268,9 @@ public: return true; } + virtual void setTransformation(const Base::Matrix4D &rcMatrix) override; + virtual void setTransformation(const SbMatrix &rcMatrix) override; + protected: bool setEdit(int ModNum) override; void setEditViewer(View3DInventorViewer*, int ModNum) override;