]> Creatis software - cpPlugins.git/blob - plugins/cpPluginsIO/DicomSeriesReader.cxx
...
[cpPlugins.git] / plugins / cpPluginsIO / DicomSeriesReader.cxx
1 #include <cpPluginsIO/DicomSeriesReader.h>
2
3 #ifdef cpPlugins_QT4
4 #include <queue>
5 #include <map>
6 #include <sstream>
7 #include <vector>
8
9 #include <QApplication>
10 #include <QDialogButtonBox>
11 #include <QDir>
12 #include <QFileDialog>
13 #include <QGridLayout>
14 #include <QLabel>
15 #include <QTreeWidget>
16 #include <QVBoxLayout>
17
18 #include <cpPlugins/ParametersQtDialog.h>
19 #include <cpPlugins_Instances/ImageIO.h>
20
21 /**
22  */
23 class cpPluginsIO_DicomSeriesReader_ParametersQtDialog
24   : public cpPlugins::ParametersQtDialog
25 {
26 public:
27   cpPluginsIO_DicomSeriesReader_ParametersQtDialog(
28     QWidget* parent = 0, Qt::WindowFlags f = 0
29     )
30     : cpPlugins::ParametersQtDialog( parent, f )
31     {
32     }
33   virtual ~cpPluginsIO_DicomSeriesReader_ParametersQtDialog( )
34     {
35     }
36
37 protected:
38   virtual void _dlg_OpenMultipleFiles( )
39     {
40       // DICOM series analyzer
41       itk::GDCMSeriesFileNames::GlobalWarningDisplayOff( );
42       itk::GDCMSeriesFileNames::Pointer series =
43         itk::GDCMSeriesFileNames::New( );
44
45       // Show dialog and check if it was accepted
46       QWidget* parent = dynamic_cast< QWidget* >( this->parent( ) );
47       QFileDialog dialog( parent );
48       dialog.setFileMode( QFileDialog::DirectoryOnly );
49       dialog.setDirectory( QFileDialog::tr( "." ) );
50       if( !dialog.exec( ) )
51         return;
52
53       // Prepare dialog
54       QApplication::setOverrideCursor( Qt::WaitCursor );
55       if( parent != NULL )
56         parent->setEnabled( false );
57
58       QDialog* tree_dialog = new QDialog( parent );
59       QTreeWidget* tree_widget = new QTreeWidget( tree_dialog );
60       QList< QTreeWidgetItem* > tree_items;
61       std::map<
62         std::string,
63         std::map< std::string, std::vector< std::string > >
64         > found_files;
65
66       std::string main_dir_name =
67         dialog.selectedFiles( ).begin( )->toStdString( );
68       std::queue< std::string > q;
69       q.push( main_dir_name );
70       while( !( q.empty( ) ) )
71       {
72         std::string dir_name = q.front( );
73         q.pop( );
74
75         // Get DICOM information
76         series->SetUseSeriesDetails( true );
77         series->AddSeriesRestriction( "0008|0021" );
78         series->SetDirectory( dir_name );
79         const std::vector< std::string >& seriesUID = series->GetSeriesUIDs( );
80         if( seriesUID.size( ) > 0 )
81         {
82           QTreeWidgetItem* new_item = new QTreeWidgetItem(
83             ( QTreeWidgetItem* )( NULL ),
84             QStringList( dir_name.c_str( ) )
85             );
86           QTreeWidgetItem* new_leaf = NULL;
87           std::vector< std::string >::const_iterator sIt = seriesUID.begin( );
88           for( ; sIt != seriesUID.end( ); ++sIt )
89           {
90             std::vector< std::string > filenames = series->GetFileNames( *sIt );
91             if( filenames.size( ) > 0 )
92             {
93               std::stringstream ss;
94               ss << "(" << filenames.size( ) << "): " << *sIt;
95               new_leaf =
96                 new QTreeWidgetItem(
97                   new_item, QStringList( ss.str( ).c_str( ) )
98                   );
99               new_item->addChild( new_leaf );
100               found_files[ dir_name ][ *sIt ] = filenames;
101
102             } // fi
103
104           } // rof
105
106           if( new_leaf != NULL )
107             tree_items.append( new_item );
108           else
109             delete new_item;
110
111         } // fi
112
113         // Update queue
114         QDir dir( dir_name.c_str( ) );
115         QFileInfoList contents = dir.entryInfoList( );
116         QFileInfoList::const_iterator i = contents.begin( );
117         for( ; i != contents.end( ); ++i )
118         {
119           if( i->isDir( ) )
120           {
121             std::string new_dir_name = i->absoluteFilePath( ).toStdString( );
122             if( new_dir_name.size( ) > dir_name.size( ) )
123               q.push( new_dir_name );
124
125           } // fi
126
127         } // rof
128
129       } // elihw
130
131       // Show second dialog
132       if( tree_items.size( ) == 0 )
133       {
134         delete tree_widget;
135         delete tree_dialog;
136         return;
137
138       } // fi
139
140       QLabel* title = new QLabel( tree_dialog );
141       title->setText( "Choose a DICOM series" );
142       QGridLayout* mainLayout = new QGridLayout( tree_dialog );
143       QVBoxLayout* toolsLayout = new QVBoxLayout( );
144       toolsLayout->addWidget( title );
145       mainLayout->addLayout( toolsLayout, 0, 0, 1, 1 );
146
147       tree_widget->insertTopLevelItems( 0, tree_items );
148       toolsLayout->addWidget( tree_widget );
149
150       QDialogButtonBox* bb = new QDialogButtonBox(
151         QDialogButtonBox::Ok | QDialogButtonBox::Cancel
152         );
153       tree_dialog->connect(
154         bb, SIGNAL( accepted( ) ), tree_dialog, SLOT( accept( ) )
155         );
156       tree_dialog->connect(
157         bb, SIGNAL( rejected( ) ), tree_dialog, SLOT( reject( ) )
158         );
159       toolsLayout->addWidget( bb );
160
161       QApplication::restoreOverrideCursor( );
162       if( parent != NULL )
163         parent->setEnabled( true );
164
165       if( tree_dialog->exec( ) == 0 )
166         return;
167
168       QTreeWidgetItem* item = tree_widget->currentItem( );
169       if( item != NULL )
170       {
171         QTreeWidgetItem* item_parent = item->parent( );
172         if( item_parent != NULL )
173         {
174           QApplication::setOverrideCursor( Qt::WaitCursor );
175           if( parent != NULL )
176             parent->setEnabled( false );
177
178           auto parameters = this->m_ProcessObject->GetParameters( );
179           std::string serie_dir = item_parent->text( 0 ).toStdString( );
180           std::string serie_id = item->text( 0 ).toStdString( );
181           serie_id = serie_id.substr( serie_id.find_first_of( " " ) + 1 );
182           parameters->ClearOpenFileNameList( "FileNames" );
183           const std::vector< std::string >& names =
184             found_files[ serie_dir ][ serie_id ];
185           for( unsigned int f = 0; f < names.size( ); ++f )
186             parameters->AddToOpenFileNameList( "FileNames", names[ f ] );
187           this->updateView( );
188
189           QApplication::restoreOverrideCursor( );
190           if( parent != NULL )
191             parent->setEnabled( true );
192
193         } // fi
194
195       } // fi
196       itk::GDCMSeriesFileNames::GlobalWarningDisplayOn( );
197     }
198 };
199
200 #endif // cpPlugins_QT4
201
202 // -------------------------------------------------------------------------
203 cpPlugins::ParametersQtDialog* cpPluginsIO::DicomSeriesReader::
204 CreateQtDialog( )
205 {
206 #ifdef cpPlugins_QT4
207   cpPluginsIO_DicomSeriesReader_ParametersQtDialog* dlg = NULL;
208   if( QApplication::instance( ) != NULL )
209   {
210     dlg = new cpPluginsIO_DicomSeriesReader_ParametersQtDialog( );
211     dlg->setProcessObject( this );
212
213   } // fi
214   return( dlg );
215 #else // cpPlugins_QT4
216   return( NULL );
217 #endif // cpPlugins_QT4
218 }
219
220 // -------------------------------------------------------------------------
221 cpPluginsIO::DicomSeriesReader::
222 DicomSeriesReader( )
223   : Superclass( )
224 {
225 }
226 // -------------------------------------------------------------------------
227 cpPluginsIO::DicomSeriesReader::
228 ~DicomSeriesReader( )
229 {
230 }
231
232 // eof - $RCSfile$