diff --git a/src/Mod/Fem/App/FemConstraintRigidBody.cpp b/src/Mod/Fem/App/FemConstraintRigidBody.cpp index cb57e9cdca..8a10cf1315 100644 --- a/src/Mod/Fem/App/FemConstraintRigidBody.cpp +++ b/src/Mod/Fem/App/FemConstraintRigidBody.cpp @@ -29,38 +29,92 @@ using namespace Fem; PROPERTY_SOURCE(Fem::ConstraintRigidBody, Fem::Constraint) +const char* ConstraintRigidBody::boundaryModeEnum[] = {"Free", "Constraint", "Load", nullptr}; + ConstraintRigidBody::ConstraintRigidBody() { - ADD_PROPERTY(xRefNode, (0.0)); - ADD_PROPERTY(yRefNode, (0.0)); - ADD_PROPERTY(zRefNode, (0.0)); - ADD_PROPERTY(xDisplacement, (0.0)); - ADD_PROPERTY(yDisplacement, (0.0)); - ADD_PROPERTY(zDisplacement, (0.0)); - ADD_PROPERTY(xRotation, (0.0)); - ADD_PROPERTY(yRotation, (0.0)); - ADD_PROPERTY(zRotation, (0.0)); - ADD_PROPERTY(xForce, (0.0)); - ADD_PROPERTY(yForce, (0.0)); - ADD_PROPERTY(zForce, (0.0)); - ADD_PROPERTY(xMoment, (0.0)); - ADD_PROPERTY(yMoment, (0.0)); - ADD_PROPERTY(zMoment, (0.0)); - ADD_PROPERTY(DefineRefNode, (1)); + ADD_PROPERTY_TYPE(ReferenceNode, + (0.0, 0.0, 0.0), + "ConstraintRigidBody", + App::Prop_Output, + "Reference node position"); + ADD_PROPERTY_TYPE(Displacement, + (0.0, 0.0, 0.0), + "ConstraintRigidBody", + App::Prop_Output, + "Reference node displacement"); + ADD_PROPERTY_TYPE(Rotation, + (Base::Rotation(0.0, 0.0, 0.0, 1.0)), + "ConstraintRigidBody", + App::Prop_Output, + "Reference node rotation"); + ADD_PROPERTY_TYPE(ForceX, + (0.0), + "ConstraintRigidBody", + App::Prop_Output, + "Applied force in X direction"); + ADD_PROPERTY_TYPE(ForceY, + (0.0), + "ConstraintRigidBody", + App::Prop_Output, + "Applied force in Y direction"); + ADD_PROPERTY_TYPE(ForceZ, + (0.0), + "ConstraintRigidBody", + App::Prop_Output, + "Applied force in Z direction"); + ADD_PROPERTY_TYPE(MomentX, + (0.0), + "ConstraintRigidBody", + App::Prop_Output, + "Applied moment in X direction"); + ADD_PROPERTY_TYPE(MomentY, + (0.0), + "ConstraintRigidBody", + App::Prop_Output, + "Applied moment in Y direction"); + ADD_PROPERTY_TYPE(MomentZ, + (0.0), + "ConstraintRigidBody", + App::Prop_Output, + "Applied moment in Z direction"); + ADD_PROPERTY_TYPE(TranslationalModeX, + ("Free"), + "ConstraintRigidBody", + App::Prop_Output, + "X-direction displacement/force mode"); + ADD_PROPERTY_TYPE(TranslationalModeY, + ("Free"), + "ConstraintRigidBody", + App::Prop_Output, + "Y-direction displacement/force mode"); + ADD_PROPERTY_TYPE(TranslationalModeZ, + ("Free"), + "ConstraintRigidBody", + App::Prop_Output, + "Z-direction displacement/force mode"); + ADD_PROPERTY_TYPE(RotationalModeX, + ("None"), + "ConstraintRigidBody", + App::Prop_Output, + "X-direction rotation/moment mode"); + ADD_PROPERTY_TYPE(RotationalModeY, + ("None"), + "ConstraintRigidBody", + App::Prop_Output, + "Y-direction rotation/moment mode"); + ADD_PROPERTY_TYPE(RotationalModeZ, + ("None"), + "ConstraintRigidBody", + App::Prop_Output, + "Z-direction rotation/moment mode"); - // For drawing the icons - ADD_PROPERTY_TYPE(Points, - (Base::Vector3d()), - "ConstraintRigidBody", - App::PropertyType(App::Prop_ReadOnly | App::Prop_Output), - "Points where symbols are drawn"); - ADD_PROPERTY_TYPE(Normals, - (Base::Vector3d()), - "ConstraintRigidBody", - App::PropertyType(App::Prop_ReadOnly | App::Prop_Output), - "Normals where symbols are drawn"); - Points.setValues(std::vector()); - Normals.setValues(std::vector()); + TranslationalModeX.setEnums(boundaryModeEnum); + TranslationalModeY.setEnums(boundaryModeEnum); + TranslationalModeZ.setEnums(boundaryModeEnum); + RotationalModeX.setEnums(boundaryModeEnum); + RotationalModeY.setEnums(boundaryModeEnum); + RotationalModeZ.setEnums(boundaryModeEnum); } App::DocumentObjectExecReturn* ConstraintRigidBody::execute() @@ -70,19 +124,5 @@ App::DocumentObjectExecReturn* ConstraintRigidBody::execute() void ConstraintRigidBody::onChanged(const App::Property* prop) { - // Note: If we call this at the end, then the symbols are not oriented correctly initially - // because the NormalDirection has not been calculated yet Constraint::onChanged(prop); - - if (prop == &References) { - std::vector points; - std::vector normals; - double scale = 1; // OvG: Enforce use of scale - if (getPoints(points, normals, &scale)) { - Points.setValues(points); - Normals.setValues(normals); - Scale.setValue(scale); // OvG: Scale - Points.touch(); // This triggers ViewProvider::updateData() - } - } } diff --git a/src/Mod/Fem/App/FemConstraintRigidBody.h b/src/Mod/Fem/App/FemConstraintRigidBody.h index 73b15ca90a..28ff18229a 100644 --- a/src/Mod/Fem/App/FemConstraintRigidBody.h +++ b/src/Mod/Fem/App/FemConstraintRigidBody.h @@ -37,27 +37,22 @@ public: /// Constructor ConstraintRigidBody(); - // Read-only (calculated values). These trigger changes in the ViewProvider - App::PropertyVectorList Points; - App::PropertyVectorList Normals; - // Rigid Body parameters - App::PropertyFloat xRefNode; - App::PropertyFloat yRefNode; - App::PropertyFloat zRefNode; - App::PropertyFloat xDisplacement; - App::PropertyFloat yDisplacement; - App::PropertyFloat zDisplacement; - App::PropertyFloat xRotation; - App::PropertyFloat yRotation; - App::PropertyFloat zRotation; - App::PropertyFloat xForce; - App::PropertyFloat yForce; - App::PropertyFloat zForce; - App::PropertyFloat xMoment; - App::PropertyFloat yMoment; - App::PropertyFloat zMoment; - App::PropertyBool DefineRefNode; + App::PropertyPosition ReferenceNode; + App::PropertyPosition Displacement; + App::PropertyRotation Rotation; + App::PropertyForce ForceX; + App::PropertyForce ForceY; + App::PropertyForce ForceZ; + App::PropertyMoment MomentX; + App::PropertyMoment MomentY; + App::PropertyMoment MomentZ; + App::PropertyEnumeration TranslationalModeX; + App::PropertyEnumeration TranslationalModeY; + App::PropertyEnumeration TranslationalModeZ; + App::PropertyEnumeration RotationalModeX; + App::PropertyEnumeration RotationalModeY; + App::PropertyEnumeration RotationalModeZ; /// recalculate the object App::DocumentObjectExecReturn* execute() override; @@ -70,6 +65,9 @@ public: protected: void onChanged(const App::Property* prop) override; + +private: + static const char* boundaryModeEnum[]; }; } // namespace Fem