1 // Copyright (c) 2013 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
14 #ifndef _BRepMesh_VertexTool_HeaderFile
15 #define _BRepMesh_VertexTool_HeaderFile
17 #include <Standard.hxx>
18 #include <Standard_DefineAlloc.hxx>
19 #include <Standard_Macro.hxx>
20 #include <BRepMesh_VertexInspector.hxx>
21 #include <BRepMesh.hxx>
22 #include <Standard_OStream.hxx>
26 class BRepMesh_Vertex;
28 //! Describes data structure intended to keep mesh nodes
29 //! defined in UV space and implements functionality
30 //! providing their uniqueness regarding thir position.
31 class BRepMesh_VertexTool
38 //! @param theReservedSize size to be reserved for vector of vertices.
39 //! @param theAllocator memory allocator to be used by internal collections.
40 Standard_EXPORT BRepMesh_VertexTool(
41 const Standard_Integer theReservedSize,
42 const Handle(NCollection_IncAllocator)& theAllocator);
44 //! Sets new size of cell for cellfilter equal in both directions.
45 Standard_EXPORT void SetCellSize(const Standard_Real theSize)
47 myCellFilter.Reset(theSize, myAllocator);
51 //! Sets new size of cell for cellfilter.
52 //! @param theSizeX size for X dimension.
53 //! @param theSizeY size for Y dimension.
54 Standard_EXPORT void SetCellSize(const Standard_Real theSizeX,
55 const Standard_Real theSizeY)
57 Standard_Real aCellSize[2] = { theSizeX, theSizeY };
58 myCellFilter.Reset(aCellSize, myAllocator);
62 //! Sets the tolerance to be used for identification of
63 //! coincident vertices equal for both dimensions.
64 Standard_EXPORT void SetTolerance(const Standard_Real theTolerance)
66 mySelector.SetTolerance( theTolerance );
67 myTolerance[0] = theTolerance;
68 myTolerance[1] = theTolerance;
71 //! Sets the tolerance to be used for identification of
72 //! coincident vertices.
73 //! @param theToleranceX tolerance for X dimension.
74 //! @param theToleranceY tolerance for Y dimension.
75 Standard_EXPORT void SetTolerance(const Standard_Real theToleranceX,
76 const Standard_Real theToleranceY)
78 mySelector.SetTolerance( theToleranceX, theToleranceY );
79 myTolerance[0] = theToleranceX;
80 myTolerance[1] = theToleranceY;
83 //! Gets the tolerance to be used for identification of
84 //! coincident vertices.
85 //! @param theToleranceX tolerance for X dimension.
86 //! @param theToleranceY tolerance for Y dimension.
87 Standard_EXPORT void GetTolerance(Standard_Real& theToleranceX,
88 Standard_Real& theToleranceY)
90 theToleranceX = myTolerance[0];
91 theToleranceY = myTolerance[1];
94 //! Adds vertex with empty data to the tool.
95 //! @param theVertex node to be added to the mesh.
96 //! @param isForceAdd adds the given node to structure without
97 //! checking on coincidence with other nodes.
98 //! @return index of the node in the structure.
99 Standard_EXPORT Standard_Integer Add(
100 const BRepMesh_Vertex& theVertex,
101 const Standard_Boolean isForceAdd);
103 //! Deletes vertex with the given index from the tool.
104 Standard_EXPORT void Delete(const Standard_Integer theIndex);
106 //! Returns set of mesh vertices.
107 inline const BRepMesh::HVectorOfVertex& Vertices() const
109 return mySelector.Vertices();
112 //! Returns set of mesh vertices.
113 inline BRepMesh::HVectorOfVertex& ChangeVertices()
115 return mySelector.ChangeVertices();
118 //! Returns vertex by the given index.
119 inline const BRepMesh_Vertex& FindKey(const Standard_Integer theIndex)
121 return mySelector.GetVertex(theIndex);
124 //! Returns index of the given vertex.
125 Standard_EXPORT Standard_Integer FindIndex(const BRepMesh_Vertex& theVertex)
127 mySelector.SetPoint(theVertex.Coord());
128 myCellFilter.Inspect (theVertex.Coord(), mySelector);
129 return mySelector.GetCoincidentPoint();
132 //! Returns a number of vertices.
133 inline Standard_Integer Extent() const
135 return mySelector.NbVertices();
138 //! Returns True when the map contains no keys. <br>
139 inline Standard_Boolean IsEmpty() const
141 return (Extent() == 0);
144 //! Substitutes vertex with the given by the given vertex with attributes.
145 //! @param theIndex index of vertex to be substituted.
146 //! @param theVertex replacement vertex.
147 Standard_EXPORT void Substitute(const Standard_Integer theIndex,
148 const BRepMesh_Vertex& theVertex);
150 //! Remove last node from the structure.
151 inline void RemoveLast()
156 //! Returns the list with indexes of vertices that have movability attribute
157 //! equal to BRepMesh_Deleted and can be replaced with another node.
158 inline const BRepMesh::ListOfInteger& GetListOfDelNodes() const
160 return mySelector.GetListOfDelPoints();
163 //! Prints statistics.
164 Standard_EXPORT void Statistics(Standard_OStream& theStream) const;
168 //! Expands the given point according to specified tolerance.
169 //! @param thePoint point to be expanded.
170 //! @param[out] theMinPoint bottom left corner of area defined by expanded point.
171 //! @param[out] theMaxPoint top right corner of area defined by expanded point.
172 inline void expandPoint(const gp_XY& thePoint,
176 theMinPoint.SetX(thePoint.X() - myTolerance[0]);
177 theMinPoint.SetY(thePoint.Y() - myTolerance[1]);
178 theMaxPoint.SetX(thePoint.X() + myTolerance[0]);
179 theMaxPoint.SetY(thePoint.Y() + myTolerance[1]);
184 Handle(NCollection_IncAllocator) myAllocator;
185 BRepMesh::VertexCellFilter myCellFilter;
186 BRepMesh_VertexInspector mySelector;
187 Standard_Real myTolerance[2];