diff --git a/src/Gui/ViewProviderDragger.cpp b/src/Gui/ViewProviderDragger.cpp index 70caa50b6b..00b653e709 100644 --- a/src/Gui/ViewProviderDragger.cpp +++ b/src/Gui/ViewProviderDragger.cpp @@ -43,6 +43,7 @@ #include "Control.h" #include "Document.h" #include "SoFCCSysDragger.h" +#include "Inventor/SoFCPlacementIndicatorKit.h" #include "SoFCUnifiedSelection.h" #include "TaskCSysDragger.h" #include "View3DInventorViewer.h" @@ -60,6 +61,14 @@ PROPERTY_SOURCE(Gui::ViewProviderDragger, Gui::ViewProviderDocumentObject) ViewProviderDragger::ViewProviderDragger() { ADD_PROPERTY_TYPE(TransformOrigin, ({}), nullptr, App::Prop_Hidden, nullptr); + ADD_PROPERTY_TYPE(ShowPlacement, + (false), + "Display Options", + App::Prop_None, + "If true, placement of object is additionally rendered."); + + pcPlacement = new SoSwitch; + pcPlacement->whichChild = SO_SWITCH_NONE; }; ViewProviderDragger::~ViewProviderDragger() = default; @@ -98,6 +107,9 @@ void ViewProviderDragger::onChanged(const App::Property* property) if (property == &TransformOrigin) { updateDraggerPosition(); } + else if (property == &ShowPlacement) { + pcPlacement->whichChild = ShowPlacement.getValue() ? SO_SWITCH_ALL : SO_SWITCH_NONE; + } ViewProviderDocumentObject::onChanged(property); } @@ -322,6 +334,16 @@ void ViewProviderDragger::setDraggerPlacement(const Base::Placement& placement) csysDragger->clearIncrementCounts(); } +void ViewProviderDragger::attach(App::DocumentObject* pcObject) +{ + ViewProviderDocumentObject::attach(pcObject); + + getAnnotation()->addChild(pcPlacement); + + auto* pcAxisCrossKit = new Gui::SoFCPlacementIndicatorKit(); + pcPlacement->addChild(pcAxisCrossKit); +} + void ViewProviderDragger::updateDraggerPosition() { if (!csysDragger) { diff --git a/src/Gui/ViewProviderDragger.h b/src/Gui/ViewProviderDragger.h index 21808413a7..a0635ef2c6 100644 --- a/src/Gui/ViewProviderDragger.h +++ b/src/Gui/ViewProviderDragger.h @@ -56,11 +56,17 @@ public: /// destructor. ~ViewProviderDragger() override; + /// Property controlling visibility of the placement indicator, useful for displaying origin + /// position of attached Document Object. + App::PropertyBool ShowPlacement; + /// Origin used when object is transformed. It temporarily changes the origin of object. /// Dragger is normally placed at the transform origin, unless explicitly overridden via /// ViewProviderDragger#setDraggerPlacement() method. App::PropertyPlacement TransformOrigin; + void attach(App::DocumentObject* pcObject) override; + /// Convenience method to obtain the transform origin Base::Placement getTransformOrigin() const { return TransformOrigin.getValue(); } /// Convenience method to set the transform origin @@ -114,6 +120,7 @@ protected: CoinPtr csysDragger = nullptr; ViewProvider *forwardedViewProvider = nullptr; + CoinPtr pcPlacement; private: static void dragStartCallback(void *data, SoDragger *d); static void dragFinishCallback(void *data, SoDragger *d);