From 393d64d53c2e6b60a79dbc764732c885de901ab0 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 2 Jan 2015 14:57:14 +0100 Subject: [PATCH] + fixes #0000498: 'Measure Distance' tool sometimes renders distances inside of solid objects --- src/Gui/ViewProviderMeasureDistance.cpp | 26 ++++++++----------------- src/Gui/ViewProviderMeasureDistance.h | 1 + 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/Gui/ViewProviderMeasureDistance.cpp b/src/Gui/ViewProviderMeasureDistance.cpp index c1dc1ab01..773bb12ce 100644 --- a/src/Gui/ViewProviderMeasureDistance.cpp +++ b/src/Gui/ViewProviderMeasureDistance.cpp @@ -28,7 +28,7 @@ # include # include # include -# include +# include # include # include # include @@ -50,6 +50,7 @@ #include #include #include +#include using namespace Gui; @@ -58,7 +59,7 @@ PROPERTY_SOURCE(Gui::ViewProviderMeasureDistance, Gui::ViewProviderDocumentObjec ViewProviderMeasureDistance::ViewProviderMeasureDistance() { - ADD_PROPERTY(TextColor,(0.0f,0.0f,0.0f)); + ADD_PROPERTY(TextColor,(1.0f,1.0f,1.0f)); ADD_PROPERTY(LineColor,(1.0f,1.0f,1.0f)); ADD_PROPERTY(FontSize,(18)); ADD_PROPERTY(DistFactor,(1.0)); @@ -172,20 +173,13 @@ void ViewProviderMeasureDistance::attach(App::DocumentObject* pcObject) points->numPoints=2; lineSep->addChild(points); - // Making the whole measurement object selectable by 3d view can - // become cumbersome since it has influence to any raypick action. - // Thus, it's only selectable by its text label - SoFCSelection* textsep = new SoFCSelection(); - textsep->objectName = pcObject->getNameInDocument(); - textsep->documentName = pcObject->getDocument()->getName(); - textsep->subElementName = "Main"; - //SoSeparator* textsep = new SoSeparator(); + SoSeparator* textsep = new SoSeparator(); textsep->addChild(pTranslation); textsep->addChild(pTextColor); textsep->addChild(pFont); textsep->addChild(pLabel); - SoSeparator* sep = new SoSeparator(); + SoSeparator* sep = new SoAnnotation(); sep->addChild(lineSep); sep->addChild(textsep); addDisplayMaskMode(sep, "Base"); @@ -233,11 +227,7 @@ void ViewProviderMeasureDistance::updateData(const App::Property* prop) SbVec3f pos = (pCoords->point[2]+pCoords->point[3])/2.0f; pTranslation->translation.setValue(pos); - std::stringstream s; - s.precision(3); - s.setf(std::ios::fixed | std::ios::showpoint); - s << dif.length(); - pLabel->string.setValue(s.str().c_str()); + pLabel->string.setValue((Base::Quantity(dif.length(), Base::Unit::Length)).getUserString().toUtf8().constData()); } ViewProviderDocumentObject::updateData(prop); @@ -323,7 +313,6 @@ void ViewProviderMeasureDistance::measureDistanceCallback(void * ud, SoEventCall if (mbe->getButton() == SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::DOWN) { const SoPickedPoint * point = n->getPickedPoint(); - // I think this is where we need to snap. IR 20140630 if (point == NULL) { Base::Console().Message("No point picked.\n"); return; @@ -339,7 +328,8 @@ void ViewProviderMeasureDistance::measureDistanceCallback(void * ud, SoEventCall view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), measureDistanceCallback, ud); pm->deleteLater(); } - } else if (mbe->getButton() != SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::UP) { + } + else if (mbe->getButton() != SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::UP) { n->setHandled(); view->setEditing(false); view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), measureDistanceCallback, ud); diff --git a/src/Gui/ViewProviderMeasureDistance.h b/src/Gui/ViewProviderMeasureDistance.h index 10244aae5..92f0b23d0 100644 --- a/src/Gui/ViewProviderMeasureDistance.h +++ b/src/Gui/ViewProviderMeasureDistance.h @@ -90,6 +90,7 @@ public: void attach(App::DocumentObject *); void updateData(const App::Property*); + bool useNewSelectionModel(void) const {return true;} std::vector getDisplayModes(void) const; void setDisplayMode(const char* ModeName);