diff --git a/src/Plugins/OrientationAnalysis/src/OrientationAnalysis/Filters/Algorithms/WritePoleFigure.cpp b/src/Plugins/OrientationAnalysis/src/OrientationAnalysis/Filters/Algorithms/WritePoleFigure.cpp index 7db1fe0e44..23c23ae141 100644 --- a/src/Plugins/OrientationAnalysis/src/OrientationAnalysis/Filters/Algorithms/WritePoleFigure.cpp +++ b/src/Plugins/OrientationAnalysis/src/OrientationAnalysis/Filters/Algorithms/WritePoleFigure.cpp @@ -1,14 +1,9 @@ #include "WritePoleFigure.hpp" -#include "OrientationAnalysis/utilities/FiraSansRegular.hpp" -#include "OrientationAnalysis/utilities/Fonts.hpp" -#include "OrientationAnalysis/utilities/LatoBold.hpp" -#include "OrientationAnalysis/utilities/LatoRegular.hpp" #include "OrientationAnalysis/utilities/TiffWriter.hpp" #include "OrientationAnalysis/utilities/delaunator.h" #include "simplnx/Common/Constants.hpp" -#include "simplnx/Common/RgbColor.hpp" #include "simplnx/DataStructure/DataArray.hpp" #include "simplnx/DataStructure/Geometry/ImageGeom.hpp" #include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" @@ -20,7 +15,6 @@ #include "simplnx/Utilities/ParallelTaskAlgorithm.hpp" #include "simplnx/Utilities/Parsing/DREAM3D/Dream3dIO.hpp" #include "simplnx/Utilities/RTree.hpp" -#include "simplnx/Utilities/StringUtilities.hpp" #include #include @@ -36,14 +30,12 @@ #include #include #include +#include #include "H5Support/H5Lite.h" #include "H5Support/H5ScopedSentinel.h" #include "H5Support/H5Utilities.h" -#define CANVAS_ITY_IMPLEMENTATION -#include - using namespace nx::core; namespace @@ -495,142 +487,6 @@ typename EbsdDataArray::Pointer flipAndMirrorPoleFigure(EbsdDataArray* src return converted; } -template -typename EbsdDataArray::Pointer convertColorOrder(EbsdDataArray* src, const ebsdlib::PoleFigureConfiguration_t& config) -{ - typename EbsdDataArray::Pointer converted = EbsdDataArray::CreateArray(config.imageDim * config.imageDim, src->getComponentDimensions(), src->getName(), true); - // BGRA to RGBA ordering (This is a Little Endian code) - // If this is ever compiled on a BIG ENDIAN machine the colors will be off. - size_t numTuples = src->getNumberOfTuples(); - for(size_t tIdx = 0; tIdx < numTuples; tIdx++) - { - T* argbPtr = src->getTuplePointer(tIdx); - T* destPtr = converted->getTuplePointer(tIdx); - destPtr[0] = argbPtr[2]; - destPtr[1] = argbPtr[1]; - destPtr[2] = argbPtr[0]; - destPtr[3] = argbPtr[3]; - } - return converted; -} - -// ----------------------------------------------------------------------------- -void drawInformationBlock(canvas_ity::canvas& context, const ebsdlib::PoleFigureConfiguration_t& config, const std::pair& position, float margins, float fontPtSize, int32_t phaseNum, - std::vector& fontData, const std::string& laueGroupName, const std::string& materialName) -{ - const float scaleBarRelativeWidth = 0.10f; - // - const int imageHeight = config.imageDim; - const int imageWidth = config.imageDim; - const float colorHeight = (static_cast(imageHeight)) / static_cast(config.numColors); - // - using RectFType = std::pair; - const RectFType rect = std::make_pair(static_cast(imageWidth) * scaleBarRelativeWidth, colorHeight * 1.00000f); - // - const std::array baselines = {canvas_ity::alphabetic, canvas_ity::top, canvas_ity::middle, canvas_ity::bottom, canvas_ity::hanging, canvas_ity::ideographic}; - - // Draw the information about the pole figure - /* clang-format off */ - const std::vector labels = { - fmt::format("Phase Num: {}", phaseNum), - fmt::format("Material Name: {}", materialName), - fmt::format("Laue Group: {}", laueGroupName), - fmt::format("Upper & Lower:"), - fmt::format("Samples: {}", config.eulers->getNumberOfTuples()), - fmt::format("Lambert Sq. Dim: {}", config.lambertDim) - }; - - /* clang-format on */ - float heightInc = 1.0f; - for(const auto& label : labels) - { - // Draw the Number of Samples - context.begin_path(); - context.set_font(fontData.data(), static_cast(fontData.size()), fontPtSize); - context.set_color(canvas_ity::fill_style, 0.0f, 0.0f, 0.0f, 1.0f); - context.text_baseline = baselines[0]; - context.fill_text(label.c_str(), position.first + margins + rect.first + margins, position.second + margins + (static_cast(imageHeight) / 3.0f) + (heightInc * fontPtSize)); - context.close_path(); - heightInc++; - } -} - -// ----------------------------------------------------------------------------- -void drawScalarBar(canvas_ity::canvas& context, const ebsdlib::PoleFigureConfiguration_t& config, const std::pair& position, float margins, float fontPtSize, int32_t phaseNum, - std::vector& fontData, const std::string& laueGroupName, const std::string& materialName) -{ - - int numColors = config.numColors; - - // Get all the colors that we will need - std::vector colorTable(numColors); - std::vector colors(3 * numColors, 0.0); - nx::core::RgbColor::GetColorTable(numColors, colors); // Generate the color table values - float r = 0.0; - float g = 0.0; - float b = 0.0; - for(int i = 0; i < numColors; i++) // Convert them to QRgbColor values - { - r = colors[3 * i]; - g = colors[3 * i + 1]; - b = colors[3 * i + 2]; - colorTable[i] = RgbColor::dRgb(static_cast(r * 255.0f), static_cast(g * 255.0f), static_cast(b * 255.0f), 255); - } - - // Now start from the bottom and draw colored lines up the scale bar - // A Slight Indentation for the scalar bar - const float scaleBarRelativeWidth = 0.10f; - - const int imageHeight = config.imageDim; - const int imageWidth = config.imageDim; - const float colorHeight = (static_cast(imageHeight)) / static_cast(numColors); - - using RectFType = std::pair; - - const RectFType rect = std::make_pair(static_cast(imageWidth) * scaleBarRelativeWidth, colorHeight * 1.00000f); - - const std::array baselines = {canvas_ity::alphabetic, canvas_ity::top, canvas_ity::middle, canvas_ity::bottom, canvas_ity::hanging, canvas_ity::ideographic}; - - // Draw the Max Value - context.begin_path(); - const std::string maxStr = fmt::format("{:#.6}", config.maxScale); - context.set_font(fontData.data(), static_cast(fontData.size()), fontPtSize); - context.set_color(canvas_ity::fill_style, 0.0f, 0.0f, 0.0f, 1.0f); - context.text_baseline = baselines[0]; - context.fill_text(maxStr.c_str(), position.first + 2.0F * margins + rect.first, position.second + (2 * margins) + (2 * fontPtSize) + colorHeight); - context.close_path(); - - // Draw the Min value - context.begin_path(); - const std::string minStr = fmt::format("{:#.6}", config.minScale); - context.set_font(fontData.data(), static_cast(fontData.size()), fontPtSize); - context.set_color(canvas_ity::fill_style, 0.0f, 0.0f, 0.0f, 1.0f); - context.text_baseline = baselines[0]; - context.fill_text(minStr.c_str(), position.first + 2.0F * margins + rect.first, position.second + (2 * margins) + (2 * fontPtSize) + (static_cast(numColors) * colorHeight)); - context.close_path(); - - // Draw the color bar - for(int i = 0; i < numColors; i++) - { - const nx::core::Rgb c = colorTable[numColors - i - 1]; - std::tie(r, g, b) = RgbColor::fRgb(c); - - const float32 x = position.first + margins; - const float32 y = position.second + (2 * margins) + (2 * fontPtSize) + (static_cast(i) * colorHeight); - - context.begin_path(); - context.set_color(canvas_ity::fill_style, r, g, b, 1.0f); - context.fill_rectangle(x, y, rect.first, rect.second); - - context.set_color(canvas_ity::stroke_style, r, g, b, 1.0f); - context.set_line_width(1.0f); - context.stroke_rectangle(x, y, rect.first, rect.second); - } - - // Draw the information about the pole figure - drawInformationBlock(context, config, position, margins, fontPtSize, phaseNum, fontData, laueGroupName, materialName); -} // namespace - } // namespace // ----------------------------------------------------------------------------- @@ -640,10 +496,6 @@ WritePoleFigure::WritePoleFigure(DataStructure& dataStructure, const IFilter::Me , m_ShouldCancel(shouldCancel) , m_MessageHandler(mesgHandler) { - // Initialize our fonts - fonts::Base64Decode(fonts::k_FiraSansRegularBase64, m_FiraSansRegular); - fonts::Base64Decode(fonts::k_LatoRegularBase64, m_LatoRegular); - fonts::Base64Decode(fonts::k_LatoBoldBase64, m_LatoBold); } // ----------------------------------------------------------------------------- @@ -865,206 +717,40 @@ Result<> WritePoleFigure::operator()() if(figures.size() == 3) { - const auto imageWidth = static_cast(config.imageDim); - const auto imageHeight = static_cast(config.imageDim); - const float32 fontPtSize = static_cast(imageHeight) / 16.0f; - const float32 margins = static_cast(imageHeight) / 32.0f; - - int32 pageWidth = 0; - auto pageHeight = static_cast(margins + fontPtSize); - - float32 xCharWidth = 0.0f; + // Build the composite configuration + ebsdlib::CompositePoleFigureConfiguration_t compositeConfig; + compositeConfig.eulers = subEulerAnglesPtr.get(); + compositeConfig.imageDim = m_InputValues->ImageSize; + compositeConfig.lambertDim = m_InputValues->LambertSize; + compositeConfig.numColors = m_InputValues->NumColors; + compositeConfig.minScale = config.minScale; + compositeConfig.maxScale = config.maxScale; + compositeConfig.sphereRadius = config.sphereRadius; + compositeConfig.discrete = config.discrete; + compositeConfig.discreteHeatMap = config.discreteHeatMap; + compositeConfig.colorMap = config.colorMap; + compositeConfig.labels = config.labels; + compositeConfig.order = config.order; + // flipFinalImage defaults to true in CompositePoleFigureConfiguration_t, + // matching the old behavior where flipAndMirror was always applied. + compositeConfig.layoutType = static_cast(m_InputValues->ImageLayout); + compositeConfig.laueOpsIndex = crystalStructures[phase]; + compositeConfig.phaseName = materialNames[phase]; + compositeConfig.phaseNumber = static_cast(phase); + compositeConfig.title = m_InputValues->Title; + + // Generate the composite pole figure image + ebsdlib::PoleFigureCompositor compositor; + ebsdlib::CompositePoleFigureResult compositeResult = compositor.generateCompositeImage(compositeConfig); + + if(compositeResult.image == nullptr) { - canvas_ity::canvas tempContext(m_InputValues->ImageSize, m_InputValues->ImageSize); - const std::array buf = {'X', 0}; - tempContext.set_font(m_LatoBold.data(), static_cast(m_LatoBold.size()), fontPtSize); - xCharWidth = tempContext.measure_text(buf.data()); + continue; } - // Each Pole Figure gets its own Square mini canvas to draw into. - const float32 subCanvasWidth = margins + static_cast(imageWidth) + xCharWidth + margins; - const float32 subCanvasHeight = margins + fontPtSize + static_cast(imageHeight) + fontPtSize * 2 + margins * 2; - std::vector> globalImageOrigins(4); - if(static_cast(m_InputValues->ImageLayout) == WritePoleFigure::LayoutType::Horizontal) - { - pageWidth = static_cast(subCanvasWidth) * 4; - pageHeight = pageHeight + static_cast(subCanvasHeight); - globalImageOrigins[0] = std::make_pair(0.0f, static_cast(pageHeight) - subCanvasHeight); - globalImageOrigins[1] = std::make_pair(subCanvasWidth, static_cast(pageHeight) - subCanvasHeight); - globalImageOrigins[2] = std::make_pair(subCanvasWidth * 2.0f, static_cast(pageHeight) - subCanvasHeight); - globalImageOrigins[3] = std::make_pair(subCanvasWidth * 3.0f, static_cast(pageHeight) - subCanvasHeight); - } - else if(static_cast(m_InputValues->ImageLayout) == WritePoleFigure::LayoutType::Vertical) - { - pageWidth = static_cast(subCanvasWidth); - pageHeight = pageHeight + static_cast(subCanvasHeight) * 4; - globalImageOrigins[0] = std::make_pair(0.0f, margins + fontPtSize); - globalImageOrigins[1] = std::make_pair(0.0f, margins + fontPtSize + subCanvasHeight * 1.0f); - globalImageOrigins[2] = std::make_pair(0.0f, margins + fontPtSize + subCanvasHeight * 2.0f); - globalImageOrigins[3] = std::make_pair(0.0f, margins + fontPtSize + subCanvasHeight * 3.0f); - } - else if(static_cast(m_InputValues->ImageLayout) == nx::core::WritePoleFigure::LayoutType::Square) - { - pageWidth = static_cast(subCanvasWidth) * 2; - pageHeight = pageHeight + static_cast(subCanvasHeight) * 2; - globalImageOrigins[0] = std::make_pair(0.0f, (static_cast(pageHeight) - 2.0f * subCanvasHeight)); // Upper Left - globalImageOrigins[1] = std::make_pair(subCanvasWidth, (static_cast(pageHeight) - 2.0f * subCanvasHeight)); // Upper Right - globalImageOrigins[2] = std::make_pair(0.0f, (static_cast(pageHeight) - subCanvasHeight)); // Lower Left - globalImageOrigins[3] = std::make_pair(subCanvasWidth, (static_cast(pageHeight) - subCanvasHeight)); // Lower Right - } - - // Create a Canvas to draw into - canvas_ity::canvas context(pageWidth, pageHeight); - - context.set_font(m_LatoBold.data(), static_cast(m_LatoBold.size()), fontPtSize); - context.set_color(canvas_ity::fill_style, 0.0f, 0.0f, 0.0f, 1.0f); - canvas_ity::baseline_style const baselines[] = {canvas_ity::alphabetic, canvas_ity::top, canvas_ity::middle, canvas_ity::bottom, canvas_ity::hanging, canvas_ity::ideographic}; - context.text_baseline = baselines[0]; - - // Fill the whole background with white - context.move_to(0.0f, 0.0f); - context.line_to(static_cast(pageWidth), 0.0f); - context.line_to(static_cast(pageWidth), static_cast(pageHeight)); - context.line_to(0.0f, static_cast(pageHeight)); - context.line_to(0.0f, 0.0f); - context.close_path(); - context.set_color(canvas_ity::fill_style, 1.0f, 1.0f, 1.0f, 1.0f); - context.fill(); - - std::vector compDims = {4ULL}; - for(int imageIndex = 0; imageIndex < figures.size(); imageIndex++) - { - figures[imageIndex] = flipAndMirrorPoleFigure(figures[imageIndex].get(), config); - figures[imageIndex] = convertColorOrder(figures[imageIndex].get(), config); - } + const int32 pageWidth = compositeResult.width; + const int32 pageHeight = compositeResult.height; - for(int i = 0; i < 3; i++) - { - std::array figureOrigin = {0.0f, 0.0f}; - std::tie(figureOrigin[0], figureOrigin[1]) = globalImageOrigins[i]; - context.draw_image(figures[i]->getPointer(0), imageWidth, imageHeight, imageWidth * figures[i]->getNumberOfComponents(), figureOrigin[0] + margins, - figureOrigin[1] + fontPtSize * 2.0f + margins * 2.0f, static_cast(imageWidth), static_cast(imageHeight)); - - // Draw an outline on the figure - context.begin_path(); - context.line_cap = canvas_ity::circle; - context.set_line_width(3.0f); - context.set_color(canvas_ity::stroke_style, 0.0f, 0.0f, 0.0f, 1.0f); - context.arc(figureOrigin[0] + margins + static_cast(m_InputValues->ImageSize) / 2.0f, - figureOrigin[1] + fontPtSize * 2.0f + margins * 2.0f + static_cast(m_InputValues->ImageSize) / 2.0f, static_cast(m_InputValues->ImageSize) / 2.0f, 0, - nx::core::Constants::k_2Pi); - context.stroke(); - context.close_path(); - - // Draw the X Axis lines - context.begin_path(); - context.line_cap = canvas_ity::square; - context.set_line_width(2.0f); - context.set_color(canvas_ity::stroke_style, 0.0f, 0.0f, 0.0f, 1.0f); - context.move_to(figureOrigin[0] + margins, figureOrigin[1] + fontPtSize * 2.0f + margins * 2.0f + static_cast(m_InputValues->ImageSize) / 2.0f); - context.line_to(figureOrigin[0] + margins + static_cast(m_InputValues->ImageSize), - figureOrigin[1] + fontPtSize * 2.0f + margins * 2.0f + static_cast(m_InputValues->ImageSize) / 2.0f); - context.stroke(); - context.close_path(); - - // Draw the Y Axis lines - context.begin_path(); - context.line_cap = canvas_ity::square; - context.set_line_width(2.0f); - context.set_color(canvas_ity::stroke_style, 0.0f, 0.0f, 0.0f, 1.0f); - context.move_to(figureOrigin[0] + margins + static_cast(m_InputValues->ImageSize) / 2.0f, figureOrigin[1] + fontPtSize * 2.0f + margins * 2.0f); - context.line_to(figureOrigin[0] + margins + static_cast(m_InputValues->ImageSize) / 2.0f, - figureOrigin[1] + fontPtSize * 2.0f + margins * 2.0f + static_cast(m_InputValues->ImageSize)); - context.stroke(); - context.close_path(); - - // Draw X Axis Label - context.begin_path(); - context.set_font(m_LatoBold.data(), static_cast(m_LatoBold.size()), fontPtSize); - context.set_color(canvas_ity::fill_style, 0.0f, 0.0f, 0.0f, 1.0f); - context.text_baseline = baselines[0]; - context.fill_text("X", figureOrigin[0] + margins * 2.0f + static_cast(m_InputValues->ImageSize), - figureOrigin[1] + fontPtSize * 2.25f + margins * 2.0f + static_cast(m_InputValues->ImageSize) / 2.0f); - context.close_path(); - - // Draw Y Axis Label - context.begin_path(); - context.set_font(m_LatoBold.data(), static_cast(m_LatoBold.size()), fontPtSize); - context.set_color(canvas_ity::fill_style, 0.0f, 0.0f, 0.0f, 1.0f); - context.text_baseline = baselines[0]; - const float yFontWidth = context.measure_text("Y"); - context.fill_text("Y", figureOrigin[0] + margins - (0.5f * yFontWidth) + static_cast(m_InputValues->ImageSize) / 2.0f, figureOrigin[1] + fontPtSize * 2.0f + margins); - context.close_path(); - - // Draw the figure subtitle. This is usually the direction or plane family - std::string figureSubtitle = figures[i]->getName(); - figureSubtitle = nx::core::StringUtilities::replace(figureSubtitle, "<", "("); - figureSubtitle = nx::core::StringUtilities::replace(figureSubtitle, ">", ")"); - std::string bottomPart; - std::array textOrigin = {figureOrigin[0] + margins, figureOrigin[1] + fontPtSize + 2 * margins}; - for(size_t idx = 0; idx < figureSubtitle.size(); idx++) - { - if(figureSubtitle.at(idx) == '-') - { - const char charBuf[] = {figureSubtitle[idx + 1], 0}; - context.set_font(m_FiraSansRegular.data(), static_cast(m_FiraSansRegular.size()), fontPtSize); - float tw = 0.0f; - if(!bottomPart.empty()) - { - tw = context.measure_text(bottomPart.c_str()); - } - const float charWidth = context.measure_text(charBuf); - const float dashWidth = charWidth * 0.5f; - const float dashOffset = charWidth * 0.25f; - - context.begin_path(); - context.line_cap = canvas_ity::square; - context.set_line_width(2.0f); - context.set_color(canvas_ity::stroke_style, 0.0f, 0.0f, 0.0f, 1.0f); - context.move_to(textOrigin[0] + tw + dashOffset, textOrigin[1] - (0.8f * fontPtSize)); - context.line_to(textOrigin[0] + tw + dashOffset + dashWidth, textOrigin[1] - (0.8f * fontPtSize)); - context.stroke(); - context.close_path(); - } - else - { - bottomPart.push_back(figureSubtitle.at(idx)); - } - } - - // Draw the Direction subtitle text - context.begin_path(); - context.set_font(m_FiraSansRegular.data(), static_cast(m_FiraSansRegular.size()), fontPtSize); - context.set_color(canvas_ity::fill_style, 0.0f, 0.0f, 0.0f, 1.0f); - context.text_baseline = baselines[0]; - context.fill_text(bottomPart.c_str(), textOrigin[0], textOrigin[1]); - context.close_path(); - } - - // Draw the title onto the canvas - context.set_font(m_LatoBold.data(), static_cast(m_LatoBold.size()), fontPtSize); - context.set_color(canvas_ity::fill_style, 0.0f, 0.0f, 0.0f, 1.0f); - context.text_baseline = baselines[0]; - context.fill_text(m_InputValues->Title.c_str(), margins, margins + fontPtSize); - - std::vector laueNames = ebsdlib::LaueOps::GetLaueNames(); - const uint32_t laueIndex = crystalStructures[phase]; - const std::string materialName = materialNames[phase]; - - // Now draw the Color Scalar Bar if needed. - if(config.discrete) - { - drawInformationBlock(context, config, globalImageOrigins[3], margins, static_cast(imageHeight) / 20.0f, static_cast(phase), m_LatoRegular, laueNames[laueIndex], - materialName); - } - else - { - drawScalarBar(context, config, globalImageOrigins[3], margins, static_cast(imageHeight) / 20.0f, static_cast(phase), m_LatoRegular, laueNames[laueIndex], materialName); - } - - // Fetch the rendered RGBA pixels from the entire canvas. - std::vector rgbaCanvasImage(static_cast(pageHeight * pageWidth * 4)); - context.get_image_data(rgbaCanvasImage.data(), pageWidth, pageHeight, pageWidth * 4, 0, 0); if(m_InputValues->SaveAsImageGeometry) { // Ensure the final Image Geometry is sized correctly. @@ -1081,17 +767,16 @@ Result<> WritePoleFigure::operator()() return arrayCreationResult; } - // Get a reference to the RGB final array and then copy ONLY the RGB pixels from the - // canvas RGBA data. + // Get a reference to the RGB final array and then copy ONLY the RGB pixels from the RGBA data. auto& imageData = m_DataStructure.getDataRefAs(imageArrayPath); - imageData.fill(0); - size_t tupleCount = pageHeight * pageWidth; + const size_t tupleCount = static_cast(pageHeight) * pageWidth; + const uint8_t* rgbaPtr = compositeResult.image->getPointer(0); for(size_t t = 0; t < tupleCount; t++) { - imageData[t * 3 + 0] = rgbaCanvasImage[t * 4 + 0]; - imageData[t * 3 + 1] = rgbaCanvasImage[t * 4 + 1]; - imageData[t * 3 + 2] = rgbaCanvasImage[t * 4 + 2]; + imageData[t * 3 + 0] = rgbaPtr[t * 4 + 0]; + imageData[t * 3 + 1] = rgbaPtr[t * 4 + 1]; + imageData[t * 3 + 2] = rgbaPtr[t * 4 + 2]; } } @@ -1099,7 +784,7 @@ Result<> WritePoleFigure::operator()() if(m_InputValues->WriteImageToDisk) { const std::string filename = fmt::format("{}/{}{}.tiff", m_InputValues->OutputPath.string(), m_InputValues->ImagePrefix, phase); - auto result = TiffWriter::WriteImage(filename, pageWidth, pageHeight, 4, rgbaCanvasImage.data()); + auto result = TiffWriter::WriteImage(filename, pageWidth, pageHeight, 4, compositeResult.image->getPointer(0)); if(result.first < 0) { return MakeErrorResult(-53900, fmt::format("Error writing pole figure image '{}' to disk.\n Error Code from Tiff Writer: {}\n Message: {}", filename, result.first, result.second)); diff --git a/src/Plugins/OrientationAnalysis/src/OrientationAnalysis/Filters/Algorithms/WritePoleFigure.hpp b/src/Plugins/OrientationAnalysis/src/OrientationAnalysis/Filters/Algorithms/WritePoleFigure.hpp index 57dde873d3..44315b51e6 100644 --- a/src/Plugins/OrientationAnalysis/src/OrientationAnalysis/Filters/Algorithms/WritePoleFigure.hpp +++ b/src/Plugins/OrientationAnalysis/src/OrientationAnalysis/Filters/Algorithms/WritePoleFigure.hpp @@ -99,10 +99,6 @@ class ORIENTATIONANALYSIS_EXPORT WritePoleFigure const WritePoleFigureInputValues* m_InputValues = nullptr; const std::atomic_bool& m_ShouldCancel; const IFilter::MessageHandler& m_MessageHandler; - - std::vector m_FiraSansRegular; - std::vector m_LatoRegular; - std::vector m_LatoBold; }; } // namespace nx::core diff --git a/src/Plugins/OrientationAnalysis/test/CMakeLists.txt b/src/Plugins/OrientationAnalysis/test/CMakeLists.txt index 5ba060ddbd..5436f63afe 100644 --- a/src/Plugins/OrientationAnalysis/test/CMakeLists.txt +++ b/src/Plugins/OrientationAnalysis/test/CMakeLists.txt @@ -148,7 +148,7 @@ if(EXISTS "${DREAM3D_DATA_DIR}" AND SIMPLNX_DOWNLOAD_TEST_FILES) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME H5Oina_Test_Data.tar.gz SHA512 346573ac6b96983680078e8b0a401aa25bd9302dff382ca86ae4e503ded6db3947c4c5611ee603db519d8a8dc6ed35b044a7bfea9880fade5ab54479d140ea03 ) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME INL_writer.tar.gz SHA512 7d723351e51e84540abfbc38e69a6014852ba34808f9d216a27063a616bcfbd5eb708405305fd83334e48c9ca133d3d0be797c05040e4a115cc612e385d9ada6) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME neighbor_orientation_correlation.tar.gz SHA512 122367452174ade2f24dde7a4610bddc4f147a223722d9b30c1df9eaa2cd2bf25e1c7957aba83f3f9de79b4eadd79339b848f9530d1ebf44c69244ea5442cf85) - download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME PoleFigure_Exemplars_v4.tar.gz SHA512 86235279c61ac40405ec00d74703855aa84f7985114dfe4f7bb14a84a73f59092df3f5c087220ceb62325186dfaa08d843ec86dd0710800e376d95e4047cefbe) + download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME PoleFigure_Exemplars_v5.tar.gz SHA512 a092b02a734ac706143c1c9ded0206f141b1f8a1359621e0bbfdbc8b4188ccc075151405d1c931292e9d9952e428877f14196e751f82a3c1cdbf734366ea1293) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME read_ang_test.tar.gz SHA512 de7cd89d925da01f291f44686964ec89d469659d0005219f9869afe26b8f62af278461ac3f5deb3afe7f3e65ec074ab3a1357d77a1a5f92eb3a1ea8cc5e4b236) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME segment_features_test_data.tar.gz SHA512 317d69384330d40c673f8e1a42df003dede5ac85331b2549e9f45467f7af6b74284f8dad1120427690719ebcd5066830e17031533381cc2cc0cc8622a422b914) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME Small_IN100_Ang_Files.tar.gz SHA512 79e9f6948d4e8e06187e11216a67596fa786ffd2700e51f594ad014090383eb8bcc003e14de2e88082aa9ae512cc4fc9cee22c80066fc54f38c3ebc75267eb5b) diff --git a/src/Plugins/OrientationAnalysis/test/WritePoleFigureTest.cpp b/src/Plugins/OrientationAnalysis/test/WritePoleFigureTest.cpp index d0fd8196f8..cee6a35fec 100644 --- a/src/Plugins/OrientationAnalysis/test/WritePoleFigureTest.cpp +++ b/src/Plugins/OrientationAnalysis/test/WritePoleFigureTest.cpp @@ -1,4 +1,3 @@ - #include #include "simplnx/Parameters/ArraySelectionParameter.hpp" @@ -22,7 +21,7 @@ using namespace nx::core::UnitTest; namespace { -const std::string k_ImagePrefix("fw-ar-IF1-aptr12-corr Discrete Pole Figure"); +const std::string k_ImagePrefix("Discrete Pole Figure"); template void CompareComponentsOfArrays(const DataStructure& dataStructure, const DataPath& exemplaryDataPath, const DataPath& computedPath, usize compIndex) @@ -39,9 +38,6 @@ void CompareComponentsOfArrays(const DataStructure& dataStructure, const DataPat usize exemplaryNumComp = exemplaryDataArray.getNumberOfComponents(); usize generatedNumComp = generatedDataArray.getNumberOfComponents(); - REQUIRE(exemplaryNumComp == 3); - REQUIRE(generatedNumComp == 3); - REQUIRE(compIndex < exemplaryNumComp); REQUIRE(compIndex < generatedNumComp); @@ -61,14 +57,14 @@ void CompareComponentsOfArrays(const DataStructure& dataStructure, const DataPat } // namespace -TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-1", "[OrientationAnalysis][WritePoleFigureFilter]") +TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-Discrete", "[OrientationAnalysis][WritePoleFigureFilter]") { UnitTest::LoadPlugins(); - const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "PoleFigure_Exemplars_v4.tar.gz", "PoleFigure_Exemplars_v4"); + const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "PoleFigure_Exemplars_v5.tar.gz", "PoleFigure_Exemplars_v5", true, true); - // Read the Small IN100 Data set - auto baseDataFilePath = fs::path(fmt::format("{}/PoleFigure_Exemplars_v4/fw-ar-IF1-aptr12-corr.dream3d", unit_test::k_TestFilesDir)); + // Read the test data + auto baseDataFilePath = fs::path(fmt::format("{}/PoleFigure_Exemplars_v5/PoleFigure_Exemplars_v5.dream3d", unit_test::k_TestFilesDir)); DataStructure dataStructure = UnitTest::LoadDataStructure(baseDataFilePath); // Instantiate the filter, a DataStructure object and an Arguments Object @@ -76,7 +72,7 @@ TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-1", "[OrientationAnalysis] Arguments args; // Create default Parameters for the filter. - args.insertOrAssign(WritePoleFigureFilter::k_Title_Key, std::make_any("fw-ar-IF1-aptr12-corr Discrete Pole Figure")); + args.insertOrAssign(WritePoleFigureFilter::k_Title_Key, std::make_any("Discrete Pole Figure")); args.insertOrAssign(WritePoleFigureFilter::k_LambertSize_Key, std::make_any(64)); args.insertOrAssign(WritePoleFigureFilter::k_NumColors_Key, std::make_any(32)); args.insertOrAssign(WritePoleFigureFilter::k_GenerationAlgorithm_Key, std::make_any(1)); @@ -87,10 +83,10 @@ TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-1", "[OrientationAnalysis] args.insertOrAssign(WritePoleFigureFilter::k_SaveAsImageGeometry_Key, std::make_any(true)); args.insertOrAssign(WritePoleFigureFilter::k_WriteImageToDisk, std::make_any(true)); args.insertOrAssign(WritePoleFigureFilter::k_UseMask_Key, std::make_any(false)); - args.insertOrAssign(WritePoleFigureFilter::k_ImageGeometryPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr Discrete Pole Figure [CALCULATED]"}))); - - DataPath calculatedImageData({"fw-ar-IF1-aptr12-corr Discrete Pole Figure [CALCULATED]", "Cell Data", fmt::format("Phase_{}", 1)}); - DataPath exemplarImageData({"fw-ar-IF1-aptr12-corr Discrete Pole Figure", "Cell Data", "Phase_1"}); + args.insertOrAssign(WritePoleFigureFilter::k_ImageGeometryPath_Key, std::make_any(DataPath({"Discrete Pole Figure [CALCULATED]"}))); + args.insertOrAssign(WritePoleFigureFilter::k_SaveIntensityDataArrays, std::make_any(true)); + args.insertOrAssign(WritePoleFigureFilter::k_IntensityGeometryPath, std::make_any(DataPath({"Discrete Count MRD [CALCULATED]"}))); + args.insertOrAssign(WritePoleFigureFilter::k_NormalizeToMRD, std::make_any(true)); args.insertOrAssign(WritePoleFigureFilter::k_CellEulerAnglesArrayPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr", "Cell Data", "EulerAngles"}))); args.insertOrAssign(WritePoleFigureFilter::k_CellPhasesArrayPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr", "Cell Data", "Phases"}))); @@ -106,24 +102,45 @@ TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-1", "[OrientationAnalysis] auto executeResult = filter.execute(dataStructure, args); SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); #ifdef SIMPLNX_WRITE_TEST_OUTPUT - WriteTestDataStructure(dataStructure, fmt::format("{}/write_pole_figure-1.dream3d", unit_test::k_BinaryTestOutputDir)); + WriteTestDataStructure(dataStructure, fmt::format("{}/write_pole_figure-Discrete.dream3d", unit_test::k_BinaryTestOutputDir)); #endif - CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); - CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 1); - CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 2); + { + DataPath calculatedImageData({"Discrete Pole Figure [CALCULATED]", "Cell Data", fmt::format("Phase_{}", 1)}); + DataPath exemplarImageData({"Discrete Pole Figure", "Cell Data", "Phase_1"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 1); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 2); + } + + { + DataPath calculatedImageData({"Discrete Count MRD", "Cell Data", "Phase_1_<001>"}); + DataPath exemplarImageData({"Discrete Count MRD [CALCULATED]", "Cell Data", "Phase_1_<001>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } + + { + DataPath calculatedImageData({"Discrete Count MRD", "Cell Data", "Phase_1_<011>"}); + DataPath exemplarImageData({"Discrete Count MRD [CALCULATED]", "Cell Data", "Phase_1_<011>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } + { + DataPath calculatedImageData({"Discrete Count MRD", "Cell Data", "Phase_1_<111>"}); + DataPath exemplarImageData({"Discrete Count MRD [CALCULATED]", "Cell Data", "Phase_1_<111>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } UnitTest::CheckArraysInheritTupleDims(dataStructure); } -TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-2", "[OrientationAnalysis][WritePoleFigureFilter]") +TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-Discrete-Masked", "[OrientationAnalysis][WritePoleFigureFilter]") { UnitTest::LoadPlugins(); - const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "PoleFigure_Exemplars_v4.tar.gz", "PoleFigure_Exemplars_v4"); + const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "PoleFigure_Exemplars_v5.tar.gz", "PoleFigure_Exemplars_v5", true, true); - // Read the Small IN100 Data set - auto baseDataFilePath = fs::path(fmt::format("{}/PoleFigure_Exemplars_v4/fw-ar-IF1-aptr12-corr.dream3d", unit_test::k_TestFilesDir)); + // Read the test data + auto baseDataFilePath = fs::path(fmt::format("{}/PoleFigure_Exemplars_v5/PoleFigure_Exemplars_v5.dream3d", unit_test::k_TestFilesDir)); DataStructure dataStructure = UnitTest::LoadDataStructure(baseDataFilePath); // Instantiate the filter, a DataStructure object and an Arguments Object @@ -131,7 +148,7 @@ TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-2", "[OrientationAnalysis] Arguments args; // Create default Parameters for the filter. - args.insertOrAssign(WritePoleFigureFilter::k_Title_Key, std::make_any("fw-ar-IF1-aptr12-corr Discrete Pole Figure Masked")); + args.insertOrAssign(WritePoleFigureFilter::k_Title_Key, std::make_any("Discrete Pole Figure Masked")); args.insertOrAssign(WritePoleFigureFilter::k_LambertSize_Key, std::make_any(64)); args.insertOrAssign(WritePoleFigureFilter::k_NumColors_Key, std::make_any(32)); args.insertOrAssign(WritePoleFigureFilter::k_GenerationAlgorithm_Key, std::make_any(1)); @@ -142,10 +159,85 @@ TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-2", "[OrientationAnalysis] args.insertOrAssign(WritePoleFigureFilter::k_SaveAsImageGeometry_Key, std::make_any(true)); args.insertOrAssign(WritePoleFigureFilter::k_WriteImageToDisk, std::make_any(true)); args.insertOrAssign(WritePoleFigureFilter::k_UseMask_Key, std::make_any(true)); - args.insertOrAssign(WritePoleFigureFilter::k_ImageGeometryPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr Discrete Pole Figure Masked [CALCULATED]"}))); + args.insertOrAssign(WritePoleFigureFilter::k_ImageGeometryPath_Key, std::make_any(DataPath({"Discrete Pole Figure Masked [CALCULATED]"}))); + args.insertOrAssign(WritePoleFigureFilter::k_SaveIntensityDataArrays, std::make_any(true)); + args.insertOrAssign(WritePoleFigureFilter::k_IntensityGeometryPath, std::make_any(DataPath({"Discrete Count MRD Masked [CALCULATED]"}))); + args.insertOrAssign(WritePoleFigureFilter::k_NormalizeToMRD, std::make_any(true)); + + args.insertOrAssign(WritePoleFigureFilter::k_CellEulerAnglesArrayPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr", "Cell Data", "EulerAngles"}))); + args.insertOrAssign(WritePoleFigureFilter::k_CellPhasesArrayPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr", "Cell Data", "Phases"}))); + args.insertOrAssign(WritePoleFigureFilter::k_MaskArrayPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr", "Cell Data", "Mask"}))); + args.insertOrAssign(WritePoleFigureFilter::k_CrystalStructuresArrayPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr", "CellEnsembleData", "CrystalStructures"}))); + args.insertOrAssign(WritePoleFigureFilter::k_MaterialNameArrayPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr", "CellEnsembleData", "MaterialName"}))); + + // Preflight the filter and check result + auto preflightResult = filter.preflight(dataStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); + + // Execute the filter and check the result + auto executeResult = filter.execute(dataStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); + +#ifdef SIMPLNX_WRITE_TEST_OUTPUT + WriteTestDataStructure(dataStructure, fmt::format("{}/write_pole_figure-Discrete-Masked.dream3d", unit_test::k_BinaryTestOutputDir)); +#endif + { + DataPath calculatedImageData({"Discrete Pole Figure Masked [CALCULATED]", "Cell Data", fmt::format("Phase_{}", 1)}); + DataPath exemplarImageData({"Discrete Pole Figure Masked", "Cell Data", "Phase_1"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 1); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 2); + } + + { + DataPath calculatedImageData({"Discrete Count MRD Masked", "Cell Data", "Phase_1_<001>"}); + DataPath exemplarImageData({"Discrete Count MRD Masked [CALCULATED]", "Cell Data", "Phase_1_<001>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } + + { + DataPath calculatedImageData({"Discrete Count MRD Masked", "Cell Data", "Phase_1_<011>"}); + DataPath exemplarImageData({"Discrete Count MRD Masked [CALCULATED]", "Cell Data", "Phase_1_<011>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } + { + DataPath calculatedImageData({"Discrete Count MRD Masked", "Cell Data", "Phase_1_<111>"}); + DataPath exemplarImageData({"Discrete Count MRD Masked [CALCULATED]", "Cell Data", "Phase_1_<111>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } + UnitTest::CheckArraysInheritTupleDims(dataStructure); +} - DataPath calculatedImageData({"fw-ar-IF1-aptr12-corr Discrete Pole Figure Masked [CALCULATED]", "Cell Data", fmt::format("Phase_{}", 1)}); - DataPath exemplarImageData({"fw-ar-IF1-aptr12-corr Discrete Pole Figure Masked", "Cell Data", "Phase_1"}); +TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-Color", "[OrientationAnalysis][WritePoleFigureFilter]") +{ + UnitTest::LoadPlugins(); + + const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "PoleFigure_Exemplars_v5.tar.gz", "PoleFigure_Exemplars_v5", true, true); + + // Read the test data + auto baseDataFilePath = fs::path(fmt::format("{}/PoleFigure_Exemplars_v5/PoleFigure_Exemplars_v5.dream3d", unit_test::k_TestFilesDir)); + DataStructure dataStructure = UnitTest::LoadDataStructure(baseDataFilePath); + + // Instantiate the filter, a DataStructure object and an Arguments Object + WritePoleFigureFilter filter; + Arguments args; + + // Create default Parameters for the filter. + args.insertOrAssign(WritePoleFigureFilter::k_Title_Key, std::make_any("Color Pole Figure")); + args.insertOrAssign(WritePoleFigureFilter::k_LambertSize_Key, std::make_any(64)); + args.insertOrAssign(WritePoleFigureFilter::k_NumColors_Key, std::make_any(32)); + args.insertOrAssign(WritePoleFigureFilter::k_GenerationAlgorithm_Key, std::make_any(0)); + args.insertOrAssign(WritePoleFigureFilter::k_ImageLayout_Key, std::make_any(0)); + args.insertOrAssign(WritePoleFigureFilter::k_OutputPath_Key, std::make_any(fs::path(fmt::format("{}/Dir1/Dir2", unit_test::k_BinaryTestOutputDir)))); + args.insertOrAssign(WritePoleFigureFilter::k_ImagePrefix_Key, std::make_any(k_ImagePrefix)); + args.insertOrAssign(WritePoleFigureFilter::k_ImageSize_Key, std::make_any(1024)); + args.insertOrAssign(WritePoleFigureFilter::k_SaveAsImageGeometry_Key, std::make_any(true)); + args.insertOrAssign(WritePoleFigureFilter::k_WriteImageToDisk, std::make_any(true)); + args.insertOrAssign(WritePoleFigureFilter::k_UseMask_Key, std::make_any(false)); + args.insertOrAssign(WritePoleFigureFilter::k_ImageGeometryPath_Key, std::make_any(DataPath({"Color Pole Figure [CALCULATED]"}))); + args.insertOrAssign(WritePoleFigureFilter::k_SaveIntensityDataArrays, std::make_any(true)); + args.insertOrAssign(WritePoleFigureFilter::k_IntensityGeometryPath, std::make_any(DataPath({"Color Count MRD [CALCULATED]"}))); + args.insertOrAssign(WritePoleFigureFilter::k_NormalizeToMRD, std::make_any(true)); args.insertOrAssign(WritePoleFigureFilter::k_CellEulerAnglesArrayPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr", "Cell Data", "EulerAngles"}))); args.insertOrAssign(WritePoleFigureFilter::k_CellPhasesArrayPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr", "Cell Data", "Phases"}))); @@ -162,24 +254,45 @@ TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-2", "[OrientationAnalysis] SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); #ifdef SIMPLNX_WRITE_TEST_OUTPUT - WriteTestDataStructure(dataStructure, fmt::format("{}/write_pole_figure-2.dream3d", unit_test::k_BinaryTestOutputDir)); + WriteTestDataStructure(dataStructure, fmt::format("{}/write_pole_figure-Color.dream3d", unit_test::k_BinaryTestOutputDir)); #endif + { + DataPath calculatedImageData({"Color Pole Figure [CALCULATED]", "Cell Data", fmt::format("Phase_{}", 1)}); + DataPath exemplarImageData({"Color Pole Figure", "Cell Data", "Phase_1"}); + + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 1); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 2); + } - CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); - CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 1); - CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 2); + { + DataPath calculatedImageData({"Color Count MRD", "Cell Data", "Phase_1_<001>"}); + DataPath exemplarImageData({"Color Count MRD [CALCULATED]", "Cell Data", "Phase_1_<001>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } + { + DataPath calculatedImageData({"Color Count MRD", "Cell Data", "Phase_1_<011>"}); + DataPath exemplarImageData({"Color Count MRD [CALCULATED]", "Cell Data", "Phase_1_<011>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } + + { + DataPath calculatedImageData({"Color Count MRD", "Cell Data", "Phase_1_<111>"}); + DataPath exemplarImageData({"Color Count MRD [CALCULATED]", "Cell Data", "Phase_1_<111>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } UnitTest::CheckArraysInheritTupleDims(dataStructure); } -TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-3", "[OrientationAnalysis][WritePoleFigureFilter]") +TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-Color-Masked", "[OrientationAnalysis][WritePoleFigureFilter]") { UnitTest::LoadPlugins(); - const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "PoleFigure_Exemplars_v4.tar.gz", "PoleFigure_Exemplars_v4"); + const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "PoleFigure_Exemplars_v5.tar.gz", "PoleFigure_Exemplars_v5", true, true); - // Read the Small IN100 Data set - auto baseDataFilePath = fs::path(fmt::format("{}/PoleFigure_Exemplars_v4/fw-ar-IF1-aptr12-corr.dream3d", unit_test::k_TestFilesDir)); + // Read the test data + auto baseDataFilePath = fs::path(fmt::format("{}/PoleFigure_Exemplars_v5/PoleFigure_Exemplars_v5.dream3d", unit_test::k_TestFilesDir)); DataStructure dataStructure = UnitTest::LoadDataStructure(baseDataFilePath); // Instantiate the filter, a DataStructure object and an Arguments Object @@ -187,7 +300,7 @@ TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-3", "[OrientationAnalysis] Arguments args; // Create default Parameters for the filter. - args.insertOrAssign(WritePoleFigureFilter::k_Title_Key, std::make_any("fw-ar-IF1-aptr12-corr Pole Figure Masked Color")); + args.insertOrAssign(WritePoleFigureFilter::k_Title_Key, std::make_any("Color Pole Figure Masked")); args.insertOrAssign(WritePoleFigureFilter::k_LambertSize_Key, std::make_any(64)); args.insertOrAssign(WritePoleFigureFilter::k_NumColors_Key, std::make_any(32)); args.insertOrAssign(WritePoleFigureFilter::k_GenerationAlgorithm_Key, std::make_any(0)); @@ -198,10 +311,10 @@ TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-3", "[OrientationAnalysis] args.insertOrAssign(WritePoleFigureFilter::k_SaveAsImageGeometry_Key, std::make_any(true)); args.insertOrAssign(WritePoleFigureFilter::k_WriteImageToDisk, std::make_any(true)); args.insertOrAssign(WritePoleFigureFilter::k_UseMask_Key, std::make_any(true)); - args.insertOrAssign(WritePoleFigureFilter::k_ImageGeometryPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr Pole Figure Masked Color [CALCULATED]"}))); - - DataPath calculatedImageData({"fw-ar-IF1-aptr12-corr Pole Figure Masked Color [CALCULATED]", "Cell Data", fmt::format("Phase_{}", 1)}); - DataPath exemplarImageData({"fw-ar-IF1-aptr12-corr Pole Figure Masked Color", "Cell Data", "Phase_1"}); + args.insertOrAssign(WritePoleFigureFilter::k_ImageGeometryPath_Key, std::make_any(DataPath({"Color Pole Figure Masked [CALCULATED]"}))); + args.insertOrAssign(WritePoleFigureFilter::k_SaveIntensityDataArrays, std::make_any(true)); + args.insertOrAssign(WritePoleFigureFilter::k_IntensityGeometryPath, std::make_any(DataPath({"Color Count MRD Masked [CALCULATED]"}))); + args.insertOrAssign(WritePoleFigureFilter::k_NormalizeToMRD, std::make_any(true)); args.insertOrAssign(WritePoleFigureFilter::k_CellEulerAnglesArrayPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr", "Cell Data", "EulerAngles"}))); args.insertOrAssign(WritePoleFigureFilter::k_CellPhasesArrayPath_Key, std::make_any(DataPath({"fw-ar-IF1-aptr12-corr", "Cell Data", "Phases"}))); @@ -218,12 +331,33 @@ TEST_CASE("OrientationAnalysis::WritePoleFigureFilter-3", "[OrientationAnalysis] SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); #ifdef SIMPLNX_WRITE_TEST_OUTPUT - WriteTestDataStructure(dataStructure, fmt::format("{}/write_pole_figure-3.dream3d", unit_test::k_BinaryTestOutputDir)); + WriteTestDataStructure(dataStructure, fmt::format("{}/write_pole_figure-Color-Masked.dream3d", unit_test::k_BinaryTestOutputDir)); #endif + { + DataPath calculatedImageData({"Color Pole Figure Masked [CALCULATED]", "Cell Data", fmt::format("Phase_{}", 1)}); + DataPath exemplarImageData({"Color Pole Figure Masked", "Cell Data", "Phase_1"}); + + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 1); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 2); + } + + { + DataPath calculatedImageData({"Color Count MRD Masked", "Cell Data", "Phase_1_<001>"}); + DataPath exemplarImageData({"Color Count MRD Masked [CALCULATED]", "Cell Data", "Phase_1_<001>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } - CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); - CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 1); - CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 2); + { + DataPath calculatedImageData({"Color Count MRD Masked", "Cell Data", "Phase_1_<011>"}); + DataPath exemplarImageData({"Color Count MRD Masked [CALCULATED]", "Cell Data", "Phase_1_<011>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } + { + DataPath calculatedImageData({"Color Count MRD Masked", "Cell Data", "Phase_1_<111>"}); + DataPath exemplarImageData({"Color Count MRD Masked [CALCULATED]", "Cell Data", "Phase_1_<111>"}); + CompareComponentsOfArrays(dataStructure, exemplarImageData, calculatedImageData, 0); + } UnitTest::CheckArraysInheritTupleDims(dataStructure); }