0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / StepToTopoDS / StepToTopoDS_TranslateCompositeCurve.cxx
1 // Created on: 1999-02-12
2 // Created by: Andrey BETENEV
3 // Copyright (c) 1999-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 //:o3 abv 17.02.99: r0301_db.stp #57082: apply FixReorder to composite curve
18 //:s5 abv 22.04.99  Adding debug printouts in catch {} blocks
19
20 #include <BRep_Builder.hxx>
21 #include <BRepBuilderAPI_MakeEdge.hxx>
22 #include <Geom2d_Curve.hxx>
23 #include <Geom_Curve.hxx>
24 #include <Geom_Surface.hxx>
25 #include <Interface_Static.hxx>
26 #include <Precision.hxx>
27 #include <ShapeExtend_WireData.hxx>
28 #include <ShapeFix_Wire.hxx>
29 #include <Standard_ErrorHandler.hxx>
30 #include <Standard_Failure.hxx>
31 #include <StepGeom_CompositeCurve.hxx>
32 #include <StepGeom_CompositeCurveSegment.hxx>
33 #include <StepGeom_Pcurve.hxx>
34 #include <StepGeom_PcurveOrSurface.hxx>
35 #include <StepGeom_Surface.hxx>
36 #include <StepGeom_SurfaceCurve.hxx>
37 #include <StepToGeom.hxx>
38 #include <StepToTopoDS_TranslateCompositeCurve.hxx>
39 #include <StepToTopoDS_TranslateEdge.hxx>
40 #include <TopoDS.hxx>
41 #include <TopoDS_Edge.hxx>
42 #include <TopoDS_Iterator.hxx>
43 #include <TopoDS_Wire.hxx>
44 #include <Transfer_TransientProcess.hxx>
45
46 //=======================================================================
47 //function : Create
48 //purpose  : 
49 //=======================================================================
50 StepToTopoDS_TranslateCompositeCurve::StepToTopoDS_TranslateCompositeCurve ()
51 : myInfiniteSegment(Standard_False)
52 {
53 }
54         
55 //=======================================================================
56 //function : Create
57 //purpose  : 
58 //=======================================================================
59
60 StepToTopoDS_TranslateCompositeCurve::StepToTopoDS_TranslateCompositeCurve (
61                                       const Handle(StepGeom_CompositeCurve) &CC,
62                                       const Handle(Transfer_TransientProcess) &TP)
63 {
64   Init ( CC, TP );
65 }
66
67 //=======================================================================
68 //function : Create
69 //purpose  : 
70 //=======================================================================
71
72 StepToTopoDS_TranslateCompositeCurve::StepToTopoDS_TranslateCompositeCurve (
73                                       const Handle(StepGeom_CompositeCurve) &CC,
74                                       const Handle(Transfer_TransientProcess) &TP,
75                                       const Handle(StepGeom_Surface) &S,
76                                       const Handle(Geom_Surface) &Surf)
77 {
78   Init ( CC, TP, S, Surf );
79 }
80         
81 //=======================================================================
82 //function : Init
83 //purpose  : 
84 //=======================================================================
85
86 Standard_Boolean StepToTopoDS_TranslateCompositeCurve::Init (const Handle(StepGeom_CompositeCurve) &CC,
87                                                              const Handle(Transfer_TransientProcess) &TP)
88 {
89   Handle(StepGeom_Surface) S;
90   Handle(Geom_Surface) Surf;
91   return Init ( CC, TP, S, Surf );
92 }
93
94 //=======================================================================
95 //function : Init
96 //purpose  : 
97 //=======================================================================
98
99 Standard_Boolean StepToTopoDS_TranslateCompositeCurve::Init (const Handle(StepGeom_CompositeCurve) &CC,
100                                                              const Handle(Transfer_TransientProcess) &TP,
101                                                              const Handle(StepGeom_Surface) &S,
102                                                              const Handle(Geom_Surface) &Surf)
103 {
104   myWire.Nullify();
105   myInfiniteSegment = Standard_False;
106   if ( CC.IsNull() ) return Standard_False;
107
108   Standard_Boolean SurfMode = ( ! S.IsNull() && ! Surf.IsNull() );
109   Standard_Boolean isClosed = Standard_False;
110
111   if ( SurfMode ) {
112     Standard_Integer modepcurve = Interface_Static::IVal("read.surfacecurve.mode");
113     if ( modepcurve ==-3 ) SurfMode = Standard_False;
114   }
115   
116   Handle(ShapeExtend_WireData) sbwd = new ShapeExtend_WireData;
117   Standard_Integer nbs = CC->NbSegments();
118   for ( Standard_Integer i=1; i <= nbs; i++ ) {
119     Handle(StepGeom_CompositeCurveSegment) ccs = CC->SegmentsValue ( i );
120     if ( ccs.IsNull() ) {
121       TP->AddFail ( CC, "Null segment" );
122       return Standard_False;
123     }
124     Handle(StepGeom_Curve) crv = ccs->ParentCurve();
125     if ( crv.IsNull() ) {
126       TP->AddFail ( CC, "Segment has null parent curve" );
127       return Standard_False;
128     }
129     isClosed = ( ccs->Transition() != StepGeom_tcDiscontinuous );
130
131     // if segment is itself a composite_curve, translate recursively
132     if ( crv->IsKind(STANDARD_TYPE(StepGeom_CompositeCurve)) ) { 
133       if (crv == CC) { // cyclic reference protection
134         TP->AddFail(ccs, "Cyclic reference; segment dropped");
135         continue;
136       }
137       Handle(StepGeom_CompositeCurve) cc = Handle(StepGeom_CompositeCurve)::DownCast ( crv );
138       if ( ! Init ( cc, TP, S, Surf ) || myWire.IsNull() )
139         continue;
140       Standard_Integer nb = sbwd->NbEdges() + 1;
141       for (TopoDS_Iterator it(myWire); it.More(); it.Next()) {
142         TopoDS_Edge edge = TopoDS::Edge(it.Value());
143         if (ccs->SameSense()) sbwd->Add(edge);
144         else {
145           edge.Reverse();
146           sbwd->Add(edge, nb > sbwd->NbEdges() ? 0 : nb);
147         }
148       }
149       myWire.Nullify();
150       continue;
151     }
152     
153     // ordinary segment
154     
155     // detect pcurve and 3d curve
156     Handle(StepGeom_Pcurve) pcurve = Handle(StepGeom_Pcurve)::DownCast ( crv );
157     if (pcurve.IsNull()) {
158       Handle(StepGeom_SurfaceCurve) sc = Handle(StepGeom_SurfaceCurve)::DownCast(crv);
159       if (!sc.IsNull()) {
160         crv = sc->Curve3d();
161         if (SurfMode) { // find proper pcurve
162           for (Standard_Integer j = 1; j <= sc->NbAssociatedGeometry(); j++) {
163             StepGeom_PcurveOrSurface PCorS = sc->AssociatedGeometryValue(j);
164             Handle(StepGeom_Pcurve) pc = PCorS.Pcurve();
165             if (pc.IsNull() || pc->BasisSurface() != S)
166               continue;
167             pcurve = pc;
168             if (ccs->SameSense())
169               break;
170           }
171         }
172       }
173     }
174     else {
175       if ( ! SurfMode || pcurve->BasisSurface() != S ) pcurve.Nullify();
176       crv.Nullify();
177     }
178     
179     // prepare edge
180     TopoDS_Edge edge;
181     
182     // translate 3d curve, if present
183     if ( ! crv.IsNull() ) {
184       try {
185         OCC_CATCH_SIGNALS
186         Handle(Geom_Curve) c3d = StepToGeom::MakeCurve (crv);
187         if (! c3d.IsNull()) {
188           BRepBuilderAPI_MakeEdge MkEdge ( c3d, c3d->FirstParameter(), c3d->LastParameter() );
189           if (MkEdge.IsDone())
190           {
191             if (Precision::IsNegativeInfinite (c3d->FirstParameter()) || Precision::IsPositiveInfinite (c3d->LastParameter()))
192             {
193               myInfiniteSegment = Standard_True;
194               TP->AddWarning (CC, "Segment with infinite parameters");
195             }
196             edge = MkEdge.Edge();
197           }
198         }
199       }
200       catch(Standard_Failure const& anException) {
201 #ifdef OCCT_DEBUG
202         std::cout << "Warning: StepToTopoDS_TranslateCompositeCurve: Exception: ";
203         anException.Print(std::cout); std::cout << std::endl;
204 #endif
205         (void)anException;
206       }
207     }
208     
209     // translate pcurve, if available
210     if ( ! pcurve.IsNull() ) {
211       try {
212         OCC_CATCH_SIGNALS
213         StepToTopoDS_TranslateEdge TrE;
214         Handle(Geom2d_Curve) c2d = TrE.MakePCurve(pcurve, Surf);
215         if (!c2d.IsNull()) {
216           if (edge.IsNull()) {
217             BRepBuilderAPI_MakeEdge MkEdge(c2d, Surf, c2d->FirstParameter(), c2d->LastParameter());
218             if (MkEdge.IsDone())
219             {
220               if (Precision::IsNegativeInfinite(c2d->FirstParameter()) || Precision::IsPositiveInfinite(c2d->LastParameter()))
221               {
222                 myInfiniteSegment = Standard_True;
223                 TP->AddWarning(CC, "Segment with infinite parameters");
224               }
225               edge = MkEdge.Edge();
226             }
227           }
228           else {
229             BRep_Builder B;
230             TopLoc_Location L;
231             B.UpdateEdge(edge, c2d, Surf, L, 0.);
232             B.Range(edge, Surf, L, c2d->FirstParameter(), c2d->LastParameter());
233             B.SameRange(edge, Standard_False);
234             B.SameParameter(edge, Standard_False);
235           }
236         }
237       }
238       catch(Standard_Failure const& anException) {
239 #ifdef OCCT_DEBUG
240         std::cout << "Warning: StepToTopoDS_TranslateCompositeCurve: Exception: ";
241         anException.Print(std::cout); std::cout << std::endl;
242 #endif
243         (void)anException;
244       }
245     }
246     
247     if ( edge.IsNull() ) {
248       TP->AddFail ( crv, "Curve can not be translated");
249       continue;
250     }
251     
252     if ( ! ccs->SameSense() ) edge.Reverse();
253     sbwd->Add ( edge );
254   }
255   if ( sbwd->NbEdges() <=0 ) {
256     TP->AddFail ( CC, "Translation gives no result" );
257     return Standard_False;
258   }
259   
260   // connect wire; all other fixes are left for caller
261   Standard_Real preci = Precision();
262   Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire;
263   sfw->Load ( sbwd );
264   sfw->SetPrecision ( preci );
265   sfw->ClosedWireMode() = isClosed;
266   sfw->FixReorder(); //:o3 abv 17 Feb 99: r0301_db.stp #57082
267   if ( sfw->StatusReorder ( ShapeExtend_DONE ) ) {
268     TP->AddWarning ( CC, "Segments were disordered; fixed" );
269   }
270   sfw->FixConnected ( preci );
271   if ( sfw->StatusConnected ( ShapeExtend_FAIL ) ) {
272     TP->AddWarning ( CC, "Segments are not connected" );
273   }
274   
275   myWire = sbwd->Wire();
276   done = ( sbwd->NbEdges() >0 );
277   return Standard_True;    
278 }
279         
280 //=======================================================================
281 //function : Value
282 //purpose  : return resulting wire
283 //=======================================================================
284
285 const TopoDS_Wire& StepToTopoDS_TranslateCompositeCurve::Value () const
286 {
287   return myWire;
288 }