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