1 #include <VTKWidgets/SeedWidget.h>
3 #include <cpPlugins/OS/String.h>
4 #include <cpInstances/DataObjects/Image.h>
5 #include <cpInstances/DataObjects/Mesh.h>
7 #include <cpExtensions/Interaction/SeedWidget.h>
8 #include <cpExtensions/Interaction/ImageSlicePointPlacer.h>
9 #include <cpExtensions/Visualization/WindowLevelImageActor.h>
11 #include <vtkHandleWidget.h>
12 #include <vtkImageData.h>
14 #include <vtkPointHandleRepresentation3D.h>
15 #include <vtkProperty.h>
16 #include <vtkRendererCollection.h>
17 #include <vtkRenderWindow.h>
18 #include <vtkSeedRepresentation.h>
20 // -------------------------------------------------------------------------
21 void cpPluginsVTKWidgets::SeedWidget::
26 // -------------------------------------------------------------------------
27 void cpPluginsVTKWidgets::SeedWidget::
30 for( auto w = this->m_Widgets.begin( ); w != this->m_Widgets.end( ); ++w )
32 if( v ) w->second->RestartInteraction( );
33 else w->second->CompleteInteraction( );
34 w->second->SetEnabled( v );
40 // -------------------------------------------------------------------------
41 bool cpPluginsVTKWidgets::SeedWidget::
44 if( this->m_Widgets.size( ) > 0 )
46 auto i = this->m_Widgets.begin( );
47 TWidget* w = const_cast< TWidget* >( i->second.GetPointer( ) );
48 return( w->GetEnabled( ) != 0 );
54 // -------------------------------------------------------------------------
55 cpPluginsVTKWidgets::SeedWidget::
59 typedef cpPlugins::Pipeline::DataObject _TData;
60 typedef cpInstances::DataObjects::Mesh _TMesh;
63 this->_ConfigureInput< _TData >( "Input", false, false );
64 this->_ConfigureOutput< _TMesh >( "Output" );
67 auto out = this->_CreateVTK< vtkPolyData >( );
68 out->SetPoints( vtkSmartPointer< vtkPoints >::New( ) );
69 out->SetVerts( vtkSmartPointer< vtkCellArray >::New( ) );
70 out->SetLines( vtkSmartPointer< vtkCellArray >::New( ) );
71 out->SetPolys( vtkSmartPointer< vtkCellArray >::New( ) );
72 out->SetStrips( vtkSmartPointer< vtkCellArray >::New( ) );
73 this->GetOutput( "Output" )->SetVTK( out );
76 // -------------------------------------------------------------------------
77 cpPluginsVTKWidgets::SeedWidget::
81 for( auto w = this->m_Widgets.begin( ); w != this->m_Widgets.end( ); ++w )
82 w->second->EnabledOff( );
83 this->m_Widgets.clear( );
87 // -------------------------------------------------------------------------
88 void cpPluginsVTKWidgets::SeedWidget::
91 auto image = this->GetInputData< vtkImageData >( "Input" );
93 this->_GD0_Image( image );
95 this->_Error( "Invalid input image." );
98 // -------------------------------------------------------------------------
99 void cpPluginsVTKWidgets::SeedWidget::
100 _GD0_Image( vtkImageData* image )
102 auto seeds = this->GetOutputData< vtkPolyData >( "Output" );
103 if( this->m_Widgets.size( ) == 0 )
105 this->m_Command = vtkSmartPointer< TCallback >::New( );
106 this->m_Command->SetSeeds( seeds );
108 auto inIt = this->m_Interactors.begin( );
109 inIt != this->m_Interactors.end( );
113 auto rends = ( *inIt )->GetRenderWindow( )->GetRenderers( );
114 std::set< TImageActor* > all_props;
117 rends->InitTraversal( );
118 while( vtkRenderer* ren = rends->GetNextItem( ) )
120 auto props = ren->GetViewProps( );
121 props->InitTraversal( );
122 while( vtkProp* p = props->GetNextProp( ) )
124 auto image_actor = dynamic_cast< TImageActor* >( p );
125 if( image_actor != NULL )
127 if( image_actor->GetImage( ) == image )
128 all_props.insert( image_actor );
137 if( all_props.size( ) == 1 )
139 if( this->m_Widgets.find( *inIt ) == this->m_Widgets.end( ) )
141 auto act = *( all_props.begin( ) );
142 auto pla = vtkSmartPointer< TPlacer >::New( );
143 auto hnd = vtkSmartPointer< THandleRep >::New( );
144 auto rep = vtkSmartPointer< TSeedRep >::New( );
145 auto wdg = vtkSmartPointer< TWidget >::New( );
147 pla->SetImageSlice( act );
148 hnd->GetProperty( )->SetColor( 1, 0, 0 );
149 hnd->SetPointPlacer( pla );
150 rep->SetHandleRepresentation( hnd );
151 wdg->SetRepresentation( rep );
152 wdg->SetInteractor( *inIt );
153 act->AddObserver( vtkCommand::InteractionEvent, this->m_Command );
154 wdg->AddObserver( vtkCommand::PlacePointEvent, this->m_Command );
155 wdg->AddObserver( vtkCommand::CursorChangedEvent, this->m_Command );
156 this->m_Widgets[ *inIt ] = wdg;
164 // Associate input text
165 std::string text = this->m_Parameters.GetString( "Text" );
166 std::vector< std::string > tok1, tok2;
167 tok1 = cpPlugins::OS::String::Tokenize( text, "#" );
168 if( tok1.size( ) > seeds->GetPoints( )->GetNumberOfPoints( ) )
170 for( auto t1 = tok1.begin( ); t1 != tok1.end( ); ++t1 )
174 tok2 = cpPlugins::OS::String::Tokenize( *t1, " " );
176 for( unsigned int d = 0; d < 3; ++d )
178 if( d < tok2.size( ) )
180 std::istringstream str( tok2[ d ] );
184 x[ d ] = double( 0 );
188 seeds->GetPoints( )->InsertNextPoint( x );
189 seeds->GetVerts( )->InsertNextCell( 1 );
190 seeds->GetVerts( )->InsertCellPoint(
191 seeds->GetPoints( )->GetNumberOfPoints( ) - 1
204 std::stringstream text;
205 for( long i = 0; i < seeds->GetNumberOfPoints( ); ++i )
207 seeds->GetPoint( i, x );
208 text << x[ 0 ] << " " << x[ 1 ] << " " << x[ 2 ] << "#";
211 this->m_Parameters.SetString( "Text", text.str( ) );
216 // -------------------------------------------------------------------------
217 cpPluginsVTKWidgets::SeedWidget::TCallback*
218 cpPluginsVTKWidgets::SeedWidget::TCallback::
221 return( new TCallback );
224 // -------------------------------------------------------------------------
225 void cpPluginsVTKWidgets::SeedWidget::TCallback::
226 Execute( vtkObject* caller, unsigned long id, void* data )
228 static const double EPS = 1e-5;
229 auto src_act = dynamic_cast< TImageActor* >( caller );
230 auto src_wdg = dynamic_cast< TWidget* >( caller );
232 if( id == vtkCommand::InteractionEvent && src_act != NULL )
234 TWidget* widget = NULL;
235 TSeedRep* seed_rep = NULL;
237 auto w = this->m_Widgets.begin( );
238 while( w != this->m_Widgets.end( ) && widget == NULL )
241 dynamic_cast< vtkSeedRepresentation* >(
242 ( *w )->GetRepresentation( )
246 auto hnd = rep->GetHandleRepresentation( );
250 dynamic_cast< SeedWidget::TPlacer* >(
251 hnd->GetPointPlacer( )
255 auto act = pla->GetImageSlice( );
274 // Cut through given seeds
275 auto plane = src_act->GetSlicePlane( );
277 std::vector< long > ids;
278 for( long i = 0; i < this->m_Seeds->GetNumberOfPoints( ); ++i )
280 this->m_Seeds->GetPoint( i, x );
281 double d = plane->DistanceToPlane( x );
288 widget->CompleteInteraction( );
289 widget->EnabledOff( );
290 int nSeeds = seed_rep->GetNumberOfSeeds ();
291 for( int i = 0; i < nSeeds; ++i )
293 seed_rep->RemoveLastHandle( );
294 widget->DeleteSeed( seed_rep->GetNumberOfSeeds( ) );
298 if( ids.size( ) > 0 )
300 auto ren = widget->GetInteractor( )->FindPokedRenderer(
301 widget->GetInteractor( )->GetEventPosition( )[ 0 ],
302 widget->GetInteractor( )->GetEventPosition( )[ 1 ]
306 seed_rep->BuildRepresentation( );
307 for( auto id = ids.begin( ); id != ids.end( ); ++id )
309 this->m_Seeds->GetPoint( *id, x );
310 widget->ComputeWorldToDisplay(
311 ren, x[ 0 ], x[ 1 ], x[ 2 ], x
313 x[ 2 ] = double( 0 );
314 int s = seed_rep->CreateHandle( x );
315 vtkHandleWidget* curr_hnd = widget->CreateNewHandle( );
316 seed_rep->SetSeedDisplayPosition( s, x );
317 curr_hnd->SetEnabled( 1 );
324 widget->RestartInteraction( );
325 widget->EnabledOn( );
330 else if( id == vtkCommand::PlacePointEvent && src_wdg != NULL )
332 this->m_Widgets.insert( src_wdg );
334 dynamic_cast< vtkSeedRepresentation* >(
335 src_wdg->GetRepresentation( )
339 unsigned long nSeeds = rep->GetNumberOfSeeds( );
343 rep->GetSeedWorldPosition( nSeeds - 1, pos );
345 this->m_Seeds->GetPoints( )->InsertNextPoint( pos );
346 this->m_Seeds->GetVerts( )->InsertNextCell( 1 );
347 this->m_Seeds->GetVerts( )->InsertCellPoint(
348 this->m_Seeds->GetPoints( )->GetNumberOfPoints( ) - 1
350 this->m_Seeds->Modified( );
359 // -------------------------------------------------------------------------
360 void cpPluginsVTKWidgets::SeedWidget::TCallback::
361 SetSeeds( vtkPolyData* seeds )
363 this->m_Seeds = seeds;
366 // -------------------------------------------------------------------------
367 cpPluginsVTKWidgets::SeedWidget::TCallback::
374 // -------------------------------------------------------------------------
375 cpPluginsVTKWidgets::SeedWidget::TCallback::