X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FVTK%2FImage3DObserver.hxx;h=46ef743729d70197309dd18c9f505a1b395138f3;hb=d3bb16bf060b7249a9ed1a49e6b118ca9394a22a;hp=e79bbbe24dc5e99e3badf6febd3fea399042193e;hpb=58beec8ea1d7265ffa6a8842f6a56fc3c0706524;p=FrontAlgorithms.git diff --git a/lib/fpa/VTK/Image3DObserver.hxx b/lib/fpa/VTK/Image3DObserver.hxx index e79bbbe..46ef743 100644 --- a/lib/fpa/VTK/Image3DObserver.hxx +++ b/lib/fpa/VTK/Image3DObserver.hxx @@ -1,85 +1,26 @@ #ifndef __FPA__VTK__IMAGE3DOBSERVER__HXX__ #define __FPA__VTK__IMAGE3DOBSERVER__HXX__ +#include + #include +#include +#include #include -#include #include #include + /* #include - #include - #include - #include + #include */ // ------------------------------------------------------------------------- template< class F, class R > void fpa::VTK::Image3DObserver< F, R >:: -SetImage( const TImage* img, R* rw ) +SetRenderWindow( R* rw ) { - this->m_Image = img; this->m_RenderWindow = rw; - this->m_Vertices.clear( ); - - /* - unsigned int minD = TImage::ImageDimension; - minD = ( minD < 3 )? minD: 3; - - int e[ 6 ] = { 0 }; - typename TImage::RegionType reg = this->m_Image->GetRequestedRegion( ); - for( unsigned int i = 0; i < minD; i++ ) - { - e[ ( i << 1 ) + 0 ] = reg.GetIndex( )[ i ]; - e[ ( i << 1 ) + 1 ] = reg.GetIndex( )[ i ] + reg.GetSize( )[ i ] - 1; - - } // rof - - typename TImage::SpacingType spac = this->m_Image->GetSpacing( ); - double s[ 3 ] = { 1, 1, 1 }; - for( unsigned int i = 0; i < minD; i++ ) - s[ i ] = double( spac[ i ] ); - - typename TImage::PointType orig = this->m_Image->GetOrigin( ); - double o[ 3 ] = { 0 }; - for( unsigned int i = 0; i < minD; i++ ) - o[ i ] = double( orig[ i ] ); - - this->m_Stencil->SetExtent( e ); - this->m_Stencil->SetSpacing( s ); - this->m_Stencil->SetOrigin( o ); - this->m_Stencil->AllocateScalars( VTK_UNSIGNED_CHAR, 4 ); - for( unsigned int i = 0; i < 3; i++ ) - this->m_Stencil->GetPointData( )-> - GetScalars( )->FillComponent( i, 255 ); - this->m_Stencil->GetPointData( )->GetScalars( )->FillComponent( 3, 0 ); - - this->m_StencilActor->SetInputData( this->m_Stencil ); - this->m_StencilActor->InterpolateOff( ); - */ - - double nPix = - double( this->m_Image->GetRequestedRegion( ).GetNumberOfPixels( ) ); - this->m_Percentage = ( unsigned long )( nPix * 0.001 ); - this->m_Number = 0; - - if( this->m_RenderWindow != NULL ) - { - vtkRenderer* ren = - this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( ); - ren->AddActor( this->m_PolyDataActor ); - this->Render( ); - - } // fi -} - -// ------------------------------------------------------------------------- -template< class F, class R > -void fpa::VTK::Image3DObserver< F, R >:: -Render( ) -{ - if( this->m_RenderWindow != NULL ) - this->m_RenderWindow->Render( ); } // ------------------------------------------------------------------------- @@ -87,90 +28,162 @@ template< class F, class R > void fpa::VTK::Image3DObserver< F, R >:: Execute( const itk::Object* c, const itk::EventObject& e ) { - typedef typename TImage::IndexType TIndex; - typedef typename TImage::PointType TPoint; - typedef typename TFilter::TEvent TEvent; - typedef typename TFilter::TFrontEvent TFrontEvent; - typedef typename TFilter::TMarkEvent TMarkEvent; - typedef typename TFilter::TCollisionEvent TCollisionEvent; - typedef typename TFilter::TEndEvent TEndEvent; - + typedef itk::ImageBase< 3 > _TImage; + typedef typename F::TEvent _TEvent; + typedef typename F::TFrontEvent _TFrontEvent; + typedef typename F::TMarkEvent _TMarkEvent; + typedef typename F::TCollisionEvent _TCollisionEvent; + typedef typename F::TEndEvent _TEndEvent; + typedef typename F::TBacktrackingEvent _TBacktrackingEvent; + typedef typename F::TEndBacktrackingEvent _TEndBacktrackingEvent; + + // Check inputs if( this->m_RenderWindow == NULL ) return; + vtkRenderer* ren = + this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( ); + if( ren == NULL ) + return; + const F* filter = dynamic_cast< const F* >( c ); + if( filter == NULL ) + return; + const _TImage* image = filter->GetInput( ); + if( image == NULL ) + return; - const TEvent* evt = dynamic_cast< const TEvent* >( &e ); - TFrontEvent fevt; - TMarkEvent mevt; - TCollisionEvent cevt; - TEndEvent eevt; - if( evt != NULL ) + // Create actor + _TImage::RegionType reg = image->GetLargestPossibleRegion( ); + _TImage::SizeType siz = reg.GetSize( ); + if( this->m_Data.GetPointer( ) == NULL ) { - typename TImage::PointType pnt; - this->m_Image->TransformIndexToPhysicalPoint( evt->Node.Vertex, pnt ); + this->m_Data = vtkSmartPointer< vtkPolyData >::New( ); + this->m_Mapper = vtkSmartPointer< vtkPolyDataMapper >::New( ); + this->m_Actor = vtkSmartPointer< vtkActor >::New( ); + + vtkSmartPointer< vtkPoints > points = + vtkSmartPointer< vtkPoints >::New( ); + vtkSmartPointer< vtkCellArray > vertices = + vtkSmartPointer< vtkCellArray >::New( ); + vtkSmartPointer< vtkFloatArray > scalars = + vtkSmartPointer< vtkFloatArray >::New( ); + this->m_Data->SetPoints( points ); + this->m_Data->SetVerts( vertices ); + this->m_Data->GetPointData( )->SetScalars( scalars ); + + this->m_Mapper->SetInputData( this->m_Data ); + this->m_Actor->SetMapper( this->m_Mapper ); + ren->AddActor( this->m_Actor ); + + this->m_Marks = TMarks::New( ); + this->m_Marks->SetLargestPossibleRegion( + image->GetLargestPossibleRegion( ) + ); + this->m_Marks->SetRequestedRegion( image->GetRequestedRegion( ) ); + this->m_Marks->SetBufferedRegion( image->GetBufferedRegion( ) ); + this->m_Marks->SetOrigin( image->GetOrigin( ) ); + this->m_Marks->SetSpacing( image->GetSpacing( ) ); + this->m_Marks->SetDirection( image->GetDirection( ) ); + this->m_Marks->Allocate( ); + this->m_Marks->FillBuffer( -1 ); + this->m_Count = 0; + this->m_RenderCount = reg.GetNumberOfPixels( ); + } // fi + + // Get possible events + const _TEvent* evt = dynamic_cast< const _TEvent* >( &e ); + _TFrontEvent fevt; + _TMarkEvent mevt; + _TCollisionEvent cevt; + _TEndEvent eevt; + + if( evt != NULL ) + { if( fevt.CheckEvent( evt ) ) { - if( - this->m_Vertices.find( evt->Node.Vertex ) == this->m_Vertices.end( ) - ) + if( this->m_Marks->GetPixel( evt->Node.Vertex ) == -1 ) { - unsigned long pId = this->m_PolyData->GetPoints( )->InsertNextPoint( - double( pnt[ 0 ] ), double( pnt[ 1 ] ), double( pnt[ 2 ] ) - ); - unsigned long cId = this->m_PolyData->GetVerts( )->InsertNextCell( 1 ); - this->m_PolyData->GetVerts( )->InsertCellPoint( pId ); - this->m_PolyData->Modified( ); - this->m_Vertices[ evt->Node.Vertex ] = TVertexIds( pId, cId ); - - } // rof + typename _TImage::PointType pnt; + image->TransformIndexToPhysicalPoint( evt->Node.Vertex, pnt ); + + long pId = this->m_Data->GetNumberOfPoints( ); + this->m_Data->GetVerts( )->InsertNextCell( 1 ); + this->m_Data->GetVerts( )->InsertCellPoint( pId ); + this->m_Data->GetPoints( )-> + InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] ); + this->m_Data->GetPointData( )-> + GetScalars( )->InsertNextTuple1( 0.5 ); + this->m_Data->Modified( ); + + this->m_Marks->SetPixel( evt->Node.Vertex, pId ); + this->m_Count++; + + // Render visual debug + double per = double( this->m_RenderCount ) * this->m_RenderPercentage; + if( double( this->m_Count ) >= per ) + this->m_RenderWindow->Render( ); + if( double( this->m_Count ) >= per ) + this->m_Count = 0; + + } // fi + return; } else if( mevt.CheckEvent( evt ) ) { - /* - typename TVertices::iterator vIt = - this->m_Vertices.find( evt->Node.Vertex ); - if( vIt != this->m_Vertices.end( ) ) - { - std::cout << "Erase " << evt->Node.Vertex << " " << vIt->second.second << std::endl; - } // fi - */ + // TODO: std::cout << "mark" << std::endl; + return; + } // fi if( cevt.CheckEvent( evt ) ) { - // std::cout << "Collision"; + // TODO: std::cout << "collision" << std::endl; + return; + } // fi - /* - this->SetPixel( - evt->Node.Vertex, - Colors[ evt->Node.FrontId ][ 0 ], - Colors[ evt->Node.FrontId ][ 1 ], - Colors[ evt->Node.FrontId ][ 2 ], - Colors[ evt->Node.FrontId ][ 3 ] - ); - else if( mevt.CheckEvent( evt ) ) - this->SetPixel( evt->Node.Vertex, 255, 0, 0, 255 ); - - if( cevt.CheckEvent( evt ) ) - this->SetPixel( evt->Node.Vertex, 100, 50, 25, 255 ); - */ - - // Update visualization - if( this->m_Number == 0 || this->m_Percentage < 0 ) - this->Render( ); - this->m_Number++; - this->m_Number %= this->m_Percentage; if( eevt.CheckEvent( evt ) ) { - if( this->m_RenderWindow != NULL ) - { - vtkRenderer* ren = - this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( ); - ren->RemoveActor( this->m_PolyDataActor ); - this->Render( ); + this->m_RenderWindow->Render( ); + ren->RemoveActor( this->m_Actor ); + this->m_RenderWindow->Render( ); + this->m_Marks = NULL; + this->m_Data = NULL; + this->m_Mapper = NULL; + this->m_Actor = NULL; + return; - } // fi + } // fi + } + else + { + const _TBacktrackingEvent* bevt = + dynamic_cast< const _TBacktrackingEvent* >( &e ); + const _TEndBacktrackingEvent* ebevt = + dynamic_cast< const _TEndBacktrackingEvent* >( &e ); + if( bevt != NULL ) + { + static const unsigned long nColors = 10; + double back_id = double( bevt->BackId % nColors ) / double( nColors ); + typename _TImage::PointType pnt; + image->TransformIndexToPhysicalPoint( bevt->Node, pnt ); + + long pId = this->m_Data->GetNumberOfPoints( ); + this->m_Data->GetVerts( )->InsertNextCell( 1 ); + this->m_Data->GetVerts( )->InsertCellPoint( pId ); + this->m_Data->GetPoints( )-> + InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] ); + this->m_Data->GetPointData( )-> + GetScalars( )->InsertNextTuple1( back_id ); + this->m_Data->Modified( ); + return; + + } // fi + + if( ebevt != NULL ) + { + this->m_RenderWindow->Render( ); + return; } // fi @@ -183,19 +196,8 @@ fpa::VTK::Image3DObserver< F, R >:: Image3DObserver( ) : Superclass( ), m_RenderWindow( NULL ), - m_Number( 0 ), - m_Percentage( 0 ) + m_RenderPercentage( double( 0.0001 ) ) { - this->m_PolyData = vtkSmartPointer< vtkPolyData >::New( ); - this->m_PolyDataMapper = vtkSmartPointer< vtkPolyDataMapper >::New( ); - this->m_PolyDataActor = vtkSmartPointer< vtkActor >::New( ); - - this->m_PolyData->SetPoints( vtkPoints::New( ) ); - this->m_PolyData->SetVerts( vtkCellArray::New( ) ); - - this->m_PolyDataMapper->SetInputData( this->m_PolyData ); - this->m_PolyDataActor->SetMapper( this->m_PolyDataMapper ); - this->m_PolyDataActor->GetProperty( )->SetColor( 0, 0, 1 ); } #endif // __FPA__VTK__IMAGE3DOBSERVER__HXX__