Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,20 @@ set(SIMPLNX_HDRS
${SIMPLNX_SOURCE_DIR}/DataStructure/Geometry/INodeGeometry2D.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Geometry/INodeGeometry3D.hpp

${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/BaseMetadataValue.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/AbstractMetadataValue.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/AbstractVectorMetadataValue.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/BoolMetadataValue.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/BoolVectorMetadataValue.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/Float64MetadataValue.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/Float64VectorMetadataValue.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/Int32MetadataValue.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/Int32VectorMetadataValue.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/MetaDataList.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/StringMetadataValue.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/StringVectorMetadataValue.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/UnknownMetadataValue.hpp

${SIMPLNX_SOURCE_DIR}/DataStructure/DynamicListArray.hpp
${SIMPLNX_SOURCE_DIR}/DataStructure/EmptyDataStore.hpp

Expand Down Expand Up @@ -684,6 +698,18 @@ set(SIMPLNX_SRCS
${SIMPLNX_SOURCE_DIR}/DataStructure/Geometry/TriangleGeom.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Geometry/VertexGeom.cpp

${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/BaseMetadataValue.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/BoolMetadataValue.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/BoolVectorMetadataValue.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/Float64MetadataValue.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/Float64VectorMetadataValue.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/Int32MetadataValue.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/Int32VectorMetadataValue.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/MetaDataList.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/StringMetadataValue.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/StringVectorMetadataValue.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Metadata/UnknownMetadataValue.cpp

${SIMPLNX_SOURCE_DIR}/DataStructure/Montage/AbstractMontage.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Montage/AbstractTileIndex.cpp
${SIMPLNX_SOURCE_DIR}/DataStructure/Montage/GridMontage.cpp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ using namespace nx::core;

namespace
{
constexpr int32 k_FailedFindPipelineError = -15;
constexpr nx::core::int32 k_NoExportPathError = -1;
constexpr nx::core::int32 k_FailedFindPipelineError = -15;
} // namespace

// -----------------------------------------------------------------------------
Expand All @@ -30,53 +31,96 @@ WriteDREAM3D::WriteDREAM3D(DataStructure& dataStructure, const IFilter::MessageH
// -----------------------------------------------------------------------------
WriteDREAM3D::~WriteDREAM3D() noexcept = default;

/**
* @brief Extracts the preceding Pipeline from the PipelineFilter.
* This method returns an empty Pipeline if the PipelineFilter is null.
* @param pipelineNode The PipelineFilter to extract the Pipeline from.
* @return Result<Pipeline> The target Pipeline or an error message if the process failed to complete.
*/
Result<Pipeline> ExtractPipeline(const PipelineFilter* pipelineNode)
{
Pipeline pipeline;
if(pipelineNode != nullptr)
{
auto pipelinePtr = pipelineNode->getPrecedingPipeline();
if(pipelinePtr == nullptr)
{
return MakeErrorResult<Pipeline>(k_FailedFindPipelineError, "Failed to retrieve pipeline.");
}

pipeline = *pipelinePtr;
}
return {pipeline};
}

/**
* @brief Writes the DREAM3D file to the temp file, commits changes, and then writes the XDMF file if requested.
* @param atomicFile Temp file for writing the DREAM3D file
* @param dataStructure DataStructure to be written to file.
* @param pipeline Pipeline to write to file.
* @param writeXdmfFile
* @return Result<>
*/
Result<> WriteDREAM3DFile(AtomicFile& atomicFile, const DataStructure& dataStructure, const Pipeline& pipeline, bool writeXdmfFile,
const nx::core::HDF5::DataStructureWriter::WriteOptions& writeOptions)
{
auto exportFilePath = atomicFile.tempFilePath();

auto results = DREAM3D::WriteFile(exportFilePath, dataStructure, pipeline, writeXdmfFile, writeOptions);
if(results.invalid())
{
return results;
}

// Commit changes to the temp file. Return an invalid Result if errors occured.
if(auto commitResult = atomicFile.commit(); commitResult.invalid())
{
return commitResult;
}

// Write the XDMF file if specified
if(writeXdmfFile)
{
// TODO: Double check this
fs::path xdmfFilePath = exportFilePath.replace_extension(".xdmf");
std::error_code errorCode;
fs::rename(xdmfFilePath, fs::path(exportFilePath).replace_extension(".xdmf"), errorCode);

// If the XDMF file failed to be renamed, return an invalid Result
if(errorCode)
{
std::string ss = fmt::format("Failed to rename xdmf file with error: '{}'", errorCode.message());
return MakeErrorResult(errorCode.value(), ss);
}
}

return {};
}

// -----------------------------------------------------------------------------
Result<> WriteDREAM3D::operator()()
{
// Create AtomicFile to write.
auto atomicFileResult = AtomicFile::Create(m_InputValues->ExportFilePath);
if(atomicFileResult.invalid())
{
return ConvertResult(std::move(atomicFileResult));
}
AtomicFile atomicFile = std::move(atomicFileResult.value());

auto exportFilePath = atomicFile.tempFilePath();
auto writeXdmf = m_InputValues->WriteXdmfFile;

// Extract Preceding Pipeline
Pipeline pipeline;

if(m_InputValues->PipelineNode != nullptr)
if(auto result = ExtractPipeline(m_InputValues->PipelineNode); result.invalid())
{
auto pipelinePtr = m_InputValues->PipelineNode->getPrecedingPipeline();
if(pipelinePtr == nullptr)
{
return MakeErrorResult(k_FailedFindPipelineError, "Failed to retrieve pipeline.");
}

pipeline = *pipelinePtr;
return ConvertResult(std::move(result));
}
else
{
pipeline = std::move(result.value());
}

// Write DREAM.3D file
nx::core::HDF5::DataStructureWriter::WriteOptions writeOptions;
writeOptions.compressionLevel = m_InputValues->UseCompression ? m_InputValues->CompressionLevel : 0;
auto results = DREAM3D::WriteFile(exportFilePath, m_DataStructure, pipeline, writeXdmf, writeOptions);
if(results.valid())
{
Result<> commitResult = atomicFile.commit();
if(commitResult.invalid())
{
return commitResult;
}
if(writeXdmf)
{
fs::path xdmfFilePath = exportFilePath.replace_extension(".xdmf");
std::error_code errorCode;
fs::rename(xdmfFilePath, m_InputValues->ExportFilePath.parent_path() / m_InputValues->ExportFilePath.stem().concat(".xdmf"), errorCode);
if(errorCode)
{
std::string ss = fmt::format("Failed to rename xdmf file with error: '{}'", errorCode.message());
return MakeErrorResult(errorCode.value(), ss);
}
}
}
return results;
return WriteDREAM3DFile(atomicFile, m_DataStructure, pipeline, m_InputValues->WriteXdmfFile, writeOptions);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include "SimplnxCore/Filters/Algorithms/WriteDREAM3D.hpp"

#include "SimplnxCore/Filters/Algorithms/WriteDREAM3D.hpp"
#include "simplnx/Parameters/BoolParameter.hpp"
#include "simplnx/Parameters/FileSystemPathParameter.hpp"
#include "simplnx/Parameters/NumberParameter.hpp"
Expand Down
Loading
Loading