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 //on_check_ModAll_clicked(true);
28 ui.networkCombo->addItem("");
29 ui.networkCombo->addItems(getDicomServers());
31 connect(ui.networkCombo,SIGNAL(currentIndexChanged(int)),this,SLOT(chooseServer(int)));
32 //connect(ui.scanButton,SIGNAL(clicked()),this,SLOT(on_scanButton_clicked()));
33 //connect(ui.importButton, SIGNAL(clicked()), this, SLOT(on_importButton_clicked()));
34 connect(ui.removeNetworkButton,SIGNAL(clicked()),this,SLOT(removeServer()));
35 connect(ui.NetworkButton,SIGNAL(clicked()),this,SLOT(modifyServer()));
39 void vvQPacsConnection::removeServer()
41 removeDicomServer(m_nickname);
42 ui.networkCombo->removeItem(ui.networkCombo->findText(QString(m_nickname.c_str())));
47 void vvQPacsConnection::modifyServer()
49 AddDicomServer(ui.NameEdit->text().toStdString(),ui.AETitleEdit->text().toStdString(),ui.AdressEdit->text().toStdString(),ui.PortEdit->text().toStdString());
54 void vvQPacsConnection::refreshNetworks()
56 ui.networkCombo->clear();
57 ui.networkCombo->addItem(QString());
58 ui.networkCombo->addItems(getDicomServers());
59 ui.NameEdit->setText(QString());
60 ui.AETitleEdit->setText(QString());
61 ui.AdressEdit->setText(QString());
62 ui.PortEdit->setText(QString());
63 ui.tabNetwork->setCurrentIndex(0);
66 void vvQPacsConnection::on_clearButton_clicked()
68 Patientmodel->removeRows(0, Patientmodel->rowCount(),QModelIndex());
69 Studymodel->removeRows(0, Studymodel->rowCount(),QModelIndex());
70 Seriesmodel->removeRows(0, Seriesmodel->rowCount(),QModelIndex());
71 Imagesmodel->removeRows(0, Imagesmodel->rowCount(),QModelIndex());
74 void vvQPacsConnection::on_scanButton_clicked()
77 manageStudiesFilter(true);
78 bool didItWork = gdcm::CompositeNetworkFunctions::CEcho(m_adress.c_str(), atoi(m_port.c_str()), "CREATIS", m_nickname.c_str() );
81 std::vector< std::pair<gdcm::Tag, std::string> > keys = getKeys();
83 m_level =gdcm::ePatient;
84 std::vector<gdcm::DataSet> theDataSet;
85 gdcm::EQueryLevel theLevel = gdcm::ePatient;
86 gdcm::ERootType theRoot = gdcm::ePatientRootType;//ePatientRootType;
87 gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,getPatientKeys(""));
88 bool cfindWork = gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), theQuery, theDataSet, "CREATIS", m_nickname.c_str());
91 std::vector<gdcm::DataSet>::iterator it_ds = theDataSet.begin();
93 for(; it_ds != theDataSet.end(); it_ds++)
95 QList<QStandardItem *> items;
96 const gdcm::DataSet ds = (*it_ds);
97 std::vector< std::pair<gdcm::Tag, std::string> >::iterator it_key = keys.begin();
99 for(; it_key != keys.end(); it_key++, ind++)
101 gdcm::DataElement de = ds.GetDataElement((*it_key).first);
102 QStandardItem *item = new QStandardItem;
103 const gdcm::ByteValue *bv = (de).GetByteValue();
106 std::string buffer = std::string( bv->GetPointer(), bv->GetLength() );
107 item->setText(tr(buffer.c_str()));
111 item->setText(tr(""));
115 item->setCheckable(true);
117 items.push_back(item);
119 Patientmodel->appendRow(items);
126 void vvQPacsConnection::on_optionsButton_clicked()
128 vvPacsSettingsDialog *dg = new vvPacsSettingsDialog(this);
132 void vvQPacsConnection::convertDataSet(std::vector<gdcm::DataSet> i_ds, QStandardItemModel *i_model, std::vector< std::pair<gdcm::Tag, std::string> > keys)
134 gdcm::Tag tagdb(0x0008,0x0020);
135 std::vector<gdcm::DataSet>::iterator it_ds = i_ds.begin();
136 for(; it_ds != i_ds.end(); it_ds++)
138 QList<QStandardItem *> items;
139 const gdcm::DataSet ds = (*it_ds);
140 std::vector< std::pair<gdcm::Tag, std::string> >::iterator it_key = keys.begin();
142 for(; it_key != keys.end(); it_key++, ind++)
144 gdcm::DataElement de = ds.GetDataElement((*it_key).first);
145 QStandardItem *item = new QStandardItem;
146 const gdcm::ByteValue *bv = (de).GetByteValue();
149 std::string buffer = std::string( bv->GetPointer(), bv->GetLength() );
150 /*if((*it_key).first == tagdb)
153 date.fromString(tr(buffer.c_str()),"yyyy'MM'd");
154 item->setText(date.toString());
158 item->setText(tr(buffer.c_str()));
163 item->setText(tr(""));
167 item->setCheckable(true);
169 items.push_back(item);
171 i_model->appendRow(items);
176 // TreeViews creation
177 void vvQPacsConnection::createTreeView()
180 Patientmodel = new QStandardItemModel(0,2,this);
181 QStringList Patientlist;
182 Patientlist.push_back(tr("PATIENT NAME"));
183 Patientlist.push_back(tr("PATIENT ID"));
184 Patientmodel->setHorizontalHeaderLabels(Patientlist);
185 ui.patientTreeView->setModel(Patientmodel);
186 ui.patientTreeView->setEnabled(true);
187 connect(ui.patientTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectStudies(QModelIndex)));
190 Studymodel = new QStandardItemModel(0,3,this);
191 QStringList Studylist;
192 Studylist.push_back(tr("DESCRIPTION"));
193 Studylist.push_back(tr("DATE"));
194 Studylist.push_back(tr("HOUR"));
195 Studymodel->setHorizontalHeaderLabels(Studylist);
196 ui.studyTreeView->setModel(Studymodel);
197 connect(ui.studyTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectSeries(QModelIndex)));
201 Seriesmodel = new QStandardItemModel(0,2,this);
202 QStringList Serieslist;
203 Serieslist.push_back(tr("MODALITY"));
204 Serieslist.push_back(tr("DESCRIPTION"));
205 Serieslist.push_back(tr("no. accept."));
206 Seriesmodel->setHorizontalHeaderLabels(Serieslist);
207 ui.seriesTreeView->setModel(Seriesmodel);
208 connect(ui.seriesTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectImages(QModelIndex)));
211 Imagesmodel = new QStandardItemModel(0,1,this);
212 QStringList Imageslist;
213 Imageslist.push_back(tr("instance number"));
214 Imageslist.push_back(tr("sopuid"));
215 Imagesmodel->setHorizontalHeaderLabels(Imageslist);
216 ui.imagesTreeView->setModel(Imagesmodel);
219 void vvQPacsConnection::selectStudies(const QModelIndex &index)
221 m_level =gdcm::ePatient;
222 Studymodel->removeRows(0, Studymodel->rowCount(),QModelIndex());
223 QVariant elt= Patientmodel->data(index.sibling(index.row(),1));
224 QVariant elt2= Patientmodel->data(index.sibling(index.row(),1));
225 m_patient=elt.toString().toStdString();
226 manageSeriesFilter(true);
228 std::vector<gdcm::DataSet> theDataSet;
229 if ( gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()),
230 mquery.composeQueryStudy(m_patient), theDataSet, "CREATIS", m_nickname.c_str()) )
232 convertDataSet(theDataSet, Studymodel, getStudyKeys(""));
237 void vvQPacsConnection::selectSeries(const QModelIndex &index)
239 m_level =gdcm::eImage;
240 Seriesmodel->removeRows(0, Seriesmodel->rowCount(),QModelIndex());
241 QVariant elt= Studymodel->data(index.sibling(index.row(),3));
242 QVariant elt2= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1));
245 std::vector<gdcm::DataSet> theDataSet;
246 std::vector< std::pair<gdcm::Tag, std::string> > keys;
249 keys.push_back(std::make_pair(gdcm::Tag(0x0010,0x0020), m_patient));
252 keys.push_back(std::make_pair(gdcm::Tag(0x0020,0x000d), elt.toString().toStdString()));
256 keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
258 keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
259 // Acceptance NUmber????
260 keys.push_back(std::make_pair(gdcm::Tag(0x0020,0x000e), elt.toString().toStdString()));
262 if ( gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), mquery.composeQuerySeries(keys), theDataSet, "CREATIS", m_nickname.c_str()), "C:\\Boost")
266 keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
268 keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString()));
269 // Acceptance NUmber????
270 keys.push_back(std::make_pair(gdcm::Tag(0x0020,0x000e), elt.toString().toStdString()));
271 convertDataSet(theDataSet, Seriesmodel, getSeriesKeys(""));
275 void vvQPacsConnection::selectImages(const QModelIndex &index)
277 m_level = gdcm::eImage;
278 Imagesmodel->removeRows(0, Imagesmodel->rowCount(),QModelIndex());
279 QVariant elt= Seriesmodel->data(index.sibling(index.row(),2));
280 QVariant elt2= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1));
282 //manageImagesFilter(true);
283 gdcm::EQueryLevel theLevel = gdcm::eImage;
284 gdcm::ERootType theRoot = gdcm::ePatientRootType;//ePatientRootType;
285 std::vector<gdcm::DataSet> theDataSet;
286 std::vector< std::pair<gdcm::Tag, std::string> > keys;
288 gdcm::Tag tagsd(0x0010,0x0020);
289 keys.push_back(std::make_pair(tagsd, m_patient));
291 gdcm::Tag tagss(0x0020,0x000e);
292 keys.push_back(std::make_pair(tagss, elt.toString().toStdString()));
293 //= getStudyKeys(elt.toString().toStdString());
296 gdcm::Tag tagsdc(0x0020,0x0013);
297 keys.push_back(std::make_pair(tagsdc, ""));
298 gdcm::Tag tagsic(0x0008,0x0018);
301 keys.push_back(std::make_pair(tagsic, ""));
303 gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys);
309 keys.push_back(std::make_pair(tagsdc, ""));
310 keys.push_back(std::make_pair(tagsic, ""));
312 gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), theQuery, theDataSet, "CREATIS", m_nickname.c_str());
313 convertDataSet(theDataSet, Imagesmodel, keys);
317 void vvQPacsConnection::manageStudiesFilter(bool i_enable)
319 ui.text_PHYS->setEnabled(i_enable);
320 ui.text_SDESC->setEnabled(i_enable);
321 ui.dateTab->setEnabled(i_enable);
325 void vvQPacsConnection::manageSeriesFilter(bool i_enable)
327 ui.modalityTab->setEnabled(i_enable);
330 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getPatientKeys(const std::string i_val)
332 std::vector< std::pair<gdcm::Tag, std::string> > keys;
334 gdcm::Tag tag(0x0010,0x0010);
335 keys.push_back(std::make_pair(tag, ""));
338 gdcm::Tag tagpid(0x0010,0x0020);
339 keys.push_back(std::make_pair(tagpid, i_val));
343 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getStudyKeys(const std::string i_val)
345 std::vector< std::pair<gdcm::Tag, std::string> > keys;
347 gdcm::Tag tagsdc(0x0008,0x1030);
348 keys.push_back(std::make_pair(tagsdc, ""));
350 gdcm::Tag tagdb(0x0008,0x0020);
351 keys.push_back(std::make_pair(tagdb, ""));
353 gdcm::Tag tagsdh(0x0008,0x0030);
354 keys.push_back(std::make_pair(tagsdh, ""));
355 // Study Instance UID
356 gdcm::Tag tagsid(0x0020,0x000d);
357 keys.push_back(std::make_pair(tagsid, i_val));
363 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getSeriesKeys(const std::string i_val)
365 std::vector< std::pair<gdcm::Tag, std::string> > keys;
367 gdcm::Tag tagsm(0x0008,0x0060);
368 keys.push_back(std::make_pair(tagsm, ""));
370 gdcm::Tag tagdb(0x0008,0x103e);
371 keys.push_back(std::make_pair(tagdb, ""));
373 gdcm::Tag tagsdh(0x0020,0x000e);
374 keys.push_back(std::make_pair(tagsdh, ""));
375 // Study Instance UID
376 gdcm::Tag tagsid(0x0020,0x1209);
377 keys.push_back(std::make_pair(tagsid, i_val));
381 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::getKeys()
383 std::vector< std::pair<gdcm::Tag, std::string> > keys;
385 gdcm::Tag tag(0x0010,0x0010);
386 keys.push_back(std::make_pair(tag, ""));
389 gdcm::Tag tagpid(0x0010,0x0020);
390 keys.push_back(std::make_pair(tagpid, ""));
393 gdcm::Tag tagmod(0x0008,0x0061);
394 keys.push_back(std::make_pair(tagmod, ""));
397 gdcm::Tag tagdb(0x0010,0x0030);
398 keys.push_back(std::make_pair(tagdb, ""));
401 gdcm::Tag tagsd(0x0020,0x000D);
402 keys.push_back(std::make_pair(tagsd, ""));
405 //gdcm::Tag tagst(8,30);
406 //keys.push_back(std::make_pair(tagst, ""));
408 //// Study Description
409 //gdcm::Tag tagsdc(8,1030);
410 //keys.push_back(std::make_pair(tagsdc, ""));
413 //gdcm::Tag tagacc(8,50);
414 //keys.push_back(std::make_pair(tagacc, ""));
419 void vvQPacsConnection::on_check_ModAll_clicked(bool state)
421 ui.check_MR->setEnabled(!state);
422 ui.check_CR->setEnabled(!state);
423 ui.check_OT->setEnabled(!state);
424 ui.check_RF->setEnabled(!state);
425 ui.check_SC->setEnabled(!state);
426 ui.check_CT->setEnabled(!state);
427 ui.check_US->setEnabled(!state);
428 ui.check_NM->setEnabled(!state);
429 ui.check_DR->setEnabled(!state);
430 ui.check_US->setEnabled(!state);
431 ui.check_NM->setEnabled(!state);
432 ui.check_DR->setEnabled(!state);
433 ui.check_SR->setEnabled(!state);
434 ui.check_XA->setEnabled(!state);
435 ui.check_MG->setEnabled(!state);
438 ui.check_MR->setChecked(state);
439 ui.check_CR->setChecked(state);
440 ui.check_OT->setChecked(state);
441 ui.check_RF->setChecked(state);
442 ui.check_SC->setChecked(state);
443 ui.check_CT->setChecked(state);
444 ui.check_US->setChecked(state);
445 ui.check_NM->setChecked(state);
446 ui.check_DR->setChecked(state);
447 ui.check_US->setChecked(state);
448 ui.check_NM->setChecked(state);
449 ui.check_DR->setChecked(state);
450 ui.check_SR->setChecked(state);
451 ui.check_XA->setChecked(state);
452 ui.check_MG->setChecked(state);
457 void vvQPacsConnection::chooseServer(int index)
459 std::map < std::string, std:: string> values = getDicomServer(ui.networkCombo->currentText());
460 m_port = values["PORT"];
461 m_aetitle = values["AETITLE"];
462 m_adress= values["ADRESS"];
463 m_nickname = values["nickname"];
464 ui.AdressEdit->setText(QString(m_adress.c_str()));
465 ui.AETitleEdit->setText(QString(m_aetitle.c_str()));
466 ui.NameEdit->setText(QString(m_nickname.c_str()));
467 ui.PortEdit->setText(QString(m_port.c_str()));
470 void vvQPacsConnection::on_importButton_clicked()
473 //QModelIndexList list = ui.imagesTreeView-selectedIndexes();
474 QModelIndexList indices = ui.imagesTreeView->selectionModel()->selectedRows();
475 QModelIndexList::iterator it = indices.begin();
476 for(; it != indices.end(); it++)
479 QVariant elt= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1));
482 gdcm::ERootType theRoot = gdcm::ePatientRootType;//ePatientRootType;
483 std::vector<gdcm::DataSet> theDataSet;
484 std::vector< std::pair<gdcm::Tag, std::string> > keys;
488 // gdcm::Tag tagsdc(0x0010,0x0020);
489 //keys.push_back(std::make_pair(tagsdc, elt.toString().toStdString()));
495 gdcm::SmartPointer<gdcm::BaseRootQuery> theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, m_level ,fillMoveKeys(), true);
497 bool didItWork = gdcm::CompositeNetworkFunctions::CMove(m_adress.c_str(),atoi(m_port.c_str()), theQuery, getDicomClientPort(),
498 getDicomClientAETitle().c_str(), m_aetitle.c_str(),"D:\\move" );
499 gdcm::Directory theDir;
500 theDir.Load("D:\\move");
501 m_files = theDir.GetFilenames();
505 std::vector <std::string> vvQPacsConnection::getFileNames()
507 std::vector <std::string> filenames;
508 gdcm::Directory::FilenamesType::iterator it = m_files.begin();
509 for (;it != m_files.end(); it++)
510 filenames.push_back(it->c_str());
513 std::vector< std::pair<gdcm::Tag, std::string> > vvQPacsConnection::fillMoveKeys()
515 std::vector< std::pair<gdcm::Tag, std::string> > keys;
519 keys.push_back(std::make_pair(gdcm::Tag(0x0010,0x0020), m_patient));
520 //Patientmodel->data(index.sibling(index.row(),1)).toString().toStdString();