From a9adc5c24b64731bd127721fa3b4f666f5012b3c Mon Sep 17 00:00:00 2001 From: hlorus <64740362+hlorus@users.noreply.github.com> Date: Fri, 28 Jun 2024 13:41:16 +0200 Subject: [PATCH] MeasureGui: Optionally show delta components in VPMeasureDistance --- .../Gui/ViewProviderMeasureDistance.cpp | 90 ++++++++++++++++++- .../Measure/Gui/ViewProviderMeasureDistance.h | 14 ++- 2 files changed, 99 insertions(+), 5 deletions(-) diff --git a/src/Mod/Measure/Gui/ViewProviderMeasureDistance.cpp b/src/Mod/Measure/Gui/ViewProviderMeasureDistance.cpp index fb0ed075c2..f9d660383c 100644 --- a/src/Mod/Measure/Gui/ViewProviderMeasureDistance.cpp +++ b/src/Mod/Measure/Gui/ViewProviderMeasureDistance.cpp @@ -294,6 +294,8 @@ ViewProviderMeasureDistance::ViewProviderMeasureDistance() { sPixmap = "Measurement-Distance"; + ADD_PROPERTY_TYPE(ShowDelta, (false), "Appearance", App::Prop_None, "Display the X, Y and Z components of the distance"); + // vert indexes used to create the annotation lines const size_t lineCount(3); static const int32_t lines[lineCount] = @@ -328,10 +330,10 @@ ViewProviderMeasureDistance::ViewProviderMeasureDistance() engineCat->input[3]->connectFrom(&engineCoords->oD); engineCat->input[4]->connectFrom(&pLabelTranslation->translation); - pCoords->point.connectFrom(engineCat->output); + pCoords->point.connectFrom(engineCat->output); pCoords->point.setNum(engineCat->output->getNumConnections()); - pLines = new SoIndexedLineSet(); + pLines = new SoIndexedLineSet(); pLines->ref(); pLines->coordIndex.setNum(lineCount); pLines->coordIndex.setValues(0, lineCount, lines); @@ -353,12 +355,70 @@ ViewProviderMeasureDistance::ViewProviderMeasureDistance() ViewParams::instance()->getMarkerSize()); points->numPoints=2; pLineSeparator->addChild(points); + + + // Delta Dimensions + auto decomposedPosition1 = new SoDecomposeVec3f(); + decomposedPosition1->vector.connectFrom(&fieldPosition1); + auto decomposedPosition2 = new SoDecomposeVec3f(); + decomposedPosition2->vector.connectFrom(&fieldPosition2); + + // Create intermediate points + auto composeVecDelta1 = new SoComposeVec3f(); + composeVecDelta1->x.connectFrom(&decomposedPosition2->x); + composeVecDelta1->y.connectFrom(&decomposedPosition1->y); + composeVecDelta1->z.connectFrom(&decomposedPosition1->z); + + auto composeVecDelta2 = new SoComposeVec3f(); + composeVecDelta2->x.connectFrom(&decomposedPosition2->x); + composeVecDelta2->y.connectFrom(&decomposedPosition2->y); + composeVecDelta2->z.connectFrom(&decomposedPosition1->z); + + // Set axis colors + SbColor colorX; + SbColor colorY; + SbColor colorZ; + + float t = 0.0f; + colorX.setPackedValue(ViewParams::instance()->getAxisXColor(), t); + colorY.setPackedValue(ViewParams::instance()->getAxisYColor(), t); + colorZ.setPackedValue(ViewParams::instance()->getAxisZColor(), t); + + auto dimDeltaX = new MeasureGui::DimensionLinear(); + dimDeltaX->point1.connectFrom(&fieldPosition1); + dimDeltaX->point2.connectFrom(&composeVecDelta1->vector); + dimDeltaX->setupDimension(); + dimDeltaX->dColor.setValue(colorX); + + auto dimDeltaY = new MeasureGui::DimensionLinear(); + dimDeltaY->point1.connectFrom(&composeVecDelta1->vector); + dimDeltaY->point2.connectFrom(&composeVecDelta2->vector); + dimDeltaY->setupDimension(); + dimDeltaY->dColor.setValue(colorY); + + auto dimDeltaZ = new MeasureGui::DimensionLinear(); + dimDeltaZ->point2.connectFrom(&composeVecDelta2->vector); + dimDeltaZ->point1.connectFrom(&fieldPosition2); + dimDeltaZ->setupDimension(); + dimDeltaZ->dColor.setValue(colorZ); + + pDeltaDimensionSwitch = new SoSwitch(); + pDeltaDimensionSwitch->ref(); + pGlobalSeparator->addChild(pDeltaDimensionSwitch); + + pDeltaDimensionSwitch->addChild(dimDeltaX); + pDeltaDimensionSwitch->addChild(dimDeltaY); + pDeltaDimensionSwitch->addChild(dimDeltaZ); + + // This should alredy be touched in ViewProviderMeasureBase + FontSize.touch(); } ViewProviderMeasureDistance::~ViewProviderMeasureDistance() { pCoords->unref(); pLines->unref(); + pDeltaDimensionSwitch->unref(); } @@ -379,12 +439,25 @@ void ViewProviderMeasureDistance::redrawAnnotation() auto vec1 = prop1->getValue(); auto vec2 = prop2->getValue(); + fieldPosition1.setValue(SbVec3f(vec1.x, vec1.y, vec1.z)); + fieldPosition2.setValue(SbVec3f(vec2.x, vec2.y, vec2.z)); + // Set the distance fieldDistance = (vec2 - vec1).Length(); auto propDistance = dynamic_cast(pcObject->getPropertyByName("Distance")); setLabelValue(propDistance->getQuantityValue().getUserString()); + // Set delta distance + auto propDistanceX = static_cast(getMeasureObject()->getPropertyByName("DistanceX")); + static_cast(pDeltaDimensionSwitch->getChild(0))->text.setValue(propDistanceX->getQuantityValue().getUserString().toUtf8()); + + auto propDistanceY = static_cast(getMeasureObject()->getPropertyByName("DistanceY")); + static_cast(pDeltaDimensionSwitch->getChild(1))->text.setValue(propDistanceY->getQuantityValue().getUserString().toUtf8()); + + auto propDistanceZ = static_cast(getMeasureObject()->getPropertyByName("DistanceZ")); + static_cast(pDeltaDimensionSwitch->getChild(2))->text.setValue(propDistanceZ->getQuantityValue().getUserString().toUtf8()); + // Set matrix SbMatrix matrix = getMatrix(); pcTransform->setMatrix(matrix); @@ -393,6 +466,19 @@ void ViewProviderMeasureDistance::redrawAnnotation() updateView(); } +void ViewProviderMeasureDistance::onChanged(const App::Property* prop) { + + if (prop == &ShowDelta) { + pDeltaDimensionSwitch->whichChild.setValue(ShowDelta.getValue() ? SO_SWITCH_ALL : SO_SWITCH_NONE); + } else if (prop == &FontSize) { + static_cast(pDeltaDimensionSwitch->getChild(0))->fontSize.setValue(FontSize.getValue()); + static_cast(pDeltaDimensionSwitch->getChild(1))->fontSize.setValue(FontSize.getValue()); + static_cast(pDeltaDimensionSwitch->getChild(2))->fontSize.setValue(FontSize.getValue()); + } + + ViewProviderMeasureBase::onChanged(prop); +} + void ViewProviderMeasureDistance::positionAnno(const Measure::MeasureBase* measureObject) { (void)measureObject; diff --git a/src/Mod/Measure/Gui/ViewProviderMeasureDistance.h b/src/Mod/Measure/Gui/ViewProviderMeasureDistance.h index 51eeb14344..6764b3f3ed 100644 --- a/src/Mod/Measure/Gui/ViewProviderMeasureDistance.h +++ b/src/Mod/Measure/Gui/ViewProviderMeasureDistance.h @@ -91,17 +91,25 @@ public: ViewProviderMeasureDistance(); ~ViewProviderMeasureDistance() override; + App::PropertyBool ShowDelta; + void redrawAnnotation() override; void positionAnno(const Measure::MeasureBase* measureObject) override; protected: Base::Vector3d getTextDirection(Base::Vector3d elementDirection, double tolerance = defaultTolerance) override; + void onChanged(const App::Property* prop) override; private: - SoCoordinate3 * pCoords; - SoIndexedLineSet * pLines; + SoCoordinate3* pCoords; + SoIndexedLineSet* pLines; + SoSwitch* pDeltaDimensionSwitch; + + SoSFVec3f fieldPosition1; + SoSFVec3f fieldPosition2; + + SoSFFloat fieldDistance; - SoSFFloat fieldDistance; SbMatrix getMatrix(); };