1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18 #ifndef VVDICOMSERIESSELECTOR_CXX
19 #define VVDICOMSERIESSELECTOR_CXX
20 #include <itkGDCMImageIO.h>
21 #include <itkGDCMSeriesFileNames.h>
23 #include <gdcmDocEntry.h>
25 #include "vvQDicomSeriesSelector.h"
26 //#include "vvUserConfig.h"
28 //====================================================================
29 vvDicomSeriesSelector::vvDicomSeriesSelector(QWidget* parent)
33 // Correct GUI for splitter ...
34 // QSplitter * splitter = new QSplitter(this);
35 // splitter->setOrientation(Qt::Horizontal);
36 // ui.gridLayout1->addWidget(splitter, 0, 0, 1, 1);
37 // ui.mFrameLeft->setParent(splitter);
38 // ui.mFrameRight->setParent(splitter);
39 // ui.toolBox->setCurrentIndex(0);
43 ui.mButtonBox->button(QDialogButtonBox::Open)->setEnabled(false);
45 connect(ui.mBrowseButton, SIGNAL(released()),
46 this, SLOT(BrowseButtonRelease()));
47 connect(ui.mSearchButton, SIGNAL(released()),
48 this, SLOT(SearchButtonRelease()));
49 connect(ui.mListWidget, SIGNAL(itemSelectionChanged()),
50 this, SLOT(itemSelectionChanged()));
51 connect(ui.mDicomDetailsListWidget, SIGNAL(itemSelectionChanged()),
52 this, SLOT(itemDetailsSelectionChanged()));
55 /* if (config::get_current_path() != QString(0))
56 mFoldername = config::get_current_path();
58 mFoldername = QFileInfo("./").absolutePath();
60 mPreviousPath = mFoldername;
61 ui.mFolderLineEdit->setText(mFoldername);
62 // ui.mTableWidget->setRowCount(0);
64 //====================================================================
66 //====================================================================
67 void vvDicomSeriesSelector::show() {
70 // ui.mListWidget->grabKeyboard();
71 // ui.mDicomDetailsListWidget->grabKeyboard();
73 //====================================================================
75 //====================================================================
76 void vvDicomSeriesSelector::close() {
78 // ui.mListWidget->releaseKeyboard()
81 //====================================================================
83 //====================================================================
84 void vvDicomSeriesSelector::BrowseButtonRelease() {
85 QFileDialog dialog(this);
86 dialog.setFileMode(QFileDialog::AnyFile);
87 dialog.setFilter("DICOM files (*.dcm); All files (*)");
88 mFoldername = dialog.getExistingDirectory(this,
89 "Select a folder to find DICOM image",
91 ui.mFolderLineEdit->setText(mFoldername);
92 mPreviousPath = QFileInfo(mFoldername).absolutePath();
93 // config::set_current_path(mPreviousPath);
95 //====================================================================
97 //====================================================================
98 void vvDicomSeriesSelector::SearchButtonRelease() {
99 typedef itk::GDCMSeriesFileNames NamesGeneratorType;
100 NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
101 nameGenerator->SetUseSeriesDetails(true);
102 //nameGenerator->SetDirectory(mFoldername.toStdString());
103 nameGenerator->SetRecursive(ui.mIsRecursiveCheckBox->checkState() == Qt::Checked);
105 //ds gérer recursive moi-meme pour progress ...
106 nameGenerator->SetInputDirectory(mFoldername.toStdString());
109 typedef std::vector<std::string> SeriesIdContainer;
110 const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs();
112 for (unsigned int i=0; i<seriesUID.size(); i++) {
113 // std::cout << seriesUID[i] << std::endl; //ds verif existe pas déja
115 if (mListOfSeriesFilenames[seriesUID[i]]) {
116 std::cout << seriesUID[i] << " exist" << std::endl;
120 std::vector<std::string> * filenames = new std::vector<std::string>;
121 const std::vector<std::string> & temp = nameGenerator->GetFileNames(seriesUID[i]);
122 for (unsigned int j=0; j<temp.size(); j++) {
123 filenames->push_back(temp[j]);
125 mListOfSeriesFilenames[seriesUID[i]] = filenames;
127 // store first header
128 gdcm::File *header = new gdcm::File();
129 header->SetFileName((*filenames)[0]);
130 header->SetMaxSizeLoadEntry(16384);
131 header->SetLoadMode(gdcm::LD_NOSHADOW);// don't load shadow tags (in order to save memory)
136 DD(header->GetEntryValue(0x0028,0x0030).c_str());
139 DD(header->GetXSize());
140 DD(header->GetYSize());
141 DD(header->GetZSize());
142 DD(header->GetXSpacing());
143 DD(header->GetYSpacing());
144 DD(header->GetZSpacing());
145 DD(header->GetXOrigin());
146 DD(header->GetYOrigin());
147 DD(header->GetZOrigin());
150 QString size = QString("%1x%2x%3")
151 .arg(header->GetXSize())
152 .arg(header->GetYSize())
153 .arg(header->GetZSize());
154 QString spacing = QString("%1x%2x%3")
155 .arg(header->GetXSpacing())
156 .arg(header->GetYSpacing())
157 .arg(header->GetZSpacing());
158 QString origin = QString("%1x%2x%3")
159 .arg(header->GetXOrigin())
160 .arg(header->GetYOrigin())
161 .arg(header->GetZOrigin());
165 mDicomHeader[seriesUID[i]] = header;
168 QListWidgetItem *newItem = new QListWidgetItem;
169 newItem->setText(seriesUID[i].c_str());
170 ui.mListWidget->insertItem(i, newItem);
172 //AddSerieToTheTable(i, *filenames);
176 //====================================================================
178 //====================================================================
179 void vvDicomSeriesSelector::itemSelectionChanged() {
180 // mLabelSelected.setText(
181 mCurrentSerie = ui.mListWidget->selectedItems()[0]->text().toStdString();
182 mFilenames = mListOfSeriesFilenames[mCurrentSerie];
183 ui.mButtonBox->button(QDialogButtonBox::Open)->setEnabled(true);
185 if (mDicomInfo[mCurrentSerie] == "") {
187 // m = QString("Patient : <font color=\"blue\">%1</font><br>").arg(mDicomHeader[s]->GetEntryValue(0x0010,0x0010).c_str()); // Patient's name
188 mDicomInfo[mCurrentSerie] = MakeDicomInfo(mCurrentSerie, mDicomHeader[mCurrentSerie]);
190 ui.mDicomInfoPanel->setText(mDicomInfo[mCurrentSerie]);
193 ui.mDicomDetailsListWidget->clear();
194 for (unsigned int i=0; i<mFilenames->size(); i++) {
195 QListWidgetItem * newItem = new QListWidgetItem;
196 newItem->setText(QFileInfo((*mFilenames)[i].c_str()).fileName());
197 ui.mDicomDetailsListWidget->insertItem(i, newItem);
201 //====================================================================
203 //====================================================================
204 void vvDicomSeriesSelector::itemDetailsSelectionChanged() {
205 unsigned int i = ui.mDicomDetailsListWidget->currentRow();
206 if (i<mFilenames->size()) {
207 if (mDicomDetails[(*mFilenames)[i]] == "") {
208 std::ostringstream s;
209 mDicomHeader[mCurrentSerie]->Print(s);
212 gdcm::File * header = mDicomHeader[mCurrentSerie];
213 gdcm::DocEntry * e = header->GetFirstEntry();
215 if (e->GetName() != "gdcm::Unknown") {
216 l += QString("%1 : %2\n")
217 .arg(e->GetName().c_str())
218 .arg((header->GetEntryValue(e->GetGroup(), e->GetElement())).c_str());
220 e = header->GetNextEntry();
223 mDicomDetails[(*mFilenames)[i]] = l.toStdString();
225 ui.mDicomDetailsLabel->setText(mDicomDetails[(*mFilenames)[i]].c_str());
228 //====================================================================
230 //====================================================================
231 QString vvDicomSeriesSelector::MakeDicomInfo(std::string & s, gdcm::File *header) {
232 QString n = QString("%1").arg(mListOfSeriesFilenames[s]->size());
233 QString size = QString("%1x%2x%3")
234 .arg(header->GetXSize())
235 .arg(header->GetYSize())
236 .arg(header->GetZSize());
237 QString spacing = QString("%1x%2x%3")
238 .arg(header->GetXSpacing())
239 .arg(header->GetYSpacing())
240 .arg(header->GetZSpacing());
241 QString origin = QString("%1x%2x%3")
242 .arg(header->GetXOrigin())
243 .arg(header->GetYOrigin())
244 .arg(header->GetZOrigin());
246 //AddInfo( "Serie ID : ", s)+
247 AddInfo(header, "Patient : ", 0x0010,0x0010)+
248 AddInfo( "Folder : ", QFileInfo((*mFilenames)[0].c_str()).canonicalPath().toStdString())+
249 AddInfo(header, "Series Description : ", 0x0008,0x103e)+
250 AddInfo(header, "Modality : ", 0x0008,0x0060)+
251 AddInfo(header, "# images : ", 0x0020,0x0013)+
252 AddInfo( "# files : ", n.toStdString())+
253 AddInfo( "Size : ", size.toStdString())+
254 AddInfo( "Spacing : ", spacing.toStdString())+
255 AddInfo( "Origin : ", origin.toStdString())+
256 AddInfo(header, "Pixel size : ", 0x0028,0x0100)+
257 AddInfo( "Pixel type : ", header->GetPixelType());
260 //====================================================================
262 //====================================================================
263 QString vvDicomSeriesSelector::AddInfo(gdcm::File *header, QString n, uint16_t group, uint16_t elem) {
264 return AddInfo(n.toStdString(), header->GetEntryValue(group, elem));
266 //====================================================================
268 //====================================================================
269 QString vvDicomSeriesSelector::AddInfo(std::string n, std::string m) {
270 QString s = QString("%1 <font color=\"blue\">%2</font><br>").
271 arg(n.c_str()).arg(m.c_str());
274 //====================================================================
276 //====================================================================
277 void vvDicomSeriesSelector::AddSerieToTheTable(int i, std::vector<std::string> & filenames) {
278 gdcm::File *header = new gdcm::File();
279 header->SetFileName(filenames[0]);
280 header->SetMaxSizeLoadEntry(16384);
281 header->SetLoadMode(gdcm::LD_NOSHADOW);// don't load shadow tags (in order to save memory)
283 //header->Print(cout);
285 // mDicomHeader[] = header;
289 QTableWidgetItem *newItem = new
290 QTableWidgetItem(QString("# images = %1").arg(header->GetImageNumber()));
291 // newItem->setCheckState(Qt::Checked);
292 //newItem->setFlags(!Qt::ItemIsEditable);
293 DD(ui.mTableWidget->rowCount());
294 ui.mTableWidget->setItem(i, 0, newItem);
297 //====================================================================
299 #endif // VVDICOMSERIESSELECTOR_CXX