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