From b8adfad244eba4fe8190e6f9e19136da1779be0f Mon Sep 17 00:00:00 2001 From: nishi <91971064+nishendra3@users.noreply.github.com> Date: Mon, 2 Mar 2026 18:08:54 +0100 Subject: [PATCH] Measurement: label drag when infront of model (#27832) Co-authored-by: Nishendra Singh (cherry picked from commit 2d6e49cb7f6d308f071ccf2caf699018f4d22de6) --- .../Measure/Gui/ViewProviderMeasureBase.cpp | 37 +++++++++++-------- src/Mod/Measure/Gui/ViewProviderMeasureBase.h | 1 + 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/Mod/Measure/Gui/ViewProviderMeasureBase.cpp b/src/Mod/Measure/Gui/ViewProviderMeasureBase.cpp index 40a0261be7..df4904b92e 100644 --- a/src/Mod/Measure/Gui/ViewProviderMeasureBase.cpp +++ b/src/Mod/Measure/Gui/ViewProviderMeasureBase.cpp @@ -143,8 +143,12 @@ ViewProviderMeasureBase::ViewProviderMeasureBase() transformEngine->matrix.connectFrom(&matrixEngine->matrix); pLabelTranslation->translation.connectFrom(&transformEngine->point); + auto pTextPickStyle = new SoPickStyle(); + pTextPickStyle->style = SoPickStyle::SHAPE_ON_TOP; + pTextSeparator = new SoSeparator(); pTextSeparator->ref(); + pTextSeparator->addChild(pTextPickStyle); pTextSeparator->addChild(dragSeparator); pTextSeparator->addChild(pLabelTranslation); pTextSeparator->addChild(pLabel); @@ -341,11 +345,28 @@ void ViewProviderMeasureBase::updateIcon() pLabel->setIcon(Gui::BitmapFactory().pixmapFromSvg(sPixmap, QSize(20, 20), colorMap)); } +void ViewProviderMeasureBase::syncDraggerOrientationToView() +{ + Gui::View3DInventor* view = nullptr; + try { + view = dynamic_cast(this->getActiveView()); + } + catch (const Base::RuntimeError&) { + return; + } + if (view) { + auto* cam = view->getViewer()->getSoRenderManager()->getCamera(); + if (cam) { + pDraggerOrientation->rotation.connectFrom(&cam->orientation); + } + } +} void ViewProviderMeasureBase::attach(App::DocumentObject* pcObj) { ViewProviderDocumentObject::attach(pcObj); updateIcon(); + syncDraggerOrientationToView(); } @@ -621,21 +642,7 @@ ViewProviderMeasure::ViewProviderMeasure() points->numPoints = 1; lineSep->addChild(points); - // Connect dragger local orientation to view orientation - Gui::View3DInventor* view = nullptr; - try { - view = dynamic_cast(this->getActiveView()); - } - catch (const Base::RuntimeError&) { - Base::Console().log("ViewProviderMeasure::ViewProviderMeasure: Could not get active view\n"); - } - - if (view) { - Gui::View3DInventorViewer* viewer = view->getViewer(); - auto renderManager = viewer->getSoRenderManager(); - auto cam = renderManager->getCamera(); - pDraggerOrientation->rotation.connectFrom(&cam->orientation); - } + syncDraggerOrientationToView(); } ViewProviderMeasure::~ViewProviderMeasure() diff --git a/src/Mod/Measure/Gui/ViewProviderMeasureBase.h b/src/Mod/Measure/Gui/ViewProviderMeasureBase.h index 34c9945dcd..f5e442179d 100644 --- a/src/Mod/Measure/Gui/ViewProviderMeasureBase.h +++ b/src/Mod/Measure/Gui/ViewProviderMeasureBase.h @@ -140,6 +140,7 @@ protected: void setLabelValue(const QString& value); void setLabelTranslation(const SbVec3f& position); void updateIcon(); + void syncDraggerOrientationToView(); SoPickStyle* getSoPickStyle(); SoDrawStyle* getSoLineStylePrimary();