Medical Imaging Interaction Toolkit  2016.11.0
Medical Imaging Interaction Toolkit
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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)