diff --git a/Sofa/Component/Constraint/Projective/tests/FixedPlaneProjectiveConstraint_test.cpp b/Sofa/Component/Constraint/Projective/tests/FixedPlaneProjectiveConstraint_test.cpp index c1445042c5d..5e5510938e9 100644 --- a/Sofa/Component/Constraint/Projective/tests/FixedPlaneProjectiveConstraint_test.cpp +++ b/Sofa/Component/Constraint/Projective/tests/FixedPlaneProjectiveConstraint_test.cpp @@ -42,7 +42,9 @@ using namespace core::objectmodel; template void createUniformMass(simulation::Node::SPtr node, component::statecontainer::MechanicalObject& /*dofs*/) { - node->addObject(New >()); + typename component::mass::UniformMass::SPtr uniformMass = New >(); + uniformMass->d_totalMass.setValue(1.0); + node->addObject(uniformMass); } template diff --git a/Sofa/Component/Constraint/Projective/tests/FixedProjectiveConstraint_test.cpp b/Sofa/Component/Constraint/Projective/tests/FixedProjectiveConstraint_test.cpp index 14a43f5a67e..8267b022412 100644 --- a/Sofa/Component/Constraint/Projective/tests/FixedProjectiveConstraint_test.cpp +++ b/Sofa/Component/Constraint/Projective/tests/FixedProjectiveConstraint_test.cpp @@ -45,7 +45,9 @@ using core::objectmodel::New; template void createUniformMass(simulation::Node::SPtr node, component::statecontainer::MechanicalObject& /*dofs*/) { - node->addObject(New >()); + typename component::mass::UniformMass::SPtr uniformMass = New >(); + uniformMass->d_totalMass.setValue(1.0); + node->addObject(uniformMass); } template diff --git a/Sofa/Component/Constraint/Projective/tests/PartialFixedProjectiveConstraint_test.cpp b/Sofa/Component/Constraint/Projective/tests/PartialFixedProjectiveConstraint_test.cpp index 3ca05c51679..f91407fbbe9 100644 --- a/Sofa/Component/Constraint/Projective/tests/PartialFixedProjectiveConstraint_test.cpp +++ b/Sofa/Component/Constraint/Projective/tests/PartialFixedProjectiveConstraint_test.cpp @@ -41,7 +41,9 @@ using namespace core::objectmodel; template void createUniformMass(simulation::Node::SPtr node, component::statecontainer::MechanicalObject& /*dofs*/) { - node->addObject(New >()); + typename component::mass::UniformMass::SPtr uniformMass = New >(); + uniformMass->d_totalMass.setValue(1.0); + node->addObject(uniformMass); } template diff --git a/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp b/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp index 1e3db25c26e..6dd556f57b6 100644 --- a/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp +++ b/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp @@ -98,7 +98,7 @@ TEST(SparseLDLSolver, TopologyChangeEmptyMState) sofa::simpleapi::createObject(root, "PointSetTopologyContainer", {{"position", "0 0 0"}}); sofa::simpleapi::createObject(root, "PointSetTopologyModifier"); sofa::simpleapi::createObject(root, "MechanicalObject", {{"template", "Vec3"}}); - sofa::simpleapi::createObject(root, "UniformMass"); + sofa::simpleapi::createObject(root, "UniformMass", {{"totalMass", "1.0"}}); sofa::simpleapi::createObject(root, "TopologicalChangeProcessor", {{"useDataInputs", "true"}, {"timeToRemove", "0.05"}, {"pointsToRemove", "0"}}); diff --git a/Sofa/Component/Mass/src/sofa/component/mass/UniformMass.h b/Sofa/Component/Mass/src/sofa/component/mass/UniformMass.h index 6b0e22a0e8d..bd68a8ada3f 100644 --- a/Sofa/Component/Mass/src/sofa/component/mass/UniformMass.h +++ b/Sofa/Component/Mass/src/sofa/component/mass/UniformMass.h @@ -63,12 +63,11 @@ class UniformMass : public core::behavior::Mass Data d_totalMass; ///< if >0 : total mass of this body sofa::core::objectmodel::DataFileName d_filenameMass; ///< a .rigid file to automatically load the inertia matrix and other parameters + /// Visualization-related data Data d_showCenterOfGravity; ///< display the center of gravity of the system Data d_showAxisSize; ///< factor length of the axis displayed (only used for rigids) - Data d_computeMappingInertia; ///< to be used if the mass is placed under a mapping Data d_showInitialCenterOfGravity; ///< display the initial center of gravity of the system - Data d_showX0; ///< display the rest positions /// optional range of local DOF indices. Any computation involving only @@ -78,6 +77,14 @@ class UniformMass : public core::behavior::Mass DataSetIndex d_indices; ///< optional local DOF indices. Any computation involving only indices outside of this list are discarded Data d_preserveTotalMass; ///< Prevent totalMass from decreasing when removing particles. + /// Enumeration specifying which data was used for initialization + enum class InitMethod + { + TOTALMASS, + VERTEXMASS + }; + InitMethod m_initMethod; + ////////////////////////// Inherited attributes //////////////////////////// /// https://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html /// Bring inherited attributes and function in the current lookup context. @@ -87,6 +94,7 @@ class UniformMass : public core::behavior::Mass using core::objectmodel::BaseObject::getContext; //////////////////////////////////////////////////////////////////////////// + /// Link to be set to the topology container in the component graph. SingleLink , sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; @@ -115,10 +123,8 @@ class UniformMass : public core::behavior::Mass void loadRigidMass(const std::string& filename); - void reinit() override; void init() override; void initDefaultImpl() ; - void doUpdateInternal() override; /// @name Check and standard initialization functions from mass information /// @{ @@ -126,10 +132,13 @@ class UniformMass : public core::behavior::Mass virtual void initFromVertexMass(); virtual bool checkTotalMass(); - virtual void checkTotalMassInit(); virtual void initFromTotalMass(); /// @} + /// Functions updating data + sofa::core::objectmodel::ComponentState updateFromTotalMass(); + sofa::core::objectmodel::ComponentState updateFromVertexMass(); + void addMDx(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecDeriv& dx, SReal factor) override; void accFromF(const core::MechanicalParams* mparams, DataVecDeriv& a, const DataVecDeriv& f) override; void addForce(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v) override; diff --git a/Sofa/Component/Mass/src/sofa/component/mass/UniformMass.inl b/Sofa/Component/Mass/src/sofa/component/mass/UniformMass.inl index f94c2381f6c..3b400886ad7 100644 --- a/Sofa/Component/Mass/src/sofa/component/mass/UniformMass.inl +++ b/Sofa/Component/Mass/src/sofa/component/mass/UniformMass.inl @@ -78,6 +78,36 @@ UniformMass::UniformMass() , l_topology(initLink("topology", "link to the topology container")) { constructor_message(); + + + sofa::core::objectmodel::Base::addUpdateCallback("updateFromTotalMass", {&d_totalMass}, [this](const core::DataTracker& ) + { + if(m_initMethod == InitMethod::TOTALMASS) + { + msg_info() << "dataInternalUpdate: data totalMass has changed"; + return updateFromTotalMass(); + } + else if(m_initMethod == InitMethod::VERTEXMASS) + { + msg_info() << "vertexMass data is initially used, the callback associated with the totalMass is skipped"; + return updateFromVertexMass(); + } + }, {}); + + + sofa::core::objectmodel::Base::addUpdateCallback("updateFromVertexMass", {&d_vertexMass}, [this](const core::DataTracker& ) + { + if(m_initMethod == InitMethod::VERTEXMASS) + { + msg_info() << "dataInternalUpdate: data vertexMass has changed"; + return updateFromVertexMass(); + } + else if(m_initMethod == InitMethod::TOTALMASS) + { + msg_info() << "totalMass data is initially used, the callback associated with the vertexMass is skipped"; + return updateFromTotalMass(); + } + }, {}); } template @@ -132,24 +162,21 @@ void UniformMass::initDefaultImpl() { this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); - Mass::init(); - WriteAccessor > indices = d_indices; - - if(mstate==nullptr) - { - msg_warning(this) << "Missing mechanical state. \n" - "UniformMass need to be used with an object also having a MechanicalState. \n" - "To remove this warning: add a to the parent node of the one \n" - " containing this "; - return; - } + /// SingleStateAccessor checks the mstate pointer to a MechanicalObject + Mass::init(); + + /// Check filename if ( d_filenameMass.isSet() && d_filenameMass.getValue() != "unused" ) { loadRigidMass(d_filenameMass.getFullPath()) ; } + + /// Check indices + WriteAccessor > indices = d_indices; + //If d_localRange is set, update indices if (d_localRange.getValue()[0] >= 0 && d_localRange.getValue()[1] > 0 @@ -168,13 +195,15 @@ void UniformMass::initDefaultImpl() indices.push_back(i); } - // check if mass should use topology + + /// Check link to topology if (l_topology.empty()) { l_topology.set(this->getContext()->getMeshTopologyLink()); } BaseMeshTopology* meshTopology = l_topology.get(); + if (meshTopology != nullptr && dynamic_cast(meshTopology) != nullptr) { msg_info() << "Topology path used: '" << l_topology.getLinkedPath() << "'"; @@ -201,92 +230,54 @@ void UniformMass::initDefaultImpl() }); } - //If user defines the vertexMass, use this as the mass + + /// Check which input data isSet() to define mass initialization if (d_vertexMass.isSet()) { - //Check double definition : both totalMass and vertexMass are user-defined - if (d_totalMass.isSet()) + if(d_totalMass.isSet()) { msg_warning(this) << "totalMass value overriding the value of the attribute vertexMass. \n" "vertexMass = totalMass / nb_dofs. \n" "To remove this warning you need to set either totalMass or vertexMass data field, but not both."; - checkTotalMassInit(); - initFromTotalMass(); + + m_initMethod = InitMethod::TOTALMASS; + d_vertexMass.setReadOnly(true); } else { - if(checkVertexMass()) - { - initFromVertexMass(); - } - else - { - checkTotalMassInit(); - initFromTotalMass(); - } + m_initMethod = InitMethod::VERTEXMASS; + d_totalMass.setReadOnly(true); + + msg_info() << "Input vertexMass is used for initialization"; } } - //else totalMass is used - else + else if (d_totalMass.isSet()) { - if(!d_totalMass.isSet()) - { - msg_info() << "No information about the mass is given. Default totatMass is used as reference."; - } + m_initMethod = InitMethod::TOTALMASS; + d_vertexMass.setReadOnly(true); - checkTotalMassInit(); - initFromTotalMass(); + msg_info() << "Input totalForce is used for initialization"; } - - this->trackInternalData(d_vertexMass); - this->trackInternalData(d_totalMass); - - //Info post-init - msg_info() << "totalMass = " << d_totalMass.getValue() << " \n" - "vertexMass = " << d_vertexMass.getValue(); -} - - -template -void UniformMass::reinit() -{ - // Now update is handled through the doUpdateInternal mechanism - // called at each begin of step through the UpdateInternalDataVisitor -} - - -template -void UniformMass::doUpdateInternal() -{ - if (this->hasDataChanged(d_totalMass)) - { - if(checkTotalMass()) - { - initFromTotalMass(); - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); - } - else - { - msg_error() << "doUpdateInternal: incorrect update from totalMass"; - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); - } - } - else if(this->hasDataChanged(d_vertexMass)) + else { - if(checkVertexMass()) - { - initFromVertexMass(); - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); - } - else + if(d_filenameMass.getValue() == "unused") { - msg_error() << "doUpdateInternal: incorrect update from vertexMass"; + msg_error() << "No input mass information has been set. Please define one of both Data: " + << d_vertexMass.getName() << " or " << d_totalMass.getName() + << "\nFor your information, prior to #3927, default value was totalMass=\"1.0\"."; this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); + return; } } - //Info post-reinit - msg_info() << "totalMass = " << d_totalMass.getValue() << " \n" + + /// Trigger callbacks to update data (see constructor) + if(!this->isComponentStateValid()) + msg_error() << "Initialization process is invalid"; + + + /// Info post-init + msg_info() << "totalMass = " << d_totalMass.getValue() << " | " "vertexMass = " << d_vertexMass.getValue(); } @@ -296,8 +287,8 @@ bool UniformMass::checkVertexMass() { if(d_vertexMass.getValue() < 0.0 ) { - msg_warning(this) << "vertexMass data can not have a negative value. \n" - "To remove this warning, you need to set one single, non-zero and positive value to the vertexMass data"; + msg_error(this) << "vertexMass data can not have a negative value. \n" + "To remove this warning, you need to set one single, non-zero and positive value to the vertexMass data"; return false; } else @@ -325,8 +316,8 @@ bool UniformMass::checkTotalMass() { if(d_totalMass.getValue() < 0.0) { - msg_warning(this) << "totalMass data can not have a negative value. \n" - "To remove this warning, you need to set a non-zero positive value to the totalMass data"; + msg_error(this) << "totalMass data can not have a negative value. \n" + "To remove this warning, you need to set a non-zero positive value to the totalMass data"; return false; } else @@ -336,19 +327,6 @@ bool UniformMass::checkTotalMass() } -template -void UniformMass::checkTotalMassInit() -{ - //Check for negative or null value, if wrongly set use the default value totalMass = 1.0 - if(!checkTotalMass()) - { - msg_warning(this) << "Switching back to default values: totalMass = 1.0\n"; - d_totalMass.setValue(1.0) ; - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); - } -} - - template void UniformMass::initFromTotalMass() { @@ -357,9 +335,8 @@ void UniformMass::initFromTotalMass() if(d_indices.getValue().size() > 0) { - MassType *m = d_vertexMass.beginEdit(); + helper::WriteAccessor> m = d_vertexMass; *m = d_totalMass.getValue() / Real(d_indices.getValue().size()); - d_vertexMass.endEdit(); msg_info() << "totalMass information is used"; } @@ -370,6 +347,38 @@ void UniformMass::initFromTotalMass() } +template +sofa::core::objectmodel::ComponentState UniformMass::updateFromTotalMass() +{ + if (checkTotalMass()) + { + initFromTotalMass(); + return sofa::core::objectmodel::ComponentState::Valid; + } + else + { + msg_error() << "dataInternalUpdate: incorrect update from totalMass"; + return sofa::core::objectmodel::ComponentState::Invalid; + } +} + + +template +sofa::core::objectmodel::ComponentState UniformMass::updateFromVertexMass() +{ + if(checkVertexMass()) + { + initFromVertexMass(); + return sofa::core::objectmodel::ComponentState::Valid; + } + else + { + msg_error() << "dataInternalUpdate: incorrect update from vertexMass"; + return sofa::core::objectmodel::ComponentState::Invalid; + } +} + + template void UniformMass::updateMassOnResize(sofa::Size newSize) { @@ -393,11 +402,11 @@ void UniformMass::updateMassOnResize(sofa::Size newSize) // -- Mass interface template -void UniformMass::addMDx ( const core::MechanicalParams*, - DataVecDeriv& vres, - const DataVecDeriv& vdx, - SReal factor) +void UniformMass::addMDx ( const core::MechanicalParams*, DataVecDeriv& vres, const DataVecDeriv& vdx, SReal factor) { + if (!this->isComponentStateValid()) + return; + helper::WriteAccessor res = vres; helper::ReadAccessor dx = vdx; @@ -413,10 +422,11 @@ void UniformMass::addMDx ( const core::MechanicalParams*, template -void UniformMass::accFromF ( const core::MechanicalParams*, - DataVecDeriv& va, - const DataVecDeriv& vf ) +void UniformMass::accFromF ( const core::MechanicalParams*, DataVecDeriv& va, const DataVecDeriv& vf ) { + if (!this->isComponentStateValid()) + return; + WriteOnlyAccessor a = va; ReadAccessor f = vf; @@ -429,10 +439,7 @@ void UniformMass::accFromF ( const core::MechanicalParams*, template -void UniformMass::addMDxToVector ( BaseVector * resVect, - const VecDeriv* dx, - SReal mFact, - unsigned int& offset ) +void UniformMass::addMDxToVector ( BaseVector * resVect, const VecDeriv* dx, SReal mFact, unsigned int& offset ) { SOFA_UNUSED(resVect); SOFA_UNUSED(dx); @@ -442,26 +449,23 @@ void UniformMass::addMDxToVector ( BaseVector * resVect, template -void UniformMass::addGravityToV(const MechanicalParams* mparams, - DataVecDeriv& d_v) +void UniformMass::addGravityToV(const MechanicalParams* mparams, DataVecDeriv& d_v) { if (mparams) { - VecDeriv& v = *d_v.beginEdit(); + helper::WriteAccessor v = d_v; const SReal* g = getContext()->getGravity().ptr(); Deriv theGravity; DataTypes::set ( theGravity, g[0], g[1], g[2] ); Deriv hg = theGravity * Real(sofa::core::mechanicalparams::dt(mparams)); - dmsg_info()<< " addGravityToV hg = "<" @@ -127,19 +127,15 @@ struct UniformMassTest : public BaseTest const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadWithNoParam", scene.c_str()); - root->init(sofa::core::execparams::defaultInstance()) ; + EXPECT_MSG_EMIT(Error); + root->init(sofa::core::execparams::defaultInstance()); TheUniformMass* mass = root->getTreeObject() ; EXPECT_TRUE( mass != nullptr ) ; - - if(mass!=nullptr){ - EXPECT_EQ( mass->getTotalMass(), 1.0 ) ; - EXPECT_EQ( mass->getVertexMass(), 0.5 ) ; - } + EXPECT_TRUE( mass->getComponentState() == sofa::core::objectmodel::ComponentState::Invalid ) ; } - /// totalMass, mass and d_localRange.. - /// case where NO mass info give, default totalMass = 1.0 + /// Check inertiaMatrix void checkRigidAttribute() { EXPECT_MSG_NOEMIT(Error, Warning); @@ -162,20 +158,19 @@ struct UniformMassTest : public BaseTest { for(unsigned int j=0;j<3;j++) { - ASSERT_EQ(mass->d_vertexMass.getValue().inertiaMatrix[i][j], - values[i*3+j]); + ASSERT_EQ(mass->d_vertexMass.getValue().inertiaMatrix[i][j], values[i*3+j]); } } } /// totalMass is well defined - /// vertexMass will be computed from it using the formulat : vertexMass = totalMass / number of particules + /// vertexMass will be computed from it using the formula: vertexMass = totalMass / number of dofs void checkVertexMassFromTotalMass(){ const string scene = "" " " " " - " " + " " " " ; const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadWithNoParam", scene.c_str()); @@ -192,13 +187,13 @@ struct UniformMassTest : public BaseTest } /// vertexMass is well defined - /// totalMass will be computed from it using the formulat : totalMass = vertexMass * number of particules + /// totalMass will be computed from it using the formula: totalMass = vertexMass * number of dofs void checkTotalMassFromVertexMass(){ const string scene = "" " " " " - " " + " " " " ; const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadWithNoParam", scene.c_str()); @@ -215,49 +210,43 @@ struct UniformMassTest : public BaseTest } /// totalMass is defined but negative - /// Ignore value and use default value of totalMass = 1.0 + /// ComponentState = Invalid void checkNegativeTotalMass(){ const string scene = "" " " " " - " " + " " " " ; const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadWithNoParam", scene.c_str()); + EXPECT_MSG_EMIT(Error); root->init(sofa::core::execparams::defaultInstance()) ; TheUniformMass* mass = root->getTreeObject() ; EXPECT_TRUE( mass != nullptr ) ; - - if(mass!=nullptr){ - EXPECT_EQ( mass->getTotalMass(), 1.0 ) ; - EXPECT_EQ( mass->getVertexMass(), 0.5 ) ; - } + EXPECT_TRUE( mass->getComponentState() == sofa::core::objectmodel::ComponentState::Invalid ) ; } /// vertexMass is defined but negative - /// Ignore value and use default value of totalMass = 1.0 + /// ComponentState = Invalid void checkNegativeVertexMass(){ const string scene = "" " " " " - " " + " " " " ; const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadWithNoParam", scene.c_str()); + EXPECT_MSG_EMIT(Error); root->init(sofa::core::execparams::defaultInstance()) ; TheUniformMass* mass = root->getTreeObject() ; EXPECT_TRUE( mass != nullptr ) ; - - if(mass!=nullptr){ - EXPECT_EQ( mass->getTotalMass(), 1.0 ) ; - EXPECT_EQ( mass->getVertexMass(), 0.5 ) ; - } + EXPECT_TRUE( mass->getComponentState() == sofa::core::objectmodel::ComponentState::Invalid ) ; } /// totalMass & mass are exclusive. @@ -286,7 +275,7 @@ struct UniformMassTest : public BaseTest /// Both vertexMass and totalMass information are defined but totalMass is negative /// Due to double declaration, by default the totalMass is used - /// Due to negative value, the default value of totalMass overwrites totalMass = 1.0 + /// ComponentState = Invalid void checkDoubleDeclarationNegativeTotalMass(){ const string scene = "" @@ -297,19 +286,16 @@ struct UniformMassTest : public BaseTest const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadWithNoParam", scene.c_str()); + EXPECT_MSG_EMIT(Error); root->init(sofa::core::execparams::defaultInstance()) ; TheUniformMass* mass = root->getTreeObject() ; EXPECT_TRUE( mass != nullptr ) ; - - if(mass!=nullptr){ - EXPECT_EQ( mass->getTotalMass(), 1.0 ) ; - EXPECT_EQ( mass->getVertexMass(), 0.5 ) ; - } + EXPECT_TRUE( mass->getComponentState() == sofa::core::objectmodel::ComponentState::Invalid ) ; } /// Both vertexMass and totalMass information are defined but vertexMass is negative - /// By default use the totalMass + /// totalMass takes over and overwrite the vertexMass void checkDoubleDeclarationNegativeVertexMass(){ const string scene = "" @@ -320,19 +306,23 @@ struct UniformMassTest : public BaseTest const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadWithNoParam", scene.c_str()); + EXPECT_MSG_EMIT(Warning); root->init(sofa::core::execparams::defaultInstance()) ; TheUniformMass* mass = root->getTreeObject() ; EXPECT_TRUE( mass != nullptr ) ; - if(mass!=nullptr){ - EXPECT_EQ( mass->getVertexMass(), 4.0 ) ; - EXPECT_EQ( mass->getTotalMass(), 8.0 ) ; + if(mass!=nullptr) + { + EXPECT_EQ( mass->getVertexMass(), 4.0 ); + EXPECT_EQ( mass->getTotalMass(), 8.0 ); } + + EXPECT_TRUE( mass->getComponentState() == sofa::core::objectmodel::ComponentState::Valid ) ; } /// Both vertexMass and totalMass information are negative - /// Ignore them and use default value of totalMass = 1.0 + /// ComponentState = Invalid void checkDoubleDeclarationBothNegative(){ const string scene = "" @@ -343,15 +333,70 @@ struct UniformMassTest : public BaseTest const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadWithNoParam", scene.c_str()); + EXPECT_MSG_EMIT(Error); root->init(sofa::core::execparams::defaultInstance()) ; TheUniformMass* mass = root->getTreeObject() ; EXPECT_TRUE( mass != nullptr ) ; + EXPECT_TRUE( mass->getComponentState() == sofa::core::objectmodel::ComponentState::Invalid ) ; + } - if(mass!=nullptr){ - EXPECT_EQ( mass->getVertexMass(), 0.5 ) ; - EXPECT_EQ( mass->getTotalMass(), 1.0 ) ; + /// Update the totalMass + void checkUpdateTotalMass(){ + const string scene = + "" + " " + " " + " " + " " ; + + const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadWithNoParam", scene.c_str()); + + root->init(sofa::core::execparams::defaultInstance()) ; + + TheUniformMass* mass = root->getTreeObject() ; + EXPECT_TRUE( mass != nullptr ) ; + EXPECT_TRUE( mass->getComponentState() == sofa::core::objectmodel::ComponentState::Valid ) ; + + mass->setTotalMass(3.0); + mass->updateFromTotalMass(); + + if(mass!=nullptr) + { + EXPECT_EQ( mass->getVertexMass(), 1.5 ); + EXPECT_EQ( mass->getTotalMass(), 3.0 ); } + + EXPECT_TRUE( mass->getComponentState() == sofa::core::objectmodel::ComponentState::Valid ) ; + } + + /// Update the vertexMass + void checkUpdateVertexMass(){ + const string scene = + "" + " " + " " + " " + " " ; + + const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadWithNoParam", scene.c_str()); + + root->init(sofa::core::execparams::defaultInstance()) ; + + TheUniformMass* mass = root->getTreeObject() ; + EXPECT_TRUE( mass != nullptr ) ; + EXPECT_TRUE( mass->getComponentState() == sofa::core::objectmodel::ComponentState::Valid ) ; + + mass->setMass(3.0); + mass->updateFromVertexMass(); + + if(mass!=nullptr) + { + EXPECT_EQ( mass->getVertexMass(), 3.0 ); + EXPECT_EQ( mass->getTotalMass(), 6.0 ); + } + + EXPECT_TRUE( mass->getComponentState() == sofa::core::objectmodel::ComponentState::Valid ) ; } /// check mass initialization for rigids @@ -360,7 +405,7 @@ struct UniformMassTest : public BaseTest "" " " " " - " " + " " " " ; const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadFromAValidFile", scene.c_str()); root->init(sofa::core::execparams::defaultInstance()) ; @@ -379,9 +424,10 @@ struct UniformMassTest : public BaseTest "" " " " " - " " + " " " " ; const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadFromAValidFile", scene.c_str()); + EXPECT_MSG_EMIT(Error); root->init(sofa::core::execparams::defaultInstance()) ; } @@ -390,9 +436,10 @@ struct UniformMassTest : public BaseTest "" " " " " - " " + " " " " ; const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadFromAnInValidFile", scene.c_str()); + EXPECT_MSG_EMIT(Error); root->init(sofa::core::execparams::defaultInstance()) ; } @@ -400,17 +447,14 @@ struct UniformMassTest : public BaseTest const string scene = "" " " - " " + " " " " " " ; const Node::SPtr root = SceneLoaderXML::loadFromMemory("loadFromAnInValidFile", scene.c_str()); + EXPECT_MSG_EMIT(Error); root->init(sofa::core::execparams::defaultInstance()) ; } - void reinitTest(){ - // TODO - EXPECT_TRUE(todo == false) ; - } }; @@ -470,6 +514,16 @@ TYPED_TEST(UniformMassTest, checkDoubleDeclarationBothNegative) ASSERT_NO_THROW(this->checkDoubleDeclarationBothNegative()) ; } +TYPED_TEST(UniformMassTest, checkUpdateTotalMass) +{ +ASSERT_NO_THROW(this->checkUpdateTotalMass()) ; +} + +TYPED_TEST(UniformMassTest, checkUpdateVertexMass) +{ +ASSERT_NO_THROW(this->checkUpdateVertexMass()) ; +} + TYPED_TEST(UniformMassTest, loadFromAFileForNonRigid) { ASSERT_NO_THROW(this->loadFromAFileForNonRigid()) ; } @@ -489,7 +543,3 @@ TYPED_TEST(UniformMassTest, loadFromAFileForRigid) { TYPED_TEST(UniformMassTest, checkRigidAttribute) { ASSERT_NO_THROW(this->checkRigidAttribute()) ; } - -TYPED_TEST(UniformMassTest, reinitTest) { - //ASSERT_NO_THROW(this->reinitTest()) ; -} diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/ConstantForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/ConstantForceField.h index 4725124906d..4348f3f3a75 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/ConstantForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/ConstantForceField.h @@ -127,9 +127,13 @@ class ConstantForceField : public core::behavior::ForceField /// Save system size for update of indices (doUpdateInternal) size_t m_systemSize; - /// Boolean specifying whether the data totalMass has been initially given - /// (else forces vector is being used) - bool m_isTotalForceUsed; + /// Enumeration specifying which data was used for initialization + enum class InitMethod + { + TOTALFORCE, + FORCESVECTOR + }; + InitMethod m_initMethod; }; template <> diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/ConstantForceField.inl b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/ConstantForceField.inl index 4e0b34c6ea1..480d5a836d1 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/ConstantForceField.inl +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/ConstantForceField.inl @@ -58,12 +58,12 @@ ConstantForceField::ConstantForceField() sofa::core::objectmodel::Base::addUpdateCallback("updateFromForcesVector", {&d_forces, &d_indices}, [this](const core::DataTracker& ) { - if(!m_isTotalForceUsed) + if(m_initMethod == InitMethod::FORCESVECTOR) { msg_info() << "dataInternalUpdate: data forces has changed"; return updateFromForcesVector(); } - else + else if(m_initMethod == InitMethod::TOTALFORCE) { msg_info() << "totalForce data is initially used, the callback associated with the forces vector is skipped"; return updateFromTotalForce(); @@ -72,12 +72,12 @@ ConstantForceField::ConstantForceField() sofa::core::objectmodel::Base::addUpdateCallback("updateFromTotalForce", {&d_totalForce, &d_indices}, [this](const core::DataTracker& ) { - if(m_isTotalForceUsed) + if(m_initMethod == InitMethod::TOTALFORCE) { msg_info() << "dataInternalUpdate: data totalForce has changed"; return updateFromTotalForce(); } - else + else if(m_initMethod == InitMethod::FORCESVECTOR) { msg_info() << "forces data is initially used, the callback associated with the totalForce is skipped"; return updateFromForcesVector(); @@ -89,15 +89,16 @@ ConstantForceField::ConstantForceField() template void ConstantForceField::init() { - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); - + this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); + + + /// Check link to topology if (l_topology.empty()) { msg_info() << "link to Topology container should be set to ensure right behavior. First Topology found in current context will be used."; l_topology.set(this->getContext()->getMeshTopologyLink()); } - // temprory pointer to topology if (sofa::core::topology::BaseMeshTopology* _topology = l_topology.get()) { msg_info() << "Topology path used: '" << l_topology.getLinkedPath() << "'"; @@ -115,23 +116,23 @@ void ConstantForceField::init() } - - /// Check on data isSet() + /// Check which input data isSet() to define force initialization if (d_forces.isSet()) { if(d_totalForce.isSet()) { - msg_warning() <<"Both data \'forces\' and \'totalForce\' cannot be used simultaneously, please set only one of them to remove this warning"; + msg_warning() <<"Both data \'forces\' and \'totalForce\' cannot be used simultaneously.\n" + << "Vector \'forces\' is used. Please set only one force input to remove this warning"; } - m_isTotalForceUsed = false; + m_initMethod = InitMethod::FORCESVECTOR; d_totalForce.setReadOnly(true); msg_info() << "Input vector forces is used for initialization"; } else if (d_totalForce.isSet()) { - m_isTotalForceUsed = true; + m_initMethod = InitMethod::TOTALFORCE; d_forces.setReadOnly(true); msg_info() << "Input totalForce is used for initialization"; @@ -152,11 +153,14 @@ void ConstantForceField::init() std::iota (std::begin(indicesEdit), std::end(indicesEdit), 0); } - // init from ForceField + + /// init from ForceField Inherit::init(); - // if all init passes, component is valid - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); + + /// Trigger callbacks to update data (see constructor) + if(!this->isComponentStateValid()) + msg_error() << "Initialization process is invalid"; } @@ -370,6 +374,9 @@ void ConstantForceField::addForce(const core::MechanicalParams* param template SReal ConstantForceField::getPotentialEnergy(const core::MechanicalParams* params, const DataVecCoord& x) const { + if(!this->isComponentStateValid()) + return 0_sreal; + SOFA_UNUSED(params); const VecIndex& indices = d_indices.getValue(); const VecDeriv& f = d_forces.getValue(); @@ -399,11 +406,14 @@ SReal ConstantForceField::getPotentialEnergy(const core::MechanicalPa template void ConstantForceField::setForce(unsigned i, const Deriv& force) { - if(m_isTotalForceUsed) + if(!this->isComponentStateValid()) + return; + + if(m_initMethod == InitMethod::TOTALFORCE) { msg_warning() << "\'forces\' vector is modified using setForce() while totalMass is initially used. " << "Now the 'forces\' vector is used."; - m_isTotalForceUsed = false; + m_initMethod = InitMethod::FORCESVECTOR; } auto indices = sofa::helper::getWriteAccessor(d_indices); diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/config.h.in b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/config.h.in index 8bd4efad18f..23749c09ce1 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/config.h.in +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/config.h.in @@ -51,7 +51,7 @@ namespace sofa::component::mechanicalload #else #define SOFA_ATTRIBUTE_DISABLED__CONSTANTFF_FORCE_DATA() \ SOFA_ATTRIBUTE_DISABLED( \ - "v23.12 (PR#XXXX)", "v24.06",\ + "v23.12 (PR#4019)", "v24.06",\ "The \'force\' data is no longer used, please use the \'forces\' vector instead (with size = 1).") #endif diff --git a/Sofa/Component/MechanicalLoad/tests/ConstantForceField_test.cpp b/Sofa/Component/MechanicalLoad/tests/ConstantForceField_test.cpp index e97efd5fff3..80a2ffaa362 100644 --- a/Sofa/Component/MechanicalLoad/tests/ConstantForceField_test.cpp +++ b/Sofa/Component/MechanicalLoad/tests/ConstantForceField_test.cpp @@ -93,7 +93,7 @@ struct ConstantForceField_test : public BaseSimulationTest, NumericTest \n" " \n" " \n" - " \n" + " \n" " \n" " \n" ; diff --git a/Sofa/Component/MechanicalLoad/tests/PlaneForceField_test.cpp b/Sofa/Component/MechanicalLoad/tests/PlaneForceField_test.cpp index a599e9926ff..e78755301d8 100644 --- a/Sofa/Component/MechanicalLoad/tests/PlaneForceField_test.cpp +++ b/Sofa/Component/MechanicalLoad/tests/PlaneForceField_test.cpp @@ -149,8 +149,8 @@ struct PlaneForceField_test : public BaseSimulationTest m_mechanicalObj->x.setValue(points); typename TypedUniformMass::SPtr uniformMass = New(); - m_root->addObject(uniformMass); uniformMass->d_totalMass.setValue(1); + m_root->addObject(uniformMass); /*Create the plane force field*/ m_planeForceFieldSPtr = New(); diff --git a/Sofa/Component/Topology/Testing/src/sofa/component/topology/testing/RegularGridNodeCreation.h b/Sofa/Component/Topology/Testing/src/sofa/component/topology/testing/RegularGridNodeCreation.h index 5c4c221dec9..deb9b6aa8df 100644 --- a/Sofa/Component/Topology/Testing/src/sofa/component/topology/testing/RegularGridNodeCreation.h +++ b/Sofa/Component/Topology/Testing/src/sofa/component/topology/testing/RegularGridNodeCreation.h @@ -62,7 +62,7 @@ PatchTestStruct createRegularGridScene( PatchTestStruct patchStruct; typedef typename DataTypes::Real Real; typedef typename component::statecontainer::MechanicalObject MechanicalObject; - typedef typename sofa::component::mass::UniformMass UniformMass; + typedef typename sofa::component::mass::UniformMass UniformMass; typedef component::topology::container::grid::RegularGridTopology RegularGridTopology; typedef typename component::engine::select::BoxROI BoxRoi; typedef typename sofa::component::engine::select::PairBoxROI PairBoxRoi; @@ -90,6 +90,7 @@ PatchTestStruct createRegularGridScene( // Mass typename UniformMass::SPtr mass = modeling::addNew(SquareNode,"mass"); + mass->d_totalMass.setValue(1.0); // Regular grid topology const RegularGridTopology::SPtr gridMesh = modeling::addNew(SquareNode,"loader"); diff --git a/Sofa/framework/Simulation/Graph/test/Simulation_test.cpp b/Sofa/framework/Simulation/Graph/test/Simulation_test.cpp index a8ab5d8040c..53507e22024 100644 --- a/Sofa/framework/Simulation/Graph/test/Simulation_test.cpp +++ b/Sofa/framework/Simulation/Graph/test/Simulation_test.cpp @@ -222,7 +222,12 @@ struct Scene_test: public NumericTest root = simulation::getSimulation()->createNewGraph("root"); root->addObject(core::objectmodel::New >()); + + typename UniformMass3::SPtr uniformMass = core::objectmodel::New(); + uniformMass->d_totalMass.setValue(1.0); + root->addObject(uniformMass); root->addObject(core::objectmodel::New >()); + const simulation::Node::SPtr child = simulation::getSimulation()->createNewNode("child"); root->addChild(child); child->addObject(core::objectmodel::New >()); diff --git a/applications/plugins/BulletCollisionDetection/examples/BulletConvexHullDemo.scn b/applications/plugins/BulletCollisionDetection/examples/BulletConvexHullDemo.scn index 8b451789701..ed90b00f819 100644 --- a/applications/plugins/BulletCollisionDetection/examples/BulletConvexHullDemo.scn +++ b/applications/plugins/BulletCollisionDetection/examples/BulletConvexHullDemo.scn @@ -42,13 +42,13 @@ - + - + diff --git a/applications/plugins/BulletCollisionDetection/examples/BulletLMDragon.scn b/applications/plugins/BulletCollisionDetection/examples/BulletLMDragon.scn index d4d284f4e3c..96be6a23841 100644 --- a/applications/plugins/BulletCollisionDetection/examples/BulletLMDragon.scn +++ b/applications/plugins/BulletCollisionDetection/examples/BulletLMDragon.scn @@ -12,7 +12,7 @@ - + @@ -25,13 +25,13 @@ - + - + diff --git a/applications/plugins/BulletCollisionDetection/examples/BulletSphere.scn b/applications/plugins/BulletCollisionDetection/examples/BulletSphere.scn index 5c549726185..6199dab1921 100644 --- a/applications/plugins/BulletCollisionDetection/examples/BulletSphere.scn +++ b/applications/plugins/BulletCollisionDetection/examples/BulletSphere.scn @@ -27,12 +27,12 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBCap.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBCap.scn index a3b22ccb2ba..5c5a355e743 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBCap.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBCap.scn @@ -25,13 +25,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBCap1.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBCap1.scn index be3d5623649..8247b27df9d 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBCap1.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBCap1.scn @@ -25,13 +25,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBCapEdgeEdge.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBCapEdgeEdge.scn index f067b42d1a9..d8c1341a3e8 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBCapEdgeEdge.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBCapEdgeEdge.scn @@ -25,13 +25,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBCapEdgeVertex.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBCapEdgeVertex.scn index b4bd1bff158..950d442f1be 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBCapEdgeVertex.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBCapEdgeVertex.scn @@ -25,13 +25,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBCapVertexEdge.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBCapVertexEdge.scn index 8b5f3fd8f50..1404d550cb3 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBCapVertexEdge.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBCapVertexEdge.scn @@ -25,13 +25,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBCapVertexVertex.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBCapVertexVertex.scn index 74699c66456..0156e171b6a 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBCapVertexVertex.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBCapVertexVertex.scn @@ -25,13 +25,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBOBB.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBOBB.scn index 6e30f739230..7723d4da822 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBOBB.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBOBB.scn @@ -23,13 +23,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBOBB2.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBOBB2.scn index b3b6f6f3737..ee8ef4934d2 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBOBB2.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBOBB2.scn @@ -23,12 +23,12 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBAlea.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBAlea.scn index 98404d9e504..1690541caeb 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBAlea.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBAlea.scn @@ -23,13 +23,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBCollision.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBCollision.scn index cb722ba85a4..7736eec3273 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBCollision.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBCollision.scn @@ -23,12 +23,12 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBEdgeEdge.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBEdgeEdge.scn index 8809f875aca..809224ca112 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBEdgeEdge.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBEdgeEdge.scn @@ -23,13 +23,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBEdgeVertex.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBEdgeVertex.scn index 39ba344e353..4240e5e596d 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBEdgeVertex.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBEdgeVertex.scn @@ -23,13 +23,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBFaceEdge.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBFaceEdge.scn index a8281fd12f9..fc81e303e34 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBFaceEdge.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBFaceEdge.scn @@ -23,13 +23,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBVertexVertex.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBVertexVertex.scn index 48bff4ce98e..5829ce2a174 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBOBBVertexVertex.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBOBBVertexVertex.scn @@ -23,13 +23,13 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBSphere.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBSphere.scn index 3986adc9c3b..f7b230d63bd 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBSphere.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBSphere.scn @@ -24,12 +24,12 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBSphere2.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBSphere2.scn index 6958086322e..75f980942b6 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBSphere2.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBSphere2.scn @@ -24,12 +24,12 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBSphereEdge.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBSphereEdge.scn index fb19177217f..ea5a0b35344 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBSphereEdge.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBSphereEdge.scn @@ -24,12 +24,12 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBSphereVertex.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBSphereVertex.scn index e1131d724bc..5c07c969836 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBSphereVertex.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBSphereVertex.scn @@ -24,12 +24,12 @@ - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBTri.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBTri.scn index 013b2b8509c..e0e4969120e 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBTri.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBTri.scn @@ -26,18 +26,18 @@ - + - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeEdge.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeEdge.scn index 1fc60715158..509983e8468 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeEdge.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeEdge.scn @@ -26,18 +26,18 @@ - + - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeEdge2.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeEdge2.scn index 940298e3d69..285651e85eb 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeEdge2.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeEdge2.scn @@ -26,18 +26,18 @@ - + - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeVerex.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeVerex.scn index 182c5ef73da..21984e2ba86 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeVerex.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBTriEdgeVerex.scn @@ -26,18 +26,18 @@ - + - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBTriFaceVertex.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBTriFaceVertex.scn index 73e1e1535ef..338df366e8e 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBTriFaceVertex.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBTriFaceVertex.scn @@ -26,18 +26,18 @@ - + - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexEdge.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexEdge.scn index 4db77349d71..a30bd8a635f 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexEdge.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexEdge.scn @@ -26,18 +26,18 @@ - + - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexFace.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexFace.scn index e25636aae4e..9b3e5713677 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexFace.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexFace.scn @@ -26,18 +26,18 @@ - + - + - + diff --git a/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexVertex.scn b/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexVertex.scn index 452b69386b4..6a83a452bf0 100644 --- a/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexVertex.scn +++ b/applications/plugins/CollisionOBBCapsule/examples/OBBTriVertexVertex.scn @@ -26,7 +26,7 @@ - + diff --git a/applications/plugins/Haption/exemple/haption1.scn b/applications/plugins/Haption/exemple/haption1.scn index 4e6a67741c5..528622522c0 100644 --- a/applications/plugins/Haption/exemple/haption1.scn +++ b/applications/plugins/Haption/exemple/haption1.scn @@ -50,7 +50,7 @@ - + @@ -72,7 +72,7 @@ - + diff --git a/applications/plugins/Haption/exemple/temp1.scn b/applications/plugins/Haption/exemple/temp1.scn index 144b7ceec19..359a4a7df86 100644 --- a/applications/plugins/Haption/exemple/temp1.scn +++ b/applications/plugins/Haption/exemple/temp1.scn @@ -50,7 +50,7 @@ - + @@ -72,7 +72,7 @@ - + diff --git a/applications/plugins/SofaCUDA/examples/SPHFluid2CUDA.scn b/applications/plugins/SofaCUDA/examples/SPHFluid2CUDA.scn index f1a820d9596..f0a2c46f003 100644 --- a/applications/plugins/SofaCUDA/examples/SPHFluid2CUDA.scn +++ b/applications/plugins/SofaCUDA/examples/SPHFluid2CUDA.scn @@ -113,7 +113,7 @@ 0.099457 0.345314 0 " translation="3 9 0" radius="0 0 0" velocity="0 0 -15" delay="0.013333" start="-0.04" stop="4" /> - + diff --git a/applications/plugins/SofaCUDA/examples/SPHFluidForceFieldCUDA.scn b/applications/plugins/SofaCUDA/examples/SPHFluidForceFieldCUDA.scn index a1c04a6e1c1..c90b41b2a9d 100644 --- a/applications/plugins/SofaCUDA/examples/SPHFluidForceFieldCUDA.scn +++ b/applications/plugins/SofaCUDA/examples/SPHFluidForceFieldCUDA.scn @@ -14,7 +14,7 @@ ymin="-3" ymax="12" zmin="-1.5" zmax="0" /> - + diff --git a/applications/plugins/SofaOpenCL/examples/PCISPHFluidForceFieldCPU.scn b/applications/plugins/SofaOpenCL/examples/PCISPHFluidForceFieldCPU.scn index ab8437c24cd..a22d61d7e7f 100644 --- a/applications/plugins/SofaOpenCL/examples/PCISPHFluidForceFieldCPU.scn +++ b/applications/plugins/SofaOpenCL/examples/PCISPHFluidForceFieldCPU.scn @@ -15,7 +15,7 @@ zmin="-1.5" zmax="1.5" /> - + diff --git a/applications/plugins/SofaSimpleGUI/examples/oneTet.scn b/applications/plugins/SofaSimpleGUI/examples/oneTet.scn index a11bac2929f..d888792de76 100644 --- a/applications/plugins/SofaSimpleGUI/examples/oneTet.scn +++ b/applications/plugins/SofaSimpleGUI/examples/oneTet.scn @@ -14,7 +14,7 @@ - + diff --git a/applications/plugins/Xitact/examples/XitactGrasping.scn b/applications/plugins/Xitact/examples/XitactGrasping.scn index 58c579e5a53..a2b37a124ca 100644 --- a/applications/plugins/Xitact/examples/XitactGrasping.scn +++ b/applications/plugins/Xitact/examples/XitactGrasping.scn @@ -25,7 +25,7 @@ - + @@ -103,7 +103,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/applications/plugins/Xitact/examples/XitactGraspingWithForceFeedBack.scn b/applications/plugins/Xitact/examples/XitactGraspingWithForceFeedBack.scn index 686e04e1301..3725346d2fe 100644 --- a/applications/plugins/Xitact/examples/XitactGraspingWithForceFeedBack.scn +++ b/applications/plugins/Xitact/examples/XitactGraspingWithForceFeedBack.scn @@ -25,7 +25,7 @@ - + @@ -103,7 +103,7 @@ - + @@ -112,7 +112,7 @@ - + diff --git a/applications/plugins/Xitact/examples/XitactGrasping_coupledModel.scn b/applications/plugins/Xitact/examples/XitactGrasping_coupledModel.scn index 49de0119ea9..6431ef2d7d9 100644 --- a/applications/plugins/Xitact/examples/XitactGrasping_coupledModel.scn +++ b/applications/plugins/Xitact/examples/XitactGrasping_coupledModel.scn @@ -25,7 +25,7 @@ - + @@ -103,7 +103,7 @@ - + @@ -111,7 +111,7 @@ - + @@ -220,7 +220,7 @@ - + @@ -228,7 +228,7 @@ - + diff --git a/applications/plugins/Xitact/examples/XitactGrasping_coupledModel_withITP.scn b/applications/plugins/Xitact/examples/XitactGrasping_coupledModel_withITP.scn index 8ab8fa62483..c9c2a905e1f 100644 --- a/applications/plugins/Xitact/examples/XitactGrasping_coupledModel_withITP.scn +++ b/applications/plugins/Xitact/examples/XitactGrasping_coupledModel_withITP.scn @@ -25,7 +25,7 @@ - + @@ -103,7 +103,7 @@ - + @@ -111,7 +111,7 @@ - + @@ -220,7 +220,7 @@ - + @@ -228,7 +228,7 @@ - + @@ -337,7 +337,7 @@ - + @@ -345,7 +345,7 @@ - + diff --git a/applications/plugins/Xitact/examples/xitactTest.scn b/applications/plugins/Xitact/examples/xitactTest.scn index 895163277bd..8b9ce1ecf9a 100644 --- a/applications/plugins/Xitact/examples/xitactTest.scn +++ b/applications/plugins/Xitact/examples/xitactTest.scn @@ -33,7 +33,7 @@ - + @@ -42,7 +42,7 @@ - + diff --git a/applications/plugins/image/examples/ImageToRigidMass.scn b/applications/plugins/image/examples/ImageToRigidMass.scn index f00b3b4cdd7..2c3e8196fa7 100644 --- a/applications/plugins/image/examples/ImageToRigidMass.scn +++ b/applications/plugins/image/examples/ImageToRigidMass.scn @@ -32,10 +32,10 @@ - + - + diff --git a/applications/plugins/image/examples/sampler_Frames.scn b/applications/plugins/image/examples/sampler_Frames.scn index d38ec823ba1..c2f46d7e643 100644 --- a/applications/plugins/image/examples/sampler_Frames.scn +++ b/applications/plugins/image/examples/sampler_Frames.scn @@ -25,7 +25,7 @@ --> - + diff --git a/examples/Benchmark/Analysis/constantMomentum.scn b/examples/Benchmark/Analysis/constantMomentum.scn index 3c7b5347b71..d2ea9f497eb 100644 --- a/examples/Benchmark/Analysis/constantMomentum.scn +++ b/examples/Benchmark/Analysis/constantMomentum.scn @@ -72,7 +72,7 @@ 7 3.5 0 7 3.5 3.5" /> - + @@ -138,7 +138,7 @@ 7 3.5 0 7 3.5 3.5" /> - + diff --git a/examples/Component/AnimationLoop/MultiStepAnimationLoop.scn b/examples/Component/AnimationLoop/MultiStepAnimationLoop.scn index 450d741a510..4c417f0ee49 100644 --- a/examples/Component/AnimationLoop/MultiStepAnimationLoop.scn +++ b/examples/Component/AnimationLoop/MultiStepAnimationLoop.scn @@ -33,7 +33,7 @@ - + @@ -51,7 +51,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -87,7 +87,7 @@ - + diff --git a/examples/Component/Constraint/Projective/AttachProjectiveConstraintMatrix.scn b/examples/Component/Constraint/Projective/AttachProjectiveConstraintMatrix.scn index c4af413bbb2..78937b2fd67 100644 --- a/examples/Component/Constraint/Projective/AttachProjectiveConstraintMatrix.scn +++ b/examples/Component/Constraint/Projective/AttachProjectiveConstraintMatrix.scn @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/examples/Component/Constraint/Projective/FixedRotationProjectiveConstraint.scn b/examples/Component/Constraint/Projective/FixedRotationProjectiveConstraint.scn index dff0cbf791f..6ad955b2326 100644 --- a/examples/Component/Constraint/Projective/FixedRotationProjectiveConstraint.scn +++ b/examples/Component/Constraint/Projective/FixedRotationProjectiveConstraint.scn @@ -25,10 +25,10 @@ - + - + @@ -36,10 +36,10 @@ - + - + diff --git a/examples/Component/Constraint/Projective/OscillatorProjectiveConstraint_rigid.scn b/examples/Component/Constraint/Projective/OscillatorProjectiveConstraint_rigid.scn index ebf9b35dcdd..3df33cffcc1 100644 --- a/examples/Component/Constraint/Projective/OscillatorProjectiveConstraint_rigid.scn +++ b/examples/Component/Constraint/Projective/OscillatorProjectiveConstraint_rigid.scn @@ -10,13 +10,13 @@ - + - + diff --git a/examples/Component/Engine/Generate/MergeMeshes.scn b/examples/Component/Engine/Generate/MergeMeshes.scn index bccdb3fc97a..2c86e7409d8 100644 --- a/examples/Component/Engine/Generate/MergeMeshes.scn +++ b/examples/Component/Engine/Generate/MergeMeshes.scn @@ -25,6 +25,6 @@ - + diff --git a/examples/Component/Engine/Select/MeshSplittingEngine.scn b/examples/Component/Engine/Select/MeshSplittingEngine.scn index 9964396e546..9e47bc7013b 100644 --- a/examples/Component/Engine/Select/MeshSplittingEngine.scn +++ b/examples/Component/Engine/Select/MeshSplittingEngine.scn @@ -32,7 +32,7 @@ - + diff --git a/examples/Component/Engine/Select/SubsetTopology_subsetbehaviormodel.scn b/examples/Component/Engine/Select/SubsetTopology_subsetbehaviormodel.scn index ac68e5a2029..6f5e51a86a0 100644 --- a/examples/Component/Engine/Select/SubsetTopology_subsetbehaviormodel.scn +++ b/examples/Component/Engine/Select/SubsetTopology_subsetbehaviormodel.scn @@ -29,7 +29,7 @@ - + diff --git a/examples/Component/Engine/Transform/TransformPosition.scn b/examples/Component/Engine/Transform/TransformPosition.scn index 5ae0742e113..f9077fcf805 100644 --- a/examples/Component/Engine/Transform/TransformPosition.scn +++ b/examples/Component/Engine/Transform/TransformPosition.scn @@ -28,7 +28,7 @@ - + diff --git a/examples/Component/Mapping/NonLinear/RigidMapping-basic.scn b/examples/Component/Mapping/NonLinear/RigidMapping-basic.scn index 1288a343fcd..d7fde54e6d6 100644 --- a/examples/Component/Mapping/NonLinear/RigidMapping-basic.scn +++ b/examples/Component/Mapping/NonLinear/RigidMapping-basic.scn @@ -16,7 +16,7 @@ - + diff --git a/examples/Component/Mapping/NonLinear/RigidMapping.scn b/examples/Component/Mapping/NonLinear/RigidMapping.scn index 341e623abc4..300fb830c98 100644 --- a/examples/Component/Mapping/NonLinear/RigidMapping.scn +++ b/examples/Component/Mapping/NonLinear/RigidMapping.scn @@ -50,7 +50,7 @@ - + @@ -68,7 +68,7 @@ - + @@ -86,7 +86,7 @@ - + diff --git a/examples/Component/Mapping/NonLinear/RigidMapping2d-basic.scn b/examples/Component/Mapping/NonLinear/RigidMapping2d-basic.scn index f80e9ca2cc0..af9df9825fd 100644 --- a/examples/Component/Mapping/NonLinear/RigidMapping2d-basic.scn +++ b/examples/Component/Mapping/NonLinear/RigidMapping2d-basic.scn @@ -17,7 +17,7 @@ - + diff --git a/examples/Component/Mapping/NonLinear/RigidRigidMapping-basic.scn b/examples/Component/Mapping/NonLinear/RigidRigidMapping-basic.scn index cc1d920970c..6b09109dc7c 100644 --- a/examples/Component/Mapping/NonLinear/RigidRigidMapping-basic.scn +++ b/examples/Component/Mapping/NonLinear/RigidRigidMapping-basic.scn @@ -15,7 +15,7 @@ - + diff --git a/examples/Component/Mass/UniformMass.scn b/examples/Component/Mass/UniformMass.scn index 7de3a469e35..e312c9ecaa1 100644 --- a/examples/Component/Mass/UniformMass.scn +++ b/examples/Component/Mass/UniformMass.scn @@ -14,6 +14,7 @@ + @@ -22,6 +23,8 @@ + + @@ -32,7 +35,7 @@ - + diff --git a/examples/Component/MechanicalLoad/ConstantForceField.scn b/examples/Component/MechanicalLoad/ConstantForceField.scn index c564034920a..7f29d2bd1c7 100644 --- a/examples/Component/MechanicalLoad/ConstantForceField.scn +++ b/examples/Component/MechanicalLoad/ConstantForceField.scn @@ -34,7 +34,7 @@ - + diff --git a/examples/Component/MechanicalLoad/LinearForceField.scn b/examples/Component/MechanicalLoad/LinearForceField.scn index 8b811e39720..85780d88527 100644 --- a/examples/Component/MechanicalLoad/LinearForceField.scn +++ b/examples/Component/MechanicalLoad/LinearForceField.scn @@ -15,7 +15,7 @@ - + @@ -28,7 +28,7 @@ - + diff --git a/examples/Component/SolidMechanics/FEM/DampingForceField.scn b/examples/Component/SolidMechanics/FEM/DampingForceField.scn index 01fba9bcbe9..2d69a008339 100644 --- a/examples/Component/SolidMechanics/FEM/DampingForceField.scn +++ b/examples/Component/SolidMechanics/FEM/DampingForceField.scn @@ -17,20 +17,20 @@ - + - + - + diff --git a/examples/Component/SolidMechanics/FEM/StandardTetrahedralFEMForceField.scn b/examples/Component/SolidMechanics/FEM/StandardTetrahedralFEMForceField.scn index 62ccba55d4c..f606597068c 100644 --- a/examples/Component/SolidMechanics/FEM/StandardTetrahedralFEMForceField.scn +++ b/examples/Component/SolidMechanics/FEM/StandardTetrahedralFEMForceField.scn @@ -23,7 +23,7 @@ - + @@ -38,7 +38,7 @@ - + @@ -61,7 +61,7 @@ - + @@ -85,7 +85,7 @@ - + @@ -109,7 +109,7 @@ - + diff --git a/examples/Component/SolidMechanics/FEM/TetrahedronHyperelasticityFEMForceField.scn b/examples/Component/SolidMechanics/FEM/TetrahedronHyperelasticityFEMForceField.scn index 6d0598f2161..4ea423a4263 100644 --- a/examples/Component/SolidMechanics/FEM/TetrahedronHyperelasticityFEMForceField.scn +++ b/examples/Component/SolidMechanics/FEM/TetrahedronHyperelasticityFEMForceField.scn @@ -1,135 +1,140 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Component/SolidMechanics/Spring/StiffSpringForceField_simple.scn b/examples/Component/SolidMechanics/Spring/StiffSpringForceField_simple.scn index 3072efe8827..b5fcd047313 100644 --- a/examples/Component/SolidMechanics/Spring/StiffSpringForceField_simple.scn +++ b/examples/Component/SolidMechanics/Spring/StiffSpringForceField_simple.scn @@ -24,25 +24,25 @@ - + - + - + - + diff --git a/examples/Component/Topology/Container/Dynamic/AddingPointInTriangleProcess.scn b/examples/Component/Topology/Container/Dynamic/AddingPointInTriangleProcess.scn index 605e054a7d4..3b9009aec95 100644 --- a/examples/Component/Topology/Container/Dynamic/AddingPointInTriangleProcess.scn +++ b/examples/Component/Topology/Container/Dynamic/AddingPointInTriangleProcess.scn @@ -13,6 +13,6 @@ - + diff --git a/examples/Component/Visual/TrailRenderer.scn b/examples/Component/Visual/TrailRenderer.scn index 7945873e4ff..0bedfed7256 100644 --- a/examples/Component/Visual/TrailRenderer.scn +++ b/examples/Component/Visual/TrailRenderer.scn @@ -17,6 +17,6 @@ - + diff --git a/examples/Objects/Rigid.xml b/examples/Objects/Rigid.xml index c2f0d708b36..6efdd7f80cd 100644 --- a/examples/Objects/Rigid.xml +++ b/examples/Objects/Rigid.xml @@ -2,7 +2,7 @@ - + diff --git a/examples/Objects/TorusRigid.xml b/examples/Objects/TorusRigid.xml index aa441cee956..c9d9636cc49 100644 --- a/examples/Objects/TorusRigid.xml +++ b/examples/Objects/TorusRigid.xml @@ -2,7 +2,7 @@ - + diff --git a/examples/Tutorials/ForceFields/TutorialForceFieldLiverSprings.scn b/examples/Tutorials/ForceFields/TutorialForceFieldLiverSprings.scn index 3c20e7699fb..fe60c3b4ba0 100644 --- a/examples/Tutorials/ForceFields/TutorialForceFieldLiverSprings.scn +++ b/examples/Tutorials/ForceFields/TutorialForceFieldLiverSprings.scn @@ -31,7 +31,7 @@ - + diff --git a/examples/Tutorials/OldTutorials/demo10.scn b/examples/Tutorials/OldTutorials/demo10.scn index 6f33a7e6d6c..6d636dfce55 100644 --- a/examples/Tutorials/OldTutorials/demo10.scn +++ b/examples/Tutorials/OldTutorials/demo10.scn @@ -96,7 +96,7 @@ - + - + - + diff --git a/examples/Tutorials/StepByStep/Pendulum/1_Pendulum.scn b/examples/Tutorials/StepByStep/Pendulum/1_Pendulum.scn index 9c602288d17..cf5e7ed37ed 100644 --- a/examples/Tutorials/StepByStep/Pendulum/1_Pendulum.scn +++ b/examples/Tutorials/StepByStep/Pendulum/1_Pendulum.scn @@ -11,6 +11,6 @@ - + diff --git a/examples/Tutorials/StepByStep/Pendulum/2_Pendulum.scn b/examples/Tutorials/StepByStep/Pendulum/2_Pendulum.scn index 2c0ca124178..9905c77a1ca 100644 --- a/examples/Tutorials/StepByStep/Pendulum/2_Pendulum.scn +++ b/examples/Tutorials/StepByStep/Pendulum/2_Pendulum.scn @@ -16,7 +16,7 @@ - + diff --git a/examples/Tutorials/StepByStep/Pendulum/3_Pendulum.scn b/examples/Tutorials/StepByStep/Pendulum/3_Pendulum.scn index 2b32034e94a..f7c64d8198e 100644 --- a/examples/Tutorials/StepByStep/Pendulum/3_Pendulum.scn +++ b/examples/Tutorials/StepByStep/Pendulum/3_Pendulum.scn @@ -16,7 +16,7 @@ - + diff --git a/examples/Tutorials/StepByStep/Pendulum/4_Pendulum.scn b/examples/Tutorials/StepByStep/Pendulum/4_Pendulum.scn index ab21d36153b..ec922e8b879 100644 --- a/examples/Tutorials/StepByStep/Pendulum/4_Pendulum.scn +++ b/examples/Tutorials/StepByStep/Pendulum/4_Pendulum.scn @@ -17,7 +17,7 @@ - + diff --git a/examples/Tutorials/StepByStep/Pendulum/5_Pendulum.scn b/examples/Tutorials/StepByStep/Pendulum/5_Pendulum.scn index f3eb8be8e8a..52b666add4f 100644 --- a/examples/Tutorials/StepByStep/Pendulum/5_Pendulum.scn +++ b/examples/Tutorials/StepByStep/Pendulum/5_Pendulum.scn @@ -17,13 +17,13 @@ - + - + diff --git a/examples/Tutorials/StepByStep/Pendulum/6_Pendulum.scn b/examples/Tutorials/StepByStep/Pendulum/6_Pendulum.scn index ff3d7d4a59c..865de90243d 100644 --- a/examples/Tutorials/StepByStep/Pendulum/6_Pendulum.scn +++ b/examples/Tutorials/StepByStep/Pendulum/6_Pendulum.scn @@ -17,14 +17,14 @@ - + - + diff --git a/examples/Tutorials/StepByStep/Pendulum/7_Pendulum.scn b/examples/Tutorials/StepByStep/Pendulum/7_Pendulum.scn index 237608a794c..d8e8f5f9779 100644 --- a/examples/Tutorials/StepByStep/Pendulum/7_Pendulum.scn +++ b/examples/Tutorials/StepByStep/Pendulum/7_Pendulum.scn @@ -19,14 +19,14 @@ - + - + diff --git a/examples/Tutorials/sandbox/explicit_singlehexaFEM.scn b/examples/Tutorials/sandbox/explicit_singlehexaFEM.scn index 381fcdbbb89..ca4e31e71e8 100644 --- a/examples/Tutorials/sandbox/explicit_singlehexaFEM.scn +++ b/examples/Tutorials/sandbox/explicit_singlehexaFEM.scn @@ -20,6 +20,6 @@ - + diff --git a/examples/Tutorials/sandbox/implicit_singlehexaFEM.scn b/examples/Tutorials/sandbox/implicit_singlehexaFEM.scn index 1d40821c814..9edaa452da2 100644 --- a/examples/Tutorials/sandbox/implicit_singlehexaFEM.scn +++ b/examples/Tutorials/sandbox/implicit_singlehexaFEM.scn @@ -23,6 +23,6 @@ - + diff --git a/examples/Tutorials/sandbox/implicit_singlehexaFEM_2.scn b/examples/Tutorials/sandbox/implicit_singlehexaFEM_2.scn index d2a6631480f..de4716d5409 100644 --- a/examples/Tutorials/sandbox/implicit_singlehexaFEM_2.scn +++ b/examples/Tutorials/sandbox/implicit_singlehexaFEM_2.scn @@ -23,6 +23,6 @@ - + diff --git a/examples/Tutorials/sandbox/linearsolver_direct_or_iterative.scn b/examples/Tutorials/sandbox/linearsolver_direct_or_iterative.scn index 7a484a5417e..02e93b7c2bd 100644 --- a/examples/Tutorials/sandbox/linearsolver_direct_or_iterative.scn +++ b/examples/Tutorials/sandbox/linearsolver_direct_or_iterative.scn @@ -17,7 +17,7 @@ - + @@ -27,7 +27,7 @@ - + diff --git a/examples/Tutorials/sandbox/rungekutta2_heterogeneousobjects.scn b/examples/Tutorials/sandbox/rungekutta2_heterogeneousobjects.scn index 4c973125b5f..3013da95ba2 100644 --- a/examples/Tutorials/sandbox/rungekutta2_heterogeneousobjects.scn +++ b/examples/Tutorials/sandbox/rungekutta2_heterogeneousobjects.scn @@ -14,7 +14,7 @@ - + @@ -26,7 +26,7 @@ - + diff --git a/examples/Tutorials/sandbox/rungekutta_singlehexaFEM.scn b/examples/Tutorials/sandbox/rungekutta_singlehexaFEM.scn index 4d2d3ae2266..ee098b29deb 100644 --- a/examples/Tutorials/sandbox/rungekutta_singlehexaFEM.scn +++ b/examples/Tutorials/sandbox/rungekutta_singlehexaFEM.scn @@ -19,6 +19,6 @@ - +