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 {