#include #ifdef cpPlugins_QT4 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** */ class cpPluginsIO_DicomSeriesReader_ParametersQtDialog : public cpPlugins::ParametersQtDialog { public: cpPluginsIO_DicomSeriesReader_ParametersQtDialog( QWidget* parent = 0, Qt::WindowFlags f = 0 ) : cpPlugins::ParametersQtDialog( parent, f ) { } virtual ~cpPluginsIO_DicomSeriesReader_ParametersQtDialog( ) { } protected: virtual void _dlg_OpenMultipleFiles( ) { // DICOM series analyzer itk::GDCMSeriesFileNames::GlobalWarningDisplayOff( ); itk::GDCMSeriesFileNames::Pointer series = itk::GDCMSeriesFileNames::New( ); // Show dialog and check if it was accepted QWidget* parent = dynamic_cast< QWidget* >( this->parent( ) ); QFileDialog dialog( parent ); dialog.setFileMode( QFileDialog::DirectoryOnly ); dialog.setDirectory( QFileDialog::tr( "." ) ); if( !dialog.exec( ) ) return; // 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, std::vector< std::string > > > 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 = q.front( ); q.pop( ); // Get DICOM information series->SetUseSeriesDetails( true ); series->AddSeriesRestriction( "0008|0021" ); series->SetDirectory( dir_name ); const std::vector< std::string >& seriesUID = series->GetSeriesUIDs( ); if( seriesUID.size( ) > 0 ) { QTreeWidgetItem* new_item = new QTreeWidgetItem( ( QTreeWidgetItem* )( NULL ), QStringList( dir_name.c_str( ) ) ); QTreeWidgetItem* new_leaf = NULL; std::vector< std::string >::const_iterator sIt = seriesUID.begin( ); for( ; sIt != seriesUID.end( ); ++sIt ) { std::vector< std::string > filenames = series->GetFileNames( *sIt ); if( filenames.size( ) > 0 ) { 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 } // rof 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 ) { if( i->isDir( ) ) { std::string new_dir_name = i->absoluteFilePath( ).toStdString( ); if( new_dir_name.size( ) > dir_name.size( ) ) q.push( new_dir_name ); } // fi } // rof } // elihw // Show second dialog if( tree_items.size( ) == 0 ) { delete tree_widget; delete tree_dialog; return; } // fi 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; QTreeWidgetItem* item = tree_widget->currentItem( ); if( item != NULL ) { QTreeWidgetItem* item_parent = item->parent( ); if( item_parent != NULL ) { QApplication::setOverrideCursor( Qt::WaitCursor ); if( parent != NULL ) parent->setEnabled( false ); auto parameters = this->m_ProcessObject->GetParameters( ); 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 ); parameters->ClearOpenFileNameList( "FileNames" ); const std::vector< std::string >& names = found_files[ serie_dir ][ serie_id ]; for( unsigned int f = 0; f < names.size( ); ++f ) parameters->AddToOpenFileNameList( "FileNames", names[ f ] ); this->updateView( ); QApplication::restoreOverrideCursor( ); if( parent != NULL ) parent->setEnabled( true ); } // fi } // fi itk::GDCMSeriesFileNames::GlobalWarningDisplayOn( ); } }; #endif // cpPlugins_QT4 // ------------------------------------------------------------------------- cpPlugins::ParametersQtDialog* cpPluginsIO::DicomSeriesReader:: CreateQtDialog( ) { #ifdef cpPlugins_QT4 cpPluginsIO_DicomSeriesReader_ParametersQtDialog* dlg = NULL; if( QApplication::instance( ) != NULL ) { dlg = new cpPluginsIO_DicomSeriesReader_ParametersQtDialog( ); dlg->setProcessObject( this ); } // fi return( dlg ); #else // cpPlugins_QT4 return( NULL ); #endif // cpPlugins_QT4 } // ------------------------------------------------------------------------- cpPluginsIO::DicomSeriesReader:: DicomSeriesReader( ) : Superclass( ) { } // ------------------------------------------------------------------------- cpPluginsIO::DicomSeriesReader:: ~DicomSeriesReader( ) { } // eof - $RCSfile$