32#include "MeshKernel/BoundingBox.hpp"
33#include "MeshKernel/Entities.hpp"
34#include "MeshKernel/Exceptions.hpp"
35#include "MeshKernel/UndoActions/AddEdgeAction.hpp"
36#include "MeshKernel/UndoActions/AddNodeAction.hpp"
37#include "MeshKernel/UndoActions/CompoundUndoAction.hpp"
38#include "MeshKernel/UndoActions/DeleteEdgeAction.hpp"
39#include "MeshKernel/UndoActions/DeleteNodeAction.hpp"
40#include "MeshKernel/UndoActions/FullUnstructuredGridUndo.hpp"
41#include "MeshKernel/UndoActions/MeshConversionAction.hpp"
42#include "MeshKernel/UndoActions/NodeTranslationAction.hpp"
43#include "MeshKernel/UndoActions/ResetEdgeAction.hpp"
44#include "MeshKernel/UndoActions/ResetNodeAction.hpp"
45#include "MeshKernel/UndoActions/UndoAction.hpp"
46#include "Utilities/RTreeBase.hpp"
134 Mesh(
const std::vector<Edge>& edges,
135 const std::vector<Point>& nodes,
198 const std::vector<Point>&
Nodes()
const;
204 void SetNodes(
const std::vector<Point>& newValues);
214 const std::vector<Edge>&
Edges()
const;
220 void SetEdges(
const std::vector<Edge>& newValues);
246 [[nodiscard]] std::tuple<UInt, std::unique_ptr<AddNodeAction>>
InsertNode(
const Point& newPoint);
254 [[nodiscard]] std::tuple<UInt, std::unique_ptr<AddEdgeAction>>
ConnectNodes(
UInt startNode,
UInt endNode,
const bool collectUndo =
true);
260 [[nodiscard]] std::unique_ptr<DeleteNodeAction>
DeleteNode(
UInt node,
const bool collectUndo =
true);
287 const std::vector<bool>& locationMask = {},
300 [[nodiscard]] std::unique_ptr<DeleteEdgeAction>
DeleteEdge(
UInt edge,
const bool collectUndo =
true);
491 static double constexpr m_minimumDeltaCoordinate = 1e-14;
494 bool m_nodesRTreeRequiresUpdate =
true;
495 bool m_edgesRTreeRequiresUpdate =
true;
496 bool m_facesRTreeRequiresUpdate =
true;
497 bool m_administrationRequired =
true;
498 std::unordered_map<Location, std::unique_ptr<RTreeBase>> m_RTrees;
502 void SetUnConnectedNodesAndEdgesToInvalid(CompoundUndoAction* undoAction);
508 void FindConnectedNodes(std::vector<bool>& connectedNodes,
509 UInt& numInvalidEdges)
const;
512 void InvalidateUnConnectedNodes(
const std::vector<bool>& connectedNodes,
513 UInt& numInvalidNodes,
514 CompoundUndoAction* undoAction =
nullptr);
525 if (index >= GetNumNodes())
530 return m_nodes[index];
536 m_nodesRTreeRequiresUpdate =
true;
537 m_edgesRTreeRequiresUpdate =
true;
538 m_facesRTreeRequiresUpdate =
true;
539 m_administrationRequired =
true;
544 if (index >= GetNumEdges())
549 return m_edges[index];
554 if (index >= GetNumEdges())
559 m_administrationRequired =
true;
560 m_edges[index] = edge;
571 m_nodesRTreeRequiresUpdate =
true;
572 m_edgesRTreeRequiresUpdate =
true;
573 m_facesRTreeRequiresUpdate =
true;
574 m_administrationRequired =
true;
579 return m_administrationRequired;
A class defining a bounding box.
Definition BoundingBox.hpp:40
An exception class thrown when an attempt is made that violates a range constraint.
Definition Exceptions.hpp:267
A class derived from Mesh, which describes unstructures 2d meshes.
Definition Mesh2D.hpp:58
A class describing an unstructured mesh. This class contains the shared functionality between 1d or 2...
Definition Mesh.hpp:99
Projection m_projection
The projection used.
Definition Mesh.hpp:477
const std::vector< Edge > & Edges() const
Get all edges.
Definition Mesh.hpp:563
std::unique_ptr< UndoAction > MoveNode(Point newPoint, UInt nodeindex)
Move a node to a new location.
std::vector< std::vector< UInt > > m_nodesEdges
For each node, the indices of connected edges (nodlin)
Definition Mesh.hpp:463
std::vector< Point > ComputeLocations(Location location) const
Computes a vector with the mesh locations coordinates (nodes, edges or faces coordinates).
void CommitAction(const DeleteEdgeAction &undoAction)
Apply the delete edge action.
const Edge & GetEdge(const UInt index) const
Get constant reference to an edge.
Definition Mesh.hpp:542
Mesh(Mesh &&mesh)=delete
Move constructor taking only a mesh.
UInt GetEdgeIndex(const UInt elementId, const UInt edgeId) const
Get the local edge number for an element edge.
void SetFacesRTreeRequiresUpdate(bool value)
Set the m_facesRTreeRequiresUpdate flag.
Definition Mesh.hpp:455
std::vector< Point > m_nodes
The mesh nodes (xk, yk)
Definition Mesh.hpp:487
void SetNodesRTreeRequiresUpdate(bool value)
Set the m_nodesRTreeRequiresUpdate flag.
Definition Mesh.hpp:447
void SetEdgesRTreeRequiresUpdate(bool value)
Set the m_edgesRTreeRequiresUpdate flag.
Definition Mesh.hpp:451
UInt GetNumFaceEdges(UInt faceIndex) const
Get the number of edges for a face.
Definition Mesh.hpp:171
std::vector< std::vector< UInt > > m_facesEdges
The edge indices composing the face (netcelllin)
Definition Mesh.hpp:473
RTreeBase & GetRTree(Location location) const
Get a reference to the RTree for a specific location.
Definition Mesh.hpp:443
void SetNode(const UInt index, const Point &newValue)
Set a node to a new value, bypassing the undo action.
UInt FindLocationIndex(Point point, Location location, const std::vector< bool > &locationMask={}, const BoundingBox &boundingBox={})
Get the index of a location (node/edge or face) close to a point.
void RestoreAction(const ResetNodeAction &undoAction)
Undo the reset node action.
std::vector< double > m_faceArea
The face area.
Definition Mesh.hpp:475
Type
Enumerator describing the different mesh types.
Definition Mesh.hpp:103
void ComputeFaceClosedPolygon(UInt faceIndex, std::vector< Point > &polygonNodesCache) const
For a face create a closed polygon.
std::unique_ptr< UndoAction > MergeTwoNodes(UInt startNode, UInt endNode)
Merges two mesh nodes.
virtual void Administrate(CompoundUndoAction *undoAction=nullptr)
Perform complete administration.
Mesh & operator=(const Mesh &mesh)=delete
Delete assignment operator.
void RestoreAction(const AddEdgeAction &undoAction)
Undo the add edge action.
std::vector< std::uint8_t > m_nodesNumEdges
For each node, the number of connected edges (nmk)
Definition Mesh.hpp:464
std::vector< UInt > GetValidEdgeMapping() const
Get the mapping/indexing from the edge array mapped to valid edges.
const Point & Node(const UInt index) const
Get the node at the position.
Definition Mesh.hpp:523
std::vector< std::vector< UInt > > m_facesNodes
The nodes composing the faces, in ccw order (netcellNod)
Definition Mesh.hpp:471
std::tuple< UInt, std::unique_ptr< AddEdgeAction > > ConnectNodes(UInt startNode, UInt endNode, const bool collectUndo=true)
Connect two existing nodes, checking if the nodes are already connected. If the nodes are not connect...
void RestoreAction(MeshConversionAction &undoAction)
Undo the node translation action.
UInt FindNodeCloseToAPoint(Point const &point, double searchRadius)
Get the index of a node close to a point.
void SetNodes(const std::vector< Point > &newValues)
Set all nodes to a new set of values.
Definition Mesh.hpp:533
void CommitAction(NodeTranslationAction &undoAction)
Apply the node translation action.
auto GetNumFaces() const
Get the number of valid faces.
Definition Mesh.hpp:153
auto GetNumEdges() const
Get the number of valid edges.
Definition Mesh.hpp:149
UInt FindEdgeWithLinearSearch(UInt firstNodeIndex, UInt secondNodeIndex) const
Find the edge using a linear search, without connectivity information (much slower than FindEdge)
bool IsNodeOnBoundary(UInt node) const
Inquire if a node is on boundary.
Definition Mesh.hpp:141
std::vector< std::uint8_t > m_edgesNumFaces
For each edge, the number of shared faces(lnn)
Definition Mesh.hpp:468
bool IsFaceOnBoundary(UInt face) const
Inquire if a face is on boundary.
std::unique_ptr< UndoAction > MergeNodesInPolygon(const Polygons &polygons, double mergingDistance)
Merge close mesh nodes inside a polygon (MERGENODESINPOLYGON)
void CommitAction(FullUnstructuredGridUndo &undoAction)
Set the node and edge values.
void AdministrateNodesEdges(CompoundUndoAction *undoAction=nullptr)
Perform node and edges administration.
bool IsValidEdge(const UInt edgeId) const
Indicate if the edge-id is a valid edge.
UInt GetNodeIndex(const UInt elementId, const UInt nodeId) const
Get the local node number for an element node.
Mesh & operator=(Mesh &&mesh)=delete
Delete move assignment operator.
Mesh(Projection projection)
Constructs an empty mesh, sets only the projection.
bool AdministrationRequired() const
Determine if a administration is required.
Definition Mesh.hpp:577
std::unique_ptr< UndoAction > Join(const Mesh &rhs)
Add meshes: result is a mesh composed of the additions firstMesh += secondmesh results in the second ...
void CommitAction(MeshConversionAction &undoAction)
Apply the node translation action.
void RestoreAction(const DeleteNodeAction &undoAction)
Undo the delete node action.
std::unique_ptr< DeleteNodeAction > DeleteNode(UInt node, const bool collectUndo=true)
Deletes a node and removes any connected edges.
bool IsEdgeOnBoundary(UInt edge) const
Inquire if an edge is on boundary.
Definition Mesh.hpp:189
Mesh(const std::vector< Edge > &edges, const std::vector< Point > &nodes, Projection projection)
Construct a mesh starting from the edges and nodes.
std::vector< Point > m_facesMassCenters
The faces centers of mass (xzw, yzw)
Definition Mesh.hpp:474
void CommitAction(const DeleteNodeAction &undoAction)
Apply the delete node action.
const std::vector< Point > & Nodes() const
Get vector of all nodes.
Definition Mesh.hpp:518
std::vector< Edge > m_edges
The edges, defined as first and second node(kn)
Definition Mesh.hpp:488
UInt FindCommonNode(UInt firstEdgeIndex, UInt secondEdgeIndex) const
Find the common node two edges share This method uses return parameters since the success is evaluate...
std::vector< UInt > GetValidNodeMapping() const
Get the mapping/indexing from the node array mapped to valid nodes.
std::unique_ptr< ResetEdgeAction > ResetEdge(UInt edgeId, const Edge &edge)
Change the nodes referenced by the edge.
Mesh & operator+=(Mesh const &rhs)
Add meshes: result is a mesh composed of the additions firstMesh += secondmesh results in the second ...
Mesh()
Default constructor, setting a cartesian projection.
void RestoreAction(NodeTranslationAction &undoAction)
Undo the node translation action.
void CommitAction(const AddEdgeAction &undoAction)
Apply the add edge action.
void SetEdge(const UInt index, const Edge &edge)
Set the edge to a new value, bypassing the undo action.
Definition Mesh.hpp:552
void RestoreAction(FullUnstructuredGridUndo &undoAction)
Undo entire node and edge values.
UInt GetNumValidNodes() const
Get the number of valid nodes.
std::vector< std::array< UInt, 2 > > m_edgesFaces
For each edge, the shared face index (lne)
Definition Mesh.hpp:467
virtual ~Mesh()=default
Define virtual destructor.
std::unique_ptr< ResetNodeAction > ResetNode(const UInt index, const Point &newValue)
Set the node to a new value, this value may be the in-valid value.
auto GetNumNodes() const
Get the number of valid nodes.
Definition Mesh.hpp:145
void SetAdministrationRequired(const bool value)
Determine if a administration is required.
void RestoreAction(const AddNodeAction &undoAction)
Undo the add node action.
void CommitAction(const ResetNodeAction &undoAction)
Apply the reset node action.
std::unique_ptr< DeleteEdgeAction > DeleteEdge(UInt edge, const bool collectUndo=true)
Deletes an edge.
UInt GetNumValidEdges() const
Get the number of valid edges.
UInt GetLocalFaceNodeIndex(const UInt faceIndex, const UInt nodeIndex) const
Get the local index of the node belong to a face.
UInt GetNumEdgesFaces(UInt edgeIndex) const
Get the number of faces an edges shares.
Definition Mesh.hpp:176
void SortEdgesInCounterClockWiseOrder(UInt startNode, UInt endNode)
Sort mesh edges around a node in counterclockwise order (Sort_links_ccw)
void BuildTree(Location location, const BoundingBox &boundingBox={})
Build the rtree for the corresponding location, using only the locations inside the bounding box.
UInt GetNumNodesEdges(UInt nodeIndex) const
Get the number of edges for a node.
Definition Mesh.hpp:166
void RestoreAction(const ResetEdgeAction &undoAction)
Undo the reset edge action.
bool NodeAdministration()
Node administration (setnodadmin)
void DeleteInvalidNodesAndEdges()
Removes all invalid nodes and edges.
UInt FindEdge(UInt firstNodeIndex, UInt secondNodeIndex) const
Find the edge sharing two nodes.
void CommitAction(const AddNodeAction &undoAction)
Apply the add node action.
void CommitAction(const ResetEdgeAction &undoAction)
Apply the reset edge action.
void RestoreAction(const DeleteEdgeAction &undoAction)
Undo the delete edge action.
void SetEdges(const std::vector< Edge > &newValues)
Set all edges to a new set of values.
Definition Mesh.hpp:568
std::vector< std::uint8_t > m_numFacesNodes
The number of nodes composing the face (netcellN)
Definition Mesh.hpp:472
std::tuple< UInt, std::unique_ptr< AddNodeAction > > InsertNode(const Point &newPoint)
Insert a new node in the mesh (setnewpoint)
Mesh(const Mesh &mesh)=delete
Copy constructor taking only a mesh.
std::vector< Boolean > IsLocationInPolygon(const Polygons &polygon, Location location) const
Computes if a location is in polygon.
A struct describing a point in a two-dimensional space.
Definition Point.hpp:41
A class containing a list of polygonaly enclosed regions.
Definition Polygons.hpp:45
Contains the logic of the C++ static library.
Definition AveragingInterpolation.hpp:37
std::pair< UInt, UInt > Edge
Describes an edge with two indices.
Definition Entities.hpp:50
Projection
Enumerator describing the supported projections.
Definition Definitions.hpp:43
Location
Mesh locations enumeration.
Definition Definitions.hpp:76
std::uint32_t UInt
Integer type used when indexing mesh graph entities.
Definition Definitions.hpp:39