X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=lib%2FcpPlugins%2FPlugins%2FIO%2FDicomSeriesReader.cxx;h=e915fcf58e4c746881cd0a655e929309ad4c8e04;hb=3633aade338a13bc83642e99e6d61b6499e4b3af;hp=99f19b06a460efdd6db258a472898cd40e241000;hpb=e3bf0f6ea82aedbb6d703a7bf54a655d4d53e8d1;p=cpPlugins.git diff --git a/lib/cpPlugins/Plugins/IO/DicomSeriesReader.cxx b/lib/cpPlugins/Plugins/IO/DicomSeriesReader.cxx index 99f19b0..e915fcf 100644 --- a/lib/cpPlugins/Plugins/IO/DicomSeriesReader.cxx +++ b/lib/cpPlugins/Plugins/IO/DicomSeriesReader.cxx @@ -3,8 +3,10 @@ #ifdef cpPlugins_Interface_QT4 #include #include +#include #include +#include #include #include #include @@ -30,127 +32,148 @@ ExecConfigurationDialog( QWidget* parent ) itk::GDCMSeriesFileNames::Pointer series = itk::GDCMSeriesFileNames::New( ); - typedef std::map< std::string, TStringList > _TSeries; - typedef std::map< std::string, _TSeries > _TFilenames; - _TSeries found_series; - _TFilenames found_filenames; - // Show dialog and check if it was accepted QFileDialog dialog( parent ); dialog.setFileMode( QFileDialog::DirectoryOnly ); dialog.setDirectory( QFileDialog::tr( "." ) ); - if( dialog.exec( ) ) + if( !dialog.exec( ) ) + return( false ); + + // Prepare dialog + QApplication::setOverrideCursor( Qt::WaitCursor ); + if( parent != NULL ) + parent->setEnabled( false ); + + QDialog* tree_dialog = new QDialog( parent ); + QTreeWidget* tree_widget = new QTreeWidget( tree_dialog ); + QList< QTreeWidgetItem* > tree_items; + std::map< std::string, std::map< std::string, TStringList > > found_files; + + std::string main_dir_name = + dialog.selectedFiles( ).begin( )->toStdString( ); + std::queue< std::string > q; + q.push( main_dir_name ); + while( !( q.empty( ) ) ) { - std::string dir_name = dialog.selectedFiles( ).begin( )->toStdString( ); - std::queue< std::string > q; - q.push( dir_name ); - while( !( q.empty( ) ) ) + std::string dir_name = q.front( ); + q.pop( ); + + // Get DICOM information + series->SetUseSeriesDetails( true ); + series->AddSeriesRestriction( "0008|0021" ); + series->SetDirectory( dir_name ); + const TStringList& seriesUID = series->GetSeriesUIDs( ); + if( seriesUID.size( ) > 0 ) { - dir_name = q.front( ); - q.pop( ); - - // Get DICOM information - series->SetUseSeriesDetails( true ); - series->AddSeriesRestriction( "0008|0021" ); - series->SetDirectory( dir_name ); - const TStringList& seriesUID = series->GetSeriesUIDs( ); - if( seriesUID.size( ) > 0 ) + QTreeWidgetItem* new_item = new QTreeWidgetItem( + ( QTreeWidgetItem* )( NULL ), + QStringList( dir_name.c_str( ) ) + ); + QTreeWidgetItem* new_leaf = NULL; + TStringList::const_iterator sIt = seriesUID.begin( ); + for( ; sIt != seriesUID.end( ); ++sIt ) { - TStringList::const_iterator sIt = seriesUID.begin( ); - for( ; sIt != seriesUID.end( ); ++sIt ) + TStringList filenames = series->GetFileNames( *sIt ); + if( filenames.size( ) > 0 ) { - TStringList filenames = series->GetFileNames( *sIt ); - if( filenames.size( ) > 0 ) - { - found_series[ dir_name ].push_back( *sIt ); - found_filenames[ dir_name ][ *sIt ] = filenames; + std::stringstream ss; + ss << "(" << filenames.size( ) << "): " << *sIt; + new_leaf = + new QTreeWidgetItem( + new_item, QStringList( ss.str( ).c_str( ) ) + ); + new_item->addChild( new_leaf ); + found_files[ dir_name ][ *sIt ] = filenames; - } // fi + } // fi - } // rof + } // rof - } // fi + if( new_leaf != NULL ) + tree_items.append( new_item ); + else + delete new_item; + + } // fi // Update queue - QDir dir( dir_name.c_str( ) ); - QFileInfoList contents = dir.entryInfoList( ); - QFileInfoList::const_iterator i = contents.begin( ); - for( ; i != contents.end( ); ++i ) + QDir dir( dir_name.c_str( ) ); + QFileInfoList contents = dir.entryInfoList( ); + QFileInfoList::const_iterator i = contents.begin( ); + for( ; i != contents.end( ); ++i ) + { + if( i->isDir( ) ) { - if( i->isDir( ) ) - { - std::string new_dir_name = i->absoluteFilePath( ).toStdString( ); - if( new_dir_name.size( ) > dir_name.size( ) ) - q.push( new_dir_name ); + std::string new_dir_name = i->absoluteFilePath( ).toStdString( ); + if( new_dir_name.size( ) > dir_name.size( ) ) + q.push( new_dir_name ); - } // fi - - } // rof + } // fi - } // elihw + } // rof - } // fi + } // elihw // Show second dialog - if( found_series.size( ) > 0 ) + if( tree_items.size( ) == 0 ) { - QDialog* tree_dialog = new QDialog( parent ); - - QLabel* title = new QLabel( tree_dialog ); - title->setText( "Choose a DICOM series" ); - QGridLayout* mainLayout = new QGridLayout( tree_dialog ); - QVBoxLayout* toolsLayout = new QVBoxLayout( ); - toolsLayout->addWidget( title ); - mainLayout->addLayout( toolsLayout, 0, 0, 1, 1 ); + delete tree_widget; + delete tree_dialog; + return( false ); - QTreeWidget* tree = new QTreeWidget( tree_dialog ); - QList< QTreeWidgetItem* > tree_items; - - _TSeries::const_iterator fsIt = found_series.begin( ); - for( ; fsIt != found_series.end( ); ++fsIt ) - { - QTreeWidgetItem* new_item = - new QTreeWidgetItem( - ( QTreeWidgetItem* )( NULL ), QStringList( fsIt->first.c_str( ) ) - ); - TStringList::const_iterator sId = fsIt->second.begin( ); - for( ; sId != fsIt->second.end( ); ++sId ) - { - QTreeWidgetItem* new_leaf = - new QTreeWidgetItem( new_item, QStringList( sId->c_str( ) ) ); - new_item->addChild( new_leaf ); - - } // rof - tree_items.append( new_item ); - - } // rof - tree->insertTopLevelItems( 0, tree_items ); - toolsLayout->addWidget( tree ); - - QDialogButtonBox* bb = new QDialogButtonBox( - QDialogButtonBox::Ok | QDialogButtonBox::Cancel - ); - tree_dialog->connect( bb, SIGNAL( accepted( ) ), tree_dialog, SLOT( accept( ) ) ); - tree_dialog->connect( bb, SIGNAL( rejected( ) ), tree_dialog, SLOT( reject( ) ) ); - toolsLayout->addWidget( bb ); + } // fi - if( tree_dialog->exec( ) == 1 ) + QLabel* title = new QLabel( tree_dialog ); + title->setText( "Choose a DICOM series" ); + QGridLayout* mainLayout = new QGridLayout( tree_dialog ); + QVBoxLayout* toolsLayout = new QVBoxLayout( ); + toolsLayout->addWidget( title ); + mainLayout->addLayout( toolsLayout, 0, 0, 1, 1 ); + + tree_widget->insertTopLevelItems( 0, tree_items ); + toolsLayout->addWidget( tree_widget ); + + QDialogButtonBox* bb = new QDialogButtonBox( + QDialogButtonBox::Ok | QDialogButtonBox::Cancel + ); + tree_dialog->connect( + bb, SIGNAL( accepted( ) ), tree_dialog, SLOT( accept( ) ) + ); + tree_dialog->connect( + bb, SIGNAL( rejected( ) ), tree_dialog, SLOT( reject( ) ) + ); + toolsLayout->addWidget( bb ); + + QApplication::restoreOverrideCursor( ); + if( parent != NULL ) + parent->setEnabled( true ); + + if( tree_dialog->exec( ) == 0 ) + return( false ); + + QTreeWidgetItem* item = tree_widget->currentItem( ); + if( item != NULL ) + { + QTreeWidgetItem* item_parent = item->parent( ); + if( item_parent != NULL ) { - QTreeWidgetItem* item = tree->currentItem( ); - QTreeWidgetItem* parent = item->parent( ); + QApplication::setOverrideCursor( Qt::WaitCursor ); if( parent != NULL ) - { - std::string serie_dir = parent->text( 0 ).toStdString( ); - std::string serie_id = item->text( 0 ).toStdString( ); + parent->setEnabled( false ); - this->m_Parameters->ClearStringList( "FileNames" ); - const TStringList& filenames = found_filenames[ serie_dir ][ serie_id ]; - for( unsigned int f = 0; f < filenames.size( ); ++f ) - this->m_Parameters->AddToStringList( "FileNames", filenames[ f ] ); + std::string serie_dir = item_parent->text( 0 ).toStdString( ); + std::string serie_id = item->text( 0 ).toStdString( ); + serie_id = serie_id.substr( serie_id.find_first_of( " " ) + 1 ); + this->m_Parameters->ClearStringList( "FileNames" ); + const TStringList& names = found_files[ serie_dir ][ serie_id ]; + for( unsigned int f = 0; f < names.size( ); ++f ) + this->m_Parameters->AddToStringList( "FileNames", names[ f ] ); - r = true; + r = true; - } // fi + QApplication::restoreOverrideCursor( ); + if( parent != NULL ) + parent->setEnabled( true ); } // fi