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 //! Adds vertex with empty data to the tool.
84 Standard_EXPORT Standard_Integer Add(const BRepMesh_Vertex& theVertex);
86 //! Adds vertex with associated data to the tool.
87 //! @param theVertex vertex to be added.
88 //! @param theParams data associated with the vertex.
89 Standard_EXPORT Standard_Integer Add(const BRepMesh_Vertex& theVertex,
90 const BRepMesh::ListOfInteger& theParams);
92 //! Deletes vertex with the given index from the tool.
93 Standard_EXPORT void Delete(const Standard_Integer theIndex);
95 //! Returns data assigned to link with the given index.
96 //! @param theIndex index of link which data should be returned.
97 //! @return attached data.
98 inline BRepMesh::ListOfInteger& FindFromIndex(const Standard_Integer theIndex) const
100 return (BRepMesh::ListOfInteger&)myLinksMap.Find(theIndex);
103 //! Alias for FindFromIndex.
104 BRepMesh::ListOfInteger& operator()(const Standard_Integer theIndex) const
106 return FindFromIndex(theIndex);
109 //! Returns vertex by the given index.
110 inline const BRepMesh_Vertex& FindKey(const Standard_Integer theIndex)
112 return mySelector.GetVertex(theIndex);
115 //! Returns index of the given vertex.
116 Standard_EXPORT Standard_Integer FindIndex(const BRepMesh_Vertex& theVertex)
118 mySelector.SetPoint(theVertex.Coord());
119 myCellFilter.Inspect (theVertex.Coord(), mySelector);
120 return mySelector.GetCoincidentPoint();
123 //! Returns a number of vertices.
124 inline Standard_Integer Extent() const
126 return mySelector.NbVertices();
129 //! Returns True when the map contains no keys. <br>
130 inline Standard_Boolean IsEmpty() const
132 return (Extent() == 0);
135 //! Substitutes vertex with the given by the given vertex with attributes.
136 //! @param theIndex index of vertex to be substituted.
137 //! @param theVertex replacement vertex.
138 //! @param theData data associated to the vertex.
139 Standard_EXPORT void Substitute(const Standard_Integer theIndex,
140 const BRepMesh_Vertex& theVertex,
141 const BRepMesh::ListOfInteger& theData);
143 //! Remove last node from the structure.
144 inline void RemoveLast()
149 //! Returns the list with indexes of vertices that have movability attribute
150 //! equal to BRepMesh_Deleted and can be replaced with another node.
151 inline const BRepMesh::ListOfInteger& GetListOfDelNodes() const
153 return mySelector.GetListOfDelPoints();
156 //! Prints statistics.
157 Standard_EXPORT void Statistics(Standard_OStream& theStream) const;
161 //! Expands the given point according to specified tolerance.
162 //! @param thePoint point to be expanded.
163 //! @param[out] theMinPoint bottom left corner of area defined by expanded point.
164 //! @param[out] theMaxPoint top right corner of area defined by expanded point.
165 inline void expandPoint(const gp_XY& thePoint,
169 theMinPoint.SetX(thePoint.X() - myTolerance[0]);
170 theMinPoint.SetY(thePoint.Y() - myTolerance[1]);
171 theMaxPoint.SetX(thePoint.X() + myTolerance[0]);
172 theMaxPoint.SetY(thePoint.Y() + myTolerance[1]);
177 Handle(NCollection_IncAllocator) myAllocator;
178 BRepMesh::VertexCellFilter myCellFilter;
179 BRepMesh_VertexInspector mySelector;
180 BRepMesh::DMapOfIntegerListOfInteger myLinksMap;
181 Standard_Real myTolerance[2];