diff --git a/Modules/Core/QuadEdgeMesh/include/itkQuadEdgeMeshLineCell.h b/Modules/Core/QuadEdgeMesh/include/itkQuadEdgeMeshLineCell.h index 8198fea6a26..8486740647b 100644 --- a/Modules/Core/QuadEdgeMesh/include/itkQuadEdgeMeshLineCell.h +++ b/Modules/Core/QuadEdgeMesh/include/itkQuadEdgeMeshLineCell.h @@ -19,6 +19,7 @@ #define itkQuadEdgeMeshLineCell_h #include "itkAutoPointer.h" +#include "itkMesh.h" #include "itkGeometricalQuadEdge.h" namespace itk diff --git a/Modules/IO/NRRD/src/itkNrrdImageIO.cxx b/Modules/IO/NRRD/src/itkNrrdImageIO.cxx index 37662e029e2..9eae7e968e8 100644 --- a/Modules/IO/NRRD/src/itkNrrdImageIO.cxx +++ b/Modules/IO/NRRD/src/itkNrrdImageIO.cxx @@ -23,6 +23,8 @@ #include "itkIOCommon.h" #include "itkFloatingPointExceptions.h" +#include + namespace itk { #define KEY_PREFIX "NRRD_" @@ -868,6 +870,21 @@ NrrdImageIO::WriteImageInformation() // Nothing needs doing here. } + +// helper function +template +bool +_dump_metadata_to_stream(MetaDataDictionary & thisDic, const std::string & key, std::ostringstream & buffer) +{ + T value; + if (ExposeMetaData(thisDic, key, value)) + { + buffer << value; + return true; + } + return false; +} + void NrrdImageIO::Write(const void * buffer) { @@ -1065,9 +1082,19 @@ NrrdImageIO::Write(const void * buffer) else { // not a NRRD field packed into meta data; just a regular key/value - std::string value; - ExposeMetaData(thisDic, *keyIt, value); - nrrdKeyValueAdd(nrrd, keyIt->c_str(), value.c_str()); + // convert to string and dump to the file + // const char *tname = thisDic.Get(*keyIt)->GetNameOfClass(); + std::ostringstream dump; + if (_dump_metadata_to_stream(thisDic, *keyIt, dump) || + _dump_metadata_to_stream(thisDic, *keyIt, dump) || + _dump_metadata_to_stream(thisDic, *keyIt, dump) || + _dump_metadata_to_stream(thisDic, *keyIt, dump) || + _dump_metadata_to_stream(thisDic, *keyIt, dump) || + _dump_metadata_to_stream>(thisDic, *keyIt, dump) || + _dump_metadata_to_stream>(thisDic, *keyIt, dump) || + _dump_metadata_to_stream>(thisDic, *keyIt, dump) || + _dump_metadata_to_stream>(thisDic, *keyIt, dump)) + nrrdKeyValueAdd(nrrd, keyIt->c_str(), dump.str().c_str()); } } diff --git a/Modules/IO/NRRD/test/itkNrrdImageIOTest.h b/Modules/IO/NRRD/test/itkNrrdImageIOTest.h index 70871ff036e..8850b174f37 100644 --- a/Modules/IO/NRRD/test/itkNrrdImageIOTest.h +++ b/Modules/IO/NRRD/test/itkNrrdImageIOTest.h @@ -19,6 +19,7 @@ #define itkNrrdImageIOTest_h #include +#include #include "itkImageRegionIterator.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" @@ -99,6 +100,20 @@ itkNrrdImageIOTestReadWriteTest(std::string fn, unsigned int size, std::string i { // Generate a random image. image = itkNrrdImageIOTestGenerateRandomImage(size); + + // add custom metadata + itk::MetaDataDictionary dictionary; + + itk::EncapsulateMetaData(dictionary, "ASimpleString", std::string("a string")); + itk::EncapsulateMetaData(dictionary, "ASimpleFloat", 1.2f); + itk::EncapsulateMetaData(dictionary, "ASimpleDouble", 2.3); + itk::EncapsulateMetaData(dictionary, "ASimpleInt", 3); + + itk::EncapsulateMetaData(dictionary, "Array", itk::Array(3, 1)); + itk::EncapsulateMetaData(dictionary, "Array", itk::Array(4, 2.2f)); + itk::EncapsulateMetaData(dictionary, "Array", itk::Array(5, 3.3)); + + image->SetMetaDataDictionary(dictionary); } // Write, then read the image. @@ -153,6 +168,42 @@ itkNrrdImageIOTestReadWriteTest(std::string fn, unsigned int size, std::string i return EXIT_FAILURE; } } + if (inputFile == "null") + { + // check incorporated metadata + itk::MetaDataDictionary dictionary = reader->GetOutput()->GetMetaDataDictionary(); + + auto check_metadata_entry = [](auto & dict, auto & key, auto & expected) { + std::string val; + if (!itk::ExposeMetaData(dict, key, val)) + { + std::cerr << "Missing expected metadata entry:" << key << std::endl; + return false; + } + if (val != expected) + { + std::cerr << "Wrong metadata for " << key << ", expected:" << expected << " got:" << val.c_str() << std::endl; + return false; + } + return true; + }; + + if (!check_metadata_entry(dictionary, "ASimpleString", "a string")) + return EXIT_FAILURE; + if (!check_metadata_entry(dictionary, "ASimpleFloat", "1.2")) + return EXIT_FAILURE; + if (!check_metadata_entry(dictionary, "ASimpleDouble", "2.3")) + return EXIT_FAILURE; + if (!check_metadata_entry(dictionary, "ASimpleInt", "3")) + return EXIT_FAILURE; + if (!check_metadata_entry(dictionary, "Array", "[1, 1, 1]")) + return EXIT_FAILURE; + if (!check_metadata_entry(dictionary, "Array", "[2.2, 2.2, 2.2, 2.2]")) + return EXIT_FAILURE; + if (!check_metadata_entry(dictionary, "Array", "[3.3, 3.3, 3.3, 3.3, 3.3]")) + return EXIT_FAILURE; + } + return EXIT_SUCCESS; }