diff --git a/src/Mod/Measure/Gui/ViewProviderMeasureAngle.cpp b/src/Mod/Measure/Gui/ViewProviderMeasureAngle.cpp index 50630a3965..1d5b01f36b 100644 --- a/src/Mod/Measure/Gui/ViewProviderMeasureAngle.cpp +++ b/src/Mod/Measure/Gui/ViewProviderMeasureAngle.cpp @@ -334,6 +334,6 @@ Measure::MeasureAngle* ViewProviderMeasureAngle::getMeasureAngle() void ViewProviderMeasureAngle::positionAnno(const Measure::MeasureBase* measureObject) { (void)measureObject; - setLabelTranslation(SbVec3f(0, 10, 0)); + setLabelTranslation(SbVec3f(0, 0.1 * getViewScale(), 0)); } diff --git a/src/Mod/Measure/Gui/ViewProviderMeasureBase.cpp b/src/Mod/Measure/Gui/ViewProviderMeasureBase.cpp index d4e7f00d88..ebbaf879ac 100644 --- a/src/Mod/Measure/Gui/ViewProviderMeasureBase.cpp +++ b/src/Mod/Measure/Gui/ViewProviderMeasureBase.cpp @@ -37,6 +37,7 @@ # include # include # include +# include #endif #include @@ -474,6 +475,28 @@ void ViewProviderMeasureBase::onSubjectVisibilityChanged(const App::DocumentObje } +float ViewProviderMeasureBase::getViewScale() { + float scale = 1.0; + + Gui::View3DInventor* view = dynamic_cast(this->getActiveView()); + if (!view) { + Base::Console().Log("ViewProviderMeasureBase::getViewScale: Could not get active view\n"); + return scale; + } + Gui::View3DInventorViewer* viewer = view->getViewer(); + + SoCamera * const camera = viewer->getSoRenderManager()->getCamera(); + if (!camera) + return false; + + SbViewVolume volume(camera->getViewVolume()); + SbVec3f center(volume.getSightPoint(camera->focalDistance.getValue())); + scale = volume.getWorldToScreenScale(center, 1.0); + return scale; +} + + + //NOLINTBEGIN PROPERTY_SOURCE(MeasureGui::ViewProviderMeasure, MeasureGui::ViewProviderMeasureBase) //NOLINTEND @@ -606,12 +629,20 @@ Base::Vector3d ViewProviderMeasure::getBasePosition(){ Base::Vector3d ViewProviderMeasure::getTextPosition(){ - constexpr float DefaultLeaderLength{20.0}; auto basePoint = getBasePosition(); - Base::Vector3d textDirection(1.0, 1.0, 1.0); - textDirection.Normalize(); - return basePoint + textDirection * DefaultLeaderLength; + Gui::View3DInventor* view = dynamic_cast(this->getActiveView()); + if (!view) { + Base::Console().Log("ViewProviderMeasureBase::getTextPosition: Could not get active view\n"); + return Base::Vector3d(); + } + + Gui::View3DInventorViewer* viewer = view->getViewer(); + + // Convert to screenspace, offset and convert back to world space + SbVec2s screenPos = viewer->getPointOnViewport(SbVec3f(basePoint.x, basePoint.y, basePoint.z)); + SbVec3f textPos = viewer->getPointOnFocalPlane(screenPos + SbVec2s(30.0, 30.0)); + return Base::Vector3d(textPos[0], textPos[1], textPos[2]); } //! called by the system when it is time to display this measure diff --git a/src/Mod/Measure/Gui/ViewProviderMeasureBase.h b/src/Mod/Measure/Gui/ViewProviderMeasureBase.h index 79d87593cc..6246b20514 100644 --- a/src/Mod/Measure/Gui/ViewProviderMeasureBase.h +++ b/src/Mod/Measure/Gui/ViewProviderMeasureBase.h @@ -129,7 +129,7 @@ protected: static constexpr double defaultTolerance = 10e-6; virtual Base::Vector3d getTextDirection(Base::Vector3d elementDirection, double tolerance = defaultTolerance); - + float getViewScale(); // TODO: getters & setters and move variables to private? bool _mShowTree = true; diff --git a/src/Mod/Measure/Gui/ViewProviderMeasureDistance.cpp b/src/Mod/Measure/Gui/ViewProviderMeasureDistance.cpp index f3d944d0b1..96156ea5c6 100644 --- a/src/Mod/Measure/Gui/ViewProviderMeasureDistance.cpp +++ b/src/Mod/Measure/Gui/ViewProviderMeasureDistance.cpp @@ -218,5 +218,5 @@ void ViewProviderMeasureDistance::redrawAnnotation() void ViewProviderMeasureDistance::positionAnno(const Measure::MeasureBase* measureObject) { (void)measureObject; - setLabelTranslation(SbVec3f(0, 10, 0)); + setLabelTranslation(SbVec3f(0, 0.1 * getViewScale(), 0)); }