]> Creatis software - clitk.git/blob - vv/vvQPacsConnection.cxx
modify settings save
[clitk.git] / vv / vvQPacsConnection.cxx
1 #include "vvQPacsConnection.h"
2 #include "gdcmCompositeNetworkFunctions.h"
3 #include <QtGui/qlistview.h>
4 #include <qfile.h>
5 #include <QDate>
6 #include <QIcon>
7 #include <QDateTime>
8 #include "vvPacsSettingsDialog.h"
9 #include "vvUtils.h"
10
11
12 vvQPacsConnection::vvQPacsConnection(QWidget *i_parent)
13         :QDialog(i_parent)
14 {
15         ui.setupUi(this);
16         setWindowTitle(QString::fromUtf8("PACS CONNECTIONHHHH"));
17         createTreeView();
18         ui.tabFilter->setTabText(0,QString(tr("Modality")));
19         ui.tabFilter->setTabText(1,QString(tr("Date")));
20
21         ui. tabNetwork->setTabText(0,QString(tr("Network")));
22         ui. tabNetwork->setTabText(1,QString(tr("Configuration")));
23         //ui.setChecked(true);
24         //ui.on_check_ModAll_clicked(true);
25         
26         
27         ui.networkCombo->addItem("");
28         ui.networkCombo->addItems(getDicomServers());
29         
30         connect(ui.networkCombo,SIGNAL(currentIndexChanged(int)),this,SLOT(chooseServer(int)));
31         connect(ui.scanButton,SIGNAL(clicked()),this,SLOT(on_scanButton_clicked()));
32         connect(ui.importButton, SIGNAL(clicked()), this, SLOT(on_importButton_clicked()));
33         connect(ui.removeNetworkButton,SIGNAL(clicked()),this,SLOT(removeServer()));
34         connect(ui.NetworkButton,SIGNAL(clicked()),this,SLOT(modifyServer()));
35         update();
36 }
37
38 void vvQPacsConnection::removeServer()
39 {
40         removeDicomServer(m_nickname);
41         ui.networkCombo->removeItem(ui.networkCombo->findText(QString(m_nickname.c_str())));
42         m_nickname="";
43         refreshNetworks();
44 }
45
46 void vvQPacsConnection::modifyServer()
47 {
48         AddDicomServer(ui.NameEdit->text().toStdString(),ui.AETitleEdit->text().toStdString(),ui.AdressEdit->text().toStdString(),ui.PortEdit->text().toStdString());
49         removeServer();
50 }
51
52
53 void vvQPacsConnection::refreshNetworks()
54 {
55         ui.networkCombo->clear();
56         ui.networkCombo->addItem(QString());
57         ui.networkCombo->addItems(getDicomServers());
58         ui.NameEdit->setText(QString());
59         ui.AETitleEdit->setText(QString());
60         ui.AdressEdit->setText(QString());
61         ui.PortEdit->setText(QString());
62         ui.tabNetwork->setCurrentIndex(0);
63 }
64
65 void vvQPacsConnection::on_clearButton_clicked()
66 {
67         Patientmodel->removeRows(0, Patientmodel->rowCount(),QModelIndex());
68         Studymodel->removeRows(0, Studymodel->rowCount(),QModelIndex());
69         Seriesmodel->removeRows(0, Seriesmodel->rowCount(),QModelIndex());
70         Imagesmodel->removeRows(0, Imagesmodel->rowCount(),QModelIndex());
71 }
72
73 void vvQPacsConnection::on_scanButton_clicked()
74 {
75
76         manageStudiesFilter(true);
77         bool didItWork = gdcm::CompositeNetworkFunctions::CEcho(m_adress.c_str(), atoi(m_port.c_str()), "CREATIS", m_nickname.c_str() );
78         if (didItWork)
79         {
80                 std::vector< std::pair<gdcm::Tag, std::string> > keys = getKeys();
81
82                 gdcm::EQueryLevel theLevel = gdcm::eStudy;
83                 gdcm::ERootType theRoot  = gdcm::eStudyRootType;//ePatientRootType;
84         
85                 std::vector<gdcm::DataSet> theDataSet;
86                 theLevel = gdcm::ePatient;
87                 theRoot  = gdcm::ePatientRootType;//ePatientRootType;
88                 gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery =  gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,getPatientKeys(""));
89                 gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), theQuery, theDataSet,    "CREATIS", m_nickname.c_str());
90                 std::vector<gdcm::DataSet>::iterator it_ds = theDataSet.begin();
91
92                 for(; it_ds != theDataSet.end(); it_ds++)
93                 {
94                         QList<QStandardItem *> items;
95                         const gdcm::DataSet ds = (*it_ds);
96                         std::vector< std::pair<gdcm::Tag, std::string> >::iterator it_key = keys.begin();
97                         int ind = 0;
98                         for(; it_key != keys.end(); it_key++, ind++)
99                         {
100                                 gdcm::DataElement de = ds.GetDataElement((*it_key).first);
101                                 QStandardItem *item = new QStandardItem;
102                                 const gdcm::ByteValue *bv = (de).GetByteValue();
103                                 if( !de.IsEmpty() )
104                                 {
105                                         std::string buffer = std::string( bv->GetPointer(), bv->GetLength() );
106                                         item->setText(tr(buffer.c_str()));
107                                 }
108                                 else
109                                 {
110                                         item->setText(tr(""));
111                                 }
112                                 if(ind ==0)
113                                 {
114                                         item->setCheckable(true);
115                                 }
116                                 items.push_back(item);
117                         }
118                         Patientmodel->appendRow(items);
119                 }
120         }
121 }
122
123
124 void vvQPacsConnection::on_optionsButton_clicked()
125 {
126         vvPacsSettingsDialog *dg  = new vvPacsSettingsDialog(this);
127         dg->show();
128 }
129
130 void vvQPacsConnection::convertDataSet(std::vector<gdcm::DataSet> i_ds, QStandardItemModel *i_model, std::vector< std::pair<gdcm::Tag, std::string> > keys)
131 {
132         gdcm::Tag tagdb(0x0008,0x0020);
133         std::vector<gdcm::DataSet>::iterator it_ds = i_ds.begin();
134         for(; it_ds != i_ds.end(); it_ds++)
135         {
136                 QList<QStandardItem *> items;
137                 const gdcm::DataSet ds = (*it_ds);
138                 std::vector< std::pair<gdcm::Tag, std::string> >::iterator it_key = keys.begin();
139                 int ind = 0;
140                 for(; it_key != keys.end(); it_key++, ind++)
141                 {
142                         gdcm::DataElement de = ds.GetDataElement((*it_key).first);
143                         QStandardItem *item = new QStandardItem;
144                         const gdcm::ByteValue *bv = (de).GetByteValue();
145                         if( !de.IsEmpty() )
146                         {
147                                 std::string buffer = std::string( bv->GetPointer(), bv->GetLength() );
148                                 /*if((*it_key).first == tagdb)
149                                 {
150                                 QDate date;
151                                 date.fromString(tr(buffer.c_str()),"yyyy'MM'd");
152                                 item->setText(date.toString());
153                                 }
154                                 else
155                                 {*/
156                                 item->setText(tr(buffer.c_str()));
157                                 //}
158                         }
159                         else
160                         {
161                                 item->setText(tr(""));
162                         }
163                         if(ind ==0)
164                         {
165                                 item->setCheckable(true);
166                         }
167                         items.push_back(item);
168                 }
169                 i_model->appendRow(items);
170         }
171
172 }
173
174 // TreeViews creation
175 void vvQPacsConnection::createTreeView()
176 {
177         // Patient Tree View
178         Patientmodel = new QStandardItemModel(0,2,this); 
179         QStringList Patientlist;
180         Patientlist.push_back(tr("PATIENT NAME"));
181         Patientlist.push_back(tr("PATIENT ID"));
182         Patientmodel->setHorizontalHeaderLabels(Patientlist);
183         ui.patientTreeView->setModel(Patientmodel);
184         ui.patientTreeView->setEnabled(true);
185         connect(ui.patientTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectStudies(QModelIndex)));
186
187         // Study Tree View
188         Studymodel = new QStandardItemModel(0,3,this); 
189         QStringList Studylist;
190         Studylist.push_back(tr("DESCRIPTION"));
191         Studylist.push_back(tr("DATE"));
192         Studylist.push_back(tr("HOUR"));
193         Studymodel->setHorizontalHeaderLabels(Studylist);
194         ui.studyTreeView->setModel(Studymodel);
195         connect(ui.studyTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectSeries(QModelIndex)));
196
197
198         // Series Tree View
199         Seriesmodel = new QStandardItemModel(0,2,this); 
200         QStringList Serieslist;
201         Serieslist.push_back(tr("MODALITY"));
202         Serieslist.push_back(tr("DESCRIPTION"));
203         Serieslist.push_back(tr("no. accept."));
204         Seriesmodel->setHorizontalHeaderLabels(Serieslist);
205         ui.seriesTreeView->setModel(Seriesmodel);
206         connect(ui.seriesTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectImages(QModelIndex)));
207
208         // Images Tree View
209         Imagesmodel = new QStandardItemModel(0,1,this); 
210         QStringList Imageslist;
211         Imageslist.push_back(tr("instance number"));
212         Imagesmodel->setHorizontalHeaderLabels(Imageslist);
213         ui.imagesTreeView->setModel(Imagesmodel);
214 }
215
216 void vvQPacsConnection::selectStudies(const QModelIndex &index)
217 {
218         Studymodel->removeRows(0, Studymodel->rowCount(),QModelIndex());
219         QVariant elt= Patientmodel->data(index.sibling(index.row(),1));
220         m_patient=elt.toString().toStdString();
221         manageSeriesFilter(true);
222         gdcm::EQueryLevel theLevel = gdcm::eStudy;
223         gdcm::ERootType theRoot  = gdcm::ePatientRootType;//ePatientRootType;
224         std::vector<gdcm::DataSet> theDataSet;
225         std::vector< std::pair<gdcm::Tag, std::string> > keys;
226
227         // Study Description
228         gdcm::Tag tagsd(0x0010,0x0020);
229         keys.push_back(std::make_pair(tagsd, m_patient));
230         // Study Description
231         gdcm::Tag tagsdc(0x0008,0x1030);
232         keys.push_back(std::make_pair(tagsdc, ""));
233         // Study date
234         gdcm::Tag tagdb(0x0008,0x0020);
235         keys.push_back(std::make_pair(tagdb, ""));
236         // Study Hour
237         gdcm::Tag tagsdh(0x0008,0x0030);
238         keys.push_back(std::make_pair(tagsdh, ""));
239         gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery =  gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys);
240         gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), theQuery, theDataSet, "CREATIS", m_nickname.c_str());
241         convertDataSet(theDataSet, Studymodel, getStudyKeys(""));
242 }
243
244
245 void vvQPacsConnection::selectSeries(const QModelIndex &index)
246 {
247         Seriesmodel->removeRows(0, Seriesmodel->rowCount(),QModelIndex());
248         QVariant elt= Studymodel->data(index.sibling(index.row(),3));
249         QVariant elt2= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1));
250
251         //manageImagesFilter(true);
252         gdcm::EQueryLevel theLevel = gdcm::eSeries;
253         gdcm::ERootType theRoot  = gdcm::ePatientRootType;//ePatientRootType;
254         std::vector<gdcm::DataSet> theDataSet;
255         std::vector< std::pair<gdcm::Tag, std::string> > keys;
256
257         //Patient Unique key
258         keys.push_back(std::make_pair(gdcm::Tag(0x0010,0x0020), m_patient));
259
260         //Study Unique Key
261         keys.push_back(std::make_pair(gdcm::Tag(0x0020,0x000d), elt.toString().toStdString()));
262
263
264         // Modality
265         keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
266         // Description
267         keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
268         // Acceptance NUmber????
269         keys.push_back(std::make_pair(gdcm::Tag(0x0020,0x000e), elt.toString().toStdString()));
270
271         gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery =  gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys);
272         keys.clear();
273         // Modality
274         keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
275         // Description
276         keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
277         // Acceptance NUmber????
278         keys.push_back(std::make_pair(gdcm::Tag(0x0020,0x000e), elt.toString().toStdString()));
279
280         gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), theQuery, theDataSet, "CREATIS", m_nickname.c_str());
281         convertDataSet(theDataSet, Seriesmodel, keys);
282 }
283
284 void vvQPacsConnection::selectImages(const QModelIndex &index)
285 {
286         Imagesmodel->removeRows(0, Imagesmodel->rowCount(),QModelIndex());
287         QVariant elt= Seriesmodel->data(index.sibling(index.row(),2));
288         QVariant elt2= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1));
289
290         //manageImagesFilter(true);
291         gdcm::EQueryLevel theLevel = gdcm::eImage;
292         gdcm::ERootType theRoot  = gdcm::ePatientRootType;//ePatientRootType;
293         std::vector<gdcm::DataSet> theDataSet;
294         std::vector< std::pair<gdcm::Tag, std::string> > keys;
295
296         gdcm::Tag tagsd(0x0010,0x0020);
297         keys.push_back(std::make_pair(tagsd, m_patient));
298
299         gdcm::Tag tagss(0x0020,0x000e);
300         keys.push_back(std::make_pair(tagss, elt.toString().toStdString()));
301         //= getStudyKeys(elt.toString().toStdString());
302
303         // Study Description
304         gdcm::Tag tagsdc(0x0020,0x0013);
305         keys.push_back(std::make_pair(tagsdc, ""));
306
307
308         gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery =  gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys);
309         keys.clear();
310         // Study Description
311
312         keys.push_back(std::make_pair(tagsdc, ""));
313
314         gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), theQuery, theDataSet, "CREATIS", m_nickname.c_str());
315         convertDataSet(theDataSet, Imagesmodel, keys);
316 }
317
318
319 void vvQPacsConnection::manageStudiesFilter(bool i_enable)
320 {
321         ui.text_PHYS->setEnabled(i_enable);
322         ui.text_SDESC->setEnabled(i_enable);
323         ui.dateTab->setEnabled(i_enable);
324
325 }
326
327 void vvQPacsConnection::manageSeriesFilter(bool i_enable)
328 {
329         ui.modalityTab->setEnabled(i_enable);
330 }
331
332 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getPatientKeys(const std::string i_val)
333 {
334         std::vector< std::pair<gdcm::Tag, std::string> > keys;
335         // Patient Name
336         gdcm::Tag tag(0x0010,0x0010);
337         keys.push_back(std::make_pair(tag, ""));
338
339         //// Patient ID
340         gdcm::Tag tagpid(0x0010,0x0020);
341         keys.push_back(std::make_pair(tagpid, i_val));
342         return keys;
343 }
344
345 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getStudyKeys(const std::string i_val)
346 {
347         std::vector< std::pair<gdcm::Tag, std::string> > keys;
348         // Study Description
349         gdcm::Tag tagsdc(0x0008,0x1030);
350         keys.push_back(std::make_pair(tagsdc, ""));
351         // Study date
352         gdcm::Tag tagdb(0x0008,0x0020);
353         keys.push_back(std::make_pair(tagdb, ""));
354         // Study Hour
355         gdcm::Tag tagsdh(0x0008,0x0030);
356         keys.push_back(std::make_pair(tagsdh, ""));
357         // Study Instance UID
358         gdcm::Tag tagsid(0x0020,0x000d);
359         keys.push_back(std::make_pair(tagsid, i_val));
360
361         return keys;
362 }
363
364
365 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getSeriesKeys(const std::string i_val)
366 {
367         std::vector< std::pair<gdcm::Tag, std::string> > keys;
368         // Modality
369         gdcm::Tag tagsm(0x0008,0x0060);
370         keys.push_back(std::make_pair(tagsm, ""));
371         // Study date
372         gdcm::Tag tagdb(0x0008,0x103e);
373         keys.push_back(std::make_pair(tagdb, ""));
374         // Study Hour
375         gdcm::Tag tagsdh(0x0020,0x000e);
376         keys.push_back(std::make_pair(tagsdh, ""));
377         // Study Instance UID
378         gdcm::Tag tagsid(0x0020,0x1209);
379         keys.push_back(std::make_pair(tagsid, i_val));
380
381         return keys;
382 }
383 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getKeys()
384 {
385         std::vector< std::pair<gdcm::Tag, std::string> > keys;
386         // Patient Name
387         gdcm::Tag tag(0x0010,0x0010);
388         keys.push_back(std::make_pair(tag, ""));
389
390         //// Patient ID
391         gdcm::Tag tagpid(0x0010,0x0020);
392         keys.push_back(std::make_pair(tagpid, ""));
393
394         // Modality
395         gdcm::Tag tagmod(0x0008,0x0061);
396         keys.push_back(std::make_pair(tagmod, ""));
397
398         // date of birth
399         gdcm::Tag tagdb(0x0010,0x0030);
400         keys.push_back(std::make_pair(tagdb, ""));
401
402         // Study Date
403         gdcm::Tag tagsd(0x0020,0x000D);
404         keys.push_back(std::make_pair(tagsd, ""));
405
406         //// Study Time
407         //gdcm::Tag tagst(8,30);
408         //keys.push_back(std::make_pair(tagst, ""));
409
410         //// Study Description
411         //gdcm::Tag tagsdc(8,1030);
412         //keys.push_back(std::make_pair(tagsdc, ""));
413
414         //// Accession n°
415         //gdcm::Tag tagacc(8,50);
416         //keys.push_back(std::make_pair(tagacc, ""));
417
418         return keys;
419 }
420
421 void vvQPacsConnection::on_check_ModAll_clicked(bool state)
422 {
423         ui.check_MR->setEnabled(!state);
424         ui.check_CR->setEnabled(!state);
425         ui.check_OT->setEnabled(!state);
426         ui.check_RF->setEnabled(!state);
427         ui.check_SC->setEnabled(!state);
428         ui.check_CT->setEnabled(!state);
429         ui.check_US->setEnabled(!state);
430         ui.check_NM->setEnabled(!state);
431         ui.check_DR->setEnabled(!state);
432         ui.check_US->setEnabled(!state);
433         ui.check_NM->setEnabled(!state);
434         ui.check_DR->setEnabled(!state);
435         ui.check_SR->setEnabled(!state);
436         ui.check_XA->setEnabled(!state);
437         ui.check_MG->setEnabled(!state);
438         if(state)
439         {
440                 ui.check_MR->setChecked(state);
441                 ui.check_CR->setChecked(state);
442                 ui.check_OT->setChecked(state);
443                 ui.check_RF->setChecked(state);
444                 ui.check_SC->setChecked(state);
445                 ui.check_CT->setChecked(state);
446                 ui.check_US->setChecked(state);
447                 ui.check_NM->setChecked(state);
448                 ui.check_DR->setChecked(state);
449                 ui.check_US->setChecked(state);
450                 ui.check_NM->setChecked(state);
451                 ui.check_DR->setChecked(state);
452                 ui.check_SR->setChecked(state);
453                 ui.check_XA->setChecked(state);
454                 ui.check_MG->setChecked(state);
455         }
456
457 }
458
459 void vvQPacsConnection::chooseServer(int index)
460 {
461         std::map < std::string, std:: string> values = getDicomServer(ui.networkCombo->currentText());
462         m_port = values["PORT"];
463         m_aetitle = values["AETITLE"];
464         m_adress= values["ADRESS"];
465         m_nickname = values["nickname"];
466         ui.AdressEdit->setText(QString(m_adress.c_str()));
467         ui.AETitleEdit->setText(QString(m_aetitle.c_str()));
468         ui.NameEdit->setText(QString(m_nickname.c_str()));
469         ui.PortEdit->setText(QString(m_port.c_str()));
470 }
471
472 void vvQPacsConnection::on_importButton_clicked()
473         {
474         
475                 QModelIndex index;
476                 QVariant elt= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1));
477                 
478                 gdcm::EQueryLevel theLevel = gdcm::ePatient;
479                 gdcm::ERootType theRoot  = gdcm::ePatientRootType;//ePatientRootType;
480                 std::vector<gdcm::DataSet> theDataSet;
481                 std::vector< std::pair<gdcm::Tag, std::string> > keys;
482                 
483                 // Study Description
484                 gdcm::Tag tagsdc(0x0010,0x0020);
485                 keys.push_back(std::make_pair(tagsdc, elt.toString().toStdString()));
486                                 gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery =  gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys);
487         //      gdcm::CompositeNetworkFunctions::CFind("127.0.0.1", 5678, theQuery, theDataSet, "CREATIS", "CONQUESTSRV1");
488         
489                  bool didItWork =  gdcm::CompositeNetworkFunctions::CMove(m_adress.c_str(),atoi(m_port.c_str()), theQuery, 0,
490        "CREATIS", m_nickname.c_str() );
491         }