Skip to content

Commit 44fc226

Browse files
committed
use Link instead of a string to set the controller
1 parent a774162 commit 44fc226

2 files changed

Lines changed: 57 additions & 32 deletions

File tree

src/BeamAdapter/component/mapping/MultiAdaptiveBeamMapping.h

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

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

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

107109

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

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

113116
void setBarycentricMapping();
114117

@@ -142,7 +145,6 @@ class MultiAdaptiveBeamMapping : public core::Mapping<TIn, TOut>
142145
// for fromSeveralInterpolations option
143146
sofa::type::vector< WireBeamInterpolation<TIn> *> m_instrumentList;
144147
sofa::type::vector< typename AdaptiveBeamMapping<TIn, TOut>::SPtr > m_subMappingList;
145-
TInterventionalRadiologyController* m_ircontroller;
146148
sofa::component::topology::container::dynamic::EdgeSetTopologyModifier* _edgeMod{nullptr};
147149
sofa::type::vector<InReal> _xPointList; //=> for each mapped point provides the local position (curv. abs.)
148150
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)