Fem: Change properties of the rigid body constraint

This commit is contained in:
marioalexis
2024-05-08 10:10:52 -03:00
committed by Chris Hennes
parent 505579dd8d
commit b799b390b9
2 changed files with 101 additions and 63 deletions

View File

@@ -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<Base::Vector3d>());
Normals.setValues(std::vector<Base::Vector3d>());
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<Base::Vector3d> points;
std::vector<Base::Vector3d> 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()
}
}
}

View File

@@ -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