Medical Imaging Interaction Toolkit  2016.11.0
Medical Imaging Interaction Toolkit
mitkSliceNavigationController.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 
18 #include "mitkAction.h"
19 #include "mitkBaseRenderer.h"
21 #include "mitkInteractionConst.h"
22 #include "mitkOperation.h"
23 #include "mitkOperationActor.h"
24 #include "mitkPlaneGeometry.h"
26 #include "mitkRenderingManager.h"
27 #include "mitkSlicedGeometry3D.h"
28 #include "mitkVtkPropRenderer.h"
29 
30 #include "mitkImage.h"
32 #include "mitkInteractionConst.h"
34 #include "mitkOperationEvent.h"
35 #include "mitkPixelTypeMultiplex.h"
36 #include "mitkPlaneOperation.h"
37 #include "mitkPointOperation.h"
38 #include "mitkStatusBar.h"
39 #include "mitkUndoController.h"
40 
42 
43 #include "mitkMemoryUtilities.h"
44 
45 #include <itkCommand.h>
46 
47 namespace mitk
48 {
50  : BaseController(),
51  m_InputWorldGeometry3D(NULL),
52  m_InputWorldTimeGeometry(NULL),
53  m_CreatedWorldGeometry(NULL),
54  m_ViewDirection(Axial),
55  m_DefaultViewDirection(Axial),
56  m_RenderingManager(NULL),
57  m_Renderer(NULL),
58  m_Top(false),
59  m_FrontSide(false),
60  m_Rotated(false),
61  m_BlockUpdate(false),
62  m_SliceLocked(false),
63  m_SliceRotationLocked(false),
64  m_OldPos(0)
65  {
66  typedef itk::SimpleMemberCommand<SliceNavigationController> SNCCommandType;
67  SNCCommandType::Pointer sliceStepperChangedCommand, timeStepperChangedCommand;
68 
69  sliceStepperChangedCommand = SNCCommandType::New();
70  timeStepperChangedCommand = SNCCommandType::New();
71 
72  sliceStepperChangedCommand->SetCallbackFunction(this, &SliceNavigationController::SendSlice);
73 
74  timeStepperChangedCommand->SetCallbackFunction(this, &SliceNavigationController::SendTime);
75 
76  m_Slice->AddObserver(itk::ModifiedEvent(), sliceStepperChangedCommand);
77  m_Time->AddObserver(itk::ModifiedEvent(), timeStepperChangedCommand);
78 
79  m_Slice->SetUnitName("mm");
80  m_Time->SetUnitName("ms");
81 
82  m_Top = false;
83  m_FrontSide = false;
84  m_Rotated = false;
85  }
86 
89  {
90  if (geometry != NULL)
91  {
92  if (const_cast<BoundingBox *>(geometry->GetBoundingBox())->GetDiagonalLength2() < eps)
93  {
94  itkWarningMacro("setting an empty bounding-box");
95  geometry = NULL;
96  }
97  }
98  if (m_InputWorldGeometry3D != geometry)
99  {
100  m_InputWorldGeometry3D = geometry;
102  this->Modified();
103  }
104  }
105 
107  {
108  if (geometry != NULL)
109  {
110  if (const_cast<BoundingBox *>(geometry->GetBoundingBoxInWorld())->GetDiagonalLength2() < eps)
111  {
112  itkWarningMacro("setting an empty bounding-box");
113  geometry = NULL;
114  }
115  }
116  if (m_InputWorldTimeGeometry != geometry)
117  {
118  m_InputWorldTimeGeometry = geometry;
119  m_InputWorldGeometry3D = NULL;
120  this->Modified();
121  }
122  }
123 
125  {
126  mitk::RenderingManager *renderingManager = m_RenderingManager.GetPointer();
127 
128  if (renderingManager != NULL)
129  return renderingManager;
130 
131  if (m_Renderer != NULL)
132  {
133  renderingManager = m_Renderer->GetRenderingManager();
134 
135  if (renderingManager != NULL)
136  return renderingManager;
137  }
138 
140  }
141 
144  {
145  const char *viewDirectionString;
146  switch (m_ViewDirection)
147  {
149  viewDirectionString = "Axial";
150  break;
151 
153  viewDirectionString = "Sagittal";
154  break;
155 
157  viewDirectionString = "Coronal";
158  break;
159 
161  viewDirectionString = "Original";
162  break;
163 
164  default:
165  viewDirectionString = "No View Direction Available";
166  break;
167  }
168  return viewDirectionString;
169  }
170 
172  {
173  if (!m_BlockUpdate)
174  {
175  if (m_ViewDirection == Sagittal)
176  {
177  this->Update(Sagittal, true, true, false);
178  }
179  else if (m_ViewDirection == Frontal)
180  {
181  this->Update(Frontal, false, true, false);
182  }
183  else if (m_ViewDirection == Axial)
184  {
185  this->Update(Axial, false, false, true);
186  }
187  else
188  {
189  this->Update(m_ViewDirection);
190  }
191  }
192  }
193 
195  bool top,
196  bool frontside,
197  bool rotated)
198  {
200 
201  if (m_BlockUpdate || (m_InputWorldTimeGeometry.IsNull() && m_InputWorldGeometry3D.IsNull()) ||
202  ((worldTimeGeometry.IsNotNull()) && (worldTimeGeometry->CountTimeSteps() == 0)))
203  {
204  return;
205  }
206 
207  m_BlockUpdate = true;
208 
209  if (m_InputWorldTimeGeometry.IsNotNull() && m_LastUpdateTime < m_InputWorldTimeGeometry->GetMTime())
210  {
211  Modified();
212  }
213  if (m_InputWorldGeometry3D.IsNotNull() && m_LastUpdateTime < m_InputWorldGeometry3D->GetMTime())
214  {
215  Modified();
216  }
217  this->SetViewDirection(viewDirection);
218  this->SetTop(top);
219  this->SetFrontSide(frontside);
220  this->SetRotated(rotated);
221 
222  if (m_LastUpdateTime < GetMTime())
223  {
224  m_LastUpdateTime = GetMTime();
225 
226  // initialize the viewplane
227  SlicedGeometry3D::Pointer slicedWorldGeometry = NULL;
228  BaseGeometry::ConstPointer currentGeometry = NULL;
229  if (m_InputWorldTimeGeometry.IsNotNull())
230  if (m_InputWorldTimeGeometry->IsValidTimeStep(GetTime()->GetPos()))
231  currentGeometry = m_InputWorldTimeGeometry->GetGeometryForTimeStep(GetTime()->GetPos());
232  else
233  currentGeometry = m_InputWorldTimeGeometry->GetGeometryForTimeStep(0);
234  else
235  currentGeometry = m_InputWorldGeometry3D;
236 
237  m_CreatedWorldGeometry = NULL;
238  switch (viewDirection)
239  {
240  case Original:
241  if (worldTimeGeometry.IsNotNull())
242  {
243  m_CreatedWorldGeometry = worldTimeGeometry->Clone();
244 
245  worldTimeGeometry = m_CreatedWorldGeometry.GetPointer();
246 
247  slicedWorldGeometry = dynamic_cast<SlicedGeometry3D *>(
248  m_CreatedWorldGeometry->GetGeometryForTimeStep(this->GetTime()->GetPos()).GetPointer());
249 
250  if (slicedWorldGeometry.IsNotNull())
251  {
252  break;
253  }
254  }
255  else
256  {
257  const SlicedGeometry3D *worldSlicedGeometry =
258  dynamic_cast<const SlicedGeometry3D *>(currentGeometry.GetPointer());
259 
260  if (worldSlicedGeometry != NULL)
261  {
262  slicedWorldGeometry = static_cast<SlicedGeometry3D *>(currentGeometry->Clone().GetPointer());
263  break;
264  }
265  }
266  slicedWorldGeometry = SlicedGeometry3D::New();
267  slicedWorldGeometry->InitializePlanes(currentGeometry, PlaneGeometry::None, top, frontside, rotated);
268  slicedWorldGeometry->SetSliceNavigationController(this);
269  break;
270 
271  case Axial:
272  slicedWorldGeometry = SlicedGeometry3D::New();
273  slicedWorldGeometry->InitializePlanes(currentGeometry, PlaneGeometry::Axial, top, frontside, rotated);
274  slicedWorldGeometry->SetSliceNavigationController(this);
275  break;
276 
277  case Frontal:
278  slicedWorldGeometry = SlicedGeometry3D::New();
279  slicedWorldGeometry->InitializePlanes(currentGeometry, PlaneGeometry::Frontal, top, frontside, rotated);
280  slicedWorldGeometry->SetSliceNavigationController(this);
281  break;
282 
283  case Sagittal:
284  slicedWorldGeometry = SlicedGeometry3D::New();
285  slicedWorldGeometry->InitializePlanes(currentGeometry, PlaneGeometry::Sagittal, top, frontside, rotated);
286  slicedWorldGeometry->SetSliceNavigationController(this);
287  break;
288  default:
289  itkExceptionMacro("unknown ViewDirection");
290  }
291 
292  m_Slice->SetPos(0);
293  m_Slice->SetSteps((int)slicedWorldGeometry->GetSlices());
294 
295  if (m_CreatedWorldGeometry.IsNull())
296  {
297  // initialize TimeGeometry
299  }
300  if (worldTimeGeometry.IsNull())
301  {
303  dynamic_cast<ProportionalTimeGeometry *>(m_CreatedWorldGeometry.GetPointer())
304  ->Initialize(slicedWorldGeometry, 1);
305  m_Time->SetSteps(0);
306  m_Time->SetPos(0);
307  m_Time->InvalidateRange();
308  }
309  else
310  {
311  m_BlockUpdate = true;
312  m_Time->SetSteps(worldTimeGeometry->CountTimeSteps());
313  m_Time->SetPos(0);
314 
315  const TimeBounds &timeBounds = worldTimeGeometry->GetTimeBounds();
316  m_Time->SetRange(timeBounds[0], timeBounds[1]);
317 
318  m_BlockUpdate = false;
319 
320  assert(worldTimeGeometry->GetGeometryForTimeStep(this->GetTime()->GetPos()).IsNotNull());
321 
322  TimePointType minimumTimePoint = worldTimeGeometry->TimeStepToTimePoint(this->GetTime()->GetPos());
323  TimePointType stepDuration = worldTimeGeometry->TimeStepToTimePoint(this->GetTime()->GetPos() + 1) -
324  worldTimeGeometry->TimeStepToTimePoint(this->GetTime()->GetPos());
325 
326  //@todo implement for non-evenly-timed geometry!
328  dynamic_cast<ProportionalTimeGeometry *>(m_CreatedWorldGeometry.GetPointer())
329  ->Initialize(slicedWorldGeometry, worldTimeGeometry->CountTimeSteps());
330  dynamic_cast<ProportionalTimeGeometry *>(m_CreatedWorldGeometry.GetPointer())
331  ->GetMinimumTimePoint(minimumTimePoint);
332  dynamic_cast<ProportionalTimeGeometry *>(m_CreatedWorldGeometry.GetPointer())->SetStepDuration(stepDuration);
333  }
334  }
335 
336  // unblock update; we may do this now, because if m_BlockUpdate was already
337  // true before this method was entered, then we will never come here.
338  m_BlockUpdate = false;
339 
340  // Send the geometry. Do this even if nothing was changed, because maybe
341  // Update() was only called to re-send the old geometry and time/slice data.
342  this->SendCreatedWorldGeometry();
343  this->SendSlice();
344  this->SendTime();
345 
346  // Adjust the stepper range of slice stepper according to geometry
347  this->AdjustSliceStepperRange();
348  }
349 
351  {
352  // Send the geometry. Do this even if nothing was changed, because maybe
353  // Update() was only called to re-send the old geometry.
354  if (!m_BlockUpdate)
355  {
356  this->InvokeEvent(GeometrySendEvent(m_CreatedWorldGeometry, 0));
357  }
358  }
359 
361  {
362  if (!m_BlockUpdate)
363  {
364  this->InvokeEvent(GeometryUpdateEvent(m_CreatedWorldGeometry, m_Slice->GetPos()));
365  }
366  }
367 
369  {
370  if (!m_BlockUpdate)
371  {
372  if (m_CreatedWorldGeometry.IsNotNull())
373  {
374  this->InvokeEvent(GeometrySliceEvent(m_CreatedWorldGeometry, m_Slice->GetPos()));
375 
376  // send crosshair event
378 
379  // Request rendering update for all views
381  }
382  }
383  }
384 
386  {
387  if (!m_BlockUpdate)
388  {
389  if (m_CreatedWorldGeometry.IsNotNull())
390  {
391  this->InvokeEvent(GeometryTimeEvent(m_CreatedWorldGeometry, m_Time->GetPos()));
392 
393  // Request rendering update for all views
395  }
396  }
397  }
398 
399  void SliceNavigationController::SetGeometry(const itk::EventObject &) {}
400  void SliceNavigationController::SetGeometryTime(const itk::EventObject &geometryTimeEvent)
401  {
402  if (m_CreatedWorldGeometry.IsNull())
403  {
404  return;
405  }
406 
408  dynamic_cast<const SliceNavigationController::GeometryTimeEvent *>(&geometryTimeEvent);
409 
410  assert(timeEvent != NULL);
411 
412  TimeGeometry *timeGeometry = timeEvent->GetTimeGeometry();
413  assert(timeGeometry != NULL);
414 
415  int timeStep = (int)timeEvent->GetPos();
416  ScalarType timeInMS;
417  timeInMS = timeGeometry->TimeStepToTimePoint(timeStep);
418  timeStep = m_CreatedWorldGeometry->TimePointToTimeStep(timeInMS);
419  this->GetTime()->SetPos(timeStep);
420  }
421 
422  void SliceNavigationController::SetGeometrySlice(const itk::EventObject &geometrySliceEvent)
423  {
425  dynamic_cast<const SliceNavigationController::GeometrySliceEvent *>(&geometrySliceEvent);
426  assert(sliceEvent != NULL);
427 
428  this->GetSlice()->SetPos(sliceEvent->GetPos());
429  }
430 
432  {
433  if (m_CreatedWorldGeometry.IsNull())
434  {
435  return;
436  }
437 
438  //@todo add time to PositionEvent and use here!!
439  SlicedGeometry3D *slicedWorldGeometry = dynamic_cast<SlicedGeometry3D *>(
440  m_CreatedWorldGeometry->GetGeometryForTimeStep(this->GetTime()->GetPos()).GetPointer());
441 
442  if (slicedWorldGeometry)
443  {
444  int bestSlice = -1;
445  double bestDistance = itk::NumericTraits<double>::max();
446 
447  int s, slices;
448  slices = slicedWorldGeometry->GetSlices();
449  if (slicedWorldGeometry->GetEvenlySpaced())
450  {
451  mitk::PlaneGeometry *plane = slicedWorldGeometry->GetPlaneGeometry(0);
452 
453  const Vector3D &direction = slicedWorldGeometry->GetDirectionVector();
454 
455  Point3D projectedPoint;
456  plane->Project(point, projectedPoint);
457 
458  // Check whether the point is somewhere within the slice stack volume;
459  // otherwise, the defualt slice (0) will be selected
460  if (direction[0] * (point[0] - projectedPoint[0]) + direction[1] * (point[1] - projectedPoint[1]) +
461  direction[2] * (point[2] - projectedPoint[2]) >=
462  0)
463  {
464  bestSlice = (int)(plane->Distance(point) / slicedWorldGeometry->GetSpacing()[2] + 0.5);
465  }
466  }
467  else
468  {
469  Point3D projectedPoint;
470  for (s = 0; s < slices; ++s)
471  {
472  slicedWorldGeometry->GetPlaneGeometry(s)->Project(point, projectedPoint);
473  Vector3D distance = projectedPoint - point;
474  ScalarType currentDistance = distance.GetSquaredNorm();
475 
476  if (currentDistance < bestDistance)
477  {
478  bestDistance = currentDistance;
479  bestSlice = s;
480  }
481  }
482  }
483  if (bestSlice >= 0)
484  {
485  this->GetSlice()->SetPos(bestSlice);
486  }
487  else
488  {
489  this->GetSlice()->SetPos(0);
490  }
492  }
493  }
494 
496  {
497  if (m_CreatedWorldGeometry.IsNull())
498  {
499  return;
500  }
501 
502  PlaneOperation op(OpORIENT, point, normal);
503 
504  m_CreatedWorldGeometry->ExecuteOperation(&op);
505 
507  }
508 
510  const mitk::Vector3D &axisVec0,
511  const mitk::Vector3D &axisVec1)
512  {
514  {
515  PlaneOperation op(OpORIENT, point, axisVec0, axisVec1);
516  m_CreatedWorldGeometry->ExecuteOperation(&op);
517 
519  }
520  }
521 
524  {
525  if (m_CreatedWorldGeometry.IsNotNull())
526  {
527  return m_CreatedWorldGeometry->GetGeometryForTimeStep(this->GetTime()->GetPos());
528  }
529  else
530  {
531  return NULL;
532  }
533  }
534 
536  {
537  const mitk::SlicedGeometry3D *slicedGeometry =
538  dynamic_cast<const mitk::SlicedGeometry3D *>(this->GetCurrentGeometry3D());
539 
540  if (slicedGeometry)
541  {
542  const mitk::PlaneGeometry *planeGeometry = (slicedGeometry->GetPlaneGeometry(this->GetSlice()->GetPos()));
543  return planeGeometry;
544  }
545  else
546  {
547  return NULL;
548  }
549  }
550 
554  {
555  const mitk::SlicedGeometry3D *slicedGeometry =
556  dynamic_cast<const mitk::SlicedGeometry3D *>(this->GetCurrentGeometry3D());
557 
558  const Vector3D &direction = slicedGeometry->GetDirectionVector();
559 
560  int c = 0;
561  int i, k = 0;
562  for (i = 0; i < 3; ++i)
563  {
564  if (fabs(direction[i]) < 0.000000001)
565  {
566  ++c;
567  }
568  else
569  {
570  k = i;
571  }
572  }
573 
574  if (c == 2)
575  {
576  ScalarType min = slicedGeometry->GetOrigin()[k];
577  ScalarType max = min + slicedGeometry->GetExtentInMM(k);
578 
579  m_Slice->SetRange(min, max);
580  }
581  else
582  {
583  m_Slice->InvalidateRange();
584  }
585  }
586 
588  {
589  // switch on type
590  // - select best slice for a given point
591  // - rotate created world geometry according to Operation->SomeInfo()
592  if (!operation || m_CreatedWorldGeometry.IsNull())
593  {
594  return;
595  }
596 
597  switch (operation->GetOperationType())
598  {
599  case OpMOVE: // should be a point operation
600  {
601  if (!m_SliceLocked) // do not move the cross position
602  {
603  // select a slice
604  PointOperation *po = dynamic_cast<PointOperation *>(operation);
605  if (po && po->GetIndex() == -1)
606  {
607  this->SelectSliceByPoint(po->GetPoint());
608  }
609  else if (po &&
610  po->GetIndex() != -1) // undo case because index != -1, index holds the old position of this slice
611  {
612  this->GetSlice()->SetPos(po->GetIndex());
613  }
614  }
615  break;
616  }
618  {
619  m_CreatedWorldGeometry->ExecuteOperation(operation);
620 
622 
623  break;
624  }
626  {
627  m_CreatedWorldGeometry->ExecuteOperation(operation);
628 
630 
631  break;
632  }
633  default:
634  {
635  // do nothing
636  break;
637  }
638  }
639  }
640 
641 } // namespace
virtual const mitk::TimeGeometry * GetCreatedWorldGeometry()
Access the created geometry.
const Point3D GetOrigin() const
Get the origin, e.g. the upper-left corner of the plane.
virtual void SendCreatedWorldGeometry()
Send the created geometry to the connected observers (renderers)
mitk::Stepper * GetSlice()
Get the Stepper through the slices.
itk::SmartPointer< Self > Pointer
void SelectSliceByPoint(const mitk::Point3D &point)
Positions the SNC according to the specified point.
itk::FixedArray< ScalarType, 2 > TimeBounds
Standard typedef for time-bounds.
BaseRenderer * GetRenderer() const
Gets the BaseRenderer associated with this SNC (if any). While the BaseRenderer is not directly used ...
BoundingBox * GetBoundingBoxInWorld() const
Returns a bounding box that covers all time steps.
Baseclass for renderer slice-/camera-control.
Base class of all Operation-classes.
Definition: mitkOperation.h:33
static Pointer New()
void SetInputWorldTimeGeometry(const mitk::TimeGeometry *geometry)
double ScalarType
mitk::TimeGeometry::Pointer m_CreatedWorldGeometry
void ReorientSlices(const mitk::Point3D &point, const mitk::Vector3D &normal)
Re-orients the slice stack. All slices will be oriented to the given normal vector. The given point (world coordinates) defines the selected slice. Careful: The resulting axis vectors are not clearly defined this way. If you want to define them clearly, use ReorientSlices (const mitk::Point3D &point, const mitk::Vector3D &axisVec0, const mitk::Vector3D &axisVec1).
Organizes the rendering process.
DataCollection - Class to facilitate loading/accessing structured data.
ScalarType Distance(const Point3D &pt3d_mm) const
Distance of the point from the geometry (bounding-box not considered)
const mitk::Vector3D GetSpacing() const
Get the spacing (size of a pixel).
Constants for most interaction classes, due to the generic StateMachines.
virtual void SetRotated(bool _arg)
virtual void SetFrontSide(bool _arg)
unsigned long m_LastUpdateTime
mitk::RenderingManager * GetRenderingManager() const
void ExecuteOperation(Operation *operation) override
virtual void SetTop(bool _arg)
virtual void SetGeometryTime(const itk::EventObject &geometryTimeEvent)
To connect multiple SliceNavigationController, we can act as an observer ourselves: implemented inter...
virtual void SendSlice()
Send the currently selected slice to the connected observers (renderers)
virtual mitk::RenderingManager * GetRenderingManager() const
Setter for the RenderingManager that handles this instance of BaseRenderer.
virtual bool GetEvenlySpaced() const
Set/Get whether the SlicedGeometry3D is evenly-spaced (m_EvenlySpaced)
Manager for coordinating the rendering process.
static RenderingManager * GetInstance()
virtual void SetGeometry(const itk::EventObject &geometrySliceEvent)
To connect multiple SliceNavigationController, we can act as an observer ourselves: implemented inter...
Stepper::Pointer m_Slice
virtual mitk::PlaneGeometry * GetPlaneGeometry(int s) const
Returns the PlaneGeometry of the slice (s).
void SetRenderer(BaseRenderer *renderer)
Sets the BaseRenderer associated with this SNC (if any). While the BaseRenderer is not directly used ...
const mitk::PlaneGeometry * GetCurrentPlaneGeometry()
Returns the currently selected Plane in the current BaseGeometry (if existent).
virtual TimePointType TimeStepToTimePoint(TimeStepType timeStep) const =0
Converts a time step to a time point.
Operation that handles all actions on one Point.
Operation for setting a plane (defined by its origin and normal)
mitk::ScalarType TimePointType
virtual void SetPos(unsigned int pos)
Definition: mitkStepper.h:59
static T max(T x, T y)
Definition: svm.cpp:70
virtual unsigned int GetSlices() const
Get the number of slices.
Describes the geometry of a data object consisting of slices.
virtual void SendCreatedWorldGeometryUpdate()
Tell observers to re-read the currently selected 2D geometry.
void AdjustSliceStepperRange()
Adjusts the numerical range of the slice stepper according to the current geometry orientation of thi...
static T min(T x, T y)
Definition: svm.cpp:67
virtual bool Project(const mitk::Point3D &pt3d_mm, mitk::Point3D &projectedPt3d_mm) const
Project a 3D point given in mm (pt3d_mm) onto the 2D geometry. The result is a 3D point in mm (projec...
mitk::BaseGeometry::ConstPointer m_InputWorldGeometry3D
virtual const mitk::Vector3D & GetDirectionVector() const
mitk::TimeGeometry::ConstPointer m_InputWorldTimeGeometry
Stepper::Pointer m_Time
MITKCORE_EXPORT const ScalarType eps
mitk::Stepper * GetTime()
Get the Stepper through the time.
Describes a two-dimensional, rectangular plane.
const mitk::BaseGeometry * GetCurrentGeometry3D()
Returns the BaseGeometry of the currently selected time step.
mitk::RenderingManager::Pointer m_RenderingManager
virtual void SetGeometrySlice(const itk::EventObject &geometrySliceEvent)
To connect multiple SliceNavigationController, we can act as an observer ourselves: implemented inter...
OperationType GetOperationType()
void SetInputWorldGeometry3D(const mitk::BaseGeometry *geometry)
Set the input world geometry3D out of which the geometries for slicing will be created.
ScalarType GetExtentInMM(int direction) const
Get the extent of the bounding-box in the specified direction in mm.
ViewDirection
Possible view directions, Original will uses the PlaneGeometry instances in a SlicedGeometry3D provid...
virtual void Update()
Do the actual creation and send it to the connected observers (renderers)
void RequestUpdateAll(RequestType type=REQUEST_UPDATE_ALL)
BaseGeometry Describes the geometry of a data object.
virtual const BoundingBoxType * GetBoundingBox()
static itkEventMacro(BoundingShapeInteractionEvent, itk::AnyEvent) class MITKBOUNDINGSHAPE_EXPORT BoundingShapeInteractor Pointer New()
Basic interaction methods for mitk::GeometryData.
virtual void SendTime()
Send the currently selected time to the connected observers (renderers)