Salome HOME
Join modifications from branch BR_DEBUG_3_2_0b1
[modules/geom.git] / src / GEOMImpl / GEOMImpl_Block6Explorer.hxx
1 // Copyright (C) 2005  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
3 // 
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.
8 // 
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.
13 //
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
17 //
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 //
20 //  File   : GEOMImpl_Block6Explorer.hxx
21 //  Module : GEOMImpl
22
23 #ifndef GEOMImpl_Block6Explorer_HeaderFile
24 #define GEOMImpl_Block6Explorer_HeaderFile
25
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>
31
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
37   //
38   //                  face 2       face 4          |           4 face     2 face                   |
39   //                       |           /           |            \         |                        |
40   //                      \|/        |/_           |            _\|      \|/                       |
41   //                       '         '             |              '       '                        |
42   //                    8_______7__7               |               7__7_______8                    |
43   //                   /|         /|               |               |\         |\                   |
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__\|               |
53   //               1          2                    |                    2          1               |
54   //            _.        .                        |                        .       ._             |
55   //            /|       /|\                       |                       /|\      |\             |
56   //           /          |                        |                        |         \            |
57   //          3 face      1 face                   |                   face 1     face 3           |
58   //                                               |                                               |
59   //  Picture 1 (right orientation)                |  Picture 2 (left orientation)                 |
60   //                                                                                               |
61   //  For the moment, the orientation of numbering is not controlled
62
63   // Faces: 1 - bottom, 2 - top, 3 - front, 4 - back, 5 - left (right), 6 - right (left)
64
65   //
66   //                             4_______3__3         2 ______2__3
67   //                            /          /          |          |
68   //                           4          2           1          3
69   //                          /          /            |          |
70   //                        1/______1__2/             |          |
71   //                                                  |          |
72   //                                                  | __4______|
73   //                           face 2       face 4    1          4
74   //                                |           /
75   //                               \|/        |/_
76   //                                '         '
77   //        3                    8_______7__7                    3
78   //       /|                   /|         /|                   /|
79   //      3 2                  8 12       6 11                 3 2
80   //     /  |                 /  |       /  |                 /  |
81   //   4/   |               5/______5__6/   |               4/   |
82   //   |    |  face 5 --->  |    |     |    |  <--- 6 face  |    |
83   //   |    |               |    |__3__|____|               |    |
84   //   |   /2               |   /4     |   /3               |   /2
85   //   |  /                 |  /       |  /                 |  /
86   //   4 1                  9 4       10 2                  4 1
87   //   |/                   |/__1______|/                   |/
88   //   1                    1          2                    1
89   //                     _.        .
90   //                     /|       /|\
91   //                    /          |
92   //   2 ______2__3    3 face      1 face
93   //   |          |
94   //   |          |               __3_______
95   //   |          |             /4         /3
96   //   |          |            /          /
97   //   1          3           4          2
98   //   | __4______|          /__1______ /
99   //   1          4         1          2
100   //
101   //  Picture 3 (On periferal pictures the local
102   //  numeration of edges and vertices is shown)
103
104 class GEOMImpl_Block6Explorer
105 {
106  public:
107   // ---------- PUBLIC METHODS ----------
108
109   GEOMImpl_Block6Explorer ();
110   // Constructor.
111
112   // Initialization by existing solid,
113   // sub-elements regulate numeration
114
115   void InitByBlock (const TopoDS_Shape& theBlock);
116   // Init by hexahedral solid. First face, edge and vertex is defined randomly
117
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
122
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)
129
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.
136
137   // Initialization by parts of solid to be built
138
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.
144
145   // Access to vertices
146   TopoDS_Shape GetVertex (const Standard_Integer theVertexID); // [1-8]
147
148   Standard_Integer GetVertexID (const TopoDS_Shape& theVertex);
149
150   Standard_Integer GetVertexID (const Standard_Integer theFaceID, // [1-6]
151                                 const Standard_Integer theVertexNB); // [1-4]
152
153   Standard_Integer GetVertexOnEdgeID (const Standard_Integer theEdgeID, // [1-12]
154                                       const Standard_Integer theVertexNB); // [1-2]
155
156   // Access to edges
157   TopoDS_Shape GetEdge (const Standard_Integer theEdgeID, // [1-12]
158                         const Standard_Boolean doMake = Standard_False);
159
160   Standard_Integer GetEdgeID (const TopoDS_Shape& theEdge);
161
162   Standard_Integer GetEdgeID (const Standard_Integer theFaceID, // [1-6]
163                               const Standard_Integer theEdgeNB); // [1-4]
164
165   Standard_Integer FindEdgeID (const Standard_Integer theVertex1ID,
166                                const Standard_Integer theVertex2ID);
167
168   Standard_Integer FindCommonEdgeID (const Standard_Integer theFace1ID,
169                                      const Standard_Integer theFace2ID);
170
171   // Access to faces
172   TopoDS_Shape GetFace (const Standard_Integer theFaceID, // [1-6]
173                         const Standard_Boolean doMake = Standard_False);
174
175   Standard_Integer GetFaceID (const TopoDS_Shape& theFace);
176
177   Standard_Integer FindFaceID (const Standard_Integer theEdge1ID,
178                                const Standard_Integer theEdge2ID);
179
180   Standard_Integer GetOppositeFaceID (const Standard_Integer theFaceID);
181
182   // Check Block
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
188  public:
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);
194
195   static Standard_Boolean IsSimilarEdges (const TopoDS_Shape& E1, 
196                                           const TopoDS_Shape& E2);
197
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
204
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
213
214   static void MakeFace (const TopoDS_Wire&     theWire,
215                         const Standard_Boolean isPlanarWanted,
216                         TopoDS_Shape&          theResult);
217
218  private:
219   // ---------- PRIVATE FIELDS ----------
220
221   TopTools_Array1OfShape myFaces;
222   TopTools_Array1OfShape myEdges;
223   TopTools_Array1OfShape myVertices;
224 };
225
226 #endif