0026788: Compiler warnings when OCCT_DEBUG is enabled
[occt.git] / src / TopOpeBRep / TopOpeBRep_FaceEdgeFiller.cxx
1 // Created on: 1995-06-14
2 // Created by: Jean Yves LEBEY
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <gp_Pnt2d.hxx>
19 #include <TopoDS.hxx>
20 #include <TopoDS_Edge.hxx>
21 #include <TopoDS_Face.hxx>
22 #include <TopoDS_Shape.hxx>
23 #include <TopOpeBRep_FaceEdgeFiller.hxx>
24 #include <TopOpeBRep_FaceEdgeIntersector.hxx>
25 #include <TopOpeBRep_PointGeomTool.hxx>
26 #include <TopOpeBRepDS_CurvePointInterference.hxx>
27 #include <TopOpeBRepDS_DataStructure.hxx>
28 #include <TopOpeBRepDS_HDataStructure.hxx>
29 #include <TopOpeBRepDS_Interference.hxx>
30 #include <TopOpeBRepDS_InterferenceTool.hxx>
31 #include <TopOpeBRepDS_Point.hxx>
32
33 #ifdef OCCT_DEBUG
34 extern void FEINT_DUMPPOINTS(TopOpeBRep_FaceEdgeIntersector& FEINT,
35                              const TopOpeBRepDS_DataStructure& BDS);
36 extern Standard_Boolean TopOpeBRepDS_GettraceDSF(); 
37 #endif
38
39 //=======================================================================
40 //function : TopOpeBRep_FaceEdgeFiller
41 //purpose  : 
42 //=======================================================================
43
44 TopOpeBRep_FaceEdgeFiller::TopOpeBRep_FaceEdgeFiller() 
45 {
46 }
47
48
49 //=======================================================================
50 //function : Insert
51 //purpose  : 
52 //=======================================================================
53
54 void TopOpeBRep_FaceEdgeFiller::Insert
55 (const TopoDS_Shape& F,
56  const TopoDS_Shape& E,
57  TopOpeBRep_FaceEdgeIntersector& FEINT,
58  const Handle(TopOpeBRepDS_HDataStructure)& HDS)
59 {
60   const TopoDS_Face& FF = TopoDS::Face(F);
61   const TopoDS_Edge& EE = TopoDS::Edge(E);
62
63 #ifdef OCCT_DEBUG
64   if (TopOpeBRepDS_GettraceDSF()) {
65     FEINT_DUMPPOINTS(FEINT,HDS->DS());
66   }
67 #endif
68
69   // exit if no point.
70   FEINT.InitPoint(); 
71   if ( ! FEINT.MorePoint() ) return;
72
73   TopOpeBRepDS_DataStructure& BDS = HDS->ChangeDS();
74
75   TopAbs_Orientation FFori = FF.Orientation();
76
77   // --- Add <FF,EE> in BDS
78   Standard_Integer FFindex = BDS.AddShape(FF,1);
79                              BDS.AddShape(EE,2);
80
81   // --- get list of interferences connected to edges <FF>,<EE>
82   TopOpeBRepDS_ListOfInterference& EIL1 = BDS.ChangeShapeInterferences(FF);
83   TopOpeBRepDS_ListOfInterference& EIL2 = BDS.ChangeShapeInterferences(EE);
84
85   Handle(TopOpeBRepDS_Interference) EPI;  //edge/point interference
86   Handle(TopOpeBRepDS_Interference) EVI;  //edge/vertex interference
87
88   for (; FEINT.MorePoint(); FEINT.NextPoint() ) {
89     gp_Pnt2d      pUV; FEINT.UVPoint(pUV);
90     Standard_Real parE = FEINT.Parameter();
91
92 #ifdef OCCT_DEBUG
93     TopAbs_Orientation EEori = EE.Orientation();
94     TopOpeBRepDS_Transition TFF = FEINT.Transition(1,EEori); (void)TFF;
95 #endif
96     TopOpeBRepDS_Transition TEE = FEINT.Transition(2,FFori);
97     TEE.Index(FFindex);
98     
99     TopoDS_Vertex V1;
100     Standard_Boolean isvertexF = FEINT.IsVertex(1,V1);
101     TopoDS_Vertex V2;
102     Standard_Boolean isvertexE = FEINT.IsVertex(2,V2);
103     Standard_Boolean isvertex = isvertexF || isvertexE;
104
105     Standard_Integer DSPindex;
106     Standard_Boolean EPIfound;
107
108     if ( ! isvertex ) {
109       // create a new geometry in DS ( and get its index <DSPindex> )
110       // or get the index <DSPindex> of an equal geometry
111       // among those of Edge/Point interferences connected to <FF> (or <EE>).
112
113       TopOpeBRepDS_ListIteratorOfListOfInterference itEIL1(EIL1);
114       EPIfound = GetGeometry(itEIL1,FEINT,DSPindex,BDS);
115       if ( ! EPIfound ) DSPindex = MakeGeometry(FEINT,BDS);
116
117       // sur FF
118       // NYI : FacePointInterference : on ajoute un point INTERNAL a F
119 //      FPI = new TopOpeBRepDS_FacePointInterference(TopAbs_INTERNAL,
120 //                                             TopOpeBRepDS_FACE,FFindex,
121 //                                             TopOpeBRepDS_POINT,DSPindex,
122 //                                             pUV);
123 //      StoreInterference(FPI,EIL1,BDS);
124
125       // sur EE
126       EPI = TopOpeBRepDS_InterferenceTool::MakeCurveInterference
127         (TEE,TopOpeBRepDS_FACE,FFindex,TopOpeBRepDS_POINT,DSPindex,parE);
128       StoreInterference(EPI,EIL2,BDS);
129     }
130
131     else if ( isvertexF ) {
132       // si aussi vertex de E, in privilegie le vertex de la face
133       Standard_Integer Vindex = BDS.AddShape(V1,1);
134
135       // sur FF
136       // NYI pour toute arete de F qui accede V , une EVI
137 //      EVI = new TopOpeBRepDS_EdgeVertexInterference(Transition ?? <-> TFF,
138 //                                                  TopOpeBRepDS_EDGE,E de F,
139 //                                                  TopOpeBRepDS_VERTEX,Vindex,
140 //                                                  param de V sur E de F);
141 //      StoreInterference(EVI,EIL1,BDS);
142
143       // sur EE
144       EPI = new TopOpeBRepDS_CurvePointInterference(TEE,
145                                                     TopOpeBRepDS_FACE,FFindex,
146                                                     TopOpeBRepDS_VERTEX,Vindex,
147                                                     parE);
148       StoreInterference(EPI,EIL2,BDS);
149     }
150
151     else if ( isvertexE ) {
152       Standard_Integer Vindex = BDS.AddShape(V2,2);
153
154       // sur FF
155       // NYI : FaceVertexInterference : on ajoute un vertex INTERNAL a F
156 //      FVI = new TopOpeBRepDS_FaceVertexInterference(TopAbs_INTERNAL,
157 //                                             TopOpeBRepDS_FACE,FFindex,
158 //                                             TopOpeBRepDS_VERTEX,Vindex,
159 //                                             pUV);
160 //      StoreInterference(FPI,EIL1,BDS);
161       
162       // sur EE
163       EPI = new TopOpeBRepDS_CurvePointInterference(TEE,
164                                                     TopOpeBRepDS_FACE,FFindex,
165                                                     TopOpeBRepDS_VERTEX,Vindex,
166                                                     parE);
167       StoreInterference(EPI,EIL2,BDS);
168     }
169   }
170 }
171
172
173
174 // ===============
175 // private methods
176 // ===============
177
178 //-----------------------------------------------------------------------
179 // Search, among a list of interferences accessed by the iterator <IT>,
180 // a geometry whose 3D point is identical yo the 3D point of a DS point <DSP>.
181 // TheDSPointGeomTool is a tool able to access the 3D point of the DS point 
182 // DSP,and to test identity (according to tolerance connected to DSP) of the
183 // DS points.
184 // return True if such an interference has been found, False else.
185 // if True, iterator <IT> points (by the Value() method) on the first 
186 // interference accessing an identical 3D point.
187 //-----------------------------------------------------------------------
188 //=======================================================================
189 //function : ScanInterfList
190 //purpose  : private
191 //=======================================================================
192
193 Standard_Boolean TopOpeBRep_FaceEdgeFiller::ScanInterfList
194    (TopOpeBRepDS_ListIteratorOfListOfInterference& IT,
195     const TopOpeBRepDS_Point& DSP,
196     const TopOpeBRepDS_DataStructure& BDS) const
197 {
198   for ( ; IT.More(); IT.Next() ) {
199     Standard_Integer DSPG = IT.Value()->Geometry();
200     const TopOpeBRepDS_Point& otherDSP = BDS.Point(DSPG);
201     if (TopOpeBRep_PointGeomTool::IsEqual(DSP,otherDSP)) return Standard_True;
202   }
203   return Standard_False;
204 }
205
206
207 //=======================================================================
208 //function : GetGeometry
209 //purpose  : private
210 //=======================================================================
211
212 Standard_Boolean TopOpeBRep_FaceEdgeFiller::GetGeometry
213     (TopOpeBRepDS_ListIteratorOfListOfInterference& IT,
214      const TopOpeBRep_FaceEdgeIntersector& FEINT,
215      Standard_Integer& G,
216      const TopOpeBRepDS_DataStructure& BDS) const
217 {
218   TopOpeBRepDS_Point DSP = TopOpeBRep_PointGeomTool::MakePoint(FEINT);
219   Standard_Boolean found = ScanInterfList(IT,DSP,BDS);
220   if (found) G = IT.Value()->Geometry();
221   return found;
222 }
223
224
225 //=======================================================================
226 //function : GetGeometry
227 //purpose  : private
228 //=======================================================================
229
230 Standard_Boolean TopOpeBRep_FaceEdgeFiller::GetGeometry
231     (const TopOpeBRepDS_ListOfInterference& L,
232      const TopOpeBRepDS_Point& DSP,
233      Standard_Integer& G,
234      TopOpeBRepDS_DataStructure& BDS) const
235 {
236   TopOpeBRepDS_ListIteratorOfListOfInterference itI(L);
237   Standard_Boolean Ifound = ScanInterfList(itI,DSP,BDS);
238   if (Ifound) G = itI.Value()->Geometry();
239   else        G = BDS.AddPoint(DSP);
240   return Ifound;   // interference found or not
241 }
242
243
244 //-----------------------------------------------------------------------
245 // StoreInterference : Append an interference I to a list of interference LI
246 //                   : Append I to the interf. list connected to I Geometry()
247 //-----------------------------------------------------------------------
248 //=======================================================================
249 //function : StoreInterference
250 //purpose  : private
251 //=======================================================================
252
253 void TopOpeBRep_FaceEdgeFiller::StoreInterference
254 (const Handle(TopOpeBRepDS_Interference)& I,
255  TopOpeBRepDS_ListOfInterference& LI,
256  TopOpeBRepDS_DataStructure& BDS) const
257 {
258   // append I to list LI
259   LI.Append(I);
260
261 #ifdef OCCT_DEBUG
262   Standard_Boolean appendtoG = Standard_False;
263 #endif
264   Standard_Integer G = I->Geometry();
265
266   // append I to list of interference connected to G = I->Geometry()
267   switch (I->GeometryType()) {
268
269   case TopOpeBRepDS_SOLID : case TopOpeBRepDS_FACE : 
270   case TopOpeBRepDS_EDGE : case TopOpeBRepDS_VERTEX :
271 //    appendtoG = Standard_True;
272 //    BDS.ChangeShapeInterferences(G).Append(I);
273     break;
274     
275   case TopOpeBRepDS_SURFACE :
276 #ifdef OCCT_DEBUG
277     appendtoG = Standard_True;
278 #endif
279     BDS.ChangeSurfaceInterferences(G).Append(I);
280     break;
281     
282   case TopOpeBRepDS_CURVE :
283 #ifdef OCCT_DEBUG
284     appendtoG = Standard_True;
285 #endif
286     BDS.ChangeCurveInterferences(G).Append(I);
287     break;
288     
289   case TopOpeBRepDS_POINT :
290 //    appendtoG = Standard_True;
291 //    BDS.ChangePointInterferences(G).Append(I);
292     break;
293   default:
294     break;
295   }
296
297 #ifdef OCCT_DEBUG
298   if (TopOpeBRepDS_GettraceDSF()) {
299     cout<<"append "; I->Dump(cout); 
300     if (appendtoG) cout<<" and to G"<<G<<" list";
301     cout<<endl;
302   }
303 #endif
304 }
305
306 //=======================================================================
307 //function : MakeGeometry
308 //purpose  : 
309 //=======================================================================
310
311 Standard_Integer TopOpeBRep_FaceEdgeFiller::MakeGeometry
312     (TopOpeBRep_FaceEdgeIntersector& FEINT,
313      TopOpeBRepDS_DataStructure& BDS) const
314 {
315   Standard_Integer G=0;
316
317   TopoDS_Vertex V1;
318   Standard_Boolean isvertexF = FEINT.IsVertex(1,V1);
319   TopoDS_Vertex V2;
320   Standard_Boolean isvertexE = FEINT.IsVertex(2,V2);
321   Standard_Boolean isvertex = isvertexF || isvertexE;
322
323   if ( isvertex ) {
324     if      ( isvertexF ) G = BDS.AddShape(V1,1);
325     else if ( isvertexE ) G = BDS.AddShape(V2,2);
326   }
327   else 
328     G = BDS.AddPoint(TopOpeBRep_PointGeomTool::MakePoint(FEINT));
329   return G;
330 }