1 // Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File : GEOMImpl_Block6Explorer.hxx
26 #ifndef GEOMImpl_Block6Explorer_HeaderFile
27 #define GEOMImpl_Block6Explorer_HeaderFile
29 #include <TopoDS_Shape.hxx>
30 #include <TopoDS_Wire.hxx>
31 #include <TopTools_Array1OfShape.hxx>
32 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
33 #include <TCollection_AsciiString.hxx>
34 #include <gp_Trsf.hxx>
36 /* ======================================================================================================
37 Class GEOMImpl_Block6Explorer gives easy and fast access to a certain sub-elements of hexahedral solid
38 Each face can be accessed by its global ID [1-6]
39 Each edge can be accessed by its global ID [1-12] or by its local NB [1-4] inside certain face
40 Each vertex can be accessed by its global ID [1-8] or by its local NB [1-4] inside certain face
41 Numeration of the sub-shapes is defined in constructors, see they comments
43 face 2 face 4 | 4 face 2 face
47 8_______7__7 | 7__7_______8
51 5/______5__6/ | | | \6__5______\5
52 face 5 ---> | | | | <--- 6 face | face 6 ---> | | | | <--- 5 face
53 | |__3__|____| | |____|__3__| |
57 |/__1______|/ | \|______1__\|
62 3 face 1 face | face 1 face 3
64 Picture 1 (right orientation) | Picture 2 (left orientation)
66 For the moment, the orientation of numbering is not controlled
68 Faces: 1 - bottom, 2 - top, 3 - front, 4 - back, 5 - left (right), 6 - right (left)
71 4_______3__3 2 ______2__3
86 4/ | 5/______5__6/ | 4/ |
87 | | face 5 ---> | | | | <--- 6 face | |
88 | | | |__3__|____| | |
97 2 ______2__3 3 face 1 face
103 | __4______| /__1______ /
106 Picture 3 (On periferal pictures the local
107 numeration of edges and vertices is shown)
108 ====================================================================================================== */
110 class GEOMImpl_Block6Explorer
113 // ---------- PUBLIC METHODS ----------
115 GEOMImpl_Block6Explorer ();
118 // Initialization by existing solid,
119 // sub-elements regulate numeration
121 void InitByBlock (const TopoDS_Shape& theBlock);
122 // Init by hexahedral solid. First face, edge and vertex is defined randomly
124 void InitByBlockAndFace (const TopoDS_Shape& theBlock,
125 const TopoDS_Shape& theFace);
126 // Constructor from hexahedral solid, making theFace the first face.
127 // First edge and vertex is defined randomly from theFace entities
129 void InitByBlockAndEdges (const TopoDS_Shape& theBlock,
130 const TopoDS_Shape& theEdge1,
131 const TopoDS_Shape& theEdge2);
132 // Init by hexahedral solid, making theEdge1 the first, theEdge2 the third.
133 // First vertex is defined randomly from theEdge1 vertices
134 // (Picture 1 and Picture 2 shows two possible cases)
136 void InitByBlockAndVertices (const TopoDS_Shape& theBlock,
137 const TopoDS_Shape& theVertex1,
138 const TopoDS_Shape& theVertex2,
139 const TopoDS_Shape& theVertex3);
140 // Init by hexahedral solid, making theVertex1 the first,
141 // theVertex2 the second and theVertex3 the third vertices.
143 // Initialization by parts of solid to be built
145 void InitByTwoFaces (const TopoDS_Shape& theFace1,
146 const TopoDS_Shape& theFace2);
147 // Init by two faces. TheFace1 will be the first,
148 // theFace2 will be the second.
149 // First edge and vertex is defined randomly from theFace1 entities.
151 // Access to vertices
152 TopoDS_Shape GetVertex (const Standard_Integer theVertexID); // [1-8]
154 Standard_Integer GetVertexID (const TopoDS_Shape& theVertex);
156 Standard_Integer GetVertexID (const Standard_Integer theFaceID, // [1-6]
157 const Standard_Integer theVertexNB); // [1-4]
159 Standard_Integer GetVertexOnEdgeID (const Standard_Integer theEdgeID, // [1-12]
160 const Standard_Integer theVertexNB); // [1-2]
163 TopoDS_Shape GetEdge (const Standard_Integer theEdgeID, // [1-12]
164 const Standard_Boolean doMake = Standard_False);
166 Standard_Integer GetEdgeID (const TopoDS_Shape& theEdge);
168 Standard_Integer GetEdgeID (const Standard_Integer theFaceID, // [1-6]
169 const Standard_Integer theEdgeNB); // [1-4]
171 Standard_Integer FindEdgeID (const Standard_Integer theVertex1ID,
172 const Standard_Integer theVertex2ID);
174 Standard_Integer FindCommonEdgeID (const Standard_Integer theFace1ID,
175 const Standard_Integer theFace2ID);
178 TopoDS_Shape GetFace (const Standard_Integer theFaceID, // [1-6]
179 const Standard_Boolean doMake = Standard_False);
181 Standard_Integer GetFaceID (const TopoDS_Shape& theFace);
183 Standard_Integer FindFaceID (const Standard_Integer theEdge1ID,
184 const Standard_Integer theEdge2ID);
186 Standard_Integer GetOppositeFaceID (const Standard_Integer theFaceID);
189 Standard_Boolean IsSimilarFaces (const Standard_Integer theFace1ID,
190 const Standard_Integer theFace2ID,
191 const gp_Trsf theTransformation);
192 // returns true, if theFace1, transformed
193 // by theTransformation, coincides with theFace2
195 // ---------- STATIC PUBLIC METHODS ----------
196 static void MapShapesAndAncestors (const TopoDS_Shape& S,
197 const TopAbs_ShapeEnum TS,
198 const TopAbs_ShapeEnum TA,
199 TopTools_IndexedDataMapOfShapeListOfShape& M);
201 static Standard_Boolean IsSimilarEdges (const TopoDS_Shape& E1,
202 const TopoDS_Shape& E2);
204 static Standard_Integer FindEdge (TopoDS_Shape& theResult,
205 const TopoDS_Shape& V1,
206 const TopoDS_Shape& V2,
207 const TopTools_IndexedDataMapOfShapeListOfShape& MVE,
208 const Standard_Boolean findAll = Standard_False);
209 // returns number of found edges
211 static Standard_Integer FindFace (TopoDS_Shape& theResult,
212 const TopoDS_Shape& V1,
213 const TopoDS_Shape& V2,
214 const TopoDS_Shape& V3,
215 const TopoDS_Shape& V4,
216 const TopTools_IndexedDataMapOfShapeListOfShape& MVF,
217 const Standard_Boolean findAll = Standard_False);
218 // returns number of found faces
221 * Build a face, bound by the given wire.
222 * \param theWire The initial wire to build the face on.
223 * \param isPlanarWanted If true, try to build a planar face.
224 * \note If isPlanarWanted is true, but planar face cannot be built
225 * with acceptable tolerance, any face will be built.
226 * \param theResult The resulting shape.
227 * \return Error or warning description. Empty string in case of success.
229 static TCollection_AsciiString MakeFace (const TopoDS_Wire& theWire,
230 const Standard_Boolean isPlanarWanted,
231 TopoDS_Shape& theResult);
234 * Build a face, bound by the given wire.
235 * \param theWire The initial wire to build the face on.
236 * \param theResult The resulting shape.
237 * \return Error or warning description. Empty string in case of success.
239 static TCollection_AsciiString MakeAnyFace (const TopoDS_Wire& theWire,
240 TopoDS_Shape& theResult);
243 // ---------- PRIVATE FIELDS ----------
245 TopTools_Array1OfShape myFaces;
246 TopTools_Array1OfShape myEdges;
247 TopTools_Array1OfShape myVertices;