#include #include #include #include #include #include #include // ------------------------------------------------------------------------- vtkCxxSetObjectMacro( cpExtensions::Interaction::ImageSlicePointPlacer, ImageSlice, vtkImageSlice ); // ------------------------------------------------------------------------- cpExtensions::Interaction::ImageSlicePointPlacer:: Self* cpExtensions::Interaction::ImageSlicePointPlacer:: New( ) { return( new Self( ) ); } // ------------------------------------------------------------------------- int cpExtensions::Interaction::ImageSlicePointPlacer:: ComputeWorldPosition( vtkRenderer* ren, double displayPos[ 2 ], double worldPos[ 3 ], double worldOrient[ 9 ] ) { if( !this->UpdateInternalState( ) ) return( 0 ); return( this->Placer->ComputeWorldPosition( ren, displayPos, worldPos, worldOrient ) ); } // ------------------------------------------------------------------------- int cpExtensions::Interaction::ImageSlicePointPlacer:: ComputeWorldPosition( vtkRenderer* ren, double displayPos[ 2 ], double refWorldPos[ 2 ], double worldPos[ 3 ], double worldOrient[ 9 ] ) { if( !this->UpdateInternalState( ) ) return( 0 ); return( this->Placer->ComputeWorldPosition( ren, displayPos, refWorldPos, worldPos, worldOrient ) ); } // ------------------------------------------------------------------------- int cpExtensions::Interaction::ImageSlicePointPlacer:: ValidateWorldPosition( double worldPos[ 3 ] ) { if( !this->UpdateInternalState( ) ) return( 0 ); return( this->Placer->ValidateWorldPosition( worldPos ) ); } // ------------------------------------------------------------------------- int cpExtensions::Interaction::ImageSlicePointPlacer:: ValidateWorldPosition( double worldPos[ 3 ], double worldOrient[ 9 ] ) { if( !this->UpdateInternalState( ) ) return( 0 ); return( this->Placer->ValidateWorldPosition( worldPos, worldOrient ) ); } // ------------------------------------------------------------------------- int cpExtensions::Interaction::ImageSlicePointPlacer:: UpdateWorldPosition( vtkRenderer* ren, double worldPos[ 3 ], double worldOrient[ 9 ] ) { if( !this->UpdateInternalState( ) ) return( 0 ); return( this->Placer->UpdateWorldPosition( ren, worldPos, worldOrient ) ); } // ------------------------------------------------------------------------- int cpExtensions::Interaction::ImageSlicePointPlacer:: UpdateInternalState( ) { if( !this->ImageSlice ) return( 0 ); vtkImageData* input = this->ImageSlice->GetMapper( )->GetInput( ); if( !input ) return( 0 ); double spacing[ 3 ]; input->GetSpacing( spacing ); double origin[ 3 ]; input->GetOrigin( origin ); double b[ 6 ]; this->ImageSlice->GetBounds( b ); if( this->Bounds[ 0 ] != VTK_DOUBLE_MAX) { b[ 0 ] = ( b[ 0 ] < this->Bounds[ 0 ] )? this->Bounds[ 0 ] : b[ 0 ]; b[ 1 ] = ( b[ 1 ] > this->Bounds[ 1 ] )? this->Bounds[ 1 ] : b[ 1 ]; b[ 2 ] = ( b[ 2 ] < this->Bounds[ 2 ] )? this->Bounds[ 2 ] : b[ 2 ]; b[ 3 ] = ( b[ 3 ] > this->Bounds[ 3 ] )? this->Bounds[ 3 ] : b[ 3 ]; b[ 4 ] = ( b[ 4 ] < this->Bounds[ 4 ] )? this->Bounds[ 4 ] : b[ 4 ]; b[ 5 ] = ( b[ 5 ] > this->Bounds[ 5 ] )? this->Bounds[ 5 ] : b[ 5 ]; } // fi int displayExtent[ 6 ] = { 0, 1, 0, 1, 0, 1 }; input->GetExtent( displayExtent ); auto mapper = dynamic_cast< cpExtensions::Visualization::ImageSliceMapper* >( this->ImageSlice->GetMapper( ) ); if( mapper != NULL ) { auto ori = mapper->GetOrientation( ); displayExtent[ ( ori << 1 ) + 1 ] = displayExtent[ ori << 1 ] = mapper->GetSliceNumber( ); } // fi int axis; double position; if( displayExtent[ 0 ] == displayExtent[ 1 ] ) { axis = vtkBoundedPlanePointPlacer::XAxis; position = origin[ 0 ] + displayExtent[ 0 ] * spacing[ 0 ]; } else if( displayExtent[ 2 ] == displayExtent[ 3 ] ) { axis = vtkBoundedPlanePointPlacer::YAxis; position = origin[ 1 ] + displayExtent[ 2 ] * spacing[ 1 ]; } else if( displayExtent[ 4 ] == displayExtent[ 5 ] ) { axis = vtkBoundedPlanePointPlacer::ZAxis; position = origin[ 2 ] + displayExtent[ 4 ] * spacing[ 2 ]; } else { vtkErrorMacro( "Incorrect display extent in Image Slice" ); return( 0 ); } // fi if( axis != this->Placer->GetProjectionNormal( ) || position != this->Placer->GetProjectionPosition( ) || b[ 0 ] != this->SavedBounds[ 0 ] || b[ 1 ] != this->SavedBounds[ 1 ] || b[ 2 ] != this->SavedBounds[ 2 ] || b[ 3 ] != this->SavedBounds[ 3 ] || b[ 4 ] != this->SavedBounds[ 4 ] || b[ 5 ] != this->SavedBounds[ 5 ] ) { this->SavedBounds[ 0 ] = b[ 0 ]; this->SavedBounds[ 1 ] = b[ 1 ]; this->SavedBounds[ 2 ] = b[ 2 ]; this->SavedBounds[ 3 ] = b[ 3 ]; this->SavedBounds[ 4 ] = b[ 4 ]; this->SavedBounds[ 5 ] = b[ 5 ]; this->Placer->SetProjectionNormal( axis ); this->Placer->SetProjectionPosition( position ); this->Placer->RemoveAllBoundingPlanes( ); vtkPlane* plane; if( axis != vtkBoundedPlanePointPlacer::XAxis ) { plane = vtkPlane::New( ); plane->SetOrigin( b[ 0 ], b[ 2 ], b[ 4 ] ); plane->SetNormal( 1.0, 0.0, 0.0 ); this->Placer->AddBoundingPlane( plane ); plane->Delete( ); plane = vtkPlane::New(); plane->SetOrigin( b[ 1 ], b[ 3 ], b[ 5 ] ); plane->SetNormal( -1.0, 0.0, 0.0 ); this->Placer->AddBoundingPlane( plane ); plane->Delete( ); } // fi if( axis != vtkBoundedPlanePointPlacer::YAxis ) { plane = vtkPlane::New( ); plane->SetOrigin( b[ 0 ], b[ 2 ], b[ 4 ] ); plane->SetNormal( 0.0, 1.0, 0.0 ); this->Placer->AddBoundingPlane( plane ); plane->Delete( ); plane = vtkPlane::New( ); plane->SetOrigin( b[ 1 ], b[ 3 ], b[ 5 ] ); plane->SetNormal( 0.0, -1.0, 0.0 ); this->Placer->AddBoundingPlane( plane ); plane->Delete( ); } // fi if( axis != vtkBoundedPlanePointPlacer::ZAxis ) { plane = vtkPlane::New( ); plane->SetOrigin( b[ 0 ], b[ 2 ], b[ 4 ] ); plane->SetNormal( 0.0, 0.0, 1.0 ); this->Placer->AddBoundingPlane( plane ); plane->Delete( ); plane = vtkPlane::New( ); plane->SetOrigin( b[ 1 ], b[ 3 ], b[ 5 ] ); plane->SetNormal( 0.0, 0.0, -1.0 ); this->Placer->AddBoundingPlane( plane ); plane->Delete( ); } // fi this->Modified( ); } // fi return( 1 ); } // ------------------------------------------------------------------------- void cpExtensions::Interaction::ImageSlicePointPlacer:: SetWorldTolerance( double tol ) { double t = ( tol < 0.0 )? 0.0: ( ( tol > VTK_DOUBLE_MAX )? VTK_DOUBLE_MAX: tol ); if( this->WorldTolerance != t ) { this->WorldTolerance = t; this->Placer->SetWorldTolerance( tol ); this->Modified( ); } // fi } // ------------------------------------------------------------------------- cpExtensions::Interaction::ImageSlicePointPlacer:: ImageSlicePointPlacer( ) : Superclass( ) { this->Placer = vtkBoundedPlanePointPlacer::New( ); this->ImageSlice = NULL; this->SavedBounds[ 0 ] = 0.0; this->SavedBounds[ 1 ] = 0.0; this->SavedBounds[ 2 ] = 0.0; this->SavedBounds[ 3 ] = 0.0; this->SavedBounds[ 4 ] = 0.0; this->SavedBounds[ 5 ] = 0.0; this->Bounds[ 0 ] = this->Bounds[ 2 ] = this->Bounds[ 4 ] = VTK_DOUBLE_MAX; this->Bounds[ 1 ] = this->Bounds[ 3 ] = this->Bounds[ 5 ] = VTK_DOUBLE_MIN; } // ------------------------------------------------------------------------- cpExtensions::Interaction::ImageSlicePointPlacer:: ~ImageSlicePointPlacer( ) { this->Placer->Delete( ); this->SetImageSlice( NULL ); } // eof - $RCSfile$