]> Creatis software - cpPlugins.git/blob - lib/ivq/VTK/SeedWidgetOverImageActor.cxx
...
[cpPlugins.git] / lib / ivq / VTK / SeedWidgetOverImageActor.cxx
1 /* =======================================================================
2  * @author: Leonardo Florez-Valencia
3  * @email: florez-l@javeriana.edu.co
4  * =======================================================================
5  */
6
7 #include <ivq/VTK/SeedWidgetOverImageActor.h>
8
9 #include <ivq/VTK/ImageActor.h>
10 #include <ivq/VTK/ImageSlicePointPlacer.h>
11
12 #include <vtkCommand.h>
13 #include <vtkHandleWidget.h>
14 #include <vtkPointHandleRepresentation3D.h>
15 #include <vtkProperty.h>
16 #include <vtkRenderWindowInteractor.h>
17 #include <vtkSeedRepresentation.h>
18
19 // -------------------------------------------------------------------------
20 namespace ivq
21 {
22   namespace VTK
23   {
24     /**
25      */
26     class SeedWidgetOverImageActorCallback
27       : public vtkCommand
28     {
29     public:
30       static SeedWidgetOverImageActorCallback* New( )
31         {
32           return( new SeedWidgetOverImageActorCallback( ) );
33         }
34       virtual void Execute(
35         vtkObject* caller, unsigned long eId, void* data
36         ) override
37         {
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 )
43           {
44             if( eId == vtkCommand::InteractionEvent )
45             {
46               widget = this->Widget;
47               if( widget->GetEnabled( ) != 0 )
48               {
49                 widget->CompleteInteraction( );
50                 widget->EnabledOff( );
51                 unsigned long nSeeds =
52                   widget->Representation->GetNumberOfSeeds( );
53                 for( unsigned long i = 0; i < nSeeds; ++i )
54                 {
55                   widget->Representation->RemoveLastHandle( );
56                   widget->DeleteSeed(
57                     widget->Representation->GetNumberOfSeeds( )
58                     );
59
60                 } // rof
61
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( ) )
66                 {
67                   widget->Representation->BuildRepresentation( );
68                   vtkRenderer* ren =
69                     widget->GetInteractor( )->FindPokedRenderer(
70                       widget->GetInteractor( )->GetEventPosition( )[ 0 ],
71                       widget->GetInteractor( )->GetEventPosition( )[ 1 ]
72                       );
73                   unsigned int nCoords = sIt->second.size( );
74                   for( unsigned int c = 0; c < nCoords; c += 3 )
75                   {
76                     double x[ 3 ];
77                     widget->ComputeWorldToDisplay(
78                       ren,
79                       sIt->second[ c ],
80                       sIt->second[ c + 1 ],
81                       sIt->second[ c + 2 ],
82                       x
83                       );
84                     x[ 2 ] = double( 0 );
85                     int s = widget->Representation->CreateHandle( x );
86                     vtkHandleWidget* curr_hnd = widget->CreateNewHandle( );
87                     widget->Representation->SetSeedDisplayPosition( s, x );
88                     curr_hnd->SetEnabled( 1 );
89
90                   } // rof
91
92                 } // fi
93                 widget->RestartInteraction( );
94                 widget->EnabledOn( );
95                 widget->Render( );
96
97               } // fi
98
99             } // fi
100           }
101           else if( widget != NULL )
102           {
103              if( eId == vtkCommand::InteractionEvent )
104              {
105                unsigned long sId = *( static_cast< int* >( data ) );
106                double pos[ 3 ];
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 ];
112              }
113              else if( eId == vtkCommand::PlacePointEvent )
114              {
115                unsigned long sId =
116                  widget->Representation->GetNumberOfSeeds( ) - 1;
117                double pos[ 3 ];
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 ] );
123
124              } // fi
125
126           } // fi
127         }
128
129     protected:
130       SeedWidgetOverImageActorCallback( )
131         : vtkCommand( ),
132           Widget( NULL )
133         {
134         }
135       virtual ~SeedWidgetOverImageActorCallback( )
136         {
137         }
138
139     private:
140       // Purposely not implemented
141       SeedWidgetOverImageActorCallback(
142         const SeedWidgetOverImageActorCallback& other
143         );
144       SeedWidgetOverImageActorCallback& operator=(
145         const SeedWidgetOverImageActorCallback& other
146         );
147
148     public:
149       ivq::VTK::SeedWidgetOverImageActor* Widget;
150     };
151
152   } // ecapseman
153
154 } // ecapseman
155
156 // -------------------------------------------------------------------------
157 ivq::VTK::SeedWidgetOverImageActor::
158 Self* ivq::VTK::SeedWidgetOverImageActor::
159 New( )
160 {
161   return( new Self( ) );
162 }
163
164 // -------------------------------------------------------------------------
165 ivq::VTK::ImageActor* ivq::VTK::SeedWidgetOverImageActor::
166 GetActor( )
167 {
168   return( this->Actor.GetPointer( ) );
169 }
170
171 // -------------------------------------------------------------------------
172 void ivq::VTK::SeedWidgetOverImageActor::
173 SetActor( ivq::VTK::ImageActor* actor )
174 {
175   if( this->Actor.GetPointer( ) != actor )
176   {
177     this->Points.clear( );
178     this->Actor = actor;
179     this->Placer = vtkSmartPointer< ivq::VTK::ImageSlicePointPlacer >::New( );
180     this->Handles = vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
181     this->Representation = vtkSmartPointer< vtkSeedRepresentation >::New( );
182
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 );
188     this->Modified( );
189
190     vtkSmartPointer< SeedWidgetOverImageActorCallback > cbk =
191       vtkSmartPointer< SeedWidgetOverImageActorCallback >::New( );
192     cbk->Widget = this;
193     this->ObserverId =
194       this->Actor->AddObserver( vtkCommand::InteractionEvent, cbk );
195     this->AddObserver( vtkCommand::PlacePointEvent, cbk );
196     this->AddObserver( vtkCommand::InteractionEvent, cbk );
197
198   } // fi
199 }
200
201 // -------------------------------------------------------------------------
202 const ivq::VTK::SeedWidgetOverImageActor::
203 TSeeds& ivq::VTK::SeedWidgetOverImageActor::
204 GetSeeds( ) const
205 {
206   return( this->Points );
207 }
208
209 // -------------------------------------------------------------------------
210 ivq::VTK::SeedWidgetOverImageActor::
211 SeedWidgetOverImageActor( )
212   : Superclass( )
213 {
214 }
215
216 // -------------------------------------------------------------------------
217 ivq::VTK::SeedWidgetOverImageActor::
218 ~SeedWidgetOverImageActor( )
219 {
220   if( this->Actor.GetPointer( ) != NULL )
221     this->Actor->RemoveObserver( this->ObserverId );
222 }
223
224 // eof - $RCSfile$