]> Creatis software - clitk.git/blob - vv/vvQDicomSeriesSelector.cxx
cleanup / better handling of errors
[clitk.git] / vv / vvQDicomSeriesSelector.cxx
1 /*=========================================================================
2
3 Program:   vv
4 Language:  C++
5 Author :   Pierre Seroul (pierre.seroul@gmail.com)
6
7 Copyright (C) 2008
8 Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
9 CREATIS-LRMN http://www.creatis.insa-lyon.fr
10
11 This program is free software: you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation, version 3 of the License.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
23 =========================================================================*/
24 #ifndef VVDICOMSERIESSELECTOR_CXX
25 #define VVDICOMSERIESSELECTOR_CXX
26
27 // itk include
28 #include <itkGDCMImageIO.h>
29 #include <itkGDCMSeriesFileNames.h>
30 #include <gdcmFile.h>
31 #include <gdcmDocEntry.h>
32
33 #include "vvQDicomSeriesSelector.h"
34 //#include "vvUserConfig.h"
35
36 //====================================================================
37 vvDicomSeriesSelector::vvDicomSeriesSelector(QWidget* parent)
38         :QDialog(parent) {
39     // Set GUI
40     ui.setupUi(this);
41     // Correct GUI for splitter ...
42     //   QSplitter * splitter = new QSplitter(this);
43     //   splitter->setOrientation(Qt::Horizontal);
44     //   ui.gridLayout1->addWidget(splitter, 0, 0, 1, 1);
45     //   ui.mFrameLeft->setParent(splitter);
46     //   ui.mFrameRight->setParent(splitter);
47     //  ui.toolBox->setCurrentIndex(0);
48
49
50
51     ui.mButtonBox->button(QDialogButtonBox::Open)->setEnabled(false);
52
53     connect(ui.mBrowseButton, SIGNAL(released()),
54             this, SLOT(BrowseButtonRelease()));
55     connect(ui.mSearchButton, SIGNAL(released()),
56             this, SLOT(SearchButtonRelease()));
57     connect(ui.mListWidget, SIGNAL(itemSelectionChanged()),
58             this, SLOT(itemSelectionChanged()));
59     connect(ui.mDicomDetailsListWidget, SIGNAL(itemSelectionChanged()),
60             this, SLOT(itemDetailsSelectionChanged()));
61
62     // Initialization
63     /*  if (config::get_current_path() != QString(0))
64       mFoldername = config::get_current_path();
65       else*/
66     mFoldername = QFileInfo("./").absolutePath();
67
68     mPreviousPath = mFoldername;
69     ui.mFolderLineEdit->setText(mFoldername);
70     //  ui.mTableWidget->setRowCount(0);
71 }
72 //====================================================================
73
74 //====================================================================
75 void vvDicomSeriesSelector::show() {
76     QDialog::show();
77     //grabKeyboard();
78     // ui.mListWidget->grabKeyboard();
79     //  ui.mDicomDetailsListWidget->grabKeyboard();
80 }
81 //====================================================================
82
83 //====================================================================
84 void vvDicomSeriesSelector::close() {
85     QDialog::close();
86     // ui.mListWidget->releaseKeyboard()
87     //releaseKeyboard();
88 }
89 //====================================================================
90
91 //====================================================================
92 void vvDicomSeriesSelector::BrowseButtonRelease() {
93     QFileDialog dialog(this);
94     dialog.setFileMode(QFileDialog::AnyFile);
95     dialog.setFilter("DICOM files (*.dcm); All files (*)");
96     mFoldername = dialog.getExistingDirectory(this,
97                   "Select a folder to find DICOM image",
98                   mPreviousPath);
99     ui.mFolderLineEdit->setText(mFoldername);
100     mPreviousPath = QFileInfo(mFoldername).absolutePath();
101     //  config::set_current_path(mPreviousPath);
102 }
103 //====================================================================
104
105 //====================================================================
106 void vvDicomSeriesSelector::SearchButtonRelease() {
107     typedef itk::GDCMSeriesFileNames NamesGeneratorType;
108     NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
109     nameGenerator->SetUseSeriesDetails(true);
110     //nameGenerator->SetDirectory(mFoldername.toStdString());
111     nameGenerator->SetRecursive(ui.mIsRecursiveCheckBox->checkState() == Qt::Checked);
112
113     //ds gérer recursive moi-meme pour progress ...
114     nameGenerator->SetInputDirectory(mFoldername.toStdString());
115
116     // insert in table
117     typedef std::vector<std::string> SeriesIdContainer;
118     const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs();
119
120     for (unsigned int i=0; i<seriesUID.size(); i++) {
121         // std::cout << seriesUID[i] << std::endl; //ds verif existe pas déja
122
123         if (mListOfSeriesFilenames[seriesUID[i]]) {
124             std::cout << seriesUID[i] << " exist" << std::endl;
125         }
126         else {
127             // store filenames
128             std::vector<std::string> * filenames = new std::vector<std::string>;
129             const std::vector<std::string> & temp = nameGenerator->GetFileNames(seriesUID[i]);
130             for (unsigned int j=0; j<temp.size(); j++) {
131                 filenames->push_back(temp[j]);
132             }
133             mListOfSeriesFilenames[seriesUID[i]] = filenames;
134
135             // store first header
136             gdcm::File *header = new gdcm::File();
137             header->SetFileName((*filenames)[0]);
138             header->SetMaxSizeLoadEntry(16384);
139             header->SetLoadMode(gdcm::LD_NOSHADOW);// don't load shadow tags (in order to save memory)
140             header->Load();
141
142
143             //
144             DD(header->GetEntryValue(0x0028,0x0030).c_str());
145
146             //DS TEST DAVID
147             DD(header->GetXSize());
148             DD(header->GetYSize());
149             DD(header->GetZSize());
150             DD(header->GetXSpacing());
151             DD(header->GetYSpacing());
152             DD(header->GetZSpacing());
153             DD(header->GetXOrigin());
154             DD(header->GetYOrigin());
155             DD(header->GetZOrigin());
156             DD("\n");
157             /*
158               QString size = QString("%1x%2x%3")
159               .arg(header->GetXSize())
160               .arg(header->GetYSize())
161               .arg(header->GetZSize());
162               QString spacing = QString("%1x%2x%3")
163               .arg(header->GetXSpacing())
164               .arg(header->GetYSpacing())
165               .arg(header->GetZSpacing());
166               QString origin = QString("%1x%2x%3")
167               .arg(header->GetXOrigin())
168               .arg(header->GetYOrigin())
169               .arg(header->GetZOrigin());
170             */
171
172
173             mDicomHeader[seriesUID[i]] = header;
174
175             // new item
176             QListWidgetItem *newItem = new QListWidgetItem;
177             newItem->setText(seriesUID[i].c_str());
178             ui.mListWidget->insertItem(i, newItem);
179
180             //AddSerieToTheTable(i, *filenames);
181         }
182     }
183 }
184 //====================================================================
185
186 //====================================================================
187 void vvDicomSeriesSelector::itemSelectionChanged() {
188     //  mLabelSelected.setText(
189     mCurrentSerie = ui.mListWidget->selectedItems()[0]->text().toStdString();
190     mFilenames = mListOfSeriesFilenames[mCurrentSerie];
191     ui.mButtonBox->button(QDialogButtonBox::Open)->setEnabled(true);
192
193     if (mDicomInfo[mCurrentSerie] == "") {
194         //      QString m;
195         //      m = QString("Patient : <font color=\"blue\">%1</font><br>").arg(mDicomHeader[s]->GetEntryValue(0x0010,0x0010).c_str()); // Patient's name
196         mDicomInfo[mCurrentSerie] = MakeDicomInfo(mCurrentSerie, mDicomHeader[mCurrentSerie]);
197     }
198     ui.mDicomInfoPanel->setText(mDicomInfo[mCurrentSerie]);
199
200     // Detail tab
201     ui.mDicomDetailsListWidget->clear();
202     for (unsigned int i=0; i<mFilenames->size(); i++) {
203         QListWidgetItem * newItem = new QListWidgetItem;
204         newItem->setText(QFileInfo((*mFilenames)[i].c_str()).fileName());
205         ui.mDicomDetailsListWidget->insertItem(i, newItem);
206     }
207
208 }
209 //====================================================================
210
211 //====================================================================
212 void vvDicomSeriesSelector::itemDetailsSelectionChanged() {
213     unsigned int i = ui.mDicomDetailsListWidget->currentRow();
214     if (i<mFilenames->size()) {
215         if (mDicomDetails[(*mFilenames)[i]] == "") {
216             std::ostringstream s;
217             mDicomHeader[mCurrentSerie]->Print(s);
218
219             QString l;
220             gdcm::File * header = mDicomHeader[mCurrentSerie];
221             gdcm::DocEntry * e = header->GetFirstEntry();
222             while (e) {
223                 if (e->GetName() != "gdcm::Unknown") {
224                     l += QString("%1 : %2\n")
225                          .arg(e->GetName().c_str())
226                          .arg((header->GetEntryValue(e->GetGroup(), e->GetElement())).c_str());
227                 }
228                 e = header->GetNextEntry();
229             }
230
231             mDicomDetails[(*mFilenames)[i]] = l.toStdString();
232         }
233         ui.mDicomDetailsLabel->setText(mDicomDetails[(*mFilenames)[i]].c_str());
234     }
235 }
236 //====================================================================
237
238 //====================================================================
239 QString vvDicomSeriesSelector::MakeDicomInfo(std::string & s, gdcm::File *header) {
240     QString n = QString("%1").arg(mListOfSeriesFilenames[s]->size());
241     QString size = QString("%1x%2x%3")
242                    .arg(header->GetXSize())
243                    .arg(header->GetYSize())
244                    .arg(header->GetZSize());
245     QString spacing = QString("%1x%2x%3")
246                       .arg(header->GetXSpacing())
247                       .arg(header->GetYSpacing())
248                       .arg(header->GetZSpacing());
249     QString origin = QString("%1x%2x%3")
250                      .arg(header->GetXOrigin())
251                      .arg(header->GetYOrigin())
252                      .arg(header->GetZOrigin());
253     QString ss =
254         //AddInfo(        "Serie ID   : ", s)+
255         AddInfo(header, "Patient : ", 0x0010,0x0010)+
256         AddInfo(        "Folder : ", QFileInfo((*mFilenames)[0].c_str()).canonicalPath().toStdString())+
257         AddInfo(header, "Series Description : ", 0x0008,0x103e)+
258         AddInfo(header, "Modality : ", 0x0008,0x0060)+
259         AddInfo(header, "# images : ", 0x0020,0x0013)+
260         AddInfo(        "# files : ", n.toStdString())+
261         AddInfo(        "Size : ", size.toStdString())+
262         AddInfo(        "Spacing : ", spacing.toStdString())+
263         AddInfo(        "Origin : ", origin.toStdString())+
264         AddInfo(header, "Pixel size : ", 0x0028,0x0100)+
265         AddInfo(        "Pixel type : ", header->GetPixelType());
266     return ss;
267 }
268 //====================================================================
269
270 //====================================================================
271 QString vvDicomSeriesSelector::AddInfo(gdcm::File *header, QString n, uint16_t group, uint16_t elem) {
272     return AddInfo(n.toStdString(), header->GetEntryValue(group, elem));
273 }
274 //====================================================================
275
276 //====================================================================
277 QString vvDicomSeriesSelector::AddInfo(std::string n, std::string m) {
278     QString s = QString("%1 <font color=\"blue\">%2</font><br>").
279                 arg(n.c_str()).arg(m.c_str());
280     return s;
281 }
282 //====================================================================
283
284 //====================================================================
285 void vvDicomSeriesSelector::AddSerieToTheTable(int i, std::vector<std::string> & filenames) {
286     gdcm::File *header = new gdcm::File();
287     header->SetFileName(filenames[0]);
288     header->SetMaxSizeLoadEntry(16384);
289     header->SetLoadMode(gdcm::LD_NOSHADOW);// don't load shadow tags (in order to save memory)
290     header->Load();
291     //header->Print(cout);
292     // ->GetValEntry
293     //  mDicomHeader[] = header;
294
295     /*
296
297     QTableWidgetItem *newItem = new
298     QTableWidgetItem(QString("# images = %1").arg(header->GetImageNumber()));
299     //  newItem->setCheckState(Qt::Checked);
300     //newItem->setFlags(!Qt::ItemIsEditable);
301     DD(ui.mTableWidget->rowCount());
302     ui.mTableWidget->setItem(i, 0, newItem);
303     */
304 }
305 //====================================================================
306
307 #endif // VVDICOMSERIESSELECTOR_CXX