1 // Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // File : GEOMImpl_Block6Explorer.hxx
23 #ifndef GEOMImpl_Block6Explorer_HeaderFile
24 #define GEOMImpl_Block6Explorer_HeaderFile
26 #include <TopoDS_Shape.hxx>
27 #include <TopoDS_Wire.hxx>
28 #include <TopTools_Array1OfShape.hxx>
29 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
30 #include <gp_Trsf.hxx>
32 // Class GEOMImpl_Block6Explorer gives easy and fast access to a certain sub-elements of hexahedral solid
33 // Each face can be accessed by its global ID [1-6]
34 // Each edge can be accessed by its global ID [1-12] or by its local NB [1-4] inside certain face
35 // Each vertex can be accessed by its global ID [1-8] or by its local NB [1-4] inside certain face
36 // Numeration of the sub-shapes is defined in constructors, see they comments
38 // face 2 face 4 | 4 face 2 face |
40 // \|/ |/_ | _\| \|/ |
42 // 8_______7__7 | 7__7_______8 |
44 // 8 12 6 11 | 11 6 12 8 |
45 // / | / | | | \ | \ |
46 // 5/______5__6/ | | | \6__5______\5 |
47 // face 5 ---> | | | | <--- 6 face | face 6 ---> | | | | <--- 5 face |
48 // | |__3__|____| | |____|__3__| | |
49 // | /4 | /3 | 3\ | 4\ | |
50 // | / | / | \ | \ | |
51 // 9 4 10 2 | 2 10 4 9 |
52 // |/__1______|/ | \|______1__\| |
57 // 3 face 1 face | face 1 face 3 |
59 // Picture 1 (right orientation) | Picture 2 (left orientation) |
61 // For the moment, the orientation of numbering is not controlled
63 // Faces: 1 - bottom, 2 - top, 3 - front, 4 - back, 5 - left (right), 6 - right (left)
66 // 4_______3__3 2 ______2__3
81 // 4/ | 5/______5__6/ | 4/ |
82 // | | face 5 ---> | | | | <--- 6 face | |
83 // | | | |__3__|____| | |
84 // | /2 | /4 | /3 | /2
87 // |/ |/__1______|/ |/
92 // 2 ______2__3 3 face 1 face
98 // | __4______| /__1______ /
101 // Picture 3 (On periferal pictures the local
102 // numeration of edges and vertices is shown)
104 class GEOMImpl_Block6Explorer
107 // ---------- PUBLIC METHODS ----------
109 GEOMImpl_Block6Explorer ();
112 // Initialization by existing solid,
113 // sub-elements regulate numeration
115 void InitByBlock (const TopoDS_Shape& theBlock);
116 // Init by hexahedral solid. First face, edge and vertex is defined randomly
118 void InitByBlockAndFace (const TopoDS_Shape& theBlock,
119 const TopoDS_Shape& theFace);
120 // Constructor from hexahedral solid, making theFace the first face.
121 // First edge and vertex is defined randomly from theFace entities
123 void InitByBlockAndEdges (const TopoDS_Shape& theBlock,
124 const TopoDS_Shape& theEdge1,
125 const TopoDS_Shape& theEdge2);
126 // Init by hexahedral solid, making theEdge1 the first, theEdge2 the fird.
127 // First vertex is defined randomly from theEdge1 vertices
128 // (Picture 1 and Picture 2 shows two possible cases)
130 void InitByBlockAndVertices (const TopoDS_Shape& theBlock,
131 const TopoDS_Shape& theVertex1,
132 const TopoDS_Shape& theVertex2,
133 const TopoDS_Shape& theVertex3);
134 // Init by hexahedral solid, making theVertex1 the first,
135 // theVertex2 the second and theVertex3 the fird vertices.
137 // Initialization by parts of solid to be built
139 void InitByTwoFaces (const TopoDS_Shape& theFace1,
140 const TopoDS_Shape& theFace2);
141 // Init by two faces. TheFace1 will be the first,
142 // theFace2 will be the second.
143 // First edge and vertex is defined randomly from theFace1 entities.
145 // Access to vertices
146 TopoDS_Shape GetVertex (const Standard_Integer theVertexID); // [1-8]
148 Standard_Integer GetVertexID (const TopoDS_Shape& theVertex);
150 Standard_Integer GetVertexID (const Standard_Integer theFaceID, // [1-6]
151 const Standard_Integer theVertexNB); // [1-4]
153 Standard_Integer GetVertexOnEdgeID (const Standard_Integer theEdgeID, // [1-12]
154 const Standard_Integer theVertexNB); // [1-2]
157 TopoDS_Shape GetEdge (const Standard_Integer theEdgeID, // [1-12]
158 const Standard_Boolean doMake = Standard_False);
160 Standard_Integer GetEdgeID (const TopoDS_Shape& theEdge);
162 Standard_Integer GetEdgeID (const Standard_Integer theFaceID, // [1-6]
163 const Standard_Integer theEdgeNB); // [1-4]
165 Standard_Integer FindEdgeID (const Standard_Integer theVertex1ID,
166 const Standard_Integer theVertex2ID);
168 Standard_Integer FindCommonEdgeID (const Standard_Integer theFace1ID,
169 const Standard_Integer theFace2ID);
172 TopoDS_Shape GetFace (const Standard_Integer theFaceID, // [1-6]
173 const Standard_Boolean doMake = Standard_False);
175 Standard_Integer GetFaceID (const TopoDS_Shape& theFace);
177 Standard_Integer FindFaceID (const Standard_Integer theEdge1ID,
178 const Standard_Integer theEdge2ID);
180 Standard_Integer GetOppositeFaceID (const Standard_Integer theFaceID);
183 Standard_Boolean IsSimilarFaces (const Standard_Integer theFace1ID,
184 const Standard_Integer theFace2ID,
185 const gp_Trsf theTransformation);
186 // returns true, if theFace1, transformed
187 // by theTransformation, coincides with theFace2
189 // ---------- STATIC PUBLIC METHODS ----------
190 static void MapShapesAndAncestors (const TopoDS_Shape& S,
191 const TopAbs_ShapeEnum TS,
192 const TopAbs_ShapeEnum TA,
193 TopTools_IndexedDataMapOfShapeListOfShape& M);
195 static Standard_Boolean IsSimilarEdges (const TopoDS_Shape& E1,
196 const TopoDS_Shape& E2);
198 static Standard_Integer FindEdge (TopoDS_Shape& theResult,
199 const TopoDS_Shape& V1,
200 const TopoDS_Shape& V2,
201 const TopTools_IndexedDataMapOfShapeListOfShape& MVE,
202 const Standard_Boolean findAll = Standard_False);
203 // returns number of found edges
205 static Standard_Integer FindFace (TopoDS_Shape& theResult,
206 const TopoDS_Shape& V1,
207 const TopoDS_Shape& V2,
208 const TopoDS_Shape& V3,
209 const TopoDS_Shape& V4,
210 const TopTools_IndexedDataMapOfShapeListOfShape& MVF,
211 const Standard_Boolean findAll = Standard_False);
212 // returns number of found faces
214 static void MakeFace (const TopoDS_Wire& theWire,
215 const Standard_Boolean isPlanarWanted,
216 TopoDS_Shape& theResult);
219 // ---------- PRIVATE FIELDS ----------
221 TopTools_Array1OfShape myFaces;
222 TopTools_Array1OfShape myEdges;
223 TopTools_Array1OfShape myVertices;