PairInteractionConstraint.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_PAIRINTERACTIONCONSTRAINT_H
00028 #define SOFA_CORE_COMPONENTMODEL_BEHAVIOR_PAIRINTERACTIONCONSTRAINT_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 TDataTypes>
00052 class PairInteractionConstraint : public InteractionConstraint
00053 {
00054 public:
00055 typedef TDataTypes DataTypes;
00056 typedef typename DataTypes::VecCoord VecCoord;
00057 typedef typename DataTypes::VecDeriv VecDeriv;
00058 typedef typename DataTypes::VecConst VecConst;
00059 typedef typename DataTypes::Coord Coord;
00060 typedef typename DataTypes::Deriv Deriv;
00061 typedef typename DataTypes::Real Real;
00062
00063 PairInteractionConstraint(MechanicalState<DataTypes> *mm1 = NULL, MechanicalState<DataTypes> *mm2 = NULL);
00064
00065 virtual ~PairInteractionConstraint();
00066
00067 Data<double> endTime;
00068 virtual bool isActive() const;
00069
00070 virtual void init();
00071
00073 MechanicalState<DataTypes>* getMState1() { return mstate1; }
00074 BaseMechanicalState* getMechModel1() { return mstate1; }
00076 MechanicalState<DataTypes>* getMState2() { return mstate2; }
00077 BaseMechanicalState* getMechModel2() { return mstate2; }
00078
00081
00087 virtual void projectResponse();
00088
00094 virtual void projectVelocity();
00095
00101 virtual void projectPosition();
00102
00108 virtual void projectFreeVelocity();
00109
00115 virtual void projectFreePosition();
00116
00121 virtual void projectResponse(VecDeriv& dx1, VecDeriv& dx2) = 0;
00122
00127 virtual void projectVelocity(VecDeriv& v1, VecDeriv& v2) = 0;
00128
00133 virtual void projectPosition(VecCoord& x1, VecCoord& x2) = 0;
00134
00136
00138 virtual void applyConstraint(unsigned int & contactId);
00139
00140 virtual void applyConstraint(VecConst& , VecConst& , unsigned int & ){}
00141
00144 template<class T>
00145 static bool canCreate(T*& obj, objectmodel::BaseContext* context, objectmodel::BaseObjectDescription* arg)
00146 {
00147 if (arg->getAttribute("object1") || arg->getAttribute("object2"))
00148 {
00149 if (dynamic_cast<MechanicalState<DataTypes>*>(arg->findObject(arg->getAttribute("object1",".."))) == NULL)
00150 return false;
00151 if (dynamic_cast<MechanicalState<DataTypes>*>(arg->findObject(arg->getAttribute("object2",".."))) == NULL)
00152 return false;
00153 }
00154 else
00155 {
00156 if (dynamic_cast<MechanicalState<DataTypes>*>(context->getMechanicalState()) == 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<DataTypes>*>(arg->findObject(arg->getAttribute("object1","..")));
00170 obj->mstate2 = dynamic_cast<MechanicalState<DataTypes>*>(arg->findObject(arg->getAttribute("object2","..")));
00171 }
00172 else if (context)
00173 {
00174 obj->mstate1 =
00175 obj->mstate2 =
00176 dynamic_cast<MechanicalState<DataTypes>*>(context->getMechanicalState());
00177 }
00178 }
00179
00180 virtual std::string getTemplateName() const
00181 {
00182 return templateName(this);
00183 }
00184
00185 static std::string templateName(const PairInteractionConstraint<DataTypes>* = NULL)
00186 {
00187 return DataTypes::Name();
00188 }
00189
00190 protected:
00191 Data< std::string > object1;
00192 Data< std::string > object2;
00193 MechanicalState<DataTypes> *mstate1;
00194 MechanicalState<DataTypes> *mstate2;
00195 };
00196
00197 }
00198
00199 }
00200
00201 }
00202
00203 }
00204
00205 #endif