From d7aa1bb2efdae29dae98747d0acabd993f695122 Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Wed, 11 Dec 2024 23:39:04 +0100 Subject: [PATCH] PD: Forward transform requests to Body --- src/Gui/TaskCSysDragger.cpp | 8 ++++++++ src/Gui/ViewProviderDragger.cpp | 25 ++++++++++++----------- src/Gui/ViewProviderDragger.h | 6 +++--- src/Mod/PartDesign/Gui/ViewProvider.cpp | 27 ++++++++++++++++++++++++- src/Mod/PartDesign/Gui/ViewProvider.h | 2 ++ 5 files changed, 52 insertions(+), 16 deletions(-) diff --git a/src/Gui/TaskCSysDragger.cpp b/src/Gui/TaskCSysDragger.cpp index 6c9a90d734..2b15f080dd 100644 --- a/src/Gui/TaskCSysDragger.cpp +++ b/src/Gui/TaskCSysDragger.cpp @@ -382,6 +382,9 @@ void TaskTransform::setSelectionMode(SelectionMode mode) draggerPickStyle->style = SoPickStyle::SHAPE_ON_TOP; draggerPickStyle->setOverride(false); blockSelection(true); + + vp->setTransformOrigin(vp->getTransformOrigin()); + break; } @@ -492,6 +495,11 @@ void TaskTransform::onAlignRotationChanged() void TaskTransform::onAlignToOtherObject() { + if (selectionMode == SelectionMode::SelectAlignTarget) { + setSelectionMode(SelectionMode::None); + return; + } + setSelectionMode(SelectionMode::SelectAlignTarget); } diff --git a/src/Gui/ViewProviderDragger.cpp b/src/Gui/ViewProviderDragger.cpp index 719c22e6a3..cf37d474a8 100644 --- a/src/Gui/ViewProviderDragger.cpp +++ b/src/Gui/ViewProviderDragger.cpp @@ -49,6 +49,7 @@ #include "ViewProviderDragger.h" #include "Utilities.h" +#include #include #include @@ -123,15 +124,17 @@ void ViewProviderDragger::setupContextMenu(QMenu* menu, QObject* receiver, const ViewProvider* ViewProviderDragger::startEditing(int mode) { - _linkDragger = nullptr; + forwardedViewProvider = nullptr; + auto ret = ViewProviderDocumentObject::startEditing(mode); if (!ret) { return ret; } - return _linkDragger ? _linkDragger : ret; + + return forwardedViewProvider ? forwardedViewProvider : ret; } -bool ViewProviderDragger::checkLink() +bool ViewProviderDragger::forwardToLink() { // Trying to detect if the editing request is forwarded by a link object, // usually by doubleClicked(). If so, we route the request back. There shall @@ -150,26 +153,24 @@ bool ViewProviderDragger::checkLink() return false; } - auto sobj = vpParent->getObject()->getSubObject(subname.c_str()); - if (!sobj || sobj == getObject() || sobj->getLinkedObject(true) != getObject()) { + if (vpParent == this) { return false; } - auto vp = Application::Instance->getViewProvider(sobj); - if (!vp) { + if (!vpParent->isDerivedFrom()) { return false; } - _linkDragger = vp->startEditing(ViewProvider::Transform); + forwardedViewProvider = vpParent->startEditing(ViewProvider::Transform); - return _linkDragger != nullptr; + return forwardedViewProvider != nullptr; } bool ViewProviderDragger::setEdit(int ModNum) { Q_UNUSED(ModNum); - if (checkLink()) { + if (forwardToLink()) { return true; } @@ -208,8 +209,8 @@ void ViewProviderDragger::setEditViewer(Gui::View3DInventorViewer* viewer, int M if (csysDragger && viewer) { csysDragger->setUpAutoScale(viewer->getSoRenderManager()->getCamera()); - auto mat = viewer->getDocument()->getEditingTransform(); - mat *= getObjectPlacement().inverse().toMatrix(); + auto originPlacement = App::GeoFeature::getGlobalPlacement(getObject()) * getObjectPlacement().inverse(); + auto mat = originPlacement.toMatrix(); viewer->getDocument()->setEditingTransform(mat); viewer->setupEditingRoot(csysDragger, &mat); diff --git a/src/Gui/ViewProviderDragger.h b/src/Gui/ViewProviderDragger.h index 13d37efb23..a2d9686bbb 100644 --- a/src/Gui/ViewProviderDragger.h +++ b/src/Gui/ViewProviderDragger.h @@ -90,6 +90,8 @@ protected: void onChanged(const App::Property* prop) override; + bool forwardToLink(); + /** * Returns a newly create dialog for the part to be placed in the task view * Must be reimplemented in subclasses. @@ -97,6 +99,7 @@ protected: virtual TaskView::TaskDialog* getTransformDialog(); CoinPtr csysDragger = nullptr; + ViewProvider *forwardedViewProvider = nullptr; private: static void dragStartCallback(void *data, SoDragger *d); @@ -105,9 +108,6 @@ private: void updateDraggerPosition(); - bool checkLink(); - - ViewProvider *_linkDragger = nullptr; Base::Placement draggerPlacement { }; }; diff --git a/src/Mod/PartDesign/Gui/ViewProvider.cpp b/src/Mod/PartDesign/Gui/ViewProvider.cpp index 2b1d364aec..9da111e119 100644 --- a/src/Mod/PartDesign/Gui/ViewProvider.cpp +++ b/src/Mod/PartDesign/Gui/ViewProvider.cpp @@ -81,7 +81,16 @@ void ViewProvider::setupContextMenu(QMenu* menu, QObject* receiver, const char* bool ViewProvider::setEdit(int ModNum) { - if (ModNum == ViewProvider::Default ) { + if (ModNum == ViewProvider::Transform) { + if (forwardToLink()) { + return true; + } + + // this is feature so we need to forward the transform to the body + forwardedViewProvider = getBodyViewProvider(); + return forwardedViewProvider->startEditing(ModNum); + } + else if (ModNum == ViewProvider::Default) { // When double-clicking on the item for this feature the // object unsets and sets its edit mode without closing // the task panel @@ -194,6 +203,22 @@ void ViewProvider::onChanged(const App::Property* prop) { PartGui::ViewProviderPartExt::onChanged(prop); } +Gui::ViewProvider* ViewProvider::startEditing(int ModNum) +{ + // in case of transform we forward the request to body + if (ModNum == Transform) { + forwardedViewProvider = nullptr; + + if (!ViewProviderPart::startEditing(ModNum)) { + return nullptr; + } + + return forwardedViewProvider; + } + + return ViewProviderPart::startEditing(ModNum); +} + void ViewProvider::setTipIcon(bool onoff) { isSetTipIcon = onoff; diff --git a/src/Mod/PartDesign/Gui/ViewProvider.h b/src/Mod/PartDesign/Gui/ViewProvider.h index 9b8e16c38d..6e303a0e6e 100644 --- a/src/Mod/PartDesign/Gui/ViewProvider.h +++ b/src/Mod/PartDesign/Gui/ViewProvider.h @@ -55,6 +55,8 @@ public: void updateData(const App::Property*) override; void onChanged(const App::Property* prop) override; + Gui::ViewProvider* startEditing(int ModNum) override; + void setTipIcon(bool onoff); //body mode means that the object is part of a body and that the body is used to set the