MixedInteractionConstraint.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef SOFA_CORE_COMPONENTMODEL_BEHAVIOR_MIXEDINTERACTIONCONSTRAINT_H
00028 #define SOFA_CORE_COMPONENTMODEL_BEHAVIOR_MIXEDINTERACTIONCONSTRAINT_H
00029
00030 #include <sofa/core/componentmodel/behavior/InteractionConstraint.h>
00031 #include <sofa/core/componentmodel/behavior/MechanicalState.h>
00032
00033 namespace sofa
00034 {
00035
00036 namespace core
00037 {
00038
00039 namespace componentmodel
00040 {
00041
00042 namespace behavior
00043 {
00044
00051 template<class TDataTypes1, class TDataTypes2>
00052 class MixedInteractionConstraint : public InteractionConstraint
00053 {
00054 public:
00055 typedef TDataTypes1 DataTypes1;
00056 typedef typename DataTypes1::VecCoord VecCoord1;
00057 typedef typename DataTypes1::VecDeriv VecDeriv1;
00058 typedef typename DataTypes1::VecConst VecConst1;
00059 typedef typename DataTypes1::Coord Coord1;
00060 typedef typename DataTypes1::Deriv Deriv1;
00061 typedef TDataTypes2 DataTypes2;
00062 typedef typename DataTypes2::VecCoord VecCoord2;
00063 typedef typename DataTypes2::VecDeriv VecDeriv2;
00064 typedef typename DataTypes2::VecConst VecConst2;
00065 typedef typename DataTypes2::Coord Coord2;
00066 typedef typename DataTypes2::Deriv Deriv2;
00067
00068 MixedInteractionConstraint(MechanicalState<DataTypes1> *mm1 = NULL, MechanicalState<DataTypes2> *mm2 = NULL);
00069
00070 virtual ~MixedInteractionConstraint();
00071
00072 Data<double> endTime;
00073 virtual bool isActive() const;
00074
00075 virtual void init();
00076
00078 MechanicalState<DataTypes1>* getMState1() { return mstate1; }
00079 BaseMechanicalState* getMechModel1() { return mstate1; }
00081 MechanicalState<DataTypes2>* getMState2() { return mstate2; }
00082 BaseMechanicalState* getMechModel2() { return mstate2; }
00083
00086
00092 virtual void projectResponse();
00093
00099 virtual void projectVelocity();
00100
00106 virtual void projectPosition();
00107
00113 virtual void projectFreeVelocity();
00114
00120 virtual void projectFreePosition();
00121
00126 virtual void projectResponse(VecDeriv1& dx1, VecDeriv2& dx2) = 0;
00127
00132 virtual void projectVelocity(VecDeriv1& v1, VecDeriv2& v2) = 0;
00133
00138 virtual void projectPosition(VecCoord1& x1, VecCoord2& x2) = 0;
00139
00141
00143 virtual void applyConstraint(unsigned int & contactId);
00144
00145 virtual void applyConstraint(VecConst1& , VecConst2& , unsigned int & ){}
00146
00149 template<class T>
00150 static bool canCreate(T*& obj, objectmodel::BaseContext* context, objectmodel::BaseObjectDescription* arg)
00151 {
00152 if (arg->getAttribute("object1") || arg->getAttribute("object2"))
00153 {
00154 if (dynamic_cast<MechanicalState<DataTypes1>*>(arg->findObject(arg->getAttribute("object1",".."))) == NULL)
00155 return false;
00156 if (dynamic_cast<MechanicalState<DataTypes2>*>(arg->findObject(arg->getAttribute("object2",".."))) == NULL)
00157 return false;
00158 }
00159 return InteractionConstraint::canCreate(obj, context, arg);
00160 }
00161
00163 template<class T>
00164 static void create(T*& obj, core::objectmodel::BaseContext* context, core::objectmodel::BaseObjectDescription* arg)
00165 {
00166 core::componentmodel::behavior::InteractionConstraint::create(obj, context, arg);
00167 if (arg && (arg->getAttribute("object1") || arg->getAttribute("object2")))
00168 {
00169 obj->mstate1 = dynamic_cast<MechanicalState<DataTypes1>*>(arg->findObject(arg->getAttribute("object1","..")));
00170 obj->mstate2 = dynamic_cast<MechanicalState<DataTypes2>*>(arg->findObject(arg->getAttribute("object2","..")));
00171 }
00172 }
00173
00174 virtual std::string getTemplateName() const
00175 {
00176 return templateName(this);
00177 }
00178
00179 static std::string templateName(const MixedInteractionConstraint<DataTypes1,DataTypes2>* = NULL)
00180 {
00181 return DataTypes1::Name();
00182 }
00183
00184 protected:
00185 Data< std::string > object1;
00186 Data< std::string > object2;
00187 MechanicalState<DataTypes1> *mstate1;
00188 MechanicalState<DataTypes2> *mstate2;
00189 };
00190
00191 }
00192
00193 }
00194
00195 }
00196
00197 }
00198
00199 #endif