Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
de1e9e9
ENH: Add a helper that checks DataArray tuple counts against grid cells
imikejackson Oct 19, 2026
312a3e2
BUG: AddBadData checks that its cell inputs have one tuple per cell
imikejackson Oct 19, 2026
4275b92
BUG: AlignSectionsFeatureCentroid checks that its cell inputs have on…
imikejackson Oct 19, 2026
2124a20
BUG: ComputeBoundingBoxStats checks that its cell inputs have one tup…
imikejackson Oct 19, 2026
f6a20dd
BUG: ComputeEuclideanDistMap checks that its cell inputs have one tup…
imikejackson Oct 19, 2026
44215ef
BUG: ComputeFeatureCentroids checks that its cell inputs have one tup…
imikejackson Oct 19, 2026
7cec596
BUG: ComputeFeatureNeighbors checks that its cell inputs have one tup…
imikejackson Oct 19, 2026
3bb1dc1
BUG: ComputeFeatureSizes checks that its cell inputs have one tuple p…
imikejackson Oct 19, 2026
94a545b
BUG: ComputeMomentInvariants2D checks that its cell inputs have one t…
imikejackson Oct 19, 2026
1ed147d
BUG: ComputeShapes checks that its cell inputs have one tuple per cell
imikejackson Oct 19, 2026
2ca9be9
BUG: ComputeSurfaceFeatures checks that its cell inputs have one tupl…
imikejackson Oct 19, 2026
7bf1426
BUG: ErodeDilateMask checks that its cell inputs have one tuple per cell
imikejackson Oct 19, 2026
95a111b
BUG: ExtractFeatureBoundaries2D checks that its cell inputs have one …
imikejackson Oct 19, 2026
e82941f
BUG: FlyingEdges3D checks that its cell inputs have one tuple per cell
imikejackson Oct 19, 2026
2406313
BUG: IdentifySample checks that its cell inputs have one tuple per cell
imikejackson Oct 19, 2026
1b3b38d
BUG: InitializeImageGeomCellData checks that its cell inputs have one…
imikejackson Oct 19, 2026
5bbf2dc
BUG: M3CSurfaceMeshing checks that its cell inputs have one tuple per…
imikejackson Oct 19, 2026
7eb3182
BUG: NearestPointFuseRegularGrids checks that its cell inputs have on…
imikejackson Oct 19, 2026
c902328
BUG: PartitionGeometry checks that its cell inputs have one tuple per…
imikejackson Oct 19, 2026
953ed3a
BUG: ReplaceElementAttributesWithNeighborValues checks that its cell …
imikejackson Oct 19, 2026
3a9752e
BUG: ScalarSegmentFeatures checks that its cell inputs have one tuple…
imikejackson Oct 19, 2026
01836b7
BUG: WriteAbaqusHexahedron checks that its cell inputs have one tuple…
imikejackson Oct 19, 2026
3440b7d
BUG: WriteAvizoRectilinearCoordinate checks that its cell inputs have…
imikejackson Oct 19, 2026
8e1cd3e
BUG: WriteAvizoUniformCoordinate checks that its cell inputs have one…
imikejackson Oct 19, 2026
a4c776a
BUG: WriteLosAlamosFFT checks that its cell inputs have one tuple per…
imikejackson Oct 19, 2026
06bf6f9
BUG: WriteSPParksSites checks that its cell inputs have one tuple per…
imikejackson Oct 19, 2026
42e3a20
BUG: AlignSectionsMisorientation checks that its cell inputs have one…
imikejackson Oct 19, 2026
c7802f1
BUG: AlignSectionsMutualInformation checks that its cell inputs have …
imikejackson Oct 19, 2026
c90da1a
BUG: BadDataNeighborOrientationCheck checks that its cell inputs have…
imikejackson Oct 19, 2026
20b930e
BUG: ComputeFeatureReferenceCAxisMisorientations checks that its cell…
imikejackson Oct 19, 2026
b0e615f
BUG: ComputeKernelAvgMisorientations checks that its cell inputs have…
imikejackson Oct 19, 2026
31e5323
BUG: NeighborOrientationCorrelation checks that its cell inputs have …
imikejackson Oct 19, 2026
87540fd
BUG: WriteINLFile checks that its cell inputs have one tuple per cell
imikejackson Oct 19, 2026
4f9ce30
BUG: InitializeImageGeomCellData accepts any tuple shape with one tup…
imikejackson Oct 19, 2026
0f18e5e
TEST: Tighten the tuple-count tests and restore masked dimension tests
imikejackson Oct 19, 2026
72c5750
STYLE: Follow naming and include conventions in the tuple-count changes
imikejackson Oct 19, 2026
bb7285c
DOC: Use one wording for the tuple-count requirement and fix three do…
imikejackson Oct 19, 2026
6c206d1
REF: Use the existing ValidateCellTupleCount helper for the tuple-cou…
imikejackson Oct 19, 2026
0a660e2
REV: Reuse cell tuple validation in three filters
jmarquisbq Oct 15, 2026
2a18fc7
DOC: Define the shared tuple diagnostic prefix policy
jmarquisbq Oct 19, 2026
8f9f820
REV: Include the span type used by partition tests
jmarquisbq Oct 19, 2026
f020cb5
REV: Give vertex tuple mismatches a distinct diagnostic
jmarquisbq Oct 19, 2026
a24ef5e
REV: Guard concrete array kinds in migrated filters
jmarquisbq Oct 19, 2026
e7ed84d
BUG: Give PartitionGeometry's existing-scheme tuple check its own code
imikejackson Oct 20, 2026
9b5d09a
BUG: Move RequireMinNumNeighbors preflight codes to -5957x
imikejackson Oct 20, 2026
f30852c
TEST: Disable the VerifyExamplePipelineCitations Python test
imikejackson Oct 20, 2026
ac020d2
REV: Fix MSVC fs::path build error and qualify comparison-array place…
imikejackson Oct 20, 2026
5214311
Revert "TEST: Disable the VerifyExamplePipelineCitations Python test"
imikejackson Oct 20, 2026
f413cde
REV: Document and test the Neighbor Orientation Correlation repair bo…
imikejackson Oct 23, 2026
6579fcc
TEST: Place the RequireMinNumNeighbors tuple fixtures where the stric…
imikejackson Oct 23, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ In previous versions a file would have been produced instead. If you wish to rec
- **Crystal Structures** -- ensemble-level array read from EBSD data or created by [Create Ensemble Info](CreateEnsembleInfoFilter.md).
- **Mask** (optional) -- a boolean array marking valid cells, typically produced by a threshold operation such as [Multi-Threshold Objects](../SimplnxCore/MultiThresholdObjectsFilter.md).

**Cell Quaternions** and **Cell Phases** must each have one tuple per cell of the selected geometry. When **Use Mask Array** is enabled, **Cell Mask Array** must also have one tuple per cell. They can be in any Attribute Matrix.

## Algorithm

### In-Core Path
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ In previous versions a file would have been produced instead. If you wish to rec
- **Crystal Structures** -- ensemble-level array read from EBSD data or created by [Create Ensemble Info](CreateEnsembleInfoFilter.md).
- **Mask** (optional) -- a boolean array marking valid cells, typically produced by a threshold operation such as [Multi-Threshold Objects](../SimplnxCore/MultiThresholdObjectsFilter.md).

**Cell Quaternions** and **Cell Phases** must each have one tuple per cell of the selected geometry. When **Use Mask Array** is enabled, **Cell Mask Array** must also have one tuple per cell. They can be in any Attribute Matrix.

% Auto generated parameter table will be inserted here

## References
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ The cells that flipped from false (black) to true (IPF-colored) had Confidence I
- **Cell Phases** -- typically read from EBSD data alongside the quaternions.
- **Crystal Structures** -- ensemble-level array read from EBSD data or created by [Create Ensemble Info](CreateEnsembleInfoFilter.md).

**Cell Quaternions**, **Cell Phases** and **Cell Mask Array** must each have one tuple per cell of the selected geometry. They can be in any Attribute Matrix.

% Auto generated parameter table will be inserted here

## Example Pipelines
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ Results may differ from the DREAM3D 6.6 version by approximately 0.0001 degrees
- **Average C-Axes** -- produced by [Compute Average C-Axis Orientations](ComputeAvgCAxesFilter.md).
- **Crystal Structures** -- ensemble-level array read from EBSD data or created by [Create Ensemble Info](CreateEnsembleInfoFilter.md).

**Cell Feature Ids**, **Cell Phases** and **Cell Quaternions** must each have one tuple per cell of the selected geometry. They can be in any Attribute Matrix.

## Algorithm

For each cell, the quaternion is converted to an active rotation matrix (transpose of the passive orientation matrix) and applied to the <001> c-axis to find the c-axis direction in the sample reference frame. The angle between this cell-level c-axis and the feature's average c-axis is computed. Angles exceeding 90 degrees are folded to (180 - angle) to account for the antipodal symmetry of hexagonal c-axes. The per-cell misorientation values are then used to compute the average and population standard deviation per feature.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ In 3D, the Z Radius works the same way, extending into adjacent slices above and

For related per-feature misorientation metrics, see the **Compute Feature Reference Misorientations** and **Compute Misorientation** filters.

**Cell Feature Ids**, **Cell Phases** and **Cell Quaternions** must each have one tuple per cell of the selected geometry. They can be in any Attribute Matrix.

## Algorithm

For each valid cell in the Image Geometry, the algorithm examines all cells within the user-specified kernel radius in X, Y, and Z. In per-grain mode, only neighbors with the same feature ID as the center cell are included. In per-voxel mode, any neighbor with a positive feature ID and the same phase as the center cell is included. The crystallographic misorientation angle between the center cell's quaternion and each qualifying neighbor's quaternion is computed using the appropriate LaueOps symmetry operators. The average of these misorientation angles is stored as the KAM value for the center cell.
Expand Down
2 changes: 2 additions & 0 deletions src/Plugins/OrientationAnalysis/docs/ComputeShapesFilter.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ For shape analysis on triangle geometry meshes rather than voxelized image geome
- **Cell Feature Ids** -- produced by a segmentation filter such as [Segment Features (Misorientation)](EBSDSegmentFeaturesFilter.md) or [Segment Features (Scalar)](../SimplnxCore/ScalarSegmentFeaturesFilter.md).
- **Feature Centroids** -- produced by [Compute Feature Centroids](../SimplnxCore/ComputeFeatureCentroidsFilter.md).

**Cell Feature Ids** must have one tuple per cell of the selected geometry. It can be in any Attribute Matrix.

% Auto generated parameter table will be inserted here

## References
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ Cell (1,1) has CI = 0.05, which is below a 0.1 minimum, so it is flagged. Its 4

In this example, cell (1,1) has a confidence index < 0.1. Its four neighbors are compared pairwise with each other: (13.0), (14.0), (12.0) and (15.0) are all within a few degrees of each other, so every neighbor participates in several similar pairs. The central cell (1,1) has all of its attributes replaced with those of the neighbor holding the highest similar-pair count. Note that the central cell's own orientation and phase play no role in choosing the replacement — only the mutual similarity of its neighbors matters.

**Confidence Index**, **Cell Phases** and **Cell Quaternions** must each have one tuple per cell of the selected geometry. Replacement copies affect arrays in the Attribute Matrix that contains **Confidence Index**, except the arrays in **Attribute Arrays to Ignore**. Keep **Cell Phases** and **Cell Quaternions** in that matrix when they must also be repaired.

## Example Data

| Example Input/Output Images |
Expand All @@ -43,13 +45,7 @@ This filter will copy all attribute data from neighboring cells into the target

### Differences from legacy DREAM.3D 6.5.171

DREAM3D-NX's implementation fixes three defects present in DREAM.3D 6.5.171, so results will differ on most datasets:

1. 6.5.171 could count a mixed-phase (or unindexed, phase-0) neighbor pair as "similar" by reusing the previous pair's misorientation, occasionally replacing a cell with data from a **different phase**.
2. 6.5.171 ran only half the cleanup passes of the original design (`ceil((6 − Level)/2)` instead of `6 − Level`), leaving deep bad regions partially unfilled.
3. 6.5.171 copied from the *last* neighbor having any similar pair rather than the neighbor with the *highest* similarity count. (When all counts tie — the common case in grain interiors — both versions pick the same neighbor.)

See `NeighborOrientationCorrelationFilter-D1` through `-D4` in `src/Plugins/OrientationAnalysis/vv/deviations/NeighborOrientationCorrelationFilter.md` for the full analysis and migration guidance.
DREAM3D-NX's implementation fixes three defects present in DREAM.3D 6.5.171.

## Algorithm

Expand Down
2 changes: 2 additions & 0 deletions src/Plugins/OrientationAnalysis/docs/WriteINLFileFilter.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ Some information about the phase is included in the header section of the file i
- **Crystal Structures** -- the **Ensemble**-level array read alongside the phases from the same EBSD reader.
- **Cell Feature Ids** -- produced by a segmentation filter such as [Segment Features (Misorientation)](EBSDSegmentFeaturesFilter.md) or [Segment Features (Scalar)](../SimplnxCore/ScalarSegmentFeaturesFilter.md).

**Cell Feature Ids**, **Cell Phases** and **Cell Euler Angles** must each have one tuple per cell of the selected geometry. They can be in any Attribute Matrix.

% Auto generated parameter table will be inserted here

## Example Pipelines
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,16 @@ IFilter::PreflightResult AlignSectionsMisorientationFilter::preflightImpl(const
return MakePreflightErrorResult(k_InconsistentTupleCount, fmt::format("The following DataArrays all must have equal number of tuples but this was not satisfied.\n{}", tupleValidityCheck.error()));
}

std::vector<DataPath> cellArrayPaths = {pQuatsArrayPath, pCellPhasesArrayPath};
if(pUseGoodVoxels)
{
cellArrayPaths.emplace_back(pGoodVoxelsArrayPath);
}
if(auto tupleResult = ValidateCellTupleCount(dataStructure, inputImageGeometry, cellArrayPaths, -68072); tupleResult.invalid())
{
return {ConvertResultTo<OutputActions>(std::move(tupleResult), {})};
}

const auto* inputGeom = dataStructure.getDataAs<ImageGeom>(inputImageGeometry);
if(inputGeom == nullptr)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "simplnx/Parameters/DataObjectNameParameter.hpp"
#include "simplnx/Parameters/GeometrySelectionParameter.hpp"
#include "simplnx/Parameters/NumberParameter.hpp"
#include "simplnx/Utilities/DataArrayUtilities.hpp"
#include "simplnx/Utilities/FilterUtilities.hpp"
#include "simplnx/Utilities/SIMPLConversion.hpp"
#include "simplnx/Utilities/StringUtilities.hpp"
Expand Down Expand Up @@ -143,6 +144,7 @@ IFilter::PreflightResult AlignSectionsMutualInformationFilter::preflightImpl(con
auto pGoodVoxelsArrayPathValue = filterArgs.value<DataPath>(k_MaskArrayPath_Key);
auto pCrystalStructuresArrayPathValue = filterArgs.value<DataPath>(k_CrystalStructuresArrayPath_Key);

auto useMask = filterArgs.value<bool>(k_UseMask_Key);
auto pStoreAlignmentShifts = filterArgs.value<bool>(k_StoreAlignmentShifts_Key);

nx::core::Result<OutputActions> resultOutputActions;
Expand All @@ -159,13 +161,27 @@ IFilter::PreflightResult AlignSectionsMutualInformationFilter::preflightImpl(con
-3541, fmt::format("The Image Geometry is not 3D and cannot be run through this filter. The dimensions are ({})", StringUtilities::formatDimensions3D(imageGeom.getDimensions())));
}

std::vector<DataPath> dataArrayPaths = {pQuatsArrayPathValue, pCellPhasesArrayPathValue, pGoodVoxelsArrayPathValue};
std::vector<DataPath> dataArrayPaths = {pQuatsArrayPathValue, pCellPhasesArrayPathValue};
if(useMask)
{
dataArrayPaths.push_back(pGoodVoxelsArrayPathValue);
}
auto tupleValidityCheck = dataStructure.validateNumberOfTuples(dataArrayPaths);
if(!tupleValidityCheck)
{
return MakePreflightErrorResult(-3542, fmt::format("The following DataArrays all must have equal number of tuples but this was not satisfied.\n{}", tupleValidityCheck.error()));
}

std::vector<DataPath> cellArrayPaths = {pQuatsArrayPathValue, pCellPhasesArrayPathValue};
if(useMask)
{
cellArrayPaths.emplace_back(pGoodVoxelsArrayPathValue);
}
if(auto tupleResult = ValidateCellTupleCount(dataStructure, imageGeometryPath, cellArrayPaths, -3543); tupleResult.invalid())
{
return {ConvertResultTo<OutputActions>(std::move(tupleResult), {})};
}

// Handle Array Creation
if(pStoreAlignmentShifts)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "simplnx/Parameters/DataGroupSelectionParameter.hpp"
#include "simplnx/Parameters/GeometrySelectionParameter.hpp"
#include "simplnx/Parameters/NumberParameter.hpp"
#include "simplnx/Utilities/DataArrayUtilities.hpp"
#include "simplnx/Utilities/SIMPLConversion.hpp"

using namespace nx::core;
Expand Down Expand Up @@ -97,6 +98,7 @@ IFilter::UniquePointer BadDataNeighborOrientationCheckFilter::clone() const
IFilter::PreflightResult BadDataNeighborOrientationCheckFilter::preflightImpl(const DataStructure& dataStructure, const Arguments& filterArgs, const MessageHandler& messageHandler,
const std::atomic_bool& shouldCancel, const ExecutionContext& executionContext) const
{
auto imageGeometryPath = filterArgs.value<DataPath>(k_ImageGeometryPath_Key);
auto pQuatsArrayPathValue = filterArgs.value<DataPath>(k_QuatsArrayPath_Key);
auto pMaskArrayPathValue = filterArgs.value<DataPath>(k_MaskArrayPath_Key);
auto pCellPhasesArrayPathValue = filterArgs.value<DataPath>(k_CellPhasesArrayPath_Key);
Expand All @@ -121,6 +123,11 @@ IFilter::PreflightResult BadDataNeighborOrientationCheckFilter::preflightImpl(co
return MakePreflightErrorResult(k_InconsistentTupleCount, fmt::format("The following DataArrays all must have equal number of tuples but this was not satisfied.\n{}", tupleValidityCheck.error()));
}

if(auto tupleResult = ValidateCellTupleCount(dataStructure, imageGeometryPath, {pQuatsArrayPathValue, pCellPhasesArrayPathValue, pMaskArrayPathValue}, -6810); tupleResult.invalid())
{
return {ConvertResultTo<OutputActions>(std::move(tupleResult), {})};
}

resultOutputActions.value().modifiedActions.emplace_back(
DataObjectModification{pMaskArrayPathValue, DataObjectModification::ModifiedType::Modified, dataStructure.getData(pMaskArrayPathValue)->getDataObjectType()});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "simplnx/Parameters/DataGroupSelectionParameter.hpp"
#include "simplnx/Parameters/DataObjectNameParameter.hpp"
#include "simplnx/Parameters/GeometrySelectionParameter.hpp"
#include "simplnx/Utilities/DataArrayUtilities.hpp"
#include "simplnx/Utilities/SIMPLConversion.hpp"

using namespace nx::core;
Expand Down Expand Up @@ -96,6 +97,7 @@ IFilter::UniquePointer ComputeFeatureReferenceCAxisMisorientationsFilter::clone(
IFilter::PreflightResult ComputeFeatureReferenceCAxisMisorientationsFilter::preflightImpl(const DataStructure& dataStructure, const Arguments& filterArgs, const MessageHandler& messageHandler,
const std::atomic_bool& shouldCancel, const ExecutionContext& executionContext) const
{
auto imageGeometryPath = filterArgs.value<DataPath>(k_ImageGeometryPath_Key);
auto pFeatureIdsArrayPathValue = filterArgs.value<DataPath>(k_FeatureIdsArrayPath_Key);
auto pCellPhasesArrayPathValue = filterArgs.value<DataPath>(k_CellPhasesArrayPath_Key);
auto pQuatsArrayPathValue = filterArgs.value<DataPath>(k_QuatsArrayPath_Key);
Expand All @@ -114,6 +116,11 @@ IFilter::PreflightResult ComputeFeatureReferenceCAxisMisorientationsFilter::pref
return {MakeErrorResult<OutputActions>(-9800, fmt::format("The following DataArrays all must have equal number of tuples but this was not satisfied.\n{}", tupleValidityCheck.error()))};
}

if(auto tupleResult = ValidateCellTupleCount(dataStructure, imageGeometryPath, {pFeatureIdsArrayPathValue, pCellPhasesArrayPathValue, pQuatsArrayPathValue}, -9805); tupleResult.invalid())
{
return {ConvertResultTo<OutputActions>(std::move(tupleResult), {})};
}

ShapeType tupleShape = dataStructure.getDataRefAs<Int32Array>(pFeatureIdsArrayPathValue).getTupleShape();
{
auto createArrayAction =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "simplnx/Parameters/DataObjectNameParameter.hpp"
#include "simplnx/Parameters/GeometrySelectionParameter.hpp"

#include "simplnx/Utilities/DataArrayUtilities.hpp"
#include "simplnx/Utilities/SIMPLConversion.hpp"

#include "simplnx/Parameters/VectorParameter.hpp"
Expand Down Expand Up @@ -103,6 +104,11 @@ IFilter::PreflightResult ComputeKernelAvgMisorientationsFilter::preflightImpl(co
auto pKernelAverageMisorientationsArrayNameValue = pCellPhasesArrayPathValue.replaceName(filterArgs.value<std::string>(k_KernelAverageMisorientationsArrayName_Key));
auto inputImageGeometry = filterArgs.value<DataPath>(k_SelectedImageGeometryPath_Key);

if(auto tupleResult = ValidateCellTupleCount(dataStructure, inputImageGeometry, {pFeatureIdsArrayPathValue, pCellPhasesArrayPathValue, pQuatsArrayPathValue}, -67205); tupleResult.invalid())
{
return {ConvertResultTo<OutputActions>(std::move(tupleResult), {})};
}

PreflightResult preflightResult;

nx::core::Result<OutputActions> resultOutputActions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "simplnx/Parameters/ArraySelectionParameter.hpp"
#include "simplnx/Parameters/DataObjectNameParameter.hpp"

#include "simplnx/Utilities/DataArrayUtilities.hpp"
#include "simplnx/Utilities/SIMPLConversion.hpp"

#include "simplnx/Parameters/GeometrySelectionParameter.hpp"
Expand Down Expand Up @@ -99,6 +100,12 @@ IFilter::PreflightResult ComputeShapesFilter::preflightImpl(const DataStructure&
auto pAxisEulerAnglesArrayName = filterArgs.value<std::string>(k_AxisEulerAnglesArrayName_Key);
auto pAspectRatiosArrayName = filterArgs.value<std::string>(k_AspectRatiosArrayName_Key);
auto pVolumesArrayName = filterArgs.value<std::string>(k_VolumesArrayName_Key);
auto tupleCountResult = ValidateCellTupleCount(dataStructure, filterArgs.value<DataPath>(k_SelectedImageGeometryPath_Key), {pFeatureIdsArrayPath}, -12806);
if(tupleCountResult.invalid())
{
return {ConvertResultTo<OutputActions>(std::move(tupleCountResult), {})};
}

auto featureAttrMatrixPath = pCentroidsArrayPath.getParent();
auto pOmega3sArrayPath = featureAttrMatrixPath.createChildPath(pOmega3sArrayName);
auto pAxisLengthsArrayPath = featureAttrMatrixPath.createChildPath(pAxisLengthsArrayName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "simplnx/Parameters/GeometrySelectionParameter.hpp"
#include "simplnx/Parameters/MultiArraySelectionParameter.hpp"

#include "simplnx/Utilities/DataArrayUtilities.hpp"
#include "simplnx/Utilities/SIMPLConversion.hpp"

#include "simplnx/Parameters/NumberParameter.hpp"
Expand Down Expand Up @@ -174,6 +175,11 @@ IFilter::PreflightResult NeighborOrientationCorrelationFilter::preflightImpl(con
MakeErrorResult<OutputActions>(k_InvalidNumTuples, fmt::format("The following DataArrays all must have equal number of tuples but this was not satisfied.\n{}", tupleValidityCheck.error()))};
}

if(auto tupleResult = ValidateCellTupleCount(dataStructure, pImageGeomPathValue, {pConfidenceIndexArrayPathValue, pCellPhasesArrayPathValue, pQuatsArrayPathValue}, -580098); tupleResult.invalid())
{
return {ConvertResultTo<OutputActions>(std::move(tupleResult), {})};
}

// Inform users that the following arrays are going to be modified in place
// Cell Data is going to be modified
nx::core::AppendDataObjectModifications(dataStructure, resultOutputActions.value().modifiedActions, imageGeom.getCellDataPath(), {});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "simplnx/Parameters/FileSystemPathParameter.hpp"
#include "simplnx/Parameters/GeometrySelectionParameter.hpp"

#include "simplnx/Utilities/DataArrayUtilities.hpp"
#include "simplnx/Utilities/SIMPLConversion.hpp"

#include <filesystem>
Expand Down Expand Up @@ -98,8 +99,17 @@ IFilter::UniquePointer WriteINLFileFilter::clone() const
IFilter::PreflightResult WriteINLFileFilter::preflightImpl(const DataStructure& dataStructure, const Arguments& filterArgs, const MessageHandler& messageHandler, const std::atomic_bool& shouldCancel,
const ExecutionContext& executionContext) const
{
auto imageGeometryPath = filterArgs.value<DataPath>(k_ImageGeomPath_Key);
auto featureIdsPath = filterArgs.value<DataPath>(k_FeatureIdsArrayPath_Key);
auto cellPhasesPath = filterArgs.value<DataPath>(k_CellPhasesArrayPath_Key);
auto eulerAnglesPath = filterArgs.value<DataPath>(k_CellEulerAnglesArrayPath_Key);
auto pMaterialNameArrayPathValue = filterArgs.value<DataPath>(k_MaterialNameArrayPath_Key);

if(auto tupleResult = ValidateCellTupleCount(dataStructure, imageGeometryPath, {featureIdsPath, cellPhasesPath, eulerAnglesPath}, -78431); tupleResult.invalid())
{
return {ConvertResultTo<OutputActions>(std::move(tupleResult), {})};
}

PreflightResult preflightResult;
nx::core::Result<OutputActions> resultOutputActions;
std::vector<PreflightValue> preflightUpdatedValues;
Expand Down
Loading
Loading