]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/Interface/BaseMPRWindow.cxx
b43975547a21ccaca3bf3efcfd693dafceda39c8
[cpPlugins.git] / lib / cpPlugins / Interface / BaseMPRWindow.cxx
1 #include <cpPlugins/Interface/BaseMPRWindow.h>
2
3 #ifdef cpPlugins_Interface_QT4
4
5 #ifdef _WIN32
6 #  define PLUGIN_PREFIX ""
7 #  define PLUGIN_EXT "dll"
8 #  define PLUGIN_REGEX "Plugins file (*.dll);;All files (*)"
9 #else // Linux
10 #  define PLUGIN_PREFIX "lib"
11 #  define PLUGIN_EXT "so"
12 #  define PLUGIN_REGEX "Plugins file (*.so);;All files (*)"
13 #endif // _WIN32
14
15 #include <fstream>
16 #include <sstream>
17
18 #include <QFileDialog>
19 #include <QMessageBox>
20
21 // -------------------------------------------------------------------------
22 cpPlugins::Interface::BaseMPRWindow::
23 BaseMPRWindow( QWidget* parent )
24   : cpExtensions::QT::QuadSplitter( parent ),
25     m_LastLoadedPlugin( "." )
26 {
27   // Configure splitter
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 );
33
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( )
41     );
42 }
43
44 // -------------------------------------------------------------------------
45 cpPlugins::Interface::BaseMPRWindow::
46 ~BaseMPRWindow( )
47 {
48   if( this->m_WVTK != NULL )
49     delete this->m_WVTK;
50   if( this->m_ZVTK != NULL )
51     delete this->m_ZVTK;
52   if( this->m_YVTK != NULL )
53     delete this->m_YVTK;
54   if( this->m_XVTK != NULL )
55     delete this->m_XVTK;
56 }
57
58 // -------------------------------------------------------------------------
59 void cpPlugins::Interface::BaseMPRWindow::
60 DialogLoadPlugins( )
61 {
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( ) ) )
69     return;
70
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( ) )
75       );
76 }
77
78 // -------------------------------------------------------------------------
79 void cpPlugins::Interface::BaseMPRWindow::
80 AssociatePluginsToMenu( QMenu* menu, QObject* obj, const char* slot )
81 {
82   std::map< std::string, std::set< std::string > >::const_iterator i;
83   std::set< std::string >::const_iterator j;
84
85   menu->clear( );
86   for( i = this->m_Filters.begin( ); i != this->m_Filters.end( ); i++ )
87   {
88     QMenu* newMenu = menu->addMenu( i->first.c_str( ) );
89     for( j = i->second.begin( ); j != i->second.end( ); ++j )
90     {
91       QAction* a = newMenu->addAction( j->c_str( ) );
92       QObject::connect( a, SIGNAL( triggered( ) ), obj, slot );
93
94     } // rof
95
96   } // rof
97 }
98
99 // -------------------------------------------------------------------------
100 bool cpPlugins::Interface::BaseMPRWindow::
101 LoadPlugins( const std::string& fname )
102 {
103   this->Block( );
104
105   // Is it already loaded?
106   if( this->m_LoadedPlugins.find( fname ) != this->m_LoadedPlugins.end( ) )
107   {
108     this->Unblock( );
109     return( true );
110
111   } // fi
112
113   // Was it succesfully loaded?
114   if( !( this->m_Interface.Load( fname ) ) )
115   {
116     this->Unblock( );
117     return( false );
118
119   } // fi
120
121   // Update a simple track
122   this->m_LoadedPlugins.insert( fname );
123   this->m_LastLoadedPlugin = fname;
124   this->_UpdatePlugins( );
125
126   this->Unblock( );
127   return( true );
128 }
129
130 // -------------------------------------------------------------------------
131 void cpPlugins::Interface::BaseMPRWindow::
132 LoadPlugins( )
133 {
134   // Load file into a char buffer
135   std::ifstream in(
136     "Plugins.cfg", std::ios::in | std::ios::binary | std::ios::ate
137     );
138   if( !in.is_open( ) )
139     return;
140   std::streampos size = in.tellg( );
141   char* buffer = new char[ size ];
142   in.seekg( 0, std::ios::beg );
143   in.read( buffer, size );
144   in.close( );
145
146   // Read stream
147   std::stringstream in_stream( buffer );
148   while( in_stream )
149   {
150     char line[ 2048 ];
151     in_stream.getline( line, 2048 );
152     this->LoadPlugins( line );
153
154   } // elihw
155
156   // Finish
157   delete buffer;
158 }
159
160 // -------------------------------------------------------------------------
161 bool cpPlugins::Interface::BaseMPRWindow::
162 LoadImage( )
163 {
164   std::string msg = "";
165   bool ret = true;
166   if( this->m_ImageReader.IsNull( ) )
167   {
168     msg = "No valid image reader. Please load a valid plugin file.";
169     ret = false;
170
171   } // fi
172
173   if( this->m_ImageReader->ExecConfigurationDialog( this ) )
174   {
175     this->Block( );
176     msg = this->m_ImageReader->Update( );
177     if( msg == "" )
178     {
179       this->m_Images.push_back(
180         this->m_ImageReader->GetOutput< TImage >( 0 )
181         );
182       this->m_ImageReader->DisconnectOutputs( );
183       this->m_ImageReader->GetParameters( )->ClearStringList( "FileNames" );
184       vtkImageData* vtk_id =
185         this->m_Images.rbegin( )->GetPointer( )->GetVTK< vtkImageData >( );
186       if( vtk_id != NULL )
187       {
188         this->m_MPRObjects->AddImage( vtk_id );
189         /*
190           MementoState(m_state, this->m_Image);  
191           this->m_state++;
192         */
193       }
194       else
195         msg = "Read image does not have a valid VTK converter.";
196     }
197     else
198       ret = false;
199
200   } // fi
201
202   // Show errors and return
203   this->Unblock( );
204   if( msg != "" )
205     QMessageBox::critical(
206       this, tr( "Error reading image." ), tr( msg.c_str( ) )
207       );
208   return( ret );
209 }
210
211 // -------------------------------------------------------------------------
212 bool cpPlugins::Interface::BaseMPRWindow::
213 LoadMesh( )
214 {
215   return( false );
216 }
217
218 // -------------------------------------------------------------------------
219 void cpPlugins::Interface::BaseMPRWindow::
220 ExecuteFilter( const std::string& name, int input_id, int output_id )
221 {
222   TProcessObject::Pointer filter =
223     this->m_Interface.CreateProcessObject( name );
224   std::string category = filter->GetClassCategory( );
225   if( category == "ImageToBinaryImageFilter" )
226   {
227     if( input_id < this->m_Images.size( ) )
228     {
229       filter->SetInput( 0, this->m_Images[ input_id ] );
230       bool dlg_ok = filter->ExecConfigurationDialog( NULL );
231       if( !dlg_ok )
232         return;
233
234     } // fi
235
236   } // fi
237 }
238
239 // -------------------------------------------------------------------------
240 void cpPlugins::Interface::BaseMPRWindow::
241 ClearAll( )
242 {
243   this->m_MPRObjects->ClearAll( );
244   this->m_Images.clear( );
245   this->m_Meshes.clear( );
246 }
247
248 // -------------------------------------------------------------------------
249 void cpPlugins::Interface::BaseMPRWindow::
250 _UpdatePlugins( )
251 {
252   typedef TInterface::TClasses _C;
253
254   this->m_Filters.clear( );
255   _C& classes = this->m_Interface.GetClasses( );
256   for( _C::const_iterator i = classes.begin( ); i != classes.end( ); ++i )
257   {
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;
270     else
271       this->m_Filters[ category ].insert( name );
272
273     /*
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" )
283       {
284       if( name.find_last_of( "Cutter" ) != std::string::npos )
285       this->m_MeshCutterClass = name;
286       }
287       else if( category == "ImageToImageFilter" )
288       {
289       QAction* action =
290       this->m_UI->MenuImageToImage->addAction( QString( name.c_str( ) ) );
291       QObject::connect(
292       action, SIGNAL( triggered( ) ),
293       this, SLOT( _triggered_actionImageToImage( ) )
294       );
295       }
296       else if( category == "ImageToMeshFilter" )
297       {
298       QAction* action =
299       this->m_UI->MenuImageToMesh->addAction( QString( name.c_str( ) ) );
300       QObject::connect(
301       action, SIGNAL( triggered( ) ),
302       this, SLOT( _triggered_actionImageToMesh( ) )
303       );
304
305       } // fi
306     */
307
308   } // rof
309 }
310
311 #endif // cpPlugins_Interface_QT4
312
313 // eof - $RCSfile$