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