diff --git a/Modules/Multilabel/autoload/IO/CMakeLists.txt b/Modules/Multilabel/autoload/IO/CMakeLists.txt index a61aebf0db..ae9c56dfe8 100644 --- a/Modules/Multilabel/autoload/IO/CMakeLists.txt +++ b/Modules/Multilabel/autoload/IO/CMakeLists.txt @@ -1,5 +1,5 @@ mitk_create_module(MultilabelIO DEPENDS PUBLIC MitkMultilabel MitkSceneSerialization - PACKAGE_DEPENDS PRIVATE ITK|IONRRD + PACKAGE_DEPENDS PRIVATE ITK|IONRRD nlohmann_json AUTOLOAD_WITH MitkCore ) diff --git a/Modules/Multilabel/autoload/IO/files.cmake b/Modules/Multilabel/autoload/IO/files.cmake index a5079ce423..d169777cb5 100644 --- a/Modules/Multilabel/autoload/IO/files.cmake +++ b/Modules/Multilabel/autoload/IO/files.cmake @@ -1,8 +1,13 @@ set(CPP_FILES mitkLabelSetImageIO.cpp mitkLabelSetImageIO.h mitkLabelSetImageSerializer.cpp mitkLabelSetImageSerializer.h mitkMultilabelActivator.cpp + mitkMultilabelIOMimeTypes.cpp + mitkMultilabelIOMimeTypes.h + mitkSegmentationTaskIO.cpp + mitkSegmentationTaskIO.h + mitkSegmentationTaskSerializer.cpp + mitkSegmentationTaskSerializer.h ) - diff --git a/Modules/Multilabel/autoload/IO/mitkMultilabelActivator.cpp b/Modules/Multilabel/autoload/IO/mitkMultilabelActivator.cpp index f70ac539e2..e410ee225d 100644 --- a/Modules/Multilabel/autoload/IO/mitkMultilabelActivator.cpp +++ b/Modules/Multilabel/autoload/IO/mitkMultilabelActivator.cpp @@ -1,44 +1,55 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include #include #include #include #include "mitkLabelSetImageIO.h" +#include "mitkMultilabelIOMimeTypes.h" +#include "mitkSegmentationTaskIO.h" namespace mitk { /** \brief Registers services for multilabel module. */ class MultilabelIOModuleActivator : public us::ModuleActivator { std::vector m_FileIOs; public: - void Load(us::ModuleContext * /*context*/) override + void Load(us::ModuleContext *context) override { + auto mimeTypes = MitkMultilabelIOMimeTypes::Get(); + + us::ServiceProperties props; + props[us::ServiceConstants::SERVICE_RANKING()] = 10; + + for (const auto &mimeType : mimeTypes) + context->RegisterService(mimeType, props); + m_FileIOs.push_back(new LabelSetImageIO()); + m_FileIOs.push_back(new SegmentationTaskIO); } void Unload(us::ModuleContext *) override { for (auto &elem : m_FileIOs) { delete elem; } } }; } US_EXPORT_MODULE_ACTIVATOR(mitk::MultilabelIOModuleActivator) diff --git a/Modules/Multilabel/autoload/IO/mitkMultilabelIOMimeTypes.cpp b/Modules/Multilabel/autoload/IO/mitkMultilabelIOMimeTypes.cpp new file mode 100644 index 0000000000..f1293d2c32 --- /dev/null +++ b/Modules/Multilabel/autoload/IO/mitkMultilabelIOMimeTypes.cpp @@ -0,0 +1,75 @@ +/*============================================================================ + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center (DKFZ) +All rights reserved. + +Use of this source code is governed by a 3-clause BSD license that can be +found in the LICENSE file. + +============================================================================*/ + +#include "mitkMultilabelIOMimeTypes.h" +#include + +#include +#include + +#include + +mitk::MitkMultilabelIOMimeTypes::MitkSegmentationTaskMimeType::MitkSegmentationTaskMimeType() + : CustomMimeType(SEGMENTATIONTASK_MIMETYPE_NAME()) +{ + this->AddExtension("json"); + this->SetCategory("MITK Segmentation Task"); + this->SetComment("MITK Segmentation Task"); +} + +bool mitk::MitkMultilabelIOMimeTypes::MitkSegmentationTaskMimeType::AppliesTo(const std::string& path) const +{ + bool result = CustomMimeType::AppliesTo(path); + + if (!std::filesystem::exists(path)) // T18572 + return result; + + std::ifstream file(path); + + if (!file.is_open()) + return false; + + auto json = nlohmann::json::parse(file, nullptr, false); + + if (json.is_discarded() || !json.is_object()) + return false; + + if ("MITK Segmentation Task" != json.value("FileFormat", "")) + return false; + + if (1 != json.value("Version", 0)) + return false; + + return true; +} + +mitk::MitkMultilabelIOMimeTypes::MitkSegmentationTaskMimeType* mitk::MitkMultilabelIOMimeTypes::MitkSegmentationTaskMimeType::Clone() const +{ + return new MitkSegmentationTaskMimeType(*this); +} + +mitk::MitkMultilabelIOMimeTypes::MitkSegmentationTaskMimeType mitk::MitkMultilabelIOMimeTypes::SEGMENTATIONTASK_MIMETYPE() +{ + return MitkSegmentationTaskMimeType(); +} + +std::string mitk::MitkMultilabelIOMimeTypes::SEGMENTATIONTASK_MIMETYPE_NAME() +{ + return IOMimeTypes::DEFAULT_BASE_NAME() + ".segmentationtask"; +} + +std::vector mitk::MitkMultilabelIOMimeTypes::Get() +{ + std::vector mimeTypes; + mimeTypes.push_back(SEGMENTATIONTASK_MIMETYPE().Clone()); + return mimeTypes; +} diff --git a/Modules/Multilabel/autoload/IO/mitkMultilabelIOMimeTypes.h b/Modules/Multilabel/autoload/IO/mitkMultilabelIOMimeTypes.h new file mode 100644 index 0000000000..8508964e43 --- /dev/null +++ b/Modules/Multilabel/autoload/IO/mitkMultilabelIOMimeTypes.h @@ -0,0 +1,39 @@ +/*============================================================================ + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center (DKFZ) +All rights reserved. + +Use of this source code is governed by a 3-clause BSD license that can be +found in the LICENSE file. + +============================================================================*/ + +#ifndef mitkMultilabelIOMimeTypes_h +#define mitkMultilabelIOMimeTypes_h + +#include +#include + +namespace mitk +{ + namespace MitkMultilabelIOMimeTypes + { + class MITKMULTILABELIO_EXPORT MitkSegmentationTaskMimeType : public CustomMimeType + { + public: + MitkSegmentationTaskMimeType(); + + bool AppliesTo(const std::string& path) const override; + MitkSegmentationTaskMimeType* Clone() const override; + }; + + MITKMULTILABELIO_EXPORT MitkSegmentationTaskMimeType SEGMENTATIONTASK_MIMETYPE(); + MITKMULTILABELIO_EXPORT std::string SEGMENTATIONTASK_MIMETYPE_NAME(); + + MITKMULTILABELIO_EXPORT std::vector Get(); + } +} + +#endif diff --git a/Modules/Multilabel/autoload/IO/mitkSegmentationTaskIO.cpp b/Modules/Multilabel/autoload/IO/mitkSegmentationTaskIO.cpp new file mode 100644 index 0000000000..0a8c63f9f8 --- /dev/null +++ b/Modules/Multilabel/autoload/IO/mitkSegmentationTaskIO.cpp @@ -0,0 +1,106 @@ +/*============================================================================ + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center (DKFZ) +All rights reserved. + +Use of this source code is governed by a 3-clause BSD license that can be +found in the LICENSE file. + +============================================================================*/ + +#include "mitkSegmentationTaskIO.h" +#include "mitkMultilabelIOMimeTypes.h" + +#include + +#include + +#include +#include + +mitk::SegmentationTaskIO::SegmentationTaskIO() + : AbstractFileIO(SegmentationTask::GetStaticNameOfClass(), MitkMultilabelIOMimeTypes::SEGMENTATIONTASK_MIMETYPE(), "MITK Segmentation Task") +{ + this->RegisterService(); +} + +std::vector mitk::SegmentationTaskIO::DoRead() +{ + auto* stream = this->GetInputStream(); + std::ifstream fileStream; + + if (nullptr == stream) + { + auto filename = this->GetInputLocation(); + + if (filename.empty() || !std::filesystem::exists(filename)) + mitkThrow() << "Invalid or nonexistent filename: \"" << filename << "\"!"; + + fileStream.open(filename); + + if (!fileStream.is_open()) + mitkThrow() << "Could not open file \"" << filename << "\" for reading!"; + + stream = &fileStream; + } + + auto json = nlohmann::json::parse(*stream, nullptr, false); + + if (json.is_discarded() || !json.is_object()) + mitkThrow() << "Could not parse JSON!"; + + if ("MITK Segmentation Task" != json.value("FileFormat", "")) + mitkThrow() << "Unknown file format (expected \"MITK Segmentation Task\")!"; + + if (1 != json.value("Version", 0)) + mitkThrow() << "Unknown file format version (expected \"1\")!"; + + auto segmentationTask = SegmentationTask::New(); + + // TODO + + std::vector result; + result.push_back(segmentationTask.GetPointer()); + + return result; +} + +void mitk::SegmentationTaskIO::Write() +{ + auto* stream = this->GetOutputStream(); + std::ofstream fileStream; + + if (nullptr == stream) + { + auto filename = this->GetOutputLocation(); + + if (filename.empty()) + mitkThrow() << "Neither an output stream nor an output filename was specified!"; + + fileStream.open(filename); + + if (!fileStream.is_open()) + mitkThrow() << "Could not open file \"" << filename << "\" for writing!"; + + stream = &fileStream; + } + + if (!stream->good()) + mitkThrow() << "Stream for writing is not good!"; + + nlohmann::json json = { + { "FileFormat", "MITK Segmentation Task" }, + { "Version", 1 } + }; + + // TODO + + *stream << std::setw(2) << json << std::endl; +} + +mitk::SegmentationTaskIO* mitk::SegmentationTaskIO::IOClone() const +{ + return new SegmentationTaskIO(*this); +} diff --git a/Modules/Multilabel/autoload/IO/mitkSegmentationTaskIO.h b/Modules/Multilabel/autoload/IO/mitkSegmentationTaskIO.h new file mode 100644 index 0000000000..9c7380bae4 --- /dev/null +++ b/Modules/Multilabel/autoload/IO/mitkSegmentationTaskIO.h @@ -0,0 +1,36 @@ +/*============================================================================ + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center (DKFZ) +All rights reserved. + +Use of this source code is governed by a 3-clause BSD license that can be +found in the LICENSE file. + +============================================================================*/ + +#ifndef mitkSegmentationTaskIO_h +#define mitkSegmentationTaskIO_h + +#include + +namespace mitk +{ + class SegmentationTaskIO : public AbstractFileIO + { + public: + SegmentationTaskIO(); + + using AbstractFileReader::Read; + void Write() override; + + protected: + std::vector DoRead() override; + + private: + SegmentationTaskIO* IOClone() const override; + }; +} + +#endif diff --git a/Modules/Multilabel/autoload/IO/mitkSegmentationTaskSerializer.cpp b/Modules/Multilabel/autoload/IO/mitkSegmentationTaskSerializer.cpp new file mode 100644 index 0000000000..0d64b26bbb --- /dev/null +++ b/Modules/Multilabel/autoload/IO/mitkSegmentationTaskSerializer.cpp @@ -0,0 +1,55 @@ +/*============================================================================ + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center (DKFZ) +All rights reserved. + +Use of this source code is governed by a 3-clause BSD license that can be +found in the LICENSE file. + +============================================================================*/ + +#include "mitkSegmentationTaskSerializer.h" +#include "mitkSegmentationTask.h" + +#include + +MITK_REGISTER_SERIALIZER(SegmentationTaskSerializer) + +mitk::SegmentationTaskSerializer::SegmentationTaskSerializer() +{ +} + +mitk::SegmentationTaskSerializer::~SegmentationTaskSerializer() +{ +} + +std::string mitk::SegmentationTaskSerializer::Serialize() +{ + auto segmentationTask = dynamic_cast(m_Data.GetPointer()); + + if (nullptr == segmentationTask) + { + MITK_ERROR << "Object at " << (const void*)this->m_Data << " is not an mitk::SegmentationTask. Cannot serialize as MITK Segmentation Task."; + return ""; + } + + auto filename = this->GetUniqueFilenameInWorkingDirectory(); + filename += "_" + m_FilenameHint + ".json"; + + std::string path = m_WorkingDirectory; + path += IOUtil::GetDirectorySeparator() + filename; + + try + { + IOUtil::Save(segmentationTask, path); + } + catch (std::exception& e) + { + MITK_ERROR << "Error serializing object at " << (const void*)this->m_Data << " to " << path << ": " << e.what(); + return ""; + } + + return filename; +} diff --git a/Modules/Multilabel/autoload/IO/mitkSegmentationTaskSerializer.h b/Modules/Multilabel/autoload/IO/mitkSegmentationTaskSerializer.h new file mode 100644 index 0000000000..96bbf49ccc --- /dev/null +++ b/Modules/Multilabel/autoload/IO/mitkSegmentationTaskSerializer.h @@ -0,0 +1,34 @@ +/*============================================================================ + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center (DKFZ) +All rights reserved. + +Use of this source code is governed by a 3-clause BSD license that can be +found in the LICENSE file. + +============================================================================*/ + +#ifndef mitkSegmentationTaskSerializer_h +#define mitkSegmentationTaskSerializer_h + +#include + +namespace mitk +{ + class SegmentationTaskSerializer : public BaseDataSerializer + { + public: + mitkClassMacro(SegmentationTaskSerializer, BaseDataSerializer) + itkFactorylessNewMacro(Self) + + std::string Serialize() override; + + protected: + SegmentationTaskSerializer(); + ~SegmentationTaskSerializer() override; + }; +} + +#endif