]> Creatis software - clitk.git/blob - vv/vvQDicomSeriesSelector.cxx
added the new headers
[clitk.git] / vv / vvQDicomSeriesSelector.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
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
8
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.
12
13   It is distributed under dual licence
14
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>
22 #include <gdcmFile.h>
23 #include <gdcmDocEntry.h>
24
25 #include "vvQDicomSeriesSelector.h"
26 //#include "vvUserConfig.h"
27
28 //====================================================================
29 vvDicomSeriesSelector::vvDicomSeriesSelector(QWidget* parent)
30         :QDialog(parent) {
31     // Set GUI
32     ui.setupUi(this);
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);
40
41
42
43     ui.mButtonBox->button(QDialogButtonBox::Open)->setEnabled(false);
44
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()));
53
54     // Initialization
55     /*  if (config::get_current_path() != QString(0))
56       mFoldername = config::get_current_path();
57       else*/
58     mFoldername = QFileInfo("./").absolutePath();
59
60     mPreviousPath = mFoldername;
61     ui.mFolderLineEdit->setText(mFoldername);
62     //  ui.mTableWidget->setRowCount(0);
63 }
64 //====================================================================
65
66 //====================================================================
67 void vvDicomSeriesSelector::show() {
68     QDialog::show();
69     //grabKeyboard();
70     // ui.mListWidget->grabKeyboard();
71     //  ui.mDicomDetailsListWidget->grabKeyboard();
72 }
73 //====================================================================
74
75 //====================================================================
76 void vvDicomSeriesSelector::close() {
77     QDialog::close();
78     // ui.mListWidget->releaseKeyboard()
79     //releaseKeyboard();
80 }
81 //====================================================================
82
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",
90                   mPreviousPath);
91     ui.mFolderLineEdit->setText(mFoldername);
92     mPreviousPath = QFileInfo(mFoldername).absolutePath();
93     //  config::set_current_path(mPreviousPath);
94 }
95 //====================================================================
96
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);
104
105     //ds gérer recursive moi-meme pour progress ...
106     nameGenerator->SetInputDirectory(mFoldername.toStdString());
107
108     // insert in table
109     typedef std::vector<std::string> SeriesIdContainer;
110     const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs();
111
112     for (unsigned int i=0; i<seriesUID.size(); i++) {
113         // std::cout << seriesUID[i] << std::endl; //ds verif existe pas déja
114
115         if (mListOfSeriesFilenames[seriesUID[i]]) {
116             std::cout << seriesUID[i] << " exist" << std::endl;
117         }
118         else {
119             // store filenames
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]);
124             }
125             mListOfSeriesFilenames[seriesUID[i]] = filenames;
126
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)
132             header->Load();
133
134
135             //
136             DD(header->GetEntryValue(0x0028,0x0030).c_str());
137
138             //DS TEST DAVID
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());
148             DD("\n");
149             /*
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());
162             */
163
164
165             mDicomHeader[seriesUID[i]] = header;
166
167             // new item
168             QListWidgetItem *newItem = new QListWidgetItem;
169             newItem->setText(seriesUID[i].c_str());
170             ui.mListWidget->insertItem(i, newItem);
171
172             //AddSerieToTheTable(i, *filenames);
173         }
174     }
175 }
176 //====================================================================
177
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);
184
185     if (mDicomInfo[mCurrentSerie] == "") {
186         //      QString m;
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]);
189     }
190     ui.mDicomInfoPanel->setText(mDicomInfo[mCurrentSerie]);
191
192     // Detail tab
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);
198     }
199
200 }
201 //====================================================================
202
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);
210
211             QString l;
212             gdcm::File * header = mDicomHeader[mCurrentSerie];
213             gdcm::DocEntry * e = header->GetFirstEntry();
214             while (e) {
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());
219                 }
220                 e = header->GetNextEntry();
221             }
222
223             mDicomDetails[(*mFilenames)[i]] = l.toStdString();
224         }
225         ui.mDicomDetailsLabel->setText(mDicomDetails[(*mFilenames)[i]].c_str());
226     }
227 }
228 //====================================================================
229
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());
245     QString ss =
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());
258     return ss;
259 }
260 //====================================================================
261
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));
265 }
266 //====================================================================
267
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());
272     return s;
273 }
274 //====================================================================
275
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)
282     header->Load();
283     //header->Print(cout);
284     // ->GetValEntry
285     //  mDicomHeader[] = header;
286
287     /*
288
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);
295     */
296 }
297 //====================================================================
298
299 #endif // VVDICOMSERIESSELECTOR_CXX