CustusX  18.04
An IGT application
cxSpaceListenerImpl.cpp
Go to the documentation of this file.
1 /*=========================================================================
2 This file is part of CustusX, an Image Guided Therapy Application.
3 
4 Copyright (c) SINTEF Department of Medical Technology.
5 All rights reserved.
6 
7 CustusX is released under a BSD 3-Clause license.
8 
9 See Lisence.txt (https://github.com/SINTEFMedtek/CustusX/blob/master/License.txt) for details.
10 =========================================================================*/
11 
12 #include "cxSpaceListenerImpl.h"
13 
14 #include "cxPatientModelService.h"
15 #include "cxTrackingService.h"
16 #include "cxData.h"
17 #include "cxTool.h"
18 #include "cxActiveData.h"
19 #include "cxLogger.h"
20 #include "cxActiveToolProxy.h"
21 
22 namespace cx
23 {
24 
26 {
27  mTrackingService = trackingService;
28  mDataManager = dataManager;
29 }
30 
32 {
33 }
34 
36 {
37  this->doDisconnect();
38  mSpace = space;
39  this->doConnect();
40  emit changed();
41 }
42 
43 void SpaceListenerImpl::reconnect()
44 {
45  this->doDisconnect();
46  this->doConnect();
47  emit changed();
48 }
49 
51 {
52  return mSpace;
53 }
54 
55 void SpaceListenerImpl::doConnect()
56 {
57  if (mSpace.mId == csDATA)
58  {
59  ActiveDataPtr activeData = mDataManager->getActiveData();
60  if (mSpace.mRefObject == "active")
61  connect(activeData.get(), &ActiveData::activeDataChanged, this, &SpaceListenerImpl::reconnect);
62 
63  DataPtr data = mDataManager->getData(mSpace.mRefObject);
64  // NOTE: metrics have no own space, and thus are ignored if connected to.
65  // this breaks a loop if e.g. a dist depends on a pt and the dist becomes active.
66  if (data && !data->getSpace().isEmpty())
67  {
68  connect(data.get(), SIGNAL(transformChanged()), this, SIGNAL(changed()));
69  connect(mDataManager.get(), SIGNAL(dataAddedOrRemoved()), this, SIGNAL(changed()));
70  }
71  }
72 
73  if (mSpace.mId == csSENSOR || mSpace.mId == csTOOL || mSpace.mId == csTOOL_OFFSET)
74  {
75  if (mSpace.mRefObject == "active")
76  {
77  mActiveTool = ActiveToolProxy::New(mTrackingService);
78  connect(mActiveTool.get(), SIGNAL(toolTransformAndTimestamp(Transform3D,double)), this, SIGNAL(changed()));
79  connect(mActiveTool.get(), SIGNAL(tooltipOffset(double)), this, SIGNAL(changed()));
80  }
81  else
82  {
83  ToolPtr tool = mTrackingService->getTool(mSpace.mRefObject);
84  if (tool)
85  {
86  connect(tool.get(), SIGNAL(toolTransformAndTimestamp(Transform3D,double)), this, SIGNAL(changed()));
87  connect(tool.get(), SIGNAL(tooltipOffset(double)), this, SIGNAL(changed()));
88  }
89  }
90  connect(mDataManager.get(), SIGNAL(rMprChanged()), this, SIGNAL(changed()));
91  }
92 
93  if (mSpace.mId == csPATIENTREF)
94  {
95  connect(mDataManager.get(), SIGNAL(rMprChanged()), this, SIGNAL(changed()));
96  }
97 }
98 
99 void SpaceListenerImpl::doDisconnect()
100 {
101  if (mSpace.mId == csDATA)
102  {
103  ActiveDataPtr activeData = mDataManager->getActiveData();
104  if (mSpace.mRefObject == "active")
105  disconnect(activeData.get(), &ActiveData::activeDataChanged, this, &SpaceListenerImpl::reconnect);
106 
107  DataPtr data = mDataManager->getData(mSpace.mRefObject);
108  if (data)
109  {
110  disconnect(data.get(), SIGNAL(transformChanged()), this, SIGNAL(changed()));
111  disconnect(mDataManager.get(), SIGNAL(dataAddedOrRemoved()), this, SIGNAL(changed()));
112  }
113  }
114 
115  if (mSpace.mId == csSENSOR || mSpace.mId == csTOOL || mSpace.mId == csTOOL_OFFSET)
116  {
117  if (mActiveTool)
118  {
119  disconnect(mActiveTool.get(), SIGNAL(toolTransformAndTimestamp(Transform3D,double)), this, SIGNAL(changed()));
120  disconnect(mActiveTool.get(), SIGNAL(tooltipOffset(double)), this, SIGNAL(changed()));
121  mActiveTool.reset();
122  }
123  else
124  {
125  ToolPtr tool = mTrackingService->getTool(mSpace.mRefObject);
126  if (tool)
127  {
128  disconnect(tool.get(), SIGNAL(toolTransformAndTimestamp(Transform3D,double)), this, SIGNAL(changed()));
129  disconnect(tool.get(), SIGNAL(tooltipOffset(double)), this, SIGNAL(changed()));
130  }
131  }
132  disconnect(mDataManager.get(), SIGNAL(rMprChanged()), this, SIGNAL(changed()));
133  }
134 
135  if (mSpace.mId == csPATIENTREF)
136  {
137  disconnect(mDataManager.get(), SIGNAL(rMprChanged()), this, SIGNAL(changed()));
138  }
139 }
140 
141 } // namespace cx
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
boost::shared_ptr< class TrackingService > TrackingServicePtr
csSENSOR
a tools sensor space (s)
Definition: cxDefinitions.h:88
boost::shared_ptr< class ActiveData > ActiveDataPtr
Definition: cxColorWidget.h:21
csDATA
a datas space (d)
Definition: cxDefinitions.h:88
SpaceListenerImpl(TrackingServicePtr trackingService, PatientModelServicePtr dataManager)
COORDINATE_SYSTEM mId
the type of coordinate system
static ActiveToolProxyPtr New(TrackingServicePtr trackingService)
csPATIENTREF
the patient/tool reference space (pr)
Definition: cxDefinitions.h:88
boost::shared_ptr< class Data > DataPtr
void setSpace(CoordinateSystem space)
void activeDataChanged(const QString &uId)
boost::shared_ptr< class PatientModelService > PatientModelServicePtr
Identification of a Coordinate system.
csTOOL_OFFSET
the tool space t with a virtual offset added along the z axis. (to)
Definition: cxDefinitions.h:88
QString mRefObject
for tool, sensor and data we need a object uid to define the coordinate system
csTOOL
a tools rspace (t)
Definition: cxDefinitions.h:88
CoordinateSystem getSpace() const
Namespace for all CustusX production code.
boost::shared_ptr< class Tool > ToolPtr