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_XVTK, this->m_YVTK, 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 bool cpPlugins::Interface::BaseMPRWindow::
164 std::string msg = "";
166 if( this->m_ImageReader.IsNull( ) )
168 msg = "No valid image reader. Please load a valid plugin file.";
173 if( this->m_ImageReader->ExecConfigurationDialog( this ) )
176 msg = this->m_ImageReader->Update( );
179 this->m_Images.push_back(
180 this->m_ImageReader->GetOutput< TImage >( 0 )
182 this->m_ImageReader->DisconnectOutputs( );
183 this->m_ImageReader->GetParameters( )->ClearStringList( "FileNames" );
184 vtkImageData* vtk_id =
185 this->m_Images.rbegin( )->GetPointer( )->GetVTK< vtkImageData >( );
188 this->m_MPRObjects->AddImage( vtk_id );
190 MementoState(m_state, this->m_Image);
195 msg = "Read image does not have a valid VTK converter.";
202 // Show errors and return
205 QMessageBox::critical(
206 this, tr( "Error reading image." ), tr( msg.c_str( ) )
211 // -------------------------------------------------------------------------
212 bool cpPlugins::Interface::BaseMPRWindow::
218 // -------------------------------------------------------------------------
219 void cpPlugins::Interface::BaseMPRWindow::
220 ExecuteFilter( const std::string& name, int input_id, int output_id )
222 TProcessObject::Pointer filter =
223 this->m_Interface.CreateProcessObject( name );
224 std::string category = filter->GetClassCategory( );
225 if( category == "ImageToBinaryImageFilter" )
227 if( input_id < this->m_Images.size( ) )
229 filter->SetInput( 0, this->m_Images[ input_id ] );
230 bool dlg_ok = filter->ExecConfigurationDialog( NULL );
239 // -------------------------------------------------------------------------
240 void cpPlugins::Interface::BaseMPRWindow::
243 this->m_MPRObjects->ClearAll( );
244 this->m_Images.clear( );
245 this->m_Meshes.clear( );
248 // -------------------------------------------------------------------------
249 void cpPlugins::Interface::BaseMPRWindow::
252 typedef TInterface::TClasses _C;
254 this->m_Filters.clear( );
255 _C& classes = this->m_Interface.GetClasses( );
256 for( _C::const_iterator i = classes.begin( ); i != classes.end( ); ++i )
258 TProcessObject::Pointer o =
259 this->m_Interface.CreateProcessObject( i->first );
260 std::string name = o->GetClassName( );
261 std::string category = o->GetClassCategory( );
262 if( category == "ImageReader" )
263 this->m_ImageReader = o;
264 else if( category == "ImageWriter" )
265 this->m_ImageWriter = o;
266 else if( category == "MeshReader" )
267 this->m_MeshReader = o;
268 else if( category == "MeshWriter" )
269 this->m_MeshWriter = o;
271 this->m_Filters[ category ].insert( name );
274 if( category == "ImageReader" )
275 this->m_ImageReaderClass = name;
276 else if( category == "ImageWriter" )
277 this->m_ImageWriterClass = name;
278 else if( category == "MeshReader" )
279 this->m_MeshReaderClass = name;
280 else if( category == "MeshWriter" )
281 this->m_MeshWriterClass = name;
282 else if( category == "MeshToMeshFilter" )
284 if( name.find_last_of( "Cutter" ) != std::string::npos )
285 this->m_MeshCutterClass = name;
287 else if( category == "ImageToImageFilter" )
290 this->m_UI->MenuImageToImage->addAction( QString( name.c_str( ) ) );
292 action, SIGNAL( triggered( ) ),
293 this, SLOT( _triggered_actionImageToImage( ) )
296 else if( category == "ImageToMeshFilter" )
299 this->m_UI->MenuImageToMesh->addAction( QString( name.c_str( ) ) );
301 action, SIGNAL( triggered( ) ),
302 this, SLOT( _triggered_actionImageToMesh( ) )
311 #endif // cpPlugins_Interface_QT4