1 #ifndef VVDICOMSERIESSELECTOR_CXX
2 #define VVDICOMSERIESSELECTOR_CXX
3 #include <itkGDCMImageIO.h>
4 #include <itkGDCMSeriesFileNames.h>
6 #include <gdcmDocEntry.h>
8 #include "vvQDicomSeriesSelector.h"
9 //#include "vvUserConfig.h"
11 //====================================================================
12 vvDicomSeriesSelector::vvDicomSeriesSelector(QWidget* parent)
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);
26 ui.mButtonBox->button(QDialogButtonBox::Open)->setEnabled(false);
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()));
38 /* if (config::get_current_path() != QString(0))
39 mFoldername = config::get_current_path();
41 mFoldername = QFileInfo("./").absolutePath();
43 mPreviousPath = mFoldername;
44 ui.mFolderLineEdit->setText(mFoldername);
45 // ui.mTableWidget->setRowCount(0);
47 //====================================================================
49 //====================================================================
50 void vvDicomSeriesSelector::show() {
53 // ui.mListWidget->grabKeyboard();
54 // ui.mDicomDetailsListWidget->grabKeyboard();
56 //====================================================================
58 //====================================================================
59 void vvDicomSeriesSelector::close() {
61 // ui.mListWidget->releaseKeyboard()
64 //====================================================================
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",
74 ui.mFolderLineEdit->setText(mFoldername);
75 mPreviousPath = QFileInfo(mFoldername).absolutePath();
76 // config::set_current_path(mPreviousPath);
78 //====================================================================
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);
88 //ds gérer recursive moi-meme pour progress ...
89 nameGenerator->SetInputDirectory(mFoldername.toStdString());
92 typedef std::vector<std::string> SeriesIdContainer;
93 const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs();
95 for (unsigned int i=0; i<seriesUID.size(); i++) {
96 // std::cout << seriesUID[i] << std::endl; //ds verif existe pas déja
98 if (mListOfSeriesFilenames[seriesUID[i]]) {
99 std::cout << seriesUID[i] << " exist" << std::endl;
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]);
108 mListOfSeriesFilenames[seriesUID[i]] = filenames;
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)
119 DD(header->GetEntryValue(0x0028,0x0030).c_str());
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());
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());
148 mDicomHeader[seriesUID[i]] = header;
151 QListWidgetItem *newItem = new QListWidgetItem;
152 newItem->setText(seriesUID[i].c_str());
153 ui.mListWidget->insertItem(i, newItem);
155 //AddSerieToTheTable(i, *filenames);
159 //====================================================================
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);
168 if (mDicomInfo[mCurrentSerie] == "") {
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]);
173 ui.mDicomInfoPanel->setText(mDicomInfo[mCurrentSerie]);
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);
184 //====================================================================
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);
195 gdcm::File * header = mDicomHeader[mCurrentSerie];
196 gdcm::DocEntry * e = header->GetFirstEntry();
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());
203 e = header->GetNextEntry();
206 mDicomDetails[(*mFilenames)[i]] = l.toStdString();
208 ui.mDicomDetailsLabel->setText(mDicomDetails[(*mFilenames)[i]].c_str());
211 //====================================================================
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());
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());
243 //====================================================================
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));
249 //====================================================================
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());
257 //====================================================================
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)
266 //header->Print(cout);
268 // mDicomHeader[] = header;
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);
280 //====================================================================
282 #endif // VVDICOMSERIESSELECTOR_CXX