Skip to content

Commit a4e5daf

Browse files
authored
Merge pull request sofa-framework#206 from fredroy/change_irc_link_mapping
[MultiAdaptiveBeamMapping] use Link instead of a string to set the controller
2 parents a774162 + fa32cf2 commit a4e5daf

2 files changed

Lines changed: 56 additions & 32 deletions

File tree

src/BeamAdapter/component/mapping/MultiAdaptiveBeamMapping.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,9 @@ class MultiAdaptiveBeamMapping : public core::Mapping<TIn, TOut>
8787
typedef InterventionalRadiologyController<TIn> TInterventionalRadiologyController;
8888

8989
public:
90+
SingleLink<MultiAdaptiveBeamMapping<TIn, TOut>, TInterventionalRadiologyController, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_controller;
91+
9092
Data<bool> useCurvAbs;
91-
Data< type::vector< std::string > > m_controlerPath;
9293
Data<bool> d_parallelMapping; /*!< flag to enable parallel internal computation of apply/applyJ for the submapping(s) AdaptiveBeamMapping */
9394

9495
MultiAdaptiveBeamMapping(core::State< In >* from, core::State< Out >* to, TInterventionalRadiologyController* _ircontroller);
@@ -105,10 +106,11 @@ class MultiAdaptiveBeamMapping : public core::Mapping<TIn, TOut>
105106
void applyJT(const core::ConstraintParams *cparams /* PARAMS FIRST */, Data<InMatrixDeriv>& out, const Data<OutMatrixDeriv>& in) override;
106107

107108

108-
virtual void init() override;
109-
virtual void bwdInit() override;
109+
void init() override;
110+
void bwdInit() override;
110111

111-
virtual void handleEvent(sofa::core::objectmodel::Event *) override;
112+
void handleEvent(sofa::core::objectmodel::Event *) override;
113+
void parse(core::objectmodel::BaseObjectDescription* arg) override;
112114

113115
void setBarycentricMapping();
114116

@@ -142,7 +144,6 @@ class MultiAdaptiveBeamMapping : public core::Mapping<TIn, TOut>
142144
// for fromSeveralInterpolations option
143145
sofa::type::vector< WireBeamInterpolation<TIn> *> m_instrumentList;
144146
sofa::type::vector< typename AdaptiveBeamMapping<TIn, TOut>::SPtr > m_subMappingList;
145-
TInterventionalRadiologyController* m_ircontroller;
146147
sofa::component::topology::container::dynamic::EdgeSetTopologyModifier* _edgeMod{nullptr};
147148
sofa::type::vector<InReal> _xPointList; //=> for each mapped point provides the local position (curv. abs.)
148149
sofa::type::vector<int> _idm_instrumentList; //=> for each mapped point provides the interpolation (in m_instrumentList)

src/BeamAdapter/component/mapping/MultiAdaptiveBeamMapping.inl

Lines changed: 50 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -48,28 +48,53 @@ using sofa::helper::ScopedAdvancedTimer;
4848
template <class TIn, class TOut>
4949
MultiAdaptiveBeamMapping< TIn, TOut>::MultiAdaptiveBeamMapping(core::State< In >* from, core::State< Out >* to, TInterventionalRadiologyController* _ircontroller)
5050
: Inherit(from, to)
51+
, l_controller(initLink("controller", "Link to the ircontroller component on scene"))
5152
, useCurvAbs(initData(&useCurvAbs,true,"useCurvAbs","true if the curvilinear abscissa of the points remains the same during the simulation if not the curvilinear abscissa moves with adaptivity and the num of segment per beam is always the same"))
52-
, m_controlerPath(initData(&m_controlerPath,"ircontroller", "Path to the ircontroller component on scene"))
5353
, d_parallelMapping(initData(&d_parallelMapping, false, "parallelMapping", "flag to enable parallel internal computation in all the submappings"))
54-
, m_ircontroller(_ircontroller)
5554
, isBarycentricMapping(false)
5655
{
57-
this->addAlias(&m_controlerPath, "controller");
56+
l_controller.set(_ircontroller);
57+
5858
}
5959

6060

6161
template <class TIn, class TOut>
6262
MultiAdaptiveBeamMapping< TIn, TOut>::MultiAdaptiveBeamMapping()
6363
: Inherit()
64+
, l_controller(initLink("controller", "Link to the ircontroller component on scene"))
6465
, useCurvAbs(initData(&useCurvAbs,true,"useCurvAbs","true if the curvilinear abscissa of the points remains the same during the simulation if not the curvilinear abscissa moves with adaptivity and the num of segment per beam is always the same"))
65-
, m_controlerPath(initData(&m_controlerPath,"ircontroller", "Path to the ircontroller component on scene"))
6666
, d_parallelMapping(initData(&d_parallelMapping, false, "parallelMapping", "flag to enable parallel internal computation in all the submappings"))
67-
, m_ircontroller(nullptr)
6867
, isBarycentricMapping(false)
6968
{
70-
this->addAlias(&m_controlerPath, "controller");
69+
7170
}
7271

72+
template <class TIn, class TOut>
73+
void MultiAdaptiveBeamMapping< TIn, TOut>::parse(core::objectmodel::BaseObjectDescription* arg)
74+
{
75+
// check for the old data name
76+
if (arg->getAttribute("ircontroller"))
77+
{
78+
msg_warning() << "Attribute 'ircontroller' has been renamed to 'controller'. ";
79+
}
80+
81+
// check if the 'old' controller attribute is not a link (i.e not starting with '@')
82+
if (arg->getAttribute("ircontroller") || arg->getAttribute("controller"))
83+
{
84+
const auto valueAttr = std::string((arg->getAttribute("ircontroller")) ? arg->getAttribute("ircontroller") : arg->getAttribute("controller"));
85+
assert(!valueAttr.empty());
86+
87+
if(valueAttr[0] != '@')
88+
{
89+
msg_warning() << "Attribute 'controller' (or 'ircontroller') is now a link, not a string anymore. The value needs to be a link (i.e starts with '@').";
90+
msg_warning() << "The current string value will be converted to a link.";
91+
arg->setAttribute("controller", std::string("@") + valueAttr);
92+
93+
}
94+
}
95+
96+
Inherit::parse(arg);
97+
}
7398

7499
template <class TIn, class TOut>
75100
void MultiAdaptiveBeamMapping< TIn, TOut>::apply(const core::MechanicalParams* mparams /* PARAMS FIRST */, Data<VecCoord>& dOut, const Data<InVecCoord>& dIn)
@@ -160,7 +185,7 @@ void MultiAdaptiveBeamMapping< TIn, TOut>::assignSubMappingFromControllerInfo()
160185
sofa::type::vector<int> removeEdgeAtPoint;
161186

162187
// 1. get the new controls
163-
m_ircontroller->interventionalRadiologyCollisionControls(_xPointList, _idm_instrumentList, removeEdgeAtPoint);
188+
l_controller->interventionalRadiologyCollisionControls(_xPointList, _idm_instrumentList, removeEdgeAtPoint);
164189

165190
if(!isBarycentricMapping)
166191
{
@@ -252,29 +277,27 @@ void MultiAdaptiveBeamMapping< TIn, TOut>::assignSubMappingFromControllerInfo()
252277
template <class TIn, class TOut>
253278
void MultiAdaptiveBeamMapping< TIn, TOut>::init()
254279
{
255-
if (m_ircontroller==nullptr)
280+
if (!l_controller)
256281
{
257-
///////// get the Adaptive Interpolation component ///////
258-
core::objectmodel::BaseContext * c = this->getContext();
259-
260-
const type::vector<std::string>& interpolName = m_controlerPath.getValue();
261-
if (interpolName.empty()) {
262-
m_ircontroller = c->get<TInterventionalRadiologyController>(core::objectmodel::BaseContext::Local);
263-
} else {
264-
m_ircontroller = c->get<TInterventionalRadiologyController>(m_controlerPath.getValue()[0]);
265-
}
266-
267-
if (m_ircontroller == nullptr) {
268-
msg_error() << " no Beam Interpolation found !!! the component can not work";
282+
msg_warning() << "The InterventionalRadiologyController has not been set, searching in the parent node...";
283+
284+
typename TInterventionalRadiologyController::SPtr ircontroller = nullptr;
285+
this->getContext()->get(ircontroller, core::objectmodel::BaseContext::SearchUp);
286+
287+
if (!ircontroller)
288+
{
289+
msg_error() << "No InterventionalRadiologyController found, this component cannot work and will be invalid.";
269290
sofa::core::objectmodel::BaseObject::d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid);
270291
return;
271292
}
272-
else {
273-
msg_info() << " interpolation named" << m_ircontroller->getName() << " found (for " << this->getName() << ")";
293+
else
294+
{
295+
l_controller.set(ircontroller);
296+
msg_warning() << "An InterventionalRadiologyController named " << l_controller->getName() << " has been found, and will be used for this component.";
274297
}
275298
}
276299

277-
m_ircontroller->getInstrumentList(m_instrumentList);
300+
l_controller->getInstrumentList(m_instrumentList);
278301

279302
// create a mapping for each instrument
280303
m_subMappingList.clear();
@@ -381,10 +404,10 @@ int MultiAdaptiveBeamMapping< TIn, TOut>::addBaryPoint(const int& edgeId,const V
381404
int returnId=this->getMechTo()[0]->getSize();
382405
this->getMechTo()[0]->resize(returnId+1);
383406

384-
assert(m_ircontroller !=nullptr && isBarycentricMapping);
385-
const type::vector<type::vector<int> >& id_instrument_curvAbs_table = m_ircontroller->get_id_instrument_curvAbs_table();
407+
assert(l_controller !=nullptr && isBarycentricMapping);
408+
const type::vector<type::vector<int> >& id_instrument_curvAbs_table = l_controller->get_id_instrument_curvAbs_table();
386409
int nbControlledEdge = static_cast<int>(id_instrument_curvAbs_table.size()) - 1;
387-
int totalNbEdges = m_ircontroller->getTotalNbEdges();
410+
int totalNbEdges = l_controller->getTotalNbEdges();
388411
int nbUnControlledEdges = totalNbEdges - nbControlledEdge;
389412
assert(nbUnControlledEdges>=0);
390413

@@ -397,7 +420,7 @@ int MultiAdaptiveBeamMapping< TIn, TOut>::addBaryPoint(const int& edgeId,const V
397420
int controledEdgeId = edgeId-nbUnControlledEdges;
398421
const sofa::type::vector<int>& id_instrument_table_on_node = id_instrument_curvAbs_table[controledEdgeId+1];
399422
sofa::type::vector< WireBeamInterpolation<In> *> m_instrumentsList;
400-
m_ircontroller->getInstrumentList(m_instrumentsList);
423+
l_controller->getInstrumentList(m_instrumentsList);
401424
Real radius = m_instrumentsList[id_instrument_table_on_node[0]]->getBeamSection(controledEdgeId)._r;
402425
int idInstrument = id_instrument_table_on_node[0];
403426
for(unsigned int i=1;i<id_instrument_table_on_node.size();i++)

0 commit comments

Comments
 (0)