Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkIGTLMessageFactory.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #include "mitkIGTLMessageFactory.h"
14 
15 // IGT message types
16 #include "igtlImageMessage.h"
17 #include "igtlTransformMessage.h"
18 #include "igtlPositionMessage.h"
19 #include "igtlStatusMessage.h"
20 #include "igtlImageMetaMessage.h"
21 #include "igtlPointMessage.h"
22 #include "igtlTrajectoryMessage.h"
23 #include "igtlStringMessage.h"
24 #include "igtlSensorMessage.h"
25 #include "igtlBindMessage.h"
26 #include "igtlPolyDataMessage.h"
27 #include "igtlQuaternionTrackingDataMessage.h"
28 #include "igtlCapabilityMessage.h"
29 #include "igtlNDArrayMessage.h"
30 #include "igtlTrackingDataMessage.h"
31 #include "igtlColorTableMessage.h"
32 #include "igtlLabelMetaMessage.h"
33 
34 //own types
35 #include "mitkIGTLDummyMessage.h"
36 
37 #include "mitkIGTLMessageCommon.h"
38 
39 #include "itksys/SystemTools.hxx"
40 
41 //------------------------------------------------------------
42 // Define message clone classes
43 // igtlMessageHandlerClassMacro() defines a child class of
44 // igtl::MessageHandler to handle OpenIGTLink messages for
45 // the message type specified as the first argument. The
46 // second argument will be used for the name of this
47 // message handler class, while the third argument specifies
48 // a type of data that will be shared with the message functions
49 // of this handler class.
50 
51 mitkIGTMessageCloneClassMacro(igtl::TransformMessage, TransformMsgCloneHandler)
52 
53 
59 igtl::MessageBase::Pointer TransformMsgCloneHandler::Clone(igtl::MessageBase* original_)
60 {
61  bool copySuccess = false;
62  igtl::TransformMessage::Pointer clone_ = igtl::TransformMessage::New();
63 
64  //initialize the clone
65  // clone = igtl::MessageBase::New();
66 
67  igtl::TransformMessage* original = (igtl::TransformMessage*)original_;
68 
69  //copy all meta data
70  copySuccess = clone_->Copy(original);
71 
72  if (!copySuccess)
73  return nullptr;
74 
75  //copy all data that is important for this class
76  //copy the matrix
77  igtl::Matrix4x4 mat;
78  original->GetMatrix(mat);
79  clone_->SetMatrix(mat);
80 
81  //copy the normals
82  float normals[3][3];
83  original->GetNormals(normals);
84  clone_->SetNormals(normals);
85 
86  //copy the position
87  float position[3];
88  original->GetPosition(position);
89  clone_->SetPosition(position);
90 
91  return igtl::MessageBase::Pointer(clone_.GetPointer());
92 }
93 
95 {
96  //create clone handlers
97  // mitk::IGTLMessageCloneHandler::Pointer tmch = ;
98 
99  this->AddMessageNewMethod("NONE", nullptr);
100 
101  // OpenIGTLink Types V1
102  this->AddMessageNewMethod("IMAGE", (PointerToMessageBaseNew)&igtl::ImageMessage::New);
103  this->AddMessageNewMethod("TRANSFORM", (PointerToMessageBaseNew)&igtl::TransformMessage::New);
104  this->AddMessageNewMethod("POSITION", (PointerToMessageBaseNew)&igtl::PositionMessage::New);
105  this->AddMessageNewMethod("STATUS", (PointerToMessageBaseNew)&igtl::StatusMessage::New);
106  this->AddMessageNewMethod("CAPABILITY", (PointerToMessageBaseNew)&igtl::CapabilityMessage::New);
107 
108  this->AddMessageNewMethod("GET_IMAGE", (PointerToMessageBaseNew)&igtl::GetImageMessage::New);
109  this->AddMessageNewMethod("GET_TRANS", (PointerToMessageBaseNew)&igtl::GetTransformMessage::New);
110  //this->AddMessageNewMethod("GET_POS", (PointerToMessageBaseNew)&igtl::GetPositionMessage::New); //not available???
111  this->AddMessageNewMethod("GET_STATUS", (PointerToMessageBaseNew)&igtl::GetStatusMessage::New);
112 
113  // OpenIGTLink Types V2
114  this->AddMessageNewMethod("IMGMETA", (PointerToMessageBaseNew)&igtl::ImageMetaMessage::New);
115  this->AddMessageNewMethod("LBMETA", (PointerToMessageBaseNew)&igtl::LabelMetaMessage::New);
116  this->AddMessageNewMethod("COLORT", (PointerToMessageBaseNew)&igtl::ColorTableMessage::New);
117  this->AddMessageNewMethod("POINT", (PointerToMessageBaseNew)&igtl::PointMessage::New);
118  this->AddMessageNewMethod("TRAJ", (PointerToMessageBaseNew)&igtl::TrajectoryMessage::New);
119  this->AddMessageNewMethod("TDATA", (PointerToMessageBaseNew)&igtl::TrackingDataMessage::New);
120  this->AddMessageNewMethod("QTDATA", (PointerToMessageBaseNew)&igtl::QuaternionTrackingDataMessage::New);
121  this->AddMessageNewMethod("SENSOR", (PointerToMessageBaseNew)&igtl::SensorMessage::New);
122  this->AddMessageNewMethod("STRING", (PointerToMessageBaseNew)&igtl::StringMessage::New);
123  this->AddMessageNewMethod("NDARRAY", (PointerToMessageBaseNew)&igtl::NDArrayMessage::New);
124  this->AddMessageNewMethod("BIND", (PointerToMessageBaseNew)&igtl::BindMessage::New);
125  this->AddMessageNewMethod("POLYDATA", (PointerToMessageBaseNew)&igtl::PolyDataMessage::New);
126 
127  this->AddMessageNewMethod("GET_IMGMETA", (PointerToMessageBaseNew)&igtl::GetImageMetaMessage::New);
128  this->AddMessageNewMethod("GET_LBMETA", (PointerToMessageBaseNew)&igtl::GetLabelMetaMessage::New);
129  this->AddMessageNewMethod("GET_COLORT", (PointerToMessageBaseNew)&igtl::GetColorTableMessage::New);
130  this->AddMessageNewMethod("GET_POINT", (PointerToMessageBaseNew)&igtl::GetPointMessage::New);
131  this->AddMessageNewMethod("GET_TRAJ", (PointerToMessageBaseNew)&igtl::GetTrajectoryMessage::New);
132  // this->AddMessageNewMethod("GET_TDATA", (PointerToMessageBaseNew)&igtl::GetTrackingDataMessage::New); //not available???
133  // this->AddMessageNewMethod("GET_QTDATA", (PointerToMessageBaseNew)&igtl::GetQuaternionTrackingDataMessage::New); //not available???
134  // this->AddMessageNewMethod("GET_SENSOR", (PointerToMessageBaseNew)&igtl::GetSensorMessage::New); //not available???
135  // this->AddMessageNewMethod("GET_STRING", (PointerToMessageBaseNew)&igtl::GetStringMessage::New); //not available???
136  // this->AddMessageNewMethod("GET_NDARRAY", (PointerToMessageBaseNew)&igtl::GetNDArrayMessage::New); //not available???
137  this->AddMessageNewMethod("GET_BIND", (PointerToMessageBaseNew)&igtl::GetBindMessage::New);
138  this->AddMessageNewMethod("GET_POLYDATA", (PointerToMessageBaseNew)&igtl::GetPolyDataMessage::New);
139 
140  this->AddMessageNewMethod("RTS_BIND", (PointerToMessageBaseNew)&igtl::RTSBindMessage::New);
141  this->AddMessageNewMethod("RTS_QTDATA", (PointerToMessageBaseNew)&igtl::RTSQuaternionTrackingDataMessage::New);
142  this->AddMessageNewMethod("RTS_TDATA", (PointerToMessageBaseNew)&igtl::RTSTrackingDataMessage::New);
143  //todo: check if there are more RTS messages
144 
145  this->AddMessageNewMethod("STT_BIND", (PointerToMessageBaseNew)&igtl::StartBindMessage::New);
146  this->AddMessageNewMethod("STT_TDATA", (PointerToMessageBaseNew)&igtl::StartTrackingDataMessage::New);
147  this->AddMessageNewMethod("STT_QTDATA", (PointerToMessageBaseNew)&igtl::StartQuaternionTrackingDataMessage::New);
148  //todo: check if there are more STT messages
149 
150  this->AddMessageNewMethod("STP_BIND", (PointerToMessageBaseNew)&igtl::StopBindMessage::New);
151  this->AddMessageNewMethod("STP_TDATA", (PointerToMessageBaseNew)&igtl::StopTrackingDataMessage::New);
152  this->AddMessageNewMethod("STP_QTDATA", (PointerToMessageBaseNew)&igtl::StopQuaternionTrackingDataMessage::New);
153  //todo: check if there are more STP messages
154 
155  //Own Types
156  this->AddMessageNewMethod("DUMMY", (PointerToMessageBaseNew)&mitk::IGTLDummyMessage::New);
157 }
158 
160 {
161 }
162 
163 void mitk::IGTLMessageFactory::AddMessageType(std::string messageTypeName,
164  IGTLMessageFactory::PointerToMessageBaseNew messageTypeNewPointer,
165  mitk::IGTLMessageCloneHandler::Pointer cloneHandler)
166 {
167  this->AddMessageNewMethod(messageTypeName, messageTypeNewPointer);
168  this->AddMessageCloneHandler(messageTypeName, cloneHandler);
169 }
170 
171 void mitk::IGTLMessageFactory::AddMessageNewMethod(std::string messageTypeName,
172  IGTLMessageFactory::PointerToMessageBaseNew messageTypeNewPointer)
173 {
174  this->m_NewMethods[messageTypeName] = messageTypeNewPointer;
175 }
176 
178  mitk::IGTLMessageCloneHandler::Pointer cloneHandler)
179 {
180  this->m_CloneHandlers[msgTypeName] = cloneHandler;
181 }
182 
183 mitk::IGTLMessageCloneHandler::Pointer
184 mitk::IGTLMessageFactory::GetCloneHandler(std::string messageTypeName)
185 {
186  if (this->m_CloneHandlers.find(messageTypeName) !=
187  this->m_CloneHandlers.end())
188  {
189  return m_CloneHandlers[messageTypeName];
190  }
191 
192  MITK_ERROR("IGTLMessageFactory") << messageTypeName <<
193  " message type is not registered to factory!";
194 
195  mitkThrow() << messageTypeName << " message type is not registered to factory!";
196 
197  return nullptr;
198 }
199 
200 igtl::MessageBase::Pointer
201 mitk::IGTLMessageFactory::Clone(igtl::MessageBase::Pointer msg)
202 {
203  return this->GetCloneHandler(msg->GetDeviceType())->Clone(msg);
204 }
205 
208 {
209  if (this->m_NewMethods.find(messageTypeName) != this->m_NewMethods.end())
210  {
211  return m_NewMethods[messageTypeName];
212  }
213 
214  MITK_ERROR("IGTLMessageFactory") << messageTypeName <<
215  " message type is not registered to factory!";
216  return nullptr;
217 }
218 
219 igtl::MessageBase::Pointer
220 mitk::IGTLMessageFactory::CreateInstance(std::string messageTypeName)
221 {
223  this->GetMessageTypeNewPointer(messageTypeName);
224  if (newPointer != nullptr)
225  {
226  return newPointer();
227  }
228  else
229  {
230  return nullptr;
231  }
232 }
233 
234 std::list<std::string>
236 {
237  std::list<std::string> allGetMessages;
238  for (std::map<std::string, PointerToMessageBaseNew>::const_iterator it =
239  this->m_NewMethods.begin();
240  it != this->m_NewMethods.end(); ++it)
241  {
242  if (it->first.find("GET_") != std::string::npos ||
243  it->first.find("STT_") != std::string::npos ||
244  it->first.find("STP_") != std::string::npos ||
245  it->first.find("RTS_") != std::string::npos)
246  {
247  allGetMessages.push_back(it->first);
248  }
249  }
250 
251  return allGetMessages;
252 }
253 
254 igtl::MessageBase::Pointer
255 mitk::IGTLMessageFactory::CreateInstance(igtl::MessageHeader::Pointer msgHeader)
256 {
257  std::string messageType;
258 
259  //check the header
260  if (msgHeader.IsNull())
261  {
262  messageType = "NONE";
263  }
264  else
265  {
266  messageType = msgHeader->GetDeviceType();
267  }
268 
269  //make message type uppercase
270  messageType = itksys::SystemTools::UpperCase(messageType);
271 
272  //find the according new method
273  if (this->m_NewMethods.find(messageType)
274  != this->m_NewMethods.end())
275  {
276  if (this->m_NewMethods[messageType] != nullptr)
277  {
278  // Call tracker New() function if tracker not nullptr
279  return (*this->m_NewMethods[messageType])();
280  }
281  else
282  return nullptr;
283  }
284  else
285  {
286  MITK_ERROR("IGTLMessageFactory") << "Unknown IGT message type: "
287  << messageType;
288  return nullptr;
289  }
290 }
virtual IGTLMessageFactory::PointerToMessageBaseNew GetMessageTypeNewPointer(std::string messageTypeName)
Get pointer to message type new function, or nullptr if the message type not registered Usage: igtl::...
std::list< std::string > GetAvailableMessageRequestTypes()
Returns available get messages.
std::map< std::string, mitk::IGTLMessageCloneHandler::Pointer > m_CloneHandlers
Map igt message types and the Clone() methods.
std::map< std::string, PointerToMessageBaseNew > m_NewMethods
Map igt message types and the New() static methods of igtl::MessageBase classes.
#define MITK_ERROR
Definition: mitkLogMacros.h:20
igtl::MessageBase::Pointer CreateInstance(std::string messageTypeName)
Creates a new message instance fitting to the given type.
void AddMessageType(std::string messageTypeName, IGTLMessageFactory::PointerToMessageBaseNew messageTypeNewPointer, mitk::IGTLMessageCloneHandler::Pointer cloneHandler)
Add message type name and pointer to IGTL message new function and the clone handler.
#define mitkIGTMessageCloneClassMacro(messagetype, classname)
virtual void AddMessageNewMethod(std::string messageTypeName, IGTLMessageFactory::PointerToMessageBaseNew messageTypeNewPointer)
Add message type name and pointer to IGTL message new function Usage: AddMessageType("IMAGE", (PointerToMessageBaseNew)&igtl::ImageMessage::New);.
virtual void AddMessageCloneHandler(std::string msgTypeName, mitk::IGTLMessageCloneHandler::Pointer msgCloneHandler)
Adds a clone function for the specified message type.
igtl::MessageBase::Pointer(* PointerToMessageBaseNew)()
Function pointer for storing New() static methods of igtl::MessageBase classes.
#define mitkThrow()
virtual mitk::IGTLMessageCloneHandler::Pointer GetCloneHandler(std::string messageTypeName)
Get pointer to message type clone function, or nullptr if the message type is not registered Usage: i...
static mitk::PlanarFigure::Pointer Clone(mitk::PlanarFigure::Pointer original)
Pointer Clone() const