MeasureGui: Optionally show delta components in VPMeasureDistance
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user