1 /* =======================================================================
2 * @author: Leonardo Florez-Valencia
3 * @email: florez-l@javeriana.edu.co
4 * =======================================================================
7 #include <ivq/VTK/SeedWidgetOverImageActor.h>
9 #include <ivq/VTK/ImageActor.h>
10 #include <ivq/VTK/ImageSlicePointPlacer.h>
12 #include <vtkCommand.h>
13 #include <vtkHandleWidget.h>
14 #include <vtkPointHandleRepresentation3D.h>
15 #include <vtkProperty.h>
16 #include <vtkRenderWindowInteractor.h>
17 #include <vtkSeedRepresentation.h>
19 // -------------------------------------------------------------------------
26 class SeedWidgetOverImageActorCallback
30 static SeedWidgetOverImageActorCallback* New( )
32 return( new SeedWidgetOverImageActorCallback( ) );
35 vtkObject* caller, unsigned long eId, void* data
38 ivq::VTK::ImageActor* actor =
39 ivq::VTK::ImageActor::SafeDownCast( caller );
40 ivq::VTK::SeedWidgetOverImageActor* widget =
41 ivq::VTK::SeedWidgetOverImageActor::SafeDownCast( caller );
42 if( actor != NULL && this->Widget != NULL )
44 if( eId == vtkCommand::InteractionEvent )
46 widget = this->Widget;
47 if( widget->GetEnabled( ) != 0 )
49 widget->CompleteInteraction( );
50 widget->EnabledOff( );
51 unsigned long nSeeds =
52 widget->Representation->GetNumberOfSeeds( );
53 for( unsigned long i = 0; i < nSeeds; ++i )
55 widget->Representation->RemoveLastHandle( );
57 widget->Representation->GetNumberOfSeeds( )
62 unsigned long slice = widget->Actor->GetSliceNumber( );
63 std::map< unsigned long, std::vector< double > >::iterator
64 sIt = widget->Points.find( slice );
65 if( sIt != widget->Points.end( ) )
67 widget->Representation->BuildRepresentation( );
69 widget->GetInteractor( )->FindPokedRenderer(
70 widget->GetInteractor( )->GetEventPosition( )[ 0 ],
71 widget->GetInteractor( )->GetEventPosition( )[ 1 ]
73 unsigned int nCoords = sIt->second.size( );
74 for( unsigned int c = 0; c < nCoords; c += 3 )
77 widget->ComputeWorldToDisplay(
85 int s = widget->Representation->CreateHandle( x );
86 vtkHandleWidget* curr_hnd = widget->CreateNewHandle( );
87 widget->Representation->SetSeedDisplayPosition( s, x );
88 curr_hnd->SetEnabled( 1 );
93 widget->RestartInteraction( );
101 else if( widget != NULL )
103 if( eId == vtkCommand::InteractionEvent )
105 unsigned long sId = *( static_cast< int* >( data ) );
107 widget->Representation->GetSeedWorldPosition( sId, pos );
108 unsigned long slice = widget->Actor->GetSliceNumber( );
109 widget->Points[ slice ][ ( sId * 3 ) + 0 ] = pos[ 0 ];
110 widget->Points[ slice ][ ( sId * 3 ) + 1 ] = pos[ 1 ];
111 widget->Points[ slice ][ ( sId * 3 ) + 2 ] = pos[ 2 ];
113 else if( eId == vtkCommand::PlacePointEvent )
116 widget->Representation->GetNumberOfSeeds( ) - 1;
118 widget->Representation->GetSeedWorldPosition( sId, pos );
119 unsigned long slice = widget->Actor->GetSliceNumber( );
120 widget->Points[ slice ].push_back( pos[ 0 ] );
121 widget->Points[ slice ].push_back( pos[ 1 ] );
122 widget->Points[ slice ].push_back( pos[ 2 ] );
130 SeedWidgetOverImageActorCallback( )
135 virtual ~SeedWidgetOverImageActorCallback( )
140 // Purposely not implemented
141 SeedWidgetOverImageActorCallback(
142 const SeedWidgetOverImageActorCallback& other
144 SeedWidgetOverImageActorCallback& operator=(
145 const SeedWidgetOverImageActorCallback& other
149 ivq::VTK::SeedWidgetOverImageActor* Widget;
156 // -------------------------------------------------------------------------
157 ivq::VTK::SeedWidgetOverImageActor::
158 Self* ivq::VTK::SeedWidgetOverImageActor::
161 return( new Self( ) );
164 // -------------------------------------------------------------------------
165 ivq::VTK::ImageActor* ivq::VTK::SeedWidgetOverImageActor::
168 return( this->Actor.GetPointer( ) );
171 // -------------------------------------------------------------------------
172 void ivq::VTK::SeedWidgetOverImageActor::
173 SetActor( ivq::VTK::ImageActor* actor )
175 if( this->Actor.GetPointer( ) != actor )
177 this->Points.clear( );
179 this->Placer = vtkSmartPointer< ivq::VTK::ImageSlicePointPlacer >::New( );
180 this->Handles = vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
181 this->Representation = vtkSmartPointer< vtkSeedRepresentation >::New( );
183 this->Placer->SetImageSlice( this->Actor );
184 this->Handles->GetProperty( )->SetColor( 1, 0, 0 );
185 this->Handles->SetPointPlacer( this->Placer );
186 this->Representation->SetHandleRepresentation( this->Handles );
187 this->SetRepresentation( this->Representation );
190 vtkSmartPointer< SeedWidgetOverImageActorCallback > cbk =
191 vtkSmartPointer< SeedWidgetOverImageActorCallback >::New( );
194 this->Actor->AddObserver( vtkCommand::InteractionEvent, cbk );
195 this->AddObserver( vtkCommand::PlacePointEvent, cbk );
196 this->AddObserver( vtkCommand::InteractionEvent, cbk );
201 // -------------------------------------------------------------------------
202 const ivq::VTK::SeedWidgetOverImageActor::
203 TSeeds& ivq::VTK::SeedWidgetOverImageActor::
206 return( this->Points );
209 // -------------------------------------------------------------------------
210 ivq::VTK::SeedWidgetOverImageActor::
211 SeedWidgetOverImageActor( )
216 // -------------------------------------------------------------------------
217 ivq::VTK::SeedWidgetOverImageActor::
218 ~SeedWidgetOverImageActor( )
220 if( this->Actor.GetPointer( ) != NULL )
221 this->Actor->RemoveObserver( this->ObserverId );