X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvQPacsConnection.cxx;h=cda824e6e9f5c51feb8edeac029fca1892dbf789;hb=ff4397dc0e578a88346c1d61ed65062d2b922732;hp=3c7a5e556951abee1ec0c73f3375b3660a3f3b5e;hpb=1bebf5dcaeaef53f13b21e8d4ea33055114e3ea4;p=clitk.git diff --git a/vv/vvQPacsConnection.cxx b/vv/vvQPacsConnection.cxx index 3c7a5e5..cda824e 100644 --- a/vv/vvQPacsConnection.cxx +++ b/vv/vvQPacsConnection.cxx @@ -9,6 +9,7 @@ #include "vvUtils.h" + vvQPacsConnection::vvQPacsConnection(QWidget *i_parent) :QDialog(i_parent) { @@ -20,21 +21,19 @@ vvQPacsConnection::vvQPacsConnection(QWidget *i_parent) ui. tabNetwork->setTabText(0,QString(tr("Network"))); ui. tabNetwork->setTabText(1,QString(tr("Configuration"))); - //ui.setChecked(true); - //ui.on_check_ModAll_clicked(true); - - + ui.check_ModAll->setEnabled(true); ui.networkCombo->addItem(""); ui.networkCombo->addItems(getDicomServers()); + // Connection connect(ui.networkCombo,SIGNAL(currentIndexChanged(int)),this,SLOT(chooseServer(int))); - connect(ui.scanButton,SIGNAL(clicked()),this,SLOT(on_scanButton_clicked())); - connect(ui.importButton, SIGNAL(clicked()), this, SLOT(on_importButton_clicked())); connect(ui.removeNetworkButton,SIGNAL(clicked()),this,SLOT(removeServer())); connect(ui.NetworkButton,SIGNAL(clicked()),this,SLOT(modifyServer())); + update(); } +// remote a Dicom Server in VV settings void vvQPacsConnection::removeServer() { removeDicomServer(m_nickname); @@ -43,13 +42,14 @@ void vvQPacsConnection::removeServer() refreshNetworks(); } +// modify a Dicom Server in VV settings void vvQPacsConnection::modifyServer() { AddDicomServer(ui.NameEdit->text().toStdString(),ui.AETitleEdit->text().toStdString(),ui.AdressEdit->text().toStdString(),ui.PortEdit->text().toStdString()); removeServer(); } - +// refresh the list of Dicom Servers available from VV settings void vvQPacsConnection::refreshNetworks() { ui.networkCombo->clear(); @@ -72,55 +72,29 @@ void vvQPacsConnection::on_clearButton_clicked() void vvQPacsConnection::on_scanButton_clicked() { - + cleanTree(); manageStudiesFilter(true); - bool didItWork = gdcm::CompositeNetworkFunctions::CEcho(m_adress.c_str(), atoi(m_port.c_str()), "CREATIS", m_nickname.c_str() ); + + // test first if echo works + bool didItWork = gdcm::CompositeNetworkFunctions::CEcho(m_adress.c_str(), atoi(m_port.c_str()), getDicomClientAETitle().c_str(), m_nickname.c_str() ); if (didItWork) { - std::vector< std::pair > keys = getKeys(); - - gdcm::EQueryLevel theLevel = gdcm::eStudy; - gdcm::ERootType theRoot = gdcm::eStudyRootType;//ePatientRootType; - + m_level =gdcm::ePatient; std::vector theDataSet; - theLevel = gdcm::ePatient; - theRoot = gdcm::ePatientRootType;//ePatientRootType; - gdcm::SmartPointer theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,getPatientKeys("")); - gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), theQuery, theDataSet, "CREATIS", m_nickname.c_str()); - std::vector::iterator it_ds = theDataSet.begin(); + f_query = getQueryPatient(ui.patientName->toPlainText().toStdString(), ui.patientID->toPlainText().toStdString()); - for(; it_ds != theDataSet.end(); it_ds++) + bool cfindWork = gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), + gdcm::CompositeNetworkFunctions::ConstructQuery(f_query.theRoot, f_query.theLevel ,f_query.keys), + theDataSet, getDicomClientAETitle().c_str() , m_nickname.c_str()); + if( cfindWork) { - QList items; - const gdcm::DataSet ds = (*it_ds); - std::vector< std::pair >::iterator it_key = keys.begin(); - int ind = 0; - for(; it_key != keys.end(); it_key++, ind++) - { - gdcm::DataElement de = ds.GetDataElement((*it_key).first); - QStandardItem *item = new QStandardItem; - const gdcm::ByteValue *bv = (de).GetByteValue(); - if( !de.IsEmpty() ) - { - std::string buffer = std::string( bv->GetPointer(), bv->GetLength() ); - item->setText(tr(buffer.c_str())); - } - else - { - item->setText(tr("")); - } - if(ind ==0) - { - item->setCheckable(true); - } - items.push_back(item); - } - Patientmodel->appendRow(items); - } - } + convertDataSet(theDataSet,Patientmodel,getPatientKeys("","")); + } // end cfindwork + } // end didItwork } +/// show Options DialogBox to set a new Dicom Server void vvQPacsConnection::on_optionsButton_clicked() { vvPacsSettingsDialog *dg = new vvPacsSettingsDialog(this); @@ -129,7 +103,6 @@ void vvQPacsConnection::on_optionsButton_clicked() void vvQPacsConnection::convertDataSet(std::vector i_ds, QStandardItemModel *i_model, std::vector< std::pair > keys) { - gdcm::Tag tagdb(0x0008,0x0020); std::vector::iterator it_ds = i_ds.begin(); for(; it_ds != i_ds.end(); it_ds++) { @@ -145,16 +118,7 @@ void vvQPacsConnection::convertDataSet(std::vector i_ds, QStandar if( !de.IsEmpty() ) { std::string buffer = std::string( bv->GetPointer(), bv->GetLength() ); - /*if((*it_key).first == tagdb) - { - QDate date; - date.fromString(tr(buffer.c_str()),"yyyy'MM'd"); - item->setText(date.toString()); - } - else - {*/ item->setText(tr(buffer.c_str())); - //} } else { @@ -168,7 +132,6 @@ void vvQPacsConnection::convertDataSet(std::vector i_ds, QStandar } i_model->appendRow(items); } - } // TreeViews creation @@ -190,6 +153,7 @@ void vvQPacsConnection::createTreeView() Studylist.push_back(tr("DESCRIPTION")); Studylist.push_back(tr("DATE")); Studylist.push_back(tr("HOUR")); + Studylist.push_back(tr("STUDY ID")); Studymodel->setHorizontalHeaderLabels(Studylist); ui.studyTreeView->setModel(Studymodel); connect(ui.studyTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectSeries(QModelIndex))); @@ -209,48 +173,54 @@ void vvQPacsConnection::createTreeView() Imagesmodel = new QStandardItemModel(0,1,this); QStringList Imageslist; Imageslist.push_back(tr("instance number")); + Imageslist.push_back(tr("sopuid")); Imagesmodel->setHorizontalHeaderLabels(Imageslist); ui.imagesTreeView->setModel(Imagesmodel); } +// clean the different model Trees +void vvQPacsConnection::cleanTree() +{ + Patientmodel->removeRows(0,Patientmodel->rowCount()); + Studymodel->removeRows(0,Patientmodel->rowCount()); + Seriesmodel->removeRows(0,Patientmodel->rowCount()); + Imagesmodel->removeRows(0,Patientmodel->rowCount()); + +} + void vvQPacsConnection::selectStudies(const QModelIndex &index) { + + Studymodel->removeRows(0, Studymodel->rowCount(),QModelIndex()); QVariant elt= Patientmodel->data(index.sibling(index.row(),1)); m_patient=elt.toString().toStdString(); manageSeriesFilter(true); - gdcm::EQueryLevel theLevel = gdcm::eStudy; - gdcm::ERootType theRoot = gdcm::ePatientRootType;//ePatientRootType; + std::vector theDataSet; - std::vector< std::pair > keys; - - // Study Description - gdcm::Tag tagsd(0x0010,0x0020); - keys.push_back(std::make_pair(tagsd, m_patient)); - // Study Description - gdcm::Tag tagsdc(0x0008,0x1030); - keys.push_back(std::make_pair(tagsdc, "")); - // Study date - gdcm::Tag tagdb(0x0008,0x0020); - keys.push_back(std::make_pair(tagdb, "")); - // Study Hour - gdcm::Tag tagsdh(0x0008,0x0030); - keys.push_back(std::make_pair(tagsdh, "")); - gdcm::SmartPointer theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys); - gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), theQuery, theDataSet, "CREATIS", m_nickname.c_str()); - convertDataSet(theDataSet, Studymodel, getStudyKeys("")); + m_query = getQueryPatient("",m_patient); + f_query = getQueryforStudy(m_patient); + + + if ( gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), + gdcm::CompositeNetworkFunctions::ConstructQuery(f_query.theRoot, f_query.theLevel ,f_query.keys) + , theDataSet, getDicomClientAETitle().c_str(), m_nickname.c_str()) ) + { + convertDataSet(theDataSet, Studymodel, getStudyKeys("")); + } } + + void vvQPacsConnection::selectSeries(const QModelIndex &index) { + m_level =gdcm::eSeries; Seriesmodel->removeRows(0, Seriesmodel->rowCount(),QModelIndex()); QVariant elt= Studymodel->data(index.sibling(index.row(),3)); QVariant elt2= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1)); - //manageImagesFilter(true); - gdcm::EQueryLevel theLevel = gdcm::eSeries; - gdcm::ERootType theRoot = gdcm::ePatientRootType;//ePatientRootType; + std::vector theDataSet; std::vector< std::pair > keys; @@ -267,22 +237,25 @@ void vvQPacsConnection::selectSeries(const QModelIndex &index) keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString())); // Acceptance NUmber???? keys.push_back(std::make_pair(gdcm::Tag(0x0020,0x000e), elt.toString().toStdString())); - - gdcm::SmartPointer theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys); - keys.clear(); + f_query =getQueryforSeries(elt.toString().toStdString()); + if ( gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), + gdcm::CompositeNetworkFunctions::ConstructQuery(f_query.theRoot, f_query.theLevel ,f_query.keys), theDataSet, + getDicomClientAETitle().c_str(), m_nickname.c_str())) + { + keys.clear(); // Modality keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString())); // Description keys.push_back(std::make_pair(gdcm::Tag(0x0008,0x0060), elt.toString().toStdString())); // Acceptance NUmber???? keys.push_back(std::make_pair(gdcm::Tag(0x0020,0x000e), elt.toString().toStdString())); - - gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), theQuery, theDataSet, "CREATIS", m_nickname.c_str()); - convertDataSet(theDataSet, Seriesmodel, keys); + convertDataSet(theDataSet, Seriesmodel, getSeriesKeys("")); + } } void vvQPacsConnection::selectImages(const QModelIndex &index) { + m_level = gdcm::eImage; Imagesmodel->removeRows(0, Imagesmodel->rowCount(),QModelIndex()); QVariant elt= Seriesmodel->data(index.sibling(index.row(),2)); QVariant elt2= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1)); @@ -300,16 +273,22 @@ void vvQPacsConnection::selectImages(const QModelIndex &index) keys.push_back(std::make_pair(tagss, elt.toString().toStdString())); //= getStudyKeys(elt.toString().toStdString()); - // Study Description + // Image Description gdcm::Tag tagsdc(0x0020,0x0013); keys.push_back(std::make_pair(tagsdc, "")); + gdcm::Tag tagsic(0x0008,0x0018); + + keys.push_back(std::make_pair(tagsic, "")); gdcm::SmartPointer theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys); keys.clear(); - // Study Description + // SOP Instance UID + + keys.push_back(std::make_pair(tagsdc, "")); +keys.push_back(std::make_pair(tagsic, "")); gdcm::CompositeNetworkFunctions::CFind(m_adress.c_str(), atoi(m_port.c_str()), theQuery, theDataSet, "CREATIS", m_nickname.c_str()); convertDataSet(theDataSet, Imagesmodel, keys); @@ -329,16 +308,26 @@ void vvQPacsConnection::manageSeriesFilter(bool i_enable) ui.modalityTab->setEnabled(i_enable); } -std::vector< std::pair > vvQPacsConnection::getPatientKeys(const std::string i_val) +vvQuery vvQPacsConnection::getQueryPatient(const std::string i_patname, const std::string i_patid) +{ + vvQuery query; + query.theRoot = gdcm::ePatientRootType; + query.theLevel = gdcm::ePatient; + query.keys = getPatientKeys(i_patname, i_patid); + return query; + +} + +std::vector< std::pair > vvQPacsConnection::getPatientKeys(const std::string i_patname, const std::string i_patid) { std::vector< std::pair > keys; // Patient Name gdcm::Tag tag(0x0010,0x0010); - keys.push_back(std::make_pair(tag, "")); + keys.push_back(std::make_pair(tag, i_patname)); //// Patient ID gdcm::Tag tagpid(0x0010,0x0020); - keys.push_back(std::make_pair(tagpid, i_val)); + keys.push_back(std::make_pair(tagpid, i_patid)); return keys; } @@ -361,8 +350,15 @@ std::vector< std::pair > vvQPacsConnection::getStudyKeys return keys; } - -std::vector< std::pair > vvQPacsConnection::getSeriesKeys(const std::string i_val) +vvQuery vvQPacsConnection::getQueryforSeries(const std::string study_id) +{ + vvQuery query; + query.theRoot = gdcm::ePatientRootType; + query.theLevel = gdcm::eSeries; + query.keys = getSeriesKeys(study_id); + return query; +} +std::vector< std::pair > vvQPacsConnection::getSeriesKeys(const std::string study_id) { std::vector< std::pair > keys; // Modality @@ -376,7 +372,7 @@ std::vector< std::pair > vvQPacsConnection::getSeriesKey keys.push_back(std::make_pair(tagsdh, "")); // Study Instance UID gdcm::Tag tagsid(0x0020,0x1209); - keys.push_back(std::make_pair(tagsid, i_val)); + keys.push_back(std::make_pair(tagsid, study_id)); return keys; } @@ -472,20 +468,66 @@ void vvQPacsConnection::chooseServer(int index) void vvQPacsConnection::on_importButton_clicked() { - QModelIndex index; - QVariant elt= Patientmodel->data(index.sibling(ui.patientTreeView->selectionModel()->selectedRows().first().row(),1)); - - gdcm::EQueryLevel theLevel = gdcm::ePatient; - gdcm::ERootType theRoot = gdcm::ePatientRootType;//ePatientRootType; - std::vector theDataSet; - std::vector< std::pair > keys; - - // Study Description - gdcm::Tag tagsdc(0x0010,0x0020); - keys.push_back(std::make_pair(tagsdc, elt.toString().toStdString())); - gdcm::SmartPointer theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys); - // gdcm::CompositeNetworkFunctions::CFind("127.0.0.1", 5678, theQuery, theDataSet, "CREATIS", "CONQUESTSRV1"); - - bool didItWork = gdcm::CompositeNetworkFunctions::CMove(m_adress.c_str(),atoi(m_port.c_str()), theQuery, 0, - "CREATIS", m_nickname.c_str() ); - } \ No newline at end of file + bool didItWork = gdcm::CompositeNetworkFunctions::CMove(m_adress.c_str(),atoi(m_port.c_str()), + gdcm::CompositeNetworkFunctions::ConstructQuery(m_query.theRoot, m_query.theLevel ,m_query.keys,true), getDicomClientPort(), + getDicomClientAETitle().c_str(), m_aetitle.c_str(),"D:\\move" ); + gdcm::Directory theDir; + theDir.Load("D:\\move"); + m_files = theDir.GetFilenames(); + accept(); + } + +std::vector vvQPacsConnection::getFileNames() +{ + std::vector filenames; + gdcm::Directory::FilenamesType::iterator it = m_files.begin(); + for (;it != m_files.end(); it++) + filenames.push_back(it->c_str()); + return filenames; +} +std::vector< std::pair > vvQPacsConnection::fillMoveKeys() +{ + std::vector< std::pair > keys; + switch(m_level) + { + case gdcm::ePatient: + //keys.push_back(getPatientKeys("","")); + break; + } + + return keys; +} + +vvQuery vvQPacsConnection::getQueryforStudy(const std::string patient_id) +{ + vvQuery query; + query.keys = getQueryKeysforStudy( patient_id); + query.theRoot = gdcm::ePatientRootType; + query.theLevel = gdcm::ePatient; + return query; +} + +std::vector< std::pair > vvQPacsConnection::getQueryKeysforStudy(const std::string patient_id) +{ + std::vector< std::pair > keys; + + // Study Description + gdcm::Tag tagsd(0x0010,0x0020); + keys.push_back(std::make_pair(tagsd, "")); + // Study Description + gdcm::Tag tagsdc(0x0008,0x1030); + keys.push_back(std::make_pair(tagsdc, "")); + // Study date + gdcm::Tag tagdb(0x0008,0x0020); + keys.push_back(std::make_pair(tagdb, "")); + // Study Hour + gdcm::Tag tagsdh(0x0008,0x0030); + keys.push_back(std::make_pair(tagsdh, "")); + + // Study Hour + gdcm::Tag tagsid(0x020,0x000d); + keys.push_back(std::make_pair(tagsid, patient_id.c_str())); + + + return keys; +} \ No newline at end of file