From 3378f6c372da1e07e35c45562749416fcfee6798 Mon Sep 17 00:00:00 2001 From: cervenansky Date: Fri, 28 Jun 2013 10:24:10 +0200 Subject: [PATCH] first developments for PacsConnection --- common/CMakeLists.txt | 3 +- vv/CMakeLists.txt | 3 + vv/icons/basket_download.png | Bin 0 -> 2351 bytes vv/icons/bullet_info.png | Bin 0 -> 20639 bytes vv/icons/edit.png | Bin 0 -> 18599 bytes vv/qt_ui/vvPacsConnection.ui | 759 +++++++++++++++++++++++++++++++++++ vv/vvMainWindow.cxx | 12 + vv/vvMainWindow.h | 2 + vv/vvQPacsConnection.cxx | 482 ++++++++++++++++++++++ vv/vvQPacsConnection.h | 68 ++++ 10 files changed, 1328 insertions(+), 1 deletion(-) create mode 100644 vv/icons/basket_download.png create mode 100644 vv/icons/bullet_info.png create mode 100644 vv/icons/edit.png create mode 100644 vv/qt_ui/vvPacsConnection.ui create mode 100644 vv/vvQPacsConnection.cxx create mode 100644 vv/vvQPacsConnection.h diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 95a1023..ba65d28 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -66,7 +66,8 @@ ENDIF(CLITK_MEMORY_INFO) IF (CLITK_USE_SYSTEM_GDCM) FIND_PACKAGE(GDCM REQUIRED) include(${GDCM_USE_FILE}) - TARGET_LINK_LIBRARIES(clitkCommon vtkgdcm gdcmDICT gdcmMSFF) + TARGET_LINK_LIBRARIES(clitkCommon vtkgdcm) + # gdcmDICT gdcmMSFF) ENDIF() #========================================================= diff --git a/vv/CMakeLists.txt b/vv/CMakeLists.txt index 9895570..c901fab 100644 --- a/vv/CMakeLists.txt +++ b/vv/CMakeLists.txt @@ -71,6 +71,7 @@ SET(vv_COMMON_WITH_UI SET(vv_SRCS vvQProgressDialogITKCommand.cxx vvQDicomSeriesSelector.cxx + vvQPacsConnection.cxx QTreePushButton.cxx vvMainWindowBase.cxx vvImageWarp.cxx @@ -113,6 +114,7 @@ QT4_WRAP_CPP(vv_SRCS vvDocumentation.h vvHelpDialog.h vvQDicomSeriesSelector.h + vvQPacsConnection.h vvSlicerManager.h vvStructureSetActor.h vvROIActor.h @@ -123,6 +125,7 @@ QT4_WRAP_UI(vv_UI_CXX qt_ui/vvHelpDialog.ui qt_ui/vvDocumentation.ui qt_ui/vvDicomSeriesSelector.ui + qt_ui/vvPacsConnection.ui qt_ui/vvDummyWindow.ui #For testing ) diff --git a/vv/icons/basket_download.png b/vv/icons/basket_download.png new file mode 100644 index 0000000000000000000000000000000000000000..0038c1cc690aeca5c04cf197c1c959a86277dde3 GIT binary patch literal 2351 zcmV+~3DEY5P)RCwCNS8Hq>R~bF?-0{xruGhPM z#&&I|iJeyyH>EUf(zGe6Dx{Q035kk?MClKL_=ALa{zd#iAk=_pr8X+zl`5$OAwq4c zQb$eNK=W=9v1&WP&cnNY?0UVAncaDDX4bLNC{KaJNO$+%nYs5n_k7=XzB_{N`v|VD zKmXi^p6d=+R`pp9U&kF>d-uME|MrrXF7Go2*RDJK{U3a9&Dh8o4jeeRpP;tgDTr&Y zdmlHBd7j-{n5`B11`?vIiZM~}qLbM|>HOP%#|;6jTCwUx|3H8L8;1_TbzOYs$tUp6 z+e7=<|MJ~}=(#uf(55Y&m@8CUYjzDrObgdMGBg~!*&I=i>N_rsT|mvWphXmnjE-W% z#tnj^DEs;ROLqexJDDp^T*{%nM@BT^Ly%1*+9HU?rQ%Hiu$^HT433RnK)Gz9wY>$C zlb130z&gl^d{-bETT~b+8|B(O^tc39tRdDIffR9YD*&j2@CU~}K97qN6NttP%$JH- zy>=BOS-N8oqFkjx5rsk-X0=GeE_~U8AlbJCun6MH#SAV@T!N}9upRrZK*Z8j*@g|x z@Zm}|s8N}7J&2NbM*u<)pgZPf<}i6B15p&=`5soSTX{zy@^jv7B5gp@6etZcs!k1# z@1ShMzf%Bf? zph0c$PaGR5tBQ)K+95q1{RqRfI(~Ca;Gv`l&k`>xk;?wv>t*eEHbh8h4OD! zKQP$7VasEBK9@tZL5JYEaBB6)*A$H`%EH&axz%`d%X(w~AE*BG2?jRrjGTAf3RD%hUHEnYyW1p_rBM?n@#rPEPtOKix0% zE$hI+eM8u}E4}#6*;A89FDYW+{uMZL>MW9p6dc<|S63HGb7h<#E}?&*4K*_J`kuph zXID)KrMPBSJ+Z2Y#f$~ZsUVP0myxS7l5O@QjAlXf(EX&3{F^R*_lw_8b6y-BP)?p` z6t%bjBauWTIgelcYz9C2NgNMvco64?N3nAC3MBLxe){sO=;%(PSeBtm4WT?=;{w@V z+Sfw{bfnuGphN`tq7SPYXnDYr08enCFcT6@2^{$C;n|5X%lO>$Ya@-xC`_}0O2tG| za}woJ1#kZOBYfwF+tC;|n3nT+<(K=h{*e`EZ*Rk?_bR7~cK07cw9`@|?U& zkln9d9`zGNDt6COAl0tGV)B|*zQI(m_@B=(pcuQIj26oRW^$xY22~T_CJ{(YYbS90 z1TZlMd~kdxwrzV6e*$N7E)FycVzH2Wzw&P((Fg(3C{3IUN*z-M>r zl=yP6t@x1_{aP3U!B5q~h!pV$2L|ek$C&$CRK?{{QeuVcqph!j@~mQFxDfiTds&RW z^q^PD;kc{cK()uh)V~)B4{tAfMhS(?BR!7op|vfE+_~~F!PnY03CJAr>i{ZqIGW29 z2RDDd8?I1ArjSK4DPT4$!YbBvJhjGzB$@Q*I2cE{f!@9(RgwB!^&xpuQ0_g(&B4H?pViKvd;OQ?ey&eFL zX0GHBoRT%Vplp@sNbZn*Ef%C*8D-OlsJW2ILXFET>5PJE8yYo8f8Ww1j3$<1-A6lv zwrZOcHkYz&Q4>n=9Pjj1dzmZK*A*iVuVk_X(kpQi0hunkmq*alCPSw`>6tJNG^Sg$ zkx_q-P6JlhPjy7-q8g@V^8{E0#SZf|6D5jNBB?=-MtMrAAalum^{TmJL-SZn!{ADG z-~(>oVF<~AZ)?obYOTs(QW^aU<=8}2R}o895aogl85SKb-efY3tLW)Vg*xxe()WcT zI>}BD*d}v4PU*F6+h<`sw0L+KzCk$_Jz;#};|zD#gyt6NHrdc(UbssZI5?gSSN3UC z)OgR#MyG(IuQ>>>Szi`H&xf>R}n)Fd9uDkU3&>(2)D>6Ry=T3PvfW^x|0 ztn0qukpY(sFrp2Q5zb%`d>G6ORre?^4ou2o*)E~0H;JC!CW4qjBCYadRAMkkk!p_6 z_YP*Ji%2!a$8Y#y68s!}2{I+w$&O3=w5HNmo_T01KQ1bChKwQ$giHl=U5Dx9qVH2& zlqpv!RjG_JmaSpn=^6_8c{FyAop=;h+71CQ>(HxPc)@7e3LA&8T45_kXv{^2=()^Rx}o~pbrrU_gl1?p}jEW zh1+aETL2(0)U@<<#wrU2uQC>hOb}>u^>T#Z@L32C74>JI_&^8&T>U)%e_j6(U;rQF VtPGQX$1wl^002ovPDHLkV1hR_UIzdG literal 0 HcmV?d00001 diff --git a/vv/icons/bullet_info.png b/vv/icons/bullet_info.png new file mode 100644 index 0000000000000000000000000000000000000000..326cf65550a5b265aebe5eb084716859de99ba7a GIT binary patch literal 20639 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 + + vvPacsConnection + + + + 0 + 0 + 923 + 783 + + + + + Calibri + 9 + 75 + true + + + + Form + + + + false + + + + 110 + 10 + 91 + 16 + + + + Patient ID + + + + + + 110 + 30 + 101 + 21 + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + false + + + + + + 10 + 40 + 75 + 23 + + + + SCAN + + + + + + 10 + 70 + 75 + 23 + + + + CLEAR + + + + + + 250 + 30 + 101 + 21 + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + false + + + + + false + + + + 250 + 10 + 91 + 16 + + + + Patient name + + + + + + 10 + 160 + 51 + 51 + + + + ... + + + + basket_download.pngbasket_download.png + + + + 32 + 32 + + + + + + + 70 + 130 + 311 + 271 + + + + + 11 + + + + Patients + + + + true + + + + 20 + 20 + 281 + 231 + + + + Qt::ScrollBarAlwaysOn + + + true + + + false + + + + + + + 390 + 130 + 451 + 271 + + + + + 11 + + + + Studies + + + + + + 410 + 150 + 411 + 231 + + + + + + + 90 + 440 + 281 + 311 + + + + + + + 410 + 440 + 411 + 311 + + + + + + + 70 + 420 + 321 + 341 + + + + + 11 + + + + Series + + + + + + 380 + 420 + 451 + 341 + + + + + 11 + + + + Images + + + + + false + + + + 110 + 80 + 101 + 21 + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + false + + + + + false + + + + 110 + 60 + 91 + 16 + + + + Physician Ref. + + + + + false + + + + 250 + 60 + 91 + 16 + + + + Study Description + + + + + false + + + + 250 + 80 + 101 + 21 + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + false + + + + + + 390 + 0 + 271 + 131 + + + + 1 + + + + false + + + Modalities + + + + + 0 + 10 + 264 + 72 + + + + + + + + + MR + + + + + + + CR + + + + + + + OT + + + + + + + RF + + + + + + + SC + + + + + + + CT + + + + + + + + + + + US + + + + + + + NM + + + + + + + DR + + + + + + + SR + + + + + + + XA + + + + + + + MG + + + + + + + + + All + + + true + + + + + + + + + false + + + Date + + + + + 20 + 20 + 101 + 22 + + + + + Before + + + + + After + + + + + Between + + + + + + + 130 + 20 + 110 + 22 + + + + + + + 130 + 50 + 110 + 22 + + + + + + + + + 680 + 0 + 231 + 131 + + + + 1 + + + + Network + + + + + 10 + 10 + 101 + 17 + + + + HCL Neuro + + + + + + 10 + 40 + 70 + 17 + + + + conquest + + + + + + Network management + + + + + 180 + 40 + 41 + 23 + + + + OK + + + + + + 0 + 0 + 179 + 100 + + + + + + + false + + + Name + + + + + + + + + + false + + + AE Title + + + + + + + + + + false + + + Adress + + + + + + + + + + false + + + Port + + + + + + + + + + + + + true + + + + 10 + 210 + 71 + 16 + + + + Import Data + + + + + true + + + + 10 + 530 + 51 + 20 + + + + Help + + + Qt::AlignCenter + + + + + + 10 + 480 + 51 + 51 + + + + ... + + + + bullet_info.pngbullet_info.png + + + + 32 + 32 + + + + + + + 10 + 400 + 51 + 51 + + + + ... + + + + edit.pngedit.png + + + + 32 + 32 + + + + + + true + + + + 20 + 450 + 41 + 21 + + + + Options + + + + + + + + diff --git a/vv/vvMainWindow.cxx b/vv/vvMainWindow.cxx index 4210798..12d8d27 100644 --- a/vv/vvMainWindow.cxx +++ b/vv/vvMainWindow.cxx @@ -235,6 +235,7 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() documentation = new vvDocumentation(); help_dialog = new vvHelpDialog(); dicomSeriesSelector = new vvDicomSeriesSelector(); + PacsConnection = new vvPacsConnection(); inverseButton->setEnabled(0); actionAdd_overlay_image_to_current_image->setEnabled(0); @@ -744,6 +745,17 @@ void vvMainWindow::OpenDicom() files = *(dicomSeriesSelector->GetFilenames()); LoadImages(files, vvImageReader::DICOM); } + + void vvMainWindow::ConnectPacs() +{ + std::vector files; + + //std::cout << "dicomSeriesSelector " << std::endl; + if (PacsConnection->exec() == QDialog::Accepted) { + files = *(PacsConnection->GetFilenames()); + LoadImages(files, vvImageReader::DICOM); + } + } //------------------------------------------------------------------------------ diff --git a/vv/vvMainWindow.h b/vv/vvMainWindow.h index e5e3155..eee1d64 100644 --- a/vv/vvMainWindow.h +++ b/vv/vvMainWindow.h @@ -91,6 +91,7 @@ public slots: void SliceImages(); void MergeImagesWithTime(); void OpenDicom(); + void PacsConnection(); ///Open a vtkPolyData surface mesh and display it over the current image void OpenVTKContour(); void SaveAs(); @@ -193,6 +194,7 @@ private: vvHelpDialog *help_dialog; vvDocumentation *documentation; vvDicomSeriesSelector *dicomSeriesSelector; + vvPacsConnection *PacsConnection; bool viewMode; bool playMode; diff --git a/vv/vvQPacsConnection.cxx b/vv/vvQPacsConnection.cxx new file mode 100644 index 0000000..0f3f916 --- /dev/null +++ b/vv/vvQPacsConnection.cxx @@ -0,0 +1,482 @@ +#include "vvQPacsConnection.h" +#include "gdcmCompositeNetworkFunctions.h" +#include +#include +#include +#include + + + vvQPacsConnection::vvQPacsConnection(QWidget *i_parent) + :QWidget(i_parent) + { + setupUi(this); + setWindowTitle(QString::fromUtf8("DCM API PACS")); + createTreeView(); + tabFilter->setTabText(0,QString(tr("Modality"))); + tabFilter->setTabText(1,QString(tr("Date"))); + + tabNetwork->setTabText(0,QString(tr("Network"))); + tabNetwork->setTabText(1,QString(tr("Configuration"))); + check_ModAll->setChecked(true); + on_check_ModAll_clicked(true); + QIcon icon; + icon.addFile("basket_download.png",QSize(),QIcon::Normal,QIcon::Off); + importButton->setIcon(icon); + icon.addFile("file_upload.png",QSize(),QIcon::Normal,QIcon::Off); + // exportButton->setIcon(icon); + icon.addFile("email_forward.png",QSize(),QIcon::Normal,QIcon::Off); + icon.addFile("edit.png",QSize(),QIcon::Normal,QIcon::Off); + optionsButton->setIcon(icon); + icon.addFile("bullet_info.png",QSize(),QIcon::Normal,QIcon::Off); + helpButton->setIcon(icon); + update(); + } + + + void vvQPacsConnection::on_clearButton_clicked() + { + Patientmodel->removeRows(0, Patientmodel->rowCount(),QModelIndex()); + Studymodel->removeRows(0, Studymodel->rowCount(),QModelIndex()); + Seriesmodel->removeRows(0, Seriesmodel->rowCount(),QModelIndex()); + Imagesmodel->removeRows(0, Imagesmodel->rowCount(),QModelIndex()); + } + + void vvQPacsConnection::on_scanButton_clicked() + { + //on_clearButton_clicked(); + manageStudiesFilter(true); + #if defined (USE_GDCM2) + bool didItWork = gdcm::CompositeNetworkFunctions::CEcho( "127.0.0.1", 5678, + "CREATIS", "CONQUESTSRV1" ); + /* tag.SetElement(8); + tag.SetGroup(8);*/ + std::vector< std::pair > keys = getKeys(); + + //std::pair pa; + //pa.first = tag; + //pa.second = ""; + ////keys.push_back(std::make_pair(tag, "")); + gdcm::EQueryLevel theLevel = gdcm::eStudy; + gdcm::ERootType theRoot = gdcm::eStudyRootType;//ePatientRootType; + //gdcm::SmartPointer theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys); + + + std::vector theDataSet; + + theLevel = gdcm::ePatient; + theRoot = gdcm::ePatientRootType;//ePatientRootType; + gdcm::SmartPointer theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,getPatientKeys("")); + +// +//theDataSet.clear(); +// gdcm::CompositeNetworkFunctions::CFind("127.0.0.1", 5678, theQuery, theDataSet, +// "CREATIS", "CONQUESTSRV1"); +// keys.clear(); +// keys.push_back(std::make_pair(gdcm::Tag(0x0010,0x0010), "")); +// + gdcm::CompositeNetworkFunctions::CFind("127.0.0.1", 5678, theQuery, theDataSet, + "CREATIS", "CONQUESTSRV1"); + std::vector::iterator it_ds = theDataSet.begin(); +// + for(; it_ds != theDataSet.end(); it_ds++) + { + + 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); + } +// gdcm::Tag tagtest(0x0020,0x1208); +// keys.clear(); +// keys.push_back(std::make_pair(gdcm::Tag(0x0010,0x0010), "")); +//// keys.push_back(std::make_pair(tagtest, "")); +// theLevel = gdcm::ePatient; +// theRoot = gdcm::ePatientRootType;//ePatientRootType; +// theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys); +// +// +//theDataSet.clear(); +// gdcm::CompositeNetworkFunctions::CFind("127.0.0.1", 5678, theQuery, theDataSet, +// "CREATIS", "CONQUESTSRV1"); +#endif + } + + + void vvQPacsConnection::on_importButton_clicked() + { + QModelIndex index; + QVariant elt= Patientmodel->data(index.sibling(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( "127.0.0.1", 5678, theQuery, 0, + "CREATIS", "CONQUESTSRV1", "d:\\temp_pacs_import\\" ); + } + + 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++) + { + 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() ); + /*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 + { + item->setText(tr("")); + } + if(ind ==0) + { + item->setCheckable(true); + } + items.push_back(item); + } + i_model->appendRow(items); + } + + } + + + void vvQPacsConnection::createTreeView() + { + // Patient Tree View + Patientmodel = new QStandardItemModel(0,2,this); + QStringList Patientlist; + Patientlist.push_back(tr("PATIENT NAME")); + Patientlist.push_back(tr("PATIENT ID")); + Patientmodel->setHorizontalHeaderLabels(Patientlist); + patientTreeView->setModel(Patientmodel); + patientTreeView->setEnabled(true); + connect(patientTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectStudies(QModelIndex))); + + // Study Tree View + Studymodel = new QStandardItemModel(0,3,this); + QStringList Studylist; + Studylist.push_back(tr("DESCRIPTION")); + Studylist.push_back(tr("DATE")); + Studylist.push_back(tr("HOUR")); + Studymodel->setHorizontalHeaderLabels(Studylist); + studyTreeView->setModel(Studymodel); + connect(studyTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectSeries(QModelIndex))); + + + // Series Tree View + Seriesmodel = new QStandardItemModel(0,2,this); + QStringList Serieslist; + Serieslist.push_back(tr("MODALITY")); + Serieslist.push_back(tr("DESCRIPTION")); + Serieslist.push_back(tr("no. accept.")); + Seriesmodel->setHorizontalHeaderLabels(Serieslist); + seriesTreeView->setModel(Seriesmodel); + connect(seriesTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectImages(QModelIndex))); + + // Images Tree View + Imagesmodel = new QStandardItemModel(0,1,this); + QStringList Imageslist; + Imageslist.push_back(tr("instance number")); + Imagesmodel->setHorizontalHeaderLabels(Imageslist); + imagesTreeView->setModel(Imagesmodel); + + //model->setHeaderData(0, Qt::Horizontal,tr("test"),Qt::DisplayRole); + /*QFileSystemModel *filemodel = new QFileSystemModel; + filemodel->insertColumn(1); + filemodel->setHeaderData(1, Qt::Horizontal,"test",0);*/ + + } + + 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("127.0.0.1", 5678, theQuery, theDataSet, "CREATIS", "CONQUESTSRV1"); + convertDataSet(theDataSet, Studymodel, getStudyKeys("")); + } + + + void vvQPacsConnection::selectSeries(const QModelIndex &index) + { + Seriesmodel->removeRows(0, Seriesmodel->rowCount(),QModelIndex()); + QVariant elt= Studymodel->data(index.sibling(index.row(),3)); + QVariant elt2= Patientmodel->data(index.sibling(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; + + //Patient Unique key + keys.push_back(std::make_pair(gdcm::Tag(0x0010,0x0020), m_patient)); + + //Study Unique Key + keys.push_back(std::make_pair(gdcm::Tag(0x0020,0x000d), elt.toString().toStdString())); + + + // 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::SmartPointer theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys); + 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("127.0.0.1", 5678, theQuery, theDataSet, "CREATIS", "CONQUESTSRV1"); + convertDataSet(theDataSet, Seriesmodel, keys); + } + + void vvQPacsConnection::selectImages(const QModelIndex &index) + { + Imagesmodel->removeRows(0, Imagesmodel->rowCount(),QModelIndex()); + QVariant elt= Seriesmodel->data(index.sibling(index.row(),2)); + QVariant elt2= Patientmodel->data(index.sibling(patientTreeView->selectionModel()->selectedRows().first().row(),1)); + + //manageImagesFilter(true); + gdcm::EQueryLevel theLevel = gdcm::eImageOrFrame; + gdcm::ERootType theRoot = gdcm::ePatientRootType;//ePatientRootType; + std::vector theDataSet; + std::vector< std::pair > keys; + + gdcm::Tag tagsd(0x0010,0x0020); + keys.push_back(std::make_pair(tagsd, m_patient)); + + gdcm::Tag tagss(0x0020,0x000e); + keys.push_back(std::make_pair(tagss, elt.toString().toStdString())); + //= getStudyKeys(elt.toString().toStdString()); + + // Study Description + gdcm::Tag tagsdc(0x0020,0x0013); + keys.push_back(std::make_pair(tagsdc, "")); + + + gdcm::SmartPointer theQuery = gdcm::CompositeNetworkFunctions::ConstructQuery(theRoot, theLevel ,keys); + keys.clear(); + // Study Description + + keys.push_back(std::make_pair(tagsdc, "")); + + + gdcm::CompositeNetworkFunctions::CFind("127.0.0.1", 5678, theQuery, theDataSet, "CREATIS", "CONQUESTSRV1"); + convertDataSet(theDataSet, Seriesmodel, keys); + } + + + void vvQPacsConnection::manageStudiesFilter(bool i_enable) + { + text_PHYS->setEnabled(i_enable); + text_SDESC->setEnabled(i_enable); + dateTab->setEnabled(i_enable); + + } + + void vvQPacsConnection::manageSeriesFilter(bool i_enable) + { + modalityTab->setEnabled(i_enable); + } + + std::vector< std::pair > vvQPacsConnection::getPatientKeys(const std::string i_val) + { + std::vector< std::pair > keys; + // Patient Name + gdcm::Tag tag(0x0010,0x0010); + keys.push_back(std::make_pair(tag, "")); + + //// Patient ID + gdcm::Tag tagpid(0x0010,0x0020); + keys.push_back(std::make_pair(tagpid, i_val)); + return keys; + } + + std::vector< std::pair > vvQPacsConnection::getStudyKeys(const std::string i_val) + { + std::vector< std::pair > keys; + // 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 Instance UID + gdcm::Tag tagsid(0x0020,0x000d); + keys.push_back(std::make_pair(tagsid, i_val)); + + return keys; + } + + + std::vector< std::pair > vvQPacsConnection::getSeriesKeys(const std::string i_val) + { + std::vector< std::pair > keys; + // Modality + gdcm::Tag tagsm(0x0008,0x0060); + keys.push_back(std::make_pair(tagsm, "")); + // Study date + gdcm::Tag tagdb(0x0008,0x103e); + keys.push_back(std::make_pair(tagdb, "")); + // Study Hour + gdcm::Tag tagsdh(0x0020,0x000e); + keys.push_back(std::make_pair(tagsdh, "")); + // Study Instance UID + gdcm::Tag tagsid(0x0020,0x1209); + keys.push_back(std::make_pair(tagsid, i_val)); + + return keys; + } + std::vector< std::pair > vvQPacsConnection::getKeys() + { + std::vector< std::pair > keys; + // Patient Name + gdcm::Tag tag(0x0010,0x0010); + keys.push_back(std::make_pair(tag, "")); + + //// Patient ID + gdcm::Tag tagpid(0x0010,0x0020); + keys.push_back(std::make_pair(tagpid, "")); + + // Modality + gdcm::Tag tagmod(0x0008,0x0061); + keys.push_back(std::make_pair(tagmod, "")); + + // date of birth + gdcm::Tag tagdb(0x0010,0x0030); + keys.push_back(std::make_pair(tagdb, "")); + + // Study Date + gdcm::Tag tagsd(0x0020,0x000D); + keys.push_back(std::make_pair(tagsd, "")); + + //// Study Time + //gdcm::Tag tagst(8,30); + //keys.push_back(std::make_pair(tagst, "")); + + //// Study Description + //gdcm::Tag tagsdc(8,1030); + //keys.push_back(std::make_pair(tagsdc, "")); + + //// Accession n° + //gdcm::Tag tagacc(8,50); + //keys.push_back(std::make_pair(tagacc, "")); + + return keys; + } + + void vvQPacsConnection::on_check_ModAll_clicked(bool state) + { + check_MR->setEnabled(!state); + check_CR->setEnabled(!state); + check_OT->setEnabled(!state); + check_RF->setEnabled(!state); + check_SC->setEnabled(!state); + check_CT->setEnabled(!state); + check_US->setEnabled(!state); + check_NM->setEnabled(!state); + check_DR->setEnabled(!state); + check_US->setEnabled(!state); + check_NM->setEnabled(!state); + check_DR->setEnabled(!state); + check_SR->setEnabled(!state); + check_XA->setEnabled(!state); + check_MG->setEnabled(!state); + if(state) + { + check_MR->setChecked(state); + check_CR->setChecked(state); + check_OT->setChecked(state); + check_RF->setChecked(state); + check_SC->setChecked(state); + check_CT->setChecked(state); + check_US->setChecked(state); + check_NM->setChecked(state); + check_DR->setChecked(state); + check_US->setChecked(state); + check_NM->setChecked(state); + check_DR->setChecked(state); + check_SR->setChecked(state); + check_XA->setChecked(state); + check_MG->setChecked(state); + } + + } \ No newline at end of file diff --git a/vv/vvQPacsConnection.h b/vv/vvQPacsConnection.h new file mode 100644 index 0000000..fbbdbeb --- /dev/null +++ b/vv/vvQPacsConnection.h @@ -0,0 +1,68 @@ +#ifndef __vvQPacsConnection_h_INCLUDED__ +#define __vvQPacsConnection_h_INCLUDED__ + +#include +#include "ui_vvPacsConnection.h" +#include "gdcmCompositeNetworkFunctions.h" +#include +#include + + + /** + * \ingroup GUI + */ + //===================================================================== + //===================================================================== + class vvQPacsConnection : public QWidget , public Ui_vvPacsConnection + { + Q_OBJECT + public: + vvQPacsConnection(){} + vvQPacsConnection(QWidget *parent); + + ~vvQPacsConnection(){} + ///Queries the PACS + //void OnQueryPACS(wxCommandEvent& event); +public slots: + void selectStudies(const QModelIndex &index); + void selectSeries(const QModelIndex &index); + void selectImages(const QModelIndex &index); + private slots: + void on_scanButton_clicked(); + void on_clearButton_clicked(); + void on_importButton_clicked(); + void on_check_ModAll_clicked(bool state); + + + private : + std::vector< std::pair > getKeys(); + std::vector< std::pair > getPatientKeys(const std::string ); + std::vector< std::pair > getStudyKeys(const std::string); + std::vector< std::pair > getSeriesKeys(const std::string i_val); + std::vector< std::pair > getImageKeys(const std::string i_val); + void manageStudiesFilter(bool i_enable); + void createTreeView(); + QStandardItemModel *Patientmodel; + QStandardItemModel *Studymodel; + QStandardItemModel *Seriesmodel; + QStandardItemModel *Imagesmodel; + void convertDataSet(std::vector i_ds, QStandardItemModel *i_model, std::vector< std::pair > keys); + void manageSeriesFilter(bool i_enable); + std::string m_patient; + std::string m_study; + std::string m_series; + + std::string m_ip; + std::string m_aetitle; + std::string m_adress; + std::string m_name; + //wxDialog* dialog; + + }; // class vvQPacsConnection + //===================================================================== + + + +#endif // __vvQPacsConnection_h_INCLUDED__ + + -- 2.47.1