]> Creatis software - cpPlugins.git/blob - appli/ImageMPR/ImageMPR.cxx
6181dc673940ca9e2e6e26a735bf5d34b65fabbb
[cpPlugins.git] / appli / ImageMPR / ImageMPR.cxx
1 #include "ImageMPR.h"
2 #include "ui_ImageMPR.h"
3
4 #include <vtkRenderWindow.h>
5
6 #include <QFileDialog>
7 #include <QMessageBox>
8
9 /*
10 #include <algorithm>
11 #include <cctype>
12 #include <fstream>
13
14 #include <vtkAnnotatedCubeActor.h>
15 #include <vtkAxesActor.h>
16 #include <vtkPropAssembly.h>
17 #include <vtkProperty.h>
18
19 #include <cpPlugins/Interface/Image.h>
20
21 // -------------------------------------------------------------------------
22 #define IDMS_QT_ACTION( name )                                         \
23   QObject::connect(                                                    \
24     this->m_UI->action##name, SIGNAL( triggered( ) ),                  \
25     this, SLOT( _triggered_action##name( ) )                           \
26     )
27 */
28
29 // -------------------------------------------------------------------------
30 ImageMPR::ImageMPR( QWidget* parent )
31   : QMainWindow( parent ),
32     m_UI( new Ui::ImageMPR ),
33     m_InputImage( NULL )
34 {
35   this->m_UI->setupUi( this );
36
37   // Create and associate renderers
38   this->m_3DRenderer = vtkSmartPointer< vtkRenderer >::New( );
39   this->m_XPlaneRenderer = vtkSmartPointer< vtkRenderer >::New( );
40   this->m_YPlaneRenderer = vtkSmartPointer< vtkRenderer >::New( );
41   this->m_ZPlaneRenderer = vtkSmartPointer< vtkRenderer >::New( );
42   this->m_3DRenderer->SetBackground( 0.2, 0.2, 0.2 );
43   this->m_XPlaneRenderer->SetBackground( 0.1, 0.3, 0.8 );
44   this->m_YPlaneRenderer->SetBackground( 0.1, 0.3, 0.8 );
45   this->m_ZPlaneRenderer->SetBackground( 0.1, 0.3, 0.8 );
46   this->m_UI->m_3DVTK->GetRenderWindow( )->
47     AddRenderer( this->m_3DRenderer );
48   this->m_UI->m_XPlaneVTK->GetRenderWindow( )->
49     AddRenderer( this->m_XPlaneRenderer );
50   this->m_UI->m_YPlaneVTK->GetRenderWindow( )->
51     AddRenderer( this->m_YPlaneRenderer );
52   this->m_UI->m_ZPlaneVTK->GetRenderWindow( )->
53     AddRenderer( this->m_ZPlaneRenderer );
54
55   // Configure MPR actors
56   this->m_MPRActors = vtkSmartPointer< TMPRActors >::New( );
57
58   // Prepare interaction
59   this->m_XStyle = vtkSmartPointer< TStyle >::New( );
60   this->m_YStyle = vtkSmartPointer< TStyle >::New( );
61   this->m_ZStyle = vtkSmartPointer< TStyle >::New( );
62   this->m_XStyle->
63     Configure( this->m_MPRActors->GetSliceActors( 0 ), this->m_MPRActors );
64   this->m_YStyle->
65     Configure( this->m_MPRActors->GetSliceActors( 1 ), this->m_MPRActors );
66   this->m_ZStyle->
67     Configure( this->m_MPRActors->GetSliceActors( 2 ), this->m_MPRActors );
68   this->m_XStyle->
69     SetInteractor( this->m_UI->m_XPlaneVTK->GetInteractor( ), 0 );
70   this->m_YStyle->
71     SetInteractor( this->m_UI->m_YPlaneVTK->GetInteractor( ), 1 );
72   this->m_ZStyle->
73     SetInteractor( this->m_UI->m_ZPlaneVTK->GetInteractor( ), 2 );
74   this->m_XStyle->SetModeToNavigation( );
75   this->m_YStyle->SetModeToNavigation( );
76   this->m_ZStyle->SetModeToNavigation( );
77
78   QObject::connect(
79     this->m_UI->actionOpenPlugins, SIGNAL( triggered( ) ),
80     this, SLOT( _triggered_actionOpenPlugins( ) )
81     );
82   QObject::connect(
83     this->m_UI->actionOpenInputImage, SIGNAL( triggered( ) ),
84     this, SLOT( _triggered_actionOpenInputImage( ) )
85     );
86
87   // Start: load all disponible plugins
88   this->_triggered_actionOpenPlugins( );
89 }
90
91 // -------------------------------------------------------------------------
92 ImageMPR::
93 ~ImageMPR( )
94 {
95   // Close all connections
96   this->m_Plugins.UnloadAll( );
97
98   // Delete objects
99   delete this->m_UI;
100   if( this->m_InputImage != NULL ) delete this->m_InputImage;
101 }
102
103 // -------------------------------------------------------------------------
104 void ImageMPR::
105 _triggered_actionOpenPlugins( )
106 {
107   // Show dialog and check if it was accepted
108   QFileDialog dialog( this );
109   dialog.setFileMode( QFileDialog::ExistingFile );
110   dialog.setDirectory( "." );
111   dialog.setNameFilter(
112     tr( "Plugins file (*.so);;All files (*)" )
113     );
114   dialog.setDefaultSuffix( tr( "so" ) );
115   if( !( dialog.exec( ) ) )
116     return;
117   
118   std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( );
119   this->m_Plugins.UnloadAll( );
120   if( !( this->m_Plugins.Load( fname ) ) )
121   {
122     QMessageBox::critical(
123       this,
124       tr( "Ignoring plugin" ),
125       tr( fname.c_str( ) )
126       );
127     this->m_Plugins.UnloadAll( );
128     return;
129
130   } // fi
131
132   this->m_BaseClasses[ "ImageReader" ] =
133     "cpPlugins::Plugins::ImageReader";
134   this->m_BaseClasses[ "ImageSeriesReader" ] =
135     "cpPlugins::Plugins::ImageSeriesReader";
136 }
137
138 // -------------------------------------------------------------------------
139 void ImageMPR::
140 _triggered_actionOpenInputImage( )
141 {
142   // Show dialog and check if it was accepted
143   QFileDialog dialog( this );
144   dialog.setFileMode( QFileDialog::ExistingFiles );
145   dialog.setDirectory( tr( "." ) );
146   dialog.setNameFilter(
147     tr( "Medical image files (*.mhd *.bin *.dcm);;All files (*)" )
148     );
149   dialog.setDefaultSuffix( tr( "mhd" ) );
150   if( !( dialog.exec( ) ) )
151     return;
152   
153   if( this->m_InputImage != NULL )
154     delete this->m_InputImage;
155   this->m_InputImage = NULL;
156   unsigned int nFiles = dialog.selectedFiles( ).size( );
157   if( nFiles == 1 )
158   {
159     std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( );
160
161     TPlugin* reader =
162       dynamic_cast< TPlugin* >(
163       this->m_Plugins.CreateObject( this->m_BaseClasses[ "ImageReader" ] )
164         );
165
166     TParameters reader_params = reader->GetDefaultParameters( );
167     reader_params[ "FileName" ].second = fname;
168     reader_params[ "PixelType" ].second = "short";
169     reader_params[ "ImageDimension" ].second = "3";
170     reader_params[ "IsColorImage" ].second = "0";
171     reader->SetParameters( reader_params );
172     std::string err = reader->Update( );
173
174     if( err == "" )
175     {
176       this->m_InputImage =
177         dynamic_cast< TPluginImage* >( reader->GetOutput( 0 ) );
178       reader->DisconnectOutputs( );
179     }
180     else
181       QMessageBox::critical(
182         this,
183         tr( "Error reading single image" ),
184         tr( err.c_str( ) )
185         );
186     delete reader;
187   }
188   else if( nFiles > 1 )
189   {
190     /* TODO
191        if( this->m_ImageSeriesReaderClassName == "" )
192        {
193        QMessageBox::critical(
194        this,
195        tr( "No plugin to read an image series found!" ),
196        tr( "No plugin to read an image series found!" )
197        );
198        return( ret );
199
200        } // fi
201        std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( );
202        this->m_LastOpenedFile = fname;
203        return( ret );
204     */
205
206   } // fi
207
208   if( this->m_InputImage != NULL )
209   {
210     this->m_MPRActors->SetInputData( this->m_InputImage->GetVTKImageData( ) );
211     this->m_MPRActors->PushDataInto(
212       this->m_XPlaneRenderer,
213       this->m_YPlaneRenderer,
214       this->m_ZPlaneRenderer,
215       this->m_3DRenderer
216       );
217
218     // Reset all cameras
219     this->m_3DRenderer->ResetCamera( );
220     this->m_XPlaneRenderer->ResetCamera( );
221     this->m_YPlaneRenderer->ResetCamera( );
222     this->m_ZPlaneRenderer->ResetCamera( );
223
224     // Ok, start!
225     this->m_UI->m_3DVTK->GetRenderWindow( )->Render( );
226     this->m_UI->m_XPlaneVTK->GetRenderWindow( )->Render( );
227     this->m_UI->m_YPlaneVTK->GetRenderWindow( )->Render( );
228     this->m_UI->m_ZPlaneVTK->GetRenderWindow( )->Render( );
229
230   } // fi
231 }
232
233 // eof - $RCSfile$