1 #include <cpPlugins/Interface/BaseMPRWindow.h>
3 #ifdef cpPlugins_Interface_QT4
6 # define PLUGIN_PREFIX ""
7 # define PLUGIN_EXT "dll"
8 # define PLUGIN_REGEX "Plugins file (*.dll);;All files (*)"
10 # define PLUGIN_PREFIX "lib"
11 # define PLUGIN_EXT "so"
12 # define PLUGIN_REGEX "Plugins file (*.so);;All files (*)"
18 #include <QFileDialog>
19 #include <QMessageBox>
21 // -------------------------------------------------------------------------
22 cpPlugins::Interface::BaseMPRWindow::
23 BaseMPRWindow( QWidget* parent )
24 : cpExtensions::QT::QuadSplitter( parent ),
25 m_LastLoadedPlugin( "." )
28 this->m_XVTK = new QVTKWidget( this );
29 this->m_YVTK = new QVTKWidget( this );
30 this->m_ZVTK = new QVTKWidget( this );
31 this->m_WVTK = new QVTKWidget( this );
32 this->addWidgets( this->m_YVTK, this->m_XVTK, this->m_ZVTK, this->m_WVTK );
34 // Create and associate vtk renderers
35 this->m_MPRObjects = vtkSmartPointer< TMPRObjects >::New( );
36 this->m_MPRObjects->SetRenderWindows(
37 this->m_XVTK->GetRenderWindow( ),
38 this->m_YVTK->GetRenderWindow( ),
39 this->m_ZVTK->GetRenderWindow( ),
40 this->m_WVTK->GetRenderWindow( )
44 // -------------------------------------------------------------------------
45 cpPlugins::Interface::BaseMPRWindow::
48 if( this->m_WVTK != NULL )
50 if( this->m_ZVTK != NULL )
52 if( this->m_YVTK != NULL )
54 if( this->m_XVTK != NULL )
58 // -------------------------------------------------------------------------
59 void cpPlugins::Interface::BaseMPRWindow::
62 // Show dialog and check if it was accepted
63 QFileDialog dialog( this );
64 dialog.setFileMode( QFileDialog::ExistingFile );
65 dialog.setDirectory( this->m_LastLoadedPlugin.c_str( ) );
66 dialog.setNameFilter( tr( PLUGIN_REGEX ) );
67 dialog.setDefaultSuffix( tr( PLUGIN_EXT ) );
68 if( !( dialog.exec( ) ) )
71 std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( );
72 if( !( this->LoadPlugins( fname ) ) )
73 QMessageBox::critical(
74 this, tr( "Ignoring plugin" ), tr( fname.c_str( ) )
78 // -------------------------------------------------------------------------
79 void cpPlugins::Interface::BaseMPRWindow::
80 AssociatePluginsToMenu( QMenu* menu, QObject* obj, const char* slot )
82 std::map< std::string, std::set< std::string > >::const_iterator i;
83 std::set< std::string >::const_iterator j;
86 for( i = this->m_Filters.begin( ); i != this->m_Filters.end( ); i++ )
88 QMenu* newMenu = menu->addMenu( i->first.c_str( ) );
89 for( j = i->second.begin( ); j != i->second.end( ); ++j )
91 QAction* a = newMenu->addAction( j->c_str( ) );
92 QObject::connect( a, SIGNAL( triggered( ) ), obj, slot );
99 // -------------------------------------------------------------------------
100 bool cpPlugins::Interface::BaseMPRWindow::
101 LoadPlugins( const std::string& fname )
105 // Is it already loaded?
106 if( this->m_LoadedPlugins.find( fname ) != this->m_LoadedPlugins.end( ) )
113 // Was it succesfully loaded?
114 if( !( this->m_Interface.Load( fname ) ) )
121 // Update a simple track
122 this->m_LoadedPlugins.insert( fname );
123 this->m_LastLoadedPlugin = fname;
124 this->_UpdatePlugins( );
130 // -------------------------------------------------------------------------
131 void cpPlugins::Interface::BaseMPRWindow::
134 // Load file into a char buffer
136 "Plugins.cfg", std::ios::in | std::ios::binary | std::ios::ate
140 std::streampos size = in.tellg( );
141 char* buffer = new char[ size ];
142 in.seekg( 0, std::ios::beg );
143 in.read( buffer, size );
147 std::stringstream in_stream( buffer );
151 in_stream.getline( line, 2048 );
152 this->LoadPlugins( line );
160 // -------------------------------------------------------------------------
161 std::string cpPlugins::Interface::BaseMPRWindow::
164 std::string msg = "";
165 std::string ret = "";
166 if( this->m_ImageReader.IsNull( ) )
167 msg = "No valid image reader. Please load a valid plugin file.";
169 if( this->m_ImageReader->ExecConfigurationDialog( this ) )
172 msg = this->m_ImageReader->Update( );
175 TImage::Pointer image =
176 this->m_ImageReader->GetOutput< TImage >( "Output" );
177 if( this->m_Images.size( ) == 0 )
178 ret = image->GetName( );
180 ret = "Segmentation";
181 this->m_Images[ ret ] = image;
182 this->m_ImageReader->DisconnectOutputs( );
183 this->m_ImageReader->GetParameters( )->ClearStringList( "FileNames" );
184 vtkImageData* vtk_id = image->GetVTK< vtkImageData >( );
187 this->m_MPRObjects->AddImage( vtk_id );
189 MementoState(m_state, this->m_Image);
194 msg = "Read image does not have a valid VTK converter.";
201 // Show errors and return
204 QMessageBox::critical(
205 this, tr( "Error reading image." ), tr( msg.c_str( ) )
210 // -------------------------------------------------------------------------
211 std::string cpPlugins::Interface::BaseMPRWindow::
214 std::string msg = "";
215 std::string ret = "";
216 if( this->m_DicomSeriesReader.IsNull( ) )
217 msg = "No valid DICOM series reader. Please load a valid plugin file.";
219 if( this->m_DicomSeriesReader->ExecConfigurationDialog( this ) )
222 msg = this->m_DicomSeriesReader->Update( );
225 TImage::Pointer image =
226 this->m_DicomSeriesReader->GetOutput< TImage >( "Output" );
227 if( this->m_Images.size( ) == 0 )
228 ret = image->GetName( );
230 ret = "Segmentation";
231 this->m_Images[ ret ] = image;
232 this->m_DicomSeriesReader->DisconnectOutputs( );
233 this->m_DicomSeriesReader->GetParameters( )->
234 ClearStringList( "FileNames" );
235 vtkImageData* vtk_id = image->GetVTK< vtkImageData >( );
238 this->m_MPRObjects->AddImage( vtk_id );
240 MementoState(m_state, this->m_Image);
245 msg = "Read dicom series does not have a valid VTK converter.";
252 // Show errors and return
255 QMessageBox::critical(
256 this, tr( "Error reading dicom series." ), tr( msg.c_str( ) )
261 // -------------------------------------------------------------------------
262 std::string cpPlugins::Interface::BaseMPRWindow::
268 // -------------------------------------------------------------------------
269 void cpPlugins::Interface::BaseMPRWindow::
271 const std::string& name,
272 const std::string& input_id,
273 const std::string& output_id
276 TProcessObject::Pointer filter =
277 this->m_Interface.CreateProcessObject( name );
278 std::string category = filter->GetClassCategory( );
279 if( category == "ImageToBinaryImageFilter" )
281 TImages::iterator iIt = this->m_Images.find( input_id );
282 if( iIt != this->m_Images.end( ) )
284 filter->SetInput( "Input", this->m_Images[ input_id ] );
285 bool dlg_ok = filter->ExecConfigurationDialog( NULL );
289 std::string err = filter->Update( );
290 std::cout << "ERR: " << err << std::endl;
293 this->m_Images[ "Segmentation" ] =
294 filter->GetOutput< TImage >( "Output" );
295 filter->DisconnectOutputs( );
297 vtkImageData* vtk_id =
298 this->m_Images[ "Segmentation" ]->GetVTK< vtkImageData >( );
300 this->m_MPRObjects->AddImage( vtk_id );
303 QMessageBox::critical(
304 this, tr( "Error with plugin" ), tr( err.c_str( ) )
312 // -------------------------------------------------------------------------
313 void cpPlugins::Interface::BaseMPRWindow::
314 AddImage( const std::string& name, TImage* image )
316 this->m_Images[ name ] = image;
317 vtkImageData* vtk_id =
318 this->m_Images[ name ]->GetVTK< vtkImageData >( );
320 this->m_MPRObjects->AddImage( vtk_id );
323 // -------------------------------------------------------------------------
324 void cpPlugins::Interface::BaseMPRWindow::
327 this->m_MPRObjects->ClearAll( );
328 this->m_Images.clear( );
329 this->m_Meshes.clear( );
332 // -------------------------------------------------------------------------
333 void cpPlugins::Interface::BaseMPRWindow::
336 typedef TInterface::TClasses _C;
338 this->m_Filters.clear( );
339 _C& classes = this->m_Interface.GetClasses( );
340 for( _C::const_iterator i = classes.begin( ); i != classes.end( ); ++i )
342 TProcessObject::Pointer o =
343 this->m_Interface.CreateProcessObject( i->first );
344 std::string name = o->GetClassName( );
345 std::string category = o->GetClassCategory( );
346 if( category == "ImageReader" )
347 this->m_ImageReader = o;
348 else if( category == "ImageWriter" )
349 this->m_ImageWriter = o;
350 else if( category == "MeshReader" )
351 this->m_MeshReader = o;
352 else if( category == "MeshWriter" )
353 this->m_MeshWriter = o;
354 else if( category == "DicomSeriesReader" )
355 this->m_DicomSeriesReader = o;
357 this->m_Filters[ category ].insert( name );
360 if( category == "ImageReader" )
361 this->m_ImageReaderClass = name;
362 else if( category == "ImageWriter" )
363 this->m_ImageWriterClass = name;
364 else if( category == "MeshReader" )
365 this->m_MeshReaderClass = name;
366 else if( category == "MeshWriter" )
367 this->m_MeshWriterClass = name;
368 else if( category == "MeshToMeshFilter" )
370 if( name.find_last_of( "Cutter" ) != std::string::npos )
371 this->m_MeshCutterClass = name;
373 else if( category == "ImageToImageFilter" )
376 this->m_UI->MenuImageToImage->addAction( QString( name.c_str( ) ) );
378 action, SIGNAL( triggered( ) ),
379 this, SLOT( _triggered_actionImageToImage( ) )
382 else if( category == "ImageToMeshFilter" )
385 this->m_UI->MenuImageToMesh->addAction( QString( name.c_str( ) ) );
387 action, SIGNAL( triggered( ) ),
388 this, SLOT( _triggered_actionImageToMesh( ) )
397 #endif // cpPlugins_Interface_QT4