0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / BRepMAT2d / BRepMAT2d_LinkTopoBilo.cxx
1 // Created on: 1994-10-07
2 // Created by: Yves FRICAUD
3 // Copyright (c) 1994-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 <BRepMAT2d_BisectingLocus.hxx>
19 #include <BRepMAT2d_DataMapOfShapeSequenceOfBasicElt.hxx>
20 #include <BRepMAT2d_Explorer.hxx>
21 #include <BRepMAT2d_LinkTopoBilo.hxx>
22 #include <BRepTools_WireExplorer.hxx>
23 #include <Geom2d_CartesianPoint.hxx>
24 #include <Geom2d_Curve.hxx>
25 #include <Geom2d_Geometry.hxx>
26 #include <gp_Pnt2d.hxx>
27 #include <MAT_BasicElt.hxx>
28 #include <MAT_Graph.hxx>
29 #include <MAT_SequenceOfBasicElt.hxx>
30 #include <Precision.hxx>
31 #include <Standard_ConstructionError.hxx>
32 #include <Standard_Type.hxx>
33 #include <TColGeom2d_SequenceOfCurve.hxx>
34 #include <TColStd_DataMapIteratorOfDataMapOfIntegerInteger.hxx>
35 #include <TColStd_DataMapOfIntegerInteger.hxx>
36 #include <TopAbs.hxx>
37 #include <TopExp.hxx>
38 #include <TopExp_Explorer.hxx>
39 #include <TopoDS.hxx>
40 #include <TopoDS_Shape.hxx>
41 #include <TopoDS_Vertex.hxx>
42 #include <TopoDS_Wire.hxx>
43 #include <TopTools_SequenceOfShape.hxx>
44
45 //=======================================================================
46 //function : BRepMAT2d_LinkTopoBilo
47 //purpose  : 
48 //=======================================================================
49 BRepMAT2d_LinkTopoBilo::BRepMAT2d_LinkTopoBilo()
50 : current(0),
51   isEmpty(Standard_True)
52 {
53 }
54
55
56 //=======================================================================
57 //function : BRepMAT2d_LinkTopoBilo
58 //purpose  : 
59 //=======================================================================
60
61 BRepMAT2d_LinkTopoBilo::BRepMAT2d_LinkTopoBilo(
62    const BRepMAT2d_Explorer&       Explo,
63    const BRepMAT2d_BisectingLocus& BiLo)
64 {
65   Perform (Explo,BiLo);
66 }
67
68
69 //=======================================================================
70 //function : Perform
71 //purpose  : 
72 //=======================================================================
73
74 void BRepMAT2d_LinkTopoBilo::Perform(const BRepMAT2d_Explorer&       Explo, 
75                                      const BRepMAT2d_BisectingLocus& BiLo)
76 {
77   myMap.Clear();
78   myBEShape.Clear();
79
80   TopoDS_Shape     S          = Explo.Shape();
81   Standard_Integer IndContour = 1;
82
83   if (S.ShapeType() == TopAbs_FACE) {
84     TopExp_Explorer  Exp (S,TopAbs_WIRE);
85     
86     while (Exp.More()) {
87       LinkToWire(TopoDS::Wire (Exp.Current()),Explo,IndContour,BiLo);
88       Exp.Next();
89       IndContour++;
90     }
91   }
92   else {
93     throw Standard_ConstructionError("BRepMAT2d_LinkTopoBilo::Perform");
94   }
95   
96 }
97
98
99 //=======================================================================
100 //function : Init
101 //purpose  : 
102 //=======================================================================
103
104 void BRepMAT2d_LinkTopoBilo::Init(const TopoDS_Shape& S)
105 {
106   isEmpty = Standard_False;
107   current = 1;
108   if (myMap.IsBound(S)) myKey = S; else isEmpty = Standard_True;
109 }
110
111
112 //=======================================================================
113 //function : More
114 //purpose  : 
115 //=======================================================================
116
117 Standard_Boolean  BRepMAT2d_LinkTopoBilo::More()
118 {
119   if (isEmpty) return Standard_False;
120   return (current <=  myMap(myKey).Length());
121 }
122
123
124 //=======================================================================
125 //function : Next
126 //purpose  : 
127 //=======================================================================
128
129 void BRepMAT2d_LinkTopoBilo::Next()
130 {
131   current++;
132 }
133
134
135 //=======================================================================
136 //function : Value
137 //purpose  : 
138 //=======================================================================
139
140 Handle(MAT_BasicElt) BRepMAT2d_LinkTopoBilo::Value() const 
141 {
142   return myMap(myKey).Value(current);
143 }
144
145 //=======================================================================
146 //function : GeneratingShape
147 //purpose  : 
148 //=======================================================================
149
150 TopoDS_Shape  BRepMAT2d_LinkTopoBilo::GeneratingShape
151 (const Handle(MAT_BasicElt)& BE) const
152 {
153   return myBEShape(BE);
154 }
155
156 static void LinkToContour(const BRepMAT2d_Explorer&              Explo,
157                           const Standard_Integer                 IndC,
158                           const BRepMAT2d_BisectingLocus&        BiLo,
159                                 TColStd_DataMapOfIntegerInteger& Link);
160
161 //=======================================================================
162 //function : LinkToWire
163 //purpose  : 
164 //=======================================================================
165
166 void BRepMAT2d_LinkTopoBilo::LinkToWire(const TopoDS_Wire&              W,
167                                         const BRepMAT2d_Explorer&       Explo, 
168                                         const Standard_Integer          IndC,
169                                         const BRepMAT2d_BisectingLocus& BiLo)
170 {
171   BRepTools_WireExplorer       TheExp (W);
172   Standard_Integer             KC;
173   TopoDS_Vertex                VF,VL;
174   TopoDS_Shape                 S;
175   Handle(MAT_BasicElt)         BE;
176   Handle(Standard_Type)        Type;
177   TopTools_SequenceOfShape     TopoSeq;
178   MAT_SequenceOfBasicElt EmptySeq;
179
180   TColStd_DataMapIteratorOfDataMapOfIntegerInteger Ite;
181   TColStd_DataMapOfIntegerInteger LinkBECont;
182
183
184   for (;TheExp.More();TheExp.Next()) {
185     TopoSeq.Append(TheExp.Current());
186   }
187   
188   //-----------------------------------------------------
189   // Construction Links BasicElt => Curve of contour IndC.
190   //-----------------------------------------------------
191   LinkToContour(Explo,IndC,BiLo,LinkBECont);
192   
193
194   //---------------------------------------------------------------
195   // Iteration on BasicElts. The associated index is the same for
196   // the curves of the contour and the edges.               .
197   //---------------------------------------------------------------
198   for (Ite.Initialize(LinkBECont); Ite.More(); Ite.Next()) {
199     BE     = BiLo.Graph()->BasicElt(Ite.Key());    
200     Type   = BiLo.GeomElt(BE)->DynamicType();
201     KC     = Ite.Value();
202     S      = TopoSeq.Value(Abs(KC));
203
204     if (Type == STANDARD_TYPE(Geom2d_CartesianPoint)) {
205       if (S.Orientation() == TopAbs_REVERSED) {
206         TopExp::Vertices(TopoDS::Edge(S),VL,VF);
207       }
208       else {
209         TopExp::Vertices(TopoDS::Edge(S),VF,VL);
210       }
211       if (KC > 0) S = VL; else S = VF;
212     }
213     if (!myMap.IsBound(S)) {       
214       myMap.Bind(S,EmptySeq);
215     }
216     myMap(S).Append(BE);
217
218     if (KC < 0) 
219       myBEShape.Bind(BE, S.Oriented(TopAbs::Reverse(S.Orientation())));
220     else
221       myBEShape.Bind(BE, S);
222   }
223 }
224
225
226 //=======================================================================
227 //function : LinkToContour
228 //purpose  : Association to each basicElt of the curre of the initial
229 //           contour from which it comes.
230 //=======================================================================
231
232 void LinkToContour (const BRepMAT2d_Explorer&              Explo,
233                     const Standard_Integer                 IndC,
234                     const BRepMAT2d_BisectingLocus&        BiLo,
235                     TColStd_DataMapOfIntegerInteger&       Link)
236 {
237   Handle (MAT_BasicElt)    BE;
238   Handle (Geom2d_Geometry) GeomBE;
239   Handle (Standard_Type)   Type;
240   Standard_Boolean         DirectSense   = Standard_True;
241   Standard_Boolean         LastPoint     = Standard_False;
242   Standard_Integer         NbSect,ISect;     
243
244   //---------------------------------------------------
245   // NbSect : number of sections on the current curve.
246   // ISect  : Counter on sections.
247   //---------------------------------------------------
248
249   const TColGeom2d_SequenceOfCurve&  Cont = Explo.Contour(IndC);
250   
251   //------------------------------------------------------------------
252   //Initialization of the explorer on the first curve of the contour.
253   //------------------------------------------------------------------
254   Standard_Integer         IndOnCont     =  1;   
255   Standard_Integer         PrecIndOnCont = -1;
256   NbSect = BiLo.NumberOfSections(IndC,1);
257   ISect  = 0;
258
259   //------------------------------------------------------------------
260   // Parsing of base elements associated to contour IndC.
261   // Rq : the base elements are ordered.
262   //------------------------------------------------------------------
263   for (Standard_Integer i = 1; i <= BiLo.NumberOfElts(IndC); i++) {
264
265     BE     = BiLo.BasicElt(IndC,i);
266     GeomBE = BiLo.GeomElt (BE);
267     Type   = GeomBE->DynamicType();
268
269     if (Type != STANDARD_TYPE(Geom2d_CartesianPoint)) {
270       ISect++;
271       //----------------------------------------------------------------
272       // The base element is a curve associated with the current curve.
273       //----------------------------------------------------------------
274       if (DirectSense) {
275         Link.Bind(BE->Index(),  IndOnCont);
276       }
277       else {
278         Link.Bind(BE->Index(), -IndOnCont);
279       }
280     }
281     else {      
282       //-----------------------------------------------------------------
283       // The base element is a point associated with the previous curve.
284       //-----------------------------------------------------------------
285       if (DirectSense || LastPoint) {
286         Link.Bind(BE->Index(),  PrecIndOnCont);
287       }
288       else {
289         Link.Bind(BE->Index(), -PrecIndOnCont);
290       }
291     }
292
293     PrecIndOnCont = IndOnCont;
294     //----------------------------------------------------------------------
295     // Passage to the next curve in Explo, when all parts 
296     // of curves corresponding to the initial curve have been parsed.
297     //---------------------------------------------------------------------
298     if (Type != STANDARD_TYPE(Geom2d_CartesianPoint) && ISect == NbSect) {
299       if (IndOnCont < Cont.Length() && DirectSense) {
300         IndOnCont++;  
301         NbSect = BiLo.NumberOfSections(IndC,IndOnCont);
302         ISect  = 0;
303       }
304       else {
305         //-----------------------------------------------------
306         // For open lines restart in the other direction.
307         //-----------------------------------------------------
308         if (!DirectSense) {
309           IndOnCont--;
310           if (IndOnCont != 0) NbSect = BiLo.NumberOfSections(IndC,IndOnCont);
311           LastPoint = Standard_False;
312         }
313         else {
314           LastPoint = Standard_True;
315         }
316         ISect       = 0;
317         DirectSense = Standard_False;
318       }
319     }
320   }
321 }