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