]> Creatis software - clitk.git/blob - vv/vvQPacsConnection.cxx
Add patient ID and patient name search available.
[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
13 vvQPacsConnection::vvQPacsConnection(QWidget *i_parent)
14         :QDialog(i_parent)
15 {
16         ui.setupUi(this);
17         setWindowTitle(QString::fromUtf8("PACS CONNECTIONHHHH"));
18         createTreeView();
19         ui.tabFilter->setTabText(0,QString(tr("Modality")));
20         ui.tabFilter->setTabText(1,QString(tr("Date")));
21
22         ui. tabNetwork->setTabText(0,QString(tr("Network")));
23         ui. tabNetwork->setTabText(1,QString(tr("Configuration")));
24         ui.check_ModAll->setEnabled(true);
25         ui.networkCombo->addItem("");
26         ui.networkCombo->addItems(getDicomServers());
27         
28         // Connection   
29         connect(ui.networkCombo,SIGNAL(currentIndexChanged(int)),this,SLOT(chooseServer(int)));
30         connect(ui.removeNetworkButton,SIGNAL(clicked()),this,SLOT(removeServer()));
31         connect(ui.NetworkButton,SIGNAL(clicked()),this,SLOT(modifyServer()));
32         
33         update();
34 }
35
36 // remote a Dicom Server in VV settings
37 void vvQPacsConnection::removeServer()
38 {
39         removeDicomServer(m_nickname);
40         ui.networkCombo->removeItem(ui.networkCombo->findText(QString(m_nickname.c_str())));
41         m_nickname="";
42         refreshNetworks();
43 }
44
45 // modify a Dicom Server in VV settings
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 // refresh the list of Dicom Servers available from VV settings
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         cleanTree();
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                 m_level =gdcm::ePatient;
83                 std::vector<gdcm::DataSet> theDataSet;
84                 gdcm::EQueryLevel theLevel = gdcm::ePatient;
85                 gdcm::ERootType theRoot  = gdcm::ePatientRootType;//ePatientRootType;
86                 m_query =  gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,getPatientKeys(ui.patientName->toPlainText().toStdString(), 
87                                         ui.patientID->toPlainText().toStdString()));
88                 bool cfindWork = gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), m_query, theDataSet,    "CREATIS", m_nickname.c_str());
89                 if( cfindWork)
90                 {
91                         convertDataSet(theDataSet,Patientmodel,getPatientKeys("",""));
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 void vvQPacsConnection::cleanTree()
127 {
128         Patientmodel->removeRows(0,Patientmodel->rowCount());
129         Studymodel->removeRows(0,Patientmodel->rowCount());
130         Seriesmodel->removeRows(0,Patientmodel->rowCount());
131         Imagesmodel->removeRows(0,Patientmodel->rowCount());
132
133 }
134
135 void vvQPacsConnection::on_optionsButton_clicked()
136 {
137         vvPacsSettingsDialog *dg  = new vvPacsSettingsDialog(this);
138         dg->show();
139 }
140
141 void vvQPacsConnection::convertDataSet(std::vector<gdcm::DataSet> i_ds, QStandardItemModel *i_model, std::vector< std::pair<gdcm::Tag, std::string> > keys)
142 {
143         gdcm::Tag tagdb(0x0008,0x0020);
144         std::vector<gdcm::DataSet>::iterator it_ds = i_ds.begin();
145         for(; it_ds != i_ds.end(); it_ds++)
146         {
147                 QList<QStandardItem *> items;
148                 const gdcm::DataSet ds = (*it_ds);
149                 std::vector< std::pair<gdcm::Tag, std::string> >::iterator it_key = keys.begin();
150                 int ind = 0;
151                 for(; it_key != keys.end(); it_key++, ind++)
152                 {
153                         gdcm::DataElement de = ds.GetDataElement((*it_key).first);
154                         QStandardItem *item = new QStandardItem;
155                         const gdcm::ByteValue *bv = (de).GetByteValue();
156                         if( !de.IsEmpty() )
157                         {
158                                 std::string buffer = std::string( bv->GetPointer(), bv->GetLength() );
159                                 /*if((*it_key).first == tagdb)
160                                 {
161                                 QDate date;
162                                 date.fromString(tr(buffer.c_str()),"yyyy'MM'd");
163                                 item->setText(date.toString());
164                                 }
165                                 else
166                                 {*/
167                                 item->setText(tr(buffer.c_str()));
168                                 //}
169                         }
170                         else
171                         {
172                                 item->setText(tr(""));
173                         }
174                         if(ind ==0)
175                         {
176                                 item->setCheckable(true);
177                         }
178                         items.push_back(item);
179                 }
180                 i_model->appendRow(items);
181         }
182
183 }
184
185 // TreeViews creation
186 void vvQPacsConnection::createTreeView()
187 {
188         // Patient Tree View
189         Patientmodel = new QStandardItemModel(0,2,this); 
190         QStringList Patientlist;
191         Patientlist.push_back(tr("PATIENT NAME"));
192         Patientlist.push_back(tr("PATIENT ID"));
193         Patientmodel->setHorizontalHeaderLabels(Patientlist);
194         ui.patientTreeView->setModel(Patientmodel);
195         ui.patientTreeView->setEnabled(true);
196         connect(ui.patientTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectStudies(QModelIndex)));
197
198         // Study Tree View
199         Studymodel = new QStandardItemModel(0,3,this); 
200         QStringList Studylist;
201         Studylist.push_back(tr("DESCRIPTION"));
202         Studylist.push_back(tr("DATE"));
203         Studylist.push_back(tr("HOUR"));
204         Studymodel->setHorizontalHeaderLabels(Studylist);
205         ui.studyTreeView->setModel(Studymodel);
206         connect(ui.studyTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectSeries(QModelIndex)));
207
208
209         // Series Tree View
210         Seriesmodel = new QStandardItemModel(0,2,this); 
211         QStringList Serieslist;
212         Serieslist.push_back(tr("MODALITY"));
213         Serieslist.push_back(tr("DESCRIPTION"));
214         Serieslist.push_back(tr("no. accept."));
215         Seriesmodel->setHorizontalHeaderLabels(Serieslist);
216         ui.seriesTreeView->setModel(Seriesmodel);
217         connect(ui.seriesTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectImages(QModelIndex)));
218
219         // Images Tree View
220         Imagesmodel = new QStandardItemModel(0,1,this); 
221         QStringList Imageslist;
222         Imageslist.push_back(tr("instance number"));
223         Imageslist.push_back(tr("sopuid"));
224         Imagesmodel->setHorizontalHeaderLabels(Imageslist);
225         ui.imagesTreeView->setModel(Imagesmodel);
226 }
227
228 void vvQPacsConnection::selectStudies(const QModelIndex &index)
229 {
230         m_level =gdcm::eStudy;
231         Studymodel->removeRows(0, Studymodel->rowCount(),QModelIndex());
232         QVariant elt= Patientmodel->data(index.sibling(index.row(),1));
233         m_patient=elt.toString().toStdString();
234         manageSeriesFilter(true);
235         
236         std::vector<gdcm::DataSet> theDataSet;
237          m_query = mquery.composeQueryStudy(m_patient);
238         if (  gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), 
239                 m_query, theDataSet, "CREATIS", m_nickname.c_str()) )
240         {
241                 convertDataSet(theDataSet, Studymodel, getStudyKeys(""));
242         }
243 }
244
245
246 void vvQPacsConnection::selectSeries(const QModelIndex &index)
247 {
248         m_level =gdcm::eSeries;
249         Seriesmodel->removeRows(0, Seriesmodel->rowCount(),QModelIndex());
250         QVariant elt= Studymodel->data(index.sibling(index.row(),3));
251         QVariant elt2= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1));
252
253
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         m_query = mquery.composeQuerySeries(keys);
271         if ( gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), m_query, theDataSet, "CREATIS", m_nickname.c_str()), "C:\\Boost")
272         {
273                 keys.clear();
274         // Modality
275         keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
276         // Description
277         keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
278         // Acceptance NUmber????
279         keys.push_back(std::make_pair(gdcm::Tag(0x0020,0x000e), elt.toString().toStdString()));
280                 convertDataSet(theDataSet, Seriesmodel, getSeriesKeys(""));
281         }
282 }
283
284 void vvQPacsConnection::selectImages(const QModelIndex &index)
285 {
286         m_level = gdcm::eImage;
287         Imagesmodel->removeRows(0, Imagesmodel->rowCount(),QModelIndex());
288         QVariant elt= Seriesmodel->data(index.sibling(index.row(),2));
289         QVariant elt2= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1));
290
291         //manageImagesFilter(true);
292         gdcm::EQueryLevel theLevel = gdcm::eImage;
293         gdcm::ERootType theRoot  = gdcm::ePatientRootType;//ePatientRootType;
294         std::vector<gdcm::DataSet> theDataSet;
295         std::vector< std::pair<gdcm::Tag, std::string> > keys;
296
297         gdcm::Tag tagsd(0x0010,0x0020);
298         keys.push_back(std::make_pair(tagsd, m_patient));
299
300         gdcm::Tag tagss(0x0020,0x000e);
301         keys.push_back(std::make_pair(tagss, elt.toString().toStdString()));
302         //= getStudyKeys(elt.toString().toStdString());
303
304         // Image Description
305         gdcm::Tag tagsdc(0x0020,0x0013);
306         keys.push_back(std::make_pair(tagsdc, ""));
307                 gdcm::Tag tagsic(0x0008,0x0018);
308
309
310         keys.push_back(std::make_pair(tagsic, ""));
311
312         gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery =  gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys);
313         keys.clear();
314         // SOP Instance UID 
315         
316
317
318         keys.push_back(std::make_pair(tagsdc, ""));
319 keys.push_back(std::make_pair(tagsic, ""));
320
321         gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), theQuery, theDataSet, "CREATIS", m_nickname.c_str());
322         convertDataSet(theDataSet, Imagesmodel, keys);
323 }
324
325
326 void vvQPacsConnection::manageStudiesFilter(bool i_enable)
327 {
328         ui.text_PHYS->setEnabled(i_enable);
329         ui.text_SDESC->setEnabled(i_enable);
330         ui.dateTab->setEnabled(i_enable);
331
332 }
333
334 void vvQPacsConnection::manageSeriesFilter(bool i_enable)
335 {
336         ui.modalityTab->setEnabled(i_enable);
337 }
338
339 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getPatientKeys(const std::string i_patname, const std::string i_patid)
340 {
341         std::vector< std::pair<gdcm::Tag, std::string> > keys;
342         // Patient Name
343         gdcm::Tag tag(0x0010,0x0010);
344         keys.push_back(std::make_pair(tag, i_patname));
345
346         //// Patient ID
347         gdcm::Tag tagpid(0x0010,0x0020);
348         keys.push_back(std::make_pair(tagpid, i_patid));
349         return keys;
350 }
351
352 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getStudyKeys(const std::string i_val)
353 {
354         std::vector< std::pair<gdcm::Tag, std::string> > keys;
355         // Study Description
356         gdcm::Tag tagsdc(0x0008,0x1030);
357         keys.push_back(std::make_pair(tagsdc, ""));
358         // Study date
359         gdcm::Tag tagdb(0x0008,0x0020);
360         keys.push_back(std::make_pair(tagdb, ""));
361         // Study Hour
362         gdcm::Tag tagsdh(0x0008,0x0030);
363         keys.push_back(std::make_pair(tagsdh, ""));
364         // Study Instance UID
365         gdcm::Tag tagsid(0x0020,0x000d);
366         keys.push_back(std::make_pair(tagsid, i_val));
367
368         return keys;
369 }
370
371
372 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getSeriesKeys(const std::string i_val)
373 {
374         std::vector< std::pair<gdcm::Tag, std::string> > keys;
375         // Modality
376         gdcm::Tag tagsm(0x0008,0x0060);
377         keys.push_back(std::make_pair(tagsm, ""));
378         // Study date
379         gdcm::Tag tagdb(0x0008,0x103e);
380         keys.push_back(std::make_pair(tagdb, ""));
381         // Study Hour
382         gdcm::Tag tagsdh(0x0020,0x000e);
383         keys.push_back(std::make_pair(tagsdh, ""));
384         // Study Instance UID
385         gdcm::Tag tagsid(0x0020,0x1209);
386         keys.push_back(std::make_pair(tagsid, i_val));
387
388         return keys;
389 }
390 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getKeys()
391 {
392         std::vector< std::pair<gdcm::Tag, std::string> > keys;
393         // Patient Name
394         gdcm::Tag tag(0x0010,0x0010);
395         keys.push_back(std::make_pair(tag, ""));
396
397         //// Patient ID
398         gdcm::Tag tagpid(0x0010,0x0020);
399         keys.push_back(std::make_pair(tagpid, ""));
400
401         // Modality
402         gdcm::Tag tagmod(0x0008,0x0061);
403         keys.push_back(std::make_pair(tagmod, ""));
404
405         // date of birth
406         gdcm::Tag tagdb(0x0010,0x0030);
407         keys.push_back(std::make_pair(tagdb, ""));
408
409         // Study Date
410         gdcm::Tag tagsd(0x0020,0x000D);
411         keys.push_back(std::make_pair(tagsd, ""));
412
413         //// Study Time
414         //gdcm::Tag tagst(8,30);
415         //keys.push_back(std::make_pair(tagst, ""));
416
417         //// Study Description
418         //gdcm::Tag tagsdc(8,1030);
419         //keys.push_back(std::make_pair(tagsdc, ""));
420
421         //// Accession n°
422         //gdcm::Tag tagacc(8,50);
423         //keys.push_back(std::make_pair(tagacc, ""));
424
425         return keys;
426 }
427
428 void vvQPacsConnection::on_check_ModAll_clicked(bool state)
429 {
430         ui.check_MR->setEnabled(!state);
431         ui.check_CR->setEnabled(!state);
432         ui.check_OT->setEnabled(!state);
433         ui.check_RF->setEnabled(!state);
434         ui.check_SC->setEnabled(!state);
435         ui.check_CT->setEnabled(!state);
436         ui.check_US->setEnabled(!state);
437         ui.check_NM->setEnabled(!state);
438         ui.check_DR->setEnabled(!state);
439         ui.check_US->setEnabled(!state);
440         ui.check_NM->setEnabled(!state);
441         ui.check_DR->setEnabled(!state);
442         ui.check_SR->setEnabled(!state);
443         ui.check_XA->setEnabled(!state);
444         ui.check_MG->setEnabled(!state);
445         if(state)
446         {
447                 ui.check_MR->setChecked(state);
448                 ui.check_CR->setChecked(state);
449                 ui.check_OT->setChecked(state);
450                 ui.check_RF->setChecked(state);
451                 ui.check_SC->setChecked(state);
452                 ui.check_CT->setChecked(state);
453                 ui.check_US->setChecked(state);
454                 ui.check_NM->setChecked(state);
455                 ui.check_DR->setChecked(state);
456                 ui.check_US->setChecked(state);
457                 ui.check_NM->setChecked(state);
458                 ui.check_DR->setChecked(state);
459                 ui.check_SR->setChecked(state);
460                 ui.check_XA->setChecked(state);
461                 ui.check_MG->setChecked(state);
462         }
463
464 }
465
466 void vvQPacsConnection::chooseServer(int index)
467 {
468         std::map < std::string, std:: string> values = getDicomServer(ui.networkCombo->currentText());
469         m_port = values["PORT"];
470         m_aetitle = values["AETITLE"];
471         m_adress= values["ADRESS"];
472         m_nickname = values["nickname"];
473         ui.AdressEdit->setText(QString(m_adress.c_str()));
474         ui.AETitleEdit->setText(QString(m_aetitle.c_str()));
475         ui.NameEdit->setText(QString(m_nickname.c_str()));
476         ui.PortEdit->setText(QString(m_port.c_str()));
477 }
478
479 void vvQPacsConnection::on_importButton_clicked()
480         {
481                 int sel = 0;
482                 //QModelIndexList list = ui.imagesTreeView-selectedIndexes();
483                 QModelIndexList indices =  ui.imagesTreeView->selectionModel()->selectedRows(); 
484                 QModelIndexList::iterator it = indices.begin();
485                 for(; it != indices.end(); it++)
486                         sel = it->row();
487                 QModelIndex index;
488                 QVariant elt= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1));
489                 
490
491                 gdcm::ERootType theRoot  = gdcm::ePatientRootType;//ePatientRootType;
492                 std::vector<gdcm::DataSet> theDataSet;
493                 std::vector< std::pair<gdcm::Tag, std::string> > keys;
494
495
496                 // Study Description
497         //      gdcm::Tag tagsdc(0x0010,0x0020);
498                 //keys.push_back(std::make_pair(tagsdc, elt.toString().toStdString()));
499
500         
501         // Study Description
502
503
504                 //gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery =  gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, m_level ,fillMoveKeys(), true);
505
506                 bool didItWork =  gdcm::CompositeNetworkFunctions::CMove(m_adress.c_str(),atoi(m_port.c_str()), m_query, getDicomClientPort(),
507       getDicomClientAETitle().c_str(), m_aetitle.c_str(),"D:\\move" );
508                  gdcm::Directory theDir;
509                 theDir.Load("D:\\move");
510            m_files =    theDir.GetFilenames();
511            accept();
512         }
513
514 std::vector <std::string> vvQPacsConnection::getFileNames()
515 {
516         std::vector <std::string> filenames;
517         gdcm::Directory::FilenamesType::iterator it = m_files.begin();
518         for (;it != m_files.end(); it++)
519                 filenames.push_back(it->c_str());
520         return filenames;
521 }
522 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::fillMoveKeys()
523 {
524         std::vector< std::pair<gdcm::Tag, std::string> > keys;
525         switch(m_level)
526         {
527         case gdcm::ePatient:
528                         //keys.push_back(getPatientKeys("",""));
529                         break;
530         }
531
532         return keys;
533 }