1 #include <plugins/Widgets/SeedWidget.h>
2 #include <cpPlugins/DataObjects/Image.h>
3 #include <cpPlugins/DataObjects/Mesh.h>
5 #include <vtkCommand.h>
6 #include <vtkImageActor.h>
7 #include <vtkImageData.h>
8 #include <vtkProperty.h>
9 #include <vtkRenderer.h>
10 #include <vtkRenderWindowInteractor.h>
11 #include <cpExtensions/QT/SimpleMPRWidget.h>
13 // -------------------------------------------------------------------------
14 // This callback is responsible for changing update time
15 namespace cpPluginsWidgets
20 class SeedWidgetCallback
24 static SeedWidgetCallback* New( )
25 { return( new SeedWidgetCallback ); }
26 virtual void Execute( vtkObject* caller, unsigned long id, void* data )
28 typedef cpPluginsWidgets::SeedWidget::TImageActor _TImageActor;
29 auto actor = dynamic_cast< _TImageActor* >( caller );
31 if( id == vtkCommand::InteractionEvent && actor != NULL )
33 int slice = actor->GetSliceNumber( );
34 if( this->Data->ActualWidgetId != slice )
36 this->Data->Widgets[ this->Data->ActualWidgetId ]->EnabledOff( );
37 this->Data->Widgets[ slice ]->EnabledOn( );
38 this->Data->ActualWidgetId = slice;
44 id == vtkCommand::CursorChangedEvent ||
45 id == vtkCommand::PlacePointEvent
49 this->Widget->Modified( );
58 virtual ~SeedWidgetCallback( ) { }
62 SeedWidget::TWidgetData* Data;
68 // -------------------------------------------------------------------------
69 cpPluginsWidgets::SeedWidget::
77 typedef cpPlugins::BaseObjects::DataObject _TData;
78 typedef cpPlugins::DataObjects::Mesh _TMesh;
81 this->_ConfigureInput< _TData >( "Input", false, false );
82 this->_ConfigureOutput< _TMesh >( "Output" );
85 auto out = this->_CreateVTK< vtkPolyData >( );
86 out->SetPoints( vtkSmartPointer< vtkPoints >::New( ) );
87 out->SetVerts( vtkSmartPointer< vtkCellArray >::New( ) );
88 out->SetLines( vtkSmartPointer< vtkCellArray >::New( ) );
89 out->SetPolys( vtkSmartPointer< vtkCellArray >::New( ) );
90 out->SetStrips( vtkSmartPointer< vtkCellArray >::New( ) );
91 this->GetOutput( "Output" )->SetVTK( out );
94 // -------------------------------------------------------------------------
95 cpPluginsWidgets::SeedWidget::
98 for( auto i = this->m_Data.begin( ); i != this->m_Data.end( ); ++i )
100 this->m_Data.clear( );
103 // -------------------------------------------------------------------------
104 void cpPluginsWidgets::SeedWidget::
107 // TODO: std::string init_value = this->m_Parameters.GetString( "Text" );
110 static vtkPolyData* prev_pdata = NULL;
111 auto pdata = this->_CreateVTK< vtkPolyData >( );
112 if( prev_pdata != pdata )
114 pdata->SetPoints( vtkPoints::New( ) );
115 pdata->SetVerts( vtkCellArray::New( ) );
116 pdata->SetLines( vtkCellArray::New( ) );
117 pdata->SetPolys( vtkCellArray::New( ) );
118 pdata->SetStrips( vtkCellArray::New( ) );
122 auto points = pdata->GetPoints( );
123 auto verts = pdata->GetVerts( );
125 if( this->m_Configured )
127 if( points->GetNumberOfPoints( ) == 0 )
129 std::stringstream text;
131 for( auto w = this->m_Widgets.begin( ); w != this->m_Widgets.end( ); ++w )
133 for( auto r = ( *w )->Widgets.begin( ); r != ( *w )->Widgets.end( ); ++r )
136 dynamic_cast< vtkSeedRepresentation* >(
137 ( *r )->GetRepresentation( )
142 for( unsigned int i = 0; i < rep->GetNumberOfSeeds( ); ++i )
144 rep->GetSeedWorldPosition( i, pos );
148 text << pos[ 0 ] << " " << pos[ 1 ] << " " << pos[ 2 ];
149 points->InsertNextPoint( pos );
154 ( *r )->EnabledOff( );
159 this->m_Parameters.SetString( "Text", text.str( ) );
165 auto init_seeds = this->m_Parameters.GetString( "Text" );
166 std::vector< std::string > tokens;
167 cpExtensions::Tokenize( tokens, init_seeds, "#" );
168 for( auto tIt = tokens.begin( ); tIt != tokens.end( ); ++tIt )
170 std::vector< std::string > coords;
171 cpExtensions::Tokenize( coords, *tIt, " \t" );
172 int dim = ( coords.size( ) < 3 )? coords.size( ): 3;
174 for( unsigned int d = 0; d < 3; ++d )
176 pos[ d ] = double( 0 );
179 std::istringstream value( coords[ d ] );
185 verts->InsertNextCell( 1 );
186 verts->InsertCellPoint( points->GetNumberOfPoints( ) );
187 points->InsertNextPoint( pos );
192 this->m_Configured = true;
195 this->GetOutput( "Output" )->SetVTK( pdata );
199 // -------------------------------------------------------------------------
200 void cpPluginsWidgets::SeedWidget::
203 auto o = this->GetInputData( "Input" );
204 cpPlugins_Demangle_ImageVisualDims( o, _GD0_Image );
205 else this->_Error( "Invalid input image." );
208 typedef cpPlugins::DataObjects::Image _TImage;
210 auto image = this->GetInput< _TImage >( "Input" );
214 auto vtk_image = image->GetVTK< vtkImageData >( );
215 auto iIt = this->m_Interactors.begin( );
216 for( ; iIt != this->m_Interactors.end( ); ++iIt )
218 auto ren = ( *iIt )->GetInteractorStyle( )->GetCurrentRenderer( );
221 auto props = ren->GetViewProps( );
224 props->InitTraversal( );
225 while( vtkProp* prop = props->GetNextProp( ) )
227 auto actor = dynamic_cast< TImageActor* >( prop );
229 if( actor->GetImage( ) == vtk_image )
230 this->m_Props[ actor ] = *iIt;
241 if( this->m_Props.size( ) > 0 )
243 cpPlugins_Demangle_ImageVisualDims( image->GetITK( ), _GD0_Image );
244 else this->_Error( "Invalid input image." );
247 this->_Error( "Could not create a valid widget: no actors." );
250 this->_Error( "Could not create a valid widget: no input." );
254 // -------------------------------------------------------------------------
255 template< class _TImage >
256 void cpPluginsWidgets::SeedWidget::
257 _GD0_Image( _TImage* image )
259 std::cout << image << std::endl;
262 for( auto p = this->m_Props.begin( ); p != this->m_Props.end( ); ++p )
266 this, dynamic_cast< TImageActor* >( p->first ), p->second
268 this->m_Widgets.push_back( d );
274 // -------------------------------------------------------------------------
275 cpPluginsWidgets::SeedWidget::TWidgetData::
277 SeedWidget* seedWidget,
279 vtkRenderWindowInteractor* iren
283 auto image = actor->GetImage( );
284 int ori = actor->GetOrientation( );
286 image->GetExtent( ext );
287 for( int i = ext[ ori << 1 ]; i <= ext[ ( ori << 1 ) + 1 ]; ++i )
290 this->Placer = vtkSmartPointer< _TPlacer >::New( );
291 this->Handle = vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
292 this->Representation = vtkSmartPointer< vtkSeedRepresentation >::New( );
293 this->Widget = vtkSmartPointer< _TWidget >::New( );
295 this->Placer->SetImageSlice( actor );
296 this->Handle->GetProperty( )->SetColor( 1, 0, 0 );
297 this->Handle->SetPointPlacer( this->Placer );
298 this->Representation->SetHandleRepresentation( this->Handle );
299 this->Widget->SetRepresentation( this->Representation );
300 this->Widget->SetInteractor( iren );
302 this->Widget->AddObserver( vtkCommand::PlacePointEvent, cb );
303 this->Widget->AddObserver( vtkCommand::CursorChangedEvent, cb );
305 this->Widget->EnabledOff( );
308 this->Widgets.push_back( wdg );
309 this->Placers.push_back( placer );
310 this->Handles.push_back( handle );
311 this->Representations.push_back( rep );
316 this->ActualWidgetId = actor->GetSliceNumber( );
317 this->Widgets[ this->ActualWidgetId ]->EnabledOn( );
321 auto cb = vtkSmartPointer< SeedWidgetCallback >::New( );
322 cb->Widget = seedWidget;
325 actor->AddObserver( vtkCommand::InteractionEvent, cb );
327 auto image = actor->GetImage( );
328 int ori = actor->GetOrientation( );
330 image->GetExtent( ext );
331 for( int i = ext[ ori << 1 ]; i <= ext[ ( ori << 1 ) + 1 ]; ++i )
333 auto placer = vtkSmartPointer< _TPlacer >::New( );
334 auto handle = vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
335 auto rep = vtkSmartPointer< vtkSeedRepresentation >::New( );
336 auto wdg = vtkSmartPointer< _TWidget >::New( );
338 placer->SetImageSlice( actor );
339 handle->GetProperty( )->SetColor( 1, 0, 0 );
340 handle->SetPointPlacer( placer );
341 rep->SetHandleRepresentation( handle );
342 wdg->SetRepresentation( rep );
343 wdg->SetInteractor( iren );
344 wdg->AddObserver( vtkCommand::PlacePointEvent, cb );
345 wdg->AddObserver( vtkCommand::CursorChangedEvent, cb );
348 this->Widgets.push_back( wdg );
349 this->Placers.push_back( placer );
350 this->Handles.push_back( handle );
351 this->Representations.push_back( rep );
355 this->ActualWidgetId = actor->GetSliceNumber( );
356 this->Widgets[ this->ActualWidgetId ]->EnabledOn( );
360 // -------------------------------------------------------------------------
361 cpPluginsWidgets::SeedWidget::TWidgetData::