diff --git a/src/BeamAdapter/component/BeamInterpolation.h b/src/BeamAdapter/component/BeamInterpolation.h index a73409573..5da83f227 100644 --- a/src/BeamAdapter/component/BeamInterpolation.h +++ b/src/BeamAdapter/component/BeamInterpolation.h @@ -202,7 +202,7 @@ class BeamInterpolation : public BaseBeamInterpolation void getMechanicalSampling(Real& dx, const Real x_localcurv_abs) override; void getCollisionSampling(Real &dx, const Real x_localcurv_abs) override; void getNumberOfCollisionSegment(Real &dx, unsigned int &numLines) override; - + void setTransformBetweenDofAndNode(const sofa::Index beam, const Transform &DOF_H_Node, unsigned int zeroORone ); void getSplineRestTransform(const EdgeID edgeInList, Transform &local_H_local0_rest, Transform &local_H_local1_rest) override; diff --git a/src/BeamAdapter/component/BeamInterpolation.inl b/src/BeamAdapter/component/BeamInterpolation.inl index e064858bc..066f5eae4 100644 --- a/src/BeamAdapter/component/BeamInterpolation.inl +++ b/src/BeamAdapter/component/BeamInterpolation.inl @@ -446,7 +446,6 @@ void BeamInterpolation::getNumberOfCollisionSegment(Real &dx, unsigne dx = getRestTotalLength()/numLines; } - template void BeamInterpolation::getInterpolationParameters(sofa::Index beamId, Real& _L, Real& _A, Real& _Iy, Real& _Iz, Real& _Asy, Real& _Asz, Real& _J) diff --git a/src/BeamAdapter/component/WireBeamInterpolation.h b/src/BeamAdapter/component/WireBeamInterpolation.h index 592d0364e..42240b39d 100644 --- a/src/BeamAdapter/component/WireBeamInterpolation.h +++ b/src/BeamAdapter/component/WireBeamInterpolation.h @@ -131,6 +131,12 @@ class WireBeamInterpolation : public BaseBeamInterpolation { this->m_restShape->getNumberOfCollisionSegment(dx,numLines); } + + // this is the number of beams which can be simulated according to the rest shape (and its sections) + sofa::Size getTotalNumberOfPossibleBeams() const + { + return this->m_restShape->getTotalNumberOfBeams(); + } virtual void getRestTransform(const EdgeID edgeInList, Transform &local0_H_local1_rest); diff --git a/src/BeamAdapter/component/WireBeamInterpolation.inl b/src/BeamAdapter/component/WireBeamInterpolation.inl index fdd3443e3..2a791aa6a 100644 --- a/src/BeamAdapter/component/WireBeamInterpolation.inl +++ b/src/BeamAdapter/component/WireBeamInterpolation.inl @@ -57,7 +57,7 @@ void WireBeamInterpolation::init() this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); return; } - + type::vector xP_noticeable; type::vector nbP_density; diff --git a/src/BeamAdapter/component/controller/InterventionalRadiologyController.inl b/src/BeamAdapter/component/controller/InterventionalRadiologyController.inl index 96362df09..0005a64b7 100644 --- a/src/BeamAdapter/component/controller/InterventionalRadiologyController.inl +++ b/src/BeamAdapter/component/controller/InterventionalRadiologyController.inl @@ -223,27 +223,35 @@ void InterventionalRadiologyController::bwdInit() stPos.getOrientation().normalize(); d_startingPos.setValue(stPos); - if (!this->mState) { + if (!this->mState) + { msg_error() << "No MechanicalState found. The component can not work and will be set to Invalid."; sofa::core::objectmodel::BaseObject::d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); return; } + + // check if the provided mechanical state and topology can manage our tools + sofa::Size requiredNumberOfEdges = 0; + for (const auto* instrument : m_instrumentsList) + { + requiredNumberOfEdges += instrument->getTotalNumberOfPossibleBeams(); + } + + if(requiredNumberOfEdges + 1 > this->mState->getSize()) + { + msg_warning() << "The associated Mechanical Object does not contain enough nodes (" << this->mState->getSize() + << ") whereas the provided tool(s) need(s) at least " << requiredNumberOfEdges + 1 << " nodes."; + } + if(requiredNumberOfEdges > this->l_mechanicalTopology->getNbEdges()) + { + msg_warning() << "The associated Topology does not contain enough edges (" << this->l_mechanicalTopology->getNbEdges() + << ") whereas the provided tool(s) need(s) at least " << requiredNumberOfEdges << " edges."; + } WriteAccessor > x = *this->mState->write(sofa::core::vec_id::write_access::position); for(unsigned int i=0; i xP_noticeable_I; - type::vector density_I; - m_instrumentsList[i]->getSamplingParameters(xP_noticeable_I, density_I); - - for (auto nb : density_I) - nbrBeam += nb; - } - applyInterventionalRadiologyController(); sofa::core::objectmodel::BaseObject::d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); diff --git a/src/BeamAdapter/component/engine/WireRestShape.h b/src/BeamAdapter/component/engine/WireRestShape.h index 95041e685..f866a226e 100644 --- a/src/BeamAdapter/component/engine/WireRestShape.h +++ b/src/BeamAdapter/component/engine/WireRestShape.h @@ -111,6 +111,8 @@ class WireRestShape : public core::objectmodel::BaseObject void getMechanicalSampling(Real& dx, const Real x_localcurv_abs); void getCollisionSampling(Real &dx, const Real x_curv); void getNumberOfCollisionSegment(Real &dx, sofa::Size& numLines); + sofa::Size getTotalNumberOfBeams() const; + /////////////////////////// Deprecated Methods ////////////////////////////////////////// diff --git a/src/BeamAdapter/component/engine/WireRestShape.inl b/src/BeamAdapter/component/engine/WireRestShape.inl index 4d8f20eab..3fed22982 100644 --- a/src/BeamAdapter/component/engine/WireRestShape.inl +++ b/src/BeamAdapter/component/engine/WireRestShape.inl @@ -289,6 +289,17 @@ void WireRestShape::getNumberOfCollisionSegment(Real &dx, sofa::Size& dx = getLength() / numLines; } +template +sofa::Size WireRestShape::getTotalNumberOfBeams() const +{ + sofa::Size numBeams = 0; + for (sofa::Size i = 0; i < l_sectionMaterials.size(); ++i) + { + numBeams += l_sectionMaterials.get(i)->getNbBeams(); + } + + return numBeams; +} template void WireRestShape::getRestTransformOnX(Transform &global_H_local, const Real x)