+ this->m_ImageActor->GetDisplayBounds( bounds );
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::Visualization::ImageSliceActors::
+ResetCursor( )
+{
+ if( this->m_ImageMapper.GetPointer( ) != NULL )
+ {
+ double pos[] =
+ {
+ this->m_VisibleBounds[ 0 ],
+ this->m_VisibleBounds[ 2 ],
+ this->m_VisibleBounds[ 4 ]
+ };
+ this->SetCursor( pos );
+ }
+ else
+ {
+ vtkPoints* points = this->m_Cursor->GetPoints( );
+ points->SetPoint( 0, 0, 0, 0 );
+ points->SetPoint( 1, 0, 0, 0 );
+ points->SetPoint( 2, 0, 0, 0 );
+ points->SetPoint( 3, 0, 0, 0 );
+ this->m_Cursor->Modified( );
+ this->m_CursorMapper->Modified( );
+ this->m_CursorActor->Modified( );
+
+ } // fi
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::Visualization::ImageSliceActors::
+SetCursor( double pos[ 3 ] )
+{
+ if( this->m_ImageMapper.GetPointer( ) == NULL )
+ return;
+
+ // Get ordered axes
+ int a0 = this->GetAxis( );
+ int a1 = ( a0 + 1 ) % 3;
+ int a2 = ( a0 + 2 ) % 3;
+ int ma0 = a0 << 1;
+ int ma1 = a1 << 1;
+ int ma2 = a2 << 1;
+
+ // Update cross
+ double* bounds = this->m_VisibleBounds;
+ double p0[ 3 ], p1[ 3 ], p2[ 3 ], p3[ 3 ];
+
+ p0[ a2 ] = p1[ a2 ] = pos[ a2 ];
+ p2[ a1 ] = p3[ a1 ] = pos[ a1 ];
+ p0[ a0 ] = p1[ a0 ] = p2[ a0 ] = p3[ a0 ] = bounds[ ma0 ];
+ p0[ a1 ] = bounds[ ma1 ];
+ p1[ a1 ] = bounds[ ma1 + 1 ];
+ p2[ a2 ] = bounds[ ma2 ];
+ p3[ a2 ] = bounds[ ma2 + 1 ];
+
+ vtkPoints* points = this->m_Cursor->GetPoints( );
+ points->SetPoint( 0, p0 );
+ points->SetPoint( 1, p1 );
+ points->SetPoint( 2, p2 );
+ points->SetPoint( 3, p3 );
+ this->m_Cursor->Modified( );
+ this->m_CursorMapper->Modified( );
+ this->m_CursorActor->Modified( );
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::Visualization::ImageSliceActors::
+ResetAxesCursor( )
+{
+ if( this->m_ImageMapper.GetPointer( ) != NULL )
+ {
+ double pos[] =
+ {
+ this->m_VisibleBounds[ 0 ],
+ this->m_VisibleBounds[ 2 ],
+ this->m_VisibleBounds[ 4 ]
+ };
+ this->SetAxesCursor( pos );
+ }
+ else
+ {
+ vtkPoints* points = this->m_Axis1->GetPoints( );
+ points->SetPoint( 0, 0, 0, 0 );
+ points->SetPoint( 1, 0, 0, 0 );
+ this->m_Axis1->Modified( );
+ this->m_Axis1Mapper->Modified( );
+ this->m_Axis1Actor->Modified( );
+
+ points = this->m_Axis2->GetPoints( );
+ points->SetPoint( 0, 0, 0, 0 );
+ points->SetPoint( 1, 0, 0, 0 );
+ this->m_Axis2->Modified( );
+ this->m_Axis2Mapper->Modified( );
+ this->m_Axis2Actor->Modified( );
+
+ } // fi
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::Visualization::ImageSliceActors::
+SetAxesCursor( double pos[ 3 ] )
+{
+ if( this->m_ImageMapper.GetPointer( ) == NULL )
+ return;
+
+ // Get ordered axes
+ int a0 = this->GetAxis( );
+ int a1 = ( a0 + 1 ) % 3;
+ int a2 = ( a0 + 2 ) % 3;
+ int ma0 = a0 << 1;
+ int ma1 = a1 << 1;
+ int ma2 = a2 << 1;
+
+ // Update cross
+ double* bounds = this->m_VisibleBounds;
+ double p0[ 3 ], p1[ 3 ], p2[ 3 ], p3[ 3 ];
+
+ p0[ a2 ] = p1[ a2 ] = pos[ a2 ];
+ p2[ a1 ] = p3[ a1 ] = pos[ a1 ];
+ p0[ a0 ] = p1[ a0 ] = p2[ a0 ] = p3[ a0 ] = bounds[ ma0 ];
+ p0[ a1 ] = bounds[ ma1 ];
+ p1[ a1 ] = bounds[ ma1 + 1 ];
+ p2[ a2 ] = bounds[ ma2 ];
+ p3[ a2 ] = bounds[ ma2 + 1 ];
+
+ vtkPoints* points1 = this->m_Axis1->GetPoints( );
+ points1->SetPoint( 0, p2 );
+ points1->SetPoint( 1, p3 );
+
+ vtkPoints* points2 = this->m_Axis2->GetPoints( );
+ points2->SetPoint( 0, p0 );
+ points2->SetPoint( 1, p1 );
+
+ this->m_Axis1->Modified( );
+ this->m_Axis1Mapper->Modified( );
+ this->m_Axis1Actor->Modified( );
+
+ this->m_Axis2->Modified( );
+ this->m_Axis2Mapper->Modified( );
+ this->m_Axis2Actor->Modified( );
+}
+
+// -------------------------------------------------------------------------
+double cpExtensions::Visualization::ImageSliceActors::
+GetMinWindow( ) const
+{
+ return( this->m_WLRange[ 0 ] );
+}
+
+// -------------------------------------------------------------------------
+double cpExtensions::Visualization::ImageSliceActors::
+GetMaxWindow( ) const
+{
+ return( this->m_WLRange[ 1 ] );
+}
+
+// -------------------------------------------------------------------------
+double cpExtensions::Visualization::ImageSliceActors::
+GetMinLevel( ) const
+{
+ return( this->m_WLRange[ 2 ] );
+}
+
+// -------------------------------------------------------------------------
+double cpExtensions::Visualization::ImageSliceActors::
+GetMaxLevel( ) const
+{
+ return( this->m_WLRange[ 3 ] );
+}
+
+// -------------------------------------------------------------------------
+double cpExtensions::Visualization::ImageSliceActors::
+GetWindow( ) const
+{
+ if( this->m_ImageActor.GetPointer( ) != NULL )
+ return( this->m_ImageActor->GetProperty( )->GetColorWindow( ) );
+ else
+ return( double( 0 ) );
+}
+
+// -------------------------------------------------------------------------
+double cpExtensions::Visualization::ImageSliceActors::
+GetLevel( ) const
+{
+ if( this->m_ImageActor.GetPointer( ) != NULL )
+ return( this->m_ImageActor->GetProperty( )->GetColorLevel( ) );
+ else
+ return( double( 0 ) );
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::Visualization::ImageSliceActors::
+SetWindow( double w )
+{
+ if( this->m_ImageActor.GetPointer( ) == NULL )
+ return;
+ double v = ( w < this->m_WLRange[ 0 ] )? this->m_WLRange[ 0 ]: w;
+ v = ( v > this->m_WLRange[ 1 ] )? this->m_WLRange[ 1 ]: v;
+ this->m_ImageActor->GetProperty( )->SetColorWindow( v );
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::Visualization::ImageSliceActors::
+SetLevel( double l )
+{
+ if( this->m_ImageActor.GetPointer( ) == NULL )
+ return;
+ double v = ( l < this->m_WLRange[ 2 ] )? this->m_WLRange[ 2 ]: l;
+ v = ( v > this->m_WLRange[ 3 ] )? this->m_WLRange[ 3 ]: v;
+ this->m_ImageActor->GetProperty( )->SetColorLevel( v );
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::Visualization::ImageSliceActors::
+SetWindowLevel( double w, double l )
+{
+ if( this->m_ImageActor.GetPointer( ) == NULL )
+ return;
+ double a = ( w < this->m_WLRange[ 0 ] )? this->m_WLRange[ 0 ]: w;
+ a = ( a > this->m_WLRange[ 1 ] )? this->m_WLRange[ 1 ]: a;
+ double b = ( l < this->m_WLRange[ 2 ] )? this->m_WLRange[ 2 ]: l;
+ b = ( b > this->m_WLRange[ 3 ] )? this->m_WLRange[ 3 ]: b;
+ this->m_ImageActor->GetProperty( )->SetColorWindow( a );
+ this->m_ImageActor->GetProperty( )->SetColorLevel( b );
+ this->UpdateText( a, b );
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::Visualization::ImageSliceActors::
+ResetWindowLevel( )
+{
+ this->SetWindowLevel(
+ this->m_WLRange[ 1 ] * double( 0.5 ),
+ ( this->m_WLRange[ 3 ] + this->m_WLRange[ 2 ] ) * double( 0.5 )
+ );