0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / BRepTopAdaptor / BRepTopAdaptor_TopolTool.cxx
1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15
16 #include <Adaptor2d_HCurve2d.hxx>
17 #include <Adaptor3d_HSurface.hxx>
18 #include <Adaptor3d_HVertex.hxx>
19 #include <BRep_Tool.hxx>
20 #include <BRepAdaptor_HCurve2d.hxx>
21 #include <BRepAdaptor_HSurface.hxx>
22 #include <BRepClass_FaceClassifier.hxx>
23 #include <BRepClass_FaceExplorer.hxx>
24 #include <BRepTopAdaptor_FClass2d.hxx>
25 #include <BRepTopAdaptor_HVertex.hxx>
26 #include <BRepTopAdaptor_TopolTool.hxx>
27 #include <Geom_BezierSurface.hxx>
28 #include <Geom_BSplineSurface.hxx>
29 #include <gp_Pnt.hxx>
30 #include <gp_Pnt2d.hxx>
31 #include <Precision.hxx>
32 #include <Standard_ConstructionError.hxx>
33 #include <Standard_DomainError.hxx>
34 #include <Standard_NotImplemented.hxx>
35 #include <Standard_Type.hxx>
36 #include <TColgp_Array2OfPnt.hxx>
37 #include <TopoDS.hxx>
38
39 IMPLEMENT_STANDARD_RTTIEXT(BRepTopAdaptor_TopolTool,Adaptor3d_TopolTool)
40
41 static 
42   void Analyse(const TColgp_Array2OfPnt& array2,
43                const Standard_Integer nbup,
44                const Standard_Integer nbvp,
45                Standard_Integer& myNbSamplesU,
46                Standard_Integer& myNbSamplesV); 
47 //=======================================================================
48 //function : BRepTopAdaptor_TopolTool
49 //purpose  : 
50 //=======================================================================
51   BRepTopAdaptor_TopolTool::BRepTopAdaptor_TopolTool ()
52   : myFClass2d(NULL),
53     myU0(0.0),
54     myV0(0.0),
55     myDU(0.0),
56     myDV(0.0)
57 {
58   myNbSamplesU=-1;
59 }
60
61 //=======================================================================
62 //function : BRepTopAdaptor_TopolTool
63 //purpose  : 
64 //=======================================================================
65   BRepTopAdaptor_TopolTool::BRepTopAdaptor_TopolTool(const Handle(Adaptor3d_HSurface)& S) 
66 : myFClass2d(NULL)
67 {
68   Initialize(S);
69   //myS = S;
70 }
71 //=======================================================================
72 //function : Initialize
73 //purpose  : 
74 //=======================================================================
75   void BRepTopAdaptor_TopolTool::Initialize()
76 {
77   throw Standard_NotImplemented("BRepTopAdaptor_TopolTool::Initialize()");
78 }
79 //=======================================================================
80 //function : Initialize
81 //purpose  : 
82 //=======================================================================
83   void BRepTopAdaptor_TopolTool::Initialize(const Handle(Adaptor3d_HSurface)& S)
84 {
85   Handle(BRepAdaptor_HSurface) brhs = 
86     Handle(BRepAdaptor_HSurface)::DownCast(S);
87   if (brhs.IsNull()) {throw Standard_ConstructionError();}
88   TopoDS_Shape s_wnt = ((BRepAdaptor_Surface *)&(brhs->Surface()))->Face();
89   s_wnt.Orientation(TopAbs_FORWARD);
90   myFace = TopoDS::Face(s_wnt);
91   if(myFClass2d != NULL) { 
92     delete (BRepTopAdaptor_FClass2d *)myFClass2d;
93   } 
94   myFClass2d = NULL;
95   myNbSamplesU=-1;
96   myS = S;
97   myCurves.Clear();
98   TopExp_Explorer ex(myFace,TopAbs_EDGE);
99   for (; ex.More(); ex.Next()) {
100     Handle(BRepAdaptor_HCurve2d) aCurve = new BRepAdaptor_HCurve2d
101       (BRepAdaptor_Curve2d(TopoDS::Edge(ex.Current()),myFace));
102     myCurves.Append(aCurve);
103   }
104   myCIterator = TColStd_ListIteratorOfListOfTransient();
105 }
106 //=======================================================================
107 //function : Initialize
108 //purpose  : 
109 //=======================================================================
110   void BRepTopAdaptor_TopolTool::Initialize(const Handle(Adaptor2d_HCurve2d)& C)
111 {
112   myCurve = Handle(BRepAdaptor_HCurve2d)::DownCast(C);
113   if (myCurve.IsNull()) {throw Standard_ConstructionError();}
114 }
115 //=======================================================================
116 //function : Init
117 //purpose  : 
118 //=======================================================================
119   void BRepTopAdaptor_TopolTool::Init ()
120 {
121   myCIterator.Initialize(myCurves);
122 }
123 //=======================================================================
124 //function : More
125 //purpose  : 
126 //=======================================================================
127   Standard_Boolean BRepTopAdaptor_TopolTool::More ()
128 {
129   return myCIterator.More();
130 }
131 //=======================================================================
132 //function : Next
133 //purpose  : 
134 //=======================================================================
135   void BRepTopAdaptor_TopolTool::Next()
136 {
137   myCIterator.Next();
138 }
139 //=======================================================================
140 //function : Value
141 //purpose  : 
142 //=======================================================================
143   Handle(Adaptor2d_HCurve2d) BRepTopAdaptor_TopolTool::Value ()
144 {
145   return Handle(Adaptor2d_HCurve2d)::DownCast(myCIterator.Value());
146 }
147 //modified by NIZNHY-PKV Tue Mar 27 14:23:40 2001 f
148 //=======================================================================
149 //function : Edge
150 //purpose  : 
151 //=======================================================================
152   Standard_Address BRepTopAdaptor_TopolTool::Edge () const
153 {
154   Handle(BRepAdaptor_HCurve2d) aHCurve =
155     Handle(BRepAdaptor_HCurve2d)::DownCast(myCIterator.Value());
156   const BRepAdaptor_Curve2d& aCurve = (const BRepAdaptor_Curve2d&)aHCurve->Curve2d();
157   return Standard_Address (& aCurve.Edge());
158 }
159
160 //modified by NIZNHY-PKV Tue Mar 27 14:23:43 2001 t
161 //=======================================================================
162 //function : InitVertexIterator
163 //purpose  : 
164 //=======================================================================
165   void BRepTopAdaptor_TopolTool::InitVertexIterator ()
166 {
167   myVIterator.Init(((BRepAdaptor_Curve2d *)&(myCurve->Curve2d()))->Edge(),TopAbs_VERTEX);
168 }
169 //=======================================================================
170 //function : NextVertex
171 //purpose  : 
172 //=======================================================================
173   Standard_Boolean BRepTopAdaptor_TopolTool::MoreVertex ()
174 {
175   return myVIterator.More();
176 }
177
178   void BRepTopAdaptor_TopolTool::NextVertex ()
179 {
180   myVIterator.Next();
181 }
182 //=======================================================================
183 //function : Vertex
184 //purpose  : 
185 //=======================================================================
186   Handle(Adaptor3d_HVertex) BRepTopAdaptor_TopolTool::Vertex ()
187 {
188   return new 
189     BRepTopAdaptor_HVertex(TopoDS::Vertex(myVIterator.Current()),myCurve);
190 }
191   
192 //=======================================================================
193 //function : Classify
194 //purpose  : 
195 //=======================================================================
196   TopAbs_State BRepTopAdaptor_TopolTool::Classify(const gp_Pnt2d& P,
197                                                   const Standard_Real Tol,
198                                                   const Standard_Boolean RecadreOnPeriodic)
199 {
200   if(myFace.IsNull())
201     return TopAbs_UNKNOWN;
202   if(myFClass2d == NULL) { 
203     myFClass2d = (void *) new BRepTopAdaptor_FClass2d(myFace,Tol);
204   } 
205   return(((BRepTopAdaptor_FClass2d *)myFClass2d)->Perform(P,RecadreOnPeriodic));
206 }
207
208 //=======================================================================
209 //function : IsThePointOn
210 //purpose  : 
211 //=======================================================================
212   Standard_Boolean BRepTopAdaptor_TopolTool::IsThePointOn(const gp_Pnt2d& P,
213                                                           const Standard_Real Tol,
214                                                           const Standard_Boolean RecadreOnPeriodic)
215 {
216   if(myFClass2d == NULL) { 
217     myFClass2d = (void *) new BRepTopAdaptor_FClass2d(myFace,Tol);
218   } 
219   return(TopAbs_ON==((BRepTopAdaptor_FClass2d *)myFClass2d)->TestOnRestriction(P,Tol,RecadreOnPeriodic));
220 }
221
222 //=======================================================================
223 //function : Destroy
224 //purpose  : 
225 //=======================================================================
226   void BRepTopAdaptor_TopolTool::Destroy() 
227
228   if(myFClass2d != NULL) { 
229     delete (BRepTopAdaptor_FClass2d *)myFClass2d;
230     myFClass2d=NULL;
231   }
232 }
233 //=======================================================================
234 //function : Orientation
235 //purpose  : 
236 //=======================================================================
237   TopAbs_Orientation BRepTopAdaptor_TopolTool::Orientation  (const Handle(Adaptor2d_HCurve2d)& C)
238 {
239   Handle(BRepAdaptor_HCurve2d) brhc =
240     Handle(BRepAdaptor_HCurve2d)::DownCast(C);
241   return ((BRepAdaptor_Curve2d *)&(brhc->Curve2d()))->Edge().Orientation(); 
242 }
243 //=======================================================================
244 //function : Orientation
245 //purpose  : 
246 //=======================================================================
247   TopAbs_Orientation BRepTopAdaptor_TopolTool::Orientation  (const Handle(Adaptor3d_HVertex)& C)
248 {
249  return Adaptor3d_TopolTool::Orientation(C); 
250 }
251 //-- ============================================================
252 //-- methods  used for samples
253 //-- ============================================================ 
254
255 //=======================================================================
256 //function : Analyse
257 //purpose  : 
258 //=======================================================================
259 void Analyse(const TColgp_Array2OfPnt& array2,
260              const Standard_Integer nbup,
261              const Standard_Integer nbvp,
262              Standard_Integer& myNbSamplesU,
263              Standard_Integer& myNbSamplesV) 
264
265   gp_Vec Vi,Vip1;
266   Standard_Integer sh,nbch,i,j;
267   
268   sh = 1;
269   nbch = 0;
270   if(nbvp>2) { 
271     for(i=2;i<nbup;i++) { 
272       const gp_Pnt& A=array2.Value(i,1);
273       const gp_Pnt& B=array2.Value(i,2);
274       const gp_Pnt& C=array2.Value(i,3);
275       Vi.SetCoord(C.X()-B.X()-B.X()+A.X(),
276                   C.Y()-B.Y()-B.Y()+A.Y(),
277                   C.Z()-B.Z()-B.Z()+A.Z());
278       Standard_Integer locnbch=0;
279       for(j=3; j<nbvp;j++) {  //-- test
280         const gp_Pnt& Ax=array2.Value(i,j-1);
281         const gp_Pnt& Bx=array2.Value(i,j);
282         const gp_Pnt& Cx=array2.Value(i,j+1);
283         Vip1.SetCoord(Cx.X()-Bx.X()-Bx.X()+Ax.X(),
284                       Cx.Y()-Bx.Y()-Bx.Y()+Ax.Y(),
285                       Cx.Z()-Bx.Z()-Bx.Z()+Ax.Z());
286         Standard_Real pd = Vi.Dot(Vip1);
287         Vi=Vip1;
288         if(pd>1.0e-7 || pd<-1.0e-7) {  
289           if(pd>0) {  if(sh==-1) {   sh=1; locnbch++;   }  }
290           else {        if(sh==1) {  sh=-1; locnbch++;  }  }
291         }
292       }
293       if(locnbch>nbch) { 
294         nbch=locnbch; 
295       }
296     }
297   }
298   myNbSamplesV = nbch+5;
299   
300
301   nbch=0;
302   if(nbup>2) { 
303     for(j=2;j<nbvp;j++) { 
304       const gp_Pnt& A=array2.Value(1,j);
305       const gp_Pnt& B=array2.Value(2,j);
306       const gp_Pnt& C=array2.Value(3,j);
307       Vi.SetCoord(C.X()-B.X()-B.X()+A.X(),
308                   C.Y()-B.Y()-B.Y()+A.Y(),
309                   C.Z()-B.Z()-B.Z()+A.Z());
310       Standard_Integer locnbch=0;
311       for(i=3; i<nbup;i++) {  //-- test
312         const gp_Pnt& Ax=array2.Value(i-1,j);
313         const gp_Pnt& Bx=array2.Value(i,j);
314         const gp_Pnt& Cx=array2.Value(i+1,j);
315         Vip1.SetCoord(Cx.X()-Bx.X()-Bx.X()+Ax.X(),
316                     Cx.Y()-Bx.Y()-Bx.Y()+Ax.Y(),
317                     Cx.Z()-Bx.Z()-Bx.Z()+Ax.Z());
318         Standard_Real pd = Vi.Dot(Vip1);
319         Vi=Vip1;
320         if(pd>1.0e-7 || pd<-1.0e-7) {  
321           if(pd>0) {  if(sh==-1) {   sh=1; locnbch++;   }  }
322           else {        if(sh==1) {  sh=-1; locnbch++;  }  }
323         }
324       }
325       if(locnbch>nbch) nbch=locnbch;
326     }  
327   }
328   myNbSamplesU = nbch+5;
329 }  
330
331
332
333
334 //=======================================================================
335 //function : ComputeSamplePoints
336 //purpose  : 
337 //=======================================================================
338   void BRepTopAdaptor_TopolTool::ComputeSamplePoints() 
339
340   Standard_Real uinf,usup,vinf,vsup;
341   uinf = myS->FirstUParameter();  usup = myS->LastUParameter();
342   vinf = myS->FirstVParameter();  vsup = myS->LastVParameter();
343   if (usup < uinf) { Standard_Real temp=uinf; uinf=usup; usup=temp; }
344   if (vsup < vinf) { Standard_Real temp=vinf; vinf=vsup; vsup=temp; }
345   if (uinf == RealFirst() && usup == RealLast()) { uinf=-1.e5; usup=1.e5; }
346   else if (uinf == RealFirst()) { uinf=usup-2.e5; }
347   else if (usup == RealLast()) {  usup=uinf+2.e5; }
348   
349   if (vinf == RealFirst() && vsup == RealLast()) { vinf=-1.e5; vsup=1.e5; }
350   else if (vinf == RealFirst()) { vinf=vsup-2.e5;  }
351   else if (vsup == RealLast()) {  vsup=vinf+2.e5;  }
352   
353   Standard_Integer nbsu,nbsv;
354   GeomAbs_SurfaceType typS = myS->GetType();
355   switch(typS) { 
356   case GeomAbs_Plane:          { nbsv=2; nbsu=2; } break;
357   case GeomAbs_BezierSurface:  { nbsv=3+myS->NbVPoles(); nbsu=3+myS->NbUPoles();  } break;
358   case GeomAbs_BSplineSurface: {
359     nbsv = myS->NbVKnots();     nbsv*= myS->VDegree();     if(nbsv < 4) nbsv=4;    
360     nbsu = myS->NbUKnots();     nbsu*= myS->UDegree();     if(nbsu < 4) nbsu=4;
361   }
362     break;
363   case GeomAbs_Cylinder:
364   case GeomAbs_Cone:
365   case GeomAbs_Sphere:
366   case GeomAbs_Torus:                 { 
367     //-- Set 15 for 2pi
368     //-- Not enough ->25 for 2pi
369     nbsu = (Standard_Integer)(8*(usup-uinf));
370     nbsv = (Standard_Integer)(7*(vsup-vinf));
371     if(nbsu<5) nbsu=5;
372     if(nbsv<5) nbsv=5;
373     if(nbsu>30) nbsu=30; //modif HRT buc60462
374     if(nbsv>15) nbsv=15;
375     //-- printf("\n nbsu=%d nbsv=%d\n",nbsu,nbsv);
376   }     break;
377   case GeomAbs_SurfaceOfRevolution:
378   case GeomAbs_SurfaceOfExtrusion:    { nbsv = 15; nbsu=25; }     break;
379   default:                            { nbsu = 10; nbsv=10; }    break;
380   }
381   
382   //-- If the number of points is too great, analyze 
383   //-- 
384   //-- 
385   
386   if(nbsu<10) nbsu=10;
387   if(nbsv<10) nbsv=10;
388   
389   myNbSamplesU = nbsu;
390   myNbSamplesV = nbsv;
391   
392   //-- printf("\n BRepTopAdaptor_TopolTool NbSu=%d NbSv=%d ",nbsu,nbsv);
393   if(nbsu>10 || nbsv>10) { 
394     if(typS == GeomAbs_BSplineSurface) { 
395       const Handle(Geom_BSplineSurface)& Bspl = myS->BSpline();
396       Standard_Integer nbup = Bspl->NbUPoles();
397       Standard_Integer nbvp = Bspl->NbVPoles();
398       TColgp_Array2OfPnt array2(1,nbup,1,nbvp);
399       Bspl->Poles(array2);
400       Analyse(array2,nbup,nbvp,myNbSamplesU,myNbSamplesV);
401       nbsu=myNbSamplesU;
402       nbsv=myNbSamplesV;
403       //-- printf("\n Apres analyse BSPline  NbSu=%d NbSv=%d ",myNbSamplesU,myNbSamplesV);
404     }
405     else if(typS == GeomAbs_BezierSurface) { 
406       const Handle(Geom_BezierSurface)& Bez = myS->Bezier();
407       Standard_Integer nbup = Bez->NbUPoles();
408       Standard_Integer nbvp = Bez->NbVPoles();
409       TColgp_Array2OfPnt array2(1,nbup,1,nbvp);
410       Bez->Poles(array2);
411       Analyse(array2,nbup,nbvp,myNbSamplesU,myNbSamplesV);
412       nbsu=myNbSamplesU;
413       nbsv=myNbSamplesV;
414       //-- printf("\n Apres analyse Bezier  NbSu=%d NbSv=%d ",myNbSamplesU,myNbSamplesV);
415     }
416   }
417  
418   if(nbsu<10) nbsu=10;
419   if(nbsv<10) nbsv=10;
420   
421   myNbSamplesU = nbsu;
422   myNbSamplesV = nbsv; 
423   
424   myU0 = uinf;
425   myV0 = vinf;
426   
427   myDU = (usup-uinf)/(myNbSamplesU+1);
428   myDV = (vsup-vinf)/(myNbSamplesV+1);
429 }
430 //=======================================================================
431 //function : NbSamplesU
432 //purpose  : 
433 //=======================================================================
434   Standard_Integer BRepTopAdaptor_TopolTool::NbSamplesU() 
435
436   if(myNbSamplesU <0) { 
437     ComputeSamplePoints();
438   }
439   return(myNbSamplesU);
440 }
441 //=======================================================================
442 //function : NbSamplesV
443 //purpose  : 
444 //=======================================================================
445   Standard_Integer BRepTopAdaptor_TopolTool::NbSamplesV() 
446
447   if(myNbSamplesU <0) { 
448     ComputeSamplePoints();    
449   }
450   return(myNbSamplesV);
451 }
452 //=======================================================================
453 //function : NbSamples
454 //purpose  : 
455 //=======================================================================
456   Standard_Integer BRepTopAdaptor_TopolTool::NbSamples()
457
458   if(myNbSamplesU <0) { 
459     ComputeSamplePoints();    
460   }
461   return(myNbSamplesU*myNbSamplesV);
462 }
463
464 //=======================================================================
465 //function : SamplePoint
466 //purpose  : 
467 //=======================================================================
468   void BRepTopAdaptor_TopolTool::SamplePoint(const Standard_Integer i,
469                                              gp_Pnt2d& P2d,
470                                              gp_Pnt& P3d)
471
472   Standard_Integer iv = 1 + i/myNbSamplesU;
473   Standard_Integer iu = 1+ i-(iv-1)*myNbSamplesU;
474   Standard_Real u=myU0+iu*myDU;
475   Standard_Real v=myV0+iv*myDV;
476   P2d.SetCoord(u,v);
477   P3d=myS->Value(u,v);
478 }
479 //=======================================================================
480 //function : DomainIsInfinite
481 //purpose  : 
482 //=======================================================================
483   Standard_Boolean BRepTopAdaptor_TopolTool::DomainIsInfinite() 
484 {
485   Standard_Real uinf,usup,vinf,vsup;
486   uinf = myS->FirstUParameter();  usup = myS->LastUParameter();
487   vinf = myS->FirstVParameter();  vsup = myS->LastVParameter();
488   if(Precision::IsNegativeInfinite(uinf)) return(Standard_True);
489   if(Precision::IsPositiveInfinite(usup)) return(Standard_True);
490   if(Precision::IsNegativeInfinite(vinf)) return(Standard_True);
491   if(Precision::IsPositiveInfinite(vsup)) return(Standard_True);
492   return(Standard_False);  
493 }
494
495 //=======================================================================
496 //function : Has3d
497 //purpose  : 
498 //=======================================================================
499
500 Standard_Boolean BRepTopAdaptor_TopolTool::Has3d() const
501 {
502   return Standard_True;
503 }
504
505 //=======================================================================
506 //function : Tol3d
507 //purpose  : 
508 //=======================================================================
509
510 Standard_Real BRepTopAdaptor_TopolTool::Tol3d(const Handle(Adaptor2d_HCurve2d)& C) const
511 {
512   Handle(BRepAdaptor_HCurve2d) brhc = Handle(BRepAdaptor_HCurve2d)::DownCast(C);
513   if (brhc.IsNull())
514     throw Standard_DomainError("BRepTopAdaptor_TopolTool: arc has no 3d representation");
515   const BRepAdaptor_Curve2d& brc = (const BRepAdaptor_Curve2d &)brhc->Curve2d();
516   const TopoDS_Edge& edge = brc.Edge();
517   if (edge.IsNull())
518     throw Standard_DomainError("BRepTopAdaptor_TopolTool: arc has no 3d representation");
519   return BRep_Tool::Tolerance(edge);
520 }
521
522 //=======================================================================
523 //function : Tol3d
524 //purpose  : 
525 //=======================================================================
526
527 Standard_Real BRepTopAdaptor_TopolTool::Tol3d(const Handle(Adaptor3d_HVertex)& V) const
528 {
529   Handle(BRepTopAdaptor_HVertex) brhv = Handle(BRepTopAdaptor_HVertex)::DownCast(V);
530   if (brhv.IsNull())
531     throw Standard_DomainError("BRepTopAdaptor_TopolTool: vertex has no 3d representation");
532   const TopoDS_Vertex& ver = brhv->Vertex();
533   if (ver.IsNull())
534     throw Standard_DomainError("BRepTopAdaptor_TopolTool: vertex has no 3d representation");
535   return BRep_Tool::Tolerance(ver);
536 }
537
538 //=======================================================================
539 //function : Pnt
540 //purpose  : 
541 //=======================================================================
542
543 gp_Pnt BRepTopAdaptor_TopolTool::Pnt(const Handle(Adaptor3d_HVertex)& V) const
544 {
545   Handle(BRepTopAdaptor_HVertex) brhv = Handle(BRepTopAdaptor_HVertex)::DownCast(V);
546   if (brhv.IsNull())
547     throw Standard_DomainError("BRepTopAdaptor_TopolTool: vertex has no 3d representation");
548   const TopoDS_Vertex& ver = brhv->Vertex();
549   if (ver.IsNull())
550     throw Standard_DomainError("BRepTopAdaptor_TopolTool: vertex has no 3d representation");
551   return BRep_Tool::Pnt(ver);
552 }