Mercurial > hg > orthanc
diff OrthancServer/DicomProtocol/DicomUserConnection.cpp @ 1371:f528849ee9f7 query-retrieve
DICOM Query/Retrieve available from Orthanc Explorer
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 27 May 2015 17:33:13 +0200 |
parents | b22ba8c5edbe |
children | d710ea64f0fd |
line wrap: on
line diff
--- a/OrthancServer/DicomProtocol/DicomUserConnection.cpp Wed May 27 12:32:43 2015 +0200 +++ b/OrthancServer/DicomProtocol/DicomUserConnection.cpp Wed May 27 17:33:13 2015 +0200 @@ -399,6 +399,13 @@ throw OrthancException(ErrorCode_InternalError); } + if (level == ResourceType_Study) + { + allowedTags.insert(DICOM_TAG_MODALITIES_IN_STUDY); + } + + allowedTags.insert(DICOM_TAG_SPECIFIC_CHARACTER_SET); + DicomArray query(fields); for (size_t i = 0; i < query.GetSize(); i++) { @@ -533,6 +540,7 @@ void DicomUserConnection::MoveInternal(const std::string& targetAet, + ResourceType level, const DicomMap& fields) { CheckIsOpen(); @@ -540,6 +548,39 @@ const char* sopClass = UID_MOVEStudyRootQueryRetrieveInformationModel; std::auto_ptr<DcmDataset> dataset(ToDcmtkBridge::Convert(fields)); + switch (level) + { + case ResourceType_Patient: + DU_putStringDOElement(dataset.get(), DcmTagKey(0x0008, 0x0052), "PATIENT"); + break; + + case ResourceType_Study: + DU_putStringDOElement(dataset.get(), DcmTagKey(0x0008, 0x0052), "STUDY"); + break; + + case ResourceType_Series: + DU_putStringDOElement(dataset.get(), DcmTagKey(0x0008, 0x0052), "SERIES"); + break; + + case ResourceType_Instance: + if (manufacturer_ == ModalityManufacturer_ClearCanvas || + manufacturer_ == ModalityManufacturer_Dcm4Chee) + { + // This is a particular case for ClearCanvas, thanks to Peter Somlo <peter.somlo@gmail.com>. + // https://groups.google.com/d/msg/orthanc-users/j-6C3MAVwiw/iolB9hclom8J + // http://www.clearcanvas.ca/Home/Community/OldForums/tabid/526/aff/11/aft/14670/afv/topic/Default.aspx + DU_putStringDOElement(dataset.get(), DcmTagKey(0x0008, 0x0052), "IMAGE"); + } + else + { + DU_putStringDOElement(dataset.get(), DcmTagKey(0x0008, 0x0052), "INSTANCE"); + } + break; + + default: + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + // Figure out which of the accepted presentation contexts should be used int presID = ASC_findAcceptedPresentationContextID(pimpl_->assoc_, sopClass); if (presID == 0) @@ -880,7 +921,7 @@ throw OrthancException(ErrorCode_InternalError); } - MoveInternal(targetAet, move); + MoveInternal(targetAet, level, move); } @@ -889,7 +930,7 @@ { DicomMap query; query.SetValue(DICOM_TAG_PATIENT_ID, patientId); - MoveInternal(targetAet, query); + MoveInternal(targetAet, ResourceType_Patient, query); } void DicomUserConnection::MoveStudy(const std::string& targetAet, @@ -897,7 +938,7 @@ { DicomMap query; query.SetValue(DICOM_TAG_STUDY_INSTANCE_UID, studyUid); - MoveInternal(targetAet, query); + MoveInternal(targetAet, ResourceType_Study, query); } void DicomUserConnection::MoveSeries(const std::string& targetAet, @@ -907,7 +948,7 @@ DicomMap query; query.SetValue(DICOM_TAG_STUDY_INSTANCE_UID, studyUid); query.SetValue(DICOM_TAG_SERIES_INSTANCE_UID, seriesUid); - MoveInternal(targetAet, query); + MoveInternal(targetAet, ResourceType_Series, query); } void DicomUserConnection::MoveInstance(const std::string& targetAet, @@ -919,7 +960,7 @@ query.SetValue(DICOM_TAG_STUDY_INSTANCE_UID, studyUid); query.SetValue(DICOM_TAG_SERIES_INSTANCE_UID, seriesUid); query.SetValue(DICOM_TAG_SOP_INSTANCE_UID, instanceUid); - MoveInternal(targetAet, query); + MoveInternal(targetAet, ResourceType_Instance, query); }