Medical Imaging Interaction Toolkit  2016.11.0
Medical Imaging Interaction Toolkit
mitkContourModel.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 #include <mitkContourModel.h>
17 #include <mitkPlaneGeometry.h>
18 
19 mitk::ContourModel::ContourModel() : m_UpdateBoundingBox(true)
20 {
21  // set to initial state
22  this->InitializeEmpty();
23 }
24 
26  : mitk::BaseData(other), m_ContourSeries(other.m_ContourSeries), m_lineInterpolation(other.m_lineInterpolation)
27 {
28  m_SelectedVertex = nullptr;
29 }
30 
32 {
33  m_SelectedVertex = nullptr;
34  this->m_ContourSeries.clear(); // TODO check destruction
35 }
36 
37 void mitk::ContourModel::AddVertex(mitk::Point3D &vertex, int timestep)
38 {
39  if (!this->IsEmptyTimeStep(timestep))
40  {
41  this->AddVertex(vertex, false, timestep);
42  }
43 }
44 
45 void mitk::ContourModel::AddVertex(mitk::Point3D &vertex, bool isControlPoint, int timestep)
46 {
47  if (!this->IsEmptyTimeStep(timestep))
48  {
49  this->m_ContourSeries[timestep]->AddVertex(vertex, isControlPoint);
50  this->InvokeEvent(ContourModelSizeChangeEvent());
51  this->Modified();
52  this->m_UpdateBoundingBox = true;
53  }
54 }
55 
56 void mitk::ContourModel::AddVertex(VertexType &vertex, int timestep)
57 {
58  if (!this->IsEmptyTimeStep(timestep))
59  {
60  this->m_ContourSeries[timestep]->AddVertex(vertex);
61  this->InvokeEvent(ContourModelSizeChangeEvent());
62  this->Modified();
63  this->m_UpdateBoundingBox = true;
64  }
65 }
66 
67 void mitk::ContourModel::AddVertex(const VertexType *vertex, int timestep)
68 {
69  if (vertex != nullptr)
70  {
71  this->m_ContourSeries[timestep]->AddVertex(*const_cast<VertexType *>(vertex));
72  }
73 }
74 
76 {
77  if (!this->IsEmptyTimeStep(timestep))
78  {
79  this->AddVertexAtFront(vertex, false, timestep);
80  }
81 }
82 
83 void mitk::ContourModel::AddVertexAtFront(mitk::Point3D &vertex, bool isControlPoint, int timestep)
84 {
85  if (!this->IsEmptyTimeStep(timestep))
86  {
87  this->m_ContourSeries[timestep]->AddVertexAtFront(vertex, isControlPoint);
88  this->InvokeEvent(ContourModelSizeChangeEvent());
89  this->Modified();
90  this->m_UpdateBoundingBox = true;
91  }
92 }
93 
95 {
96  if (!this->IsEmptyTimeStep(timestep))
97  {
98  this->m_ContourSeries[timestep]->AddVertexAtFront(vertex);
99  this->InvokeEvent(ContourModelSizeChangeEvent());
100  this->Modified();
101  this->m_UpdateBoundingBox = true;
102  }
103 }
104 
105 bool mitk::ContourModel::SetVertexAt(int pointId, const Point3D &point, unsigned int timestep)
106 {
107  if (!this->IsEmptyTimeStep(timestep))
108  {
109  if (pointId >= 0 && this->m_ContourSeries[timestep]->GetSize() > pointId)
110  {
111  this->m_ContourSeries[timestep]->SetVertexAt(pointId, point);
112  this->Modified();
113  this->m_UpdateBoundingBox = true;
114  return true;
115  }
116  return false;
117  }
118  return false;
119 }
120 
121 bool mitk::ContourModel::SetVertexAt(int pointId, const VertexType *vertex, unsigned int timestep)
122 {
123  if (vertex == nullptr)
124  return false;
125 
126  if (!this->IsEmptyTimeStep(timestep))
127  {
128  if (pointId >= 0 && this->m_ContourSeries[timestep]->GetSize() > pointId)
129  {
130  this->m_ContourSeries[timestep]->SetVertexAt(pointId, vertex);
131  this->Modified();
132  this->m_UpdateBoundingBox = true;
133  return true;
134  }
135  return false;
136  }
137  return false;
138 }
139 
140 void mitk::ContourModel::InsertVertexAtIndex(mitk::Point3D &vertex, int index, bool isControlPoint, int timestep)
141 {
142  if (!this->IsEmptyTimeStep(timestep))
143  {
144  if (index >= 0 && this->m_ContourSeries[timestep]->GetSize() > index)
145  {
146  this->m_ContourSeries[timestep]->InsertVertexAtIndex(vertex, isControlPoint, index);
147  this->InvokeEvent(ContourModelSizeChangeEvent());
148  this->Modified();
149  this->m_UpdateBoundingBox = true;
150  }
151  }
152 }
153 
154 bool mitk::ContourModel::IsEmpty(int timestep) const
155 {
156  if (!this->IsEmptyTimeStep(timestep))
157  {
158  return this->m_ContourSeries[timestep]->IsEmpty();
159  }
160  return true;
161 }
162 
164 {
165  return this->IsEmpty(0);
166 }
167 
169 {
170  if (!this->IsEmptyTimeStep(timestep))
171  {
172  return this->m_ContourSeries[timestep]->GetSize();
173  }
174  return -1;
175 }
176 
178 {
179  if (!this->IsEmptyTimeStep(timestep))
180  {
181  return this->m_ContourSeries[timestep]->GetVertexAt(index);
182  }
183  return nullptr;
184 }
185 
186 int mitk::ContourModel::GetIndex(const VertexType *vertex, int timestep)
187 {
188  if (!this->IsEmptyTimeStep(timestep))
189  {
190  return this->m_ContourSeries[timestep]->GetIndex(vertex);
191  }
192  return -1;
193 }
194 
195 void mitk::ContourModel::Close(int timestep)
196 {
197  if (!this->IsEmptyTimeStep(timestep))
198  {
199  this->m_ContourSeries[timestep]->Close();
200  this->InvokeEvent(ContourModelClosedEvent());
201  this->Modified();
202  this->m_UpdateBoundingBox = true;
203  }
204 }
205 
206 void mitk::ContourModel::Open(int timestep)
207 {
208  if (!this->IsEmptyTimeStep(timestep))
209  {
210  this->m_ContourSeries[timestep]->Open();
211  this->InvokeEvent(ContourModelClosedEvent());
212  this->Modified();
213  this->m_UpdateBoundingBox = true;
214  }
215 }
216 
217 void mitk::ContourModel::SetClosed(bool isClosed, int timestep)
218 {
219  if (!this->IsEmptyTimeStep(timestep))
220  {
221  this->m_ContourSeries[timestep]->SetClosed(isClosed);
222  this->InvokeEvent(ContourModelClosedEvent());
223  this->Modified();
224  this->m_UpdateBoundingBox = true;
225  }
226 }
227 
228 bool mitk::ContourModel::IsEmptyTimeStep(unsigned int t) const
229 {
230  return (this->m_ContourSeries.size() <= t);
231 }
232 
233 bool mitk::ContourModel::IsNearContour(mitk::Point3D &point, float eps, int timestep)
234 {
235  if (!this->IsEmptyTimeStep(timestep))
236  {
237  return this->m_ContourSeries[timestep]->IsNearContour(point, eps);
238  }
239  return false;
240 }
241 
242 void mitk::ContourModel::Concatenate(mitk::ContourModel *other, int timestep, bool check)
243 {
244  if (!this->IsEmptyTimeStep(timestep))
245  {
246  if (!this->m_ContourSeries[timestep]->IsClosed())
247  {
248  this->m_ContourSeries[timestep]->Concatenate(other->m_ContourSeries[timestep], check);
249  this->InvokeEvent(ContourModelSizeChangeEvent());
250  this->Modified();
251  this->m_UpdateBoundingBox = true;
252  }
253  }
254 }
255 
257 {
258  return this->IteratorBegin(timestep);
259 }
260 
262 {
263  if (!this->IsEmptyTimeStep(timestep))
264  {
265  return this->m_ContourSeries[timestep]->IteratorBegin();
266  }
267  else
268  {
269  mitkThrow() << "No iterator at invalid timestep " << timestep << ". There are only " << this->GetTimeSteps()
270  << " timesteps available.";
271  }
272 }
273 
275 {
276  return this->IteratorEnd(timestep);
277 }
278 
280 {
281  if (!this->IsEmptyTimeStep(timestep))
282  {
283  return this->m_ContourSeries[timestep]->IteratorEnd();
284  }
285  else
286  {
287  mitkThrow() << "No iterator at invalid timestep " << timestep << ". There are only " << this->GetTimeSteps()
288  << " timesteps available.";
289  }
290 }
291 
292 bool mitk::ContourModel::IsClosed(int timestep) const
293 {
294  if (!this->IsEmptyTimeStep(timestep))
295  {
296  return this->m_ContourSeries[timestep]->IsClosed();
297  }
298  return false;
299 }
300 
301 bool mitk::ContourModel::SelectVertexAt(mitk::Point3D &point, float eps, int timestep)
302 {
303  if (!this->IsEmptyTimeStep(timestep))
304  {
305  this->m_SelectedVertex = this->m_ContourSeries[timestep]->GetVertexAt(point, eps);
306  }
307  return this->m_SelectedVertex != nullptr;
308 }
309 
310 bool mitk::ContourModel::SelectVertexAt(int index, int timestep)
311 {
312  if (!this->IsEmptyTimeStep(timestep) && index >= 0)
313  {
314  return (this->m_SelectedVertex = this->m_ContourSeries[timestep]->GetVertexAt(index));
315  }
316  return false;
317 }
318 
320 {
321  if (!this->IsEmptyTimeStep(timestep))
322  {
323  VertexType *vertex = this->m_ContourSeries[timestep]->GetVertexAt(point, eps);
324  if (vertex != nullptr)
325  {
326  vertex->IsControlPoint = true;
327  return true;
328  }
329  }
330  return false;
331 }
332 
333 bool mitk::ContourModel::SetControlVertexAt(int index, int timestep)
334 {
335  if (!this->IsEmptyTimeStep(timestep) && index >= 0)
336  {
337  VertexType *vertex = this->m_ContourSeries[timestep]->GetVertexAt(index);
338  if (vertex != nullptr)
339  {
340  vertex->IsControlPoint = true;
341  return true;
342  }
343  }
344  return false;
345 }
346 
347 bool mitk::ContourModel::RemoveVertex(const VertexType *vertex, int timestep)
348 {
349  if (!this->IsEmptyTimeStep(timestep))
350  {
351  if (this->m_ContourSeries[timestep]->RemoveVertex(vertex))
352  {
353  this->Modified();
354  this->m_UpdateBoundingBox = true;
355  this->InvokeEvent(ContourModelSizeChangeEvent());
356  return true;
357  }
358  }
359  return false;
360 }
361 
362 bool mitk::ContourModel::RemoveVertexAt(int index, int timestep)
363 {
364  if (!this->IsEmptyTimeStep(timestep))
365  {
366  if (this->m_ContourSeries[timestep]->RemoveVertexAt(index))
367  {
368  this->Modified();
369  this->m_UpdateBoundingBox = true;
370  this->InvokeEvent(ContourModelSizeChangeEvent());
371  return true;
372  }
373  }
374  return false;
375 }
376 
377 bool mitk::ContourModel::RemoveVertexAt(mitk::Point3D &point, float eps, int timestep)
378 {
379  if (!this->IsEmptyTimeStep(timestep))
380  {
381  if (this->m_ContourSeries[timestep]->RemoveVertexAt(point, eps))
382  {
383  this->Modified();
384  this->m_UpdateBoundingBox = true;
385  this->InvokeEvent(ContourModelSizeChangeEvent());
386  return true;
387  }
388  }
389  return false;
390 }
391 
393 {
394  if (this->m_SelectedVertex)
395  {
396  this->ShiftVertex(this->m_SelectedVertex, translate);
397  this->Modified();
398  this->m_UpdateBoundingBox = true;
399  }
400 }
401 
402 void mitk::ContourModel::ShiftContour(mitk::Vector3D &translate, int timestep)
403 {
404  if (!this->IsEmptyTimeStep(timestep))
405  {
406  VertexListType *vList = this->m_ContourSeries[timestep]->GetVertexList();
407  auto it = vList->begin();
408  auto end = vList->end();
409 
410  // shift all vertices
411  while (it != end)
412  {
413  this->ShiftVertex((*it), translate);
414  it++;
415  }
416 
417  this->Modified();
418  this->m_UpdateBoundingBox = true;
419  this->InvokeEvent(ContourModelShiftEvent());
420  }
421 }
422 
424 {
425  vertex->Coordinates[0] += vector[0];
426  vertex->Coordinates[1] += vector[1];
427  vertex->Coordinates[2] += vector[2];
428 }
429 
430 void mitk::ContourModel::Clear(int timestep)
431 {
432  if (!this->IsEmptyTimeStep(timestep))
433  {
434  // clear data at timestep
435  this->m_ContourSeries[timestep]->Clear();
436  this->InitializeEmpty();
437  this->Modified();
438  this->m_UpdateBoundingBox = true;
439  }
440 }
441 
442 void mitk::ContourModel::Expand(unsigned int timeSteps)
443 {
444  std::size_t oldSize = this->m_ContourSeries.size();
445 
446  if (static_cast<std::size_t>(timeSteps) > oldSize)
447  {
448  Superclass::Expand(timeSteps);
449 
450  // insert contours for each new timestep
451  for (std::size_t i = oldSize; i < static_cast<std::size_t>(timeSteps); i++)
452  {
453  m_ContourSeries.push_back(mitk::ContourElement::New());
454  }
455 
456  this->InvokeEvent(ContourModelExpandTimeBoundsEvent());
457  }
458 }
459 
461 {
462  // no support for regions
463 }
464 
466 {
467  // no support for regions
468  return false;
469 }
470 
472 {
473  // no support for regions
474  return true;
475 }
476 
478 {
479  return Superclass::GetUpdatedGeometry(t);
480 }
481 
483 {
484  return Superclass::GetGeometry(t);
485 }
486 
487 void mitk::ContourModel::SetRequestedRegion(const itk::DataObject * /*data*/)
488 {
489  // no support for regions
490 }
491 
493 {
494  // clear data and set to initial state again
495  this->ClearData();
496  this->InitializeEmpty();
497  this->Modified();
498  this->m_UpdateBoundingBox = true;
499 }
500 
502 {
503  if (!this->IsEmptyTimeStep(timestep))
504  {
505  this->m_ContourSeries[timestep]->RedistributeControlVertices(this->GetSelectedVertex(), period);
506  this->InvokeEvent(ContourModelClosedEvent());
507  this->Modified();
508  this->m_UpdateBoundingBox = true;
509  }
510 }
511 
513 {
514  // call the superclass, this releases the data of BaseData
515  Superclass::ClearData();
516 
517  // clear out the time resolved contours
518  this->m_ContourSeries.clear();
519 }
520 
522 {
523  this->InitializeEmpty();
524  this->Modified();
525  this->m_UpdateBoundingBox = true;
526 }
527 
529 {
530  mitk::TimeStepType numberOfTimesteps = other.GetTimeGeometry()->CountTimeSteps();
531  this->InitializeTimeGeometry(numberOfTimesteps);
532 
533  for (mitk::TimeStepType currentTimestep = 0; currentTimestep < numberOfTimesteps; currentTimestep++)
534  {
535  this->m_ContourSeries.push_back(mitk::ContourElement::New());
536  this->SetClosed(other.IsClosed(currentTimestep), currentTimestep);
537  }
538 
539  m_SelectedVertex = nullptr;
540  this->m_lineInterpolation = other.m_lineInterpolation;
541  this->Modified();
542  this->m_UpdateBoundingBox = true;
543 }
544 
546 {
547  // clear data at timesteps
548  this->m_ContourSeries.resize(0);
549  this->m_ContourSeries.push_back(mitk::ContourElement::New());
550 
551  // set number of timesteps to one
552  this->InitializeTimeGeometry(1);
553 
554  m_SelectedVertex = nullptr;
555  this->m_lineInterpolation = ContourModel::LINEAR;
556 }
557 
559 {
560  if (this->GetSource())
561  {
562  this->GetSource()->UpdateOutputInformation();
563  }
564 
565  if (this->m_UpdateBoundingBox)
566  {
567  // update the bounds of the geometry according to the stored vertices
568  ScalarType mitkBounds[6];
569 
570  // calculate the boundingbox at each timestep
571  typedef itk::BoundingBox<unsigned long, 3, ScalarType> BoundingBoxType;
572  typedef BoundingBoxType::PointsContainer PointsContainer;
573 
574  int timesteps = this->GetTimeSteps();
575 
576  // iterate over the timesteps
577  for (int currenTimeStep = 0; currenTimeStep < timesteps; currenTimeStep++)
578  {
579  if (dynamic_cast<mitk::PlaneGeometry *>(this->GetGeometry(currenTimeStep)))
580  {
581  // do not update bounds for 2D geometries, as they are unfortunately defined with min bounds 0!
582  return;
583  }
584  else
585  { // we have a 3D geometry -> let's update bounds
586  // only update bounds if the contour was modified
587  if (this->GetMTime() > this->GetGeometry(currenTimeStep)->GetBoundingBox()->GetMTime())
588  {
589  mitkBounds[0] = 0.0;
590  mitkBounds[1] = 0.0;
591  mitkBounds[2] = 0.0;
592  mitkBounds[3] = 0.0;
593  mitkBounds[4] = 0.0;
594  mitkBounds[5] = 0.0;
595 
597 
599 
600  auto it = this->IteratorBegin(currenTimeStep);
601  auto end = this->IteratorEnd(currenTimeStep);
602 
603  // fill the boundingbox with the points
604  while (it != end)
605  {
606  Point3D currentP = (*it)->Coordinates;
608  p.CastFrom(currentP);
609  points->InsertElement(points->Size(), p);
610 
611  it++;
612  }
613 
614  // construct the new boundingBox
615  boundingBox->SetPoints(points);
616  boundingBox->ComputeBoundingBox();
617  BoundingBoxType::BoundsArrayType tmp = boundingBox->GetBounds();
618  mitkBounds[0] = tmp[0];
619  mitkBounds[1] = tmp[1];
620  mitkBounds[2] = tmp[2];
621  mitkBounds[3] = tmp[3];
622  mitkBounds[4] = tmp[4];
623  mitkBounds[5] = tmp[5];
624 
625  // set boundingBox at current timestep
626  BaseGeometry *geometry3d = this->GetGeometry(currenTimeStep);
627  geometry3d->SetBounds(mitkBounds);
628  }
629  }
630  }
631  this->m_UpdateBoundingBox = false;
632  }
633  GetTimeGeometry()->Update();
634 }
635 
637 {
638  // not supported yet
639 }
bool RemoveVertexAt(int index, int timestep=0)
Remove a vertex at given index within the container.
mitk::Point3D PointType
ContourModel is a structure of linked vertices defining a contour in 3D space. The vertices are store...
itk::SmartPointer< Self > Pointer
virtual void UpdateOutputInformation() override
Update the OutputInformation of a ContourModel object.
void Concatenate(mitk::ContourModel *other, int timestep=0, bool check=false)
Concatenate two contours. The starting control point of the other will be added at the end of the con...
virtual void SetClosed(bool isClosed, int timestep=0)
Set closed property to given boolean.
mitk::Point3D Coordinates
Coordinates in 3D space.
void ShiftVertex(VertexType *vertex, mitk::Vector3D &vector)
virtual void Initialize() override
Initialize all data objects.
VertexIterator End(int timestep=0) const
Returns a const VertexIterator at the end element of the contour.
Base of all data objects.
Definition: mitkBaseData.h:39
virtual bool VerifyRequestedRegion() override
Inherit from base data - no region support available for contourModel objects.
Base class of all Operation-classes.
Definition: mitkOperation.h:33
double ScalarType
mitk::ContourElement::VertexIterator VertexIterator
DataCollection - Class to facilitate loading/accessing structured data.
const mitk::TimeGeometry * GetTimeGeometry() const
Return the TimeGeometry of the data as const pointer.
Definition: mitkBaseData.h:52
VertexIterator IteratorBegin(int timestep=0) const
Returns a const VertexIterator at the start element of the contour.
bool SelectVertexAt(int index, int timestep=0)
Mark a vertex at an index in the container as selected.
virtual void SetRequestedRegionToLargestPossibleRegion() override
Inherit from base data - no region support available for contourModel objects.
void AddVertex(mitk::Point3D &vertex, int timestep=0)
Add a vertex to the contour at given timestep. The vertex is added at the end of contour.
static Pointer New()
virtual bool IsNearContour(mitk::Point3D &point, float eps, int timestep)
Check if mouse cursor is near the contour.
virtual void Close(int timestep=0)
Close the contour. The last control point will be linked with the first point.
virtual const mitk::BaseGeometry * GetUpdatedGeometry(int t=0)
Get the updated geometry with recomputed bounds.
int GetIndex(const VertexType *vertex, int timestep=0)
Remove a vertex at given timestep within the container.
ContourModelSeries m_ContourSeries
virtual bool IsEmptyTimeStep(unsigned int t) const override
Check if there isn't something at this timestep.
virtual void Expand(unsigned int timeSteps) override
Expand the timebounds of the TimeGeometry to given number of timesteps.
#define mitkThrow()
virtual bool IsEmpty() const override
Returns whether the contour model is empty.
virtual void ClearData() override
reset to non-initialized state, release memory
itk::BoundingBox< unsigned long, 3, mitk::ScalarType > BoundingBoxType
virtual void SetRequestedRegion(const itk::DataObject *data) override
Inherit from base data - no region support available for contourModel objects.
void ShiftSelectedVertex(mitk::Vector3D &translate)
Shift the currently selected vertex by a translation vector.
virtual mitk::BaseGeometry * GetGeometry(int t=0) const
Get the BaseGeometry for timestep t.
std::vcl_size_t TimeStepType
void ShiftContour(mitk::Vector3D &translate, int timestep=0)
Shift the whole contour by a translation vector at given timestep.
virtual void Clear() override
Clear the storage container.
virtual void RedistributeControlVertices(int period, int timestep)
Redistributes ontrol vertices with a given period (as number of vertices)
void ExecuteOperation(Operation *operation) override
overwrite if the Data can be called by an Interactor (StateMachine).
void SetBounds(const BoundsArrayType &bounds)
Set the bounding box (in index/unit coordinates)
VertexType * m_SelectedVertex
LineSegmentInterpolation m_lineInterpolation
bool IsClosed(int timestep=0) const
Return if the contour is closed or not.
virtual void InitializeEmpty() override
Pure virtual; Must be used in subclasses to get a data object to a valid state. Should at least creat...
VertexIterator Begin(int timestep=0) const
Returns a const VertexIterator at the start element of the contour.
virtual bool RequestedRegionIsOutsideOfTheBufferedRegion() override
Inherit from base data - no region support available for contourModel objects.
MITKCORE_EXPORT const ScalarType eps
mitk::ContourElement::VertexListType VertexListType
void AddVertexAtFront(mitk::Point3D &vertex, int timestep=0)
Add a vertex to the contour at given timestep AT THE FRONT of the contour. The vertex is added at the...
void InsertVertexAtIndex(mitk::Point3D &vertex, int index, bool isControlPoint=false, int timestep=0)
Insert a vertex at given index.
bool RemoveVertex(const VertexType *vertex, int timestep=0)
Remove a vertex at given timestep within the container.
VertexIterator IteratorEnd(int timestep=0) const
Returns a const VertexIterator at the end element of the contour.
bool SetControlVertexAt(int index, int timestep=0)
Mark a vertex at an index in the container as control point.
Represents a single vertex of contour.
bool SetVertexAt(int pointId, const mitk::Point3D &point, unsigned int timestep=0)
Set a coordinates for point at given index.
BaseGeometry Describes the geometry of a data object.
virtual void Open(int timestep=0)
Set isClosed to false contour. The link between the last control point the first point will be remove...
BoundingBoxType::BoundsArrayType BoundsArrayType
virtual const VertexType * GetVertexAt(int index, int timestep=0) const
Returns the vertex at the index position within the container.
int GetNumberOfVertices(int timestep=0) const
Returns the number of vertices at a given timestep.
static itkEventMacro(BoundingShapeInteractionEvent, itk::AnyEvent) class MITKBOUNDINGSHAPE_EXPORT BoundingShapeInteractor Pointer New()
Basic interaction methods for mitk::GeometryData.