0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / GeomPlate / GeomPlate_CurveConstraint.cxx
1 // Created on: 1997-05-05
2 // Created by: Joelle CHAUVET
3 // Copyright (c) 1997-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 // Modified:    Mon Nov  3 10:24:07 1997
18 //              ne traite que les GeomAdaptor_Surface;
19 //              plus de reference a BRepAdaptor
20
21 #include <Adaptor2d_HCurve2d.hxx>
22 #include <Adaptor3d_HCurve.hxx>
23 #include <Adaptor3d_HCurveOnSurface.hxx>
24 #include <Adaptor3d_HSurface.hxx>
25 #include <Approx_Curve2d.hxx>
26 #include <BRepAdaptor_HSurface.hxx>
27 #include <GCPnts_AbscissaPoint.hxx>
28 #include <Geom2d_BSplineCurve.hxx>
29 #include <Geom2d_Curve.hxx>
30 #include <GeomAbs_Shape.hxx>
31 #include <GeomAdaptor.hxx>
32 #include <GeomAdaptor_HCurve.hxx>
33 #include <GeomAdaptor_HSurface.hxx>
34 #include <GeomLProp_SLProps.hxx>
35 #include <GeomPlate_CurveConstraint.hxx>
36 #include <gp_Pnt.hxx>
37 #include <gp_Vec.hxx>
38 #include <Law_Function.hxx>
39 #include <Precision.hxx>
40 #include <ProjLib_ProjectedCurve.hxx>
41 #include <Standard_ConstructionError.hxx>
42 #include <Standard_Type.hxx>
43
44 IMPLEMENT_STANDARD_RTTIEXT(GeomPlate_CurveConstraint,Standard_Transient)
45
46 //---------------------------------------------------------
47 //         Constructeur vide
48 //---------------------------------------------------------
49 GeomPlate_CurveConstraint :: GeomPlate_CurveConstraint ()
50 : myNbPoints(0),
51   myOrder(0),
52   myTang(0),
53   myConstG0(Standard_False),
54   myConstG1(Standard_False),
55   myConstG2(Standard_False),
56   myLProp(2, 1.e-4),
57   myTolDist(0.0),
58   myTolAng(0.0),
59   myTolCurv(0.0),
60   myTolU(0.0),
61   myTolV(0.0)
62 {
63 }
64
65 //---------------------------------------------------------
66 //         Constructeurs avec courbe sur surface
67 //---------------------------------------------------------
68 GeomPlate_CurveConstraint :: GeomPlate_CurveConstraint (const Handle(Adaptor3d_HCurve)& Boundary,
69                                                 const Standard_Integer Tang,
70                                                 const Standard_Integer NPt,
71                                                 const Standard_Real TolDist,
72                                                 const Standard_Real TolAng,
73                                                 const Standard_Real TolCurv
74 ) :
75 myLProp(2,TolDist),
76 myTolDist(TolDist),
77 myTolAng(TolAng),
78 myTolCurv(TolCurv)
79 {
80   myOrder=Tang;
81   if ((Tang<-1)||(Tang>2))
82     throw Standard_Failure("GeomPlate : The continuity is not G0 G1 or G2");
83   myNbPoints=NPt;
84   myConstG0=Standard_True;
85   myConstG1=Standard_True;
86   myConstG2=Standard_True;
87
88   myFrontiere = Handle(Adaptor3d_HCurveOnSurface)::DownCast(Boundary);
89
90   if (myFrontiere.IsNull())
91   {
92     my3dCurve = Boundary;
93   }
94   else
95   {
96     Handle(Geom_Surface) Surf;
97     Handle(GeomAdaptor_HSurface) GS1 = Handle(GeomAdaptor_HSurface)::
98                             DownCast(myFrontiere->ChangeCurve().GetSurface());
99
100     if (!GS1.IsNull()) {
101       Surf=GS1->ChangeSurface().Surface();
102     }
103     else {
104       //      Handle(BRepAdaptor_HSurface) BS1;
105       //      BS1=Handle(BRepAdaptor_HSurface)::DownCast(myFrontiere->
106       //                                            ChangeCurve().GetSurface());
107       //      Surf = BRep_Tool::Surface(BS1->ChangeSurface().Face());
108       throw Standard_Failure(
109                     "GeomPlate_CurveConstraint : Surface must be GeomAdaptor_Surface");
110     }
111
112     myLProp.SetSurface(Surf);
113   }
114
115   my2dCurve.Nullify();
116   myHCurve2d.Nullify();
117   myTolU=0.;
118   myTolV=0.;
119   myG0Crit.Nullify();
120   myG1Crit.Nullify();
121   myG2Crit.Nullify();
122 }
123
124 //---------------------------------------------------------
125 // Fonction : FirstParameter
126 //---------------------------------------------------------
127 Standard_Real GeomPlate_CurveConstraint :: FirstParameter() const
128
129   if (!myHCurve2d.IsNull())
130     return myHCurve2d->FirstParameter();
131   else if (my3dCurve.IsNull())
132     return myFrontiere->FirstParameter();
133   else
134     return my3dCurve->FirstParameter();
135 }
136 //---------------------------------------------------------
137 // Fonction : LastParameter
138 //---------------------------------------------------------
139 Standard_Real GeomPlate_CurveConstraint :: LastParameter() const
140 {    
141   if (!myHCurve2d.IsNull())
142     return myHCurve2d->LastParameter();
143   else if (my3dCurve.IsNull())
144     return myFrontiere->LastParameter();
145   else
146  return my3dCurve->LastParameter();
147 }
148 //---------------------------------------------------------
149 // Fonction : Length
150 //---------------------------------------------------------
151 Standard_Real GeomPlate_CurveConstraint :: Length() const
152 { GCPnts_AbscissaPoint AP;
153   if (my3dCurve.IsNull())
154 {//   GCPnts_AbscissaPoint A(myFrontiere->Curve(),AP.Length(myFrontiere->Curve())/2,myFrontiere->FirstParameter());
155   //  Standard_Real toto=A.Parameter();
156 //std::cout<<toto<<std::endl;
157 return AP.Length(myFrontiere->GetCurve()); 
158     
159 }
160  else
161 { //  GCPnts_AbscissaPoint A(my3dCurve->Curve(),AP.Length(my3dCurve->Curve())/2,my3dCurve->FirstParameter());
162   //  Standard_Real toto=A.Parameter();
163 //std::cout<<toto<<std::endl;
164
165  return AP.Length(my3dCurve->GetCurve());
166 }
167
168
169  
170   
171 }
172 //---------------------------------------------------------
173 // Fonction : D0
174 //---------------------------------------------------------
175 void GeomPlate_CurveConstraint :: D0(const Standard_Real U,gp_Pnt& P) const
176 { gp_Pnt2d P2d;
177    
178   if (my3dCurve.IsNull())
179     { P2d = myFrontiere->ChangeCurve().GetCurve()->Value(U);
180       myFrontiere->ChangeCurve().GetSurface()->D0(P2d.Coord(1),P2d.Coord(2),P);
181     }
182   else
183     my3dCurve->D0(U,P);
184 }
185 //---------------------------------------------------------
186 // Fonction : D1
187 //---------------------------------------------------------
188 void GeomPlate_CurveConstraint :: D1(const Standard_Real U,
189                                  gp_Pnt& P,gp_Vec& V1,gp_Vec& V2) const
190 { gp_Pnt2d P2d;
191    if (!my3dCurve.IsNull())
192     throw Standard_Failure("GeomPlate_CurveConstraint.cxx : Curve must be on a Surface");
193
194   P2d = myFrontiere->ChangeCurve().GetCurve()->Value(U);
195   myFrontiere->ChangeCurve().GetSurface()->D1(P2d.Coord(1),P2d.Coord(2),P,V1,V2);
196
197 }
198
199 //---------------------------------------------------------
200 // Fonction : D2
201 //---------------------------------------------------------
202 void GeomPlate_CurveConstraint :: D2(const Standard_Real U,
203                                gp_Pnt& P,gp_Vec& V1,gp_Vec& V2,
204                                gp_Vec& V3,gp_Vec& V4,gp_Vec& V5) const
205 {  gp_Pnt2d P2d;
206    if (!my3dCurve.IsNull())
207     throw Standard_Failure("GeomPlate_CurveConstraint.cxx : Curve must be on a Surface");
208
209   P2d = myFrontiere->ChangeCurve().GetCurve()->Value(U);
210   myFrontiere->ChangeCurve().GetSurface()->D2(P2d.Coord(1),P2d.Coord(2),P,V1,V2,V3,V4,V5);
211
212 }
213 //---------------------------------------------------------
214 // Fonction : SetG0Criterion
215 //---------------------------------------------------------
216 void GeomPlate_CurveConstraint :: SetG0Criterion(const Handle(Law_Function) &G0Crit)
217 { myG0Crit=G0Crit;
218   myConstG0=Standard_False;
219 }
220 //---------------------------------------------------------
221 // Fonction : SetG1Criterion
222 //---------------------------------------------------------
223 void GeomPlate_CurveConstraint :: SetG1Criterion(const Handle(Law_Function) &G1Crit)
224 { if (!my3dCurve.IsNull())
225     throw Standard_Failure("GeomPlate_CurveConstraint.cxx : Curve must be on a Surface");
226   myG1Crit=G1Crit;
227   myConstG1=Standard_False;
228 }
229 //---------------------------------------------------------
230 // Fonction : SetG2Criterion
231 //---------------------------------------------------------
232 void GeomPlate_CurveConstraint :: SetG2Criterion(const Handle(Law_Function) &G2Crit)
233 { if (!my3dCurve.IsNull())
234     throw Standard_Failure("GeomPlate_CurveConstraint.cxx : Curve must be on a Surface");
235   myG2Crit=G2Crit;
236   myConstG2=Standard_False;
237 }
238 //---------------------------------------------------------
239 // Fonction : G0Criterion
240 //---------------------------------------------------------
241 Standard_Real GeomPlate_CurveConstraint :: G0Criterion(const Standard_Real U) const
242 { if (myConstG0)
243     return myTolDist;
244   else 
245     return myG0Crit->Value(U);
246 }
247 //---------------------------------------------------------
248 // Fonction : G1Criterion 
249 //---------------------------------------------------------
250 Standard_Real GeomPlate_CurveConstraint :: G1Criterion(const Standard_Real U) const
251 { if (!my3dCurve.IsNull())
252     throw Standard_Failure("GeomPlate_CurveConstraint.cxx : Curve must be on a Surface");
253   if (myConstG1)
254     return myTolAng;
255   else 
256     return myG1Crit->Value(U);
257 }
258 //---------------------------------------------------------
259 // Fonction : G2Criterion 
260 //---------------------------------------------------------
261 Standard_Real GeomPlate_CurveConstraint :: G2Criterion(const Standard_Real U) const
262 { if (!my3dCurve.IsNull())
263     throw Standard_Failure("GeomPlate_CurveConstraint.cxx : Curve must be on a Surface");
264   if (myConstG2)
265     return myTolCurv;
266   else 
267     return myG2Crit->Value(U);
268 }
269 //---------------------------------------------------------
270 // Fonction : Curve2dOnSurf
271 //---------------------------------------------------------
272 Handle(Geom2d_Curve) GeomPlate_CurveConstraint :: Curve2dOnSurf () const
273
274   if(my2dCurve.IsNull() && !myHCurve2d.IsNull())
275   {
276      Handle(Geom2d_Curve) C2d;
277      GeomAbs_Shape Continuity = GeomAbs_C1;
278      Standard_Integer MaxDegree = 10;    
279      Standard_Integer MaxSeg=20+myHCurve2d->NbIntervals(GeomAbs_C3);
280      Approx_Curve2d appr(myHCurve2d,myHCurve2d->FirstParameter(),myHCurve2d->LastParameter(),
281                          myTolU,myTolV,Continuity,MaxDegree,MaxSeg);
282      C2d = appr.Curve();
283      return C2d;
284   }
285   else  return my2dCurve;
286 }
287 //---------------------------------------------------------
288 // Fonction : SetCurve2dOnSurf
289 //---------------------------------------------------------
290 void GeomPlate_CurveConstraint :: SetCurve2dOnSurf (const Handle(Geom2d_Curve) &Curve) 
291 { my2dCurve=Curve;
292 }
293 //---------------------------------------------------------
294 // Fonction : ProjectedCurve
295 //---------------------------------------------------------
296 Handle(Adaptor2d_HCurve2d) GeomPlate_CurveConstraint :: ProjectedCurve () const
297 {  
298   return myHCurve2d;
299 }
300 //---------------------------------------------------------
301 // Fonction : SetProjectedCurve
302 //---------------------------------------------------------
303 void GeomPlate_CurveConstraint :: SetProjectedCurve (const Handle(Adaptor2d_HCurve2d) &Curve, 
304                                                     const Standard_Real TolU,const Standard_Real TolV) 
305 { myHCurve2d=Curve;
306   myTolU=TolU;
307   myTolV=TolV;
308 }
309
310 //---------------------------------------------------------
311 // Fonction : Curve3d
312 //---------------------------------------------------------
313 Handle(Adaptor3d_HCurve) GeomPlate_CurveConstraint :: Curve3d () const
314 { if (my3dCurve.IsNull())
315     return Handle(Adaptor3d_HCurve) (myFrontiere);
316   else
317     return my3dCurve;
318 }
319 //------------------------------------------------------------
320 //Fonction : NbPoints
321 //------------------------------------------------------------
322 Standard_Integer GeomPlate_CurveConstraint::NbPoints() const
323 {
324 return myNbPoints;
325 }   
326 //------------------------------------------------------------
327 //Fonction : Order
328 //------------------------------------------------------------
329 Standard_Integer GeomPlate_CurveConstraint::Order() const
330 {
331 return myOrder;
332 }
333 //------------------------------------------------------------
334 //Fonction : SetNbPoints
335 //------------------------------------------------------------
336 void GeomPlate_CurveConstraint::SetNbPoints(const Standard_Integer NewNb)
337 {
338 myNbPoints = NewNb;
339 }
340 //------------------------------------------------------------
341 //Fonction : SetOrder
342 //------------------------------------------------------------
343 void GeomPlate_CurveConstraint::SetOrder(const Standard_Integer Order)
344 {
345 myOrder = Order;
346 }
347 //------------------------------------------------------------
348 //Fonction : LPropSurf
349 //------------------------------------------------------------
350 GeomLProp_SLProps &GeomPlate_CurveConstraint::LPropSurf(const Standard_Real U)
351 {  if (myFrontiere.IsNull())
352     throw Standard_Failure("GeomPlate_CurveConstraint.cxx : Curve must be on a Surface");
353   gp_Pnt2d P2d= myFrontiere->ChangeCurve().GetCurve()->Value(U);
354 myLProp.SetParameters(P2d.X(),P2d.Y());
355 return myLProp;
356 }