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