1 #include "vvQPacsConnection.h"
2 #include "gdcmCompositeNetworkFunctions.h"
3 #include <QtGui/qlistview.h>
8 #include "vvPacsSettingsDialog.h"
13 vvQPacsConnection::vvQPacsConnection(QWidget *i_parent)
17 setWindowTitle(QString::fromUtf8("PACS CONNECTIONHHHH"));
19 ui.tabFilter->setTabText(0,QString(tr("Modality")));
20 ui.tabFilter->setTabText(1,QString(tr("Date")));
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());
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()));
36 // remote a Dicom Server in VV settings
37 void vvQPacsConnection::removeServer()
39 removeDicomServer(m_nickname);
40 ui.networkCombo->removeItem(ui.networkCombo->findText(QString(m_nickname.c_str())));
45 // modify a Dicom Server in VV settings
46 void vvQPacsConnection::modifyServer()
48 AddDicomServer(ui.NameEdit->text().toStdString(),ui.AETitleEdit->text().toStdString(),ui.AdressEdit->text().toStdString(),ui.PortEdit->text().toStdString());
52 // refresh the list of Dicom Servers available from VV settings
53 void vvQPacsConnection::refreshNetworks()
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);
65 void vvQPacsConnection::on_clearButton_clicked()
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());
73 void vvQPacsConnection::on_scanButton_clicked()
76 manageStudiesFilter(true);
77 bool didItWork = gdcm::CompositeNetworkFunctions::CEcho(m_adress.c_str(), atoi(m_port.c_str()), "CREATIS", m_nickname.c_str() );
80 std::vector< std::pair<gdcm::Tag, std::string> > keys = getKeys();
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());
91 convertDataSet(theDataSet,Patientmodel,getPatientKeys("",""));
92 std::vector<gdcm::DataSet>::iterator it_ds = theDataSet.begin();
94 for(; it_ds != theDataSet.end(); it_ds++)
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();
100 for(; it_key != keys.end(); it_key++, ind++)
102 gdcm::DataElement de = ds.GetDataElement((*it_key).first);
103 QStandardItem *item = new QStandardItem;
104 const gdcm::ByteValue *bv = (de).GetByteValue();
107 std::string buffer = std::string( bv->GetPointer(), bv->GetLength() );
108 item->setText(tr(buffer.c_str()));
112 item->setText(tr(""));
116 item->setCheckable(true);
118 items.push_back(item);
120 Patientmodel->appendRow(items);
126 void vvQPacsConnection::cleanTree()
128 Patientmodel->removeRows(0,Patientmodel->rowCount());
129 Studymodel->removeRows(0,Patientmodel->rowCount());
130 Seriesmodel->removeRows(0,Patientmodel->rowCount());
131 Imagesmodel->removeRows(0,Patientmodel->rowCount());
135 void vvQPacsConnection::on_optionsButton_clicked()
137 vvPacsSettingsDialog *dg = new vvPacsSettingsDialog(this);
141 void vvQPacsConnection::convertDataSet(std::vector<gdcm::DataSet> i_ds, QStandardItemModel *i_model, std::vector< std::pair<gdcm::Tag, std::string> > keys)
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++)
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();
151 for(; it_key != keys.end(); it_key++, ind++)
153 gdcm::DataElement de = ds.GetDataElement((*it_key).first);
154 QStandardItem *item = new QStandardItem;
155 const gdcm::ByteValue *bv = (de).GetByteValue();
158 std::string buffer = std::string( bv->GetPointer(), bv->GetLength() );
159 /*if((*it_key).first == tagdb)
162 date.fromString(tr(buffer.c_str()),"yyyy'MM'd");
163 item->setText(date.toString());
167 item->setText(tr(buffer.c_str()));
172 item->setText(tr(""));
176 item->setCheckable(true);
178 items.push_back(item);
180 i_model->appendRow(items);
185 // TreeViews creation
186 void vvQPacsConnection::createTreeView()
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)));
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)));
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)));
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);
228 void vvQPacsConnection::selectStudies(const QModelIndex &index)
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);
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()) )
241 convertDataSet(theDataSet, Studymodel, getStudyKeys(""));
246 void vvQPacsConnection::selectSeries(const QModelIndex &index)
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));
254 std::vector<gdcm::DataSet> theDataSet;
255 std::vector< std::pair<gdcm::Tag, std::string> > keys;
258 keys.push_back(std::make_pair(gdcm::Tag(0x0010,0x0020), m_patient));
261 keys.push_back(std::make_pair(gdcm::Tag(0x0020,0x000d), elt.toString().toStdString()));
265 keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
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")
275 keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
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(""));
284 void vvQPacsConnection::selectImages(const QModelIndex &index)
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));
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;
297 gdcm::Tag tagsd(0x0010,0x0020);
298 keys.push_back(std::make_pair(tagsd, m_patient));
300 gdcm::Tag tagss(0x0020,0x000e);
301 keys.push_back(std::make_pair(tagss, elt.toString().toStdString()));
302 //= getStudyKeys(elt.toString().toStdString());
305 gdcm::Tag tagsdc(0x0020,0x0013);
306 keys.push_back(std::make_pair(tagsdc, ""));
307 gdcm::Tag tagsic(0x0008,0x0018);
310 keys.push_back(std::make_pair(tagsic, ""));
312 gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys);
318 keys.push_back(std::make_pair(tagsdc, ""));
319 keys.push_back(std::make_pair(tagsic, ""));
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);
326 void vvQPacsConnection::manageStudiesFilter(bool i_enable)
328 ui.text_PHYS->setEnabled(i_enable);
329 ui.text_SDESC->setEnabled(i_enable);
330 ui.dateTab->setEnabled(i_enable);
334 void vvQPacsConnection::manageSeriesFilter(bool i_enable)
336 ui.modalityTab->setEnabled(i_enable);
339 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getPatientKeys(const std::string i_patname, const std::string i_patid)
341 std::vector< std::pair<gdcm::Tag, std::string> > keys;
343 gdcm::Tag tag(0x0010,0x0010);
344 keys.push_back(std::make_pair(tag, i_patname));
347 gdcm::Tag tagpid(0x0010,0x0020);
348 keys.push_back(std::make_pair(tagpid, i_patid));
352 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getStudyKeys(const std::string i_val)
354 std::vector< std::pair<gdcm::Tag, std::string> > keys;
356 gdcm::Tag tagsdc(0x0008,0x1030);
357 keys.push_back(std::make_pair(tagsdc, ""));
359 gdcm::Tag tagdb(0x0008,0x0020);
360 keys.push_back(std::make_pair(tagdb, ""));
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));
372 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getSeriesKeys(const std::string i_val)
374 std::vector< std::pair<gdcm::Tag, std::string> > keys;
376 gdcm::Tag tagsm(0x0008,0x0060);
377 keys.push_back(std::make_pair(tagsm, ""));
379 gdcm::Tag tagdb(0x0008,0x103e);
380 keys.push_back(std::make_pair(tagdb, ""));
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));
390 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getKeys()
392 std::vector< std::pair<gdcm::Tag, std::string> > keys;
394 gdcm::Tag tag(0x0010,0x0010);
395 keys.push_back(std::make_pair(tag, ""));
398 gdcm::Tag tagpid(0x0010,0x0020);
399 keys.push_back(std::make_pair(tagpid, ""));
402 gdcm::Tag tagmod(0x0008,0x0061);
403 keys.push_back(std::make_pair(tagmod, ""));
406 gdcm::Tag tagdb(0x0010,0x0030);
407 keys.push_back(std::make_pair(tagdb, ""));
410 gdcm::Tag tagsd(0x0020,0x000D);
411 keys.push_back(std::make_pair(tagsd, ""));
414 //gdcm::Tag tagst(8,30);
415 //keys.push_back(std::make_pair(tagst, ""));
417 //// Study Description
418 //gdcm::Tag tagsdc(8,1030);
419 //keys.push_back(std::make_pair(tagsdc, ""));
422 //gdcm::Tag tagacc(8,50);
423 //keys.push_back(std::make_pair(tagacc, ""));
428 void vvQPacsConnection::on_check_ModAll_clicked(bool state)
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);
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);
466 void vvQPacsConnection::chooseServer(int index)
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()));
479 void vvQPacsConnection::on_importButton_clicked()
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++)
488 QVariant elt= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1));
491 gdcm::ERootType theRoot = gdcm::ePatientRootType;//ePatientRootType;
492 std::vector<gdcm::DataSet> theDataSet;
493 std::vector< std::pair<gdcm::Tag, std::string> > keys;
497 // gdcm::Tag tagsdc(0x0010,0x0020);
498 //keys.push_back(std::make_pair(tagsdc, elt.toString().toStdString()));
504 //gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, m_level ,fillMoveKeys(), true);
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();
514 std::vector <std::string> vvQPacsConnection::getFileNames()
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());
522 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::fillMoveKeys()
524 std::vector< std::pair<gdcm::Tag, std::string> > keys;
528 //keys.push_back(getPatientKeys("",""));