comparison Core/DicomNetworking/DicomUserConnection.cpp @ 2888:61a5667f37d9

New modality manufacturer: "GE" for GE Healthcare EA and AW
author Sebastien Jodogne <s.jodogne@gmail.com>
date Sat, 13 Oct 2018 12:17:16 +0200
parents 73bc0c32547c
children d924f9bb61cc
comparison
equal deleted inserted replaced
2878:320a877a1f40 2888:61a5667f37d9
623 break; 623 break;
624 624
625 case ResourceType_Instance: 625 case ResourceType_Instance:
626 clevel = "INSTANCE"; 626 clevel = "INSTANCE";
627 if (manufacturer_ == ModalityManufacturer_ClearCanvas || 627 if (manufacturer_ == ModalityManufacturer_ClearCanvas ||
628 manufacturer_ == ModalityManufacturer_Dcm4Chee) 628 manufacturer_ == ModalityManufacturer_Dcm4Chee ||
629 manufacturer_ == ModalityManufacturer_GE)
630 {
631 // This is a particular case for ClearCanvas, thanks to Peter Somlo <peter.somlo@gmail.com>.
632 // https://groups.google.com/d/msg/orthanc-users/j-6C3MAVwiw/iolB9hclom8J
633 // http://www.clearcanvas.ca/Home/Community/OldForums/tabid/526/aff/11/aft/14670/afv/topic/Default.aspx
634 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "IMAGE");
635 clevel = "IMAGE";
636 }
637 else
638 {
639 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "INSTANCE");
640 }
641
642 sopClass = UID_FINDStudyRootQueryRetrieveInformationModel;
643 break;
644
645 default:
646 throw OrthancException(ErrorCode_ParameterOutOfRange);
647 }
648
649
650 const char* universal;
651 if (manufacturer_ == ModalityManufacturer_GE)
652 {
653 universal = "*";
654 }
655 else
656 {
657 universal = "";
658 }
659
660
661 // Add the expected tags for this query level.
662 // WARNING: Do not reorder or add "break" in this switch-case!
663 switch (level)
664 {
665 case ResourceType_Instance:
666 // SOP Instance UID
667 if (!fields.HasTag(0x0008, 0x0018))
668 {
669 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0018), universal);
670 }
671
672 case ResourceType_Series:
673 // Series instance UID
674 if (!fields.HasTag(0x0020, 0x000e))
675 {
676 DU_putStringDOElement(dataset, DcmTagKey(0x0020, 0x000e), universal);
677 }
678
679 case ResourceType_Study:
680 // Accession number
681 if (!fields.HasTag(0x0008, 0x0050))
682 {
683 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0050), universal);
684 }
685
686 // Study instance UID
687 if (!fields.HasTag(0x0020, 0x000d))
688 {
689 DU_putStringDOElement(dataset, DcmTagKey(0x0020, 0x000d), universal);
690 }
691
692 case ResourceType_Patient:
693 // Patient ID
694 if (!fields.HasTag(0x0010, 0x0020))
695 {
696 DU_putStringDOElement(dataset, DcmTagKey(0x0010, 0x0020), universal);
697 }
698
699 break;
700
701 default:
702 throw OrthancException(ErrorCode_ParameterOutOfRange);
703 }
704
705 assert(clevel != NULL && sopClass != NULL);
706 ExecuteFind(result, pimpl_->assoc_, dataset, sopClass, false, clevel, pimpl_->dimseTimeout_);
707 }
708
709
710 void DicomUserConnection::MoveInternal(const std::string& targetAet,
711 ResourceType level,
712 const DicomMap& fields)
713 {
714 CheckIsOpen();
715
716 std::auto_ptr<ParsedDicomFile> query(ConvertQueryFields(fields, manufacturer_));
717 DcmDataset* dataset = query->GetDcmtkObject().getDataset();
718
719 const char* sopClass = UID_MOVEStudyRootQueryRetrieveInformationModel;
720 switch (level)
721 {
722 case ResourceType_Patient:
723 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "PATIENT");
724 break;
725
726 case ResourceType_Study:
727 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "STUDY");
728 break;
729
730 case ResourceType_Series:
731 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "SERIES");
732 break;
733
734 case ResourceType_Instance:
735 if (manufacturer_ == ModalityManufacturer_ClearCanvas ||
736 manufacturer_ == ModalityManufacturer_Dcm4Chee ||
737 manufacturer_ == ModalityManufacturer_GE)
629 { 738 {
630 // This is a particular case for ClearCanvas, thanks to Peter Somlo <peter.somlo@gmail.com>. 739 // This is a particular case for ClearCanvas, thanks to Peter Somlo <peter.somlo@gmail.com>.
631 // https://groups.google.com/d/msg/orthanc-users/j-6C3MAVwiw/iolB9hclom8J 740 // https://groups.google.com/d/msg/orthanc-users/j-6C3MAVwiw/iolB9hclom8J
632 // http://www.clearcanvas.ca/Home/Community/OldForums/tabid/526/aff/11/aft/14670/afv/topic/Default.aspx 741 // http://www.clearcanvas.ca/Home/Community/OldForums/tabid/526/aff/11/aft/14670/afv/topic/Default.aspx
633 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "IMAGE"); 742 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "IMAGE");
634 } 743 }
635 else 744 else
636 { 745 {
637 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "INSTANCE"); 746 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "INSTANCE");
638 } 747 }
639
640 sopClass = UID_FINDStudyRootQueryRetrieveInformationModel;
641 break;
642
643 default:
644 throw OrthancException(ErrorCode_ParameterOutOfRange);
645 }
646
647 // Add the expected tags for this query level.
648 // WARNING: Do not reorder or add "break" in this switch-case!
649 switch (level)
650 {
651 case ResourceType_Instance:
652 // SOP Instance UID
653 if (!fields.HasTag(0x0008, 0x0018))
654 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0018), "");
655
656 case ResourceType_Series:
657 // Series instance UID
658 if (!fields.HasTag(0x0020, 0x000e))
659 DU_putStringDOElement(dataset, DcmTagKey(0x0020, 0x000e), "");
660
661 case ResourceType_Study:
662 // Accession number
663 if (!fields.HasTag(0x0008, 0x0050))
664 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0050), "");
665
666 // Study instance UID
667 if (!fields.HasTag(0x0020, 0x000d))
668 DU_putStringDOElement(dataset, DcmTagKey(0x0020, 0x000d), "");
669
670 case ResourceType_Patient:
671 // Patient ID
672 if (!fields.HasTag(0x0010, 0x0020))
673 DU_putStringDOElement(dataset, DcmTagKey(0x0010, 0x0020), "");
674
675 break;
676
677 default:
678 throw OrthancException(ErrorCode_ParameterOutOfRange);
679 }
680
681 assert(clevel != NULL && sopClass != NULL);
682 ExecuteFind(result, pimpl_->assoc_, dataset, sopClass, false, clevel, pimpl_->dimseTimeout_);
683 }
684
685
686 void DicomUserConnection::MoveInternal(const std::string& targetAet,
687 ResourceType level,
688 const DicomMap& fields)
689 {
690 CheckIsOpen();
691
692 std::auto_ptr<ParsedDicomFile> query(ConvertQueryFields(fields, manufacturer_));
693 DcmDataset* dataset = query->GetDcmtkObject().getDataset();
694
695 const char* sopClass = UID_MOVEStudyRootQueryRetrieveInformationModel;
696 switch (level)
697 {
698 case ResourceType_Patient:
699 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "PATIENT");
700 break;
701
702 case ResourceType_Study:
703 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "STUDY");
704 break;
705
706 case ResourceType_Series:
707 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "SERIES");
708 break;
709
710 case ResourceType_Instance:
711 if (manufacturer_ == ModalityManufacturer_ClearCanvas ||
712 manufacturer_ == ModalityManufacturer_Dcm4Chee)
713 {
714 // This is a particular case for ClearCanvas, thanks to Peter Somlo <peter.somlo@gmail.com>.
715 // https://groups.google.com/d/msg/orthanc-users/j-6C3MAVwiw/iolB9hclom8J
716 // http://www.clearcanvas.ca/Home/Community/OldForums/tabid/526/aff/11/aft/14670/afv/topic/Default.aspx
717 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "IMAGE");
718 }
719 else
720 {
721 DU_putStringDOElement(dataset, DcmTagKey(0x0008, 0x0052), "INSTANCE");
722 }
723 break; 748 break;
724 749
725 default: 750 default:
726 throw OrthancException(ErrorCode_ParameterOutOfRange); 751 throw OrthancException(ErrorCode_ParameterOutOfRange);
727 } 752 }