[MeasureGui] Make initial measurement placement zoom independent

This commit is contained in:
hlorus
2024-05-04 13:42:57 +02:00
committed by Chris Hennes
parent 967dd8a8ed
commit 24ca6056f4
4 changed files with 38 additions and 7 deletions

View File

@@ -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));
}

View File

@@ -37,6 +37,7 @@
# include <Inventor/engines/SoComposeMatrix.h>
# include <Inventor/engines/SoTransformVec3f.h>
# include <Inventor/engines/SoConcatenate.h>
# include <Inventor/SbViewportRegion.h>
#endif
#include <App/DocumentObject.h>
@@ -474,6 +475,28 @@ void ViewProviderMeasureBase::onSubjectVisibilityChanged(const App::DocumentObje
}
float ViewProviderMeasureBase::getViewScale() {
float scale = 1.0;
Gui::View3DInventor* view = dynamic_cast<Gui::View3DInventor*>(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<Gui::View3DInventor*>(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

View File

@@ -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;

View File

@@ -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));
}