From a14e5b5e4b7ee1f0c84db97407d7c67c48499429 Mon Sep 17 00:00:00 2001 From: Florent LERAY Date: Fri, 5 Jul 2019 17:36:03 +0200 Subject: [PATCH 01/21] Port to ITK5 --- src/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e5864b4..38cc15c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -123,6 +123,7 @@ set(${PROJECT_NAME}_LIBRARIES ITKIOGE ITKIOGIPL ITKIOJPEG + ITKIOJPEG2000 ITKIOLSM ITKIOMeta ITKIOMINC From 85f79a8ba1f2cbbbe06cc99b11cff93d86fb27c6 Mon Sep 17 00:00:00 2001 From: Florent LERAY Date: Fri, 13 Dec 2019 10:01:56 +0100 Subject: [PATCH 02/21] Few modifications to obtain responses from pacs DCM4CHEE 5 --- src/QtDcmFindScu.cpp | 8 ++++++++ src/QtDcmMoveScu.cpp | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/QtDcmFindScu.cpp b/src/QtDcmFindScu.cpp index d726a32..160d68c 100644 --- a/src/QtDcmFindScu.cpp +++ b/src/QtDcmFindScu.cpp @@ -93,6 +93,11 @@ void QtDcmFindScu::findStudiesScu (const QString &patientName, const QString &st overrideKeys.push_back ( ( QString ( "PatientName=" ) + patientName ).toUtf8().data() ); overrideKeys.push_back ( ( QString ( "StudyDescription=" ) + studyDescription ).toUtf8().data() ); overrideKeys.push_back ( QString ( "StudyDate=" + startDate + "-" + endDate ).toUtf8().data() ); + overrideKeys.push_back(QString("StudyID").toUtf8().data()); + overrideKeys.push_back(QString("AccessionNumber").toUtf8().data()); + overrideKeys.push_back(QString("NumberOfStudyRelatedSeries").toUtf8().data()); + overrideKeys.push_back(QString("NumberOfStudyRelatedInstances").toUtf8().data()); + overrideKeys.push_back(QString("PatientID=*").toUtf8().data()); //Study level overrideKeys.push_back ( QString ( "StudyInstanceUID" ).toUtf8().data() ); @@ -120,6 +125,7 @@ void QtDcmFindScu::findSeriesScu (const QString &patientName, const QString &stu overrideKeys.push_back ( QString ( "StudyDescription=" + studyDescription ).toUtf8().data() ); overrideKeys.push_back ( ( QString ( "SeriesDescription=" ) + serieDescription ).toUtf8().data() ); overrideKeys.push_back ( QString ( "Modality=" + modality ).toUtf8().data() ); + overrideKeys.push_back ( QString("PatientID=*").toUtf8().data()); //Study level overrideKeys.push_back ( QString ( "StudyDate" ).toUtf8().data() ); @@ -140,6 +146,8 @@ void QtDcmFindScu::findImagesScu (const QString &seriesUID) OFList overrideKeys; overrideKeys.push_back ( ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "IMAGE" "" ) ).toUtf8().data() ); overrideKeys.push_back ( QString ( "SeriesInstanceUID=" + seriesUID ).toUtf8().data() ); + overrideKeys.push_back(QString("PatientID=*").toUtf8().data()); + overrideKeys.push_back(QString("StudyInstanceUID=*").toUtf8().data()); //Image level overrideKeys.push_back ( QString ( "SOPInstanceUID" ).toUtf8().data() ); diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index aac67dc..b1a1bbf 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -202,6 +202,8 @@ OFCondition QtDcmMoveScu::move ( const QString & uid ) }; OFCondition cond; + this->addOverrideKey(QString("PatientID=*")); + this->addOverrideKey(QString("StudyInstanceUID=*")); if ( d->mode == IMPORT ) { this->addOverrideKey ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "SERIES" "" ) ); From d8475a39122068d52376918deca5efe8f7ba737f Mon Sep 17 00:00:00 2001 From: Florent LERAY Date: Fri, 13 Dec 2019 10:20:26 +0100 Subject: [PATCH 03/21] continue --- src/QtDcmMoveScu.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index b1a1bbf..e18bccb 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -212,6 +212,7 @@ OFCondition QtDcmMoveScu::move ( const QString & uid ) else { this->addOverrideKey ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "IMAGE" "" ) ); this->addOverrideKey ( QString ( "SOPInstanceUID=" + uid ) ); + this->addOverrideKey (QString ( "SeriesInstanceUID=*" ) ); } cond = ASC_initializeNetwork ( NET_ACCEPTORREQUESTOR, QtDcmPreferences::instance()->port().toInt(), d->acseTimeout, &d->net ); From 9e901d62e8a03fbf29cebaff4e5fa62d088e95fb Mon Sep 17 00:00:00 2001 From: Olivier Commowick Date: Fri, 13 Dec 2019 12:15:03 +0100 Subject: [PATCH 04/21] Correct signal emission for qtdcm --- src/QtDcmManager.cpp | 7 ++++++- src/QtDcmManager.h | 2 +- src/QtDcmMoveScu.cpp | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index d6672b3..fef7323 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -435,6 +435,7 @@ void QtDcmManager::moveSelectedSeries() break; case PACS: { + qDebug() << "Output dir " << d->tempDir.absolutePath() << d->outputDir; QtDcmMoveScu * mover = new QtDcmMoveScu ( this ); mover->setOutputDir ( d->tempDir.absolutePath() ); mover->setSeries ( d->seriesToImport ); @@ -579,6 +580,7 @@ void QtDcmManager::importToDirectory ( const QString &directory ) void QtDcmManager::onSerieMoved ( const QString &directory , const QString &serie , int number ) { + qDebug() << "On serie moved " << d->useConverter << directory; if ( d->useConverter ) { qDebug() << "Starting reconstruction of series" << serie; @@ -592,9 +594,12 @@ void QtDcmManager::onSerieMoved ( const QString &directory , const QString &seri qDebug() << "Conversion complete"; if ( number == this->seriesToImportSize() - 1 ) { - emit importFinished(); + emit importFinished(directory); } } + + if ( number == this->seriesToImportSize() - 1 ) + emit importFinished(directory); } void QtDcmManager::moveSeriesFinished() diff --git a/src/QtDcmManager.h b/src/QtDcmManager.h index da25ab9..a1fcc81 100644 --- a/src/QtDcmManager.h +++ b/src/QtDcmManager.h @@ -315,7 +315,7 @@ public slots: signals: void serieMoved ( const QString &directory ); - void importFinished(); + void importFinished(const QString &directory); void gettingPreview(); private: diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index e18bccb..c085e27 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -167,6 +167,7 @@ void QtDcmMoveScu::run() d->currentSerie = d->series.at ( i ); const QDir serieDir ( d->outputDir + QDir::separator() + d->series.at ( i ) ); + qDebug() << "Run import" << serieDir.absolutePath(); if ( !serieDir.exists() ) { QDir ( d->outputDir ).mkdir ( d->series.at ( i ) ); } @@ -174,6 +175,7 @@ void QtDcmMoveScu::run() d->outputDirectory = QString ( d->outputDir + QDir::separator() + d->currentSerie ).toUtf8().constData(); if ( d->mode == IMPORT ) { + qDebug() << "plop"; cond = this->move ( d->series.at ( i ) ); emit updateProgress ( ( int ) ( 100.0 * ( i+1 ) / d->series.size() ) ); d->progressTotal += d->step; From 076dadb40f16d7284e0359c98cb5d66ca4f7bb3d Mon Sep 17 00:00:00 2001 From: Florent LERAY Date: Fri, 13 Dec 2019 14:31:01 +0100 Subject: [PATCH 05/21] Remove unwanted debug bad traces --- src/QtDcmManager.cpp | 2 -- src/QtDcmMoveScu.cpp | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index fef7323..7853cc5 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -435,7 +435,6 @@ void QtDcmManager::moveSelectedSeries() break; case PACS: { - qDebug() << "Output dir " << d->tempDir.absolutePath() << d->outputDir; QtDcmMoveScu * mover = new QtDcmMoveScu ( this ); mover->setOutputDir ( d->tempDir.absolutePath() ); mover->setSeries ( d->seriesToImport ); @@ -580,7 +579,6 @@ void QtDcmManager::importToDirectory ( const QString &directory ) void QtDcmManager::onSerieMoved ( const QString &directory , const QString &serie , int number ) { - qDebug() << "On serie moved " << d->useConverter << directory; if ( d->useConverter ) { qDebug() << "Starting reconstruction of series" << serie; diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index c085e27..e18bccb 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -167,7 +167,6 @@ void QtDcmMoveScu::run() d->currentSerie = d->series.at ( i ); const QDir serieDir ( d->outputDir + QDir::separator() + d->series.at ( i ) ); - qDebug() << "Run import" << serieDir.absolutePath(); if ( !serieDir.exists() ) { QDir ( d->outputDir ).mkdir ( d->series.at ( i ) ); } @@ -175,7 +174,6 @@ void QtDcmMoveScu::run() d->outputDirectory = QString ( d->outputDir + QDir::separator() + d->currentSerie ).toUtf8().constData(); if ( d->mode == IMPORT ) { - qDebug() << "plop"; cond = this->move ( d->series.at ( i ) ); emit updateProgress ( ( int ) ( 100.0 * ( i+1 ) / d->series.size() ) ); d->progressTotal += d->step; From f86667999e9aadc7f21d6d1e78e33b2c3730febc Mon Sep 17 00:00:00 2001 From: Florent LERAY Date: Thu, 13 Feb 2020 16:27:00 +0100 Subject: [PATCH 06/21] Somme corrections: - replace patientName by patientId in some cases - replace date range 1900/01/01 to current date by nothing - add more traces --- src/QtDcm.cpp | 14 +++++++------- src/QtDcmFindScu.cpp | 40 ++++++++++++++++++++-------------------- src/QtDcmFindScu.h | 38 ++++++++------------------------------ src/QtDcmManager.cpp | 24 +++++++++++++++++++----- src/QtDcmManager.h | 5 ++--- src/QtDcmMoveScu.cpp | 4 +++- 6 files changed, 59 insertions(+), 66 deletions(-) diff --git a/src/QtDcm.cpp b/src/QtDcm.cpp index a715e0c..22257c7 100644 --- a/src/QtDcm.cpp +++ b/src/QtDcm.cpp @@ -179,7 +179,7 @@ void QtDcm::onPatientItemSelected ( QTreeWidgetItem* current, QTreeWidgetItem* p treeWidgetStudies->clear(); if ( d->mode == QtDcm::PACS_MODE ) { - QtDcmManager::instance()->findStudiesScu ( current->text ( 0 ) ); + QtDcmManager::instance()->findStudiesScu (current->text(1), current->text ( 0 ) ); } else { QtDcmManager::instance()->findStudiesDicomdir ( current->text ( 0 ) ); @@ -200,7 +200,7 @@ void QtDcm::onStudyItemSelected ( QTreeWidgetItem* current, QTreeWidgetItem* pre QtDcmManager::instance()->clearPreview(); if ( d->mode == QtDcm::PACS_MODE ) { - QtDcmManager::instance()->findSeriesScu ( treeWidgetPatients->currentItem()->text ( 0 ), current->data ( 2, 0 ).toString() ); + QtDcmManager::instance()->findSeriesScu (treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text(0), current->data ( 2, 0 ).toString() ); } else { QtDcmManager::instance()->findSeriesDicomdir ( treeWidgetPatients->currentItem()->text ( 0 ), current->data ( 2, 0 ).toString() ); @@ -285,7 +285,7 @@ void QtDcm::onCurrentModalityChanged ( int index ) if ( treeWidgetPatients->currentItem() && treeWidgetStudies->currentItem() ) { if ( d->mode == QtDcm::PACS_MODE ) { - QtDcmManager::instance()->findSeriesScu ( treeWidgetPatients->currentItem()->text ( 0 ), treeWidgetStudies->currentItem()->data ( 2, 0 ).toString() ); + QtDcmManager::instance()->findSeriesScu (treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text ( 0 ), treeWidgetStudies->currentItem()->data ( 2, 0 ).toString() ); } else { QtDcmManager::instance()->findSeriesDicomdir ( treeWidgetPatients->currentItem()->text ( 0 ), treeWidgetStudies->currentItem()->data ( 2, 0 ).toString() ); @@ -338,7 +338,7 @@ void QtDcm::onStartDateChanged(const QDate &startdate) if ( treeWidgetPatients->currentItem() ) { if ( d->mode == QtDcm::PACS_MODE ) { - QtDcmManager::instance()->findStudiesScu ( treeWidgetPatients->currentItem()->text ( 0 ) ); + QtDcmManager::instance()->findStudiesScu ( treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text ( 0 ) ); } else { qDebug() << "Date filtering not available in CD-Rom mode"; @@ -361,7 +361,7 @@ void QtDcm::onEndDateChanged (const QDate &enddate) if ( treeWidgetPatients->currentItem() ) { if ( d->mode == QtDcm::PACS_MODE ) { - QtDcmManager::instance()->findStudiesScu ( treeWidgetPatients->currentItem()->text ( 0 ) ); + QtDcmManager::instance()->findStudiesScu (treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text ( 0 ) ); } else { qDebug() << "Date filtering not available in CD-Rom mode"; @@ -435,7 +435,7 @@ void QtDcm::onStudyDescriptionTextChanged (const QString &description) } if ( treeWidgetPatients->currentItem() && d->mode == QtDcm::PACS_MODE ) { - QtDcmManager::instance()->findStudiesScu ( treeWidgetPatients->currentItem()->text ( 0 ) ); + QtDcmManager::instance()->findStudiesScu (treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text ( 0 ) ); } } @@ -453,6 +453,6 @@ void QtDcm::onSerieDescriptionTextChanged (const QString &description) } if ( treeWidgetPatients->currentItem() && treeWidgetStudies->currentItem() && d->mode == QtDcm::PACS_MODE) { - QtDcmManager::instance()->findSeriesScu ( treeWidgetPatients->currentItem()->text ( 0 ), treeWidgetStudies->currentItem()->data ( 2, 0 ).toString() ); + QtDcmManager::instance()->findSeriesScu (treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text(0), treeWidgetStudies->currentItem()->data ( 2, 0 ).toString() ); } } diff --git a/src/QtDcmFindScu.cpp b/src/QtDcmFindScu.cpp index 160d68c..5aa9daf 100644 --- a/src/QtDcmFindScu.cpp +++ b/src/QtDcmFindScu.cpp @@ -56,19 +56,19 @@ QtDcmFindScu::~QtDcmFindScu() } -void QtDcmFindScu::findPatientsScu (const QString &patientName) +void QtDcmFindScu::findPatientsScu (const QString &patientId) { - this->findPatientsScu ( patientName, "*" ); + this->findPatientsScu ( patientId, "*" ); } -void QtDcmFindScu::findPatientsScu (const QString &patientName, const QString &patientSex) +void QtDcmFindScu::findPatientsScu (const QString &patientId, const QString &patientSex) { OFList overrideKeys; overrideKeys.push_back ( ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "PATIENT" "" ) ).toUtf8().data() ); - overrideKeys.push_back ( ( QString ( "PatientName=" ) + patientName ).toUtf8().data() ); - //Patient leqvel - overrideKeys.push_back ( QString ( "PatientID" ).toUtf8().data() ); + //Patient level + overrideKeys.push_back ( ( QString ( "PatientID=" ) + patientId).toUtf8().data()); + overrideKeys.push_back ( QString ( "PatientName").toUtf8().data()); overrideKeys.push_back ( QString ( "PatientSex=" + patientSex ).toUtf8().data() ); overrideKeys.push_back ( QString ( "PatientBirthDate" ).toUtf8().data() ); @@ -78,26 +78,26 @@ void QtDcmFindScu::findPatientsScu (const QString &patientName, const QString &p void QtDcmFindScu::findStudiesScu (const QString &patientName) { - this->findStudiesScu ( patientName, "*", QDate ( 1900,01,01 ).toString ( "yyyyMMdd" ),QDate::currentDate().toString ( "yyyyMMdd" ) ); + this->findStudiesScu ( QString("*"), patientName, "*", QDate ( 1900,01,01 ).toString ( "yyyyMMdd" ),QDate::currentDate().toString ( "yyyyMMdd" ) ); } void QtDcmFindScu::findStudiesScu(const QString &patientName, const QString &studyDescription) { - this->findStudiesScu ( patientName, studyDescription, QDate ( 1900,01,01 ).toString ( "yyyyMMdd" ),QDate::currentDate().toString ( "yyyyMMdd" ) ); + this->findStudiesScu ( QString("*"), patientName, studyDescription, QDate ( 1900,01,01 ).toString ( "yyyyMMdd" ),QDate::currentDate().toString ( "yyyyMMdd" ) ); } -void QtDcmFindScu::findStudiesScu (const QString &patientName, const QString &studyDescription, const QString &startDate, const QString &endDate) +void QtDcmFindScu::findStudiesScu (const QString & patientId, const QString &patientName, const QString &studyDescription, const QString &startDate, const QString &endDate) { OFList overrideKeys; overrideKeys.push_back ( ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "STUDY" "" ) ).toUtf8().data() ); + overrideKeys.push_back ( ( QString ( "PatientID=" ) + patientId).toUtf8().data() ); overrideKeys.push_back ( ( QString ( "PatientName=" ) + patientName ).toUtf8().data() ); overrideKeys.push_back ( ( QString ( "StudyDescription=" ) + studyDescription ).toUtf8().data() ); overrideKeys.push_back ( QString ( "StudyDate=" + startDate + "-" + endDate ).toUtf8().data() ); - overrideKeys.push_back(QString("StudyID").toUtf8().data()); - overrideKeys.push_back(QString("AccessionNumber").toUtf8().data()); - overrideKeys.push_back(QString("NumberOfStudyRelatedSeries").toUtf8().data()); - overrideKeys.push_back(QString("NumberOfStudyRelatedInstances").toUtf8().data()); - overrideKeys.push_back(QString("PatientID=*").toUtf8().data()); + overrideKeys.push_back ( QString ( "StudyID").toUtf8().data()); + overrideKeys.push_back ( QString ( "AccessionNumber").toUtf8().data()); + overrideKeys.push_back ( QString ( "NumberOfStudyRelatedSeries").toUtf8().data()); + overrideKeys.push_back ( QString ( "NumberOfStudyRelatedInstances").toUtf8().data()); //Study level overrideKeys.push_back ( QString ( "StudyInstanceUID" ).toUtf8().data() ); @@ -106,17 +106,17 @@ void QtDcmFindScu::findStudiesScu (const QString &patientName, const QString &st } -void QtDcmFindScu::findSeriesScu (const QString &patientName, const QString &studyUID) +void QtDcmFindScu::findSeriesScu (const QString & patientId, const QString &patientName, const QString &studyUID) { - this->findSeriesScu ( patientName, studyUID, "*", "*", "*" ); + this->findSeriesScu (patientId, patientName, studyUID, "*", "*", "*" ); } -void QtDcmFindScu::findSeriesScu (const QString &patientName, const QString &studyUID, const QString &studyDescription, const QString &modality) +void QtDcmFindScu::findSeriesScu (const QString &patientId, const QString &patientName, const QString &studyUID, const QString &studyDescription, const QString &modality) { - this->findSeriesScu ( patientName, studyUID, studyDescription, "*", modality ); + this->findSeriesScu (patientId, patientName, studyUID, studyDescription, "*", modality ); } -void QtDcmFindScu::findSeriesScu (const QString &patientName, const QString &studyUID, const QString &studyDescription, const QString &serieDescription, const QString &modality) +void QtDcmFindScu::findSeriesScu (const QString &patientId, const QString &patientName, const QString &studyUID, const QString &studyDescription, const QString &serieDescription, const QString &modality) { OFList overrideKeys; overrideKeys.push_back ( ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "SERIES" "" ) ).toUtf8().data() ); @@ -125,7 +125,7 @@ void QtDcmFindScu::findSeriesScu (const QString &patientName, const QString &stu overrideKeys.push_back ( QString ( "StudyDescription=" + studyDescription ).toUtf8().data() ); overrideKeys.push_back ( ( QString ( "SeriesDescription=" ) + serieDescription ).toUtf8().data() ); overrideKeys.push_back ( QString ( "Modality=" + modality ).toUtf8().data() ); - overrideKeys.push_back ( QString("PatientID=*").toUtf8().data()); + overrideKeys.push_back ( (QString("PatientID=") + patientId).toUtf8().data()); //Study level overrideKeys.push_back ( QString ( "StudyDate" ).toUtf8().data() ); diff --git a/src/QtDcmFindScu.h b/src/QtDcmFindScu.h index 0885d02..1318ac2 100644 --- a/src/QtDcmFindScu.h +++ b/src/QtDcmFindScu.h @@ -31,41 +31,19 @@ class QtDcmFindScu : public QObject explicit QtDcmFindScu ( QObject * parent = 0); virtual ~QtDcmFindScu(); - void findPatientsScu ( const QString & patientName ); - - void findPatientsScu ( const QString & patientName, - const QString & patientSex ); + void findPatientsScu ( const QString & patientID ); + void findPatientsScu ( const QString & patientID, const QString & patientSex ); void findStudiesScu ( const QString & patientName ); + void findStudiesScu ( const QString & patientName, const QString & studyDescription ); + void findStudiesScu ( const QString & patientId, const QString & patientName, const QString & studyDescription, const QString & startDate, const QString & endDate ); - void findStudiesScu ( const QString & patientName, - const QString & studyDescription ); - - void findStudiesScu ( const QString & patientName, - const QString & studyDescription, - const QString & startDate, - const QString & endDate ); - - void findSeriesScu ( const QString & patientName, - const QString & studyUID ); - - void findSeriesScu ( const QString & patientName, - const QString & studyUID, - const QString & modality ); - - void findSeriesScu ( const QString & patientName, - const QString & studyUID, - const QString & studyDescription, - const QString & modality ); - - void findSeriesScu ( const QString & patientName, - const QString & studyUID, - const QString & studyDescription, - const QString & serieDescription, - const QString & modality ); + void findSeriesScu ( const QString & patientId, const QString & patientName, const QString & studyUID ); + void findSeriesScu ( const QString & patientId, const QString & patientName, const QString & studyUID, const QString & modality ); + void findSeriesScu ( const QString & patientId, const QString & patientName, const QString & studyUID, const QString & studyDescription, const QString & modality ); + void findSeriesScu ( const QString & patientId, const QString & patientName, const QString & studyUID, const QString & studyDescription, const QString & serieDescription, const QString & modality ); void findImagesScu ( const QString & seriesUID ); - void findImageScu ( const QString & imageUID); protected: diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index 7853cc5..903dd18 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -276,26 +276,26 @@ void QtDcmManager::findPatientsScu() d->mode = PACS; QtDcmFindScu * finder = new QtDcmFindScu ( this ); - finder->findPatientsScu ( d->patientName, d->patientSex ); + finder->findPatientsScu ( d->patientId, d->patientSex ); delete finder; } } -void QtDcmManager::findStudiesScu ( const QString &patientName ) +void QtDcmManager::findStudiesScu (const QString &patientId, const QString &patientName) { d->seriesToImport.clear(); QtDcmFindScu * finder = new QtDcmFindScu ( this ); - finder->findStudiesScu ( patientName, d->studyDescription, dateToString(d->date1), dateToString(d->date2) ); + finder->findStudiesScu ( patientId, patientName, d->studyDescription, QString("*"), QString("*")); delete finder; } -void QtDcmManager::findSeriesScu ( const QString &patientName, const QString &studyUid ) +void QtDcmManager::findSeriesScu (const QString &patientId, const QString &patientName, const QString &studyUid ) { d->seriesToImport.clear(); QtDcmFindScu * finder = new QtDcmFindScu ( this ); - finder->findSeriesScu ( patientName, studyUid, d->studyDescription, d->serieDescription, d->modality ); + finder->findSeriesScu (patientId, patientName, studyUid, d->studyDescription, d->serieDescription, d->modality ); delete finder; } @@ -435,6 +435,13 @@ void QtDcmManager::moveSelectedSeries() break; case PACS: { + qWarning() << "****** Prepare move with parameters :"; + qWarning() << "* by default IMPORT"; + qWarning() << "* OutputDir = " << d->tempDir.absolutePath(); + qWarning() << "* SeriesUID = " << d->seriesToImport; + qWarning() << "* ImportDir = " << d->outputDir; + qWarning() << "******"; + QtDcmMoveScu * mover = new QtDcmMoveScu ( this ); mover->setOutputDir ( d->tempDir.absolutePath() ); mover->setSeries ( d->seriesToImport ); @@ -508,6 +515,13 @@ void QtDcmManager::getPreviewFromSelectedSerie ( const QString &uid, int element makePreview ( filename ); } else { + qWarning() << "****** Prepare move with parameters :"; + qWarning() << "* PREVIEW"; + qWarning() << "* PATH = " << d->tempDir.absolutePath(); + qWarning() << "* SeriesUID = " << uid; + qWarning() << "* ImageID = " << imageId; + qWarning() << "******"; + QtDcmMoveScu * mover = new QtDcmMoveScu ( this ); mover->setMode ( QtDcmMoveScu::PREVIEW ); mover->setOutputDir ( d->tempDir.absolutePath() ); diff --git a/src/QtDcmManager.h b/src/QtDcmManager.h index a1fcc81..7b972eb 100644 --- a/src/QtDcmManager.h +++ b/src/QtDcmManager.h @@ -68,9 +68,8 @@ class QTDCM_EXPORT QtDcmManager : public QObject * Find SCU with Dcmtk code */ void findPatientsScu(); - void findStudiesScu ( const QString &patientName ); - void findSeriesScu ( const QString &patientName, - const QString &studyUID ); + void findStudiesScu ( const QString &patientId, const QString &patientName ); + void findSeriesScu (const QString &patientId, const QString &patientName, const QString &studyUID ); void findImagesScu ( const QString &uid ); void foundPatient ( const QMap &infosMap ); void foundStudy ( const QMap &infosMap ); diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index e18bccb..65b0f52 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -212,7 +212,7 @@ OFCondition QtDcmMoveScu::move ( const QString & uid ) else { this->addOverrideKey ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "IMAGE" "" ) ); this->addOverrideKey ( QString ( "SOPInstanceUID=" + uid ) ); - this->addOverrideKey (QString ( "SeriesInstanceUID=*" ) ); + this->addOverrideKey ( QString ( "SeriesInstanceUID=*" ) ); } cond = ASC_initializeNetwork ( NET_ACCEPTORREQUESTOR, QtDcmPreferences::instance()->port().toInt(), d->acseTimeout, &d->net ); @@ -229,6 +229,8 @@ OFCondition QtDcmMoveScu::move ( const QString & uid ) return cond; } + qDebug() << "Ready to listen PACS MOVE transmission for uid:" << uid; + ASC_setAPTitles ( d->params, QtDcmPreferences::instance()->aetitle().toUtf8().data(), QtDcmManager::instance()->currentPacs().aetitle().toUtf8().data(), From 9ec9b7175b0f47000b76209ce2006c1162b4171e Mon Sep 17 00:00:00 2001 From: Florent LERAY Date: Fri, 20 Mar 2020 14:03:49 +0100 Subject: [PATCH 07/21] Improve support of long path or with non ASCII-7 characters on MS-Windows with the support of MS UNICODE/UTF16 WINAPI --- CMakeLists.txt | 2 +- externals/dcmtk.cmake | 8 +++++++- externals/itk.cmake | 23 +++++++++++++++++++++-- src/QtDcmManager.cpp | 12 +++++++----- src/QtDcmMoveScu.cpp | 34 ++++++++++++++-------------------- 5 files changed, 50 insertions(+), 29 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e173e81..0d82fb5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.0.2) -project(QTDCM VERSION "2.1.1") +project(QTDCM VERSION "2.1.2") option(BUILD_EXAMPLE "Build qtdcm example application" OFF) option(BUILD_DOCUMENTATION "Build QtDcm Documentation (add a Documentation target)" OFF) diff --git a/externals/dcmtk.cmake b/externals/dcmtk.cmake index e75a43c..9819ef8 100644 --- a/externals/dcmtk.cmake +++ b/externals/dcmtk.cmake @@ -9,6 +9,12 @@ endif() set(DCMTK_SOURCE_DIR "${DCMTK_SOURCE_DIR}" CACHE PATH "" FORCE) set(DCMTK_DIR "${DCMTK_DIR}" CACHE PATH "" FORCE) +if (WIN32) + set(DCMTK_WIDE_CHAR_FILE_IO_FUNCTIONS ON) +else() + set(DCMTK_WIDE_CHAR_FILE_IO_FUNCTIONS OFF) +endif() + ExternalProject_Add( dcmtk @@ -19,7 +25,7 @@ ExternalProject_Add( SOURCE_DIR "${DCMTK_SOURCE_DIR}" BINARY_DIR "${DCMTK_DIR}" - CMAKE_ARGS -DBUILD_SHARED_LIBS:BOOL=ON -DBUILD_APPS:BOOL=OFF -DCMAKE_BUILD_TYPE=RelWithDebInfo -DDCMTK_WITH_ZLIB:BOOL=OFF + CMAKE_ARGS -DBUILD_SHARED_LIBS:BOOL=ON -DBUILD_APPS:BOOL=OFF -DCMAKE_BUILD_TYPE=RelWithDebInfo -DDCMTK_WITH_ZLIB:BOOL=OFF -DDCMTK_WIDE_CHAR_FILE_IO_FUNCTIONS:BOOL=${DCMTK_WIDE_CHAR_FILE_IO_FUNCTIONS} INSTALL_COMMAND "" TEST_COMMAND "" diff --git a/externals/itk.cmake b/externals/itk.cmake index 7b7da25..11f1b2d 100644 --- a/externals/itk.cmake +++ b/externals/itk.cmake @@ -1,15 +1,34 @@ message("${Esc}[32mConfiguring ITK external library${Esc}[m") +## ############################################################################# +## Look for Git +## ############################################################################# +find_program(GIT_BIN NAMES git) +if (NOT GIT_BIN) + find_package(Git) + if(Git_FOUND) + set(GIT_BIN ${GIT_EXECUTABLE}) + else() + message(SEND_ERROR "You need to install Git and add it to the PATH environment variable.") + endif() +else() + mark_as_advanced(GIT_BIN) +endif() + if("${ITK_DIR}" STREQUAL "") set(ITK_DIR ${PROJECT_BINARY_DIR}/externals/itk-build) endif() - + set(ITK_DIR "${ITK_DIR}" CACHE PATH "" FORCE) +set(git_url https://github.com/InsightSoftwareConsortium/ITK.git) +set(git_tag v5.0.0) + ExternalProject_Add( itk - URL https://sourceforge.net/projects/itk/files/itk/4.13/InsightToolkit-4.13.0.tar.gz + GIT_REPOSITORY ${git_url} + GIT_TAG ${git_tag} CMAKE_GENERATOR Ninja diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index 903dd18..7146735 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -94,7 +94,7 @@ class QtDcmManagerPrivate QString serieDescription; /** Attibute representing the serie description used for query PACS */ QString studyDescription; /** Attibute representing the study description used for query PACS */ QtDcmManager::eMoveMode mode; /** Mode that determine the type of media (MEDIA or PACS) */ - QString dcm2nii; /** Absolute filename of the dcm2nii program */ + //QString dcm2nii; /** Absolute filename of the dcm2nii program */ QtDcmManager::eOutputdirMode outputdirMode; /** Output directory mode DIALOG or CUSTOM */ QtDcmServer currentPacs; /** Current pacs index in the pacs list */ @@ -362,7 +362,8 @@ void QtDcmManager::loadDicomdir() //Load dicomdir in a DCMTK DicomFileFormat object OFCondition status; - if ( ! ( status = d->dfile.loadFile ( d->dicomdir.toUtf8().data() ) ).good() ) { + OFFilename dcmFileName(d->dicomdir.toStdString(), OFTrue); + if ( ! ( status = d->dfile.loadFile (dcmFileName) ).good() ) { return; } @@ -684,8 +685,9 @@ void QtDcmManager::makePreview ( const QString &filename ) { DcmRLEDecoderRegistration::registerCodecs ( OFFalse, OFFalse ); DJDecoderRegistration::registerCodecs ( EDC_photometricInterpretation, EUC_default, EPC_default, OFFalse ); + OFFilename dcmFileName(filename.toStdString(), OFTrue); DcmFileFormat file; - file.loadFile ( filename.toLatin1().data() ); + file.loadFile (dcmFileName); DcmDataset * dset = file.getDataset(); DicomImage* dcimage = new DicomImage ( dset, file.getDataset()->getOriginalXfer(), CIF_MayDetachPixelData ); @@ -770,8 +772,8 @@ void QtDcmManager::setDicomdir ( const QString &dicomdir ) d->dicomdir = dicomdir; //Load dicomdir in a DCMTK DicomFileFormat object OFCondition status; - - if ( ! ( status = d->dfile.loadFile ( d->dicomdir.toUtf8().data() ) ).good() ) { + OFFilename dcmFileName(d->dicomdir.toStdString(), OFTrue); + if ( ! ( status = d->dfile.loadFile (dcmFileName) ).good() ) { return; } } diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index 65b0f52..6480357 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -171,7 +171,7 @@ void QtDcmMoveScu::run() QDir ( d->outputDir ).mkdir ( d->series.at ( i ) ); } - d->outputDirectory = QString ( d->outputDir + QDir::separator() + d->currentSerie ).toUtf8().constData(); + d->outputDirectory = QString ( d->outputDir + QDir::separator() + d->currentSerie ).toUtf8().constData(); //OK because this std::string contain utf8 and will be wrap into OFFilename with utf16 conversion if needed at line 755 if ( d->mode == IMPORT ) { cond = this->move ( d->series.at ( i ) ); @@ -700,22 +700,13 @@ OFCondition QtDcmMoveScu::storeSCP ( T_ASC_Association *assoc, T_DIMSE_Message * OFCondition cond = EC_Normal; T_DIMSE_C_StoreRQ *req; - char imageFile[2048]; + char imageFile[4096]; req = &msg->msg.CStoreRQ; - if ( OFFalse ) { -#ifdef _WIN32 - tmpnam ( imageFile ); -#else - strcpy ( imageFile, NULL_DEVICE_NAME ); -#endif - } - else { - sprintf ( imageFile, "%s.%s", - dcmSOPClassUIDToModality ( req->AffectedSOPClassUID ), - req->AffectedSOPInstanceUID ); - } + sprintf ( imageFile, "%s.%s", + dcmSOPClassUIDToModality ( req->AffectedSOPClassUID ), + req->AffectedSOPInstanceUID ); self->d->assoc = assoc; @@ -760,19 +751,21 @@ void QtDcmMoveScu::storeSCPCallback ( void *callbackData, T_DIMSE_StoreProgress *statusDetail = NULL; if ( ( imageDataSet != NULL ) && ( *imageDataSet != NULL ) && !self->d->bitPreserving && !self->d->ignore ) { /* create full path name for the output file */ - OFString ofname; - OFStandard::combineDirAndFilename ( ofname, self->d->outputDirectory, self->d->imageFile, OFTrue /* allowEmptyDirName */ ); + OFFilename dcmFileName(nullptr, OFTrue); + OFFilename dcmOutputDirectory(self->d->outputDirectory, OFTrue); + OFFilename dcmImageFile(self->d->imageFile, OFTrue); + OFStandard::combineDirAndFilename (dcmFileName, dcmOutputDirectory, dcmImageFile, OFTrue /* allowEmptyDirName */ ); E_TransferSyntax xfer = self->d->writeTransferSyntax; if ( xfer == EXS_Unknown ) xfer = ( *imageDataSet )->getOriginalXfer(); - OFCondition cond = self->d->file->saveFile ( ofname.c_str(), xfer, self->d->sequenceType, self->d->groupLength, + OFCondition cond = self->d->file->saveFile (dcmFileName, xfer, self->d->sequenceType, self->d->groupLength, self->d->paddingType, OFstatic_cast ( Uint32, self->d->filepad ), OFstatic_cast ( Uint32, self->d->itempad ), ( self->d->useMetaheader ) ? EWM_fileformat : EWM_dataset ); - if ( QFile ( ofname.c_str() ).exists() ) { - emit self->previewSlice ( QString ( ofname.c_str() ) ); + if ( QFile (dcmFileName.getCharPointer()).exists() ) { + emit self->previewSlice ( QString (dcmFileName.getCharPointer()) ); } if ( ( rsp->DimseStatus == STATUS_Success ) && !self->d->ignore ) { @@ -941,7 +934,8 @@ OFCondition QtDcmMoveScu::moveSCU ( T_ASC_Association * assoc, const char *fname DcmFileFormat file; if ( fname != NULL ) { - if ( file.loadFile ( fname ).bad() ) { + OFFilename dcmFileName(fname, OFTrue); + if ( file.loadFile (dcmFileName).bad() ) { qDebug() << "bad DICOM file: " << QString ( fname ); return DIMSE_BADDATA; } From a3d850a1e3252917249e79e689563b951775c26b Mon Sep 17 00:00:00 2001 From: Florent LERAY Date: Thu, 26 Mar 2020 11:28:13 +0100 Subject: [PATCH 08/21] Avoid ambiguous constructor call --- src/QtDcmMoveScu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index 6480357..1faa363 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -751,7 +751,7 @@ void QtDcmMoveScu::storeSCPCallback ( void *callbackData, T_DIMSE_StoreProgress *statusDetail = NULL; if ( ( imageDataSet != NULL ) && ( *imageDataSet != NULL ) && !self->d->bitPreserving && !self->d->ignore ) { /* create full path name for the output file */ - OFFilename dcmFileName(nullptr, OFTrue); + OFFilename dcmFileName; OFFilename dcmOutputDirectory(self->d->outputDirectory, OFTrue); OFFilename dcmImageFile(self->d->imageFile, OFTrue); OFStandard::combineDirAndFilename (dcmFileName, dcmOutputDirectory, dcmImageFile, OFTrue /* allowEmptyDirName */ ); From bfa126864ef4bcdae01dbc48804e5b90e42d501e Mon Sep 17 00:00:00 2001 From: CASTELNEAU Julien Date: Fri, 18 Dec 2020 12:14:18 +0100 Subject: [PATCH 09/21] [FIX] Query Sintax + allow extended selection on patients/studies/series --- src/QtDcmMoveScu.cpp | 5 ++-- src/qtdcm.ui | 58 +++++++++++++++++++++++++++++++++----------- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index 1faa363..05bf8f4 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -113,7 +113,8 @@ QtDcmMoveScu::QtDcmMoveScu ( QObject * parent ) d->queryModel = QMPatientRoot; d->ignorePendingDatasets = OFTrue; d->outputDirectory = "."; - d->acseTimeout = 30; + d->acseTimeout = 60; + d->dimseTimeout = 60; d->blockMode = DIMSE_BLOCKING; d->mode = QtDcmMoveScu::IMPORT; @@ -202,8 +203,6 @@ OFCondition QtDcmMoveScu::move ( const QString & uid ) }; OFCondition cond; - this->addOverrideKey(QString("PatientID=*")); - this->addOverrideKey(QString("StudyInstanceUID=*")); if ( d->mode == IMPORT ) { this->addOverrideKey ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "SERIES" "" ) ); diff --git a/src/qtdcm.ui b/src/qtdcm.ui index c68577a..d66fe36 100644 --- a/src/qtdcm.ui +++ b/src/qtdcm.ui @@ -14,9 +14,6 @@ Form - - 9 - 2 @@ -35,7 +32,16 @@ QFrame::Raised - + + 0 + + + 0 + + + 0 + + 0 @@ -57,7 +63,7 @@ - :/Images/pacs.svg + :/Images/pacs.svg true @@ -110,7 +116,7 @@ Search - + :/Images/search.svg:/Images/search.svg @@ -142,7 +148,7 @@ - :/Images/cdrom.svg + :/Images/cdrom.svg true @@ -185,7 +191,7 @@ Open - + :/Images/cddrive.png:/Images/cddrive.png @@ -526,7 +532,16 @@ QFrame::Raised - + + 0 + + + 0 + + + 0 + + 0 @@ -543,6 +558,9 @@ true + + QAbstractItemView::ExtendedSelection + false @@ -557,7 +575,7 @@ 1 - + :/Images/users.svg:/Images/users.svg @@ -572,13 +590,22 @@ - 300 + 600 16777215 + + + 0 + 0 + + true + + QAbstractItemView::ExtendedSelection + false @@ -590,7 +617,7 @@ 1 - + :/Images/folder.svg:/Images/folder.svg @@ -601,6 +628,9 @@ true + + QAbstractItemView::ExtendedSelection + true @@ -609,7 +639,7 @@ 1 - + :/Images/paradigm.svg:/Images/paradigm.svg @@ -620,7 +650,7 @@ - + From abac49f45d33b190dfd2b917c80be0e07dea47fc Mon Sep 17 00:00:00 2001 From: CASTELNEAU Julien Date: Fri, 15 Jan 2021 11:36:19 +0100 Subject: [PATCH 10/21] [UPDATE UI + C-FIND] - Debug Filter boxes (Patient Name, Study Desc, Series Desc, Modality, Date, Gender). Apply it in c-find query - Do query for multiple selection - Remove checkbox in series [WARNING] This dev is APHP and PACS oriented. It is done to work with SPHERE PACS in APHP env. Dev for Dicom Dir is not tested and image query is not well supported. --- src/QtDcm.cpp | 158 ++++++++++++++++++++++++++----------------- src/QtDcm.h | 7 +- src/QtDcmFindScu.cpp | 70 ++++++++++++++++--- src/QtDcmFindScu.h | 9 +-- src/QtDcmManager.cpp | 41 +++++------ src/QtDcmManager.h | 2 +- 6 files changed, 184 insertions(+), 103 deletions(-) diff --git a/src/QtDcm.cpp b/src/QtDcm.cpp index 22257c7..52bf4cc 100644 --- a/src/QtDcm.cpp +++ b/src/QtDcm.cpp @@ -66,8 +66,8 @@ QtDcm::QtDcm ( QWidget *parent ) treeWidgetStudies->setColumnWidth ( 1, 100 ); const QStringList labelsStudies = QStringList() << "Studies description" - << "Date" - << "ID"; + << "UID" + << "Date"; treeWidgetStudies->setHeaderLabels ( labelsStudies ); treeWidgetStudies->setContextMenuPolicy ( Qt::CustomContextMenu ); @@ -79,8 +79,8 @@ QtDcm::QtDcm ( QWidget *parent ) const QStringList labelsSeries = QStringList() << "Series description" << "Modality" - << "Date" - << "ID"; + << "UID" + << "Date"; treeWidgetSeries->setHeaderLabels ( labelsSeries ); treeWidgetSeries->setContextMenuPolicy ( Qt::CustomContextMenu ); @@ -108,12 +108,10 @@ QtDcm::~QtDcm() void QtDcm::initConnections() { // Initialize connections - connect ( treeWidgetPatients, &QTreeWidget::currentItemChanged, - this, &QtDcm::onPatientItemSelected); - connect ( treeWidgetStudies, &QTreeWidget::currentItemChanged, - this, &QtDcm::onStudyItemSelected); - connect ( treeWidgetSeries, &QTreeWidget::currentItemChanged, - this, &QtDcm::onSerieItemSelected); + connect ( treeWidgetPatients, &QTreeWidget::itemClicked, + this, &QtDcm::onPatientItemClicked); + connect ( treeWidgetStudies, &QTreeWidget::itemClicked, + this, &QtDcm::onStudyItemClicked); connect ( treeWidgetSeries, &QTreeWidget::itemClicked, this, &QtDcm::onSerieItemClicked); connect ( nameEdit, &QLineEdit::textChanged, @@ -167,77 +165,97 @@ void QtDcm::clearDisplay() treeWidgetSeries->clear(); } -void QtDcm::onPatientItemSelected ( QTreeWidgetItem* current, QTreeWidgetItem* previous ) +void QtDcm::onPatientItemClicked ( QTreeWidgetItem * item, int column ) { - if (!current) { + if (!item) { return; } - + QtDcmManager::instance()->clearSerieInfo(); QtDcmManager::instance()->clearPreview(); - treeWidgetStudies->clear(); + treeWidgetSeries->clear(); - if ( d->mode == QtDcm::PACS_MODE ) { - QtDcmManager::instance()->findStudiesScu (current->text(1), current->text ( 0 ) ); + if ( d->mode == QtDcm::PACS_MODE ) + { + for (QTreeWidgetItem *ptItem : treeWidgetPatients->selectedItems()) + { + QtDcmManager::instance()->findStudiesScu (ptItem->text(1), ptItem->text ( 0 ) ); + } + + findSeriesFromStudyRows(); } - else { - QtDcmManager::instance()->findStudiesDicomdir ( current->text ( 0 ) ); + else + { + QtDcmManager::instance()->findStudiesDicomdir ( item->text ( 0 ) ); } QtDcmManager::instance()->clearPreview(); + } -void QtDcm::onStudyItemSelected ( QTreeWidgetItem* current, QTreeWidgetItem* previous ) +void QtDcm::onStudyItemClicked(QTreeWidgetItem * item, int column ) { - if (!current) { + if (!item) { return; } - - treeWidgetSeries->clear(); QtDcmManager::instance()->clearSerieInfo(); QtDcmManager::instance()->clearPreview(); + + treeWidgetSeries->clear(); - if ( d->mode == QtDcm::PACS_MODE ) { - QtDcmManager::instance()->findSeriesScu (treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text(0), current->data ( 2, 0 ).toString() ); + if ( d->mode == QtDcm::PACS_MODE ) + { + for (QTreeWidgetItem *stItem: treeWidgetStudies->selectedItems()) + { + QtDcmManager::instance()->findSeriesScu ( stItem->data ( 1, 0 ).toString() ); + } } - else { - QtDcmManager::instance()->findSeriesDicomdir ( treeWidgetPatients->currentItem()->text ( 0 ), current->data ( 2, 0 ).toString() ); + else + { + QtDcmManager::instance()->findSeriesDicomdir ( treeWidgetPatients->currentItem()->text ( 0 ), item->data ( 1, 0 ).toString() ); } - QtDcmManager::instance()->clearPreview(); } -void QtDcm::onSerieItemSelected ( QTreeWidgetItem* current, QTreeWidgetItem* previous ) +void QtDcm::onSerieItemClicked ( QTreeWidgetItem * item, int column ) { - if (!current) { + if (!item) + { return; } - + QtDcmManager::instance()->clearListOfImages(); - + if ( d->mode == QtDcm::CD_MODE ) - QtDcmManager::instance()->findImagesDicomdir ( current->text ( 3 ) ); + QtDcmManager::instance()->findImagesDicomdir ( item->text ( 2 ) ); else - QtDcmManager::instance()->findImagesScu ( current->text ( 3 ) ); - - int elementCount = QtDcmManager::instance()->listOfImages().size(); - QString institution = current->data ( 5, 0 ).toString(); - QString opName = current->data ( 6, 0 ).toString(); - - QtDcmManager::instance()->updateSerieInfo ( QString::number ( elementCount ), institution, opName ); -// QtDcmManager::instance()->clearPreview(); - QtDcmManager::instance()->getPreviewFromSelectedSerie ( current->text ( 3 ), elementCount / 2 ); -} - -void QtDcm::onSerieItemClicked ( QTreeWidgetItem * item, int column ) -{ - if ( item->checkState ( 0 ) == Qt::Checked ) { - QtDcmManager::instance()->addSerieToImport ( item->text ( 3 ) ); + { + int elementCount = 0; + for (QTreeWidgetItem *current : treeWidgetSeries->selectedItems()) + { + QtDcmManager::instance()->findImagesScu ( current->text ( 2 ) ); + elementCount = QtDcmManager::instance()->listOfImages().size(); + } + QString institution = item->data ( 5, 0 ).toString(); + QString opName = item->data ( 6, 0 ).toString(); + QtDcmManager::instance()->updateSerieInfo ( QString::number ( elementCount ), institution, opName ); + QtDcmManager::instance()->getPreviewFromSelectedSerie ( item->text ( 3 ), elementCount / 2 ); } - else { - QtDcmManager::instance()->removeSerieToImport ( item->text ( 3 ) ); + + for ( int row=0; rowtopLevelItemCount(); row++) + { + QTreeWidgetItem *seItem = treeWidgetSeries->topLevelItem(row); + if (seItem->isSelected()) + { + QtDcmManager::instance()->addSerieToImport ( seItem->text ( 2 ) ); + } + else + { + qDebug()<<"series unselected "<text(0); + QtDcmManager::instance()->removeSerieToImport ( seItem->text ( 2 ) ); + } } } @@ -262,7 +280,7 @@ void QtDcm::onCurrentModalityChanged ( int index ) switch ( index ) { case ALL_MODALITIES://* - QtDcmManager::instance()->setModality ( "*" ); + QtDcmManager::instance()->setModality ( "" ); break; case MR_MODALITY: @@ -282,13 +300,14 @@ void QtDcm::onCurrentModalityChanged ( int index ) } treeWidgetSeries->clear(); - - if ( treeWidgetPatients->currentItem() && treeWidgetStudies->currentItem() ) { - if ( d->mode == QtDcm::PACS_MODE ) { - QtDcmManager::instance()->findSeriesScu (treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text ( 0 ), treeWidgetStudies->currentItem()->data ( 2, 0 ).toString() ); - } - else { - QtDcmManager::instance()->findSeriesDicomdir ( treeWidgetPatients->currentItem()->text ( 0 ), treeWidgetStudies->currentItem()->data ( 2, 0 ).toString() ); + if ( d->mode == QtDcm::PACS_MODE ) + { + findSeriesFromStudyRows(); + } + else + { + if ( treeWidgetPatients->currentItem() && treeWidgetStudies->currentItem() ) { + QtDcmManager::instance()->findSeriesDicomdir ( treeWidgetPatients->currentItem()->text ( 0 ), treeWidgetStudies->currentItem()->data ( 1, 0 ).toString() ); } } } @@ -339,6 +358,7 @@ void QtDcm::onStartDateChanged(const QDate &startdate) if ( treeWidgetPatients->currentItem() ) { if ( d->mode == QtDcm::PACS_MODE ) { QtDcmManager::instance()->findStudiesScu ( treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text ( 0 ) ); + findSeriesFromStudyRows(); } else { qDebug() << "Date filtering not available in CD-Rom mode"; @@ -362,6 +382,7 @@ void QtDcm::onEndDateChanged (const QDate &enddate) if ( treeWidgetPatients->currentItem() ) { if ( d->mode == QtDcm::PACS_MODE ) { QtDcmManager::instance()->findStudiesScu (treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text ( 0 ) ); + findSeriesFromStudyRows(); } else { qDebug() << "Date filtering not available in CD-Rom mode"; @@ -409,10 +430,10 @@ void QtDcm::openDicomdir() void QtDcm::onPatientNameTextChanged (const QString &pName) { if (pName.isEmpty() ) { - QtDcmManager::instance()->setPatientName ( "*" ); + QtDcmManager::instance()->setPatientName ( "" ); } else { - QtDcmManager::instance()->setPatientName ( pName + "*" ); + QtDcmManager::instance()->setPatientName ( "*" + pName + "*" ); } if ( d->mode == QtDcm::PACS_MODE ) { @@ -423,7 +444,7 @@ void QtDcm::onPatientNameTextChanged (const QString &pName) void QtDcm::onStudyDescriptionTextChanged (const QString &description) { if ( description.isEmpty() ) { - QtDcmManager::instance()->setStudyDescription ( "*" ); + QtDcmManager::instance()->setStudyDescription ( "" ); } else { QtDcmManager::instance()->setStudyDescription ( "*" + description + "*" ); @@ -436,13 +457,14 @@ void QtDcm::onStudyDescriptionTextChanged (const QString &description) if ( treeWidgetPatients->currentItem() && d->mode == QtDcm::PACS_MODE ) { QtDcmManager::instance()->findStudiesScu (treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text ( 0 ) ); + findSeriesFromStudyRows(); } } void QtDcm::onSerieDescriptionTextChanged (const QString &description) { if ( description.isEmpty() ) { - QtDcmManager::instance()->setSerieDescription ( "*" ); + QtDcmManager::instance()->setSerieDescription ( "" ); } else { QtDcmManager::instance()->setSerieDescription ( "*" + description + "*" ); @@ -452,7 +474,17 @@ void QtDcm::onSerieDescriptionTextChanged (const QString &description) treeWidgetSeries->clear(); } - if ( treeWidgetPatients->currentItem() && treeWidgetStudies->currentItem() && d->mode == QtDcm::PACS_MODE) { - QtDcmManager::instance()->findSeriesScu (treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text(0), treeWidgetStudies->currentItem()->data ( 2, 0 ).toString() ); + if ( d->mode == QtDcm::PACS_MODE ) + { + findSeriesFromStudyRows(); } } + +void QtDcm::findSeriesFromStudyRows() +{ + for (int row=0; row < treeWidgetStudies->topLevelItemCount(); row++) + { + QTreeWidgetItem *stItem = treeWidgetStudies->topLevelItem(row); + QtDcmManager::instance()->findSeriesScu ( stItem->data ( 1, 0 ).toString() ); + } +} \ No newline at end of file diff --git a/src/QtDcm.h b/src/QtDcm.h index 2fb31ca..46e0623 100644 --- a/src/QtDcm.h +++ b/src/QtDcm.h @@ -103,11 +103,9 @@ protected slots: void onEndDateChanged ( const QDate & enddate ); - void onPatientItemSelected ( QTreeWidgetItem* current, QTreeWidgetItem* previous ); + void onPatientItemClicked ( QTreeWidgetItem* current, int index ); - void onStudyItemSelected ( QTreeWidgetItem* current, QTreeWidgetItem* previous ); - - void onSerieItemSelected ( QTreeWidgetItem* current, QTreeWidgetItem* previous ); + void onStudyItemClicked ( QTreeWidgetItem* current, int index ); void onSerieItemClicked ( QTreeWidgetItem* current, int index ); @@ -126,6 +124,7 @@ protected slots: void initConnections(); private: + void findSeriesFromStudyRows(); QtDcmPrivate *d; }; diff --git a/src/QtDcmFindScu.cpp b/src/QtDcmFindScu.cpp index 5aa9daf..68e2199 100644 --- a/src/QtDcmFindScu.cpp +++ b/src/QtDcmFindScu.cpp @@ -76,6 +76,28 @@ void QtDcmFindScu::findPatientsScu (const QString &patientId, const QString &pat } +void QtDcmFindScu::findPatientsScu (const QString &patientId, const QString &patientSex, const QString &patientName) +{ + OFList overrideKeys; + overrideKeys.push_back ( ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "PATIENT" "" ) ).toUtf8().data() ); + + //Patient level + overrideKeys.push_back ( ( QString ( "PatientID=" ) + patientId).toUtf8().data()); + if (patientName.isEmpty() ) + { + overrideKeys.push_back ( QString ( "PatientName").toUtf8().data()); + } + else + { + overrideKeys.push_back ( ( QString ( "PatientName=" ) + patientName).toUtf8().data()); + } + + overrideKeys.push_back ( QString ( "PatientSex=" + patientSex ).toUtf8().data() ); + overrideKeys.push_back ( QString ( "PatientBirthDate" ).toUtf8().data() ); + + doQuery ( overrideKeys, QtDcmFindCallback::PATIENT ); + +} void QtDcmFindScu::findStudiesScu (const QString &patientName) { this->findStudiesScu ( QString("*"), patientName, "*", QDate ( 1900,01,01 ).toString ( "yyyyMMdd" ),QDate::currentDate().toString ( "yyyyMMdd" ) ); @@ -92,7 +114,14 @@ void QtDcmFindScu::findStudiesScu (const QString & patientId, const QString &pat overrideKeys.push_back ( ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "STUDY" "" ) ).toUtf8().data() ); overrideKeys.push_back ( ( QString ( "PatientID=" ) + patientId).toUtf8().data() ); overrideKeys.push_back ( ( QString ( "PatientName=" ) + patientName ).toUtf8().data() ); - overrideKeys.push_back ( ( QString ( "StudyDescription=" ) + studyDescription ).toUtf8().data() ); + if (studyDescription.isEmpty()) + { + overrideKeys.push_back ( QString ( "StudyDescription").toUtf8().data() ); + } + else + { + overrideKeys.push_back ( ( QString ( "StudyDescription=" ) + studyDescription ).toUtf8().data() ); + } overrideKeys.push_back ( QString ( "StudyDate=" + startDate + "-" + endDate ).toUtf8().data() ); overrideKeys.push_back ( QString ( "StudyID").toUtf8().data()); overrideKeys.push_back ( QString ( "AccessionNumber").toUtf8().data()); @@ -106,26 +135,45 @@ void QtDcmFindScu::findStudiesScu (const QString & patientId, const QString &pat } -void QtDcmFindScu::findSeriesScu (const QString & patientId, const QString &patientName, const QString &studyUID) +void QtDcmFindScu::findSeriesScu (const QString &studyUID) { - this->findSeriesScu (patientId, patientName, studyUID, "*", "*", "*" ); + this->findSeriesScu (studyUID, "", "", "" ); } -void QtDcmFindScu::findSeriesScu (const QString &patientId, const QString &patientName, const QString &studyUID, const QString &studyDescription, const QString &modality) +void QtDcmFindScu::findSeriesScu (const QString &studyUID, const QString &studyDescription, const QString &modality) { - this->findSeriesScu (patientId, patientName, studyUID, studyDescription, "*", modality ); + this->findSeriesScu (studyUID, studyDescription, "", modality ); } -void QtDcmFindScu::findSeriesScu (const QString &patientId, const QString &patientName, const QString &studyUID, const QString &studyDescription, const QString &serieDescription, const QString &modality) +void QtDcmFindScu::findSeriesScu (const QString &studyUID, const QString &studyDescription, const QString &serieDescription, const QString &modality) { OFList overrideKeys; overrideKeys.push_back ( ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "SERIES" "" ) ).toUtf8().data() ); - overrideKeys.push_back ( ( QString ( "PatientName=" ) + patientName ).toUtf8().data() ); overrideKeys.push_back ( QString ( "StudyInstanceUID=" + studyUID ).toUtf8().data() ); - overrideKeys.push_back ( QString ( "StudyDescription=" + studyDescription ).toUtf8().data() ); - overrideKeys.push_back ( ( QString ( "SeriesDescription=" ) + serieDescription ).toUtf8().data() ); - overrideKeys.push_back ( QString ( "Modality=" + modality ).toUtf8().data() ); - overrideKeys.push_back ( (QString("PatientID=") + patientId).toUtf8().data()); + if (studyDescription.isEmpty()) + { + overrideKeys.push_back ( QString ( "StudyDescription").toUtf8().data() ); + } + else + { + overrideKeys.push_back ( ( QString ( "StudyDescription=" ) + studyDescription ).toUtf8().data() ); + } + if (serieDescription.isEmpty()) + { + overrideKeys.push_back ( QString ( "SeriesDescription").toUtf8().data() ); + } + else + { + overrideKeys.push_back ( ( QString ( "SeriesDescription=" ) + serieDescription ).toUtf8().data() ); + } + if (modality.isEmpty()) + { + overrideKeys.push_back ( QString ("Modality").toUtf8().data() ); + } + else + { + overrideKeys.push_back ( (QString ("Modality=") + modality).toUtf8().data() ); + } //Study level overrideKeys.push_back ( QString ( "StudyDate" ).toUtf8().data() ); diff --git a/src/QtDcmFindScu.h b/src/QtDcmFindScu.h index 1318ac2..e733383 100644 --- a/src/QtDcmFindScu.h +++ b/src/QtDcmFindScu.h @@ -33,15 +33,16 @@ class QtDcmFindScu : public QObject void findPatientsScu ( const QString & patientID ); void findPatientsScu ( const QString & patientID, const QString & patientSex ); + void findPatientsScu ( const QString & patientID, const QString & patientSex, const QString & patientName ); void findStudiesScu ( const QString & patientName ); void findStudiesScu ( const QString & patientName, const QString & studyDescription ); void findStudiesScu ( const QString & patientId, const QString & patientName, const QString & studyDescription, const QString & startDate, const QString & endDate ); - void findSeriesScu ( const QString & patientId, const QString & patientName, const QString & studyUID ); - void findSeriesScu ( const QString & patientId, const QString & patientName, const QString & studyUID, const QString & modality ); - void findSeriesScu ( const QString & patientId, const QString & patientName, const QString & studyUID, const QString & studyDescription, const QString & modality ); - void findSeriesScu ( const QString & patientId, const QString & patientName, const QString & studyUID, const QString & studyDescription, const QString & serieDescription, const QString & modality ); + void findSeriesScu ( const QString & studyUID ); + void findSeriesScu ( const QString & studyUID, const QString & modality ); + void findSeriesScu ( const QString & studyUID, const QString & studyDescription, const QString & modality ); + void findSeriesScu ( const QString & studyUID, const QString & studyDescription, const QString & serieDescription, const QString & modality ); void findImagesScu ( const QString & seriesUID ); void findImageScu ( const QString & imageUID); diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index 7146735..30898f2 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -89,8 +89,8 @@ class QtDcmManagerPrivate QString patientSex; /** Attribute representing the patient sex used to query PACS */ QString patientBirthDate; /** Attribute representing the patient birthdate used to query PACS */ QString modality; /** Attibute for the modality of the search (MR, US, CT, etc) */ - QDate date1; /** Attribute for the begin date of the query (usefull for date based queries) */ - QDate date2; /** Attribute for the end date of the query (usefull for date based queries) */ + QDate startDate; /** Attribute for the begin date of the query (usefull for date based queries) */ + QDate endDate; /** Attribute for the end date of the query (usefull for date based queries) */ QString serieDescription; /** Attibute representing the serie description used for query PACS */ QString studyDescription; /** Attibute representing the study description used for query PACS */ QtDcmManager::eMoveMode mode; /** Mode that determine the type of media (MEDIA or PACS) */ @@ -142,12 +142,12 @@ QtDcmManager::QtDcmManager(QObject *parent) d->outputdirMode = DIALOG; - d->patientName = "*"; + d->patientName = ""; d->patientId = "*"; d->patientBirthDate = ""; - d->modality = "*"; - d->serieDescription = "*"; - d->studyDescription = "*"; + d->modality = ""; + d->serieDescription = ""; + d->studyDescription = ""; d->patientSex = "*"; d->mainWidget = NULL; @@ -276,7 +276,7 @@ void QtDcmManager::findPatientsScu() d->mode = PACS; QtDcmFindScu * finder = new QtDcmFindScu ( this ); - finder->findPatientsScu ( d->patientId, d->patientSex ); + finder->findPatientsScu ( d->patientId, d->patientSex, d->patientName ); delete finder; } } @@ -286,16 +286,16 @@ void QtDcmManager::findStudiesScu (const QString &patientId, const QString &pati d->seriesToImport.clear(); QtDcmFindScu * finder = new QtDcmFindScu ( this ); - finder->findStudiesScu ( patientId, patientName, d->studyDescription, QString("*"), QString("*")); + finder->findStudiesScu ( patientId, patientName, d->studyDescription, d->startDate.toString( "yyyyMMdd" ), d->endDate.toString( "yyyyMMdd" )); delete finder; } -void QtDcmManager::findSeriesScu (const QString &patientId, const QString &patientName, const QString &studyUid ) +void QtDcmManager::findSeriesScu ( const QString &studyUid ) { d->seriesToImport.clear(); QtDcmFindScu * finder = new QtDcmFindScu ( this ); - finder->findSeriesScu (patientId, patientName, studyUid, d->studyDescription, d->serieDescription, d->modality ); + finder->findSeriesScu (studyUid, d->studyDescription, d->serieDescription, d->modality ); delete finder; } @@ -319,28 +319,29 @@ void QtDcmManager::foundPatient ( const QMap &infosMap ) void QtDcmManager::foundStudy ( const QMap &infosMap ) { + QDate examDate = QDate::fromString ( infosMap["Date"], "yyyyMMdd" ); if ( !d->studiesTreeWidget.isNull() ) { QTreeWidgetItem * studyItem = new QTreeWidgetItem ( d->studiesTreeWidget->invisibleRootItem() ); studyItem->setText ( 0, infosMap["Description"] ); - studyItem->setText ( 1, QDate::fromString ( infosMap["Date"], "yyyyMMdd" ).toString ( "dd/MM/yyyy" ) ); - studyItem->setData ( 2, 0, infosMap["UID"] ); - studyItem->setText ( 2, infosMap["UID"] ); + studyItem->setData ( 1, 0, infosMap["UID"] ); + studyItem->setText ( 1, infosMap["UID"] ); + studyItem->setText ( 2, examDate.toString ( "dd/MM/yyyy" ) ); studyItem->setData ( 3, 0, infosMap["ID"] ); } } void QtDcmManager::foundSerie ( const QMap &infosMap ) { + QDate examDate = QDate::fromString ( infosMap["Date"], "yyyyMMdd" ); if ( !d->seriesTreeWidget.isNull() ) { QTreeWidgetItem * serieItem = new QTreeWidgetItem ( d->seriesTreeWidget->invisibleRootItem() ); serieItem->setText ( 0, infosMap["Description"] ); serieItem->setText ( 1, infosMap["Modality"] ); - serieItem->setText ( 2, QDate::fromString ( infosMap["Date"], "yyyyMMdd" ).toString ( "dd/MM/yyyy" ) ); - serieItem->setText ( 3, infosMap["ID"] ); + serieItem->setText ( 2, infosMap["ID"] ); + serieItem->setText ( 3, examDate.toString ( "dd/MM/yyyy" ) ); serieItem->setData ( 4, 0, QVariant ( infosMap["InstanceCount"] ) ); serieItem->setData ( 5, 0, QVariant ( infosMap["Institution"] ) ); serieItem->setData ( 6, 0, QVariant ( infosMap["Operator"] ) ); - serieItem->setCheckState ( 0, Qt::Unchecked ); } } @@ -887,22 +888,22 @@ QString QtDcmManager::modality() const void QtDcmManager::setStartDate ( const QDate &date ) { - d->date1 = date; + d->startDate = date; } QDate QtDcmManager::startDate() const { - return d->date1; + return d->startDate; } void QtDcmManager::setEndDate ( const QDate &date ) { - d->date2 = date; + d->endDate = date; } QDate QtDcmManager::endDate() const { - return d->date2; + return d->endDate; } void QtDcmManager::addPatient() diff --git a/src/QtDcmManager.h b/src/QtDcmManager.h index 7b972eb..1408784 100644 --- a/src/QtDcmManager.h +++ b/src/QtDcmManager.h @@ -69,7 +69,7 @@ class QTDCM_EXPORT QtDcmManager : public QObject */ void findPatientsScu(); void findStudiesScu ( const QString &patientId, const QString &patientName ); - void findSeriesScu (const QString &patientId, const QString &patientName, const QString &studyUID ); + void findSeriesScu ( const QString &studyUID ); void findImagesScu ( const QString &uid ); void foundPatient ( const QMap &infosMap ); void foundStudy ( const QMap &infosMap ); From 98df853feb4238a95cec76358d069ddb310f0547 Mon Sep 17 00:00:00 2001 From: CASTELNEAU Julien Date: Fri, 15 Jan 2021 17:18:18 +0100 Subject: [PATCH 11/21] [UPDATE MOVE] Ability to build a query C-move at Patient/Study and Series Level [WARNING] It works only in medInria context --- src/QtDcm.cpp | 21 +++++---------- src/QtDcmManager.cpp | 63 ++++++++++++++++++++++++++------------------ src/QtDcmManager.h | 8 +++--- src/QtDcmMoveScu.cpp | 54 +++++++++++++++++++++++++++---------- src/QtDcmMoveScu.h | 4 ++- 5 files changed, 91 insertions(+), 59 deletions(-) diff --git a/src/QtDcm.cpp b/src/QtDcm.cpp index 52bf4cc..df67959 100644 --- a/src/QtDcm.cpp +++ b/src/QtDcm.cpp @@ -175,15 +175,15 @@ void QtDcm::onPatientItemClicked ( QTreeWidgetItem * item, int column ) QtDcmManager::instance()->clearPreview(); treeWidgetStudies->clear(); treeWidgetSeries->clear(); + QtDcmManager::instance()->clearDataToImport(); if ( d->mode == QtDcm::PACS_MODE ) { for (QTreeWidgetItem *ptItem : treeWidgetPatients->selectedItems()) { QtDcmManager::instance()->findStudiesScu (ptItem->text(1), ptItem->text ( 0 ) ); + QtDcmManager::instance()->addDataToImport(ptItem->text(1), "PATIENT"); } - - findSeriesFromStudyRows(); } else { @@ -202,6 +202,7 @@ void QtDcm::onStudyItemClicked(QTreeWidgetItem * item, int column ) QtDcmManager::instance()->clearSerieInfo(); QtDcmManager::instance()->clearPreview(); + QtDcmManager::instance()->clearDataToImport(); treeWidgetSeries->clear(); @@ -210,6 +211,7 @@ void QtDcm::onStudyItemClicked(QTreeWidgetItem * item, int column ) for (QTreeWidgetItem *stItem: treeWidgetStudies->selectedItems()) { QtDcmManager::instance()->findSeriesScu ( stItem->data ( 1, 0 ).toString() ); + QtDcmManager::instance()->addDataToImport(stItem->data ( 1, 0 ).toString(), "STUDY"); } } else @@ -227,6 +229,7 @@ void QtDcm::onSerieItemClicked ( QTreeWidgetItem * item, int column ) } QtDcmManager::instance()->clearListOfImages(); + QtDcmManager::instance()->clearDataToImport(); if ( d->mode == QtDcm::CD_MODE ) QtDcmManager::instance()->findImagesDicomdir ( item->text ( 2 ) ); @@ -237,6 +240,7 @@ void QtDcm::onSerieItemClicked ( QTreeWidgetItem * item, int column ) { QtDcmManager::instance()->findImagesScu ( current->text ( 2 ) ); elementCount = QtDcmManager::instance()->listOfImages().size(); + QtDcmManager::instance()->addDataToImport ( current->text ( 2 ), "SERIES" ); } QString institution = item->data ( 5, 0 ).toString(); QString opName = item->data ( 6, 0 ).toString(); @@ -244,19 +248,6 @@ void QtDcm::onSerieItemClicked ( QTreeWidgetItem * item, int column ) QtDcmManager::instance()->getPreviewFromSelectedSerie ( item->text ( 3 ), elementCount / 2 ); } - for ( int row=0; rowtopLevelItemCount(); row++) - { - QTreeWidgetItem *seItem = treeWidgetSeries->topLevelItem(row); - if (seItem->isSelected()) - { - QtDcmManager::instance()->addSerieToImport ( seItem->text ( 2 ) ); - } - else - { - qDebug()<<"series unselected "<text(0); - QtDcmManager::instance()->removeSerieToImport ( seItem->text ( 2 ) ); - } - } } void QtDcm::onDicomMediaButtonClicked() diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index 30898f2..93b41ea 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -82,7 +82,7 @@ class QtDcmManagerPrivate QStringList images; /** List of image filename to export from a CD */ QStringList listImages; /** List of images uid in the current selected serie */ QMap mapImages; /** Map of images (corresponding to listImages) with InstanceNumber tags used as keys */ - QStringList seriesToImport; /** Selected series list in the treview */ + QStringList dataToImport; /** Selected data list in the treview */ QString serieId; /** Current selected serie UID */ QString patientName; /** Attribute frepresenting the patient name used to query PACS */ QString patientId; /** Attribute representing the patient id used to query PACS */ @@ -95,6 +95,7 @@ class QtDcmManagerPrivate QString studyDescription; /** Attibute representing the study description used for query PACS */ QtDcmManager::eMoveMode mode; /** Mode that determine the type of media (MEDIA or PACS) */ //QString dcm2nii; /** Absolute filename of the dcm2nii program */ + QString queryLevel; QtDcmManager::eOutputdirMode outputdirMode; /** Output directory mode DIALOG or CUSTOM */ QtDcmServer currentPacs; /** Current pacs index in the pacs list */ @@ -149,6 +150,7 @@ QtDcmManager::QtDcmManager(QObject *parent) d->serieDescription = ""; d->studyDescription = ""; d->patientSex = "*"; + d->queryLevel = "undefined"; d->mainWidget = NULL; d->patientsTreeWidget = NULL; @@ -272,7 +274,7 @@ void QtDcmManager::displayMessage ( const QString &info ) void QtDcmManager::findPatientsScu() { if ( d->mainWidget->pacsComboBox->count() ) { - d->seriesToImport.clear(); + d->dataToImport.clear(); d->mode = PACS; QtDcmFindScu * finder = new QtDcmFindScu ( this ); @@ -283,7 +285,7 @@ void QtDcmManager::findPatientsScu() void QtDcmManager::findStudiesScu (const QString &patientId, const QString &patientName) { - d->seriesToImport.clear(); + d->dataToImport.clear(); QtDcmFindScu * finder = new QtDcmFindScu ( this ); finder->findStudiesScu ( patientId, patientName, d->studyDescription, d->startDate.toString( "yyyyMMdd" ), d->endDate.toString( "yyyyMMdd" )); @@ -292,7 +294,7 @@ void QtDcmManager::findStudiesScu (const QString &patientId, const QString &pati void QtDcmManager::findSeriesScu ( const QString &studyUid ) { - d->seriesToImport.clear(); + d->dataToImport.clear(); QtDcmFindScu * finder = new QtDcmFindScu ( this ); finder->findSeriesScu (studyUid, d->studyDescription, d->serieDescription, d->modality ); @@ -373,7 +375,7 @@ void QtDcmManager::loadDicomdir() void QtDcmManager::findPatientsDicomdir() { - d->seriesToImport.clear(); + d->dataToImport.clear(); QtDcmFindDicomdir * finder = new QtDcmFindDicomdir ( this ); finder->setDcmItem ( d->dfile.getDataset() ); finder->findPatients(); @@ -382,7 +384,7 @@ void QtDcmManager::findPatientsDicomdir() void QtDcmManager::findStudiesDicomdir ( const QString &patientName ) { - d->seriesToImport.clear(); + d->dataToImport.clear(); QtDcmFindDicomdir * finder = new QtDcmFindDicomdir ( this ); finder->setDcmItem ( d->dfile.getDataset() ); finder->findStudies ( patientName ); @@ -392,7 +394,7 @@ void QtDcmManager::findStudiesDicomdir ( const QString &patientName ) void QtDcmManager::findSeriesDicomdir ( const QString &patientName, const QString &studyUID ) { - d->seriesToImport.clear(); + d->dataToImport.clear(); QtDcmFindDicomdir * finder = new QtDcmFindDicomdir ( this ); finder->setDcmItem ( d->dfile.getDataset() ); finder->findSeries ( patientName, studyUID ); @@ -423,7 +425,7 @@ void QtDcmManager::moveSelectedSeries() mover->setDcmItem ( d->dfile.getDataset() ); mover->setOutputDir ( d->tempDir.absolutePath() ); mover->setImportDir ( d->outputDir ); - mover->setSeries ( d->seriesToImport ); + mover->setSeries ( d->dataToImport ); connect ( mover, &QtDcmMoveDicomdir::updateProgress, this, &QtDcmManager::updateProgressBar); connect ( mover, &QtDcmMoveDicomdir::serieMoved, @@ -440,14 +442,15 @@ void QtDcmManager::moveSelectedSeries() qWarning() << "****** Prepare move with parameters :"; qWarning() << "* by default IMPORT"; qWarning() << "* OutputDir = " << d->tempDir.absolutePath(); - qWarning() << "* SeriesUID = " << d->seriesToImport; + qWarning() << "* DataUID = " << d->dataToImport; qWarning() << "* ImportDir = " << d->outputDir; qWarning() << "******"; QtDcmMoveScu * mover = new QtDcmMoveScu ( this ); mover->setOutputDir ( d->tempDir.absolutePath() ); - mover->setSeries ( d->seriesToImport ); + mover->setData ( d->dataToImport ); mover->setImportDir ( d->outputDir ); + mover->setQueryLevel( d->queryLevel ); connect ( mover, &QtDcmMoveScu::updateProgress, this, &QtDcmManager::updateProgressBar); connect ( mover, &QtDcmMoveScu::serieMoved, @@ -527,7 +530,7 @@ void QtDcmManager::getPreviewFromSelectedSerie ( const QString &uid, int element QtDcmMoveScu * mover = new QtDcmMoveScu ( this ); mover->setMode ( QtDcmMoveScu::PREVIEW ); mover->setOutputDir ( d->tempDir.absolutePath() ); - mover->setSeries ( QStringList() << uid ); + mover->setData ( QStringList() << uid ); mover->setImageId ( imageId ); connect(mover, &QtDcmMoveScu::previewSlice, this, &QtDcmManager::makePreview); @@ -549,7 +552,7 @@ void QtDcmManager::getPreviewFromSelectedSerie ( const QString &uid, int element void QtDcmManager::importSelectedSeries() { if ( this->useExternalConverter() ) { //Use QtDcm convertion tool (ITK or dcm2nii) - if ( this->seriesToImportSize() != 0 ) { + if ( this->dataToImportSize() != 0 ) { if ( this->getOutputdirMode() == QtDcmManager::DIALOG ) { QFileDialog dialog( d->mainWidget ); dialog.setFileMode ( QFileDialog::Directory ); @@ -587,7 +590,7 @@ void QtDcmManager::importSelectedSeries() void QtDcmManager::importToDirectory ( const QString &directory ) { - if ( this->seriesToImportSize() != 0 ) { + if ( this->dataToImportSize() != 0 ) { this->setOutputDirectory ( directory ); this->moveSelectedSeries(); } @@ -607,12 +610,12 @@ void QtDcmManager::onSerieMoved ( const QString &directory , const QString &seri converter.convert(); qDebug() << "Conversion complete"; - if ( number == this->seriesToImportSize() - 1 ) { + if ( number == this->dataToImportSize() - 1 ) { emit importFinished(directory); } } - if ( number == this->seriesToImportSize() - 1 ) + if ( number == this->dataToImportSize() - 1 ) emit importFinished(directory); } @@ -942,27 +945,37 @@ QString QtDcmManager::currentSeriesDirectory() const return d->currentSerieDir.absolutePath(); } -void QtDcmManager::addSerieToImport ( const QString &uid ) +void QtDcmManager::addDataToImport ( const QString &uid, const QString & level ) { - if ( !d->seriesToImport.contains ( uid ) ) { - d->seriesToImport.append ( uid ); + d->dataToImport.clear(); + d->queryLevel = level; + if ( !d->dataToImport.contains ( uid ) ) { + d->dataToImport.append ( uid ); } + qDebug()<<"data to import "<dataToImport; } -void QtDcmManager::removeSerieToImport ( const QString &uid ) +void QtDcmManager::removeDataToImport ( const QString &uid, const QString & level ) { - if ( d->seriesToImport.contains ( uid ) ) - d->seriesToImport.removeOne ( uid ); + if ( d->queryLevel != level ) + { + d->dataToImport.clear(); + return; + } + + if ( d->dataToImport.contains ( uid ) ) + d->dataToImport.removeOne ( uid ); } -void QtDcmManager::clearSeriesToImport() +void QtDcmManager::clearDataToImport() { - d->seriesToImport.clear(); + d->queryLevel = "undefined"; + d->dataToImport.clear(); } -int QtDcmManager::seriesToImportSize() +int QtDcmManager::dataToImportSize() { - return d->seriesToImport.size(); + return d->dataToImport.size(); } bool QtDcmManager::useExternalConverter() const diff --git a/src/QtDcmManager.h b/src/QtDcmManager.h index 1408784..bb1ef38 100644 --- a/src/QtDcmManager.h +++ b/src/QtDcmManager.h @@ -261,13 +261,13 @@ class QTDCM_EXPORT QtDcmManager : public QObject */ QDate endDate() const; - void addSerieToImport ( const QString &uid ); + void addDataToImport ( const QString &uid, const QString &level = "" ); - void removeSerieToImport ( const QString &uid ); + void removeDataToImport ( const QString &uid, const QString &level = "" ); - void clearSeriesToImport(); + void clearDataToImport(); - int seriesToImportSize(); + int dataToImportSize(); /** * add patient in the list diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index 05bf8f4..0317505 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -33,13 +33,14 @@ class QtDcmMoveScu::Private { public: - QStringList series; + QStringList data; QStringList filenames; QString outputDir; QString importDir; QString currentSerie; QtDcmMoveScu::eMoveMode mode; + QString queryLevel; QString imageId; @@ -116,6 +117,7 @@ QtDcmMoveScu::QtDcmMoveScu ( QObject * parent ) d->acseTimeout = 60; d->dimseTimeout = 60; d->blockMode = DIMSE_BLOCKING; + d->queryLevel = "undefined"; d->mode = QtDcmMoveScu::IMPORT; } @@ -136,9 +138,14 @@ void QtDcmMoveScu::setImageId ( const QString & id ) d->imageId = id; } -void QtDcmMoveScu::setSeries ( const QStringList & series ) +void QtDcmMoveScu::setData ( const QStringList & data ) { - d->series = series; + d->data = data; +} + +void QtDcmMoveScu::setQueryLevel(const QString &level) +{ + d->queryLevel = level; } void QtDcmMoveScu::setOutputDir ( const QString & dir ) @@ -161,24 +168,24 @@ void QtDcmMoveScu::onStopMove() void QtDcmMoveScu::run() { OFCondition cond; - d->step = ( int ) ( 100.0 / d->series.size() ); + d->step = ( int ) ( 100.0 / d->data.size() ); d->progressTotal = 0; - for ( int i = 0; i < d->series.size(); i++ ) { - d->currentSerie = d->series.at ( i ); - const QDir serieDir ( d->outputDir + QDir::separator() + d->series.at ( i ) ); + for ( int i = 0; i < d->data.size(); i++ ) { + d->currentSerie = d->data.at ( i ); + const QDir serieDir ( d->outputDir + QDir::separator() + d->data.at ( i ) ); if ( !serieDir.exists() ) { - QDir ( d->outputDir ).mkdir ( d->series.at ( i ) ); + QDir ( d->outputDir ).mkdir ( d->data.at ( i ) ); } d->outputDirectory = QString ( d->outputDir + QDir::separator() + d->currentSerie ).toUtf8().constData(); //OK because this std::string contain utf8 and will be wrap into OFFilename with utf16 conversion if needed at line 755 if ( d->mode == IMPORT ) { - cond = this->move ( d->series.at ( i ) ); - emit updateProgress ( ( int ) ( 100.0 * ( i+1 ) / d->series.size() ) ); + cond = this->move ( d->data.at ( i ) ); + emit updateProgress ( ( int ) ( 100.0 * ( i+1 ) / d->data.size() ) ); d->progressTotal += d->step; - emit serieMoved ( serieDir.absolutePath(), d->series.at ( i ), i ); + emit serieMoved ( serieDir.absolutePath(), d->data.at ( i ), i ); } else { cond = this->move ( d->imageId ); @@ -205,9 +212,28 @@ OFCondition QtDcmMoveScu::move ( const QString & uid ) OFCondition cond; if ( d->mode == IMPORT ) { - this->addOverrideKey ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "SERIES" "" ) ); - this->addOverrideKey ( QString ( "SeriesInstanceUID=" + uid ) ); - } + qDebug()<<"move "<queryLevel<<" with uid "<queryLevel == "PATIENT") + { + this->addOverrideKey ( QString ( "QueryRetrieveLevel=" + d->queryLevel) ); + this->addOverrideKey ( QString ( "PatientID=" + uid ) ); + } + else if (d->queryLevel == "STUDY") + { + this->addOverrideKey ( QString ( "QueryRetrieveLevel=" + d->queryLevel) ); + this->addOverrideKey ( QString ( "StudyInstanceUID=" + uid ) ); + + } + else if (d->queryLevel == "SERIES") + { + this->addOverrideKey ( QString ( "QueryRetrieveLevel=" + d->queryLevel) ); + this->addOverrideKey ( QString ( "SeriesInstanceUID=" + uid ) ); + + } + // this->addOverrideKey ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "PATIENT" "" ) ); + // this->addOverrideKey ( QString ( "PatientID=" + uid ) ); + // qDebug()<<"patient to Import "<addOverrideKey ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "IMAGE" "" ) ); this->addOverrideKey ( QString ( "SOPInstanceUID=" + uid ) ); diff --git a/src/QtDcmMoveScu.h b/src/QtDcmMoveScu.h index f000854..e38c40b 100644 --- a/src/QtDcmMoveScu.h +++ b/src/QtDcmMoveScu.h @@ -88,7 +88,9 @@ class QtDcmMoveScu : public QThread void setImportDir ( const QString & dir ); - void setSeries ( const QStringList & series ); + void setData ( const QStringList & data ); + + void setQueryLevel( const QString &queryLevel); void run(); From d77cbdce77e2134558bfd1d1a0dd683c17fbcba4 Mon Sep 17 00:00:00 2001 From: CASTELNEAU Julien Date: Mon, 25 Jan 2021 14:21:33 +0100 Subject: [PATCH 12/21] [FIX] - Default : Search study with StudyDate= --- src/QtDcm.cpp | 28 +++++++++------------------- src/QtDcm.h | 2 ++ src/QtDcmFindScu.cpp | 10 +++++++++- src/QtDcmManager.cpp | 1 - 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/QtDcm.cpp b/src/QtDcm.cpp index df67959..194ad81 100644 --- a/src/QtDcm.cpp +++ b/src/QtDcm.cpp @@ -89,12 +89,12 @@ QtDcm::QtDcm ( QWidget *parent ) QDate currentDate = QDate::currentDate(); startDateEdit->setDate ( currentDate.addYears(-100) ); endDateEdit->setDate ( currentDate ); - + QtDcmManager::instance()->setPatientsTreeWidget ( treeWidgetPatients ); QtDcmManager::instance()->setStudiesTreeWidget ( treeWidgetStudies ); QtDcmManager::instance()->setSeriesTreeWidget ( treeWidgetSeries ); - QtDcmManager::instance()->setStartDate ( startDateEdit->date() ); - QtDcmManager::instance()->setEndDate ( endDateEdit->date() ); + QtDcmManager::instance()->setStartDate ( QDate() ); + QtDcmManager::instance()->setEndDate ( QDate() ); initConnections(); } @@ -340,21 +340,8 @@ void QtDcm::onStartDateChanged(const QDate &startdate) startDateEdit->setDate ( endDateEdit->date() ); startDateEdit->blockSignals(false); } - QtDcmManager::instance()->setStartDate ( startDateEdit->date() ); - - treeWidgetStudies->clear(); - treeWidgetSeries->clear(); - - if ( treeWidgetPatients->currentItem() ) { - if ( d->mode == QtDcm::PACS_MODE ) { - QtDcmManager::instance()->findStudiesScu ( treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text ( 0 ) ); - findSeriesFromStudyRows(); - } - else { - qDebug() << "Date filtering not available in CD-Rom mode"; - } - } + changeDate(); } void QtDcm::onEndDateChanged (const QDate &enddate) @@ -364,15 +351,18 @@ void QtDcm::onEndDateChanged (const QDate &enddate) endDateEdit->setDate(startDateEdit->date() ); endDateEdit->blockSignals(false); } - QtDcmManager::instance()->setEndDate ( endDateEdit->date() ); + changeDate(); +} +void QtDcm::changeDate() +{ treeWidgetStudies->clear(); treeWidgetSeries->clear(); if ( treeWidgetPatients->currentItem() ) { if ( d->mode == QtDcm::PACS_MODE ) { - QtDcmManager::instance()->findStudiesScu (treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text ( 0 ) ); + QtDcmManager::instance()->findStudiesScu ( treeWidgetPatients->currentItem()->text(1), treeWidgetPatients->currentItem()->text ( 0 ) ); findSeriesFromStudyRows(); } else { diff --git a/src/QtDcm.h b/src/QtDcm.h index 46e0623..7c10d5e 100644 --- a/src/QtDcm.h +++ b/src/QtDcm.h @@ -125,6 +125,8 @@ protected slots: private: void findSeriesFromStudyRows(); + void changeDate(); + QtDcmPrivate *d; }; diff --git a/src/QtDcmFindScu.cpp b/src/QtDcmFindScu.cpp index 68e2199..e9cd804 100644 --- a/src/QtDcmFindScu.cpp +++ b/src/QtDcmFindScu.cpp @@ -122,7 +122,15 @@ void QtDcmFindScu::findStudiesScu (const QString & patientId, const QString &pat { overrideKeys.push_back ( ( QString ( "StudyDescription=" ) + studyDescription ).toUtf8().data() ); } - overrideKeys.push_back ( QString ( "StudyDate=" + startDate + "-" + endDate ).toUtf8().data() ); + if (startDate.isEmpty() || endDate.isEmpty()) + { + overrideKeys.push_back ( QString ( "StudyDate=").toUtf8().data() ); + } + else + { + overrideKeys.push_back ( QString ( "StudyDate=" + startDate + "-" + endDate ).toUtf8().data() ); + } + overrideKeys.push_back ( QString ( "StudyID").toUtf8().data()); overrideKeys.push_back ( QString ( "AccessionNumber").toUtf8().data()); overrideKeys.push_back ( QString ( "NumberOfStudyRelatedSeries").toUtf8().data()); diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index 93b41ea..b0cee9c 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -952,7 +952,6 @@ void QtDcmManager::addDataToImport ( const QString &uid, const QString & level ) if ( !d->dataToImport.contains ( uid ) ) { d->dataToImport.append ( uid ); } - qDebug()<<"data to import "<dataToImport; } void QtDcmManager::removeDataToImport ( const QString &uid, const QString & level ) From 75571ff734fa1a20cf7ae95dcb978956df646e2d Mon Sep 17 00:00:00 2001 From: CASTELNEAU Julien Date: Mon, 25 Jan 2021 14:51:21 +0100 Subject: [PATCH 13/21] [FIX] - Dicom Range Matching http://dicom.nema.org/medical/Dicom/2017c/output/chtml/part04/sect_C.2.2.2.5.html --- src/QtDcmFindScu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/QtDcmFindScu.cpp b/src/QtDcmFindScu.cpp index e9cd804..a5dcf78 100644 --- a/src/QtDcmFindScu.cpp +++ b/src/QtDcmFindScu.cpp @@ -122,7 +122,7 @@ void QtDcmFindScu::findStudiesScu (const QString & patientId, const QString &pat { overrideKeys.push_back ( ( QString ( "StudyDescription=" ) + studyDescription ).toUtf8().data() ); } - if (startDate.isEmpty() || endDate.isEmpty()) + if (startDate.isEmpty() && endDate.isEmpty()) { overrideKeys.push_back ( QString ( "StudyDate=").toUtf8().data() ); } From 5539d7a049913690a5606b63a70c0b0f3d929fbe Mon Sep 17 00:00:00 2001 From: CASTELNEAU Julien Date: Wed, 27 Jan 2021 16:13:10 +0100 Subject: [PATCH 14/21] [FIX] - C-FIND Series Level with Study Query Retrieve Information Model (instead of PatientQueryRetrieveInfoModel) --- src/QtDcmFindScu.cpp | 31 +++---------------------------- src/QtDcmFindScu.h | 10 ++-------- src/QtDcmManager.cpp | 7 +++---- 3 files changed, 8 insertions(+), 40 deletions(-) diff --git a/src/QtDcmFindScu.cpp b/src/QtDcmFindScu.cpp index a5dcf78..b82f768 100644 --- a/src/QtDcmFindScu.cpp +++ b/src/QtDcmFindScu.cpp @@ -55,12 +55,6 @@ QtDcmFindScu::~QtDcmFindScu() d = NULL; } - -void QtDcmFindScu::findPatientsScu (const QString &patientId) -{ - this->findPatientsScu ( patientId, "*" ); -} - void QtDcmFindScu::findPatientsScu (const QString &patientId, const QString &patientSex) { OFList overrideKeys; @@ -98,15 +92,6 @@ void QtDcmFindScu::findPatientsScu (const QString &patientId, const QString &pat doQuery ( overrideKeys, QtDcmFindCallback::PATIENT ); } -void QtDcmFindScu::findStudiesScu (const QString &patientName) -{ - this->findStudiesScu ( QString("*"), patientName, "*", QDate ( 1900,01,01 ).toString ( "yyyyMMdd" ),QDate::currentDate().toString ( "yyyyMMdd" ) ); -} - -void QtDcmFindScu::findStudiesScu(const QString &patientName, const QString &studyDescription) -{ - this->findStudiesScu ( QString("*"), patientName, studyDescription, QDate ( 1900,01,01 ).toString ( "yyyyMMdd" ),QDate::currentDate().toString ( "yyyyMMdd" ) ); -} void QtDcmFindScu::findStudiesScu (const QString & patientId, const QString &patientName, const QString &studyDescription, const QString &startDate, const QString &endDate) { @@ -143,16 +128,6 @@ void QtDcmFindScu::findStudiesScu (const QString & patientId, const QString &pat } -void QtDcmFindScu::findSeriesScu (const QString &studyUID) -{ - this->findSeriesScu (studyUID, "", "", "" ); -} - -void QtDcmFindScu::findSeriesScu (const QString &studyUID, const QString &studyDescription, const QString &modality) -{ - this->findSeriesScu (studyUID, studyDescription, "", modality ); -} - void QtDcmFindScu::findSeriesScu (const QString &studyUID, const QString &studyDescription, const QString &serieDescription, const QString &modality) { OFList overrideKeys; @@ -194,7 +169,7 @@ void QtDcmFindScu::findSeriesScu (const QString &studyUID, const QString &studyD overrideKeys.push_back ( QString ( "AcquisitionNumber" ).toUtf8().data() ); overrideKeys.push_back ( QString ( "NumberOfSeriesRelatedInstances" ).toUtf8().data() ); - doQuery ( overrideKeys, QtDcmFindCallback::SERIE ); + doQuery ( overrideKeys, QtDcmFindCallback::SERIE , UID_FINDStudyRootQueryRetrieveInformationModel); } void QtDcmFindScu::findImagesScu (const QString &seriesUID) @@ -241,7 +216,7 @@ bool QtDcmFindScu::checkServerConnection ( int timeout ) return result; } -bool QtDcmFindScu::doQuery ( const OFList& overrideKeys, QtDcmFindCallback::cbType level ) +bool QtDcmFindScu::doQuery ( const OFList& overrideKeys, QtDcmFindCallback::cbType level, QString queryRetrieveInfoModel ) { //Image level OFList fileNameList; @@ -263,7 +238,7 @@ bool QtDcmFindScu::doQuery ( const OFList& overrideKeys, QtDcmFindCall d->manager->currentPacs().port().toInt(), QtDcmPreferences::instance()->aetitle().toUtf8().data(), d->manager->currentPacs().aetitle().toUtf8().data(), - UID_FINDPatientRootQueryRetrieveInformationModel, EXS_Unknown, + queryRetrieveInfoModel.toStdString().c_str() , EXS_Unknown, DIMSE_BLOCKING, 0, ASC_DEFAULTMAXPDU, false, false, 1, false, -1, &keys, &callback, &fileNameList ).bad() ) { QtDcmManager::instance()->displayErrorMessage ( tr ( "Cannot perform query C-FIND" ) ); } diff --git a/src/QtDcmFindScu.h b/src/QtDcmFindScu.h index e733383..98a6ab9 100644 --- a/src/QtDcmFindScu.h +++ b/src/QtDcmFindScu.h @@ -31,25 +31,19 @@ class QtDcmFindScu : public QObject explicit QtDcmFindScu ( QObject * parent = 0); virtual ~QtDcmFindScu(); - void findPatientsScu ( const QString & patientID ); void findPatientsScu ( const QString & patientID, const QString & patientSex ); void findPatientsScu ( const QString & patientID, const QString & patientSex, const QString & patientName ); - void findStudiesScu ( const QString & patientName ); - void findStudiesScu ( const QString & patientName, const QString & studyDescription ); void findStudiesScu ( const QString & patientId, const QString & patientName, const QString & studyDescription, const QString & startDate, const QString & endDate ); - void findSeriesScu ( const QString & studyUID ); - void findSeriesScu ( const QString & studyUID, const QString & modality ); - void findSeriesScu ( const QString & studyUID, const QString & studyDescription, const QString & modality ); - void findSeriesScu ( const QString & studyUID, const QString & studyDescription, const QString & serieDescription, const QString & modality ); + void findSeriesScu ( const QString & studyUID, const QString & studyDescription, const QString & serieDescription, const QString & modality); void findImagesScu ( const QString & seriesUID ); void findImageScu ( const QString & imageUID); protected: - bool doQuery(const OFList& overrideKeys, QtDcmFindCallback::cbType level); + bool doQuery(const OFList& overrideKeys, QtDcmFindCallback::cbType level, QString queryRetrieveInfoModel = UID_FINDPatientRootQueryRetrieveInformationModel); /** * test if the current selected pacs is available diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index b0cee9c..ec450db 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -144,12 +144,12 @@ QtDcmManager::QtDcmManager(QObject *parent) d->outputdirMode = DIALOG; d->patientName = ""; - d->patientId = "*"; + d->patientId = ""; d->patientBirthDate = ""; d->modality = ""; d->serieDescription = ""; d->studyDescription = ""; - d->patientSex = "*"; + d->patientSex = ""; d->queryLevel = "undefined"; d->mainWidget = NULL; @@ -295,9 +295,8 @@ void QtDcmManager::findStudiesScu (const QString &patientId, const QString &pati void QtDcmManager::findSeriesScu ( const QString &studyUid ) { d->dataToImport.clear(); - QtDcmFindScu * finder = new QtDcmFindScu ( this ); - finder->findSeriesScu (studyUid, d->studyDescription, d->serieDescription, d->modality ); + finder->findSeriesScu (studyUid, d->studyDescription, d->serieDescription, d->modality); delete finder; } From 4ea2054fa7d9353808df721ef81006fb0d3fa7a9 Mon Sep 17 00:00:00 2001 From: CASTELNEAU Julien Date: Thu, 4 Feb 2021 12:28:31 +0100 Subject: [PATCH 15/21] 1/ List dataToImport was too much cleared and there was not all the data in the list. Consequence => You want to move 3 patients but you move only one, the last you add... 2/ Fix ProgressBar and add an information message --- src/QtDcmImportWidget.cpp | 11 +++++++ src/QtDcmImportWidget.h | 4 ++- src/QtDcmManager.cpp | 22 ++++++------- src/QtDcmMoveScu.cpp | 67 ++++++++------------------------------- src/qtdcmImportWidget.ui | 48 +++++++++++++++++----------- 5 files changed, 65 insertions(+), 87 deletions(-) diff --git a/src/QtDcmImportWidget.cpp b/src/QtDcmImportWidget.cpp index e1aa84d..ccc0533 100644 --- a/src/QtDcmImportWidget.cpp +++ b/src/QtDcmImportWidget.cpp @@ -23,6 +23,7 @@ QtDcmImportWidget::QtDcmImportWidget(QWidget* parent) : QWidget(parent) { this->setupUi(this); + this->progressLabel->hide(); } QtDcmImportWidget::~QtDcmImportWidget() @@ -39,6 +40,16 @@ void QtDcmImportWidget::showProgressBar() this->importProgressBar->show(); } +void QtDcmImportWidget::hideProgressLabel() +{ + this->progressLabel->hide(); +} + +void QtDcmImportWidget::showProgressLabel() +{ + this->progressLabel->show(); +} + void QtDcmImportWidget::updateProgressBar(int i) { this->importProgressBar->setValue(i); diff --git a/src/QtDcmImportWidget.h b/src/QtDcmImportWidget.h index 4c9d3f6..1a96ed7 100644 --- a/src/QtDcmImportWidget.h +++ b/src/QtDcmImportWidget.h @@ -34,11 +34,13 @@ class QTDCM_EXPORT QtDcmImportWidget : public QWidget, public Ui::QtDcmImportWid void hideProgressBar(); void showProgressBar(); + void hideProgressLabel(); + void showProgressLabel(); void setImportButtonEnabled(bool enable); public slots: void updateProgressBar ( int i ); - + }; #endif // QTDCMIMPORTWIDGET_H diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index ec450db..ec89484 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -274,7 +274,6 @@ void QtDcmManager::displayMessage ( const QString &info ) void QtDcmManager::findPatientsScu() { if ( d->mainWidget->pacsComboBox->count() ) { - d->dataToImport.clear(); d->mode = PACS; QtDcmFindScu * finder = new QtDcmFindScu ( this ); @@ -285,8 +284,6 @@ void QtDcmManager::findPatientsScu() void QtDcmManager::findStudiesScu (const QString &patientId, const QString &patientName) { - d->dataToImport.clear(); - QtDcmFindScu * finder = new QtDcmFindScu ( this ); finder->findStudiesScu ( patientId, patientName, d->studyDescription, d->startDate.toString( "yyyyMMdd" ), d->endDate.toString( "yyyyMMdd" )); delete finder; @@ -294,7 +291,6 @@ void QtDcmManager::findStudiesScu (const QString &patientId, const QString &pati void QtDcmManager::findSeriesScu ( const QString &studyUid ) { - d->dataToImport.clear(); QtDcmFindScu * finder = new QtDcmFindScu ( this ); finder->findSeriesScu (studyUid, d->studyDescription, d->serieDescription, d->modality); delete finder; @@ -374,7 +370,6 @@ void QtDcmManager::loadDicomdir() void QtDcmManager::findPatientsDicomdir() { - d->dataToImport.clear(); QtDcmFindDicomdir * finder = new QtDcmFindDicomdir ( this ); finder->setDcmItem ( d->dfile.getDataset() ); finder->findPatients(); @@ -383,7 +378,6 @@ void QtDcmManager::findPatientsDicomdir() void QtDcmManager::findStudiesDicomdir ( const QString &patientName ) { - d->dataToImport.clear(); QtDcmFindDicomdir * finder = new QtDcmFindDicomdir ( this ); finder->setDcmItem ( d->dfile.getDataset() ); finder->findStudies ( patientName ); @@ -393,7 +387,6 @@ void QtDcmManager::findStudiesDicomdir ( const QString &patientName ) void QtDcmManager::findSeriesDicomdir ( const QString &patientName, const QString &studyUID ) { - d->dataToImport.clear(); QtDcmFindDicomdir * finder = new QtDcmFindDicomdir ( this ); finder->setDcmItem ( d->dfile.getDataset() ); finder->findSeries ( patientName, studyUID ); @@ -444,7 +437,7 @@ void QtDcmManager::moveSelectedSeries() qWarning() << "* DataUID = " << d->dataToImport; qWarning() << "* ImportDir = " << d->outputDir; qWarning() << "******"; - + d->importWidget->showProgressLabel(); QtDcmMoveScu * mover = new QtDcmMoveScu ( this ); mover->setOutputDir ( d->tempDir.absolutePath() ); mover->setData ( d->dataToImport ); @@ -459,6 +452,7 @@ void QtDcmManager::moveSelectedSeries() connect ( mover, &QtDcmMoveScu::finished, mover, &QtDcmMoveScu::deleteLater); mover->start(); + } break; default: @@ -613,15 +607,14 @@ void QtDcmManager::onSerieMoved ( const QString &directory , const QString &seri emit importFinished(directory); } } - - if ( number == this->dataToImportSize() - 1 ) - emit importFinished(directory); + emit importFinished(directory); } void QtDcmManager::moveSeriesFinished() { if ( d->importWidget ) { d->importWidget->importProgressBar->setValue ( 0 ); + d->importWidget->hideProgressLabel(); } } @@ -946,8 +939,11 @@ QString QtDcmManager::currentSeriesDirectory() const void QtDcmManager::addDataToImport ( const QString &uid, const QString & level ) { - d->dataToImport.clear(); - d->queryLevel = level; + if (d->queryLevel != level) + { + d->dataToImport.clear(); + d->queryLevel = level; + } if ( !d->dataToImport.contains ( uid ) ) { d->dataToImport.append ( uid ); } diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index 0317505..aacc7ae 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -76,21 +76,12 @@ class QtDcmMoveScu::Private OFBool ignorePendingDatasets; DcmDataset overrideKeys; OFString outputDirectory; - - int slicesCount; - int progressTotal; - int progressSerie; - int step; }; QtDcmMoveScu::QtDcmMoveScu ( QObject * parent ) : QThread(parent), d ( new QtDcmMoveScu::Private ) { - d->progressTotal = 0; - d->progressSerie = 0; - d->step = 0; - d->net = 0; d->assoc = 0; d->params = 0; @@ -168,8 +159,10 @@ void QtDcmMoveScu::onStopMove() void QtDcmMoveScu::run() { OFCondition cond; - d->step = ( int ) ( 100.0 / d->data.size() ); - d->progressTotal = 0; + + int lowThreshold = 15; + int step = (100-lowThreshold)/(d->data.size()); + emit updateProgress ( lowThreshold ); for ( int i = 0; i < d->data.size(); i++ ) { d->currentSerie = d->data.at ( i ); @@ -183,14 +176,14 @@ void QtDcmMoveScu::run() if ( d->mode == IMPORT ) { cond = this->move ( d->data.at ( i ) ); - emit updateProgress ( ( int ) ( 100.0 * ( i+1 ) / d->data.size() ) ); - d->progressTotal += d->step; + emit updateProgress ( lowThreshold + ((i+1)*step)); emit serieMoved ( serieDir.absolutePath(), d->data.at ( i ), i ); } else { cond = this->move ( d->imageId ); } } + emit updateProgress(100); } OFCondition QtDcmMoveScu::move ( const QString & uid ) @@ -230,10 +223,7 @@ OFCondition QtDcmMoveScu::move ( const QString & uid ) this->addOverrideKey ( QString ( "SeriesInstanceUID=" + uid ) ); } - // this->addOverrideKey ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "PATIENT" "" ) ); - // this->addOverrideKey ( QString ( "PatientID=" + uid ) ); - // qDebug()<<"patient to Import "<addOverrideKey ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "IMAGE" "" ) ); this->addOverrideKey ( QString ( "SOPInstanceUID=" + uid ) ); @@ -717,11 +707,7 @@ OFCondition QtDcmMoveScu::echoSCP ( T_ASC_Association * assoc, T_DIMSE_Message * OFCondition QtDcmMoveScu::storeSCP ( T_ASC_Association *assoc, T_DIMSE_Message *msg, T_ASC_PresentationContextID presID, void* subOpCallbackData ) { - QtDcmMoveScu * self = static_cast(subOpCallbackData); - if (!self) { - qWarning() << "Cannot cast caller"; - return EC_IllegalCall; - } + QtDcmMoveScu * self = reinterpret_cast(subOpCallbackData); OFCondition cond = EC_Normal; T_DIMSE_C_StoreRQ *req; @@ -763,16 +749,13 @@ OFCondition QtDcmMoveScu::storeSCP ( T_ASC_Association *assoc, T_DIMSE_Message * void QtDcmMoveScu::storeSCPCallback ( void *callbackData, T_DIMSE_StoreProgress *progress, T_DIMSE_C_StoreRQ *req, char *imageFile, DcmDataset **imageDataSet, T_DIMSE_C_StoreRSP *rsp, DcmDataset **statusDetail ) { - QtDcmMoveScu * self = static_cast(callbackData); - if (!self) { - qWarning() << "Cannot cast caller"; - return; - } - + QtDcmMoveScu * self = reinterpret_cast(callbackData); + DIC_UI sopClass; DIC_UI sopInstance; - + if ( progress->state == DIMSE_StoreEnd ) { + *statusDetail = NULL; if ( ( imageDataSet != NULL ) && ( *imageDataSet != NULL ) && !self->d->bitPreserving && !self->d->ignore ) { /* create full path name for the output file */ @@ -868,15 +851,7 @@ void QtDcmMoveScu::subOpCallback ( void * caller, T_ASC_Network *aNet, T_ASC_Ass if ( !caller ) return; - QtDcmMoveScu * self = static_cast(caller); - if (!self) { - qWarning() << "Cannot cast caller"; - return; - } - - if ( self->d->slicesCount ) { - emit self->updateProgress ( self->d->progressTotal + ( int ) ( ( ( float ) ( self->d->step * ( self->d->progressSerie ) / self->d->slicesCount ) ) ) ); - } + QtDcmMoveScu * self = reinterpret_cast(caller); if ( aNet == NULL ) return; /* help no net ! */ @@ -888,8 +863,6 @@ void QtDcmMoveScu::subOpCallback ( void * caller, T_ASC_Network *aNet, T_ASC_Ass /* be a service class provider */ subOpSCP ( subAssoc, caller ); } - - self->d->progressSerie ++; } void QtDcmMoveScu::moveCallback ( void *caller, T_DIMSE_C_MoveRQ * req, int responseCount, T_DIMSE_C_MoveRSP * rsp ) @@ -897,18 +870,6 @@ void QtDcmMoveScu::moveCallback ( void *caller, T_DIMSE_C_MoveRQ * req, int resp if ( !caller ) return; - QtDcmMoveScu * self = static_cast(caller); - if (!self) { - qWarning() << "Cannot cast caller"; - return; - } - - if ( responseCount == 1 ) { - self->d->progressSerie = 0; - } - - self->d->slicesCount = rsp->NumberOfRemainingSubOperations + rsp->NumberOfFailedSubOperations + rsp->NumberOfWarningSubOperations + rsp->NumberOfCompletedSubOperations; - OFString temp_str; DIMSE_dumpMessage ( temp_str, *rsp, DIMSE_INCOMING ); @@ -992,8 +953,6 @@ OFCondition QtDcmMoveScu::moveSCU ( T_ASC_Association * assoc, const char *fname else { strcpy( req.MoveDestination, d->moveDestination ); } - - const OFCondition cond = DIMSE_moveUser ( assoc, d->presId, &req, diff --git a/src/qtdcmImportWidget.ui b/src/qtdcmImportWidget.ui index 2a91a5c..319f785 100644 --- a/src/qtdcmImportWidget.ui +++ b/src/qtdcmImportWidget.ui @@ -7,39 +7,26 @@ 0 0 301 - 72 + 75 0 - 72 + 75 16777215 - 72 + 94 Form - - - - - 300 - 16 - - - - 0 - - - - + @@ -57,15 +44,38 @@ Import - + :/Images/save.svg:/Images/save.svg + + + + + 300 + 16 + + + + 0 + + + + + + + Please Wait! It could take a while... + + + Qt::AlignCenter + + + - + From 454032620ed81f3c2f535bc49ab2b85dcc68f7a0 Mon Sep 17 00:00:00 2001 From: CASTELNEAU Julien Date: Thu, 4 Mar 2021 09:35:18 +0100 Subject: [PATCH 16/21] [DEV] - Send metadata from Find to external app (medInria for instance) and ability to import from signal without import button --- src/QtDcm.cpp | 7 +- src/QtDcmFindCallback.cpp | 5 ++ src/QtDcmFindScu.cpp | 15 ++++ src/QtDcmFindScu.h | 1 + src/QtDcmImportWidget.cpp | 14 ++++ src/QtDcmImportWidget.h | 4 +- src/QtDcmManager.cpp | 163 +++++++++++++++++++++++++++++++++++++- src/QtDcmManager.h | 23 +++++- src/QtDcmMoveScu.cpp | 16 +++- src/QtDcmMoveScu.h | 3 +- src/qtdcmImportWidget.ui | 27 +++++-- 11 files changed, 262 insertions(+), 16 deletions(-) diff --git a/src/QtDcm.cpp b/src/QtDcm.cpp index 194ad81..390ac6f 100644 --- a/src/QtDcm.cpp +++ b/src/QtDcm.cpp @@ -176,11 +176,14 @@ void QtDcm::onPatientItemClicked ( QTreeWidgetItem * item, int column ) treeWidgetStudies->clear(); treeWidgetSeries->clear(); QtDcmManager::instance()->clearDataToImport(); - + QtDcmManager::instance()->clearPatientDataToFetch(); + QtDcmManager::instance()->clearSeriesDataToFetch(); if ( d->mode == QtDcm::PACS_MODE ) { for (QTreeWidgetItem *ptItem : treeWidgetPatients->selectedItems()) { + QtDcmManager::instance()->addPatientDataToFetch(ptItem->text(1), ptItem->text(0), + ptItem->text(2), ptItem->text(3)); QtDcmManager::instance()->findStudiesScu (ptItem->text(1), ptItem->text ( 0 ) ); QtDcmManager::instance()->addDataToImport(ptItem->text(1), "PATIENT"); } @@ -203,7 +206,7 @@ void QtDcm::onStudyItemClicked(QTreeWidgetItem * item, int column ) QtDcmManager::instance()->clearSerieInfo(); QtDcmManager::instance()->clearPreview(); QtDcmManager::instance()->clearDataToImport(); - + QtDcmManager::instance()->clearSeriesDataToFetch(); treeWidgetSeries->clear(); if ( d->mode == QtDcm::PACS_MODE ) diff --git a/src/QtDcmFindCallback.cpp b/src/QtDcmFindCallback.cpp index 92d1bdd..7572a63 100644 --- a/src/QtDcmFindCallback.cpp +++ b/src/QtDcmFindCallback.cpp @@ -90,6 +90,8 @@ void QtDcmFindCallback::callback ( T_DIMSE_C_FindRQ *request, int responseCount, infosMap.insert ( "ID", QString ( info.c_str() ) ); responseIdentifiers->findAndGetOFString ( DCM_StudyInstanceUID, info ); infosMap.insert ( "UID", QString ( info.c_str() ) ); + responseIdentifiers->findAndGetOFString ( DCM_PatientID, info ); + infosMap.insert ( "PatientID", QString ( info.c_str() ) ); QtDcmManager::instance()->foundStudy ( infosMap ); @@ -111,6 +113,9 @@ void QtDcmFindCallback::callback ( T_DIMSE_C_FindRQ *request, int responseCount, responseIdentifiers->findAndGetOFString ( DCM_NumberOfSeriesRelatedInstances, info ); infosMap.insert ( "InstanceCount", QString ( info.c_str() ) ); + responseIdentifiers->findAndGetOFString ( DCM_StudyInstanceUID, info ); + infosMap.insert ( "StudyInstanceUID", QString ( info.c_str() ) ); + QtDcmManager::instance()->foundSerie ( infosMap ); break; diff --git a/src/QtDcmFindScu.cpp b/src/QtDcmFindScu.cpp index b82f768..8b777b2 100644 --- a/src/QtDcmFindScu.cpp +++ b/src/QtDcmFindScu.cpp @@ -200,6 +200,21 @@ void QtDcmFindScu::findImageScu (const QString &imageUID) doQuery ( overrideKeys, QtDcmFindCallback::IMAGE ); } +void QtDcmFindScu::findStudiesFromPatient(const QString &patientID) +{ + qDebug()<<"patientID "< overrideKeys; + overrideKeys.push_back ( ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "PATIENT" "" ) ).toUtf8().data() ); + overrideKeys.push_back ( ( QString ( "PatientName=" ) + patientID ).toUtf8().data() ); + // overrideKeys.push_back ( QString ( "PatientName").toUtf8().data() ); + + //Study level + // overrideKeys.push_back ( QString ( "StudyDescription" ).toUtf8().data() ); + // overrideKeys.push_back ( QString ( "SeriesDescription" ).toUtf8().data() ); + + doQuery ( overrideKeys, QtDcmFindCallback::TEST ); +} + bool QtDcmFindScu::checkServerConnection ( int timeout ) { bool result = true; diff --git a/src/QtDcmFindScu.h b/src/QtDcmFindScu.h index 98a6ab9..048ab8d 100644 --- a/src/QtDcmFindScu.h +++ b/src/QtDcmFindScu.h @@ -41,6 +41,7 @@ class QtDcmFindScu : public QObject void findImagesScu ( const QString & seriesUID ); void findImageScu ( const QString & imageUID); + void findStudiesFromPatient(const QString &patientID); protected: bool doQuery(const OFList& overrideKeys, QtDcmFindCallback::cbType level, QString queryRetrieveInfoModel = UID_FINDPatientRootQueryRetrieveInformationModel); diff --git a/src/QtDcmImportWidget.cpp b/src/QtDcmImportWidget.cpp index ccc0533..38898fb 100644 --- a/src/QtDcmImportWidget.cpp +++ b/src/QtDcmImportWidget.cpp @@ -24,6 +24,7 @@ QtDcmImportWidget::QtDcmImportWidget(QWidget* parent) : QWidget(parent) { this->setupUi(this); this->progressLabel->hide(); + this->fetchButton->hide(); } QtDcmImportWidget::~QtDcmImportWidget() @@ -50,6 +51,11 @@ void QtDcmImportWidget::showProgressLabel() this->progressLabel->show(); } +void QtDcmImportWidget::setProgressLabelMessage(const QString &msg) +{ + this->progressLabel->setText(msg); +} + void QtDcmImportWidget::updateProgressBar(int i) { this->importProgressBar->setValue(i); @@ -59,3 +65,11 @@ void QtDcmImportWidget::setImportButtonEnabled(bool enable) { this->importButton->setEnabled(enable); } + +void QtDcmImportWidget::setFetchMode() +{ + // this->importButton->hide(); + // this->importProgressBar->hide(); + this->fetchButton->show(); + +} \ No newline at end of file diff --git a/src/QtDcmImportWidget.h b/src/QtDcmImportWidget.h index 1a96ed7..b187ef7 100644 --- a/src/QtDcmImportWidget.h +++ b/src/QtDcmImportWidget.h @@ -37,7 +37,9 @@ class QTDCM_EXPORT QtDcmImportWidget : public QWidget, public Ui::QtDcmImportWid void hideProgressLabel(); void showProgressLabel(); void setImportButtonEnabled(bool enable); - + void setFetchMode(); + void setProgressLabelMessage(const QString &msg); + public slots: void updateProgressBar ( int i ); diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index ec89484..b9130bc 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -109,6 +109,9 @@ class QtDcmManagerPrivate QPointer serieInfoWidget; /** The pointer to the serie info widget */ bool useConverter; /** Use a converter ? */ + + QHash> patientData; + QHash> seriesData; }; QtDcmManager * QtDcmManager::_instance = 0; @@ -202,6 +205,8 @@ void QtDcmManager::setImportWidget ( QtDcmImportWidget* widget ) d->importWidget = widget; QObject::connect ( d->importWidget->importButton, &QPushButton::clicked, this, &QtDcmManager::importSelectedSeries); + QObject::connect ( d->importWidget->fetchButton, &QPushButton::clicked, + this, &QtDcmManager::fetchSelectedData); } void QtDcmManager::setPreviewWidget ( QtDcmPreviewWidget* widget ) @@ -323,7 +328,19 @@ void QtDcmManager::foundStudy ( const QMap &infosMap ) studyItem->setData ( 1, 0, infosMap["UID"] ); studyItem->setText ( 1, infosMap["UID"] ); studyItem->setText ( 2, examDate.toString ( "dd/MM/yyyy" ) ); - studyItem->setData ( 3, 0, infosMap["ID"] ); + studyItem->setData ( 3, 0, infosMap["ID"] ); + + QHash &patientEntry = d->patientData[infosMap["PatientID"]]; + if (!patientEntry.isEmpty()) + { + QHash studies = patientEntry["studies"].toHash(); + if (!studies.contains(infosMap["UID"])) + { + studies.insert(infosMap["UID"], infosMap["Description"]); + findSeriesScu(infosMap["UID"]); + } + patientEntry["studies"] = studies; + } } } @@ -339,6 +356,15 @@ void QtDcmManager::foundSerie ( const QMap &infosMap ) serieItem->setData ( 4, 0, QVariant ( infosMap["InstanceCount"] ) ); serieItem->setData ( 5, 0, QVariant ( infosMap["Institution"] ) ); serieItem->setData ( 6, 0, QVariant ( infosMap["Operator"] ) ); + + QHash &seriesEntry = d->seriesData[infosMap["ID"]]; + if (seriesEntry.isEmpty()) + { + seriesEntry["StudyInstanceUID"] = infosMap["StudyInstanceUID"]; + seriesEntry["SeriesDescription"] = infosMap["Description"]; + seriesEntry["Modality"] = infosMap["Modality"]; + } + } } @@ -461,6 +487,42 @@ void QtDcmManager::moveSelectedSeries() } } +void QtDcmManager::onMoveRequested(const QString &uid, const QString queryLevel) +{ + if ( !d->tempDir.exists() || d->mode != PACS) { + return; + } + qWarning() << "****** Move request from External Application :"; + qWarning() << "* by default IMPORT"; + qWarning() << "* OutputDir = " << d->tempDir.absolutePath(); + qWarning() << "* DataUID = " << uid; + qWarning() << "* QueryLevel = " << queryLevel; + qWarning() << "* ImportDir = " << d->outputDir; + qWarning() << "******"; + QStringList dataToRetrieve; + dataToRetrieve << uid; + QtDcmMoveScu * mover = new QtDcmMoveScu ( this ); + mover->setOutputDir ( d->tempDir.absolutePath() ); + mover->setData ( dataToRetrieve ); + mover->setImportDir ( d->outputDir ); + mover->setQueryLevel( queryLevel ); + connect ( mover, &QtDcmMoveScu::updateProgress, + this, &QtDcmManager::updateProgressLevel); + connect( mover, &QtDcmMoveScu::serieMoved, [&](const QString &path){ + emit moveState(OK, path); + }); + connect( mover, &QtDcmMoveScu::moveInProgress, [&](const QString &message){ + emit moveState(PENDING, message); + }); + connect( mover, &QtDcmMoveScu::moveFailed, [&](const QString &reason){ + emit moveState(KO, reason); + }); + connect ( mover, &QtDcmMoveScu::finished, + mover, &QtDcmMoveScu::deleteLater); + mover->start(); + +} + void QtDcmManager::getPreviewFromSelectedSerie ( const QString &uid, int elementIndex ) { if ( !d->tempDir.exists() ) { @@ -581,6 +643,105 @@ void QtDcmManager::importSelectedSeries() } } +void QtDcmManager::fetchSelectedData() +{ + QHash> ptData; + QHash> seData; + + if (d->queryLevel=="undefined") + { + return; + } + else if (d->queryLevel=="PATIENT") + { + ptData = d->patientData; + seData = d->seriesData; + } + else if (d->queryLevel=="STUDY") + { + ptData = getPatientsToFetch(d->dataToImport); + seData = d->seriesData; + } + else if (d->queryLevel=="SERIES") + { + seData = getSeriesToFetch(d->dataToImport); + QList studyUIDs = seData.keys(); + for (QHash &seEntry : seData) + { + studyUIDs.append(seEntry["StudyInstanceUID"].toString()); + } + ptData = getPatientsToFetch(studyUIDs); + } + + emit(fetchFinished(ptData, seData)); +} + +QHash> QtDcmManager::getPatientsToFetch(QList studyUIDs) +{ + QHash> ptData; + QHash tmpStudies; + QHash ptEntry; + for (QHash &patientEntry : d->patientData) + { + tmpStudies.clear(); + ptEntry.clear(); + QString pKey = d->patientData.key(patientEntry); + QHash studies = patientEntry["studies"].toHash(); + QList keys = studies.keys(); + for (QString key : keys) + { + if (studyUIDs.contains(key)) + { + tmpStudies.insert(key, studies.value(key)); + } + } + if (!tmpStudies.isEmpty()) + { + ptEntry["PatientName"] = patientEntry["PatientName"]; + ptEntry["BirthDate"] = patientEntry["BirthDate"]; + ptEntry["Gender"] = patientEntry["Gender"]; + ptEntry["studies"] = tmpStudies; + ptData[pKey] = ptEntry; + } + } + + return ptData; +} + +QHash> QtDcmManager::getSeriesToFetch(QList seriesUIDs) +{ + QHash> seData; + QList keys = d->seriesData.keys(); + for (QString key : keys) + { + if (seriesUIDs.contains(key)) + { + seData[key] = d->seriesData[key]; + } + } + return seData; +} + +void QtDcmManager::addPatientDataToFetch(const QString &patientID, const QString &patientName, const QString &birthDate, const QString &gender) +{ + QHash &patientEntry = d->patientData[patientID]; + if (patientEntry.isEmpty()) + { + patientEntry["PatientName"] = patientName; + patientEntry["BirthDate"] = QDate::fromString ( birthDate, "dd/MM/yyyy" ).toString ( "yyyyMMdd" ); + patientEntry["Gender"] = gender; + } +} + +void QtDcmManager::clearPatientDataToFetch() +{ + d->patientData.clear(); +} + +void QtDcmManager::clearSeriesDataToFetch() +{ + d->seriesData.clear(); +} void QtDcmManager::importToDirectory ( const QString &directory ) { if ( this->dataToImportSize() != 0 ) { diff --git a/src/QtDcmManager.h b/src/QtDcmManager.h index bb1ef38..277eb21 100644 --- a/src/QtDcmManager.h +++ b/src/QtDcmManager.h @@ -61,6 +61,12 @@ class QTDCM_EXPORT QtDcmManager : public QObject PACS }; + enum eMoveStatus { + OK = 0, + PENDING, + KO + }; + static QtDcmManager* instance(); static void destroy(); @@ -300,6 +306,13 @@ class QTDCM_EXPORT QtDcmManager : public QObject */ void deleteTemporaryDirs(); + void addPatientDataToFetch(const QString &patientID, const QString &patientName, + const QString &birthDate, const QString &gender); + + + void clearPatientDataToFetch(); + void clearSeriesDataToFetch(); + public slots: // void onPatientFound() @@ -310,13 +323,18 @@ public slots: void onSerieMoved ( const QString &directory, const QString &uid, int number ); void importSelectedSeries(); + void fetchSelectedData(); void importToDirectory ( const QString &directory ); + void onMoveRequested(const QString &uid, const QString queryLevel); signals: void serieMoved ( const QString &directory ); void importFinished(const QString &directory); + void updateProgressLevel(int level); void gettingPreview(); - + void fetchFinished(QHash> patientData, + QHash> seriesData); + void moveState(int status, const QString &pathOrMessage); private: /*! * \brief QtDcmManager constructor, private on purpose as it's a singleton @@ -329,6 +347,9 @@ public slots: void deleteCurrentSerieDir(); + QHash> getPatientsToFetch(QList studyUIDs); + QHash> getSeriesToFetch(QList seriesUIDs); + /** * Create the temporary directory (/tmp/qtdcm on Unix) and the logging directory. * (/tmp/qtdcm/logs) diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index aacc7ae..7680bb0 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -176,8 +176,16 @@ void QtDcmMoveScu::run() if ( d->mode == IMPORT ) { cond = this->move ( d->data.at ( i ) ); - emit updateProgress ( lowThreshold + ((i+1)*step)); - emit serieMoved ( serieDir.absolutePath(), d->data.at ( i ), i ); + if (cond.status()==OF_ok) + { + emit updateProgress ( lowThreshold + ((i+1)*step)); + emit serieMoved ( serieDir.absolutePath(), d->data.at ( i ), i ); + } + else + { + emit updateProgress (0); + emit moveFailed(cond.text()); + } } else { cond = this->move ( d->imageId ); @@ -790,6 +798,10 @@ void QtDcmMoveScu::storeSCPCallback ( void *callbackData, T_DIMSE_StoreProgress } } } + else if (progress->state == DIMSE_StoreProgressing) + { + emit self->moveInProgress(QString("C-Move in progress...")); + } return; } diff --git a/src/QtDcmMoveScu.h b/src/QtDcmMoveScu.h index e38c40b..9815baf 100644 --- a/src/QtDcmMoveScu.h +++ b/src/QtDcmMoveScu.h @@ -101,7 +101,8 @@ public slots: void updateProgress ( int i ); void previewSlice ( const QString & filename ); void serieMoved(const QString & directory, const QString & uid, int number); - + void moveFailed(const QString &message); + void moveInProgress(const QString &message); protected: OFCondition move ( const QString & uid ); diff --git a/src/qtdcmImportWidget.ui b/src/qtdcmImportWidget.ui index 319f785..bdf440f 100644 --- a/src/qtdcmImportWidget.ui +++ b/src/qtdcmImportWidget.ui @@ -7,7 +7,7 @@ 0 0 301 - 75 + 117 @@ -19,14 +19,14 @@ 16777215 - 94 + 300 Form - + @@ -49,6 +49,16 @@ + + + + Please Wait! It could take a while... + + + Qt::AlignCenter + + + @@ -62,13 +72,14 @@ - - + + - Please Wait! It could take a while... + Fetch - - Qt::AlignCenter + + + :/Images/save.svg:/Images/save.svg From 332187147cff4809839720c5ad736c1b20035034 Mon Sep 17 00:00:00 2001 From: CASTELNEAU Julien Date: Thu, 4 Mar 2021 15:34:26 +0100 Subject: [PATCH 17/21] [NEW] Change trigger on textEdit Filters (seriesDesc, studyDesc, patientName) & remove dead code --- src/QtDcm.cpp | 16 ++++++++++------ src/QtDcm.h | 6 +++--- src/QtDcmFindScu.cpp | 25 +++++++------------------ src/QtDcmFindScu.h | 1 - 4 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/QtDcm.cpp b/src/QtDcm.cpp index 390ac6f..5cc5bb7 100644 --- a/src/QtDcm.cpp +++ b/src/QtDcm.cpp @@ -114,11 +114,11 @@ void QtDcm::initConnections() this, &QtDcm::onStudyItemClicked); connect ( treeWidgetSeries, &QTreeWidget::itemClicked, this, &QtDcm::onSerieItemClicked); - connect ( nameEdit, &QLineEdit::textChanged, + connect ( nameEdit, &QLineEdit::returnPressed, this, &QtDcm::onPatientNameTextChanged); - connect ( serieDescriptionEdit, &QLineEdit::textChanged, + connect ( serieDescriptionEdit, &QLineEdit::returnPressed, this, &QtDcm::onSerieDescriptionTextChanged); - connect ( studyDescriptionEdit, &QLineEdit::textChanged, + connect ( studyDescriptionEdit, &QLineEdit::returnPressed, this, &QtDcm::onStudyDescriptionTextChanged); connect ( searchButton, &QPushButton::clicked, this, &QtDcm::onPacsSearchButtonClicked); @@ -411,8 +411,10 @@ void QtDcm::openDicomdir() } } -void QtDcm::onPatientNameTextChanged (const QString &pName) +void QtDcm::onPatientNameTextChanged () { + QString pName = nameEdit->text(); + if (pName.isEmpty() ) { QtDcmManager::instance()->setPatientName ( "" ); } @@ -425,8 +427,9 @@ void QtDcm::onPatientNameTextChanged (const QString &pName) } } -void QtDcm::onStudyDescriptionTextChanged (const QString &description) +void QtDcm::onStudyDescriptionTextChanged () { + QString description = studyDescriptionEdit->text(); if ( description.isEmpty() ) { QtDcmManager::instance()->setStudyDescription ( "" ); } @@ -445,8 +448,9 @@ void QtDcm::onStudyDescriptionTextChanged (const QString &description) } } -void QtDcm::onSerieDescriptionTextChanged (const QString &description) +void QtDcm::onSerieDescriptionTextChanged () { + QString description = serieDescriptionEdit->text(); if ( description.isEmpty() ) { QtDcmManager::instance()->setSerieDescription ( "" ); } diff --git a/src/QtDcm.h b/src/QtDcm.h index 7c10d5e..13db8b7 100644 --- a/src/QtDcm.h +++ b/src/QtDcm.h @@ -111,11 +111,11 @@ protected slots: void onDicomMediaButtonClicked(); - void onPatientNameTextChanged ( const QString & pName); + void onPatientNameTextChanged (); - void onSerieDescriptionTextChanged ( const QString & description ); + void onSerieDescriptionTextChanged (); - void onStudyDescriptionTextChanged ( const QString & description ); + void onStudyDescriptionTextChanged (); protected: void loadPatientsFromDicomdir(); diff --git a/src/QtDcmFindScu.cpp b/src/QtDcmFindScu.cpp index 8b777b2..51ced43 100644 --- a/src/QtDcmFindScu.cpp +++ b/src/QtDcmFindScu.cpp @@ -200,21 +200,6 @@ void QtDcmFindScu::findImageScu (const QString &imageUID) doQuery ( overrideKeys, QtDcmFindCallback::IMAGE ); } -void QtDcmFindScu::findStudiesFromPatient(const QString &patientID) -{ - qDebug()<<"patientID "< overrideKeys; - overrideKeys.push_back ( ( QString ( "QueryRetrieveLevel=" ) + QString ( "" "PATIENT" "" ) ).toUtf8().data() ); - overrideKeys.push_back ( ( QString ( "PatientName=" ) + patientID ).toUtf8().data() ); - // overrideKeys.push_back ( QString ( "PatientName").toUtf8().data() ); - - //Study level - // overrideKeys.push_back ( QString ( "StudyDescription" ).toUtf8().data() ); - // overrideKeys.push_back ( QString ( "SeriesDescription" ).toUtf8().data() ); - - doQuery ( overrideKeys, QtDcmFindCallback::TEST ); -} - bool QtDcmFindScu::checkServerConnection ( int timeout ) { bool result = true; @@ -249,15 +234,19 @@ bool QtDcmFindScu::doQuery ( const OFList& overrideKeys, QtDcmFindCall } QtDcmFindCallback callback( level ); - if ( findscu.performQuery ( d->manager->currentPacs().address().toUtf8().data(), + OFCondition cond = findscu.performQuery ( d->manager->currentPacs().address().toUtf8().data(), d->manager->currentPacs().port().toInt(), QtDcmPreferences::instance()->aetitle().toUtf8().data(), d->manager->currentPacs().aetitle().toUtf8().data(), queryRetrieveInfoModel.toStdString().c_str() , EXS_Unknown, - DIMSE_BLOCKING, 0, ASC_DEFAULTMAXPDU, false, false, 1, false, -1, &keys, &callback, &fileNameList ).bad() ) { - QtDcmManager::instance()->displayErrorMessage ( tr ( "Cannot perform query C-FIND" ) ); + DIMSE_BLOCKING, 0, ASC_DEFAULTMAXPDU, false, false, 1, false, -1, &keys, &callback, &fileNameList ); + if (cond.bad()) + { + QString message = "Cannot perform query C-FIND : " + QString(cond.text()); + QtDcmManager::instance()->displayErrorMessage ( message ); } + if ( findscu.dropNetwork().bad() ) { QtDcmManager::instance()->displayErrorMessage ( tr ( "Cannot drop network" ) ); } diff --git a/src/QtDcmFindScu.h b/src/QtDcmFindScu.h index 048ab8d..98a6ab9 100644 --- a/src/QtDcmFindScu.h +++ b/src/QtDcmFindScu.h @@ -41,7 +41,6 @@ class QtDcmFindScu : public QObject void findImagesScu ( const QString & seriesUID ); void findImageScu ( const QString & imageUID); - void findStudiesFromPatient(const QString &patientID); protected: bool doQuery(const OFList& overrideKeys, QtDcmFindCallback::cbType level, QString queryRetrieveInfoModel = UID_FINDPatientRootQueryRetrieveInformationModel); From 685db1521f52b7ae7b31d52997f932d3c87aceeb Mon Sep 17 00:00:00 2001 From: CASTELNEAU Julien Date: Fri, 12 Mar 2021 10:57:21 +0100 Subject: [PATCH 18/21] [PR] Apply changes from Flo L. --- src/QtDcmImportWidget.cpp | 4 +--- src/QtDcmManager.cpp | 12 ++++++------ src/QtDcmManager.h | 4 ++-- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/QtDcmImportWidget.cpp b/src/QtDcmImportWidget.cpp index 38898fb..983236c 100644 --- a/src/QtDcmImportWidget.cpp +++ b/src/QtDcmImportWidget.cpp @@ -68,8 +68,6 @@ void QtDcmImportWidget::setImportButtonEnabled(bool enable) void QtDcmImportWidget::setFetchMode() { - // this->importButton->hide(); - // this->importProgressBar->hide(); this->fetchButton->show(); +} -} \ No newline at end of file diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index b9130bc..f670ac9 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -62,7 +62,6 @@ namespace { if (date == QDate()) { return "*"; } - return date.toString("yyyyMMdd"); } @@ -110,8 +109,8 @@ class QtDcmManagerPrivate bool useConverter; /** Use a converter ? */ - QHash> patientData; - QHash> seriesData; + QHash> patientData; /** key : patientID => values : [patientName, birthdate, gender and the list of attached studies]*/ + QHash> seriesData; /** key : seriesInstanceUID => values : [studyInstanceUID, seriesDescription, modality]*/ }; QtDcmManager * QtDcmManager::_instance = 0; @@ -330,6 +329,7 @@ void QtDcmManager::foundStudy ( const QMap &infosMap ) studyItem->setText ( 2, examDate.toString ( "dd/MM/yyyy" ) ); studyItem->setData ( 3, 0, infosMap["ID"] ); + // for each study found, we populate d->patientData (QHash) with infos related to study then append it to the list of studies attached to the patient QHash &patientEntry = d->patientData[infosMap["PatientID"]]; if (!patientEntry.isEmpty()) { @@ -509,13 +509,13 @@ void QtDcmManager::onMoveRequested(const QString &uid, const QString queryLevel) connect ( mover, &QtDcmMoveScu::updateProgress, this, &QtDcmManager::updateProgressLevel); connect( mover, &QtDcmMoveScu::serieMoved, [&](const QString &path){ - emit moveState(OK, path); + emit moveState(static_cast(eMoveStatus::OK), path); }); connect( mover, &QtDcmMoveScu::moveInProgress, [&](const QString &message){ - emit moveState(PENDING, message); + emit moveState(static_cast(eMoveStatus::PENDING), message); }); connect( mover, &QtDcmMoveScu::moveFailed, [&](const QString &reason){ - emit moveState(KO, reason); + emit moveState(static_cast(eMoveStatus::KO), reason); }); connect ( mover, &QtDcmMoveScu::finished, mover, &QtDcmMoveScu::deleteLater); diff --git a/src/QtDcmManager.h b/src/QtDcmManager.h index 277eb21..5c8092c 100644 --- a/src/QtDcmManager.h +++ b/src/QtDcmManager.h @@ -62,9 +62,9 @@ class QTDCM_EXPORT QtDcmManager : public QObject }; enum eMoveStatus { + KO = -1, OK = 0, - PENDING, - KO + PENDING = 1, }; static QtDcmManager* instance(); From 92c62074d7a88df95389b6df164677e32a571e71 Mon Sep 17 00:00:00 2001 From: Mathilde Merle Date: Mon, 3 Jul 2023 08:57:26 +0200 Subject: [PATCH 19/21] [DCMTK] adapt to DCMTK 3.6.7 --- src/QtDcmFindCallback.cpp | 2 +- src/QtDcmFindCallback.h | 5 ++++- src/QtDcmFindScu.cpp | 23 +++++++++++++++++------ src/QtDcmManager.cpp | 10 ---------- src/QtDcmMoveScu.cpp | 26 ++++++++++++++++++-------- 5 files changed, 40 insertions(+), 26 deletions(-) diff --git a/src/QtDcmFindCallback.cpp b/src/QtDcmFindCallback.cpp index 7572a63..fcc4281 100644 --- a/src/QtDcmFindCallback.cpp +++ b/src/QtDcmFindCallback.cpp @@ -54,7 +54,7 @@ QtDcmFindCallback::~QtDcmFindCallback() d = NULL; } -void QtDcmFindCallback::callback ( T_DIMSE_C_FindRQ *request, int responseCount, T_DIMSE_C_FindRSP *rsp, DcmDataset *responseIdentifiers ) +void QtDcmFindCallback::callback ( T_DIMSE_C_FindRQ *request, int &responseCount, T_DIMSE_C_FindRSP *rsp, DcmDataset *responseIdentifiers ) { Q_UNUSED(request) Q_UNUSED(responseCount) diff --git a/src/QtDcmFindCallback.h b/src/QtDcmFindCallback.h index 7753dae..ca6339e 100644 --- a/src/QtDcmFindCallback.h +++ b/src/QtDcmFindCallback.h @@ -46,7 +46,10 @@ class QtDcmFindCallback : public DcmFindSCUCallback IMAGE }; - virtual void callback ( T_DIMSE_C_FindRQ *request, int responseCount, T_DIMSE_C_FindRSP *rsp, DcmDataset *responseIdentifiers ); + virtual void callback(T_DIMSE_C_FindRQ *request, + int &responseCount, + T_DIMSE_C_FindRSP *rsp, + DcmDataset *responseIdentifiers); private: QtDcmFindCallbackPrivate * d; diff --git a/src/QtDcmFindScu.cpp b/src/QtDcmFindScu.cpp index 51ced43..d93ac7e 100644 --- a/src/QtDcmFindScu.cpp +++ b/src/QtDcmFindScu.cpp @@ -234,12 +234,23 @@ bool QtDcmFindScu::doQuery ( const OFList& overrideKeys, QtDcmFindCall } QtDcmFindCallback callback( level ); - OFCondition cond = findscu.performQuery ( d->manager->currentPacs().address().toUtf8().data(), - d->manager->currentPacs().port().toInt(), - QtDcmPreferences::instance()->aetitle().toUtf8().data(), - d->manager->currentPacs().aetitle().toUtf8().data(), - queryRetrieveInfoModel.toStdString().c_str() , EXS_Unknown, - DIMSE_BLOCKING, 0, ASC_DEFAULTMAXPDU, false, false, 1, false, -1, &keys, &callback, &fileNameList ); + OFCondition cond = findscu.performQuery(d->manager->currentPacs().address().toUtf8().data(), + d->manager->currentPacs().port().toInt(), + QtDcmPreferences::instance()->aetitle().toUtf8().data(), + d->manager->currentPacs().aetitle().toUtf8().data(), + queryRetrieveInfoModel.toStdString().c_str(), + EXS_Unknown, + DIMSE_BLOCKING, + 0, + ASC_DEFAULTMAXPDU, + false, + false, + 1, + DcmFindSCUExtractMode::FEM_none, + -1, + &keys, + &callback, + &fileNameList ); if (cond.bad()) { QString message = "Cannot perform query C-FIND : " + QString(cond.text()); diff --git a/src/QtDcmManager.cpp b/src/QtDcmManager.cpp index f670ac9..872b1b5 100644 --- a/src/QtDcmManager.cpp +++ b/src/QtDcmManager.cpp @@ -57,16 +57,6 @@ #include -namespace { - QString dateToString(const QDate & date) { - if (date == QDate()) { - return "*"; - } - return date.toString("yyyyMMdd"); - } - -} - class QtDcmManagerPrivate { diff --git a/src/QtDcmMoveScu.cpp b/src/QtDcmMoveScu.cpp index 7680bb0..d792caf 100644 --- a/src/QtDcmMoveScu.cpp +++ b/src/QtDcmMoveScu.cpp @@ -393,12 +393,12 @@ void QtDcmMoveScu::addOverrideKey ( const QString & key ) dicName = key.toLatin1().data(); // only dictionary name given (without value) } - // try to lookup in dictionary + // try to lookup in Global DICOM Data Dictionary (GlobalDcmDataDictionary) DcmTagKey key ( 0xffff, 0xffff ); const DcmDataDictionary& globalDataDict = dcmDataDict.rdlock(); const DcmDictEntry *dicent = globalDataDict.findEntry ( dicName.c_str() ); - dcmDataDict.unlock(); + dcmDataDict.rdunlock(); if ( dicent != NULL ) { // found dictionary name, copy group and element number @@ -786,7 +786,13 @@ void QtDcmMoveScu::storeSCPCallback ( void *callbackData, T_DIMSE_StoreProgress if ( ( rsp->DimseStatus == STATUS_Success ) && !self->d->ignore ) { /* which SOP class and SOP instance ? */ - if ( !DU_findSOPClassAndInstanceInDataSet ( *imageDataSet, sopClass, sopInstance, self->d->correctUIDPadding ) ) { + if ( !DU_findSOPClassAndInstanceInDataSet(*imageDataSet, + sopClass, + sizeof(sopClass), + sopInstance, + sizeof(sopInstance), + self->d->correctUIDPadding ) ) + { rsp->DimseStatus = STATUS_STORE_Error_CannotUnderstand; } else if ( strcmp ( sopClass, req->AffectedSOPClassUID ) != 0 ) { @@ -863,8 +869,6 @@ void QtDcmMoveScu::subOpCallback ( void * caller, T_ASC_Network *aNet, T_ASC_Ass if ( !caller ) return; - QtDcmMoveScu * self = reinterpret_cast(caller); - if ( aNet == NULL ) return; /* help no net ! */ if ( *subAssoc == NULL ) { @@ -957,10 +961,16 @@ OFCondition QtDcmMoveScu::moveSCU ( T_ASC_Association * assoc, const char *fname req.DataSetType = DIMSE_DATASET_PRESENT; - if ( d->moveDestination == NULL ) { + if ( d->moveDestination == nullptr ) + { /* set the destination to be me */ - ASC_getAPTitles ( assoc->params, req.MoveDestination, - NULL, NULL ); + ASC_getAPTitles(assoc->params, + req.MoveDestination, + sizeof(req.MoveDestination), + nullptr, + 0, + nullptr, + 0); } else { strcpy( req.MoveDestination, d->moveDestination ); From 9cd41d8c01304adccf7ccd532789b3d7284d781c Mon Sep 17 00:00:00 2001 From: Mathilde Merle Date: Tue, 11 Jul 2023 16:48:00 +0200 Subject: [PATCH 20/21] [QtDCM] dcmtk link 3.6.7 --- src/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 38cc15c..82952dd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -112,7 +112,6 @@ set(${PROJECT_NAME}_LIBRARIES Qt5::Core Qt5::Widgets Qt5::Network - ${DCMTK_LIBRARIES} ITKIOImageBase ITKCommon ITKIOBMP From 93a58b71de081a2dc75839ebd313782ee04b6818 Mon Sep 17 00:00:00 2001 From: Mathilde Merle Date: Wed, 12 Jul 2023 08:53:56 +0200 Subject: [PATCH 21/21] [DCMTK] include dir --- cmake/FindDCMTK.cmake | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmake/FindDCMTK.cmake b/cmake/FindDCMTK.cmake index a9434dc..9a14b06 100644 --- a/cmake/FindDCMTK.cmake +++ b/cmake/FindDCMTK.cmake @@ -168,11 +168,8 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(DCMTK DEFAULT_MSG DCMTK_config_INCLUDE_DIR - DCMTK_ofstd_INCLUDE_DIR DCMTK_ofstd_LIBRARY - DCMTK_dcmdata_INCLUDE_DIR DCMTK_dcmdata_LIBRARY - DCMTK_dcmimgle_INCLUDE_DIR DCMTK_dcmimgle_LIBRARY) # Compatibility: This variable is deprecated