From d512fa2443767d59fa2dff3070de94385f463b60 Mon Sep 17 00:00:00 2001 From: Nathan Young Date: Fri, 2 Feb 2024 18:48:08 -0500 Subject: [PATCH] FILTER: Label Triangle Geometry and Remove Flagged Triangles Filters (#842) Signed-off-by: Michael Jackson Co-authored-by: Matthew Marine Co-authored-by: Michael Jackson --- src/Plugins/SimplnxCore/CMakeLists.txt | 6 +- .../docs/Images/LabelTriangleGeometry_1.png | Bin 0 -> 45830 bytes .../docs/Images/RemoveFlaggedTriangles_1.png | Bin 0 -> 36988 bytes .../docs/Images/RemoveFlaggedTriangles_2.png | Bin 0 -> 33492 bytes .../docs/Images/connectivity_image.png | Bin 0 -> 76533 bytes .../docs/LabelTriangleGeometryFilter.md | 35 ++++ .../docs/RegularGridSampleSurfaceMesh.md | 26 +-- .../docs/RemoveFlaggedFeaturesFilter.md | 10 +- .../docs/RemoveFlaggedTrianglesFilter.md | 38 ++++ .../pipelines/Remove_Triangles.d3dpipeline | 113 ++++++++++++ .../Algorithms/LabelTriangleGeometry.cpp | 111 ++++++++++++ .../Algorithms/LabelTriangleGeometry.hpp | 50 ++++++ .../Algorithms/RemoveFlaggedTriangles.cpp | 163 ++++++++++++++++++ .../Algorithms/RemoveFlaggedTriangles.hpp | 47 +++++ .../Filters/LabelTriangleGeometryFilter.cpp | 156 +++++++++++++++++ .../Filters/LabelTriangleGeometryFilter.hpp | 106 ++++++++++++ .../Filters/RemoveFlaggedTrianglesFilter.cpp | 143 +++++++++++++++ .../Filters/RemoveFlaggedTrianglesFilter.hpp | 105 +++++++++++ .../SimplnxCoreLegacyUUIDMapping.hpp | 4 + src/Plugins/SimplnxCore/test/CMakeLists.txt | 9 +- .../SimplnxCore/test/CombineStlFilesTest.cpp | 8 +- .../test/LabelTriangleGeometryTest.cpp | 55 ++++++ .../test/RemoveFlaggedTrianglesTest.cpp | 58 +++++++ .../DataStructure/DynamicListArray.hpp | 26 +-- .../Geometry/INodeGeometry1D.cpp | 5 +- .../DataStructure/Geometry/TriangleGeom.cpp | 4 +- src/simplnx/Utilities/GeometryHelpers.hpp | 3 +- 27 files changed, 1229 insertions(+), 52 deletions(-) create mode 100644 src/Plugins/SimplnxCore/docs/Images/LabelTriangleGeometry_1.png create mode 100644 src/Plugins/SimplnxCore/docs/Images/RemoveFlaggedTriangles_1.png create mode 100644 src/Plugins/SimplnxCore/docs/Images/RemoveFlaggedTriangles_2.png create mode 100644 src/Plugins/SimplnxCore/docs/Images/connectivity_image.png create mode 100644 src/Plugins/SimplnxCore/docs/LabelTriangleGeometryFilter.md create mode 100644 src/Plugins/SimplnxCore/docs/RemoveFlaggedTrianglesFilter.md create mode 100644 src/Plugins/SimplnxCore/pipelines/Remove_Triangles.d3dpipeline create mode 100644 src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/LabelTriangleGeometry.cpp create mode 100644 src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/LabelTriangleGeometry.hpp create mode 100644 src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/RemoveFlaggedTriangles.cpp create mode 100644 src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/RemoveFlaggedTriangles.hpp create mode 100644 src/Plugins/SimplnxCore/src/SimplnxCore/Filters/LabelTriangleGeometryFilter.cpp create mode 100644 src/Plugins/SimplnxCore/src/SimplnxCore/Filters/LabelTriangleGeometryFilter.hpp create mode 100644 src/Plugins/SimplnxCore/src/SimplnxCore/Filters/RemoveFlaggedTrianglesFilter.cpp create mode 100644 src/Plugins/SimplnxCore/src/SimplnxCore/Filters/RemoveFlaggedTrianglesFilter.hpp create mode 100644 src/Plugins/SimplnxCore/test/LabelTriangleGeometryTest.cpp create mode 100644 src/Plugins/SimplnxCore/test/RemoveFlaggedTrianglesTest.cpp diff --git a/src/Plugins/SimplnxCore/CMakeLists.txt b/src/Plugins/SimplnxCore/CMakeLists.txt index c021538117..2dae27cb3b 100644 --- a/src/Plugins/SimplnxCore/CMakeLists.txt +++ b/src/Plugins/SimplnxCore/CMakeLists.txt @@ -78,6 +78,7 @@ set(FilterList IterativeClosestPointFilter KMeansFilter KMedoidsFilter + LabelTriangleGeometryFilter LaplacianSmoothingFilter MapPointCloudToRegularGridFilter MinNeighbors @@ -98,6 +99,7 @@ set(FilterList ReadVolumeGraphicsFileFilter RegularGridSampleSurfaceMeshFilter RemoveFlaggedFeaturesFilter + RemoveFlaggedTrianglesFilter RemoveFlaggedVertices RemoveMinimumSizeFeaturesFilter RenameDataObject @@ -173,6 +175,7 @@ set(AlgorithmList ImageContouring KMeans KMedoids + LabelTriangleGeometry LaplacianSmoothing NearestPointFuseRegularGrids PartitionGeometry @@ -185,6 +188,7 @@ set(AlgorithmList ReadVolumeGraphicsFile RegularGridSampleSurfaceMesh RemoveFlaggedFeatures + RemoveFlaggedTriangles ReplaceElementAttributesWithNeighborValues ResampleImageGeom ResampleRectGridToImageGeom @@ -428,7 +432,7 @@ if(EXISTS "${DREAM3D_DATA_DIR}" AND SIMPLNX_DOWNLOAD_TEST_FILES) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME STL_Models.tar.gz - SHA512 14d5bbb1dcc241a5ad9b17e7647144926f22fca9af5e426798c2ed423d8d3b5d89d8c66ce9e6854bfcdbaea7f72b69980477ab837498e3dca89b5cd2870e2cff + SHA512 6a17caa1c5b60740a18d30732b10139b5864e12abd5009ce482972f4070f86e1762a3bf2bbceb8f178187b4d70bedbde1516f32397c3d4424404557b320dde9d INSTALL COPY_DATA ) diff --git a/src/Plugins/SimplnxCore/docs/Images/LabelTriangleGeometry_1.png b/src/Plugins/SimplnxCore/docs/Images/LabelTriangleGeometry_1.png new file mode 100644 index 0000000000000000000000000000000000000000..80b6e115722fb7cfb8cd511a9c864e1805dcfefb GIT binary patch literal 45830 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

fs)9#~a=r7Ta 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 literal 0 HcmV?d00001 diff --git a/src/Plugins/SimplnxCore/docs/Images/connectivity_image.png b/src/Plugins/SimplnxCore/docs/Images/connectivity_image.png new file mode 100644 index 0000000000000000000000000000000000000000..cfbbc97538e4761d007e3e48a62f1e79ecbc17ea GIT binary patch literal 76533 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 JzEQV}`XAX#Vxs^6 literal 0 HcmV?d00001 diff --git a/src/Plugins/SimplnxCore/docs/LabelTriangleGeometryFilter.md b/src/Plugins/SimplnxCore/docs/LabelTriangleGeometryFilter.md new file mode 100644 index 0000000000..fb9739fba7 --- /dev/null +++ b/src/Plugins/SimplnxCore/docs/LabelTriangleGeometryFilter.md @@ -0,0 +1,35 @@ +# Label Triangle Geometry + +## Group (Subgroup) + +Surface Meshing (Geometry) + +## Description + +This **Filter** accepts a **Triangle Geometry** and checks the connectivity of **Triangles** and assigns them **region ID**s in a mask accordingly as well as providing a count for the number of **Triangles** in each **Region**. + +Note: Our connectivity is different from other connectivity algorithms, in that it is dependent on the dimensionality of the geometry it is run on. A triangle geometry is two dimensional thus it must share one edge with another triangle to be considered connected. Only one shared vertex will not be enough to count triangles as connected. See the following image for reference: + +![Connectivity Image](Images/connectivity_image.png) + +The image in question demonstrates what geometric shapes would be considered connected according to matching color scheme. The colors are relative to the shapes dimensionality. Thus the fact there is a yellow triangle and a yellow cube does not mean they are related. + +- 1D Geometry: Two edges are considered connected if they share a vertex. +- 2D Geometry: Triangle and Quad Geometries are considered connected if they share an entire edge. As shown in the image above, Triangles 1 & 2 are connected while triangles 2 & 3 are **not** connected. +- 3D Geometry: Hexahedron/Tetrahedron: In the image above the hexahedrons 4,5, and 6 are **not** considered connected while 6 & 7 are considered connected. + +## Example Output + +The image below shows a single STL file that contains 12 different geometries. This filter labeled each geometry with a unique "Region ID" and the visualization is colored by those "Region Ids" + +![Filter Output](Images/LabelTriangleGeometry_1.png) + +% Auto generated parameter table will be inserted here + +## License & Copyright + +Please see the description file distributed with this plugin. + +## DREAM3D-NX Help + +If you need help, need to file a bug report or want to request a new feature, please head over to the [DREAM3DNX-Issues](https://github.com/BlueQuartzSoftware/DREAM3DNX-Issues) GItHub site where the community of DREAM3D-NX users can help answer your questions. diff --git a/src/Plugins/SimplnxCore/docs/RegularGridSampleSurfaceMesh.md b/src/Plugins/SimplnxCore/docs/RegularGridSampleSurfaceMesh.md index bdac2c49b0..f287e84b22 100644 --- a/src/Plugins/SimplnxCore/docs/RegularGridSampleSurfaceMesh.md +++ b/src/Plugins/SimplnxCore/docs/RegularGridSampleSurfaceMesh.md @@ -13,31 +13,7 @@ This **Filter** "samples" a triangulated surface mesh on a rectilinear grid. The 3. For each bounding box a **Cell** falls in, check against that **Feature's** **Triangle** list to determine if the **Cell** falls within that n-sided polyhedra (*Note:* if the surface mesh is conformal, then each **Cell** will only belong to one **Feature**, but if not, the last **Feature** the **Cell** is found to fall inside of will *own* the **Cell**) 4. Assign the **Feature** number that the **Cell** falls within to the *Feature Ids* array in the new rectilinear grid geometry -## Parameters - -| Name | Type | Description | -|------------|------| --------------------------------- | -| Dimensions | uint64 | Number of **Cells** along each axis | -| Resolution | float32 (3x) | The resolution values (dx, dy, dz) | -| Origin | float32 (3x) | The origin of the sampling volume | - -## Required Geometry - -Triangle - -## Required Objects - -| Type | Default Name | Type | Comp Dims | Description | -|------|--------------|-----|-----|-----------------------------------| -| Data Array | Face Labels | int32 | (2) | Specifies which **Features** are on either side of each **Face**. | - -## Created - -| Kind | Default Name | Type | Comp Dims | Description | -|---------------------------|--------------|----------|--------|---------------------------------------------| -| Image Geometry | Image Geometry | N/A | N/A | Created **Image Geometry** name and *DataPath* | -| Attribute Matrix | Cell Data | Cell | N/A | Created **Cell Attribute Matrix** name | -| Data Array | Feature Ids | int32 | (1) | Specifies to which **Feature** each **Cell** belongs | +% Auto generated parameter table will be inserted here ## License & Copyright diff --git a/src/Plugins/SimplnxCore/docs/RemoveFlaggedFeaturesFilter.md b/src/Plugins/SimplnxCore/docs/RemoveFlaggedFeaturesFilter.md index 19be24adac..9c7e728a83 100644 --- a/src/Plugins/SimplnxCore/docs/RemoveFlaggedFeaturesFilter.md +++ b/src/Plugins/SimplnxCore/docs/RemoveFlaggedFeaturesFilter.md @@ -6,11 +6,11 @@ Processing (Cleanup) ## Description -This **Filter** will remove **Features** that have been flagged by another **Filter** from the structure. The **Filter** -requires that the user point to a boolean array at the **Feature** level that tells the **Filter** whether the **Feature** -should remain in the structure. If the boolean array is *false* for a **Feature**, then all **Cells** that belong to that -**Feature** are temporarily *unassigned*. Optionally, after all *undesired* **Features** are removed, the remaining **Features** are -isotropically coarsened to fill in the gaps left by the removed **Features**. +This **Filter** will remove **Features** that have been flagged by another **Filter** from the structure. The **Filter** requires that the user point to a boolean array at the **Feature** level that tells the **Filter** whether the **Feature** should remain in the structure. If the boolean array is *false* for a **Feature**, then all **Cells** that belong to that **Feature** are temporarily *unassigned*. Optionally, after all *undesired* **Features** are removed, the remaining **Features** are isotropically coarsened to fill in the gaps left by the removed **Features**. + +## Caveats + +This filter will **ONLY** run on an Image Geometry. % Auto generated parameter table will be inserted here diff --git a/src/Plugins/SimplnxCore/docs/RemoveFlaggedTrianglesFilter.md b/src/Plugins/SimplnxCore/docs/RemoveFlaggedTrianglesFilter.md new file mode 100644 index 0000000000..d31c651fe7 --- /dev/null +++ b/src/Plugins/SimplnxCore/docs/RemoveFlaggedTrianglesFilter.md @@ -0,0 +1,38 @@ +# Remove Flagged Triangles + +## Group (Subgroup) + +Surface Meshing (Misc) + +## Description + +This **Filter** removes **Triangles** from the supplied **Triangle Geometry** that are flagged by a boolean mask array as **true**. A new reduced **Geometry** is created that contains all the remaining **Triangles**. It is unknown until run time how many **Triangles** will be removed from the **Geometry**. Therefore, this **Filter** requires that a new **TriangleGeom** be created to contain the reduced **Triangle Geometry**. This new **Geometry** will *NOT* contain copies of any **Feature Attribute Matrix** or **Ensemble Attribute Matrix** from the original **Geometry**. + +- Additionally, all **Vertex** data will be copied, with tuples *removed* for any **Vertices** removed by the **Filter**. The user must supply a name for the reduced **Geometry**. + +The mask is expected to be over the triangles themselves so it should be based on something from the ***Face Data*** **Attribute Matrix**, generally we suggest basing the mask on the created **Region Ids** array from the *Label Triangle Geometry Filter*. + +*Note:* Since it cannot be known before run time how many **Vertices** will be removed, the new **Vertex Geometry** and +all associated **Vertex** data to be copied will be initialized to have size 0. + +## Example Output + +- The next figure shows a triangle geometry that has had a mask generated. Yellow parts are flagged as true. + +![Masked triangle geometries for removal.](Images/RemoveFlaggedTriangles_1.png) + +- The next figure shows the result of running the filter. + +![Resulting triangle geometry](Images/RemoveFlaggedTriangles_2.png) + +% Auto generated parameter table will be inserted here + +## Example Pipelines + +## License & Copyright + +Please see the description file distributed with this plugin. + +## DREAM3D-NX Help + +If you need help, need to file a bug report or want to request a new feature, please head over to the [DREAM3DNX-Issues](https://github.com/BlueQuartzSoftware/DREAM3DNX-Issues) GItHub site where the community of DREAM3D-NX users can help answer your questions. diff --git a/src/Plugins/SimplnxCore/pipelines/Remove_Triangles.d3dpipeline b/src/Plugins/SimplnxCore/pipelines/Remove_Triangles.d3dpipeline new file mode 100644 index 0000000000..628b9c2f8e --- /dev/null +++ b/src/Plugins/SimplnxCore/pipelines/Remove_Triangles.d3dpipeline @@ -0,0 +1,113 @@ +{ + "isDisabled": false, + "name": "Untitled Pipeline", + "pipeline": [ + { + "args": { + "face_attribute_matrix": "Face Data", + "face_normals_data_path": "Face Normals", + "scale_factor": 1.0, + "scale_output": false, + "stl_file_path": "Data/STL_Models/Example_Triangle_Geometry.stl", + "triangle_geometry_name": "TriangleDataContainer", + "vertex_attribute_matrix": "Vertex Data" + }, + "comments": "", + "filter": { + "name": "nx::core::ReadStlFileFilter", + "uuid": "2f64bd45-9d28-4254-9e07-6aa7c6d3d015" + }, + "isDisabled": false + }, + { + "args": { + "created_region_ids_path": "TriangleDataContainer/Face Data/Region Ids", + "num_triangles_name": "NumTriangles", + "triangle_attribute_matrix_name": "CAD Part Data", + "triangle_geom_path": "TriangleDataContainer" + }, + "comments": "", + "filter": { + "name": "nx::core::LabelTriangleGeometryFilter", + "uuid": "7a7a2c6f-3b03-444d-8b8c-5976b0e5c82e" + }, + "isDisabled": false + }, + { + "args": { + "array_thresholds": { + "inverted": false, + "thresholds": [ + { + "array_path": "TriangleDataContainer/Face Data/Region Ids", + "comparison": 0, + "inverted": false, + "type": "array", + "union": 0, + "value": 9.0 + } + ], + "type": "collection", + "union": 0 + }, + "created_data_path": "Mask", + "created_mask_type": 1, + "custom_false_value": 0.0, + "custom_true_value": 1.0, + "use_custom_false_value": false, + "use_custom_true_value": false + }, + "comments": "", + "filter": { + "name": "nx::core::MultiThresholdObjects", + "uuid": "4246245e-1011-4add-8436-0af6bed19228" + }, + "isDisabled": false + }, + { + "args": { + "array_thresholds": { + "inverted": false, + "thresholds": [ + { + "array_path": "TriangleDataContainer/Face Data/Region Ids", + "comparison": 0, + "inverted": false, + "type": "array", + "union": 0, + "value": 9.0 + } + ], + "type": "collection", + "union": 0 + }, + "created_data_path": "Mask2", + "created_mask_type": 10, + "custom_false_value": 0.0, + "custom_true_value": 1.0, + "use_custom_false_value": false, + "use_custom_true_value": false + }, + "comments": "", + "filter": { + "name": "nx::core::MultiThresholdObjects", + "uuid": "4246245e-1011-4add-8436-0af6bed19228" + }, + "isDisabled": false + }, + { + "args": { + "input_geometry": "TriangleDataContainer", + "mask_array_path": "TriangleDataContainer/Face Data/Mask2", + "output_geometry": "Part 10" + }, + "comments": "", + "filter": { + "name": "nx::core::RemoveFlaggedTrianglesFilter", + "uuid": "38155c61-2709-4731-be95-43745bb3f8d8" + }, + "isDisabled": false + } + ], + "version": 1 +} \ No newline at end of file diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/LabelTriangleGeometry.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/LabelTriangleGeometry.cpp new file mode 100644 index 0000000000..51484dd467 --- /dev/null +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/LabelTriangleGeometry.cpp @@ -0,0 +1,111 @@ +#include "LabelTriangleGeometry.hpp" + +#include "simplnx/DataStructure/DataArray.hpp" +#include "simplnx/DataStructure/DataGroup.hpp" +#include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" + +using namespace nx::core; + +// ----------------------------------------------------------------------------- +LabelTriangleGeometry::LabelTriangleGeometry(DataStructure& dataStructure, const IFilter::MessageHandler& mesgHandler, const std::atomic_bool& shouldCancel, + LabelTriangleGeometryInputValues* inputValues) +: m_DataStructure(dataStructure) +, m_InputValues(inputValues) +, m_ShouldCancel(shouldCancel) +, m_MessageHandler(mesgHandler) +{ +} + +// ----------------------------------------------------------------------------- +LabelTriangleGeometry::~LabelTriangleGeometry() noexcept = default; + +// ----------------------------------------------------------------------------- +const std::atomic_bool& LabelTriangleGeometry::getCancel() +{ + return m_ShouldCancel; +} + +// ----------------------------------------------------------------------------- +Result<> LabelTriangleGeometry::operator()() +{ + // Scope other values since underlying arrays will be changed by the time they are need again + std::vector triangleCounts = {0, 0}; + auto& triangle = m_DataStructure.getDataRefAs(m_InputValues->TriangleGeomPath); + + { + usize numTris = triangle.getNumberOfFaces(); + + auto check = triangle.findElementNeighbors(); // use auto since return time is a class declared typename + if(check < 0) + { + return MakeErrorResult(check, fmt::format("Error finding element neighbors for {} geometry", triangle.getName())); + } + + const TriangleGeom::ElementDynamicList* triangleNeighborsPtr = triangle.getElementNeighbors(); + + auto& regionIds = m_DataStructure.getDataRefAs(m_InputValues->RegionIdsPath); + + usize chunkSize = 1000; + std::vector triList(chunkSize, -1); + // first identify connected triangle sets as features + int32 regionCount = 1; + for(usize i = 0; i < numTris; i++) + { + if(regionIds[i] == 0) + { + regionIds[i] = regionCount; + triangleCounts[regionCount]++; + + usize size = 0; + triList[size] = static_cast(i); + size++; + while(size > 0) + { + TriangleGeom::MeshIndexType tri = triList[size - 1]; + size -= 1; + uint16_t tCount = triangleNeighborsPtr->getNumberOfElements(tri); + TriangleGeom::MeshIndexType* dataPtr = triangleNeighborsPtr->getElementListPointer(tri); + for(int j = 0; j < tCount; j++) + { + TriangleGeom::MeshIndexType neighTri = dataPtr[j]; + if(regionIds[neighTri] == 0) + { + regionIds[neighTri] = regionCount; + triangleCounts[regionCount]++; + triList[size] = static_cast(neighTri); + size++; + if(size >= triList.size()) + { + size = triList.size(); + triList.resize(size + chunkSize); + for(usize k = size; k < triList.size(); ++k) + { + triList[k] = -1; + } + } + } + } + } + regionCount++; + triangleCounts.push_back(0); + } + } + + // Resize the Triangle Region AttributeMatrix + m_DataStructure.getDataAs(m_InputValues->TriangleAMPath)->resizeTuples(std::vector{triangleCounts.size()}); + } + + // Clear ElementDynamicLists so write out is possible + triangle.deleteElementNeighbors(); + // Remove elements containing vertices, because Element neighbors created it quietly under the covers + triangle.deleteElementsContainingVert(); + + // copy triangleCounts into the proper DataArray "NumTriangles" in the Feature Attribute Matrix + auto& numTriangles = m_DataStructure.getDataRefAs(m_InputValues->NumTrianglesPath); + for(usize index = 0; index < numTriangles.getSize(); index++) + { + numTriangles[index] = static_cast(triangleCounts[index]); + } + + return {}; +} diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/LabelTriangleGeometry.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/LabelTriangleGeometry.hpp new file mode 100644 index 0000000000..61096d8024 --- /dev/null +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/LabelTriangleGeometry.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include "SimplnxCore/SimplnxCore_export.hpp" + +#include "simplnx/DataStructure/DataPath.hpp" +#include "simplnx/DataStructure/DataStructure.hpp" +#include "simplnx/Filter/IFilter.hpp" +#include "simplnx/Parameters/ArrayCreationParameter.hpp" +#include "simplnx/Parameters/DataGroupSelectionParameter.hpp" + +namespace nx::core +{ + +struct SIMPLNXCORE_EXPORT LabelTriangleGeometryInputValues +{ + DataPath TriangleGeomPath; + DataPath RegionIdsPath; + DataPath TriangleAMPath; + DataPath NumTrianglesPath; +}; + +/** + * @class ConditionalSetValue + * @brief This filter replaces values in the target array with a user specified value + * where a bool mask array specifies. + */ + +class SIMPLNXCORE_EXPORT LabelTriangleGeometry +{ +public: + LabelTriangleGeometry(DataStructure& dataStructure, const IFilter::MessageHandler& mesgHandler, const std::atomic_bool& shouldCancel, LabelTriangleGeometryInputValues* inputValues); + ~LabelTriangleGeometry() noexcept; + + LabelTriangleGeometry(const LabelTriangleGeometry&) = delete; + LabelTriangleGeometry(LabelTriangleGeometry&&) noexcept = delete; + LabelTriangleGeometry& operator=(const LabelTriangleGeometry&) = delete; + LabelTriangleGeometry& operator=(LabelTriangleGeometry&&) noexcept = delete; + + Result<> operator()(); + + const std::atomic_bool& getCancel(); + +private: + DataStructure& m_DataStructure; + const LabelTriangleGeometryInputValues* m_InputValues = nullptr; + const std::atomic_bool& m_ShouldCancel; + const IFilter::MessageHandler& m_MessageHandler; +}; + +} // namespace nx::core diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/RemoveFlaggedTriangles.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/RemoveFlaggedTriangles.cpp new file mode 100644 index 0000000000..9529ebd230 --- /dev/null +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/RemoveFlaggedTriangles.cpp @@ -0,0 +1,163 @@ +#include "RemoveFlaggedTriangles.hpp" + +#include "simplnx/DataStructure/DataArray.hpp" +#include "simplnx/DataStructure/DataGroup.hpp" +#include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" +#include "simplnx/Utilities/ParallelDataAlgorithm.hpp" + +using namespace nx::core; + +namespace +{ +/** + * @brief The PopulateReducedGeometryTrianglesImpl pulls the vertices associated with a triangle then locates the indices in + * the new VertexList then assigns that "new" triangle to Reduced Geometry + */ +class PopulateReducedGeometryTrianglesImpl +{ +public: + PopulateReducedGeometryTrianglesImpl(const TriangleGeom& originalTriangle, TriangleGeom& reducedTriangle, const std::vector& newTrianglesIndex, const std::vector& newVerticesIndex) + : m_OriginalTriangle(originalTriangle) + , m_ReducedTriangle(reducedTriangle) + , m_NewTrianglesIndex(newTrianglesIndex) + , m_NewVerticesIndex(newVerticesIndex) + { + } + ~PopulateReducedGeometryTrianglesImpl() = default; + + void generate(usize start, usize end) const + { + for(usize index = start; index < end; index++) + { + // pull old vertices + usize oldVertexIndices[3] = {0, 0, 0}; + m_OriginalTriangle.getFacePointIds(m_NewTrianglesIndex[index], oldVertexIndices); + + // locate new vertex index for each vertex index + usize newVertexIndices[3] = {0, 0, 0}; + for(usize vertIndex = 0; vertIndex < 3; vertIndex++) + { + const auto& itr = lower_bound(m_NewVerticesIndex.cbegin(), m_NewVerticesIndex.cend(), oldVertexIndices[vertIndex]); // find first instance of value as iterator + usize indexOfTarget = std::distance(m_NewVerticesIndex.cbegin(), itr); + newVertexIndices[vertIndex] = indexOfTarget; + } + + // set the triangle in reduced + m_ReducedTriangle.setFacePointIds(index, newVertexIndices); + } + } + + void operator()(const Range& range) const + { + generate(range.min(), range.max()); + } + +private: + const TriangleGeom& m_OriginalTriangle; + TriangleGeom& m_ReducedTriangle; + const std::vector& m_NewTrianglesIndex; + const std::vector& m_NewVerticesIndex; +}; +} // namespace + +// ----------------------------------------------------------------------------- +RemoveFlaggedTriangles::RemoveFlaggedTriangles(DataStructure& dataStructure, const IFilter::MessageHandler& mesgHandler, const std::atomic_bool& shouldCancel, + RemoveFlaggedTrianglesInputValues* inputValues) +: m_DataStructure(dataStructure) +, m_InputValues(inputValues) +, m_ShouldCancel(shouldCancel) +, m_MessageHandler(mesgHandler) +{ +} + +// ----------------------------------------------------------------------------- +const std::atomic_bool& RemoveFlaggedTriangles::getCancel() +{ + return m_ShouldCancel; +} + +// ----------------------------------------------------------------------------- +Result<> RemoveFlaggedTriangles::operator()() +{ + // Remove Triangles from reduced according to removeTrianglesIndex + const auto& originalTriangle = m_DataStructure.getDataRefAs(m_InputValues->TriangleGeometry); + const auto& mask = m_DataStructure.getDataRefAs(m_InputValues->MaskArrayPath); + auto& reducedTriangle = m_DataStructure.getDataRefAs(m_InputValues->ReducedTriangleGeometry); + + // Set up allocated masks + usize size = originalTriangle.getNumberOfFaces(); + std::vector newTrianglesIndexList; + newTrianglesIndexList.reserve(size); + + // parse mask Triangles list and load a list of indices for triangles to keep + for(usize index = 0; index < size; index++) + { + if(!mask[index]) + { + newTrianglesIndexList.push_back(index); + } + } + newTrianglesIndexList.shrink_to_fit(); + + if(getCancel()) + { + return {}; + } + if(newTrianglesIndexList.empty()) + { + return MakeErrorResult(-67880, "Re-evaluate mask conditions - with current configuration all triangles will be stripped!"); + } + + // flatten a list of the indices of vertices used by the triangles + std::vector VertexListIndices; // also used as a pseudo look up table in PopulateReducedGeometryTrianglesImpl + for(usize& index : newTrianglesIndexList) + { + usize vertIDs[3] = {0, 0, 0}; + originalTriangle.getFacePointIds(index, vertIDs); + VertexListIndices.push_back(vertIDs[0]); + VertexListIndices.push_back(vertIDs[1]); + VertexListIndices.push_back(vertIDs[2]); + } + if(getCancel()) + { + return {}; + } + + if(VertexListIndices.empty()) + { + return MakeErrorResult(-67881, "Re-evaluate mask conditions - with current configuration all vertices will be dumped!"); + } + + // clear duplicate values out of vector + std::sort(VertexListIndices.begin(), VertexListIndices.end()); // orders ascending !!!!! Basis for later search !!!!! + auto dupes = std::unique(VertexListIndices.begin(), VertexListIndices.end()); + VertexListIndices.erase(dupes, VertexListIndices.end()); + + // define new sizing + size = VertexListIndices.size(); + reducedTriangle.resizeVertexList(size); // resize accordingly + + // load reduced Geometry Vertex list according to used vertices + Point3Df coords = {0.0f, 0.0f, 0.0f}; + for(usize i = 0; i < size; i++) + { + coords = originalTriangle.getVertexCoordinate(VertexListIndices[i]); + reducedTriangle.setVertexCoordinate(i, coords); + } + + if(getCancel()) + { + return {}; + } + + // Set up preprocessing conditions (allocation for parallelization) + size = newTrianglesIndexList.size(); + reducedTriangle.resizeFaceList(size); // resize accordingly + + // parse triangles and reassign indexes to match new vertex list + ParallelDataAlgorithm dataAlg; + dataAlg.setRange(0, size); + dataAlg.execute(PopulateReducedGeometryTrianglesImpl(originalTriangle, reducedTriangle, newTrianglesIndexList, VertexListIndices)); + + return {}; +} diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/RemoveFlaggedTriangles.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/RemoveFlaggedTriangles.hpp new file mode 100644 index 0000000000..a4374de110 --- /dev/null +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/RemoveFlaggedTriangles.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include "SimplnxCore/SimplnxCore_export.hpp" + +#include "simplnx/DataStructure/DataPath.hpp" +#include "simplnx/DataStructure/DataStructure.hpp" +#include "simplnx/Filter/IFilter.hpp" +#include "simplnx/Parameters/ArraySelectionParameter.hpp" +#include "simplnx/Parameters/DataGroupSelectionParameter.hpp" +#include "simplnx/Parameters/StringParameter.hpp" + +namespace nx::core +{ +struct SIMPLNXCORE_EXPORT RemoveFlaggedTrianglesInputValues +{ + DataPath TriangleGeometry; + DataPath MaskArrayPath; + DataPath ReducedTriangleGeometry; +}; + +/** + * @class ConditionalSetValue + * @brief This filter replaces values in the target array with a user specified value + * where a bool mask array specifies. + */ +class SIMPLNXCORE_EXPORT RemoveFlaggedTriangles +{ +public: + RemoveFlaggedTriangles(DataStructure& dataStructure, const IFilter::MessageHandler& mesgHandler, const std::atomic_bool& shouldCancel, RemoveFlaggedTrianglesInputValues* inputValues); + ~RemoveFlaggedTriangles() noexcept = default; + + RemoveFlaggedTriangles(const RemoveFlaggedTriangles&) = delete; + RemoveFlaggedTriangles(RemoveFlaggedTriangles&&) noexcept = delete; + RemoveFlaggedTriangles& operator=(const RemoveFlaggedTriangles&) = delete; + RemoveFlaggedTriangles& operator=(RemoveFlaggedTriangles&&) noexcept = delete; + + Result<> operator()(); + + const std::atomic_bool& getCancel(); + +private: + DataStructure& m_DataStructure; + const RemoveFlaggedTrianglesInputValues* m_InputValues = nullptr; + const std::atomic_bool& m_ShouldCancel; + const IFilter::MessageHandler& m_MessageHandler; +}; +} // namespace nx::core diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/LabelTriangleGeometryFilter.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/LabelTriangleGeometryFilter.cpp new file mode 100644 index 0000000000..728f983b8b --- /dev/null +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/LabelTriangleGeometryFilter.cpp @@ -0,0 +1,156 @@ +#include "LabelTriangleGeometryFilter.hpp" + +#include "SimplnxCore/Filters/Algorithms/LabelTriangleGeometry.hpp" + +#include "simplnx/DataStructure/DataPath.hpp" +#include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" +#include "simplnx/Filter/Actions/CreateArrayAction.hpp" +#include "simplnx/Filter/Actions/CreateAttributeMatrixAction.hpp" +#include "simplnx/Parameters/ArrayCreationParameter.hpp" +#include "simplnx/Parameters/DataObjectNameParameter.hpp" +#include "simplnx/Parameters/GeometrySelectionParameter.hpp" +#include "simplnx/Utilities/SIMPLConversion.hpp" + +using namespace nx::core; + +namespace nx::core +{ +//------------------------------------------------------------------------------ +std::string LabelTriangleGeometryFilter::name() const +{ + return FilterTraits::name.str(); +} + +//------------------------------------------------------------------------------ +std::string LabelTriangleGeometryFilter::className() const +{ + return FilterTraits::className; +} + +//------------------------------------------------------------------------------ +Uuid LabelTriangleGeometryFilter::uuid() const +{ + return FilterTraits::uuid; +} + +//------------------------------------------------------------------------------ +std::string LabelTriangleGeometryFilter::humanName() const +{ + return "Label CAD Geometry"; +} + +//------------------------------------------------------------------------------ +std::vector LabelTriangleGeometryFilter::defaultTags() const +{ + return {"Surface Meshing", "Mapping"}; +} + +//------------------------------------------------------------------------------ +Parameters LabelTriangleGeometryFilter::parameters() const +{ + Parameters params; + + // Create the parameter descriptors that are needed for this filter + params.insertSeparator(Parameters::Separator{"Required Data Objects"}); + params.insert(std::make_unique(k_TriangleGeomPath_Key, "Triangle Geometry", "The CAD Geometry to be labeled (TriangleGeom)", DataPath{}, + GeometrySelectionParameter::AllowedTypes{GeometrySelectionParameter::AllowedType::Triangle})); + + params.insertSeparator(Parameters::Separator{"Created Data Objects"}); + params.insert(std::make_unique(k_CreatedRegionIdsPath_Key, "Region Ids", "The triangle id array for indexing into triangle groupings", DataPath({"Region Ids"}))); + + params.insert(std::make_unique(k_TriangleAttributeMatrixName_Key, "Cell Feature Attribute Matrix Name", + "The name of the Cell Feature Attribute Matrix that will hold information arrays about each group; created in the CAD geometry", + "Cell Feature AM")); + params.insert(std::make_unique(k_NumTrianglesName_Key, "Number of Triangles Array Name", + "The name of array created in the new AM that stores the number of triangles per group", "NumTriangles")); + + return params; +} + +//------------------------------------------------------------------------------ +IFilter::UniquePointer LabelTriangleGeometryFilter::clone() const +{ + return std::make_unique(); +} + +//------------------------------------------------------------------------------ +IFilter::PreflightResult LabelTriangleGeometryFilter::preflightImpl(const DataStructure& dataStructure, const Arguments& filterArgs, const MessageHandler& messageHandler, + const std::atomic_bool& shouldCancel) const +{ + auto pTriangleGeomPathValue = filterArgs.value(k_TriangleGeomPath_Key); + auto pRegionIdsNameValue = filterArgs.value(k_CreatedRegionIdsPath_Key); + auto pTriangleAMNameValue = filterArgs.value(k_TriangleAttributeMatrixName_Key); + auto pNumTrianglesNameValue = filterArgs.value(k_NumTrianglesName_Key); + + Result resultOutputActions; + std::vector preflightUpdatedValues; + + { + const auto* triangleGeomPtr = dataStructure.getDataAs(pTriangleGeomPathValue); + if(triangleGeomPtr == nullptr) + { + return MakePreflightErrorResult(-34510, fmt::format("{} is not a valid Triangle Geometry", pTriangleGeomPathValue.toString())); + } + usize numTris = triangleGeomPtr->getNumberOfFaces(); + auto createArrayAction = std::make_unique(DataType::int32, std::vector{numTris}, std::vector{1}, pRegionIdsNameValue); + resultOutputActions.value().appendAction(std::move(createArrayAction)); + } + + DataPath triAMPath = pTriangleGeomPathValue.createChildPath(pTriangleAMNameValue); + std::vector tDims(1, 1); + { + auto createAMAction = std::make_unique(triAMPath, tDims); + resultOutputActions.value().appendAction(std::move(createAMAction)); + } + + { + DataPath numTrianglesPath = triAMPath.createChildPath(pNumTrianglesNameValue); + auto createArrayAction = std::make_unique(DataType::uint64, tDims, std::vector{1}, numTrianglesPath); + resultOutputActions.value().appendAction(std::move(createArrayAction)); + } + + // Return both the resultOutputActions and the preflightUpdatedValues via std::move() + return {std::move(resultOutputActions), std::move(preflightUpdatedValues)}; +} + +//------------------------------------------------------------------------------ +Result<> LabelTriangleGeometryFilter::executeImpl(DataStructure& dataStructure, const Arguments& filterArgs, const PipelineFilter* pipelineNode, const MessageHandler& messageHandler, + const std::atomic_bool& shouldCancel) const +{ + LabelTriangleGeometryInputValues inputValues; + + inputValues.TriangleGeomPath = filterArgs.value(k_TriangleGeomPath_Key); + inputValues.RegionIdsPath = filterArgs.value(k_CreatedRegionIdsPath_Key); + inputValues.TriangleAMPath = inputValues.TriangleGeomPath.createChildPath(filterArgs.value(k_TriangleAttributeMatrixName_Key)); + inputValues.NumTrianglesPath = inputValues.TriangleAMPath.createChildPath(filterArgs.value(k_NumTrianglesName_Key)); + + return LabelTriangleGeometry(dataStructure, messageHandler, shouldCancel, &inputValues)(); +} + +namespace +{ +namespace SIMPL +{ +constexpr StringLiteral k_CADDataContainerPathKey = "CADDataContainerPath"; +constexpr StringLiteral k_RegionIdArrayNameKey = "RegionIdArrayName"; +constexpr StringLiteral k_TriangleAttributeMatrixNameKey = "TriangleAttributeMatrixName"; +constexpr StringLiteral k_NumTrianglesArrayNameKey = "NumTrianglesArrayName"; +} // namespace SIMPL +} // namespace + +Result LabelTriangleGeometryFilter::FromSIMPLJson(const nlohmann::json& json) +{ + Arguments args = LabelTriangleGeometryFilter().getDefaultArguments(); + + std::vector> results; + + results.push_back(SIMPLConversion::ConvertParameter(args, json, SIMPL::k_CADDataContainerPathKey, k_TriangleGeomPath_Key)); + results.push_back(SIMPLConversion::ConvertParameter(args, json, SIMPL::k_RegionIdArrayNameKey, k_CreatedRegionIdsPath_Key)); + results.push_back(SIMPLConversion::ConvertParameter(args, json, SIMPL::k_TriangleAttributeMatrixNameKey, k_TriangleAttributeMatrixName_Key)); + results.push_back(SIMPLConversion::ConvertParameter>(args, json, SIMPL::k_NumTrianglesArrayNameKey, k_NumTrianglesName_Key)); + + Result<> conversionResult = MergeResults(std::move(results)); + + return ConvertResultTo(std::move(conversionResult), std::move(args)); +} +} // namespace nx::core diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/LabelTriangleGeometryFilter.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/LabelTriangleGeometryFilter.hpp new file mode 100644 index 0000000000..e90ba2db5f --- /dev/null +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/LabelTriangleGeometryFilter.hpp @@ -0,0 +1,106 @@ +#pragma once + +#include "SimplnxCore/SimplnxCore_export.hpp" + +#include "simplnx/Filter/FilterTraits.hpp" +#include "simplnx/Filter/IFilter.hpp" + +namespace nx::core +{ +/** + * @class LabelTriangleGeometryFilter + * @brief + */ +class SIMPLNXCORE_EXPORT LabelTriangleGeometryFilter : public IFilter +{ +public: + LabelTriangleGeometryFilter() = default; + ~LabelTriangleGeometryFilter() noexcept override = default; + + LabelTriangleGeometryFilter(const LabelTriangleGeometryFilter&) = delete; + LabelTriangleGeometryFilter(LabelTriangleGeometryFilter&&) noexcept = delete; + + LabelTriangleGeometryFilter& operator=(const LabelTriangleGeometryFilter&) = delete; + LabelTriangleGeometryFilter& operator=(LabelTriangleGeometryFilter&&) noexcept = delete; + + // Parameter Keys + static inline constexpr StringLiteral k_TriangleGeomPath_Key = "triangle_geom_path"; + static inline constexpr StringLiteral k_CreatedRegionIdsPath_Key = "created_region_ids_path"; + static inline constexpr StringLiteral k_TriangleAttributeMatrixName_Key = "triangle_attribute_matrix_name"; + static inline constexpr StringLiteral k_NumTrianglesName_Key = "num_triangles_name"; + + /** + * @brief Reads SIMPL json and converts it complex Arguments. + * @param json + * @return Result + */ + static Result FromSIMPLJson(const nlohmann::json& json); + + /** + * @brief Returns the name of the filter. + * @return + */ + std::string name() const override; + + /** + * @brief Returns the C++ classname of this filter. + * @return + */ + std::string className() const override; + + /** + * @brief Returns the uuid of the filter. + * @return + */ + Uuid uuid() const override; + + /** + * @brief Returns the human readable name of the filter. + * @return + */ + std::string humanName() const override; + + /** + * @brief Returns the default tags for this filter. + * @return + */ + std::vector defaultTags() const override; + + /** + * @brief Returns the parameters of the filter (i.e. its inputs) + * @return + */ + Parameters parameters() const override; + + /** + * @brief Returns a copy of the filter. + * @return + */ + UniquePointer clone() const override; + +protected: + /** + * @brief Takes in a DataStructure and checks that the filter can be run on it with the given arguments. + * Returns any warnings/errors. Also returns the changes that would be applied to the DataStructure. + * Some parts of the actions may not be completely filled out if all the required information is not available at preflight time. + * @param ds The input DataStructure instance + * @param filterArgs These are the input values for each parameter that is required for the filter + * @param messageHandler The MessageHandler object + * @return Returns a Result object with error or warning values if any of those occurred during execution of this function + */ + PreflightResult preflightImpl(const DataStructure& ds, const Arguments& filterArgs, const MessageHandler& messageHandler, const std::atomic_bool& shouldCancel) const override; + + /** + * @brief Applies the filter's algorithm to the DataStructure with the given arguments. Returns any warnings/errors. + * On failure, there is no guarantee that the DataStructure is in a correct state. + * @param ds The input DataStructure instance + * @param filterArgs These are the input values for each parameter that is required for the filter + * @param messageHandler The MessageHandler object + * @return Returns a Result object with error or warning values if any of those occurred during execution of this function + */ + Result<> executeImpl(DataStructure& data, const Arguments& filterArgs, const PipelineFilter* pipelineNode, const MessageHandler& messageHandler, const std::atomic_bool& shouldCancel) const override; +}; +} // namespace nx::core + +SIMPLNX_DEF_FILTER_TRAITS(nx::core, LabelTriangleGeometryFilter, "7a7a2c6f-3b03-444d-8b8c-5976b0e5c82e"); +/* LEGACY UUID FOR THIS FILTER a250a228-3b6b-5b37-a6e4-8687484f04c4 */ diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/RemoveFlaggedTrianglesFilter.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/RemoveFlaggedTrianglesFilter.cpp new file mode 100644 index 0000000000..9aae7d45cf --- /dev/null +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/RemoveFlaggedTrianglesFilter.cpp @@ -0,0 +1,143 @@ +#include "RemoveFlaggedTrianglesFilter.hpp" + +#include "SimplnxCore/Filters/Algorithms/RemoveFlaggedTriangles.hpp" + +#include "simplnx/DataStructure/DataPath.hpp" +#include "simplnx/Filter/Actions/CreateGeometry2DAction.hpp" +#include "simplnx/Filter/Actions/EmptyAction.hpp" +#include "simplnx/Parameters/ArraySelectionParameter.hpp" +#include "simplnx/Parameters/DataGroupCreationParameter.hpp" +#include "simplnx/Parameters/GeometrySelectionParameter.hpp" +#include "simplnx/Parameters/StringParameter.hpp" +#include "simplnx/Utilities/SIMPLConversion.hpp" + +using namespace nx::core; + +namespace nx::core +{ +//------------------------------------------------------------------------------ +std::string RemoveFlaggedTrianglesFilter::name() const +{ + return FilterTraits::name.str(); +} + +//------------------------------------------------------------------------------ +std::string RemoveFlaggedTrianglesFilter::className() const +{ + return FilterTraits::className; +} + +//------------------------------------------------------------------------------ +Uuid RemoveFlaggedTrianglesFilter::uuid() const +{ + return FilterTraits::uuid; +} + +//------------------------------------------------------------------------------ +std::string RemoveFlaggedTrianglesFilter::humanName() const +{ + return "Remove Flagged Triangles"; +} + +//------------------------------------------------------------------------------ +std::vector RemoveFlaggedTrianglesFilter::defaultTags() const +{ + return {"Surface Meshing", "Cleanup"}; +} + +//------------------------------------------------------------------------------ +Parameters RemoveFlaggedTrianglesFilter::parameters() const +{ + Parameters params; + + // Create the parameter descriptors that are needed for this filter + params.insertSeparator(Parameters::Separator{"Required Input Data Objects"}); + params.insert(std::make_unique(k_InputGeometry_Key, "Triangle|Quad Geometry", "The Triangle|Quad Geometry that will be processed.", DataPath(), + GeometrySelectionParameter::AllowedTypes{IGeometry::Type::Triangle, IGeometry::Type::Quad})); + params.insert(std::make_unique(k_MaskArrayPath_Key, "Mask", "The DataArrayPath to the mask array that marks each face as either true (remove) or false(keep).", DataPath{}, + ArraySelectionParameter::AllowedTypes{DataType::boolean}, ArraySelectionParameter::AllowedComponentShapes{{1}})); + + params.insertSeparator(Parameters::Separator{"Created Geometry"}); + params.insert(std::make_unique(k_OutputGeometry_Key, "Created Geometry", "The name of the created Triangle Geometry", DataPath({"ReducedGeometry"}))); + return params; +} + +//------------------------------------------------------------------------------ +IFilter::UniquePointer RemoveFlaggedTrianglesFilter::clone() const +{ + return std::make_unique(); +} + +//------------------------------------------------------------------------------ +IFilter::PreflightResult RemoveFlaggedTrianglesFilter::preflightImpl(const DataStructure& dataStructure, const Arguments& filterArgs, const MessageHandler& messageHandler, + const std::atomic_bool& shouldCancel) const +{ + auto pInitialGeometryPathValue = filterArgs.value(k_InputGeometry_Key); + auto pReducedGeometryPathValue = filterArgs.value(k_OutputGeometry_Key); + + PreflightResult preflightResult; + Result resultOutputActions; + std::vector preflightUpdatedValues; + + const auto* initialGeom = dataStructure.getDataAs(pInitialGeometryPathValue); + + if(initialGeom->getGeomType() == IGeometry::Type::Triangle) + { + auto createGeometryAction = std::make_unique>( + pReducedGeometryPathValue, initialGeom->getNumberOfFaces(), initialGeom->getNumberOfVertices(), + (initialGeom->getVertexAttributeMatrix() == nullptr ? "VertexAM" : initialGeom->getVertexAttributeMatrix()->getName()), + (initialGeom->getFaceAttributeMatrix() == nullptr ? "FaceAM" : initialGeom->getFaceAttributeMatrix()->getName()), initialGeom->getVertices()->getName(), initialGeom->getFaces()->getName()); + resultOutputActions.value().appendAction(std::move(createGeometryAction)); + } + + if(initialGeom->getGeomType() == IGeometry::Type::Quad) + { + auto createGeometryAction = std::make_unique>( + pReducedGeometryPathValue, initialGeom->getNumberOfFaces(), initialGeom->getNumberOfVertices(), + (initialGeom->getVertexAttributeMatrix() == nullptr ? "VertexAM" : initialGeom->getVertexAttributeMatrix()->getName()), + (initialGeom->getFaceAttributeMatrix() == nullptr ? "FaceAM" : initialGeom->getFaceAttributeMatrix()->getName()), initialGeom->getVertices()->getName(), initialGeom->getFaces()->getName()); + resultOutputActions.value().appendAction(std::move(createGeometryAction)); + } + + // Return both the resultOutputActions and the preflightUpdatedValues via std::move() + return {std::move(resultOutputActions), std::move(preflightUpdatedValues)}; +} + +//------------------------------------------------------------------------------ +Result<> RemoveFlaggedTrianglesFilter::executeImpl(DataStructure& dataStructure, const Arguments& filterArgs, const PipelineFilter* pipelineNode, const MessageHandler& messageHandler, + const std::atomic_bool& shouldCancel) const +{ + RemoveFlaggedTrianglesInputValues inputValues; + + inputValues.TriangleGeometry = filterArgs.value(k_InputGeometry_Key); + inputValues.MaskArrayPath = filterArgs.value(k_MaskArrayPath_Key); + inputValues.ReducedTriangleGeometry = filterArgs.value(k_OutputGeometry_Key); + + return RemoveFlaggedTriangles(dataStructure, messageHandler, shouldCancel, &inputValues)(); +} + +namespace +{ +namespace SIMPL +{ +constexpr StringLiteral k_TriangleGeometryKey = "TriangleGeometry"; +constexpr StringLiteral k_MaskArrayPathKey = "MaskArrayPath"; +constexpr StringLiteral k_ReducedTriangleGeometryKey = "ReducedTriangleGeometry"; +} // namespace SIMPL +} // namespace + +Result RemoveFlaggedTrianglesFilter::FromSIMPLJson(const nlohmann::json& json) +{ + Arguments args = RemoveFlaggedTrianglesFilter().getDefaultArguments(); + + std::vector> results; + + results.push_back(SIMPLConversion::ConvertParameter(args, json, SIMPL::k_TriangleGeometryKey, k_InputGeometry_Key)); + results.push_back(SIMPLConversion::ConvertParameter(args, json, SIMPL::k_MaskArrayPathKey, k_MaskArrayPath_Key)); + results.push_back(SIMPLConversion::ConvertParameter(args, json, SIMPL::k_ReducedTriangleGeometryKey, k_OutputGeometry_Key)); + + Result<> conversionResult = MergeResults(std::move(results)); + + return ConvertResultTo(std::move(conversionResult), std::move(args)); +} +} // namespace nx::core diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/RemoveFlaggedTrianglesFilter.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/RemoveFlaggedTrianglesFilter.hpp new file mode 100644 index 0000000000..5b03c04202 --- /dev/null +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/RemoveFlaggedTrianglesFilter.hpp @@ -0,0 +1,105 @@ +#pragma once + +#include "SimplnxCore/SimplnxCore_export.hpp" + +#include "simplnx/Filter/FilterTraits.hpp" +#include "simplnx/Filter/IFilter.hpp" + +namespace nx::core +{ +/** + * @class RemoveFlaggedTrianglesFilter + * @brief This filter will .... + */ +class SIMPLNXCORE_EXPORT RemoveFlaggedTrianglesFilter : public IFilter +{ +public: + RemoveFlaggedTrianglesFilter() = default; + ~RemoveFlaggedTrianglesFilter() noexcept override = default; + + RemoveFlaggedTrianglesFilter(const RemoveFlaggedTrianglesFilter&) = delete; + RemoveFlaggedTrianglesFilter(RemoveFlaggedTrianglesFilter&&) noexcept = delete; + + RemoveFlaggedTrianglesFilter& operator=(const RemoveFlaggedTrianglesFilter&) = delete; + RemoveFlaggedTrianglesFilter& operator=(RemoveFlaggedTrianglesFilter&&) noexcept = delete; + + // Parameter Keys + static inline constexpr StringLiteral k_InputGeometry_Key = "input_geometry"; + static inline constexpr StringLiteral k_MaskArrayPath_Key = "mask_array_path"; + static inline constexpr StringLiteral k_OutputGeometry_Key = "output_geometry"; + + /** + * @brief Reads SIMPL json and converts it complex Arguments. + * @param json + * @return Result + */ + static Result FromSIMPLJson(const nlohmann::json& json); + + /** + * @brief Returns the name of the filter. + * @return + */ + std::string name() const override; + + /** + * @brief Returns the C++ classname of this filter. + * @return + */ + std::string className() const override; + + /** + * @brief Returns the uuid of the filter. + * @return + */ + Uuid uuid() const override; + + /** + * @brief Returns the human readable name of the filter. + * @return + */ + std::string humanName() const override; + + /** + * @brief Returns the default tags for this filter. + * @return + */ + std::vector defaultTags() const override; + + /** + * @brief Returns the parameters of the filter (i.e. its inputs) + * @return + */ + Parameters parameters() const override; + + /** + * @brief Returns a copy of the filter. + * @return + */ + UniquePointer clone() const override; + +protected: + /** + * @brief Takes in a DataStructure and checks that the filter can be run on it with the given arguments. + * Returns any warnings/errors. Also returns the changes that would be applied to the DataStructure. + * Some parts of the actions may not be completely filled out if all the required information is not available at preflight time. + * @param ds The input DataStructure instance + * @param filterArgs These are the input values for each parameter that is required for the filter + * @param messageHandler The MessageHandler object + * @return Returns a Result object with error or warning values if any of those occurred during execution of this function + */ + PreflightResult preflightImpl(const DataStructure& ds, const Arguments& filterArgs, const MessageHandler& messageHandler, const std::atomic_bool& shouldCancel) const override; + + /** + * @brief Applies the filter's algorithm to the DataStructure with the given arguments. Returns any warnings/errors. + * On failure, there is no guarantee that the DataStructure is in a correct state. + * @param ds The input DataStructure instance + * @param filterArgs These are the input values for each parameter that is required for the filter + * @param messageHandler The MessageHandler object + * @return Returns a Result object with error or warning values if any of those occurred during execution of this function + */ + Result<> executeImpl(DataStructure& data, const Arguments& filterArgs, const PipelineFilter* pipelineNode, const MessageHandler& messageHandler, const std::atomic_bool& shouldCancel) const override; +}; +} // namespace nx::core + +SIMPLNX_DEF_FILTER_TRAITS(nx::core, RemoveFlaggedTrianglesFilter, "38155c61-2709-4731-be95-43745bb3f8d8"); +/* LEGACY UUID FOR THIS FILTER 379ccc67-16dd-530a-984f-177db9351bac */ diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/SimplnxCoreLegacyUUIDMapping.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/SimplnxCoreLegacyUUIDMapping.hpp index 1f9bd98fdf..c8b0d01396 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/SimplnxCoreLegacyUUIDMapping.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/SimplnxCoreLegacyUUIDMapping.hpp @@ -118,6 +118,8 @@ #include "SimplnxCore/Filters/KMedoidsFilter.hpp" #include "SimplnxCore/Filters/KMeansFilter.hpp" #include "SimplnxCore/Filters/SilhouetteFilter.hpp" +#include "SimplnxCore/Filters/LabelTriangleGeometryFilter.hpp" +#include "SimplnxCore/Filters/RemoveFlaggedTrianglesFilter.hpp" // @@__HEADER__TOKEN__DO__NOT__DELETE__@@ namespace nx::core @@ -241,6 +243,8 @@ namespace nx::core {nx::core::Uuid::FromString("f7486aa6-3049-5be7-8511-ae772b70c90b").value(), {nx::core::FilterTraits::uuid, &KMedoidsFilter::FromSIMPLJson}}, // KMedoids {nx::core::Uuid::FromString("b56a04de-0ca0-509d-809f-52219fca9c98").value(), {nx::core::FilterTraits::uuid, &KMeansFilter::FromSIMPLJson}}, // KMeans {nx::core::Uuid::FromString("f84d4d69-9ea5-54b6-a71c-df76d76d50cf").value(), {nx::core::FilterTraits::uuid, &SilhouetteFilter::FromSIMPLJson}}, // Silhouette + {nx::core::Uuid::FromString("a250a228-3b6b-5b37-a6e4-8687484f04c4").value(), {nx::core::FilterTraits::uuid, &LabelTriangleGeometryFilter::FromSIMPLJson}}, // LabelTriangleGeometry + {nx::core::Uuid::FromString("379ccc67-16dd-530a-984f-177db9351bac").value(), {nx::core::FilterTraits::uuid, &RemoveFlaggedTrianglesFilter::FromSIMPLJson}}, // RemoveFlaggedTriangles // @@__MAP__UPDATE__TOKEN__DO__NOT__DELETE__@@ }; diff --git a/src/Plugins/SimplnxCore/test/CMakeLists.txt b/src/Plugins/SimplnxCore/test/CMakeLists.txt index 67a3e9a4b9..69e8a24f66 100644 --- a/src/Plugins/SimplnxCore/test/CMakeLists.txt +++ b/src/Plugins/SimplnxCore/test/CMakeLists.txt @@ -79,6 +79,7 @@ set(${PLUGIN_NAME}UnitTest_SRCS IterativeClosestPointTest.cpp KMeansTest.cpp KMedoidsTest.cpp + LabelTriangleGeometryTest.cpp LaplacianSmoothingFilterTest.cpp MapPointCloudToRegularGridTest.cpp MinNeighborsTest.cpp @@ -99,6 +100,7 @@ set(${PLUGIN_NAME}UnitTest_SRCS ReadVolumeGraphicsFileTest.cpp RegularGridSampleSurfaceMeshTest.cpp RemoveFlaggedFeaturesTest.cpp + RemoveFlaggedTrianglesTest.cpp RemoveFlaggedVerticesTest.cpp RemoveMinimumSizeFeaturesTest.cpp RenameDataObjectTest.cpp @@ -206,7 +208,7 @@ if(EXISTS "${DREAM3D_DATA_DIR}" AND SIMPLNX_DOWNLOAD_TEST_FILES) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME 6_6_write_stl_test.tar.gz SHA512 d1e929246f73515b006d99392414a4b5a2afe6c96261a7cbccbcbb68cc0be1e43a987f6ab4a8fff21914fe3f15bf7f59b4387d8314cbdf8697f5c8cea40fa481) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME 6_6_interpolate_point_cloud_to_regular_grid.tar.gz SHA512 287500082913dfbf62c5f66ec5185c3db53cedc20a2c89c28b23a208ddfca47c377d557d2f509c1d72f3aff8aadc3058e6932159a6cef73f33227ad433f14752) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME 6_6_resample_rect_grid_to_image_geom.tar.gz SHA512 58cabfb83deeef7aff1252963a8cb378745ca00fc120a9623f699b4c9c618d216c4d3fa88e964772706a0096e979abc741be7ba6f96a2398162b3f6d4ec8ec13) - download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME 6_6_combine_stl_files.tar.gz SHA512 109dfb39ac04213a7d8bc8ef3d852f112177ad1a1c624926e980c2a3e30af04ff3c48b8cf315d04fd2b8d0270b1defa33078511243d9ac2def37a8b43884120b) + download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME 6_6_combine_stl_files_v2.tar.gz SHA512 40235976b9897365c338587056dc9ba90466b3eca58d6b310d59f7df16592b53647349daa1c7247cdcf01b5940596ad53d39eb734549dda4e829ae93a5928a4a) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME 6_6_avizo_writers.tar.gz SHA512 f776eb5c86e06bde0fb1ee76dbdf95e4fd1457697033b2c639cac376db3ba0b05410ed4074fb10a47dd26ef79c78a02b5bb77c04cfe1299e8a33d8b3bff09749) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME vtk_rectilinear_grid_writer.tar.gz SHA512 9fef02b5269609503d03dd0126cc635cc1c1156894cff18b0184b334d705b850ca1a06ae0d1c66a352a32dd9ad9fb74f24255c7de1399b06bbec7d2e2b41941b ) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME Small_IN100_dream3d.tar.gz SHA512 6dd8a3412532bdc7481f7781c7087b4477c6a1efbe6b214f997dad30c53c59714a751be522f084b98065fe75100c74df901bb8af2f512ef47344d8f7941575cf ) @@ -222,6 +224,8 @@ if(EXISTS "${DREAM3D_DATA_DIR}" AND SIMPLNX_DOWNLOAD_TEST_FILES) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME SurfaceMeshTest.tar.gz SHA512 a74e9fa40ccec78174dbbac90969bfa17367c3a7e14b7b84624032317c351de89957750803d7cb43c67dec19281ee4f647de022d474566fd43e25b8230cce6d6) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME initialize_data_test_files.tar.gz SHA512 f04fe76ef96add4b775111ae7fc95233a7748a25501d9f00a8b2a162c87782b8cd2813e6e46ba7892e721976693da06965e624335dbb28224c9c5b877a05aa49) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME 6_6_write_stl_file_test.tar.gz SHA512 05455dfb57724a14a3b2d92ad02ac335b5596ca4f353830ee60d84ffc858523136140328a1c95b6693331be9dc5c40a26e76f45ee54ab11e218f5efb6b2a4c38) + download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME label_triangle_geometry_test.tar.gz SHA512 9281fa954c842ca1881ba932d6d96b9c43601b466b6b7ae33721d1c886629ba68986a3ccaf774f5be577e8bfce145612f77a2b98af319e6aa35a3e0aeb607597) + download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME remove_flagged_triangles_test.tar.gz SHA512 cd5c6f3ea16a6d09e00e0c0bd0f941b27dca8a0beaeabb7262a2a6adaad83c829187c5d1aa433718123b628eaa839f016604c1134ced9f870723594b2df4be99) endif() @@ -243,7 +247,8 @@ set(PREBUILT_PIPELINE_NAMES "${${PLUGIN_NAME}_SOURCE_DIR}/pipelines/Import_CSV_Data.d3dpipeline" "${${PLUGIN_NAME}_SOURCE_DIR}/pipelines/Import_STL_Model.d3dpipeline" "${${PLUGIN_NAME}_SOURCE_DIR}/pipelines/Triangle_Face_Data_Demo.d3dpipeline" - + "${${PLUGIN_NAME}_SOURCE_DIR}/pipelines/Remove_Triangles.d3dpipeline" + # These are workflow files # "${${PLUGIN_NAME}_SOURCE_DIR}/pipelines/Import_ASCII_Data.d3dworkflow" diff --git a/src/Plugins/SimplnxCore/test/CombineStlFilesTest.cpp b/src/Plugins/SimplnxCore/test/CombineStlFilesTest.cpp index 1053bbee7f..5f51b1efb2 100644 --- a/src/Plugins/SimplnxCore/test/CombineStlFilesTest.cpp +++ b/src/Plugins/SimplnxCore/test/CombineStlFilesTest.cpp @@ -21,16 +21,14 @@ inline const DataPath k_ExemplarTriangleDataContainerName({k_TriangleDataContain TEST_CASE("SimplnxCore::CombineStlFilesFilter: Valid Filter Execution", "[SimplnxCore][CombineStlFilesFilter]") { - const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_CMakeExecutable, nx::core::unit_test::k_TestFilesDir, "6_6_combine_stl_files.tar.gz", + const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_CMakeExecutable, nx::core::unit_test::k_TestFilesDir, "6_6_combine_stl_files_v2.tar.gz", "6_6_combine_stl_files.dream3d"); - const nx::core::UnitTest::TestFileSentinel testDataSentinel1(nx::core::unit_test::k_CMakeExecutable, nx::core::unit_test::k_TestFilesDir, "STL_Models.tar.gz", "STL_Models"); - // Read Exemplar DREAM3D File Filter - auto exemplarFilePath = fs::path(fmt::format("{}/6_6_combine_stl_files.dream3d", unit_test::k_TestFilesDir)); + auto exemplarFilePath = fs::path(fmt::format("{}/6_6_combine_stl_files_v2/6_6_combine_stl_files.dream3d", unit_test::k_TestFilesDir)); DataStructure dataStructure = UnitTest::LoadDataStructure(exemplarFilePath); - std::string inputStlDir = fmt::format("{}/STL_Models", unit_test::k_TestFilesDir.view()); + std::string inputStlDir = fmt::format("{}/6_6_combine_stl_files_v2/STL_Models", unit_test::k_TestFilesDir.view()); // Instantiate the filter, a DataStructure object and an Arguments Object CombineStlFilesFilter filter; diff --git a/src/Plugins/SimplnxCore/test/LabelTriangleGeometryTest.cpp b/src/Plugins/SimplnxCore/test/LabelTriangleGeometryTest.cpp new file mode 100644 index 0000000000..e2ed39c087 --- /dev/null +++ b/src/Plugins/SimplnxCore/test/LabelTriangleGeometryTest.cpp @@ -0,0 +1,55 @@ +#include + +#include "SimplnxCore/Filters/LabelTriangleGeometryFilter.hpp" +#include "SimplnxCore/SimplnxCore_test_dirs.hpp" +#include "simplnx/UnitTest/UnitTestCommon.hpp" + +using namespace nx::core; + +namespace +{ +fs::path k_ExemplarDataFilePath = fs::path(fmt::format("{}/label_triangle_geometry_test/label_triangle_geometry_test.dream3d", nx::core::unit_test::k_TestFilesDir)); +fs::path k_BaseDataFilePath = fs::path(fmt::format("{}/label_triangle_geometry_test/data_to_generate_test/combined_stls.dream3d", nx::core::unit_test::k_TestFilesDir)); + +static constexpr StringLiteral k_CreatedAMName = "Cell Feature AM"; +static constexpr StringLiteral k_NumTrianglesName = "NumTriangles"; +static constexpr StringLiteral k_RegionIdsName = "Region Ids"; + +const DataPath k_TriangleGeomPath({"TriangleGeometry"}); +const DataPath k_CreatedRegionIdsPath = k_TriangleGeomPath.createChildPath(Constants::k_Face_Data).createChildPath(k_RegionIdsName); +const DataPath k_CellFeatureAMPath = k_TriangleGeomPath.createChildPath(k_CreatedAMName); +const DataPath k_NumTrianglesPath = k_CellFeatureAMPath.createChildPath(k_NumTrianglesName); +} // namespace + +TEST_CASE("SimplnxCore::LabelTriangleGeometryFilter: Valid Filter Execution", "[SimplnxCore][LabelTriangleGeometryFilter]") +{ + const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_CMakeExecutable, nx::core::unit_test::k_TestFilesDir, "label_triangle_geometry_test.tar.gz", + "label_triangle_geometry_test"); + + DataStructure dataStructure = UnitTest::LoadDataStructure(k_BaseDataFilePath); + + { + // Instantiate the filter, a DataStructure object and an Arguments Object + LabelTriangleGeometryFilter filter; + Arguments args; + + // Create default Parameters for the filter. + args.insertOrAssign(LabelTriangleGeometryFilter::k_TriangleGeomPath_Key, std::make_any(::k_TriangleGeomPath)); + args.insertOrAssign(LabelTriangleGeometryFilter::k_CreatedRegionIdsPath_Key, std::make_any(::k_CreatedRegionIdsPath)); + args.insertOrAssign(LabelTriangleGeometryFilter::k_TriangleAttributeMatrixName_Key, std::make_any(::k_CreatedAMName)); + args.insertOrAssign(LabelTriangleGeometryFilter::k_NumTrianglesName_Key, std::make_any(::k_NumTrianglesName)); + + // Preflight the filter and check result + auto preflightResult = filter.preflight(dataStructure, args); + REQUIRE(preflightResult.outputActions.valid()); + + // Execute the filter and check the result + auto executeResult = filter.execute(dataStructure, args); + REQUIRE(executeResult.result.valid()); + } + + DataStructure exemplarDataStructure = UnitTest::LoadDataStructure(k_ExemplarDataFilePath); + + UnitTest::CompareExemplarToGeneratedData(dataStructure, exemplarDataStructure, ::k_CellFeatureAMPath, ::k_TriangleGeomPath.toString()); + UnitTest::CompareExemplarToGeneratedData(dataStructure, exemplarDataStructure, ::k_TriangleGeomPath.createChildPath(Constants::k_Face_Data), ::k_TriangleGeomPath.toString()); +} diff --git a/src/Plugins/SimplnxCore/test/RemoveFlaggedTrianglesTest.cpp b/src/Plugins/SimplnxCore/test/RemoveFlaggedTrianglesTest.cpp new file mode 100644 index 0000000000..ab0f8b30bb --- /dev/null +++ b/src/Plugins/SimplnxCore/test/RemoveFlaggedTrianglesTest.cpp @@ -0,0 +1,58 @@ +#include + +#include "SimplnxCore/Filters/RemoveFlaggedTrianglesFilter.hpp" +#include "SimplnxCore/SimplnxCore_test_dirs.hpp" +#include "simplnx/UnitTest/UnitTestCommon.hpp" + +using namespace nx::core; + +namespace +{ +namespace +{ +fs::path k_ExemplarDataFilePath = fs::path(fmt::format("{}/remove_flagged_triangles_test/remove_flagged_triangles_test.dream3d", nx::core::unit_test::k_TestFilesDir)); +fs::path k_BaseDataFilePath = fs::path(fmt::format("{}/remove_flagged_triangles_test/data_to_generate_test/masked_triangle_geometry.dream3d", nx::core::unit_test::k_TestFilesDir)); + +static constexpr StringLiteral k_CreatedAMName = "Cell Feature AM"; +static constexpr StringLiteral k_NumTrianglesName = "NumTriangles"; +static constexpr StringLiteral k_RegionIdsName = "Region Ids"; + +const DataPath k_TriangleGeomPath({"TriangleGeometry"}); +const DataPath k_MaskPath = k_TriangleGeomPath.createChildPath(Constants::k_Face_Data).createChildPath(Constants::k_Mask); +const DataPath k_ReducedGeomPath({"ReducedGeometry"}); + +const DataPath k_VertexListPath = k_ReducedGeomPath.createChildPath("SharedVertexList"); +const DataPath k_TriangleListPath = k_ReducedGeomPath.createChildPath("SharedTriList"); +} // namespace +} // namespace + +TEST_CASE("SimplnxCore::RemoveFlaggedTrianglesFilter: Valid Filter Execution", "[SimplnxCore][RemoveFlaggedTrianglesFilter]") +{ + const UnitTest::TestFileSentinel testDataSentinel(unit_test::k_CMakeExecutable, unit_test::k_TestFilesDir, "remove_flagged_triangles_test.tar.gz", "remove_flagged_triangles_test.dream3d"); + + // Load DataStructure containing the base geometry and an exemplar cleaned geometry + DataStructure dataStructure = UnitTest::LoadDataStructure(k_BaseDataFilePath); + { + // Instantiate the filter and an Arguments Object + RemoveFlaggedTrianglesFilter filter; + Arguments args; + + // Create default Parameters for the filter. + args.insertOrAssign(RemoveFlaggedTrianglesFilter::k_InputGeometry_Key, std::make_any(::k_TriangleGeomPath)); + args.insertOrAssign(RemoveFlaggedTrianglesFilter::k_MaskArrayPath_Key, std::make_any(::k_MaskPath)); + args.insertOrAssign(RemoveFlaggedTrianglesFilter::k_OutputGeometry_Key, std::make_any(::k_ReducedGeomPath)); + + // Preflight the filter and check result + auto preflightResult = filter.preflight(dataStructure, args); + REQUIRE(preflightResult.outputActions.valid()); + + // Execute the filter and check the result + auto executeResult = filter.execute(dataStructure, args); + REQUIRE(executeResult.result.valid()); + } + + DataStructure exemplarDataStructure = UnitTest::LoadDataStructure(k_ExemplarDataFilePath); + + UnitTest::CompareDataArrays(dataStructure.getDataRefAs(::k_TriangleListPath), exemplarDataStructure.getDataRefAs(::k_TriangleListPath)); + UnitTest::CompareDataArrays(dataStructure.getDataRefAs(::k_VertexListPath), exemplarDataStructure.getDataRefAs(::k_VertexListPath)); +} diff --git a/src/simplnx/DataStructure/DynamicListArray.hpp b/src/simplnx/DataStructure/DynamicListArray.hpp index 90e60148e5..d9c3b3ae29 100644 --- a/src/simplnx/DataStructure/DynamicListArray.hpp +++ b/src/simplnx/DataStructure/DynamicListArray.hpp @@ -85,9 +85,14 @@ class DynamicListArray : public DataObject */ DynamicListArray(const DynamicListArray& other) : DataObject(other) - , m_Array(other.m_Array) , m_Size(other.m_Size) { + allocate(other.m_Size); + + for(usize i = 0; i < other.m_Size; i++) + { + setElementList(i, other.m_Array[i]); + } } /** @@ -187,7 +192,7 @@ class DynamicListArray : public DataObject */ DataObject* shallowCopy() override { - throw std::runtime_error(""); + return new DynamicListArray(*this); } /** @@ -356,17 +361,18 @@ class DynamicListArray : public DataObject { static typename DynamicListArray::ElementList linkInit = {0, nullptr}; - // This makes sure we deallocate any lists that have been created - for(usize i = 0; i < this->m_Size; i++) + if(this->m_Array != nullptr) { - if(this->m_Array[i].cells != nullptr) + // This makes sure we deallocate any lists that have been created + for(usize i = 0; i < this->m_Size; i++) { - delete[] this->m_Array[i].cells; + if(this->m_Array[i].cells != nullptr) + { + delete[] this->m_Array[i].cells; + } } - } - // Now delete all the "ElementList" structures - if(this->m_Array != nullptr) - { + + // Now delete all the "ElementList" structures delete[] this->m_Array; } diff --git a/src/simplnx/DataStructure/Geometry/INodeGeometry1D.cpp b/src/simplnx/DataStructure/Geometry/INodeGeometry1D.cpp index 25af60551d..e5978f8a72 100644 --- a/src/simplnx/DataStructure/Geometry/INodeGeometry1D.cpp +++ b/src/simplnx/DataStructure/Geometry/INodeGeometry1D.cpp @@ -122,7 +122,10 @@ const INodeGeometry1D::ElementDynamicList* INodeGeometry1D::getElementNeighbors( void INodeGeometry1D::deleteElementNeighbors() { - getDataStructureRef().removeData(m_CellNeighborsDataArrayId); + if(!getDataStructureRef().removeData(m_CellNeighborsDataArrayId)) + { + throw std::runtime_error(fmt::format("{}({}): Function {}: Unable to remove Element Neighbors", "deleteElementNeighbors()", __FILE__, __LINE__)); + } m_CellNeighborsDataArrayId.reset(); } diff --git a/src/simplnx/DataStructure/Geometry/TriangleGeom.cpp b/src/simplnx/DataStructure/Geometry/TriangleGeom.cpp index 6edd32b351..9bec7aabeb 100644 --- a/src/simplnx/DataStructure/Geometry/TriangleGeom.cpp +++ b/src/simplnx/DataStructure/Geometry/TriangleGeom.cpp @@ -196,7 +196,7 @@ IGeometry::StatusCode TriangleGeom::findElementsContainingVert() IGeometry::StatusCode TriangleGeom::findElementNeighbors() { - StatusCode err = 0; + StatusCode err; if(getElementsContainingVert() == nullptr) { err = findElementsContainingVert(); @@ -205,7 +205,7 @@ IGeometry::StatusCode TriangleGeom::findElementNeighbors() return err; } } - auto triangleNeighbors = DynamicListArray::Create(*getDataStructure(), k_EltNeighbors, getId()); + auto triangleNeighbors = ElementDynamicList::Create(*getDataStructure(), k_EltNeighbors, getId()); err = GeometryHelpers::Connectivity::FindElementNeighbors(getFaces(), getElementsContainingVert(), triangleNeighbors, IGeometry::Type::Triangle); if(triangleNeighbors == nullptr) { diff --git a/src/simplnx/Utilities/GeometryHelpers.hpp b/src/simplnx/Utilities/GeometryHelpers.hpp index eaa0ceb83f..74bbc40b47 100644 --- a/src/simplnx/Utilities/GeometryHelpers.hpp +++ b/src/simplnx/Utilities/GeometryHelpers.hpp @@ -174,6 +174,7 @@ ErrorCode FindElementNeighbors(const DataArray* elemList, const DynamicListAr continue; } // We already added this element so loop again // qDebug() << " Comparing Element " << vertIdxs[vt] << "\n"; + auto vertCell = elemList->cbegin() + (vertIdxs[vt] * elemList->getNumberOfComponents()); usize vCount = 0; // Loop over all the vertex indices of this element and try to match numSharedVerts of them to the current loop element // If there is numSharedVerts match then that element is a neighbor of the source. If there are more than numVertsPerElem @@ -182,7 +183,7 @@ ErrorCode FindElementNeighbors(const DataArray* elemList, const DynamicListAr { for(usize j = 0; j < numVertsPerElem; j++) { - if(elems[offset + i] == elems[offset + j]) + if(elems[offset + i] == *(vertCell + j)) { vCount++; }