Index: Code/Controllers/mitkSliceNavigationController.cpp =================================================================== --- Code/Controllers/mitkSliceNavigationController.cpp (revision 21081) +++ Code/Controllers/mitkSliceNavigationController.cpp (working copy) @@ -84,6 +84,9 @@ m_Top = false; m_FrontSide = false; m_Rotated = false; + m_AngleOfRotation = 180; + m_KeepPlanePosition = true; + m_OrientationModified = false; } @@ -128,23 +131,18 @@ void SliceNavigationController::Update() { - if ( !m_BlockUpdate ) + if ( m_BlockUpdate ) { - if ( m_ViewDirection == Transversal ) - { - this->Update( Transversal, false, false, true ); - } - else - { - this->Update( m_ViewDirection ); - } + return; } + + this->Update( GetViewDirection( ), GetTop( ), GetFrontSide( ), GetRotated( ), GetAngleOfRotation( ) ); } void SliceNavigationController::Update( SliceNavigationController::ViewDirection viewDirection, - bool top, bool frontside, bool rotated ) + bool top, bool frontside, bool rotated, ScalarType angleOfRotation ) { const TimeSlicedGeometry* worldTimeSlicedGeometry = dynamic_cast< const TimeSlicedGeometry * >( @@ -159,6 +157,17 @@ } m_BlockUpdate = true; + + // Backup position of the plane geometry + bool backupPlanePosition = false; + mitk::Vector3D planeNormalBackup; + mitk::Point3D planeOriginBackup; + if ( m_KeepPlanePosition && GetCurrentPlaneGeometry( ) ) + { + planeNormalBackup = GetCurrentPlaneGeometry( )->GetNormal(); + planeOriginBackup = GetCurrentPlaneGeometry( )->GetOrigin(); + backupPlanePosition = true; + } if ( m_LastUpdateTime < m_InputWorldGeometry->GetMTime() ) { @@ -169,6 +178,7 @@ this->SetTop( top ); this->SetFrontSide( frontside ); this->SetRotated( rotated ); + this->SetAngleOfRotation( angleOfRotation ); if ( m_LastUpdateTime < GetMTime() ) { @@ -215,21 +225,21 @@ slicedWorldGeometry = SlicedGeometry3D::New(); slicedWorldGeometry->InitializePlanes( m_InputWorldGeometry, PlaneGeometry::Transversal, - top, frontside, rotated ); + top, frontside, rotated, m_AngleOfRotation ); slicedWorldGeometry->SetSliceNavigationController( this ); break; case Frontal: slicedWorldGeometry = SlicedGeometry3D::New(); slicedWorldGeometry->InitializePlanes( m_InputWorldGeometry, - PlaneGeometry::Frontal, top, frontside, rotated ); + PlaneGeometry::Frontal, top, frontside, rotated, m_AngleOfRotation ); slicedWorldGeometry->SetSliceNavigationController( this ); break; case Sagittal: slicedWorldGeometry = SlicedGeometry3D::New(); slicedWorldGeometry->InitializePlanes( m_InputWorldGeometry, - PlaneGeometry::Sagittal, top, frontside, rotated ); + PlaneGeometry::Sagittal, top, frontside, rotated, m_AngleOfRotation ); slicedWorldGeometry->SetSliceNavigationController( this ); break; default: @@ -273,6 +283,19 @@ } } + // Restore position of the plane geometry + if ( backupPlanePosition && m_InputWorldGeometry.IsNotNull( ) ) + { + // If orientation configuration has been modified, reset normal + if ( m_OrientationModified ) + { + planeNormalBackup = GetCurrentPlaneGeometry( )->GetNormal(); + } + ReorientSlices( planeOriginBackup, planeNormalBackup ); + } + m_OrientationModified = false; + + // unblock update; we may do this now, because if m_BlockUpdate was already // true before this method was entered, then we will never come here. m_BlockUpdate = false; @@ -692,5 +715,38 @@ return false; } +void SliceNavigationController::SetFrontSide( const bool _arg ) +{ + itkDebugMacro("setting FrontSide to " << _arg); + if (m_FrontSide != _arg) + { + m_FrontSide = _arg; + m_OrientationModified = true; + Modified(); + } +} + +void SliceNavigationController::SetTop( const bool _arg ) +{ + itkDebugMacro("setting Top to " << _arg); + if (m_Top != _arg) + { + m_Top = _arg; + m_OrientationModified = true; + Modified(); + } +} + +void SliceNavigationController::SetAngleOfRotation( const ScalarType _arg ) +{ + itkDebugMacro("setting m_AngleOfRotation to " << _arg); + if (m_AngleOfRotation != _arg) + { + m_AngleOfRotation = _arg; + m_OrientationModified = true; + Modified(); + } +} + } // namespace Index: Code/Controllers/mitkSliceNavigationController.h =================================================================== --- Code/Controllers/mitkSliceNavigationController.h (revision 21081) +++ Code/Controllers/mitkSliceNavigationController.h (working copy) @@ -202,7 +202,7 @@ * */ virtual void Update(ViewDirection viewDirection, bool top = true, - bool frontside = true, bool rotated = false); + bool frontside = true, bool rotated = false, ScalarType angleOfRotation = 0); /** * \brief Send the created geometry to the connected @@ -432,6 +432,25 @@ void AdjustSliceStepperRange(); + virtual void SetTop (const bool _arg); + itkGetMacro(Top, bool); + itkBooleanMacro(Top); + + virtual void SetFrontSide (const bool _arg); + itkGetMacro(FrontSide, bool); + itkBooleanMacro(FrontSide); + + itkSetMacro(Rotated, bool); + itkGetMacro(Rotated, bool); + itkBooleanMacro(Rotated); + + virtual void SetAngleOfRotation(const ScalarType _arg); + itkGetMacro(AngleOfRotation, ScalarType); + + itkSetMacro(KeepPlanePosition, bool); + itkGetMacro(KeepPlanePosition, bool); + itkBooleanMacro(KeepPlanePosition); + protected: SliceNavigationController(const char * type = NULL); virtual ~SliceNavigationController(); @@ -476,21 +495,14 @@ mitk::BaseRenderer *m_Renderer; - itkSetMacro(Top, bool); - itkGetMacro(Top, bool); - itkBooleanMacro(Top); - - itkSetMacro(FrontSide, bool); - itkGetMacro(FrontSide, bool); - itkBooleanMacro(FrontSide); - - itkSetMacro(Rotated, bool); - itkGetMacro(Rotated, bool); - itkBooleanMacro(Rotated); - bool m_Top; bool m_FrontSide; bool m_Rotated; + ScalarType m_AngleOfRotation; + //! Keep position and orientation of the plane after calling Update( ) + bool m_KeepPlanePosition; + //! m_Top or m_FrontSide has been modified and normal cannot be kept + bool m_OrientationModified; bool m_BlockUpdate; Index: Code/DataManagement/mitkSlicedGeometry3D.cpp =================================================================== --- Code/DataManagement/mitkSlicedGeometry3D.cpp (revision 21081) +++ Code/DataManagement/mitkSlicedGeometry3D.cpp (working copy) @@ -225,13 +225,13 @@ mitk::SlicedGeometry3D::InitializePlanes( const mitk::Geometry3D *geometry3D, mitk::PlaneGeometry::PlaneOrientation planeorientation, - bool top, bool frontside, bool rotated ) + bool top, bool frontside, bool rotated, ScalarType angleOfRotation ) { m_ReferenceGeometry = const_cast< Geometry3D * >( geometry3D ); PlaneGeometry::Pointer planeGeometry = mitk::PlaneGeometry::New(); planeGeometry->InitializeStandardPlane( - geometry3D, top, planeorientation, frontside, rotated ); + geometry3D, top, planeorientation, frontside, rotated, angleOfRotation ); ScalarType viewSpacing = 1; unsigned int slices = 1; Index: Code/DataManagement/mitkSlicedGeometry3D.h =================================================================== --- Code/DataManagement/mitkSlicedGeometry3D.h (revision 21081) +++ Code/DataManagement/mitkSlicedGeometry3D.h (working copy) @@ -236,7 +236,7 @@ */ virtual void InitializePlanes( const mitk::Geometry3D *geometry3D, mitk::PlaneGeometry::PlaneOrientation planeorientation, bool top=true, - bool frontside=true, bool rotated=false ); + bool frontside=true, bool rotated=false, ScalarType angleOfRotation = 0 ); virtual void SetImageGeometry(const bool isAnImageGeometry); Index: Code/IO/mitkPlaneGeometry.cpp =================================================================== --- Code/IO/mitkPlaneGeometry.cpp (revision 21081) +++ Code/IO/mitkPlaneGeometry.cpp (working copy) @@ -20,6 +20,7 @@ #include "mitkPlaneOperation.h" #include "mitkInteractionConst.h" #include "mitkLine.h" +#include "mitkRotationOperation.h" #include @@ -306,7 +307,7 @@ void PlaneGeometry::InitializeStandardPlane( const Geometry3D *geometry3D, PlaneOrientation planeorientation, ScalarType zPosition, - bool frontside, bool rotated ) + bool frontside, bool rotated, ScalarType angleOfRotation ) { this->SetReferenceGeometry( const_cast< Geometry3D * >( geometry3D ) ); @@ -344,7 +345,7 @@ InitializeStandardPlane( width, height, geometry3D->GetIndexToWorldTransform(), - planeorientation, zPosition, frontside, rotated ); + planeorientation, zPosition, frontside, false ); ScalarType bounds[6]= { 0, width, 0, height, 0, 1 }; this->SetBounds( bounds ); @@ -355,12 +356,24 @@ origin = GetOrigin() + originVector; SetOrigin(origin); + + if ( rotated && angleOfRotation != 0 ) + { + mitk::Point3D center = GetReferenceGeometry( )->GetOrigin( ); + center[ 0 ] = ( boundsarray[ 0 ] + boundsarray[ 1 ] ) / 2 * GetReferenceGeometry( )->GetSpacing( )[ 0 ]; + center[ 1 ] = ( boundsarray[ 2 ] + boundsarray[ 3 ] ) / 2 * GetReferenceGeometry( )->GetSpacing( )[ 1 ]; + center[ 2 ] = ( boundsarray[ 4 ] + boundsarray[ 5 ] ) / 2 * GetReferenceGeometry( )->GetSpacing( )[ 2 ]; + Vector3D axisOfRotation = GetAxisVector(2); + ScalarType angle = angleOfRotation; + mitk::RotationOperation op(mitk::OpROTATE, center, axisOfRotation, angle); + ExecuteOperation( &op ); + } } void PlaneGeometry::InitializeStandardPlane( const Geometry3D *geometry3D, - bool top, PlaneOrientation planeorientation, bool frontside, bool rotated ) + bool top, PlaneOrientation planeorientation, bool frontside, bool rotated, ScalarType angleOfRotation ) { ScalarType zPosition; @@ -380,7 +393,7 @@ } InitializeStandardPlane( geometry3D, planeorientation, - zPosition, frontside, rotated ); + zPosition, frontside, rotated, angleOfRotation ); } Index: Code/IO/mitkPlaneGeometry.h =================================================================== --- Code/IO/mitkPlaneGeometry.h (revision 21081) +++ Code/IO/mitkPlaneGeometry.h (working copy) @@ -77,7 +77,7 @@ */ virtual void InitializeStandardPlane( const Geometry3D* geometry3D, PlaneOrientation planeorientation = Transversal, ScalarType zPosition = 0, - bool frontside=true, bool rotated=false ); + bool frontside=true, bool rotated=false, ScalarType angleOfRotation = 0 ); /** @@ -90,7 +90,7 @@ */ virtual void InitializeStandardPlane( const Geometry3D* geometry3D, bool top, PlaneOrientation planeorientation = Transversal, - bool frontside=true, bool rotated=false ); + bool frontside=true, bool rotated=false, ScalarType angleOfRotation = 0 ); /**