Gui: Add Show Placement utility

This commit is contained in:
Kacper Donat
2025-02-23 15:05:46 +01:00
parent 076ab800ff
commit 569ddc345b
2 changed files with 29 additions and 0 deletions

View File

@@ -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) {

View File

@@ -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<SoFCCSysDragger> csysDragger = nullptr;
ViewProvider *forwardedViewProvider = nullptr;
CoinPtr<SoSwitch> pcPlacement;
private:
static void dragStartCallback(void *data, SoDragger *d);
static void dragFinishCallback(void *data, SoDragger *d);