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 <vtkProperty.h>
8 #include <vtkRenderer.h>
9 #include <vtkRenderWindowInteractor.h>
10 #include <cpExtensions/QT/SimpleMPRWidget.h>
12 // -------------------------------------------------------------------------
13 // This callback is responsible for changing update time
14 namespace cpPluginsWidgets
18 class SeedWidgetCallback
22 static SeedWidgetCallback* New( )
23 { return( new SeedWidgetCallback ); }
24 virtual void Execute( vtkObject* caller, unsigned long id, void* data )
26 typedef cpPluginsWidgets::SeedWidget::TImageActor _TImageActor;
27 auto actor = dynamic_cast< _TImageActor* >( caller );
29 if( id == vtkCommand::InteractionEvent && actor != NULL )
31 int slice = actor->GetSliceNumber( );
32 if( this->Data->ActualWidgetId != slice )
34 this->Data->Widgets[ this->Data->ActualWidgetId ]->EnabledOff( );
35 this->Data->Widgets[ slice ]->EnabledOn( );
36 this->Data->ActualWidgetId = slice;
42 id == vtkCommand::CursorChangedEvent ||
43 id == vtkCommand::PlacePointEvent
47 this->Widget->Modified( );
56 virtual ~SeedWidgetCallback( ) { }
60 SeedWidget::TWidgetData* Data;
65 // -------------------------------------------------------------------------
66 cpPluginsWidgets::SeedWidget::
71 typedef cpPlugins::BaseObjects::DataObject _TData;
72 typedef cpPlugins::DataObjects::Mesh _TMesh;
74 this->_ConfigureInput< _TData >( "Input", false, false );
75 this->_ConfigureOutput< _TMesh >( "Output" );
78 // -------------------------------------------------------------------------
79 cpPluginsWidgets::SeedWidget::
82 for( auto w = this->m_Widgets.begin( ); w != this->m_Widgets.end( ); ++w )
84 this->m_Widgets.clear( );
87 // -------------------------------------------------------------------------
88 void cpPluginsWidgets::SeedWidget::
91 static vtkPolyData* prev_pdata = NULL;
92 auto pdata = this->_CreateVTK< vtkPolyData >( );
93 if( prev_pdata != pdata )
95 pdata->SetPoints( vtkPoints::New( ) );
96 pdata->SetVerts( vtkCellArray::New( ) );
97 pdata->SetLines( vtkCellArray::New( ) );
98 pdata->SetPolys( vtkCellArray::New( ) );
99 pdata->SetStrips( vtkCellArray::New( ) );
103 auto points = pdata->GetPoints( );
104 auto verts = pdata->GetVerts( );
106 if( this->m_Configured )
108 if( points->GetNumberOfPoints( ) == 0 )
110 std::stringstream text;
112 for( auto w = this->m_Widgets.begin( ); w != this->m_Widgets.end( ); ++w )
114 for( auto r = ( *w )->Widgets.begin( ); r != ( *w )->Widgets.end( ); ++r )
117 dynamic_cast< vtkSeedRepresentation* >(
118 ( *r )->GetRepresentation( )
123 for( unsigned int i = 0; i < rep->GetNumberOfSeeds( ); ++i )
125 rep->GetSeedWorldPosition( i, pos );
129 text << pos[ 0 ] << " " << pos[ 1 ] << " " << pos[ 2 ];
130 points->InsertNextPoint( pos );
135 ( *r )->EnabledOff( );
140 this->m_Parameters.SetString( "Text", text.str( ) );
146 auto init_seeds = this->m_Parameters.GetString( "Text" );
147 std::vector< std::string > tokens;
148 cpExtensions::Tokenize( tokens, init_seeds, "#" );
149 for( auto tIt = tokens.begin( ); tIt != tokens.end( ); ++tIt )
151 std::vector< std::string > coords;
152 cpExtensions::Tokenize( coords, *tIt, " \t" );
153 int dim = ( coords.size( ) < 3 )? coords.size( ): 3;
155 for( unsigned int d = 0; d < 3; ++d )
157 pos[ d ] = double( 0 );
160 std::istringstream value( coords[ d ] );
166 verts->InsertNextCell( 1 );
167 verts->InsertCellPoint( points->GetNumberOfPoints( ) );
168 points->InsertNextPoint( pos );
173 this->m_Configured = true;
176 this->GetOutput( "Output" )->SetVTK( pdata );
179 // -------------------------------------------------------------------------
180 void cpPluginsWidgets::SeedWidget::
183 typedef cpPlugins::DataObjects::Image _TImage;
185 auto image = this->GetInput< _TImage >( "Input" );
189 auto vtk_image = image->GetVTK< vtkImageData >( );
190 auto iIt = this->m_Interactors.begin( );
191 for( ; iIt != this->m_Interactors.end( ); ++iIt )
193 auto ren = ( *iIt )->GetInteractorStyle( )->GetCurrentRenderer( );
196 auto props = ren->GetViewProps( );
199 props->InitTraversal( );
200 while( vtkProp* prop = props->GetNextProp( ) )
202 auto actor = dynamic_cast< TImageActor* >( prop );
204 if( actor->GetImage( ) == vtk_image )
205 this->m_Props[ actor ] = *iIt;
216 if( this->m_Props.size( ) > 0 )
218 cpPlugins_Demangle_ImageVisualDims( image->GetITK( ), _GD0_Image );
219 else this->_Error( "Invalid input image." );
222 this->_Error( "Could not create a valid widget: no actors." );
225 this->_Error( "Could not create a valid widget: no input." );
228 // -------------------------------------------------------------------------
229 template< class _TImage >
230 void cpPluginsWidgets::SeedWidget::
231 _GD0_Image( _TImage* image )
233 for( auto p = this->m_Props.begin( ); p != this->m_Props.end( ); ++p )
237 this, dynamic_cast< TImageActor* >( p->first ), p->second
239 this->m_Widgets.push_back( d );
244 // -------------------------------------------------------------------------
245 cpPluginsWidgets::SeedWidget::TWidgetData::
247 SeedWidget* seedWidget,
249 vtkRenderWindowInteractor* iren
252 auto cb = vtkSmartPointer< SeedWidgetCallback >::New( );
253 cb->Widget = seedWidget;
256 actor->AddObserver( vtkCommand::InteractionEvent, cb );
258 auto image = actor->GetImage( );
259 int ori = actor->GetOrientation( );
261 image->GetExtent( ext );
262 for( int i = ext[ ori << 1 ]; i <= ext[ ( ori << 1 ) + 1 ]; ++i )
264 auto placer = vtkSmartPointer< _TPlacer >::New( );
265 auto handle = vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
266 auto rep = vtkSmartPointer< vtkSeedRepresentation >::New( );
267 auto wdg = vtkSmartPointer< _TWidget >::New( );
269 placer->SetImageSlice( actor );
270 handle->GetProperty( )->SetColor( 1, 0, 0 );
271 handle->SetPointPlacer( placer );
272 rep->SetHandleRepresentation( handle );
273 wdg->SetRepresentation( rep );
274 wdg->SetInteractor( iren );
275 wdg->AddObserver( vtkCommand::PlacePointEvent, cb );
276 wdg->AddObserver( vtkCommand::CursorChangedEvent, cb );
279 this->Widgets.push_back( wdg );
280 this->Placers.push_back( placer );
281 this->Handles.push_back( handle );
282 this->Representations.push_back( rep );
286 this->ActualWidgetId = actor->GetSliceNumber( );
287 this->Widgets[ this->ActualWidgetId ]->EnabledOn( );
290 // -------------------------------------------------------------------------
291 cpPluginsWidgets::SeedWidget::TWidgetData::