#include #ifdef cpPlugins_QT4 #include #include #include #include // ------------------------------------------------------------------------- cpPluginsITKIO::DicomSeriesSelectorWidget:: DicomSeriesSelectorWidget( QWidget* parent ) : QWidget( parent ), m_UI( new Ui::DicomSeriesSelectorWidget ) { this->m_UI->setupUi( this ); this->setStartDir( ".", false ); this->connect( this->m_UI->ChooseButton, SIGNAL( clicked( ) ), this, SLOT( _Choose( ) ) ); } // ------------------------------------------------------------------------- cpPluginsITKIO::DicomSeriesSelectorWidget:: ~DicomSeriesSelectorWidget( ) { delete this->m_UI; } // ------------------------------------------------------------------------- QString cpPluginsITKIO::DicomSeriesSelectorWidget:: startDir( ) const { return( this->m_UI->Directory->text( ) ); } // ------------------------------------------------------------------------- void cpPluginsITKIO::DicomSeriesSelectorWidget:: setStartDir( const QString& dir, bool build ) { this->m_Series.clear( ); this->m_UI->Directory->setText( dir ); if( !build ) return; // Process subdirs QApplication::setOverrideCursor( Qt::WaitCursor ); this->m_UI->Series->clear( ); this->m_UI->Series->setColumnCount( 3 ); QStringList labels; labels << "Images count" << "Series UID" << "Series path"; this->m_UI->Series->setHorizontalHeaderLabels( labels ); std::string main_dir_name = dir.toStdString( ); std::queue< std::string > q; q.push( main_dir_name ); while( !( q.empty( ) ) ) { std::string dir_name = q.front( ); q.pop( ); // Update queue QDir dir( dir_name.c_str( ) ); QFileInfoList contents = dir.entryInfoList( ); QFileInfoList::const_iterator i = contents.begin( ); std::set< std::string > files; 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 ); } else files.insert( i->absoluteFilePath( ).toStdString( ) ); } // rof if( files.size( ) > 0 ) { this->m_GDCMHelper.Clear( ); this->m_GDCMHelper.SetUseSeriesDetails( true ); this->m_GDCMHelper.SetLoadMode( 0 ); this->m_GDCMHelper.AddRestriction( "0008|0021" ); this->m_GDCMHelper.SetFileNames( files.begin( ), files.end( ) ); gdcm::FileList* flist = this->m_GDCMHelper.GetFirstSingleSerieUIDFileSet( ); while( flist != NULL ) { if( flist->size( ) > 0 ) { this->m_GDCMHelper.OrderFileList( flist ); gdcm::File* file = ( *flist )[ 0 ]; std::string id = this->m_GDCMHelper.CreateUniqueSeriesIdentifier( file ).c_str( ); gdcm::FileList::iterator it; for( it = flist->begin( ); it != flist->end( ); ++it ) if( *it != NULL ) this->m_Series[ id ].push_back( ( *it )->filename ); } // fi flist = this->m_GDCMHelper.GetNextSingleSerieUIDFileSet( ); } // elihw } // fi } // elihw // Show series for( auto sIt = this->m_Series.begin( ); sIt != this->m_Series.end( ); ++sIt ) { if( sIt->second.size( ) > 0 ) { QFileInfo fdir( sIt->second[ 0 ].c_str( ) ); unsigned long rows = this->m_UI->Series->rowCount( ); this->m_UI->Series->insertRow( rows ); std::stringstream str_count; str_count << sIt->second.size( ); QTableWidgetItem* count_item = new QTableWidgetItem( str_count.str( ).c_str( ) ); QTableWidgetItem* uid_item = new QTableWidgetItem( sIt->first.c_str( ) ); QTableWidgetItem* dir_item = new QTableWidgetItem( fdir.dir( ).canonicalPath( ) ); count_item->setFlags( count_item->flags( ) & ~Qt::ItemIsEditable ); uid_item->setFlags( uid_item->flags( ) & ~Qt::ItemIsEditable ); dir_item->setFlags( dir_item->flags( ) & ~Qt::ItemIsEditable ); this->m_UI->Series->setItem( rows, 0, count_item ); this->m_UI->Series->setItem( rows, 1, uid_item ); this->m_UI->Series->setItem( rows, 2, dir_item ); } // fi } // rof // Restore cursor QApplication::restoreOverrideCursor( ); } // ------------------------------------------------------------------------- std::vector< std::string >* cpPluginsITKIO::DicomSeriesSelectorWidget:: selectedFilenames( ) { auto items = this->m_UI->Series->selectedItems( ); if( items.size( ) > 0 ) { std::string uid = this->m_UI->Series-> item( items[ 0 ]->row( ), 1 )->text( ).toStdString( ); auto sIt = this->m_Series.find( uid ); if( sIt != this->m_Series.end( ) ) return( &( sIt->second ) ); } // fi return( NULL ); } // ------------------------------------------------------------------------- void cpPluginsITKIO::DicomSeriesSelectorWidget:: _Choose( ) { QString qdir = QFileDialog::getExistingDirectory( this, tr( "Open Directory" ), this->startDir( ), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks ); if( qdir.toStdString( ) != "" ) this->setStartDir( qdir ); } #endif // cpPlugins_QT4 // eof - $RCSfile$