Medical Imaging Interaction Toolkit  2016.11.0
Medical Imaging Interaction Toolkit
mitkUSCombinedModality.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,
6 Division of Medical and Biological Informatics.
7 All rights reserved.
8 
9 This software is distributed WITHOUT ANY WARRANTY; without
10 even the implied warranty of MERCHANTABILITY or FITNESS FOR
11 A PARTICULAR PURPOSE.
12 
13 See LICENSE.txt or http://www.mitk.org for details.
14 
15 ===================================================================*/
16 
17 #include "mitkUSCombinedModality.h"
18 #include "mitkUSDevice.h"
20 #include "mitkImageReadAccessor.h"
24 
25 // US Control Interfaces
29 
30 //Microservices
31 #include <usGetModuleContext.h>
32 #include <usModule.h>
33 #include <usServiceProperties.h>
34 #include <usModuleContext.h>
35 
36 #include <algorithm>
37 
38 //TempIncludes
39 #include <tinyxml.h>
40 
41 const std::string mitk::USCombinedModality::DeviceClassIdentifier = "org.mitk.modules.us.USCombinedModality";
44 
45 const std::string mitk::USCombinedModality::US_INTERFACE_NAME = "org.mitk.services.USCombinedModality";
46 const std::string mitk::USCombinedModality::US_PROPKEY_DEVICENAME = US_INTERFACE_NAME + ".devicename";
47 const std::string mitk::USCombinedModality::US_PROPKEY_CLASS = US_INTERFACE_NAME + ".class";
48 const std::string mitk::USCombinedModality::US_PROPKEY_ID = US_INTERFACE_NAME + ".id";
49 
50 mitk::USCombinedModality::USCombinedModality(USDevice::Pointer usDevice, NavigationDataSource::Pointer trackingDevice, std::string manufacturer, std::string model)
51  : mitk::USDevice(manufacturer, model), m_UltrasoundDevice(usDevice), m_TrackingDevice(trackingDevice),
52  m_SmoothingFilter(mitk::NavigationDataSmoothingFilter::New()), m_DelayFilter(mitk::NavigationDataDelayFilter::New(0)),
53  m_NumberOfSmoothingValues(0), m_DelayCount(0)
54 {
55  this->RebuildFilterPipeline();
56 
57  //create a new output (for the image data)
59  this->SetNthOutput(0, newOutput);
60 
61  // Combined Modality should not spawn an own acquire thread, because
62  // image acquiring is done by the included us device
63  this->SetSpawnAcquireThread(false);
64 }
65 
67 {
68  if (m_ServiceRegistration != nullptr)
69  m_ServiceRegistration.Unregister();
70  m_ServiceRegistration = 0;
71 }
72 
74 {
75  return DeviceClassIdentifier;
76 }
77 
79 {
80  if (m_UltrasoundDevice.IsNull())
81  {
82  MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null.";
83  mitkThrow() << "UltrasoundDevice must not be null.";
84  }
85 
86  return m_UltrasoundDevice->GetUSImageSource();
87 }
88 
90 {
91  if (m_UltrasoundDevice.IsNull())
92  {
93  MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null.";
94  mitkThrow() << "UltrasoundDevice must not be null.";
95  }
96 
97  return m_UltrasoundDevice->GetControlInterfaceCustom();
98 }
99 
101 {
102  if (m_UltrasoundDevice.IsNull())
103  {
104  MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null.";
105  mitkThrow() << "UltrasoundDevice must not be null.";
106  }
107 
108  return m_UltrasoundDevice->GetControlInterfaceBMode();
109 }
110 
112 {
113  if (m_UltrasoundDevice.IsNull())
114  {
115  MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null.";
116  mitkThrow() << "UltrasoundDevice must not be null.";
117  }
118 
119  return m_UltrasoundDevice->GetControlInterfaceProbes();
120 }
121 
123 {
124  if (m_UltrasoundDevice.IsNull())
125  {
126  MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null.";
127  mitkThrow() << "UltrasoundDevice must not be null.";
128  }
129 
130  return m_UltrasoundDevice->GetControlInterfaceDoppler();
131 }
132 
134 {
135  if (m_DeviceState == State_Activated) { this->Deactivate(); }
136  if (m_DeviceState == State_Connected) { this->Disconnect(); }
137 
138  if (m_ServiceRegistration != nullptr)
139  m_ServiceRegistration.Unregister();
140  m_ServiceRegistration = 0;
141 }
142 
144 {
145  return this->GetCalibration(this->GetCurrentDepthValue(), this->GetIdentifierForCurrentProbe());
146 }
147 
149 {
150  return this->GetCalibration(depth, this->GetIdentifierForCurrentProbe());
151 }
152 
154 {
155  // make sure that there is no '/' which would cause problems for TinyXML
156  std::replace(probe.begin(), probe.end(), '/', '-');
157 
158  // create identifier for calibration from probe and depth
159  std::string calibrationKey = probe + mitk::USCombinedModality::ProbeAndDepthSeperator + depth;
160 
161  // find calibration for combination of probe identifier and depth
162  std::map<std::string, mitk::AffineTransform3D::Pointer>::iterator calibrationIterator
163  = m_Calibrations.find(calibrationKey);
164 
165  if (calibrationIterator == m_Calibrations.end()) { return 0; }
166 
167  return calibrationIterator->second;
168 }
169 
171 {
172  if (calibration.IsNull())
173  {
174  MITK_WARN << "Null pointer passed to SetCalibration of mitk::USDevice. Ignoring call.";
175  return;
176  }
177 
178  std::string calibrationKey = this->GetIdentifierForCurrentCalibration();
179  if (calibrationKey.empty())
180  {
181  MITK_WARN << "Could not get a key for the calibration -> Calibration cannot be set.";
182  return;
183  }
184 
185  m_Calibrations[calibrationKey] = calibration;
186 }
187 
189 {
190  return this->RemoveCalibration(this->GetCurrentDepthValue(), this->GetIdentifierForCurrentProbe());
191 }
192 
194 {
195  return this->RemoveCalibration(depth, this->GetIdentifierForCurrentProbe());
196 }
197 
198 bool mitk::USCombinedModality::RemoveCalibration(std::string depth, std::string probe)
199 {
200  // make sure that there is no '/' which would cause problems for TinyXML
201  std::replace(probe.begin(), probe.end(), '/', '-');
202 
203  // create identifier for calibration from probe and depth
204  std::string calibrationKey = probe + mitk::USCombinedModality::ProbeAndDepthSeperator + depth;
205 
206  return m_Calibrations.erase(calibrationKey) > 0;
207 }
208 
209 void mitk::USCombinedModality::SetNumberOfSmoothingValues(unsigned int numberOfSmoothingValues)
210 {
211  unsigned int oldNumber = m_NumberOfSmoothingValues;
212  m_NumberOfSmoothingValues = numberOfSmoothingValues;
213 
214  // if filter should be activated or deactivated
215  if ((oldNumber == 0 && numberOfSmoothingValues != 0) ||
216  (oldNumber != 0 && numberOfSmoothingValues == 0))
217  {
218  this->RebuildFilterPipeline();
219  }
220  m_SmoothingFilter->SetNumerOfValues(numberOfSmoothingValues);
221 }
222 
223 void mitk::USCombinedModality::SetDelayCount(unsigned int delayCount)
224 {
225  unsigned int oldCount = m_DelayCount;
226  m_DelayCount = delayCount;
227 
228  // if filter should be activated or deactivated
229  if ((oldCount == 0 && delayCount != 0) ||
230  (oldCount != 0 && delayCount == 0))
231  {
232  this->RebuildFilterPipeline();
233  }
234  m_DelayFilter->SetDelay(delayCount);
235 }
236 
238 {
239  if (m_UltrasoundDevice.IsNull())
240  {
241  MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null.";
242  mitkThrow() << "UltrasoundDevice must not be null.";
243  }
244 
245  if (m_UltrasoundDevice->GetDeviceState() < mitk::USDevice::State_Initialized)
246  {
247  return m_UltrasoundDevice->Initialize();
248  }
249  else
250  {
251  return true;
252  }
253 }
254 
256 {
257  if (m_UltrasoundDevice.IsNull())
258  {
259  MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null.";
260  mitkThrow() << "UltrasoundDevice must not be null.";
261  }
262 
263  // connect ultrasound device only if it is not already connected
264  if (m_UltrasoundDevice->GetDeviceState() >= mitk::USDevice::State_Connected)
265  {
266  return true;
267  }
268  else
269  {
270  return m_UltrasoundDevice->Connect();
271  }
272 }
273 
275 {
276  if (m_UltrasoundDevice.IsNull())
277  {
278  MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null.";
279  mitkThrow() << "UltrasoundDevice must not be null.";
280  }
281 
282  return m_UltrasoundDevice->Disconnect();
283 }
284 
286 {
287  if (m_UltrasoundDevice.IsNull())
288  {
289  MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null.";
290  mitkThrow() << "UltrasoundDevice must not be null.";
291  }
292 
293  mitk::TrackingDeviceSource::Pointer trackingDeviceSource = dynamic_cast<mitk::TrackingDeviceSource*>(m_TrackingDevice.GetPointer());
294  if (trackingDeviceSource.IsNull())
295  {
296  MITK_WARN("USCombinedModality")("USDevice") << "Cannot start tracking as TrackingDeviceSource is null.";
297  }
298  trackingDeviceSource->StartTracking();
299 
300  // activate ultrasound device only if it is not already activated
301  if (m_UltrasoundDevice->GetDeviceState() >= mitk::USDevice::State_Activated)
302  {
303  return true;
304  }
305  else
306  {
307  return m_UltrasoundDevice->Activate();
308  }
309 }
310 
312 {
313  if (m_UltrasoundDevice.IsNull())
314  {
315  MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null.";
316  mitkThrow() << "UltrasoundDevice must not be null.";
317  }
318 
319  mitk::TrackingDeviceSource::Pointer trackingDeviceSource = dynamic_cast<mitk::TrackingDeviceSource*>(m_TrackingDevice.GetPointer());
320  if (trackingDeviceSource.IsNull())
321  {
322  MITK_WARN("USCombinedModality")("USDevice") << "Cannot stop tracking as TrackingDeviceSource is null.";
323  }
324  trackingDeviceSource->StopTracking();
325 
326  m_UltrasoundDevice->Deactivate();
327 
328  return m_UltrasoundDevice->GetIsConnected();
329 }
330 
332 {
333  mitk::TrackingDeviceSource::Pointer trackingDeviceSource = dynamic_cast<mitk::TrackingDeviceSource*>(m_TrackingDevice.GetPointer());
334  if (trackingDeviceSource.IsNull())
335  {
336  MITK_WARN("USCombinedModality")("USDevice") << "Cannot freeze tracking.";
337  }
338  else
339  {
340  if (freeze) { trackingDeviceSource->Freeze(); }
341  else { trackingDeviceSource->UnFreeze(); }
342  }
343 
344  if (m_UltrasoundDevice.IsNull())
345  {
346  MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null.";
347  mitkThrow() << "UltrasoundDevice must not be null.";
348  }
349  m_UltrasoundDevice->SetIsFreezed(freeze);
350 }
351 
353 {
354  return m_LastFilter.GetPointer();
355 }
356 
358 {
359  return m_Calibrations.find(this->GetIdentifierForCurrentCalibration()) != m_Calibrations.end();
360 }
361 
363 {
364  return !m_Calibrations.empty();
365 }
366 
368 {
369  if (m_UltrasoundDevice->GetIsFreezed()) { return; } //if the image is freezed: do nothing
370 
371  //get next image from ultrasound image source
372  mitk::Image::Pointer image = m_UltrasoundDevice->GetUSImageSource()->GetNextImage();
373 
374  if (image.IsNull() || !image->IsInitialized()) //check the image
375  {
376  MITK_WARN << "Invalid image in USCombinedModality, aborting!";
377  return;
378  }
379 
380  //get output and initialize it if it wasn't initialized before
381  mitk::Image::Pointer output = this->GetOutput();
382  if (!output->IsInitialized()) { output->Initialize(image); }
383 
384  //now update image data
385  mitk::ImageReadAccessor inputReadAccessor(image, image->GetSliceData(0, 0, 0));
386  output->SetSlice(inputReadAccessor.GetData()); //copy image data
387  output->GetGeometry()->SetSpacing(image->GetGeometry()->GetSpacing()); //copy spacing because this might also change
388 
389  //and update calibration (= transformation of the image)
390  std::string calibrationKey = this->GetIdentifierForCurrentCalibration();
391  if (!calibrationKey.empty())
392  {
393  std::map<std::string, mitk::AffineTransform3D::Pointer>::iterator calibrationIterator
394  = m_Calibrations.find(calibrationKey);
395  if (calibrationIterator != m_Calibrations.end())
396  {
397  // transform image according to callibration if one is set
398  // for current configuration of probe and depth
399  this->GetOutput()->GetGeometry()->SetIndexToWorldTransform(calibrationIterator->second);
400  }
401  }
402 }
403 
405 {
406  std::stringstream result;
407  result << "<calibrations>" << std::endl;
408  // For each calibration in the set
409  for (std::map<std::string, mitk::AffineTransform3D::Pointer>::iterator it = m_Calibrations.begin(); it != m_Calibrations.end(); it++)
410  {
411  mitk::AffineTransform3D::MatrixType matrix = it->second->GetMatrix();
412  mitk::AffineTransform3D::TranslationType translation = it->second->GetTranslation();
413  TiXmlElement elem(it->first);
414  // Serialize Matrix
415  elem.SetDoubleAttribute("M00", matrix[0][0]);
416  elem.SetDoubleAttribute("M01", matrix[0][1]);
417  elem.SetDoubleAttribute("M02", matrix[0][2]);
418  elem.SetDoubleAttribute("M10", matrix[1][0]);
419  elem.SetDoubleAttribute("M11", matrix[1][1]);
420  elem.SetDoubleAttribute("M12", matrix[1][2]);
421  elem.SetDoubleAttribute("M20", matrix[2][0]);
422  elem.SetDoubleAttribute("M21", matrix[2][1]);
423  elem.SetDoubleAttribute("M22", matrix[2][2]);
424  // Serialize Offset
425  elem.SetDoubleAttribute("T0", translation[0]);
426  elem.SetDoubleAttribute("T1", translation[1]);
427  elem.SetDoubleAttribute("T2", translation[2]);
428 
429  result << elem << std::endl;
430  }
431  result << "</calibrations>" << std::endl;
432 
433  return result.str();
434 }
435 
436 void mitk::USCombinedModality::DeserializeCalibration(const std::string& xmlString, bool clearPreviousCalibrations)
437 {
438  // Sanitize Input
439  if (xmlString == "")
440  {
441  MITK_ERROR << "Empty string passed to Deserialize() method of CombinedModality. Aborting...";
442  mitkThrow() << "Empty string passed to Deserialize() method of CombinedModality. Aborting...";
443  return;
444  }
445  // Clear previous calibrations if necessary
446  if (clearPreviousCalibrations) m_Calibrations.clear();
447 
448  // Parse Input
449  TiXmlDocument doc;
450  if (!doc.Parse(xmlString.c_str()))
451  {
452  MITK_ERROR << "Unable to deserialize calibrations in CombinedModality. Error was: " << doc.ErrorDesc();
453  mitkThrow() << "Unable to deserialize calibrations in CombinedModality. Error was: " << doc.ErrorDesc();
454  return;
455  }
456  TiXmlElement* root = doc.FirstChildElement();
457  if (root == NULL)
458  {
459  MITK_ERROR << "Unable to deserialize calibrations in CombinedModality. String contained no root element.";
460  mitkThrow() << "Unable to deserialize calibrations in CombinedModality. String contained no root element.";
461  return;
462  }
463  // Read Calibrations
464  for (TiXmlElement* elem = root->FirstChildElement(); elem != NULL; elem = elem->NextSiblingElement())
465  {
466  mitk::AffineTransform3D::MatrixType matrix;
467  mitk::AffineTransform3D::OffsetType translation;
468 
469  std::string calibName = elem->Value();
470 
471  // Deserialize Matrix
472  elem->QueryDoubleAttribute("M00", &matrix[0][0]);
473  elem->QueryDoubleAttribute("M01", &matrix[0][1]);
474  elem->QueryDoubleAttribute("M02", &matrix[0][2]);
475  elem->QueryDoubleAttribute("M10", &matrix[1][0]);
476  elem->QueryDoubleAttribute("M11", &matrix[1][1]);
477  elem->QueryDoubleAttribute("M12", &matrix[1][2]);
478  elem->QueryDoubleAttribute("M20", &matrix[2][0]);
479  elem->QueryDoubleAttribute("M21", &matrix[2][1]);
480  elem->QueryDoubleAttribute("M22", &matrix[2][2]);
481 
482  // Deserialize Offset
483  elem->QueryDoubleAttribute("T0", &translation[0]);
484  elem->QueryDoubleAttribute("T1", &translation[1]);
485  elem->QueryDoubleAttribute("T2", &translation[2]);
486 
488  calibration->SetMatrix(matrix);
489  calibration->SetTranslation(translation);
490  m_Calibrations[calibName] = calibration;
491  }
492 }
493 
495 {
496  return this->GetIdentifierForCurrentProbe()
498  + this->GetCurrentDepthValue();
499 }
500 
502 {
503  us::ServiceProperties usdeviceProperties = m_UltrasoundDevice->GetServiceProperties();
504 
505  us::ServiceProperties::const_iterator probeIt = usdeviceProperties.find(
506  mitk::USCombinedModality::GetPropertyKeys().US_PROPKEY_PROBES_SELECTED);
507 
508  // get probe identifier from control interface for probes
509  std::string probeName = mitk::USCombinedModality::DefaultProbeIdentifier;
510  if (probeIt != usdeviceProperties.end())
511  {
512  probeName = (probeIt->second).ToString();
513  }
514 
515  // make sure that there is no '/' which would cause problems for TinyXML
516  std::replace(probeName.begin(), probeName.end(), '/', '-');
517 
518  return probeName;
519 }
520 
522 {
523  us::ServiceProperties usdeviceProperties = m_UltrasoundDevice->GetServiceProperties();
524 
525  // get string for depth value from the micro service properties
526  std::string depth;
527  us::ServiceProperties::iterator depthIterator = usdeviceProperties.find(
528  mitk::USCombinedModality::GetPropertyKeys().US_PROPKEY_BMODE_DEPTH);
529 
530  if (depthIterator != usdeviceProperties.end())
531  {
532  depth = depthIterator->second.ToString();
533  }
534  else
535  {
536  depth = "0";
537  }
538 
539  return depth;
540 }
541 
543 {
544  m_LastFilter = m_TrackingDevice;
545 
546  if (m_NumberOfSmoothingValues > 0)
547  {
548  for (unsigned int i = 0; i < m_TrackingDevice->GetNumberOfOutputs(); i++)
549  {
550  m_SmoothingFilter->SetInput(i, m_LastFilter->GetOutput(i));
551  }
552  m_LastFilter = m_SmoothingFilter;
553  }
554 
555  if (m_DelayCount > 0)
556  {
557  for (unsigned int i = 0; i < m_TrackingDevice->GetNumberOfOutputs(); i++)
558  {
559  m_DelayFilter->SetInput(i, m_LastFilter->GetOutput(i));
560  }
561  m_LastFilter = m_DelayFilter;
562  }
563 }
564 
566 {
567  //Get Context
568  us::ModuleContext* context = us::GetModuleContext();
569 
570  //Define ServiceProps
571  us::ServiceProperties props;
572  mitk::UIDGenerator uidGen =
573  mitk::UIDGenerator("org.mitk.services.USCombinedModality", 16);
574  props[US_PROPKEY_ID] = uidGen.GetUID();
575  props[US_PROPKEY_DEVICENAME] = this->GetName();
576  props[US_PROPKEY_CLASS] = this->GetDeviceClass();
577 
578  m_ServiceProperties = props;
579 
580  m_ServiceRegistration = context->RegisterService(this, props);
581 }
A device holds information about it's model, make and the connected probes. It is the common super cl...
Definition: mitkUSDevice.h:77
static const std::string US_PROPKEY_DEVICENAME
bool RemoveCalibration()
Removes the calibration data of the currently active depth and probe.
virtual bool OnInitialization() override
Initializes UltrasoundDevice.
itk::SmartPointer< Self > Pointer
void DeserializeCalibration(const std::string &xmlString, bool clearPreviousCalibrations=true)
Deserializes a string provided by a prior call to Serialize(). If the bool flag is true...
virtual std::string GetDeviceClass() override
Returns the Class of the Device.
Generated unique IDs.
virtual bool OnActivation() override
Activates UltrasoundDevice.
void GenerateData() override
Grabs the next frame from the input. This method is called internally, whenever Update() is invoked b...
AffineTransform3D::Pointer GetCalibration()
Getter for calibration data of the currently active depth and probe.
#define MITK_ERROR
Definition: mitkLogMacros.h:24
USCombinedModality(USDevice::Pointer usDevice, itk::SmartPointer< NavigationDataSource > trackingDevice, std::string manufacturer="", std::string model="")
DataCollection - Class to facilitate loading/accessing structured data.
void SetCalibration(AffineTransform3D::Pointer calibration)
Sets a transformation as calibration data. Calibration data is set for the currently activated probe ...
virtual itk::SmartPointer< USControlInterfaceDoppler > GetControlInterfaceDoppler() override
Wrapper for returning doppler control interface of the UltrasoundDevice.
virtual USImageSource::Pointer GetUSImageSource() override
Wrapper for returning USImageSource of the UltrasoundDevice.
static const std::string US_PROPKEY_ID
static const std::string US_PROPKEY_CLASS
virtual void SetSpawnAcquireThread(bool _arg)
void SetNumberOfSmoothingValues(unsigned int numberOfSmoothingValues)
#define MITK_WARN
Definition: mitkLogMacros.h:23
virtual itk::SmartPointer< mitk::NavigationDataSource > GetNavigationDataSource()
#define mitkThrow()
virtual itk::SmartPointer< USAbstractControlInterface > GetControlInterfaceCustom() override
Wrapper for returning custom control interface of the UltrasoundDevice.
static const char * DefaultProbeIdentifier
void UnregisterOnService()
Remove this device from the micro service. This method is public for mitk::USCombinedModality, because this devices can be completly removed. This is not possible for API devices, which should be available while their sub module is loaded.
This filter smoothes the navigation data by calculating the mean value of the last few input values a...
virtual itk::SmartPointer< USControlInterfaceProbes > GetControlInterfaceProbes() override
Wrapper for returning probes control interface of the UltrasoundDevice.
static Pointer New()
US_UNORDERED_MAP_TYPE< std::string, Any > ServiceProperties
Connects a mitk::TrackingDevice to a MITK-IGT NavigationData-Filterpipeline.
virtual itk::SmartPointer< USControlInterfaceBMode > GetControlInterfaceBMode() override
Wrapper for returning B mode control interface of the UltrasoundDevice.
static const char * ProbeAndDepthSeperator
static const char * replace[]
This is a dictionary to replace long names of classes, modules, etc. to shorter versions in the conso...
virtual bool OnDeactivation() override
Deactivates UltrasoundDevice.
std::string GetIdentifierForCurrentCalibration()
static std::string GetName(std::string fileName, std::string suffix)
void SetDelayCount(unsigned int delayCount)
ImageReadAccessor class to get locked read access for a particular image part.
static ModuleContext * GetModuleContext()
Returns the module context of the calling module.
virtual bool OnConnection() override
Connects UltrasoundDevice.
virtual bool OnDisconnection() override
Disconnects UltrasoundDevice.
static const std::string US_INTERFACE_NAME
These Constants are used in conjunction with Microservices.
static const std::string DeviceClassIdentifier
virtual void OnFreeze(bool) override
Freezes or unfreezes UltrasoundDevice.
std::string SerializeCalibration()
Serializes all contained calibrations into an xml fragment.
static itkEventMacro(BoundingShapeInteractionEvent, itk::AnyEvent) class MITKBOUNDINGSHAPE_EXPORT BoundingShapeInteractor Pointer New()
Basic interaction methods for mitk::GeometryData.