Mercurial > hg > orthanc
comparison Core/DicomParsing/FromDcmtkBridge.cpp @ 2409:e4045b3c9772
ignore-length argument if retrieving DICOM tags
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 27 Sep 2017 17:36:13 +0200 |
parents | 7284093111b0 |
children | 14537babc1e6 |
comparison
equal
deleted
inserted
replaced
2408:26a0cc24d48d | 2409:e4045b3c9772 |
---|---|
393 void FromDcmtkBridge::ExtractDicomSummary(DicomMap& target, | 393 void FromDcmtkBridge::ExtractDicomSummary(DicomMap& target, |
394 DcmItem& dataset, | 394 DcmItem& dataset, |
395 unsigned int maxStringLength, | 395 unsigned int maxStringLength, |
396 Encoding defaultEncoding) | 396 Encoding defaultEncoding) |
397 { | 397 { |
398 std::set<DicomTag> ignoreTagLength; | |
399 | |
398 Encoding encoding = DetectEncoding(dataset, defaultEncoding); | 400 Encoding encoding = DetectEncoding(dataset, defaultEncoding); |
399 | 401 |
400 target.Clear(); | 402 target.Clear(); |
401 for (unsigned long i = 0; i < dataset.card(); i++) | 403 for (unsigned long i = 0; i < dataset.card(); i++) |
402 { | 404 { |
403 DcmElement* element = dataset.getElement(i); | 405 DcmElement* element = dataset.getElement(i); |
404 if (element && element->isLeaf()) | 406 if (element && element->isLeaf()) |
405 { | 407 { |
406 target.SetValue(element->getTag().getGTag(), | 408 target.SetValue(element->getTag().getGTag(), |
407 element->getTag().getETag(), | 409 element->getTag().getETag(), |
408 ConvertLeafElement(*element, DicomToJsonFlags_Default, maxStringLength, encoding)); | 410 ConvertLeafElement(*element, DicomToJsonFlags_Default, |
411 maxStringLength, encoding, ignoreTagLength)); | |
409 } | 412 } |
410 } | 413 } |
411 } | 414 } |
412 | 415 |
413 | 416 |
424 | 427 |
425 | 428 |
426 DicomValue* FromDcmtkBridge::ConvertLeafElement(DcmElement& element, | 429 DicomValue* FromDcmtkBridge::ConvertLeafElement(DcmElement& element, |
427 DicomToJsonFlags flags, | 430 DicomToJsonFlags flags, |
428 unsigned int maxStringLength, | 431 unsigned int maxStringLength, |
429 Encoding encoding) | 432 Encoding encoding, |
433 const std::set<DicomTag>& ignoreTagLength) | |
430 { | 434 { |
431 if (!element.isLeaf()) | 435 if (!element.isLeaf()) |
432 { | 436 { |
433 // This function is only applicable to leaf elements | 437 // This function is only applicable to leaf elements |
434 throw OrthancException(ErrorCode_BadParameterType); | 438 throw OrthancException(ErrorCode_BadParameterType); |
446 { | 450 { |
447 std::string s(c); | 451 std::string s(c); |
448 std::string utf8 = Toolbox::ConvertToUtf8(s, encoding); | 452 std::string utf8 = Toolbox::ConvertToUtf8(s, encoding); |
449 | 453 |
450 if (maxStringLength != 0 && | 454 if (maxStringLength != 0 && |
451 utf8.size() > maxStringLength) | 455 utf8.size() > maxStringLength && |
456 ignoreTagLength.find(GetTag(element)) == ignoreTagLength.end()) | |
452 { | 457 { |
453 return new DicomValue; // Too long, create a NULL value | 458 return new DicomValue; // Too long, create a NULL value |
454 } | 459 } |
455 else | 460 else |
456 { | 461 { |
484 if (data == NULL) | 489 if (data == NULL) |
485 { | 490 { |
486 return new DicomValue("", false); // Empty string | 491 return new DicomValue("", false); // Empty string |
487 } | 492 } |
488 else if (maxStringLength != 0 && | 493 else if (maxStringLength != 0 && |
489 element.getLength() > maxStringLength) | 494 element.getLength() > maxStringLength && |
495 ignoreTagLength.find(GetTag(element)) == ignoreTagLength.end()) | |
490 { | 496 { |
491 return new DicomValue; // Too long, create a NULL value | 497 return new DicomValue; // Too long, create a NULL value |
492 } | 498 } |
493 else | 499 else |
494 { | 500 { |
497 } | 503 } |
498 } | 504 } |
499 } | 505 } |
500 } | 506 } |
501 | 507 |
502 | 508 |
503 try | 509 try |
504 { | 510 { |
505 // http://support.dcmtk.org/docs/dcvr_8h-source.html | 511 // http://support.dcmtk.org/docs/dcvr_8h-source.html |
506 switch (element.getVR()) | 512 switch (element.getVR()) |
507 { | 513 { |
812 void FromDcmtkBridge::ElementToJson(Json::Value& parent, | 818 void FromDcmtkBridge::ElementToJson(Json::Value& parent, |
813 DcmElement& element, | 819 DcmElement& element, |
814 DicomToJsonFormat format, | 820 DicomToJsonFormat format, |
815 DicomToJsonFlags flags, | 821 DicomToJsonFlags flags, |
816 unsigned int maxStringLength, | 822 unsigned int maxStringLength, |
817 Encoding encoding) | 823 Encoding encoding, |
824 const std::set<DicomTag>& ignoreTagLength) | |
818 { | 825 { |
819 if (parent.type() == Json::nullValue) | 826 if (parent.type() == Json::nullValue) |
820 { | 827 { |
821 parent = Json::objectValue; | 828 parent = Json::objectValue; |
822 } | 829 } |
825 Json::Value& target = PrepareNode(parent, element, format); | 832 Json::Value& target = PrepareNode(parent, element, format); |
826 | 833 |
827 if (element.isLeaf()) | 834 if (element.isLeaf()) |
828 { | 835 { |
829 // The "0" below lets "LeafValueToJson()" take care of "TooLong" values | 836 // The "0" below lets "LeafValueToJson()" take care of "TooLong" values |
830 std::auto_ptr<DicomValue> v(FromDcmtkBridge::ConvertLeafElement(element, flags, 0, encoding)); | 837 std::auto_ptr<DicomValue> v(FromDcmtkBridge::ConvertLeafElement |
831 LeafValueToJson(target, *v, format, flags, maxStringLength); | 838 (element, flags, 0, encoding, ignoreTagLength)); |
839 | |
840 if (ignoreTagLength.find(GetTag(element)) == ignoreTagLength.end()) | |
841 { | |
842 LeafValueToJson(target, *v, format, flags, maxStringLength); | |
843 } | |
844 else | |
845 { | |
846 LeafValueToJson(target, *v, format, flags, 0); | |
847 } | |
832 } | 848 } |
833 else | 849 else |
834 { | 850 { |
835 assert(target.type() == Json::nullValue); | 851 assert(target.type() == Json::nullValue); |
836 target = Json::arrayValue; | 852 target = Json::arrayValue; |
842 | 858 |
843 for (unsigned long i = 0; i < sequence.card(); i++) | 859 for (unsigned long i = 0; i < sequence.card(); i++) |
844 { | 860 { |
845 DcmItem* child = sequence.getItem(i); | 861 DcmItem* child = sequence.getItem(i); |
846 Json::Value& v = target.append(Json::objectValue); | 862 Json::Value& v = target.append(Json::objectValue); |
847 DatasetToJson(v, *child, format, flags, maxStringLength, encoding); | 863 DatasetToJson(v, *child, format, flags, maxStringLength, encoding, ignoreTagLength); |
848 } | 864 } |
849 } | 865 } |
850 } | 866 } |
851 | 867 |
852 | 868 |
853 void FromDcmtkBridge::DatasetToJson(Json::Value& parent, | 869 void FromDcmtkBridge::DatasetToJson(Json::Value& parent, |
854 DcmItem& item, | 870 DcmItem& item, |
855 DicomToJsonFormat format, | 871 DicomToJsonFormat format, |
856 DicomToJsonFlags flags, | 872 DicomToJsonFlags flags, |
857 unsigned int maxStringLength, | 873 unsigned int maxStringLength, |
858 Encoding encoding) | 874 Encoding encoding, |
875 const std::set<DicomTag>& ignoreTagLength) | |
859 { | 876 { |
860 assert(parent.type() == Json::objectValue); | 877 assert(parent.type() == Json::objectValue); |
861 | 878 |
862 for (unsigned long i = 0; i < item.card(); i++) | 879 for (unsigned long i = 0; i < item.card(); i++) |
863 { | 880 { |
898 { | 915 { |
899 continue; | 916 continue; |
900 } | 917 } |
901 } | 918 } |
902 | 919 |
903 FromDcmtkBridge::ElementToJson(parent, *element, format, flags, maxStringLength, encoding); | 920 FromDcmtkBridge::ElementToJson(parent, *element, format, flags, |
921 maxStringLength, encoding, ignoreTagLength); | |
904 } | 922 } |
905 } | 923 } |
906 | 924 |
907 | 925 |
908 void FromDcmtkBridge::ExtractDicomAsJson(Json::Value& target, | 926 void FromDcmtkBridge::ExtractDicomAsJson(Json::Value& target, |
909 DcmDataset& dataset, | 927 DcmDataset& dataset, |
910 DicomToJsonFormat format, | 928 DicomToJsonFormat format, |
911 DicomToJsonFlags flags, | 929 DicomToJsonFlags flags, |
912 unsigned int maxStringLength, | 930 unsigned int maxStringLength, |
913 Encoding defaultEncoding) | 931 Encoding defaultEncoding, |
932 const std::set<DicomTag>& ignoreTagLength) | |
914 { | 933 { |
915 Encoding encoding = DetectEncoding(dataset, defaultEncoding); | 934 Encoding encoding = DetectEncoding(dataset, defaultEncoding); |
916 | 935 |
917 target = Json::objectValue; | 936 target = Json::objectValue; |
918 DatasetToJson(target, dataset, format, flags, maxStringLength, encoding); | 937 DatasetToJson(target, dataset, format, flags, maxStringLength, encoding, ignoreTagLength); |
919 } | 938 } |
920 | 939 |
921 | 940 |
922 void FromDcmtkBridge::ExtractHeaderAsJson(Json::Value& target, | 941 void FromDcmtkBridge::ExtractHeaderAsJson(Json::Value& target, |
923 DcmMetaInfo& dataset, | 942 DcmMetaInfo& dataset, |
924 DicomToJsonFormat format, | 943 DicomToJsonFormat format, |
925 DicomToJsonFlags flags, | 944 DicomToJsonFlags flags, |
926 unsigned int maxStringLength) | 945 unsigned int maxStringLength) |
927 { | 946 { |
947 std::set<DicomTag> ignoreTagLength; | |
928 target = Json::objectValue; | 948 target = Json::objectValue; |
929 DatasetToJson(target, dataset, format, flags, maxStringLength, Encoding_Ascii); | 949 DatasetToJson(target, dataset, format, flags, maxStringLength, Encoding_Ascii, ignoreTagLength); |
930 } | 950 } |
931 | 951 |
932 | 952 |
933 | 953 |
934 static std::string GetTagNameInternal(DcmTag& tag) | 954 static std::string GetTagNameInternal(DcmTag& tag) |
2034 GetDefaultDicomEncoding()); | 2054 GetDefaultDicomEncoding()); |
2035 } | 2055 } |
2036 | 2056 |
2037 | 2057 |
2038 void FromDcmtkBridge::ExtractDicomAsJson(Json::Value& target, | 2058 void FromDcmtkBridge::ExtractDicomAsJson(Json::Value& target, |
2039 DcmDataset& dataset) | 2059 DcmDataset& dataset, |
2060 const std::set<DicomTag>& ignoreTagLength) | |
2040 { | 2061 { |
2041 ExtractDicomAsJson(target, dataset, | 2062 ExtractDicomAsJson(target, dataset, |
2042 DicomToJsonFormat_Full, | 2063 DicomToJsonFormat_Full, |
2043 DicomToJsonFlags_Default, | 2064 DicomToJsonFlags_Default, |
2044 ORTHANC_MAXIMUM_TAG_LENGTH, | 2065 ORTHANC_MAXIMUM_TAG_LENGTH, |
2045 GetDefaultDicomEncoding()); | 2066 GetDefaultDicomEncoding(), |
2067 ignoreTagLength); | |
2046 } | 2068 } |
2047 | 2069 |
2048 | 2070 |
2049 void FromDcmtkBridge::InitializeCodecs() | 2071 void FromDcmtkBridge::InitializeCodecs() |
2050 { | 2072 { |