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
19 class SeedWidgetCallback
23 static SeedWidgetCallback* New( )
24 { return( new SeedWidgetCallback ); }
25 virtual void Execute( vtkObject* caller, unsigned long id, void* data )
27 typedef cpPluginsWidgets::SeedWidget::TImageActor _TImageActor;
28 auto actor = dynamic_cast< _TImageActor* >( caller );
30 if( id == vtkCommand::InteractionEvent && actor != NULL )
32 int slice = actor->GetSliceNumber( );
33 if( this->Data->ActualWidgetId != slice )
35 this->Data->Widgets[ this->Data->ActualWidgetId ]->EnabledOff( );
36 this->Data->Widgets[ slice ]->EnabledOn( );
37 this->Data->ActualWidgetId = slice;
43 id == vtkCommand::CursorChangedEvent ||
44 id == vtkCommand::PlacePointEvent
48 this->Widget->Modified( );
57 virtual ~SeedWidgetCallback( ) { }
61 SeedWidget::TWidgetData* Data;
66 // -------------------------------------------------------------------------
67 cpPluginsWidgets::SeedWidget::
72 typedef cpPlugins::BaseObjects::DataObject _TData;
73 typedef cpPlugins::DataObjects::Mesh _TMesh;
75 this->_ConfigureInput< _TData >( "Input", false, false );
76 this->_ConfigureOutput< _TMesh >( "Output" );
79 // -------------------------------------------------------------------------
80 cpPluginsWidgets::SeedWidget::
83 for( auto w = this->m_Widgets.begin( ); w != this->m_Widgets.end( ); ++w )
85 this->m_Widgets.clear( );
88 // -------------------------------------------------------------------------
89 void cpPluginsWidgets::SeedWidget::
92 static vtkPolyData* prev_pdata = NULL;
93 auto pdata = this->_CreateVTK< vtkPolyData >( );
94 if( prev_pdata != pdata )
96 pdata->SetPoints( vtkPoints::New( ) );
97 pdata->SetVerts( vtkCellArray::New( ) );
98 pdata->SetLines( vtkCellArray::New( ) );
99 pdata->SetPolys( vtkCellArray::New( ) );
100 pdata->SetStrips( vtkCellArray::New( ) );
104 auto points = pdata->GetPoints( );
105 auto verts = pdata->GetVerts( );
107 if( this->m_Configured )
109 if( points->GetNumberOfPoints( ) == 0 )
111 std::stringstream text;
113 for( auto w = this->m_Widgets.begin( ); w != this->m_Widgets.end( ); ++w )
115 for( auto r = ( *w )->Widgets.begin( ); r != ( *w )->Widgets.end( ); ++r )
118 dynamic_cast< vtkSeedRepresentation* >(
119 ( *r )->GetRepresentation( )
124 for( unsigned int i = 0; i < rep->GetNumberOfSeeds( ); ++i )
126 rep->GetSeedWorldPosition( i, pos );
130 text << pos[ 0 ] << " " << pos[ 1 ] << " " << pos[ 2 ];
131 points->InsertNextPoint( pos );
136 ( *r )->EnabledOff( );
141 this->m_Parameters.SetString( "Text", text.str( ) );
147 auto init_seeds = this->m_Parameters.GetString( "Text" );
148 std::vector< std::string > tokens;
149 cpExtensions::Tokenize( tokens, init_seeds, "#" );
150 for( auto tIt = tokens.begin( ); tIt != tokens.end( ); ++tIt )
152 std::vector< std::string > coords;
153 cpExtensions::Tokenize( coords, *tIt, " \t" );
154 int dim = ( coords.size( ) < 3 )? coords.size( ): 3;
156 for( unsigned int d = 0; d < 3; ++d )
158 pos[ d ] = double( 0 );
161 std::istringstream value( coords[ d ] );
167 verts->InsertNextCell( 1 );
168 verts->InsertCellPoint( points->GetNumberOfPoints( ) );
169 points->InsertNextPoint( pos );
174 this->m_Configured = true;
177 this->GetOutput( "Output" )->SetVTK( pdata );
180 // -------------------------------------------------------------------------
181 void cpPluginsWidgets::SeedWidget::
184 typedef cpPlugins::DataObjects::Image _TImage;
186 auto image = this->GetInput< _TImage >( "Input" );
190 auto vtk_image = image->GetVTK< vtkImageData >( );
191 auto iIt = this->m_Interactors.begin( );
192 for( ; iIt != this->m_Interactors.end( ); ++iIt )
194 auto ren = ( *iIt )->GetInteractorStyle( )->GetCurrentRenderer( );
197 auto props = ren->GetViewProps( );
200 props->InitTraversal( );
201 while( vtkProp* prop = props->GetNextProp( ) )
203 auto actor = dynamic_cast< TImageActor* >( prop );
205 if( actor->GetImage( ) == vtk_image )
206 this->m_Props[ actor ] = *iIt;
217 if( this->m_Props.size( ) > 0 )
219 cpPlugins_Demangle_ImageVisualDims( image->GetITK( ), _GD0_Image );
220 else this->_Error( "Invalid input image." );
223 this->_Error( "Could not create a valid widget: no actors." );
226 this->_Error( "Could not create a valid widget: no input." );
229 // -------------------------------------------------------------------------
230 template< class _TImage >
231 void cpPluginsWidgets::SeedWidget::
232 _GD0_Image( _TImage* image )
234 for( auto p = this->m_Props.begin( ); p != this->m_Props.end( ); ++p )
238 this, dynamic_cast< TImageActor* >( p->first ), p->second
240 this->m_Widgets.push_back( d );
245 // -------------------------------------------------------------------------
246 cpPluginsWidgets::SeedWidget::TWidgetData::
248 SeedWidget* seedWidget,
250 vtkRenderWindowInteractor* iren
253 auto cb = vtkSmartPointer< SeedWidgetCallback >::New( );
254 cb->Widget = seedWidget;
257 actor->AddObserver( vtkCommand::InteractionEvent, cb );
259 auto image = actor->GetImage( );
260 int ori = actor->GetOrientation( );
262 image->GetExtent( ext );
263 for( int i = ext[ ori << 1 ]; i <= ext[ ( ori << 1 ) + 1 ]; ++i )
265 auto placer = vtkSmartPointer< _TPlacer >::New( );
266 auto handle = vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
267 auto rep = vtkSmartPointer< vtkSeedRepresentation >::New( );
268 auto wdg = vtkSmartPointer< _TWidget >::New( );
270 placer->SetImageSlice( actor );
271 handle->GetProperty( )->SetColor( 1, 0, 0 );
272 handle->SetPointPlacer( placer );
273 rep->SetHandleRepresentation( handle );
274 wdg->SetRepresentation( rep );
275 wdg->SetInteractor( iren );
276 wdg->AddObserver( vtkCommand::PlacePointEvent, cb );
277 wdg->AddObserver( vtkCommand::CursorChangedEvent, cb );
280 this->Widgets.push_back( wdg );
281 this->Placers.push_back( placer );
282 this->Handles.push_back( handle );
283 this->Representations.push_back( rep );
287 this->ActualWidgetId = actor->GetSliceNumber( );
288 this->Widgets[ this->ActualWidgetId ]->EnabledOn( );
291 // -------------------------------------------------------------------------
292 cpPluginsWidgets::SeedWidget::TWidgetData::