|
| 1 | +#include "ComputeEquivalentDiameterCirclesFilter.hpp" |
| 2 | + |
| 3 | +#include "SimplnxReview/Filters/Algorithms/ComputeEquivalentDiameterCircles.hpp" |
| 4 | + |
| 5 | +#include "simplnx/DataStructure/DataArray.hpp" |
| 6 | +#include "simplnx/Filter/Actions/CreateArrayAction.hpp" |
| 7 | +#include "simplnx/Filter/Actions/CreateGeometry1DAction.hpp" |
| 8 | +#include "simplnx/Parameters/ArraySelectionParameter.hpp" |
| 9 | +#include "simplnx/Parameters/DataGroupCreationParameter.hpp" |
| 10 | +#include "simplnx/Parameters/DataObjectNameParameter.hpp" |
| 11 | +#include "simplnx/Parameters/NumberParameter.hpp" |
| 12 | + |
| 13 | +using namespace nx::core; |
| 14 | + |
| 15 | +namespace nx::core |
| 16 | +{ |
| 17 | +//------------------------------------------------------------------------------ |
| 18 | +std::string ComputeEquivalentDiameterCirclesFilter::name() const |
| 19 | +{ |
| 20 | + return FilterTraits<ComputeEquivalentDiameterCirclesFilter>::name.str(); |
| 21 | +} |
| 22 | + |
| 23 | +//------------------------------------------------------------------------------ |
| 24 | +std::string ComputeEquivalentDiameterCirclesFilter::className() const |
| 25 | +{ |
| 26 | + return FilterTraits<ComputeEquivalentDiameterCirclesFilter>::className; |
| 27 | +} |
| 28 | + |
| 29 | +//------------------------------------------------------------------------------ |
| 30 | +Uuid ComputeEquivalentDiameterCirclesFilter::uuid() const |
| 31 | +{ |
| 32 | + return FilterTraits<ComputeEquivalentDiameterCirclesFilter>::uuid; |
| 33 | +} |
| 34 | + |
| 35 | +//------------------------------------------------------------------------------ |
| 36 | +std::string ComputeEquivalentDiameterCirclesFilter::humanName() const |
| 37 | +{ |
| 38 | + return "Compute Equivalent Diameter Circles"; |
| 39 | +} |
| 40 | + |
| 41 | +//------------------------------------------------------------------------------ |
| 42 | +std::vector<std::string> ComputeEquivalentDiameterCirclesFilter::defaultTags() const |
| 43 | +{ |
| 44 | + return {className()}; |
| 45 | +} |
| 46 | + |
| 47 | +//------------------------------------------------------------------------------ |
| 48 | +Parameters ComputeEquivalentDiameterCirclesFilter::parameters() const |
| 49 | +{ |
| 50 | + Parameters params; |
| 51 | + // Create the parameter descriptors that are needed for this filter |
| 52 | + params.insertSeparator(Parameters::Separator{"Input Parameter(s)"}); |
| 53 | + params.insert(std::make_unique<ArraySelectionParameter>(k_CentroidsArrayPath_Key, "Feature Centroids", "X, Y, Z coordinates of Feature center of mass", DataPath{}, |
| 54 | + ArraySelectionParameter::AllowedTypes{DataType::float32}, ArraySelectionParameter::AllowedComponentShapes{{3}})); |
| 55 | + params.insert(std::make_unique<ArraySelectionParameter>(k_EquivalentDiametersArrayPath_Key, "Equivalent Diameters", "Input feature based Equivalent Diameters", DataPath{}, |
| 56 | + ArraySelectionParameter::AllowedTypes{DataType::float32}, ArraySelectionParameter::AllowedComponentShapes{{1}})); |
| 57 | + params.insert(std::make_unique<NumberParameter<uint64>>(k_CircleResolution_Key, "Circle Resolution", "The number of edges that each circle will have", 100)); |
| 58 | + params.insert(std::make_unique<NumberParameter<int64>>(k_ZPlane_Key, "Z Plane", "The Z plane that the circles will be calculated on.", 0)); |
| 59 | + |
| 60 | + params.insertSeparator(Parameters::Separator{"Output Edge Geometry"}); |
| 61 | + params.insert(std::make_unique<DataGroupCreationParameter>(k_OutputEdgeGeometryPath_Key, "Created Edge Geometry", "The name of the created Edge Geometry", DataPath({"Circles"}))); |
| 62 | + params.insert(std::make_unique<DataObjectNameParameter>(k_EdgeAttributeMatrixName_Key, "Edge Attribute Matrix", "Attribute Matrix to store information about the created edges", "Edge Data")); |
| 63 | + params.insert(std::make_unique<DataObjectNameParameter>(k_CreatedFeatureIdsArrayName_Key, "Edge Feature Ids", "Identifies the Feature Id to which each edge belongs", "Feature Ids")); |
| 64 | + |
| 65 | + return params; |
| 66 | +} |
| 67 | + |
| 68 | +//------------------------------------------------------------------------------ |
| 69 | +IFilter::UniquePointer ComputeEquivalentDiameterCirclesFilter::clone() const |
| 70 | +{ |
| 71 | + return std::make_unique<ComputeEquivalentDiameterCirclesFilter>(); |
| 72 | +} |
| 73 | + |
| 74 | +//------------------------------------------------------------------------------ |
| 75 | +IFilter::VersionType ComputeEquivalentDiameterCirclesFilter::parametersVersion() const |
| 76 | +{ |
| 77 | + return 1; |
| 78 | +} |
| 79 | + |
| 80 | +//------------------------------------------------------------------------------ |
| 81 | +IFilter::PreflightResult ComputeEquivalentDiameterCirclesFilter::preflightImpl(const DataStructure& dataStructure, const Arguments& filterArgs, const MessageHandler& messageHandler, |
| 82 | + const std::atomic_bool& shouldCancel, const ExecutionContext& executionContext) const |
| 83 | +{ |
| 84 | + auto pCentroidsArrayPath = filterArgs.value<DataPath>(k_CentroidsArrayPath_Key); |
| 85 | + auto pEquivalentDiametersArrayPath = filterArgs.value<DataPath>(k_EquivalentDiametersArrayPath_Key); |
| 86 | + auto pCircleResolution = filterArgs.value<uint64>(k_CircleResolution_Key); |
| 87 | + auto pOutputEdgeGeometryPath = filterArgs.value<DataGroupCreationParameter::ValueType>(k_OutputEdgeGeometryPath_Key); |
| 88 | + auto pEdgeAttributeMatrixName = filterArgs.value<DataObjectNameParameter::ValueType>(k_EdgeAttributeMatrixName_Key); |
| 89 | + auto pFeatureIdsArrayName = filterArgs.value<DataObjectNameParameter::ValueType>(k_CreatedFeatureIdsArrayName_Key); |
| 90 | + |
| 91 | + Result<OutputActions> resultOutputActions; |
| 92 | + std::vector<PreflightValue> preflightUpdatedValues; |
| 93 | + |
| 94 | + auto& centroidsArray = dataStructure.getDataRefAs<Float32Array>(pCentroidsArrayPath); |
| 95 | + auto& equivalentDiametersArray = dataStructure.getDataRefAs<Float32Array>(pEquivalentDiametersArrayPath); |
| 96 | + usize numberOfCentroids = centroidsArray.getNumberOfTuples(); |
| 97 | + if(numberOfCentroids != equivalentDiametersArray.getNumberOfTuples()) |
| 98 | + { |
| 99 | + return MakePreflightErrorResult(-13860, fmt::format("Centroids array has {} centroids, and the equivalent diameters array has {} diameters. These must be equal.", numberOfCentroids, |
| 100 | + equivalentDiametersArray.getNumberOfTuples())); |
| 101 | + } |
| 102 | + |
| 103 | + auto createGeometryAction = |
| 104 | + std::make_unique<CreateEdgeGeometryAction>(pOutputEdgeGeometryPath, pCircleResolution * (numberOfCentroids - 1), (pCircleResolution + 1) * (numberOfCentroids - 1), |
| 105 | + INodeGeometry0D::k_VertexAttributeMatrixName, pEdgeAttributeMatrixName, EdgeGeom::k_SharedVertexListName, EdgeGeom::k_SharedEdgeListName); |
| 106 | + resultOutputActions.value().appendAction(std::move(createGeometryAction)); |
| 107 | + |
| 108 | + DataPath path = pOutputEdgeGeometryPath.createChildPath(pEdgeAttributeMatrixName).createChildPath(pFeatureIdsArrayName); |
| 109 | + auto createArray = std::make_unique<CreateArrayAction>(DataType::int32, std::vector<usize>{pCircleResolution * (numberOfCentroids - 1)}, std::vector<usize>{1}, path); |
| 110 | + resultOutputActions.value().appendAction(std::move(createArray)); |
| 111 | + |
| 112 | + preflightUpdatedValues.push_back({"WARNING: This filter is experimental in nature and has not had any testing, validation or verification. Use at your own risk"}); |
| 113 | + resultOutputActions.warnings().push_back({-65432, "WARNING: This filter is experimental in nature and has not had any testing, validation or verification. Use at your own risk"}); |
| 114 | + |
| 115 | + return {std::move(resultOutputActions), std::move(preflightUpdatedValues)}; |
| 116 | +} |
| 117 | + |
| 118 | +//------------------------------------------------------------------------------ |
| 119 | +Result<> ComputeEquivalentDiameterCirclesFilter::executeImpl(DataStructure& dataStructure, const Arguments& filterArgs, const PipelineFilter* pipelineNode, const MessageHandler& messageHandler, |
| 120 | + const std::atomic_bool& shouldCancel, const ExecutionContext& executionContext) const |
| 121 | +{ |
| 122 | + ComputeEquivalentDiameterCirclesInputValues inputValues; |
| 123 | + |
| 124 | + inputValues.CentroidsArrayPath = filterArgs.value<DataPath>(k_CentroidsArrayPath_Key); |
| 125 | + inputValues.EquivalentDiametersArrayPath = filterArgs.value<DataPath>(k_EquivalentDiametersArrayPath_Key); |
| 126 | + inputValues.CircleResolution = filterArgs.value<uint64>(k_CircleResolution_Key); |
| 127 | + inputValues.ZPlane = filterArgs.value<int64>(k_ZPlane_Key); |
| 128 | + inputValues.OutputEdgeGeometryPath = filterArgs.value<DataGroupCreationParameter::ValueType>(k_OutputEdgeGeometryPath_Key); |
| 129 | + inputValues.EdgeAttributeMatrixName = filterArgs.value<DataObjectNameParameter::ValueType>(k_EdgeAttributeMatrixName_Key); |
| 130 | + inputValues.FeatureIdsArrayName = filterArgs.value<DataObjectNameParameter::ValueType>(k_CreatedFeatureIdsArrayName_Key); |
| 131 | + |
| 132 | + return ComputeEquivalentDiameterCircles(dataStructure, messageHandler, shouldCancel, &inputValues)(); |
| 133 | +} |
| 134 | +} // namespace nx::core |
0 commit comments