Skip to content

Commit

Permalink
Merge pull request #7 from juliencastelneau/FetchData
Browse files Browse the repository at this point in the history
APHP devs
  • Loading branch information
juliencastelneau authored Mar 12, 2021
2 parents b69492c + 685db15 commit 8c23dc3
Show file tree
Hide file tree
Showing 11 changed files with 265 additions and 29 deletions.
23 changes: 15 additions & 8 deletions src/QtDcm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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");
}
Expand All @@ -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 )
Expand Down Expand Up @@ -408,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 ( "" );
}
Expand All @@ -422,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 ( "" );
}
Expand All @@ -442,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 ( "" );
}
Expand Down
6 changes: 3 additions & 3 deletions src/QtDcm.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
5 changes: 5 additions & 0 deletions src/QtDcmFindCallback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 );

Expand All @@ -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;

Expand Down
10 changes: 7 additions & 3 deletions src/QtDcmFindScu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,15 +234,19 @@ bool QtDcmFindScu::doQuery ( const OFList<OFString>& 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" ) );
}
Expand Down
12 changes: 12 additions & 0 deletions src/QtDcmImportWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ QtDcmImportWidget::QtDcmImportWidget(QWidget* parent) : QWidget(parent)
{
this->setupUi(this);
this->progressLabel->hide();
this->fetchButton->hide();
}

QtDcmImportWidget::~QtDcmImportWidget()
Expand All @@ -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);
Expand All @@ -59,3 +65,9 @@ void QtDcmImportWidget::setImportButtonEnabled(bool enable)
{
this->importButton->setEnabled(enable);
}

void QtDcmImportWidget::setFetchMode()
{
this->fetchButton->show();
}

4 changes: 3 additions & 1 deletion src/QtDcmImportWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 );

Expand Down
165 changes: 163 additions & 2 deletions src/QtDcmManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ namespace {
if (date == QDate()) {
return "*";
}

return date.toString("yyyyMMdd");
}

Expand Down Expand Up @@ -109,6 +108,9 @@ class QtDcmManagerPrivate
QPointer<QtDcmSerieInfoWidget> serieInfoWidget; /** The pointer to the serie info widget */

bool useConverter; /** Use a converter ? */

QHash<QString, QHash<QString, QVariant>> patientData; /** key : patientID => values : [patientName, birthdate, gender and the list of attached studies]*/
QHash<QString, QHash<QString, QVariant>> seriesData; /** key : seriesInstanceUID => values : [studyInstanceUID, seriesDescription, modality]*/
};

QtDcmManager * QtDcmManager::_instance = 0;
Expand Down Expand Up @@ -202,6 +204,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 )
Expand Down Expand Up @@ -323,7 +327,20 @@ void QtDcmManager::foundStudy ( const QMap<QString, QString> &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"] );

// 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<QString, QVariant> &patientEntry = d->patientData[infosMap["PatientID"]];
if (!patientEntry.isEmpty())
{
QHash<QString, QVariant> studies = patientEntry["studies"].toHash();
if (!studies.contains(infosMap["UID"]))
{
studies.insert(infosMap["UID"], infosMap["Description"]);
findSeriesScu(infosMap["UID"]);
}
patientEntry["studies"] = studies;
}
}
}

Expand All @@ -339,6 +356,15 @@ void QtDcmManager::foundSerie ( const QMap<QString, QString> &infosMap )
serieItem->setData ( 4, 0, QVariant ( infosMap["InstanceCount"] ) );
serieItem->setData ( 5, 0, QVariant ( infosMap["Institution"] ) );
serieItem->setData ( 6, 0, QVariant ( infosMap["Operator"] ) );

QHash<QString, QVariant> &seriesEntry = d->seriesData[infosMap["ID"]];
if (seriesEntry.isEmpty())
{
seriesEntry["StudyInstanceUID"] = infosMap["StudyInstanceUID"];
seriesEntry["SeriesDescription"] = infosMap["Description"];
seriesEntry["Modality"] = infosMap["Modality"];
}

}
}

Expand Down Expand Up @@ -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(static_cast<int>(eMoveStatus::OK), path);
});
connect( mover, &QtDcmMoveScu::moveInProgress, [&](const QString &message){
emit moveState(static_cast<int>(eMoveStatus::PENDING), message);
});
connect( mover, &QtDcmMoveScu::moveFailed, [&](const QString &reason){
emit moveState(static_cast<int>(eMoveStatus::KO), reason);
});
connect ( mover, &QtDcmMoveScu::finished,
mover, &QtDcmMoveScu::deleteLater);
mover->start();

}

void QtDcmManager::getPreviewFromSelectedSerie ( const QString &uid, int elementIndex )
{
if ( !d->tempDir.exists() ) {
Expand Down Expand Up @@ -581,6 +643,105 @@ void QtDcmManager::importSelectedSeries()
}
}

void QtDcmManager::fetchSelectedData()
{
QHash<QString, QHash<QString, QVariant>> ptData;
QHash<QString, QHash<QString, QVariant>> 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<QString> studyUIDs = seData.keys();
for (QHash<QString, QVariant> &seEntry : seData)
{
studyUIDs.append(seEntry["StudyInstanceUID"].toString());
}
ptData = getPatientsToFetch(studyUIDs);
}

emit(fetchFinished(ptData, seData));
}

QHash<QString, QHash<QString, QVariant>> QtDcmManager::getPatientsToFetch(QList<QString> studyUIDs)
{
QHash<QString, QHash<QString, QVariant>> ptData;
QHash<QString, QVariant> tmpStudies;
QHash<QString, QVariant> ptEntry;
for (QHash<QString, QVariant> &patientEntry : d->patientData)
{
tmpStudies.clear();
ptEntry.clear();
QString pKey = d->patientData.key(patientEntry);
QHash<QString, QVariant> studies = patientEntry["studies"].toHash();
QList<QString> 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<QString, QHash<QString, QVariant>> QtDcmManager::getSeriesToFetch(QList<QString> seriesUIDs)
{
QHash<QString, QHash<QString, QVariant>> seData;
QList<QString> 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<QString, QVariant> &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 ) {
Expand Down
Loading

0 comments on commit 8c23dc3

Please sign in to comment.