From 7c400f114d83d427ea258817778097943c293da3 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 12 Apr 2022 10:16:54 +0200 Subject: [PATCH] FEM: use an SoJackManip for ViewProviderFemPostPlaneFunction --- .../Fem/Gui/ViewProviderFemPostFunction.cpp | 56 +++++++++++++------ src/Mod/Fem/Gui/ViewProviderFemPostFunction.h | 4 ++ 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp index 97d595dc80..fef67ee42a 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp @@ -26,8 +26,10 @@ # include # include # include +# include # include # include +# include # include # include # include @@ -355,9 +357,12 @@ void ViewProviderFemPostFunction::onChanged(const App::Property* prop) { // *************************************************************************** PROPERTY_SOURCE(FemGui::ViewProviderFemPostPlaneFunction, FemGui::ViewProviderFemPostFunction) +static const App::PropertyFloatConstraint::Constraints scaleConstraint = {1.0e-6, 1.0e6, 1.0}; ViewProviderFemPostPlaneFunction::ViewProviderFemPostPlaneFunction() { + ADD_PROPERTY_TYPE(Scale, (1.0), "Manipulator", App::Prop_None, "Scaling factor for the manipulator"); + Scale.setConstraints(&scaleConstraint); sPixmap = "fem-post-geo-plane"; setAutoScale(true); @@ -382,21 +387,35 @@ ViewProviderFemPostPlaneFunction::~ViewProviderFemPostPlaneFunction() { void ViewProviderFemPostPlaneFunction::draggerUpdate(SoDragger* m) { Fem::FemPostPlaneFunction* func = static_cast(getObject()); - SoCenterballDragger* dragger = static_cast(m); + SoJackDragger* dragger = static_cast(m); // the new axis of the plane - SbRotation rot, scaleDir; - const SbVec3f& center = dragger->center.getValue(); + const SbVec3f& base = dragger->translation.getValue(); + const SbVec3f& scale = dragger->scaleFactor.getValue(); - SbVec3f norm(0, 0, 1); + SbVec3f norm(0., 1., 0.); dragger->rotation.getValue().multVec(norm, norm); - func->Origin.setValue(center[0], center[1], center[2]); + func->Origin.setValue(base[0], base[1], base[2]); func->Normal.setValue(norm[0], norm[1], norm[2]); + this->Scale.setValue(scale[0]); +} - SbVec3f t = static_cast(getManipulator())->translation.getValue(); - SbVec3f rt, irt; - dragger->rotation.getValue().multVec(t, rt); - dragger->rotation.getValue().inverse().multVec(t, irt); +void ViewProviderFemPostPlaneFunction::onChanged(const App::Property* prop) +{ + if (!isDragging() && prop == &Scale) { + // get current matrix + SbVec3f t, s; + SbRotation r, so; + SbMatrix matrix = getManipulator()->getDragger()->getMotionMatrix(); + matrix.getTransform(t, r, s, so); + + float scale = static_cast(Scale.getValue()); + s.setValue(scale, scale, scale); + + matrix.setTransform(t, r, s, so); + getManipulator()->setMatrix(matrix); + } + ViewProviderFemPostFunction::onChanged(prop); } void ViewProviderFemPostPlaneFunction::updateData(const App::Property* p) { @@ -408,19 +427,24 @@ void ViewProviderFemPostPlaneFunction::updateData(const App::Property* p) { Base::Vector3d trans = func->Origin.getValue(); Base::Vector3d norm = func->Normal.getValue(); - norm = norm / norm.Length(); - SbRotation rot(SbVec3f(0., 0., 1.), SbVec3f(norm.x, norm.y, norm.z)); + norm.Normalize(); + SbRotation rot(SbVec3f(0., 1., 0.), SbVec3f(norm.x, norm.y, norm.z)); + float scale = static_cast(Scale.getValue()); - SbMatrix t, translate; - t.setRotate(rot); - translate.setTranslate(SbVec3f(trans.x, trans.y, trans.z)); - t.multRight(translate); - getManipulator()->setMatrix(t); + SbMatrix mat; + mat.setTransform(SbVec3f(trans.x, trans.y, trans.z), rot, SbVec3f(scale, scale, scale)); + getManipulator()->setMatrix(mat); } Gui::ViewProviderDocumentObject::updateData(p); } +SoTransformManip* ViewProviderFemPostPlaneFunction::setupManipulator() +{ + return new SoJackManip; +} + + FunctionWidget* ViewProviderFemPostPlaneFunction::createControlWidget() { return new PlaneWidget(); } diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h index 6444b9427c..760105884a 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h @@ -176,11 +176,15 @@ public: ViewProviderFemPostPlaneFunction(); virtual ~ViewProviderFemPostPlaneFunction(); + App::PropertyFloatConstraint Scale; + + virtual SoTransformManip* setupManipulator(); virtual FunctionWidget* createControlWidget(); protected: virtual void draggerUpdate(SoDragger* mat); virtual void updateData(const App::Property*); + virtual void onChanged(const App::Property*); };