MeasureGui: Optionally show delta components in VPMeasureDistance

This commit is contained in:
hlorus
2024-06-28 13:41:16 +02:00
committed by Chris Hennes
parent e396f0c9c8
commit a1316567d2
2 changed files with 99 additions and 5 deletions

View File

@@ -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<App::PropertyDistance*>(pcObject->getPropertyByName("Distance"));
setLabelValue(propDistance->getQuantityValue().getUserString());
// Set delta distance
auto propDistanceX = static_cast<App::PropertyDistance*>(getMeasureObject()->getPropertyByName("DistanceX"));
static_cast<DimensionLinear*>(pDeltaDimensionSwitch->getChild(0))->text.setValue(propDistanceX->getQuantityValue().getUserString().toUtf8());
auto propDistanceY = static_cast<App::PropertyDistance*>(getMeasureObject()->getPropertyByName("DistanceY"));
static_cast<DimensionLinear*>(pDeltaDimensionSwitch->getChild(1))->text.setValue(propDistanceY->getQuantityValue().getUserString().toUtf8());
auto propDistanceZ = static_cast<App::PropertyDistance*>(getMeasureObject()->getPropertyByName("DistanceZ"));
static_cast<DimensionLinear*>(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<DimensionLinear*>(pDeltaDimensionSwitch->getChild(0))->fontSize.setValue(FontSize.getValue());
static_cast<DimensionLinear*>(pDeltaDimensionSwitch->getChild(1))->fontSize.setValue(FontSize.getValue());
static_cast<DimensionLinear*>(pDeltaDimensionSwitch->getChild(2))->fontSize.setValue(FontSize.getValue());
}
ViewProviderMeasureBase::onChanged(prop);
}
void ViewProviderMeasureDistance::positionAnno(const Measure::MeasureBase* measureObject) {
(void)measureObject;