1 /*=========================================================================
4 Module: $RCSfile: vvQDicomSeriesSelector.cxx,v $
6 Date: $Date: 2010/01/06 13:31:57 $
7 Version: $Revision: 1.1 $
8 Author : Pierre Seroul (pierre.seroul@gmail.com)
11 Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
12 CREATIS-LRMN http://www.creatis.insa-lyon.fr
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.
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.
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/>.
26 =========================================================================*/
27 #ifndef VVDICOMSERIESSELECTOR_CXX
28 #define VVDICOMSERIESSELECTOR_CXX
31 #include <itkGDCMImageIO.h>
32 #include <itkGDCMSeriesFileNames.h>
34 #include <gdcmDocEntry.h>
36 #include "vvQDicomSeriesSelector.h"
37 //#include "vvUserConfig.h"
39 //====================================================================
40 vvDicomSeriesSelector::vvDicomSeriesSelector(QWidget* parent)
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);
54 ui.mButtonBox->button(QDialogButtonBox::Open)->setEnabled(false);
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()));
66 /* if (config::get_current_path() != QString(0))
67 mFoldername = config::get_current_path();
69 mFoldername = QFileInfo("./").absolutePath();
71 mPreviousPath = mFoldername;
72 ui.mFolderLineEdit->setText(mFoldername);
73 // ui.mTableWidget->setRowCount(0);
75 //====================================================================
77 //====================================================================
78 void vvDicomSeriesSelector::show() {
81 // ui.mListWidget->grabKeyboard();
82 // ui.mDicomDetailsListWidget->grabKeyboard();
84 //====================================================================
86 //====================================================================
87 void vvDicomSeriesSelector::close() {
89 // ui.mListWidget->releaseKeyboard()
92 //====================================================================
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",
102 ui.mFolderLineEdit->setText(mFoldername);
103 mPreviousPath = QFileInfo(mFoldername).absolutePath();
104 // config::set_current_path(mPreviousPath);
106 //====================================================================
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);
116 //ds gérer recursive moi-meme pour progress ...
117 nameGenerator->SetInputDirectory(mFoldername.toStdString());
120 typedef std::vector<std::string> SeriesIdContainer;
121 const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs();
123 for (unsigned int i=0; i<seriesUID.size(); i++) {
124 // std::cout << seriesUID[i] << std::endl; //ds verif existe pas déja
126 if (mListOfSeriesFilenames[seriesUID[i]]) {
127 std::cout << seriesUID[i] << " exist" << std::endl;
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]);
136 mListOfSeriesFilenames[seriesUID[i]] = filenames;
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)
147 DD(header->GetEntryValue(0x0028,0x0030).c_str());
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());
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());
176 mDicomHeader[seriesUID[i]] = header;
179 QListWidgetItem *newItem = new QListWidgetItem;
180 newItem->setText(seriesUID[i].c_str());
181 ui.mListWidget->insertItem(i, newItem);
183 //AddSerieToTheTable(i, *filenames);
187 //====================================================================
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);
196 if (mDicomInfo[mCurrentSerie] == "") {
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]);
201 ui.mDicomInfoPanel->setText(mDicomInfo[mCurrentSerie]);
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);
212 //====================================================================
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);
223 gdcm::File * header = mDicomHeader[mCurrentSerie];
224 gdcm::DocEntry * e = header->GetFirstEntry();
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());
231 e = header->GetNextEntry();
234 mDicomDetails[(*mFilenames)[i]] = l.toStdString();
236 ui.mDicomDetailsLabel->setText(mDicomDetails[(*mFilenames)[i]].c_str());
239 //====================================================================
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());
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());
271 //====================================================================
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));
277 //====================================================================
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());
285 //====================================================================
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)
294 //header->Print(cout);
296 // mDicomHeader[] = header;
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);
308 //====================================================================
310 #endif // VVDICOMSERIESSELECTOR_CXX