# HG changeset patch # User Sebastien Jodogne # Date 1512537559 -3600 # Node ID fa93e7147ebf3b505b80c5da818127e002988f48 # Parent 2ddecfba10c00162924e4ede277f19ed0792323e Fix generation of numeric tags part of sequences for ".../metadata" routes diff -r 2ddecfba10c0 -r fa93e7147ebf NEWS --- a/NEWS Tue Dec 05 13:32:56 2017 +0100 +++ b/NEWS Wed Dec 06 06:19:19 2017 +0100 @@ -1,8 +1,10 @@ Pending changes in the mainline =============================== +* Added "?expand" argument to "/servers" route +* Fix generation of numeric tags part of sequences for ".../metadata" routes * Support for OpenBSD -* added ?expand argument to /servers route + Version 0.4 (2017-07-19) ======================== diff -r 2ddecfba10c0 -r fa93e7147ebf Plugin/Dicom.cpp --- a/Plugin/Dicom.cpp Tue Dec 05 13:32:56 2017 +0100 +++ b/Plugin/Dicom.cpp Wed Dec 06 06:19:19 2017 +0100 @@ -117,9 +117,35 @@ } + template + static void ConvertNumberTag(std::string& target, + const gdcm::DataElement& source) + { + if (source.IsEmpty()) + { + target.clear(); + } + else + { + typename gdcm::Element element; + + element.Set(source.GetValue()); + + for (unsigned int i = 0; i < element.GetLength(); i++) + { + if (i != 0) + { + target += "\\"; + } + + target = boost::lexical_cast(element.GetValue()); + } + } + } + + static bool ConvertDicomStringToUtf8(std::string& result, const gdcm::Dict& dictionary, - const gdcm::File* file, const gdcm::DataElement& element, const Orthanc::Encoding sourceEncoding) { @@ -129,22 +155,39 @@ return false; } - if (file != NULL) + bool isSequence; + std::string vr = GetVRName(isSequence, dictionary, element); + + if (!isSequence) { - bool isSequence; - std::string vr = GetVRName(isSequence, dictionary, element); - if (!isSequence && ( - vr == "FL" || - vr == "FD" || - vr == "SL" || - vr == "SS" || - vr == "UL" || - vr == "US" - )) - { - gdcm::StringFilter f; - f.SetFile(*file); - result = f.ToString(element.GetTag()); + if (vr == "FL") + { + ConvertNumberTag(result, element); + return true; + } + else if (vr == "FD") + { + ConvertNumberTag(result, element); + return true; + } + else if (vr == "SL") + { + ConvertNumberTag(result, element); + return true; + } + else if (vr == "SS") + { + ConvertNumberTag(result, element); + return true; + } + else if (vr == "UL") + { + ConvertNumberTag(result, element); + return true; + } + else if (vr == "US") + { + ConvertNumberTag(result, element); return true; } } @@ -259,7 +302,7 @@ const gdcm::DataElement& element = GetDataSet().GetDataElement(tag); - if (!ConvertDicomStringToUtf8(result, dictionary, &GetFile(), element, GetEncoding())) + if (!ConvertDicomStringToUtf8(result, dictionary, element, GetEncoding())) { return false; } @@ -408,7 +451,6 @@ static void DicomToXmlInternal(pugi::xml_node& target, const gdcm::Dict& dictionary, - const gdcm::File* file, const gdcm::DataSet& dicom, const Orthanc::Encoding sourceEncoding, const std::string& bulkUri) @@ -459,7 +501,7 @@ childUri = bulkUri + std::string(path) + "/" + number + "/"; } - DicomToXmlInternal(item, dictionary, file, seq->GetItem(i).GetNestedDataSet(), sourceEncoding, childUri); + DicomToXmlInternal(item, dictionary, seq->GetItem(i).GetNestedDataSet(), sourceEncoding, childUri); } } } @@ -480,7 +522,7 @@ value.append_attribute("number").set_value("1"); std::string tmp; - if (ConvertDicomStringToUtf8(tmp, dictionary, file, *it, sourceEncoding)) + if (ConvertDicomStringToUtf8(tmp, dictionary, *it, sourceEncoding)) { value.append_child(pugi::node_pcdata).set_value(tmp.c_str()); } @@ -495,7 +537,6 @@ static void DicomToXml(pugi::xml_document& target, const gdcm::Dict& dictionary, - const gdcm::File* file, const gdcm::DataSet& dicom, const std::string& bulkUriRoot) { @@ -505,7 +546,7 @@ root.append_attribute("xmlns:xsi").set_value("http://www.w3.org/2001/XMLSchema-instance"); Orthanc::Encoding encoding = DetectEncoding(dicom); - DicomToXmlInternal(root, dictionary, file, dicom, encoding, bulkUriRoot); + DicomToXmlInternal(root, dictionary, dicom, encoding, bulkUriRoot); pugi::xml_node decl = target.prepend_child(pugi::node_declaration); decl.append_attribute("version").set_value("1.0"); @@ -515,7 +556,6 @@ static void DicomToJsonInternal(Json::Value& target, const gdcm::Dict& dictionary, - const gdcm::File* file, const gdcm::DataSet& dicom, const std::string& bulkUri, Orthanc::Encoding sourceEncoding) @@ -564,7 +604,7 @@ childUri = bulkUri + std::string(path) + "/" + number + "/"; } - DicomToJsonInternal(child, dictionary, file, seq->GetItem(i).GetNestedDataSet(), childUri, sourceEncoding); + DicomToJsonInternal(child, dictionary, seq->GetItem(i).GetNestedDataSet(), childUri, sourceEncoding); node["Value"].append(child); } } @@ -586,7 +626,7 @@ node["Value"] = Json::arrayValue; std::string value; - if (ConvertDicomStringToUtf8(value, dictionary, file, *it, sourceEncoding)) + if (ConvertDicomStringToUtf8(value, dictionary, *it, sourceEncoding)) { node["Value"].append(value.c_str()); } @@ -608,19 +648,17 @@ static void DicomToJson(Json::Value& target, const gdcm::Dict& dictionary, - const gdcm::File* file, const gdcm::DataSet& dicom, const std::string& bulkUriRoot) { Orthanc::Encoding encoding = DetectEncoding(dicom); - DicomToJsonInternal(target, dictionary, file, dicom, bulkUriRoot, encoding); + DicomToJsonInternal(target, dictionary, dicom, bulkUriRoot, encoding); } void GenerateSingleDicomAnswer(std::string& result, const std::string& wadoBase, const gdcm::Dict& dictionary, - const gdcm::File* file, // Can be NULL const gdcm::DataSet& dicom, bool isXml, bool isBulkAccessible) @@ -634,7 +672,7 @@ if (isXml) { pugi::xml_document doc; - DicomToXml(doc, dictionary, file, dicom, bulkUriRoot); + DicomToXml(doc, dictionary, dicom, bulkUriRoot); ChunkedBufferWriter writer; doc.save(writer, " ", pugi::format_default, pugi::encoding_utf8); @@ -644,7 +682,7 @@ else { Json::Value v; - DicomToJson(v, dictionary, file, dicom, bulkUriRoot); + DicomToJson(v, dictionary, dicom, bulkUriRoot); Json::FastWriter writer; result = writer.write(v); @@ -661,7 +699,7 @@ bool isBulkAccessible) { std::string answer; - GenerateSingleDicomAnswer(answer, wadoBase, dictionary, NULL, dicom, isXml, isBulkAccessible); + GenerateSingleDicomAnswer(answer, wadoBase, dictionary, dicom, isXml, isBulkAccessible); OrthancPluginAnswerBuffer(context, output, answer.c_str(), answer.size(), isXml ? "application/dicom+xml" : "application/json"); } diff -r 2ddecfba10c0 -r fa93e7147ebf Plugin/Dicom.h --- a/Plugin/Dicom.h Tue Dec 05 13:32:56 2017 +0100 +++ b/Plugin/Dicom.h Wed Dec 06 06:19:19 2017 +0100 @@ -112,7 +112,6 @@ void GenerateSingleDicomAnswer(std::string& result, const std::string& wadoBase, const gdcm::Dict& dictionary, - const gdcm::File* file, // Can be NULL const gdcm::DataSet& dicom, bool isXml, bool isBulkAccessible); diff -r 2ddecfba10c0 -r fa93e7147ebf Plugin/DicomResults.cpp --- a/Plugin/DicomResults.cpp Tue Dec 05 13:32:56 2017 +0100 +++ b/Plugin/DicomResults.cpp Wed Dec 06 06:19:19 2017 +0100 @@ -79,18 +79,17 @@ } - void DicomResults::AddInternal(const gdcm::File* file, - const gdcm::DataSet& dicom) + void DicomResults::AddInternal(const gdcm::DataSet& dicom) { std::string item; if (isXml_) { - GenerateSingleDicomAnswer(item, wadoBase_, dictionary_, file, dicom, true, isBulkAccessible_); + GenerateSingleDicomAnswer(item, wadoBase_, dictionary_, dicom, true, isBulkAccessible_); } else { - GenerateSingleDicomAnswer(item, wadoBase_, dictionary_, file, dicom, false, isBulkAccessible_); + GenerateSingleDicomAnswer(item, wadoBase_, dictionary_, dicom, false, isBulkAccessible_); } AddInternal(item); diff -r 2ddecfba10c0 -r fa93e7147ebf Plugin/DicomResults.h --- a/Plugin/DicomResults.h Tue Dec 05 13:32:56 2017 +0100 +++ b/Plugin/DicomResults.h Wed Dec 06 06:19:19 2017 +0100 @@ -45,8 +45,7 @@ void AddInternal(const std::string& item); - void AddInternal(const gdcm::File* file, - const gdcm::DataSet& dicom); + void AddInternal(const gdcm::DataSet& dicom); public: DicomResults(OrthancPluginContext* context, @@ -58,13 +57,12 @@ void Add(const gdcm::File& file) { - AddInternal(&file, file.GetDataSet()); + AddInternal(file.GetDataSet()); } - void Add(const gdcm::File& file, - const gdcm::DataSet& subset) + void Add(const gdcm::DataSet& subset) { - AddInternal(&file, subset); + AddInternal(subset); } void AddFromOrthanc(const Json::Value& dicom,