1 /* =======================================================================
2 * @author: Leonardo Florez-Valencia
3 * @email: florez-l@javeriana.edu.co
4 * =======================================================================
7 #include <ivq/Qt/DicomSeriesSelectorWidget.h>
8 #include <ivq/ui_DicomSeriesSelectorWidget.h>
12 #include <QFileDialog>
14 // -------------------------------------------------------------------------
15 ivq::Qt::DicomSeriesSelectorWidget::
16 DicomSeriesSelectorWidget( QWidget* parent )
18 m_UI( new Ui::DicomSeriesSelectorWidget )
20 this->m_UI->setupUi( this );
21 this->setStartDir( ".", false );
23 this->m_UI->ChooseButton, SIGNAL( clicked( ) ),
24 this, SLOT( _Choose( ) )
28 // -------------------------------------------------------------------------
29 ivq::Qt::DicomSeriesSelectorWidget::
30 ~DicomSeriesSelectorWidget( )
35 // -------------------------------------------------------------------------
36 QString ivq::Qt::DicomSeriesSelectorWidget::
39 return( this->m_UI->Directory->text( ) );
42 // -------------------------------------------------------------------------
43 void ivq::Qt::DicomSeriesSelectorWidget::
44 setStartDir( const QString& dir, bool build )
46 this->m_Series.clear( );
48 this->m_UI->Directory->setText( dir );
53 QApplication::setOverrideCursor( ::Qt::WaitCursor );
55 this->m_UI->Series->clear( );
56 this->m_UI->Series->setColumnCount( 3 );
58 labels << "Images count" << "Series UID" << "Series path";
59 this->m_UI->Series->setHorizontalHeaderLabels( labels );
61 std::string main_dir_name = dir.toStdString( );
62 std::queue< std::string > q;
63 q.push( main_dir_name );
64 while( !( q.empty( ) ) )
66 std::string dir_name = q.front( );
70 QDir dir( dir_name.c_str( ) );
71 QFileInfoList contents = dir.entryInfoList( );
72 QFileInfoList::const_iterator i = contents.begin( );
73 std::set< std::string > files;
74 for( ; i != contents.end( ); ++i )
78 std::string new_dir_name = i->absoluteFilePath( ).toStdString( );
79 if( new_dir_name.size( ) > dir_name.size( ) )
80 q.push( new_dir_name );
83 files.insert( i->absoluteFilePath( ).toStdString( ) );
87 if( files.size( ) > 0 )
89 this->m_GDCMHelper.Clear( );
90 this->m_GDCMHelper.SetUseSeriesDetails( true );
91 this->m_GDCMHelper.SetLoadMode( 0 );
92 this->m_GDCMHelper.AddRestriction( "0008|0021" );
93 this->m_GDCMHelper.SetFileNames( files.begin( ), files.end( ) );
95 gdcm::FileList* flist =
96 this->m_GDCMHelper.GetFirstSingleSerieUIDFileSet( );
97 while( flist != NULL )
99 if( flist->size( ) > 0 )
101 this->m_GDCMHelper.OrderFileList( flist );
102 gdcm::File* file = ( *flist )[ 0 ];
104 this->m_GDCMHelper.CreateUniqueSeriesIdentifier( file ).c_str( );
106 gdcm::FileList::iterator it;
107 for( it = flist->begin( ); it != flist->end( ); ++it )
109 this->m_Series[ id ].push_back( ( *it )->filename );
112 flist = this->m_GDCMHelper.GetNextSingleSerieUIDFileSet( );
121 std::map< std::string, std::vector< std::string > >::const_iterator sIt =
122 this->m_Series.begin( );
123 for( ; sIt != this->m_Series.end( ); ++sIt )
125 if( sIt->second.size( ) > 0 )
127 QFileInfo fdir( sIt->second[ 0 ].c_str( ) );
129 unsigned long rows = this->m_UI->Series->rowCount( );
130 this->m_UI->Series->insertRow( rows );
131 std::stringstream str_count;
132 str_count << sIt->second.size( );
133 QTableWidgetItem* count_item =
134 new QTableWidgetItem( str_count.str( ).c_str( ) );
135 QTableWidgetItem* uid_item =
136 new QTableWidgetItem( sIt->first.c_str( ) );
137 QTableWidgetItem* dir_item =
138 new QTableWidgetItem( fdir.dir( ).canonicalPath( ) );
139 count_item->setFlags( count_item->flags( ) & ~::Qt::ItemIsEditable );
140 uid_item->setFlags( uid_item->flags( ) & ~::Qt::ItemIsEditable );
141 dir_item->setFlags( dir_item->flags( ) & ~::Qt::ItemIsEditable );
142 this->m_UI->Series->setItem( rows, 0, count_item );
143 this->m_UI->Series->setItem( rows, 1, uid_item );
144 this->m_UI->Series->setItem( rows, 2, dir_item );
151 QApplication::restoreOverrideCursor( );
154 // -------------------------------------------------------------------------
155 std::vector< std::string >* ivq::Qt::DicomSeriesSelectorWidget::
158 QList< QTableWidgetItem* > items = this->m_UI->Series->selectedItems( );
159 if( items.size( ) > 0 )
163 item( items[ 0 ]->row( ), 1 )->text( ).toStdString( );
164 std::map< std::string, std::vector< std::string > >::iterator sIt =
165 this->m_Series.find( uid );
166 if( sIt != this->m_Series.end( ) )
167 return( &( sIt->second ) );
173 // -------------------------------------------------------------------------
174 void ivq::Qt::DicomSeriesSelectorWidget::
178 QFileDialog::getExistingDirectory(
179 this, tr( "Open Directory" ),
181 QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks
183 if( qdir.toStdString( ) != "" )
184 this->setStartDir( qdir );