1 #include <cpPluginsIO/DicomSeriesReader.h>
9 #include <QApplication>
10 #include <QDialogButtonBox>
12 #include <QFileDialog>
13 #include <QGridLayout>
15 #include <QTreeWidget>
16 #include <QVBoxLayout>
18 #include <cpPlugins/ParametersQtDialog.h>
20 #include <itkGDCMSeriesFileNames.h>
24 class cpPluginsIO_DicomSeriesReader_ParametersQtDialog
25 : public cpPlugins::ParametersQtDialog
28 cpPluginsIO_DicomSeriesReader_ParametersQtDialog(
29 QWidget* parent = 0, Qt::WindowFlags f = 0
31 : cpPlugins::ParametersQtDialog( parent, f )
34 virtual ~cpPluginsIO_DicomSeriesReader_ParametersQtDialog( )
39 virtual void _dlg_OpenMultipleFiles( )
41 // DICOM series analyzer
42 itk::GDCMSeriesFileNames::GlobalWarningDisplayOff( );
43 itk::GDCMSeriesFileNames::Pointer series =
44 itk::GDCMSeriesFileNames::New( );
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( "." ) );
55 QApplication::setOverrideCursor( Qt::WaitCursor );
57 parent->setEnabled( false );
59 QDialog* tree_dialog = new QDialog( parent );
60 QTreeWidget* tree_widget = new QTreeWidget( tree_dialog );
61 QList< QTreeWidgetItem* > tree_items;
64 std::map< std::string, std::vector< std::string > >
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( ) ) )
73 std::string dir_name = q.front( );
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 )
83 QTreeWidgetItem* new_item = new QTreeWidgetItem(
84 ( QTreeWidgetItem* )( NULL ),
85 QStringList( dir_name.c_str( ) )
87 QTreeWidgetItem* new_leaf = NULL;
88 std::vector< std::string >::const_iterator sIt = seriesUID.begin( );
89 for( ; sIt != seriesUID.end( ); ++sIt )
91 std::vector< std::string > filenames = series->GetFileNames( *sIt );
92 if( filenames.size( ) > 0 )
95 ss << "(" << filenames.size( ) << "): " << *sIt;
98 new_item, QStringList( ss.str( ).c_str( ) )
100 new_item->addChild( new_leaf );
101 found_files[ dir_name ][ *sIt ] = filenames;
107 if( new_leaf != NULL )
108 tree_items.append( new_item );
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 )
122 std::string new_dir_name = i->absoluteFilePath( ).toStdString( );
123 if( new_dir_name.size( ) > dir_name.size( ) )
124 q.push( new_dir_name );
132 // Show second dialog
133 if( tree_items.size( ) == 0 )
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 );
148 tree_widget->insertTopLevelItems( 0, tree_items );
149 toolsLayout->addWidget( tree_widget );
151 QDialogButtonBox* bb = new QDialogButtonBox(
152 QDialogButtonBox::Ok | QDialogButtonBox::Cancel
154 tree_dialog->connect(
155 bb, SIGNAL( accepted( ) ), tree_dialog, SLOT( accept( ) )
157 tree_dialog->connect(
158 bb, SIGNAL( rejected( ) ), tree_dialog, SLOT( reject( ) )
160 toolsLayout->addWidget( bb );
162 QApplication::restoreOverrideCursor( );
164 parent->setEnabled( true );
166 if( tree_dialog->exec( ) == 0 )
169 QTreeWidgetItem* item = tree_widget->currentItem( );
172 QTreeWidgetItem* item_parent = item->parent( );
173 if( item_parent != NULL )
175 QApplication::setOverrideCursor( Qt::WaitCursor );
177 parent->setEnabled( false );
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 ] );
190 QApplication::restoreOverrideCursor( );
192 parent->setEnabled( true );
197 itk::GDCMSeriesFileNames::GlobalWarningDisplayOn( );
201 #endif // cpPlugins_QT4
203 // -------------------------------------------------------------------------
204 cpPlugins::ParametersQtDialog* cpPluginsIO::DicomSeriesReader::
208 cpPluginsIO_DicomSeriesReader_ParametersQtDialog* dlg = NULL;
209 if( QApplication::instance( ) != NULL )
211 dlg = new cpPluginsIO_DicomSeriesReader_ParametersQtDialog( );
212 dlg->setProcessObject( this );
216 #else // cpPlugins_QT4
218 #endif // cpPlugins_QT4
221 // -------------------------------------------------------------------------
222 cpPluginsIO::DicomSeriesReader::
227 // -------------------------------------------------------------------------
228 cpPluginsIO::DicomSeriesReader::
229 ~DicomSeriesReader( )