]> OCCT Git - occt-copy.git/commitdiff
0026675: Eliminate normalization of coordinates in ApproxInt package
authornbv <nbv@opencascade.com>
Wed, 28 Oct 2015 10:03:09 +0000 (13:03 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 29 Oct 2015 13:49:32 +0000 (16:49 +0300)
Normalization has been eliminated.

Additionally,
1. Some methods of AppDef_Compute and ApproxInt_MultiLine classes have become inline (for speeding up performance).
2. Interfaces of AppDef_Compute::Parametrization(...) and BRepAlgo_BooleanOperations::SetApproxParameters() methods have been changed.
3. Overloaded methods for ApproxInt_Approx::SetParameters(...), TopOpeBRepTool_GeomTool::GetTolerances(...) and TopOpeBRepTool_GeomTool::SetTolerances(...) have been removed (because some fields of these classes are not used more).
4. Lost comments have been added in BRepApprox_TheMultiLineOfApprox.hxx and GeomInt_TheMultiLineOfWLApprox.hxx files.
5. Some fields have been deleted from ApproxInt_MultiLine class. Kept members have become constant.
6. Interface of ksection DRAW-command has been changed.
7. Some code fragments have been rewritten to make them easier.
8. Function CleanWline(...) has been added in IntPatch_Intersection.cxx file. See comments in code for detail description.

Adjusting some test case according to their new behavior.
Creation test case for this issue.

56 files changed:
src/AppDef/AppDef_Compute.hxx
src/Approx/Approx_ComputeLine.gxx
src/ApproxInt/ApproxInt_Approx.gxx
src/ApproxInt/ApproxInt_MultiLine.gxx
src/BRepAlgo/BRepAlgo_BooleanOperations.cxx
src/BRepAlgo/BRepAlgo_BooleanOperations.hxx
src/BRepApprox/BRepApprox_Approx.hxx
src/BRepApprox/BRepApprox_TheComputeLineBezierOfApprox.hxx
src/BRepApprox/BRepApprox_TheMultiLineOfApprox.hxx
src/ChFi3d/ChFi3d_Builder_0.cxx
src/GeomInt/GeomInt_IntSS_1.cxx
src/GeomInt/GeomInt_TheComputeLineBezierOfWLApprox.hxx
src/GeomInt/GeomInt_TheMultiLineOfWLApprox.hxx
src/GeomInt/GeomInt_WLApprox.hxx
src/GeomliteTest/GeomliteTest_API2dCommands.cxx
src/HLRTopoBRep/HLRTopoBRep_DSFiller.cxx
src/IntPatch/IntPatch_Intersection.cxx
src/IntTools/IntTools_FaceFace.cxx
src/QABugs/FILES
src/QABugs/QABugs.cxx
src/QABugs/QABugs.hxx
src/QABugs/QABugs_11.cxx
src/QABugs/QABugs_20.cxx [new file with mode: 0644]
src/QABugs/QABugs_3.cxx
src/ShapeAlgo/ShapeAlgo_AlgoContainer.cxx
src/TopOpeBRepTool/TopOpeBRepTool_CurveTool.cxx
src/TopOpeBRepTool/TopOpeBRepTool_GeomTool.cxx
src/TopOpeBRepTool/TopOpeBRepTool_GeomTool.hxx
tests/blend/buildevol/B3
tests/blend/simple/X4
tests/boolean/bcommon_complex/C7
tests/boolean/bsection/M3
tests/boolean/bsection/M7
tests/boolean/bsection/N2
tests/boolean/volumemaker/F9
tests/boolean/volumemaker/G1
tests/bugs/modalg_1/buc60555_1
tests/bugs/modalg_1/buc60555_2
tests/bugs/modalg_1/buc60555_3
tests/bugs/modalg_1/bug10160_1
tests/bugs/modalg_1/bug10160_3
tests/bugs/modalg_1/bug1255
tests/bugs/modalg_1/bug1255_1
tests/bugs/modalg_2/bug22557
tests/bugs/modalg_2/bug5805_46
tests/bugs/modalg_3/bug602
tests/bugs/modalg_5/bug24585_1
tests/bugs/modalg_5/bug24915
tests/bugs/modalg_5/bug24981
tests/bugs/modalg_5/bug25224
tests/bugs/modalg_5/bug25319_1
tests/bugs/modalg_5/bug25319_2
tests/bugs/modalg_5/bug25838
tests/bugs/modalg_6/bug26675 [new file with mode: 0644]
tests/draft/angle/G2
tests/draft/angle/J5

index c387e88122dbeb43ad43aed2d60bb8675b4be704..734f9613323a3d5c7e2748f1627c19d356652757 100644 (file)
@@ -83,47 +83,88 @@ public:
   Standard_EXPORT void Perform (const AppDef_MultiLine& Line);
   
   //! changes the degrees of the approximation.
-  Standard_EXPORT void SetDegrees (const Standard_Integer degreemin, const Standard_Integer degreemax);
+  Standard_EXPORT void SetDegrees ( const Standard_Integer degreemin,
+                                    const Standard_Integer degreemax)
+  {
+    mydegremin = degreemin;
+    mydegremax = degreemax;
+  }
   
   //! Changes the tolerances of the approximation.
-  Standard_EXPORT void SetTolerances (const Standard_Real Tolerance3d, const Standard_Real Tolerance2d);
+  Standard_EXPORT void SetTolerances (const Standard_Real Tolerance3d,
+                                      const Standard_Real Tolerance2d)
+  {
+    mytol3d = Tolerance3d;
+    mytol2d = Tolerance2d;
+  }
   
   //! changes the first and the last constraint points.
-  Standard_EXPORT void SetConstraints (const AppParCurves_Constraint firstC, const AppParCurves_Constraint lastC);
+  Standard_EXPORT void SetConstraints ( const AppParCurves_Constraint FirstC,
+                                        const AppParCurves_Constraint LastC)
+  {
+    myfirstC = FirstC;
+    mylastC = LastC;
+  }
   
   //! returns False if at a moment of the approximation,
   //! the status NoApproximation has been sent by the user
   //! when more points were needed.
-  Standard_EXPORT Standard_Boolean IsAllApproximated() const;
+  Standard_EXPORT Standard_Boolean IsAllApproximated() const
+  {
+    return alldone;
+  }
   
   //! returns False if the status NoPointsAdded has been sent.
-  Standard_EXPORT Standard_Boolean IsToleranceReached() const;
+  Standard_EXPORT Standard_Boolean IsToleranceReached() const
+  {
+    return tolreached;
+  }
   
   //! returns the tolerances 2d and 3d of the <Index> MultiCurve.
-  Standard_EXPORT void Error (const Standard_Integer Index, Standard_Real& tol3d, Standard_Real& tol2d) const;
+  Standard_EXPORT void Error (const Standard_Integer Index,
+                              Standard_Real& tol3d,
+                              Standard_Real& tol2d) const
+  {
+    tol3d = Tolers3d.Value(Index);
+    tol2d = Tolers2d.Value(Index);
+  }
   
   //! Returns the number of MultiCurve doing the approximation
   //! of the MultiLine.
-  Standard_EXPORT Standard_Integer NbMultiCurves() const;
+  Standard_EXPORT Standard_Integer NbMultiCurves() const
+  {
+    return myMultiCurves.Length();
+  }
   
   //! returns the result of the approximation.
-  Standard_EXPORT const AppParCurves_MultiCurve& Value (const Standard_Integer Index = 1) const;
+  Standard_EXPORT const AppParCurves_MultiCurve& 
+                                  Value (const Standard_Integer Index = 1) const
+  {
+    return myMultiCurves.Value(Index);
+  }
   
   //! returns the result of the approximation.
-  Standard_EXPORT AppParCurves_MultiCurve& ChangeValue (const Standard_Integer Index = 1);
+  Standard_EXPORT AppParCurves_MultiCurve& ChangeValue (const Standard_Integer Index = 1)
+  {
+    return myMultiCurves.ChangeValue(Index);
+  }
   
   //! returns the result of the approximation.
   Standard_EXPORT const AppParCurves_MultiBSpCurve& SplineValue();
   
   //! returns the type  of  parametrization
-  Standard_EXPORT void Parametrization (Approx_ParametrizationType& partype) const;
+  Standard_EXPORT Approx_ParametrizationType Parametrization () const
+  {
+    return Par;
+  }
   
   //! returns the new parameters of the approximation
   //! corresponding to the points of the multicurve <Index>.
-  Standard_EXPORT const TColStd_Array1OfReal& Parameters (const Standard_Integer Index = 1) const;
-
-
-
+  Standard_EXPORT const TColStd_Array1OfReal& 
+                      Parameters (const Standard_Integer Index = 1) const
+  {
+    return (myPar.Value(Index))->Array1();
+  }
 
 protected:
 
index 94aabbaf4712dc0c914b675b516ff86eafc47792..bc7663c25d5a3fa9d86db8f142258347ad093162 100644 (file)
@@ -783,32 +783,6 @@ void Approx_ComputeLine::Perform(const MultiLine& Line)
   }
 }
 
-
-
-const TColStd_Array1OfReal& Approx_ComputeLine::Parameters(const Standard_Integer Index) const
-{
-  return (myPar.Value(Index))->Array1();
-}
-
-
-Standard_Integer Approx_ComputeLine::NbMultiCurves()const
-{
-  return myMultiCurves.Length();
-}
-
-AppParCurves_MultiCurve& Approx_ComputeLine::ChangeValue(const Standard_Integer Index)
-{
-  return myMultiCurves.ChangeValue(Index);
-}
-
-
-const AppParCurves_MultiCurve& Approx_ComputeLine::Value(const Standard_Integer Index)
-const
-{
-  return myMultiCurves.Value(Index);
-}
-
-
 const AppParCurves_MultiBSpCurve& Approx_ComputeLine::SplineValue()
 {
   Approx_MCurvesToBSpCurve Trans;
@@ -817,10 +791,6 @@ const AppParCurves_MultiBSpCurve& Approx_ComputeLine::SplineValue()
   return myspline;
 }
 
-
-
-
-
 void Approx_ComputeLine::Parameters(const MultiLine& Line, 
                               const Standard_Integer firstP,
                               const Standard_Integer lastP,
@@ -880,7 +850,6 @@ void Approx_ComputeLine::Parameters(const MultiLine& Line,
   }
 }  
 
-
 Standard_Boolean Approx_ComputeLine::Compute(const MultiLine& Line,
                                             const Standard_Integer fpt,
                                             const Standard_Integer lpt,
@@ -979,9 +948,6 @@ Standard_Boolean Approx_ComputeLine::Compute(const MultiLine& Line,
   return Standard_False;
 }
 
-
-
-
 Standard_Boolean  Approx_ComputeLine::ComputeCurve(const MultiLine& Line,
                                      const Standard_Integer firstpt,
                                      const Standard_Integer lastpt)
@@ -1208,8 +1174,6 @@ Standard_Boolean  Approx_ComputeLine::ComputeCurve(const MultiLine& Line,
   return mydone;
 }
 
-
-
 void Approx_ComputeLine::Init(const Standard_Integer degreemin,
                              const Standard_Integer degreemax,
                              const Standard_Real Tolerance3d,
@@ -1227,54 +1191,4 @@ void Approx_ComputeLine::Init(const Standard_Integer degreemin,
   mysquares = Squares;
   mycut = cutting;
   myitermax = NbIterations;
-}
-
-
-
-void Approx_ComputeLine::SetDegrees(const Standard_Integer degreemin,
-                                   const Standard_Integer degreemax)
-{
-  mydegremin = degreemin;
-  mydegremax = degreemax;
-}
-
-
-void Approx_ComputeLine::SetTolerances(const Standard_Real Tolerance3d,
-                                      const Standard_Real Tolerance2d)
-{
-  mytol3d = Tolerance3d;
-  mytol2d = Tolerance2d;
-}
-
-
-void Approx_ComputeLine::SetConstraints(const AppParCurves_Constraint FirstC,
-                                       const AppParCurves_Constraint LastC)
-{
-  myfirstC = FirstC;
-  mylastC = LastC;
-}
-
-
-
-Standard_Boolean Approx_ComputeLine::IsAllApproximated()
-const {
-  return alldone;
-}
-
-Standard_Boolean Approx_ComputeLine::IsToleranceReached()
-const {
-  return tolreached;
-}
-
-void Approx_ComputeLine::Error(const Standard_Integer Index,
-                              Standard_Real& tol3d,
-                              Standard_Real& tol2d) const
-{
-  tol3d = Tolers3d.Value(Index);
-  tol2d = Tolers2d.Value(Index);
-}
-
-void Approx_ComputeLine::Parametrization(Approx_ParametrizationType& partype) const
-{
-  partype = Par;
-}
+}
\ No newline at end of file
index 6c40c6d163d3571dcef8c2d52e7d803425547633..a4705cbd754f1a827c49b23c313d4a39734c7501 100644 (file)
 #include <Precision.hxx>
 
 const Standard_Integer LimRajout = 5;
-const Standard_Integer NbPntMaxDecoupage = 30 ;
 const Standard_Real RatioTol = 1.5 ;
 
-static Standard_Real MINABS3(Standard_Real a, Standard_Real b,Standard_Real c) { 
-  if(a<0.0) a=-a;
-  if(b<0.0) b=-b;
-  if(c<0.0) c=-c;
-  if(a>c) a=c;
-  if(a>b) a=b;
-  return(a);
-}
-
-static Standard_Real MINABS4(Standard_Real a, Standard_Real b,Standard_Real c,Standard_Real d) { 
-  if(a<0.0) a=-a;
-  if(b<0.0) b=-b;
-  if(c<0.0) c=-c;
-  if(d<0.0) d=-d;
-  if(a>c) a=c;
-  if(a>b) a=b;
-  if(a>d) a=d;
-  return(a);
-}
-
-static void  ComputeTrsf3d(const Handle(TheWLine)& theline,
-                          Standard_Real& Xo, Standard_Real& Ax,
-                          Standard_Real& Yo, Standard_Real& Ay,
-                          Standard_Real& Zo, Standard_Real& Az) {
-  Standard_Integer nbp = theline->NbPnts();
-  Standard_Real z0,z1,x0,x1,y0,y1;
-  z0=y0=x0=RealLast();
-  z1=y1=x1=RealFirst();
-  for(Standard_Integer i=1;i<=nbp;i++) { 
-    const gp_Pnt& P = theline->Point(i).Value();
-    Standard_Real  X = P.X();
-    Standard_Real  Y = P.Y();
-    Standard_Real  Z = P.Z();
-    if(X<x0) x0=X;
-    if(X>x1) x1=X;
-    if(Y<y0) y0=Y;
-    if(Y>y1) y1=Y;
-    if(Z<z0) z0=Z;
-    if(Z>z1) z1=Z;
-  }
-//-deb-  cout << "ComputeTrsf3d -- NbPnt = " << nbp << endl ;
-//-deb-  cout << "ComputeTrsf3d -- Xm = " << x0 << " Ym = " << y0 << " Zm = " << z0 << endl ;
-//-deb-  cout << "ComputeTrsf3d -- XM = " << x1 << " YM = " << y1 << " ZM = " << z1 << endl ;
-  Standard_Real dx = x1-x0;
-  Standard_Real dy = y1-y0;
-  Standard_Real dz = z1-z0;
-  Standard_Real MaxD = dx; 
-  if(MaxD < dy) MaxD=dy;
-  if(MaxD < dz) MaxD=dz;
-  Standard_Real MaxDF = 0.01*MaxD;
-
-  //-- lbr le 22 fev99 : FPE 
-  if(MaxDF<1e-12) 
-    MaxDF=1.0;
-
-
-  if(dx > MaxDF) { Ax = 1.0 / dx;    Xo = -Ax * x0;  }
-  else {     Ax = 1.0/( MaxDF) ; Xo = -Ax*x0;   }
-  if(dy > MaxDF) { Ay = 1.0 / dy;    Yo = -Ay * y0;  }
-  else {     Ay = 1.0/( MaxDF); Yo = -Ay*y0;   }
-  if(dz > MaxDF) { Az = 1.0 / dz;    Zo = -Az * z0;    }
-  else {     Az = 1.0/(MaxDF); Zo = -Az*z0;   } 
-}
-
-static void  ComputeTrsf2d(const Handle(TheWLine)& theline,
-                          Standard_Real& Uo, Standard_Real& Au,
-                          Standard_Real& Vo, Standard_Real& Av,
-                          const Standard_Boolean onFirst,
-                          const Standard_Real UVResRatio = 1.) { 
-  Standard_Integer nbp = theline->NbPnts();
-  Standard_Real u0,u1,v0,v1;
-  u0 = v0 = RealLast();
-  u1 = v1 = RealFirst();
-  // pointer to a member-function
-  void (IntSurf_PntOn2S::* pfunc)(Standard_Real&,Standard_Real&) const;
-  if (onFirst)
-    pfunc = &IntSurf_PntOn2S::ParametersOnS1;
-  else
-    pfunc = &IntSurf_PntOn2S::ParametersOnS2;
-  for(Standard_Integer i=1;i<=nbp;i++) { 
-    const IntSurf_PntOn2S&  POn2S = theline->Point(i);
-    Standard_Real  U,V;
-    (POn2S.*pfunc)(U,V);
-    if(U<u0) u0=U;
-    if(U>u1) u1=U;
-    if(V<v0) v0=V;
-    if(V>v1) v1=V;
-  }
-
-  Standard_Real du = (u1-u0);
-  Standard_Real dv = (v1-v0);
-
-  if (UVResRatio > 1.)
-    du *= UVResRatio;
-  else if (UVResRatio < 1.)
-    dv /= UVResRatio;
-
-  Standard_Real MaxUV=du;
-  if(MaxUV<dv) MaxUV=dv;
-
-  Standard_Real MaxUVF=0.01*MaxUV;
-
-  //-- lbr le 22 fev 99 (FPE) 
-  if(MaxUVF<1e-12) 
-    MaxUVF=1.0;
-
-  if(du > MaxUVF) { Au = 1.0 / du;    Uo = -Au * u0;  }
-  else {     Au = 1.0/(MaxUVF); Uo = -Au*u0;  }
-  if(dv > MaxUVF) { Av = 1.0 / dv;    Vo = -Av * v0;  }
-  else {     Av = 1.0/(MaxUVF); Vo = -Av*v0;  }
-}
-
-
-
-ApproxInt_Approx::ApproxInt_Approx():
-       myComputeLine(4,
-                    8,
-                    0.001,
-                    0.001,
-                    5,
-                    Standard_True),
-       myComputeLineBezier(4,
-                          8,
-                          0.001,
-                          0.001,
-                          5,
-                          Standard_True)
-{ 
+//=======================================================================
+//function : Default constructor
+//purpose  : 
+//=======================================================================
+ApproxInt_Approx::
+  ApproxInt_Approx(): myComputeLine(4, 8, 0.001, 0.001, 5, Standard_True),
+                      myComputeLineBezier(4, 8, 0.001, 0.001, 5, Standard_True),
+                      myApproxBez(Standard_True),
+                      myWithTangency(Standard_True),
+                      myTol3d(0.0),
+                      myTol2d(0.0),
+                      myDegMin(4),
+                      myDegMax(8),
+                      myNbPntMax(30),
+                      myNbIterMax(0),
+                      myTolReached3d(0.0),
+                      myTolReached2d(0.0)
+{
   myComputeLine.SetContinuity(2);
-  //-- myComputeLineBezier.SetContinuity(2);
-  myApproxBez = Standard_True;
-  
-  myRelativeTol = Standard_True ;
-  myNbPntMax = NbPntMaxDecoupage ;
-  myMinFactorXYZ = 0.0;
-  myMinFactorUV  = 0.0;
-  myTolReached3d = myTolReached2d = 0.;
+  //myComputeLineBezier.SetContinuity(2);
 }
-  
 
-void ApproxInt_Approx::Perform(const Handle(TheWLine)& theline,
-                              const Standard_Boolean ApproxXYZ,
-                              const Standard_Boolean ApproxU1V1,
-                              const Standard_Boolean ApproxU2V2,
-                              const Standard_Integer indicemin,
-                              const Standard_Integer indicemax) { 
-  
-  myMinFactorXYZ = 0.0;
-  myMinFactorUV  = 0.0;
-  myTolReached3d = myTolReached2d = 0.;
-  
+//=======================================================================
+//function : Perform
+//purpose  : 
+//=======================================================================
+void ApproxInt_Approx::Perform( const Handle(TheWLine)& theline,
+                                const Standard_Boolean ApproxXYZ,
+                                const Standard_Boolean ApproxU1V1,
+                                const Standard_Boolean ApproxU2V2,
+                                const Standard_Integer indicemin,
+                                const Standard_Integer indicemax)
+{
+  const Standard_Integer nbpntmax = myNbPntMax;
+  const Standard_Boolean cut=Standard_True;
+
+  myTolReached3d = myTolReached2d = 0.; 
   
   Standard_Integer nbpntbez = indicemax-indicemin;
-  Standard_Integer nbpntmax = myNbPntMax;
   Standard_Boolean OtherInter = Standard_False;
-  if(nbpntbez < LimRajout) 
+  if(nbpntbez < LimRajout)
+  {
     myApproxBez = Standard_False;
+  }
   else 
+  {
     myApproxBez = Standard_True;
-  if(myApproxBez) {
     myBezToBSpl.Reset();
-    Standard_Integer nbi = (indicemax-indicemin)/nbpntmax;
-    if(nbi>1)  { 
-      nbpntbez = (indicemax-indicemin)/nbi;
+
+    //Strange formula. It should be revised.
+    //E.g. 
+    //  nbpntbez = Min(nbpntbez, nbpntmax);
+    //appears better.
+    const Standard_Integer nbi = nbpntbez/nbpntmax;
+    if(nbi>1)
+    {
+      nbpntbez /= nbi;
     }
   }
+
   Standard_Integer imin = indicemin;
   Standard_Integer imax = imin + nbpntbez;
-  myTolReached = Standard_True;
-  
-  Standard_Real Xo,Ax,Yo,Ay,Zo,Az,U1o,A1u,V1o,A1v,U2o,A2u,V2o,A2v;
-  if(ApproxXYZ) { 
-    ComputeTrsf3d(theline,Xo,Ax,Yo,Ay,Zo,Az);
-  }
-  else { 
-    Xo=Yo=Zo=0.0; Ax=Ay=Az=1.0;;
-  }
-  if(ApproxU1V1) { 
-    ComputeTrsf2d(theline,U1o,A1u,V1o,A1v,Standard_True);
-  }
-  else { 
-    U1o=V1o=0.0; A1u=A1v=1.0;
-  }
-  if(ApproxU2V2) { 
-    ComputeTrsf2d(theline,U2o,A2u,V2o,A2v,Standard_False);
-  }
-  else { 
-    U2o=V2o=0.0; A2u=A2v=1.0;
-  }
-  
-  //-deb-  cout << "ApproxInt_Approx -- NbPntMax = " << myNbPntMax    << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- Tol3D    = " << myTol3d       << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- Tol2D    = " << myTol2d       << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- RelTol   = " << (myRelativeTol ? "RELATIVE" : "ABSOLUTE") << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- Xo = " << Xo << " Yo = " << Yo << " Zo = " << Zo << endl ;
-  //-deb-  cout << "ApproxInt_Approx -- Ax = " << Ax << " Ay = " << Ay << " Az = " << Az << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- U1o = " << U1o << " V1o = " << V1o << " A1u = " << A1u << " A1v = " << A1v << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- U2o = " << U2o << " V2o = " << V2o << " A2u = " << A2u << " A2v = " << A2v << endl ; 
-  
-  Standard_Real A3d = MINABS3(Ax,Ay,Az);
-  if((A3d < myMinFactorXYZ) || (myMinFactorXYZ == 0.0)) { 
-    myMinFactorXYZ = A3d;
-  }
-  
-  Standard_Real A2d = MINABS4(A1u,A1v,A2u,A2v);
-  if((A2d < myMinFactorUV) || (myMinFactorUV == 0.0)) { 
-    myMinFactorUV = A2d;
-  }
-  
-  Standard_Boolean cut=Standard_True;
-  Approx_ParametrizationType parametrization;
-  myComputeLineBezier.Parametrization(parametrization);
 
-  if(myRelativeTol==Standard_False) { 
-    
-    myComputeLine.Init(myDegMin,
-                      myDegMax,
-                      myTol3d*myMinFactorXYZ,
-                      myTol2d*myMinFactorUV,
-                      myNbIterMax,
-                      cut,
-                      parametrization);
-    myComputeLineBezier.Init(myDegMin,
-                            myDegMax,
-                            myTol3d*myMinFactorXYZ,
-                            myTol2d*myMinFactorUV,
-                            myNbIterMax,
-                            cut,
-                            parametrization);
-  }
+#ifdef OCCT_DEBUG
+  //cout << "++++++ ApproxInt_Approx::Perform(...) DUMP ++++++"  << endl;
+  //cout << "NbPntMax = " << myNbPntMax    << endl; 
+  //cout << "Tol3D    = " << myTol3d       << endl; 
+  //cout << "Tol2D    = " << myTol2d       << endl; 
+  //cout << "RelTol   = " << (myRelativeTol ? "RELATIVE" : "ABSOLUTE") << endl; 
+  //cout << "++++++ ApproxInt_Approx::Perform(...) DUMP ++++++"  << endl;
+#endif
   
-  do {
-    ApproxInt_TheMultiLine myMultiLine(theline,
-                                      ((ApproxXYZ)? 1 : 0),
-                                      ((ApproxU1V1)? 1: 0) + ((ApproxU2V2)? 1: 0),
-                                      Xo,Ax,Yo,Ay,Zo,Az,U1o,A1u,V1o,A1v,U2o,A2u,V2o,A2v,
-                                      ApproxU1V1,
-                                      imin,
-                                      imax);
+  const Approx_ParametrizationType parametrization = myComputeLineBezier.Parametrization();
+
+  myComputeLine.Init(myDegMin, myDegMax, myTol3d, myTol2d, myNbIterMax,
+                                                      cut, parametrization);
+  myComputeLineBezier.Init(myDegMin, myDegMax, myTol3d, myTol2d, myNbIterMax,
+                                                      cut, parametrization);
+
+  do
+  {
+    ApproxInt_TheMultiLine myMultiLine(theline, ((ApproxXYZ)? 1 : 0),
+                    ((ApproxU1V1)? 1: 0) + ((ApproxU2V2)? 1: 0), ApproxU1V1, imin, imax);
     
-    if(myApproxBez) { 
+    if(myApproxBez)
+    {
       myComputeLineBezier.Perform(myMultiLine);
       if (myComputeLineBezier.NbMultiCurves() == 0)
-       return;
-      myTolReached&=myComputeLineBezier.IsToleranceReached();
+        return;
     }
-    else { 
+    else
+    {
       myComputeLine.Perform(myMultiLine);
     }
-    UpdateTolReached();
     
-    Standard_Integer indice3d,indice2d1,indice2d2;
-    indice3d = 1; 
-    indice2d1= 2;
-    indice2d2= 3;
-    if(!ApproxXYZ)  { indice2d1--; indice2d2--; } 
-    if(!ApproxU1V1) { indice2d2--; } 
-    if(ApproxXYZ) { 
-      Standard_Real ax,bx,ay,by,az,bz;
-      ax = 1.0/Ax;   bx = -Xo*ax;
-      ay = 1.0/Ay;   by = -Yo*ay;
-      az = 1.0/Az;   bz = -Zo*az;
-      if(myApproxBez) {
-       for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-         myComputeLineBezier.ChangeValue(nbmc).Transform(indice3d,bx,ax,by,ay,bz,az);
-       }
-      }
-      else { 
-       myComputeLine.ChangeValue().Transform(indice3d,bx,ax,by,ay,bz,az);
-      }
-    }
-    if(ApproxU1V1) { 
-      Standard_Real ax,bx,ay,by;
-      ax = 1.0/A1u;   bx = -U1o*ax;
-      ay = 1.0/A1v;   by = -V1o*ay;
-      if(myApproxBez) {
-       for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-         myComputeLineBezier.ChangeValue(nbmc).Transform2d(indice2d1,bx,ax,by,ay);
-       }
-      }
-      else { 
-       myComputeLine.ChangeValue().Transform2d(indice2d1,bx,ax,by,ay);
-      }
-    }
-    if(ApproxU2V2) { 
-      Standard_Real ax,bx,ay,by;
-      ax = 1.0/A2u;   bx = -U2o*ax;
-      ay = 1.0/A2v;   by = -V2o*ay;
-      if(myApproxBez) { 
-       for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-         myComputeLineBezier.ChangeValue(nbmc).Transform2d(indice2d2,bx,ax,by,ay);
-       }
-      }
-      else { 
-       myComputeLine.ChangeValue().Transform2d(indice2d2,bx,ax,by,ay);
-      }
-    }
+    UpdateTolReached();
     
     OtherInter = Standard_False;
-    if(myApproxBez) {
-      for(Standard_Integer nbmc = 1; 
-         nbmc <= myComputeLineBezier.NbMultiCurves() ;
-         nbmc++) { 
-       myBezToBSpl.Append(myComputeLineBezier.Value(nbmc));
+    if(myApproxBez)
+    {
+      for(Standard_Integer nbmc = 1; nbmc <= myComputeLineBezier.NbMultiCurves() ; nbmc++)
+      {
+        myBezToBSpl.Append(myComputeLineBezier.Value(nbmc));
       }
-      if(imax<indicemax)
+      if(imax < indicemax)
       { 
         imin = imax;    
         imax = imin+nbpntbez;
         OtherInter = Standard_True;
-        if((indicemax-imax)<(nbpntbez/2))
+        if((indicemax-imax) < (nbpntbez/2))
         {
           imax = indicemax;
         }
+
         imax = CorrectFinishIdx(imin, imax, theline);
       }
     }
   }
   while(OtherInter);
-  if(myApproxBez) { 
+
+  if(myApproxBez)
+  { 
     myBezToBSpl.Perform();
   }
 }
 
-void ApproxInt_Approx::Perform(const ThePSurface& Surf1,
-                              const ThePSurface& Surf2,
-                              const Handle(TheWLine)& theline,
-                              const Standard_Boolean ApproxXYZ,
-                              const Standard_Boolean ApproxU1V1,
-                              const Standard_Boolean ApproxU2V2,
-                              const Standard_Integer indicemin,
-                              const Standard_Integer indicemax) {
-  myMinFactorXYZ = 0.0;
-  myMinFactorUV  = 0.0;
+//=======================================================================
+//function : Perform
+//purpose  : 
+//=======================================================================
+void ApproxInt_Approx::Perform( const ThePSurface& Surf1,
+                                const ThePSurface& Surf2,
+                                const Handle(TheWLine)& theline,
+                                const Standard_Boolean ApproxXYZ,
+                                const Standard_Boolean ApproxU1V1,
+                                const Standard_Boolean ApproxU2V2,
+                                const Standard_Integer indicemin,
+                                const Standard_Integer indicemax)
+{
   myTolReached3d = myTolReached2d = 0.;
 
-  GeomAbs_SurfaceType typeS1 = ThePSurfaceTool::GetType(Surf1);
-  GeomAbs_SurfaceType typeS2 = ThePSurfaceTool::GetType(Surf2);
-  if ((typeS1 != GeomAbs_Plane    &&
-       typeS1 != GeomAbs_Cylinder &&
-       typeS1 != GeomAbs_Sphere   &&
-       typeS1 != GeomAbs_Cone) 
-      &&
-      (typeS2 != GeomAbs_Plane    &&
-       typeS2 != GeomAbs_Cylinder &&
-       typeS2 != GeomAbs_Sphere   &&
-       typeS2 != GeomAbs_Cone)) { 
-    
-    //------------------------------------------------------------
-    //-- Construction du SvSurfaces
-    //------------------------------------------------------------
-    ApproxInt_ThePrmPrmSvSurfaces myPrmPrmSvSurfaces(Surf1,Surf2);
-    //------------------------------------------------------------
-    //-- Construction de la MultiLine
-    //------------------------------------------------------------
-    Standard_Integer nbpntbez = indicemax-indicemin;
-    Standard_Integer nbpntmax = myNbPntMax;
-    Standard_Boolean OtherInter = Standard_False;
-    
-    if(nbpntbez < LimRajout) 
-      myApproxBez = Standard_False;
-    else 
-      myApproxBez = Standard_True;
-    
-    Standard_Address ptrsvsurf = NULL;
-    Standard_Boolean cut = Standard_True;
-    if(nbpntbez < LimRajout) {   
-      cut = Standard_False;
-      //-- cout<<" ApproxInt : Nb de points = "<<nbpntbez<<" Pas de rajout "<<endl;
-    }
-    ptrsvsurf = &myPrmPrmSvSurfaces;
-    
-
-    if(myApproxBez) { 
-      myBezToBSpl.Reset();
-      Standard_Integer nbi = (indicemax-indicemin)/nbpntmax;
-      if(nbi>1)  { 
-       nbpntbez = (indicemax-indicemin)/nbi;
-      }
-    }
-    Standard_Integer imin = indicemin;
-    Standard_Integer imax = imin + nbpntbez;
-    myTolReached = Standard_True;
+  const GeomAbs_SurfaceType typeS1 = ThePSurfaceTool::GetType(Surf1);
+  const GeomAbs_SurfaceType typeS2 = ThePSurfaceTool::GetType(Surf2);
 
+  const Standard_Boolean isQuadric = ((typeS1 == GeomAbs_Plane) ||
+                                      (typeS1 == GeomAbs_Cylinder) ||
+                                      (typeS1 == GeomAbs_Sphere) ||
+                                      (typeS1 == GeomAbs_Cone) ||
+                                      (typeS2 == GeomAbs_Plane) ||
+                                      (typeS2 == GeomAbs_Cylinder) ||
+                                      (typeS2 == GeomAbs_Sphere) ||
+                                      (typeS2 == GeomAbs_Cone));
 
-    Standard_Real Xo,Ax,Yo,Ay,Zo,Az,U1o,A1u,V1o,A1v,U2o,A2u,V2o,A2v;
-    if(ApproxXYZ) { 
-      ComputeTrsf3d(theline,Xo,Ax,Yo,Ay,Zo,Az);
-    }
-    else { 
-      Xo=Yo=Zo=0.0; Ax=Ay=Az=1.0;;
-    }
-    if(ApproxU1V1) { 
-      Standard_Real UVResRatio = ThePSurfaceTool::UResolution(Surf1,1.)/
-                                 ThePSurfaceTool::VResolution(Surf1,1.);
-      ComputeTrsf2d(theline,U1o,A1u,V1o,A1v,Standard_True,UVResRatio);
-    }
-    else { 
-      U1o=V1o=0.0; A1u=A1v=1.0;
-    }      
-    if(ApproxU2V2) { 
-      Standard_Real UVResRatio = ThePSurfaceTool::UResolution(Surf2,1.)/
-                                 ThePSurfaceTool::VResolution(Surf2,1.);
-      ComputeTrsf2d(theline,U2o,A2u,V2o,A2v,Standard_False,UVResRatio);
-    }
-    else { 
-      U2o=V2o=0.0; A2u=A2v=1.0;
-    }
 
-//-deb-  cout << "ApproxInt_Approx -- NbPntMax = " << myNbPntMax    << endl ; 
-//-deb-  cout << "ApproxInt_Approx -- Tol3D    = " << myTol3d       << endl ; 
-//-deb-  cout << "ApproxInt_Approx -- Tol2D    = " << myTol2d       << endl ; 
-//-deb-  cout << "ApproxInt_Approx -- RelTol   = " << (myRelativeTol ? "RELATIVE" : "ABSOLUTE") << endl ; 
-//-deb-  cout << "ApproxInt_Approx -- Xo = " << Xo << " Yo = " << Yo << " Zo = " << Zo << endl ;
-//-deb-  cout << "ApproxInt_Approx -- Ax = " << Ax << " Ay = " << Ay << " Az = " << Az << endl ; 
-//-deb-  cout << "ApproxInt_Approx -- U1o = " << U1o << " V1o = " << V1o << " A1u = " << A1u << " A1v = " << A1v << endl ; 
-//-deb-  cout << "ApproxInt_Approx -- U2o = " << U2o << " V2o = " << V2o << " A2u = " << A2u << " A2v = " << A2v << endl ; 
-    
-    
-    Standard_Real A3d = MINABS3(Ax,Ay,Az);
-    if((A3d < myMinFactorXYZ) || (myMinFactorXYZ == 0.0)) { 
-      myMinFactorXYZ = A3d;
-    }
-    
-    Standard_Real A2d = MINABS4(A1u,A1v,A2u,A2v);
-    if((A2d < myMinFactorUV) || (myMinFactorUV == 0.0)) { 
-      myMinFactorUV = A2d;
-    }
-    
-
-    Approx_ParametrizationType parametrization;
-    myComputeLineBezier.Parametrization(parametrization);
-
-    if(myRelativeTol==Standard_False) { 
-      myComputeLine.Init(myDegMin,
-                        myDegMax,
-                        myTol3d*myMinFactorXYZ,
-                        myTol2d*myMinFactorUV,
-                        myNbIterMax,
-                        cut,
-                        parametrization);
-      myComputeLineBezier.Init(myDegMin,
-                              myDegMax,
-                              myTol3d*myMinFactorXYZ,
-                              myTol2d*myMinFactorUV,
-                              myNbIterMax,
-                              cut,
-                              parametrization);
-    }
-    else { 
-      myComputeLine.Init(myDegMin,
-                        myDegMax,
-                        myTol3d,
-                        myTol2d,
-                        myNbIterMax,
-                        cut,
-                        parametrization);
-      myComputeLineBezier.Init(myDegMin,
-                              myDegMax,
-                              myTol3d,
-                              myTol2d,
-                              myNbIterMax,
-                              cut,
-                              parametrization);
-    }     
-
-
-
-    
-    do {
-      ApproxInt_TheMultiLine myMultiLine(theline,
-                                        ptrsvsurf,
-                                        ((ApproxXYZ)? 1 : 0),
-                                        ((ApproxU1V1)? 1: 0) + ((ApproxU2V2)? 1: 0),
-                                        Xo,Ax,Yo,Ay,Zo,Az,U1o,A1u,V1o,A1v,U2o,A2u,V2o,A2v,
-                                        ApproxU1V1,
-                                        imin,
-                                        imax);
-      
-      if(myApproxBez) { 
-       myComputeLineBezier.Perform(myMultiLine);
-       if (myComputeLineBezier.NbMultiCurves() == 0)
-         return;
-       myTolReached&=myComputeLineBezier.IsToleranceReached();
-      }
-      else { 
-       myComputeLine.Perform(myMultiLine);
-      }
-      UpdateTolReached();
-      
-      Standard_Integer indice3d,indice2d1,indice2d2;
-      indice3d = 1; 
-      indice2d1= 2;
-      indice2d2= 3;
-      if(!ApproxXYZ)  { indice2d1--; indice2d2--; } 
-      if(!ApproxU1V1) { indice2d2--; } 
-      if(ApproxXYZ) { 
-       Standard_Real ax,bx,ay,by,az,bz;
-       ax = 1.0/Ax;   bx = -Xo*ax;
-       ay = 1.0/Ay;   by = -Yo*ay;
-       az = 1.0/Az;   bz = -Zo*az;
-       if(myApproxBez) { 
-         for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-           myComputeLineBezier.ChangeValue(nbmc).Transform(indice3d,bx,ax,by,ay,bz,az);
-         }
-       }
-       else { 
-         myComputeLine.ChangeValue().Transform(indice3d,bx,ax,by,ay,bz,az);
-       }
-      }
-      if(ApproxU1V1) { 
-       Standard_Real ax,bx,ay,by;
-       ax = 1.0/A1u;   bx = -U1o*ax;
-       ay = 1.0/A1v;   by = -V1o*ay;
-       if(myApproxBez) { 
-         for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-           myComputeLineBezier.ChangeValue(nbmc).Transform2d(indice2d1,bx,ax,by,ay);
-         }
-       }
-       else { 
-         myComputeLine.ChangeValue().Transform2d(indice2d1,bx,ax,by,ay);
-       }
-      }
-      if(ApproxU2V2) { 
-       Standard_Real ax,bx,ay,by;
-       ax = 1.0/A2u;   bx = -U2o*ax;
-       ay = 1.0/A2v;   by = -V2o*ay;
-       if(myApproxBez) { 
-         for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-           myComputeLineBezier.ChangeValue(nbmc).Transform2d(indice2d2,bx,ax,by,ay);
-         }
-       }
-       else { 
-         myComputeLine.ChangeValue().Transform2d(indice2d2,bx,ax,by,ay);
-       }
-      }
-      OtherInter = Standard_False;
-      if(myApproxBez) { 
-       for(Standard_Integer nbmc = 1; 
-         nbmc <= myComputeLineBezier.NbMultiCurves() ;
-         nbmc++) { 
-         myBezToBSpl.Append(myComputeLineBezier.Value(nbmc));
-       }
-        if(imax<indicemax)
-        {
-          imin = imax;
-          imax = imin+nbpntbez;
-          OtherInter = Standard_True;
-          if((indicemax-imax)<(nbpntbez/2))
-          {
-            imax = indicemax;
-          }
-          imax = CorrectFinishIdx(imin, imax, theline);
-        }
-      }
-    }
-    while(OtherInter);
-    if(myApproxBez) { 
-      myBezToBSpl.Perform();
-    }
-
-  }
-  else { 
+  if(isQuadric)
+  {
     IntSurf_Quadric Quad;
     Standard_Boolean SecondIsImplicit=Standard_False;
-    switch (typeS1) {
-      
+    switch (typeS1)
+    {
     case GeomAbs_Plane:
       Quad.SetValue(ThePSurfaceTool::Plane(Surf1));
       break;
-      
+
     case GeomAbs_Cylinder:
       Quad.SetValue(ThePSurfaceTool::Cylinder(Surf1));
       break;
-      
+
     case GeomAbs_Sphere:
       Quad.SetValue(ThePSurfaceTool::Sphere(Surf1));
       break;
-      
+
     case GeomAbs_Cone:
       Quad.SetValue(ThePSurfaceTool::Cone(Surf1));
       break;
 
     default:
       {
-       SecondIsImplicit = Standard_True;
-       switch (typeS2) {
-       case GeomAbs_Plane:
-         Quad.SetValue(ThePSurfaceTool::Plane(Surf2));
-         break;
-         
-       case GeomAbs_Cylinder:
-         Quad.SetValue(ThePSurfaceTool::Cylinder(Surf2));
-         break;
-         
-       case GeomAbs_Sphere:
-         Quad.SetValue(ThePSurfaceTool::Sphere(Surf2));
-         break;
-         
-       case GeomAbs_Cone:
-         Quad.SetValue(ThePSurfaceTool::Cone(Surf2));
-         break;
-         
-       default:
-         break;
-       }
+        SecondIsImplicit = Standard_True;
+        switch (typeS2)
+        {
+        case GeomAbs_Plane:
+          Quad.SetValue(ThePSurfaceTool::Plane(Surf2));
+          break;
+
+        case GeomAbs_Cylinder:
+          Quad.SetValue(ThePSurfaceTool::Cylinder(Surf2));
+          break;
+
+        case GeomAbs_Sphere:
+          Quad.SetValue(ThePSurfaceTool::Sphere(Surf2));
+          break;
+
+        case GeomAbs_Cone:
+          Quad.SetValue(ThePSurfaceTool::Cone(Surf2));
+          break;
+
+        default:
+          break;
+        }
       }
       break;
-    } 
-    if(SecondIsImplicit) {
+    }
+
+    if(SecondIsImplicit)
+    {
       Perform(Surf1,Quad,theline,ApproxXYZ,ApproxU1V1,ApproxU2V2,indicemin,indicemax);
     }
-    else {
+    else
+    {
       Perform(Quad,Surf2,theline,ApproxXYZ,ApproxU1V1,ApproxU2V2,indicemin,indicemax);
     }
+
+    return;
   }
-}
-//--------------------------------------------------------------------------------
-void ApproxInt_Approx::SetParameters(const Standard_Real     Tol3d,
-                                    const Standard_Real     Tol2d,
-                                    const Standard_Integer  DegMin,
-                                    const Standard_Integer  DegMax,
-                                    const Standard_Integer  NbIterMax,
-                                    const Standard_Boolean  ApproxWithTangency,
-                                    const Approx_ParametrizationType Parametrization) {
-  myWithTangency = ApproxWithTangency;
-  myTol3d        = Tol3d / RatioTol;
-  myTol2d        = Tol2d / RatioTol;
-  myDegMin       = DegMin;
-  myDegMax       = DegMax;
-  myNbIterMax    = NbIterMax;
-  myComputeLine.Init(myDegMin,
-                    myDegMax,
-                    myTol3d,
-                    myTol2d,
-                    myNbIterMax,
-                    Standard_True,
-                    Parametrization);
-
-  if(!ApproxWithTangency) { 
-    myComputeLine.SetConstraints(AppParCurves_PassPoint,AppParCurves_PassPoint);
+
+  //Here, isQuadric == FALSE
+
+  const Standard_Integer nbpntmax = myNbPntMax;
+
+  //------------------------------------------------------------
+  //-- Construction du SvSurfaces
+  //------------------------------------------------------------
+  ApproxInt_ThePrmPrmSvSurfaces myPrmPrmSvSurfaces(Surf1,Surf2);
+  //------------------------------------------------------------
+  //-- Construction de la MultiLine
+  //------------------------------------------------------------
+  Standard_Integer nbpntbez = indicemax-indicemin;
+
+  if(nbpntbez < LimRajout)
+  {
+    myApproxBez = Standard_False;
   }
-  myComputeLineBezier.Init(myDegMin,
-                          myDegMax,
-                          myTol3d,
-                          myTol2d,
-                          myNbIterMax,
-                          Standard_True,
-                          Parametrization);
-  if(!ApproxWithTangency) { 
-    myComputeLineBezier.SetConstraints(AppParCurves_PassPoint,AppParCurves_PassPoint);
+  else 
+  {
+    myApproxBez = Standard_True;
+    myBezToBSpl.Reset();
+
+    //Strange formula. It should be revised.
+    //E.g. 
+    //  nbpntbez = Min(nbpntbez, nbpntmax);
+    //appears better.
+    const Standard_Integer nbi = nbpntbez/nbpntmax;
+    if(nbi>1)
+    {
+      nbpntbez /= nbi;
+    }
   }
-  myApproxBez = Standard_True;
-}
 
-void ApproxInt_Approx::SetParameters(const Standard_Real     Tol3d,
-                                    const Standard_Real     Tol2d,
-                                    const Standard_Boolean  RelativeTol,
-                                    const Standard_Integer  DegMin,
-                                    const Standard_Integer  DegMax,
-                                    const Standard_Integer  NbIterMax,
-                                    const Standard_Integer  NbPntMax,
-                                    const Standard_Boolean  ApproxWithTangency,
-                                    const Approx_ParametrizationType Parametrization) 
-{
-  myNbPntMax = NbPntMax ;
-  myRelativeTol = RelativeTol ;
-  SetParameters (Tol3d, Tol2d, DegMin, DegMax, NbIterMax, ApproxWithTangency, Parametrization) ;
+  const Standard_Boolean cut = myApproxBez;
+  const Standard_Address ptrsvsurf = &myPrmPrmSvSurfaces;
+
+  Standard_Boolean OtherInter = Standard_False;
+  Standard_Integer imin = indicemin;
+  Standard_Integer imax = imin + nbpntbez;
+
+#ifdef OCCT_DEBUG
+//cout << "++++++ ApproxInt_Approx::Perform(...) DUMP ++++++"  << endl;
+//cout << "NbPntMax = " << myNbPntMax    << endl; 
+//cout << "Tol3D    = " << myTol3d       << endl; 
+//cout << "Tol2D    = " << myTol2d       << endl; 
+//cout << "RelTol   = " << (myRelativeTol ? "RELATIVE" : "ABSOLUTE") << endl; 
+//cout << "++++++ ApproxInt_Approx::Perform(...) DUMP ++++++"  << endl;
+#endif
+
+  const Approx_ParametrizationType parametrization = myComputeLineBezier.Parametrization();
+
+  myComputeLine.Init(myDegMin, myDegMax, myTol3d, myTol2d, myNbIterMax,
+                                                                cut, parametrization);
+  myComputeLineBezier.Init(myDegMin, myDegMax, myTol3d, myTol2d, myNbIterMax,
+                                                                cut, parametrization);
+
+  do
+  {
+    ApproxInt_TheMultiLine myMultiLine(theline, ptrsvsurf, ((ApproxXYZ)? 1 : 0),
+                  ((ApproxU1V1)? 1: 0) + ((ApproxU2V2)? 1: 0), ApproxU1V1, imin, imax);
+
+    if(myApproxBez)
+    {
+      myComputeLineBezier.Perform(myMultiLine);
+        
+      if (myComputeLineBezier.NbMultiCurves() == 0)
+        return;
+    }
+    else
+    {
+      myComputeLine.Perform(myMultiLine);
+    }
+
+    UpdateTolReached();
+      
+    OtherInter = Standard_False;
+    if(myApproxBez)
+    {
+      for(Standard_Integer nbmc = 1; nbmc <= myComputeLineBezier.NbMultiCurves() ; nbmc++)
+      {
+        myBezToBSpl.Append(myComputeLineBezier.Value(nbmc));
+      }
+
+      if(imax < indicemax)
+      {
+        imin = imax;
+        imax = imin + nbpntbez;
+        OtherInter = Standard_True;
+        if((indicemax-imax) < (nbpntbez/2))
+        {
+          imax = indicemax;
+        }
+
+        imax = CorrectFinishIdx(imin, imax, theline);
+      }
+    }
+  }
+  while(OtherInter);
+
+  if(myApproxBez)
+  { 
+    myBezToBSpl.Perform();
+  }
 }
 
-//--------------------------------------------------------------------------------
-void ApproxInt_Approx::Perform(const ThePSurface& PSurf,
-                              const TheISurface& ISurf,
-                              const Handle(TheWLine)& theline,
-                              const Standard_Boolean ApproxXYZ,
-                              const Standard_Boolean ApproxU1V1,
-                              const Standard_Boolean ApproxU2V2,
-                              const Standard_Integer indicemin,
-                              const Standard_Integer indicemax)
+//=======================================================================
+//function : Perform
+//purpose  : 
+//=======================================================================
+void ApproxInt_Approx::Perform( const ThePSurface& PSurf,
+                                const TheISurface& ISurf,
+                                const Handle(TheWLine)& theline,
+                                const Standard_Boolean ApproxXYZ,
+                                const Standard_Boolean ApproxU1V1,
+                                const Standard_Boolean ApproxU2V2,
+                                const Standard_Integer indicemin,
+                                const Standard_Integer indicemax)
 {
-  myMinFactorXYZ = 0.0;
-  myMinFactorUV  = 0.0;
+  const Standard_Integer nbpntmax = myNbPntMax;
   myTolReached3d = myTolReached2d = 0.;
   
   ApproxInt_TheImpPrmSvSurfaces myImpPrmSvSurfaces(PSurf,ISurf);
   Standard_Integer nbpntbez = indicemax-indicemin;
-  Standard_Integer nbpntmax = myNbPntMax;
   Standard_Boolean OtherInter = Standard_False;
-  if(nbpntbez < LimRajout) 
+
+  if(nbpntbez < LimRajout)
+  {
     myApproxBez = Standard_False;
+  }
   else 
+  {
     myApproxBez = Standard_True;
-  
-  Standard_Address ptrsvsurf = NULL;
-  Standard_Boolean cut = Standard_True;
-  if(nbpntbez < LimRajout) {   
-    cut = Standard_False;
-    //-- cout<<" ApproxInt : Nb de points = "<<nbpntbez<<" Pas de rajout "<<endl;
-  }
-
-
-  Approx_ParametrizationType parametrization;
-  myComputeLineBezier.Parametrization(parametrization);
-
+    myBezToBSpl.Reset();
 
-  ptrsvsurf = &myImpPrmSvSurfaces;  
-  myComputeLine.Init(myDegMin,
-                    myDegMax,
-                    myTol3d,
-                    myTol2d,
-                    myNbIterMax,
-                    cut,
-                    parametrization);
+    //Strange formula. It should be revised.
+    //E.g. 
+    //  nbpntbez = Min(nbpntbez, nbpntmax);
+    //appears better.
 
-  myComputeLineBezier.Init(myDegMin,
-                          myDegMax,
-                          myTol3d,
-                          myTol2d,
-                          myNbIterMax,
-                          cut,
-                          parametrization);
-  if(myApproxBez) { 
-    myBezToBSpl.Reset();
-    Standard_Integer nbi = (indicemax-indicemin)/nbpntmax;
-    if(nbi>1)  { 
-      nbpntbez = (indicemax-indicemin)/nbi;
+    const Standard_Integer nbi = nbpntbez/nbpntmax;
+    if(nbi>1)
+    {
+      nbpntbez /= nbi;
     }
   }
+
+  const Standard_Boolean cut = myApproxBez;
+  const Standard_Address ptrsvsurf = &myImpPrmSvSurfaces;
+  const Approx_ParametrizationType parametrization = myComputeLineBezier.Parametrization();
+  myComputeLine.Init(myDegMin, myDegMax, myTol3d, myTol2d, myNbIterMax,
+                                                        cut, parametrization);
+  myComputeLineBezier.Init(myDegMin, myDegMax, myTol3d, myTol2d, myNbIterMax,
+                                                        cut, parametrization);
+
   Standard_Integer imin = indicemin;
   Standard_Integer imax = imin + nbpntbez;
-  myTolReached = Standard_True;
-  Standard_Real Xo,Ax,Yo,Ay,Zo,Az,U1o,A1u,V1o,A1v,U2o,A2u,V2o,A2v;
-  if(ApproxXYZ) { 
-    ComputeTrsf3d(theline,Xo,Ax,Yo,Ay,Zo,Az);
-  }
-  else { 
-    Xo=Yo=Zo=0.0; Ax=Ay=Az=1.0;;
-  }
-  if(ApproxU1V1) { 
-    Standard_Real UVResRatio = ThePSurfaceTool::UResolution(PSurf,1.)/
-                               ThePSurfaceTool::VResolution(PSurf,1.);
-    ComputeTrsf2d(theline,U1o,A1u,V1o,A1v,Standard_True,UVResRatio);
-  }
-  else { 
-    U1o=V1o=0.0; A1u=A1v=1.0;
-  }
-  if(ApproxU2V2) { 
-    ComputeTrsf2d(theline,U2o,A2u,V2o,A2v,Standard_False);
-  }
-  else { 
-    U2o=V2o=0.0; A2u=A2v=1.0;
-  }
-  
-  //-deb-  cout << "ApproxInt_Approx -- NbPntMax = " << myNbPntMax    << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- Tol3D    = " << myTol3d       << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- Tol2D    = " << myTol2d       << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- RelTol   = " << (myRelativeTol ? "RELATIVE" : "ABSOLUTE") << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- Xo = " << Xo << " Yo = " << Yo << " Zo = " << Zo << endl ;
-  //-deb-  cout << "ApproxInt_Approx -- Ax = " << Ax << " Ay = " << Ay << " Az = " << Az << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- U1o = " << U1o << " V1o = " << V1o << " A1u = " << A1u << " A1v = " << A1v << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- U2o = " << U2o << " V2o = " << V2o << " A2u = " << A2u << " A2v = " << A2v << endl ; 
-  
-  
-  Standard_Real A3d = MINABS3(Ax,Ay,Az);
-  if((A3d < myMinFactorXYZ) || (myMinFactorXYZ == 0.0)) { 
-    myMinFactorXYZ = A3d;
-  }
   
-  Standard_Real A2d = MINABS4(A1u,A1v,A2u,A2v);
-  if((A2d < myMinFactorUV) || (myMinFactorUV == 0.0)) { 
-    myMinFactorUV = A2d;
-  }
-  
-  myComputeLineBezier.Parametrization(parametrization);
-
-  if(myRelativeTol==Standard_False) { 
-    myComputeLine.Init(myDegMin,
-                      myDegMax,
-                      myTol3d*myMinFactorXYZ,
-                      myTol2d*myMinFactorUV,
-                      myNbIterMax,
-                      cut,
-                      parametrization);
-    myComputeLineBezier.Init(myDegMin,
-                            myDegMax,
-                            myTol3d*myMinFactorXYZ,
-                            myTol2d*myMinFactorUV,
-                            myNbIterMax,
-                            cut,
-                            parametrization);
-  }
-  else { 
-    myComputeLine.Init(myDegMin,
-                      myDegMax,
-                      myTol3d,
-                      myTol2d,
-                      myNbIterMax,
-                      cut,
-                      parametrization);
-    myComputeLineBezier.Init(myDegMin,
-                            myDegMax,
-                            myTol3d,
-                            myTol2d,
-                            myNbIterMax,
-                            cut,
-                            parametrization);
-  }     
-  
-  
-  do {
-    
-    ApproxInt_TheMultiLine myMultiLine(theline,
-                                      ptrsvsurf,
-                                      ((ApproxXYZ)? 1 : 0),
-                                      ((ApproxU1V1)? 1: 0) + ((ApproxU2V2)? 1: 0),
-                                      Xo,Ax,Yo,Ay,Zo,Az,U1o,A1u,V1o,A1v,U2o,A2u,V2o,A2v,
-                                      ApproxU1V1,
-                                      imin,
-                                      imax);
-    if(myApproxBez) { 
+#ifdef OCCT_DEBUG
+  //cout << "++++++ ApproxInt_Approx::Perform(...) DUMP ++++++"  << endl;
+  //cout << "NbPntMax = " << myNbPntMax    << endl; 
+  //cout << "Tol3D    = " << myTol3d       << endl; 
+  //cout << "Tol2D    = " << myTol2d       << endl; 
+  //cout << "RelTol   = " << (myRelativeTol ? "RELATIVE" : "ABSOLUTE") << endl; 
+  //cout << "++++++ ApproxInt_Approx::Perform(...) DUMP ++++++"  << endl;
+#endif
+
+  do
+  {
+    ApproxInt_TheMultiLine myMultiLine(theline, ptrsvsurf, ((ApproxXYZ)? 1 : 0), ((ApproxU1V1)? 1: 0) + ((ApproxU2V2)? 1: 0), ApproxU1V1, imin, imax);
+    if(myApproxBez)
+    {
       myComputeLineBezier.Perform(myMultiLine);
       if (myComputeLineBezier.NbMultiCurves() == 0)
-       return;
-      myTolReached&=myComputeLineBezier.IsToleranceReached();
+        return;
     }
-    else { 
+    else
+    {
       myComputeLine.Perform(myMultiLine);
     }
+
     UpdateTolReached();
-    Standard_Integer indice3d,indice2d1,indice2d2;
-    indice3d = 1; 
-    indice2d1= 2;
-    indice2d2= 3;
-    if(!ApproxXYZ)  { indice2d1--; indice2d2--; } 
-    if(!ApproxU1V1) { indice2d2--; } 
-    if(ApproxXYZ) { 
-      Standard_Real ax,bx,ay,by,az,bz;
-      ax = 1.0/Ax;   bx = -Xo*ax;
-      ay = 1.0/Ay;   by = -Yo*ay;
-      az = 1.0/Az;   bz = -Zo*az;
-      if(myApproxBez) { 
-       for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-         myComputeLineBezier.ChangeValue(nbmc).Transform(indice3d,bx,ax,by,ay,bz,az);
-       }
-      }
-      else { 
-       myComputeLine.ChangeValue().Transform(indice3d,bx,ax,by,ay,bz,az);
-      }
-    }
-    if(ApproxU1V1) { 
-      Standard_Real ax,bx,ay,by;
-      ax = 1.0/A1u;   bx = -U1o*ax;
-      ay = 1.0/A1v;   by = -V1o*ay;
-      if(myApproxBez) { 
-       for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-         myComputeLineBezier.ChangeValue(nbmc).Transform2d(indice2d1,bx,ax,by,ay);
-       }
-      }
-      else { 
-       myComputeLine.ChangeValue().Transform2d(indice2d1,bx,ax,by,ay);
-      }
-    }
-    if(ApproxU2V2) { 
-      Standard_Real ax,bx,ay,by;
-      ax = 1.0/A2u;   bx = -U2o*ax;
-      ay = 1.0/A2v;   by = -V2o*ay;
-      if(myApproxBez) { 
-       for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-         myComputeLineBezier.ChangeValue(nbmc).Transform2d(indice2d2,bx,ax,by,ay);
-       }
-      }
-      else { 
-       myComputeLine.ChangeValue().Transform2d(indice2d2,bx,ax,by,ay);
-      }
-    }
+
     OtherInter = Standard_False;
-    if(myApproxBez) { 
-      for(Standard_Integer nbmc = 1; 
-         nbmc <= myComputeLineBezier.NbMultiCurves() ;
-         nbmc++) { 
-       myBezToBSpl.Append(myComputeLineBezier.Value(nbmc));
+    if(myApproxBez)
+    {
+      for(Standard_Integer nbmc = 1; nbmc <= myComputeLineBezier.NbMultiCurves(); nbmc++)
+      {
+        myBezToBSpl.Append(myComputeLineBezier.Value(nbmc));
       }
+
       if(imax<indicemax)
       {
         imin = imax;
         imax = imin+nbpntbez;
         OtherInter = Standard_True;
-        if((indicemax-imax)<(nbpntbez/2))
+        if((indicemax-imax) < (nbpntbez/2))
         {
           imax = indicemax;
         }
+
         imax = CorrectFinishIdx(imin, imax, theline);
       }
     }
   }
   while(OtherInter);
-  if(myApproxBez) { 
+
+  if(myApproxBez)
+  { 
     myBezToBSpl.Perform();
   }
 }
-//--------------------------------------------------------------------------------
-void ApproxInt_Approx::Perform(const TheISurface& ISurf,
-                              const ThePSurface& PSurf,
-                              const Handle(TheWLine)& theline,
-                              const Standard_Boolean ApproxXYZ,
-                              const Standard_Boolean ApproxU1V1,
-                              const Standard_Boolean ApproxU2V2,
-                              const Standard_Integer indicemin,
-                              const Standard_Integer indicemax)
-{
 
-  myMinFactorXYZ = 0.0;
-  myMinFactorUV  = 0.0;
+//=======================================================================
+//function : Perform
+//purpose  : 
+//=======================================================================
+void ApproxInt_Approx::Perform( const TheISurface& ISurf,
+                                const ThePSurface& PSurf,
+                                const Handle(TheWLine)& theline,
+                                const Standard_Boolean ApproxXYZ,
+                                const Standard_Boolean ApproxU1V1,
+                                const Standard_Boolean ApproxU2V2,
+                                const Standard_Integer indicemin,
+                                const Standard_Integer indicemax)
+{
+  const Standard_Integer nbpntmax = myNbPntMax;
   myTolReached3d = myTolReached2d = 0.;
   
   ApproxInt_TheImpPrmSvSurfaces myImpPrmSvSurfaces(ISurf,PSurf);
   Standard_Integer nbpntbez = indicemax-indicemin;
   
-  Standard_Boolean cut = Standard_True;
-  if(nbpntbez < LimRajout) 
+  if(nbpntbez < LimRajout)
+  {
     myApproxBez = Standard_False;
+  }
   else 
+  {
     myApproxBez = Standard_True;
-  
-  if(nbpntbez < LimRajout) {   
-    cut = Standard_False;
-    //-- cout<<" ApproxInt : Nb de points = "<<nbpntbez<<" Pas de rajout "<<endl;
-  }
-  Standard_Address ptrsvsurf = &myImpPrmSvSurfaces;
-  
-  if(nbpntbez < LimRajout) myApproxBez = Standard_False;
-  
-  Standard_Integer nbpntmax = myNbPntMax;
-  Standard_Boolean OtherInter = Standard_False;
-  if(myApproxBez) { 
     myBezToBSpl.Reset();
-    Standard_Integer nbi = (indicemax-indicemin)/nbpntmax;
-    if(nbi>1)  { 
-      nbpntbez = (indicemax-indicemin)/nbi;
+
+    //Strange formula. It should be revised.
+    //E.g. 
+    //  nbpntbez = Min(nbpntbez, nbpntmax);
+    //appears better.
+
+    const Standard_Integer nbi = nbpntbez/nbpntmax;
+    if(nbi>1)
+    {
+      nbpntbez /= nbi;
     }
   }
+
+  const Standard_Boolean cut = myApproxBez;
+  const Standard_Address ptrsvsurf = &myImpPrmSvSurfaces;
+  
+  Standard_Boolean OtherInter = Standard_False;
   Standard_Integer imin = indicemin;
   Standard_Integer imax = imin + nbpntbez;
-  myTolReached = Standard_True;
   
-  Standard_Real Xo,Ax,Yo,Ay,Zo,Az,U1o,A1u,V1o,A1v,U2o,A2u,V2o,A2v;
-  if(ApproxXYZ) { 
-    ComputeTrsf3d(theline,Xo,Ax,Yo,Ay,Zo,Az);
-  }
-  else { 
-    Xo=Yo=Zo=0.0; Ax=Ay=Az=1.0;;
-  }
-  if(ApproxU1V1) { 
-    ComputeTrsf2d(theline,U1o,A1u,V1o,A1v,Standard_True);
-  }
-  else { 
-    U1o=V1o=0.0; A1u=A1v=1.0;
-  }
-  if(ApproxU2V2) { 
-    Standard_Real UVResRatio = ThePSurfaceTool::UResolution(PSurf,1.)/
-                               ThePSurfaceTool::VResolution(PSurf,1.);
-    ComputeTrsf2d(theline,U2o,A2u,V2o,A2v,Standard_False,UVResRatio);
-  }
-  else { 
-    U2o=V2o=0.0; A2u=A2v=1.0;
-  }
-  
-  //-deb-  cout << "ApproxInt_Approx -- NbPntMax = " << myNbPntMax    << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- Tol3D    = " << myTol3d       << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- Tol2D    = " << myTol2d       << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- RelTol   = " << (myRelativeTol ? "RELATIVE" : "ABSOLUTE") << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- Xo = " << Xo << " Yo = " << Yo << " Zo = " << Zo << endl ;
-  //-deb-  cout << "ApproxInt_Approx -- Ax = " << Ax << " Ay = " << Ay << " Az = " << Az << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- U1o = " << U1o << " V1o = " << V1o << " A1u = " << A1u << " A1v = " << A1v << endl ; 
-  //-deb-  cout << "ApproxInt_Approx -- U2o = " << U2o << " V2o = " << V2o << " A2u = " << A2u << " A2v = " << A2v << endl ; 
-  
-  
-  Standard_Real A3d = MINABS3(Ax,Ay,Az);
-  if((A3d < myMinFactorXYZ) || (myMinFactorXYZ == 0.0)) { 
-    myMinFactorXYZ = A3d;
-  }
+#ifdef OCCT_DEBUG
+  //cout << "++++++ ApproxInt_Approx::Perform(...) DUMP ++++++"  << endl;
+  //cout << "NbPntMax = " << myNbPntMax    << endl; 
+  //cout << "Tol3D    = " << myTol3d       << endl; 
+  //cout << "Tol2D    = " << myTol2d       << endl; 
+  //cout << "RelTol   = " << (myRelativeTol ? "RELATIVE" : "ABSOLUTE") << endl; 
+  //cout << "++++++ ApproxInt_Approx::Perform(...) DUMP ++++++"  << endl;
+#endif
   
-  Standard_Real A2d = MINABS4(A1u,A1v,A2u,A2v);
-  if((A2d < myMinFactorUV) || (myMinFactorUV == 0.0)) { 
-    myMinFactorUV = A2d;
-  }
+  const Approx_ParametrizationType parametrization = myComputeLineBezier.Parametrization();
+  myComputeLine.Init(myDegMin, myDegMax, myTol3d, myTol2d, myNbIterMax,
+                                                            cut, parametrization);
+  myComputeLineBezier.Init(myDegMin, myDegMax, myTol3d, myTol2d, myNbIterMax,
+                                                            cut, parametrization);
 
-  Approx_ParametrizationType parametrization;
-  myComputeLineBezier.Parametrization(parametrization);
-  
-  
-  if(myRelativeTol==Standard_False) { 
-    myComputeLine.Init(myDegMin,
-                      myDegMax,
-                      myTol3d*myMinFactorXYZ,
-                      myTol2d*myMinFactorUV,
-                      myNbIterMax,
-                      cut,
-                      parametrization);
-    myComputeLineBezier.Init(myDegMin,
-                            myDegMax,
-                            myTol3d*myMinFactorXYZ,
-                            myTol2d*myMinFactorUV,
-                            myNbIterMax,
-                            cut,
-                            parametrization);
-  }
-  else { 
-    myComputeLine.Init(myDegMin,
-                      myDegMax,
-                      myTol3d,
-                      myTol2d,
-                      myNbIterMax,
-                      cut,
-                      parametrization);
-    myComputeLineBezier.Init(myDegMin,
-                            myDegMax,
-                            myTol3d,
-                            myTol2d,
-                            myNbIterMax,
-                            cut,
-                            parametrization);
-  }     
-  
-  
-  
-  do {
-    
-    ApproxInt_TheMultiLine myMultiLine(theline,
-                                      ptrsvsurf,
-                                      ((ApproxXYZ)? 1 : 0),
-                                      ((ApproxU1V1)? 1: 0) + ((ApproxU2V2)? 1: 0),
-                                      Xo,Ax,Yo,Ay,Zo,Az,U1o,A1u,V1o,A1v,U2o,A2u,V2o,A2v,
-                                      ApproxU1V1,
-                                      imin,
-                                      imax);
-    if(myApproxBez) { 
+  do
+  {
+    ApproxInt_TheMultiLine myMultiLine(theline, ptrsvsurf, ((ApproxXYZ)? 1 : 0),
+                  ((ApproxU1V1)? 1: 0) + ((ApproxU2V2)? 1: 0), ApproxU1V1, imin, imax);
+    if(myApproxBez)
+    {
       myComputeLineBezier.Perform(myMultiLine);
 
 #ifdef OCCT_DEBUG
@@ -1071,172 +528,183 @@ void ApproxInt_Approx::Perform(const TheISurface& ISurf,
 #endif
 
       if (myComputeLineBezier.NbMultiCurves() == 0)
-       return;
-      myTolReached&=myComputeLineBezier.IsToleranceReached();
+        return;
     }
-    else { 
+    else
+    {
       myComputeLine.Perform(myMultiLine);
     }
+
     UpdateTolReached();
     
-    Standard_Integer indice3d,indice2d1,indice2d2;
-    indice3d = 1; 
-    indice2d1= 2;
-    indice2d2= 3;
-    if(!ApproxXYZ)  { indice2d1--; indice2d2--; } 
-    if(!ApproxU1V1) { indice2d2--; } 
-    if(ApproxXYZ) { 
-      Standard_Real ax,bx,ay,by,az,bz;
-      ax = 1.0/Ax;   bx = -Xo*ax;
-      ay = 1.0/Ay;   by = -Yo*ay;
-      az = 1.0/Az;   bz = -Zo*az;
-      if(myApproxBez) { 
-       for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-         myComputeLineBezier.ChangeValue(nbmc).Transform(indice3d,bx,ax,by,ay,bz,az);
-       }
-      }
-      else { 
-       myComputeLine.ChangeValue().Transform(indice3d,bx,ax,by,ay,bz,az);
-      }
-    }
-    if(ApproxU1V1) { 
-      Standard_Real ax,bx,ay,by;
-      ax = 1.0/A1u;   bx = -U1o*ax;
-      ay = 1.0/A1v;   by = -V1o*ay;
-      if(myApproxBez) { 
-       for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-         myComputeLineBezier.ChangeValue(nbmc).Transform2d(indice2d1,bx,ax,by,ay);
-       }
-      }
-      else { 
-       myComputeLine.ChangeValue().Transform2d(indice2d1,bx,ax,by,ay);
-      }
-    }
-    if(ApproxU2V2) { 
-      Standard_Real ax,bx,ay,by;
-      ax = 1.0/A2u;   bx = -U2o*ax;
-      ay = 1.0/A2v;   by = -V2o*ay;
-      if(myApproxBez) { 
-       for(Standard_Integer nbmc = myComputeLineBezier.NbMultiCurves() ; nbmc>=1; nbmc--) { 
-         myComputeLineBezier.ChangeValue(nbmc).Transform2d(indice2d2,bx,ax,by,ay);
-       }
-      }
-      else { 
-       myComputeLine.ChangeValue().Transform2d(indice2d2,bx,ax,by,ay);
-      }
-    }
     OtherInter = Standard_False;
     if(myApproxBez)
     {
-      for(Standard_Integer nbmc = 1;
-        nbmc <= myComputeLineBezier.NbMultiCurves() ;
-        nbmc++)
-      { 
-          myBezToBSpl.Append(myComputeLineBezier.Value(nbmc));
+      for(Standard_Integer nbmc = 1; nbmc <= myComputeLineBezier.NbMultiCurves(); nbmc++)
+      {
+        myBezToBSpl.Append(myComputeLineBezier.Value(nbmc));
       }
+
       if(imax<indicemax)
       {
         imin = imax;
-        imax = imin+nbpntbez;
+        imax = imin + nbpntbez;
         OtherInter = Standard_True;
-        if((indicemax-imax)<(nbpntbez/2))
+
+        if((indicemax-imax) < (nbpntbez/2))
         {
           imax = indicemax;
         }
+
         imax = CorrectFinishIdx(imin, imax, theline);
       }
     }
   }
-  while(OtherInter); 
-  if(myApproxBez) { 
+  while(OtherInter);
+
+  if(myApproxBez)
+  {
     myBezToBSpl.Perform();
   }
 }
-//--------------------------------------------------------------------------------
-Standard_Integer ApproxInt_Approx::NbMultiCurves() const { 
+
+//=======================================================================
+//function : SetParameters
+//purpose  : 
+//=======================================================================
+void ApproxInt_Approx::SetParameters( const Standard_Real Tol3d,
+                                      const Standard_Real Tol2d,
+                                      const Standard_Integer DegMin,
+                                      const Standard_Integer DegMax,
+                                      const Standard_Integer NbIterMax,
+                                      const Standard_Integer NbPntMax,
+                                      const Standard_Boolean ApproxWithTangency,
+                                      const Approx_ParametrizationType Parametrization)
+{
+  myNbPntMax = NbPntMax;
+  myWithTangency = ApproxWithTangency;
+  myTol3d        = Tol3d / RatioTol;
+  myTol2d        = Tol2d / RatioTol;
+  myDegMin       = DegMin;
+  myDegMax       = DegMax;
+  myNbIterMax    = NbIterMax;
+  myComputeLine.Init(myDegMin, myDegMax, myTol3d, myTol2d, myNbIterMax, Standard_True, Parametrization);
+
+  if(!ApproxWithTangency)
+  { 
+    myComputeLine.SetConstraints(AppParCurves_PassPoint,AppParCurves_PassPoint);
+  }
+  
+  myComputeLineBezier.Init(myDegMin, myDegMax, myTol3d, myTol2d, myNbIterMax, Standard_True, Parametrization);
+  if(!ApproxWithTangency)
+  { 
+    myComputeLineBezier.SetConstraints(AppParCurves_PassPoint,AppParCurves_PassPoint);
+  }
+
+  myApproxBez = Standard_True;
+}
+
+//=======================================================================
+//function : NbMultiCurves
+//purpose  : 
+//=======================================================================
+Standard_Integer ApproxInt_Approx::NbMultiCurves() const
+{
   //  return(myComputeLine.NbMultiCurves());
   return 1;
 }
-//--------------------------------------------------------------------------------
-void ApproxInt_Approx::UpdateTolReached() {
 
-  if (myApproxBez) {
-    Standard_Integer ICur ;
-    Standard_Integer NbCurves = myComputeLineBezier.NbMultiCurves() ;
-    for (ICur = 1 ; ICur <= NbCurves ; ICur++) {
+//=======================================================================
+//function : UpdateTolReached
+//purpose  : 
+//=======================================================================
+void ApproxInt_Approx::UpdateTolReached()
+{
+  if (myApproxBez)
+  {
+    const Standard_Integer NbCurves = myComputeLineBezier.NbMultiCurves() ;
+    for (Standard_Integer ICur = 1 ; ICur <= NbCurves ; ICur++)
+    {
       Standard_Real Tol3D, Tol2D ;
       myComputeLineBezier.Error (ICur, Tol3D, Tol2D) ;
       myTolReached3d = Max(myTolReached3d, Tol3D);
       myTolReached2d = Max(myTolReached2d, Tol2D);
     }
-  } else {
+  }
+  else
+  {
     myComputeLine.Error (myTolReached3d, myTolReached2d);
   }
 }
-//--------------------------------------------------------------------------------
-Standard_Real ApproxInt_Approx::TolReached3d() const { 
-
-  Standard_Real TheTol3D = RatioTol * myTolReached3d ;
-  //modified by NIZNHY-PKV Mon Aug 27 14:21:33 2007f
-  //if (myMinFactorXYZ)
-  //TheTol3D = TheTol3D / myMinFactorXYZ ;
-  if (myMinFactorXYZ>1.5e-7) {
-    TheTol3D = TheTol3D / myMinFactorXYZ ;
-  }
-  //modified by NIZNHY-PKV Mon Aug 27 14:21:50 2007t
-  return TheTol3D ;
+
+//=======================================================================
+//function : TolReached3d
+//purpose  : 
+//=======================================================================
+Standard_Real ApproxInt_Approx::TolReached3d() const
+{ 
+  return RatioTol * myTolReached3d;
 }
-//--------------------------------------------------------------------------------
-Standard_Real ApproxInt_Approx::TolReached2d() const {
-
-  Standard_Real TheTol2D = RatioTol * myTolReached2d ;
-  //modified by NIZNHY-PKV Mon Aug 27 14:20:50 2007f
-  //if (myMinFactorUV)
-  //TheTol2D = TheTol2D / myMinFactorUV ;
-  if (myMinFactorUV>1.5e-7) {
-    TheTol2D = TheTol2D / myMinFactorUV ;
-  }
-  //modified by NIZNHY-PKV Mon Aug 27 14:20:55 2007t
-  return TheTol2D ;
+
+//=======================================================================
+//function : TolReached2d
+//purpose  : 
+//=======================================================================
+Standard_Real ApproxInt_Approx::TolReached2d() const
+{
+  return RatioTol * myTolReached2d;
 }
-//--------------------------------------------------------------------------------
-Standard_Boolean ApproxInt_Approx::IsDone() const { 
-  if(myApproxBez) { 
+
+//=======================================================================
+//function : IsDone
+//purpose  : 
+//=======================================================================
+Standard_Boolean ApproxInt_Approx::IsDone() const
+{ 
+  if(myApproxBez)
+  { 
     return(myComputeLineBezier.NbMultiCurves() > 0);
-                           //-- Lorsque la tolerance n est pas atteinte et qu il 
-                           //-- faudrait rajouter des points sur la ligne
-                           //-- les approx sortent avec la meilleure tolerance
-                           //-- atteinte.  ( Pas de rajout de points ds cette version)
-    //-- return(myTolReached);
   }
-  else { 
+  else
+  {
     return(myComputeLine.IsToleranceReached());
   }
 }
-//--------------------------------------------------------------------------------
-const AppParCurves_MultiBSpCurve& ApproxInt_Approx::Value(const Standard_Integer ) const { 
-  if(myApproxBez) { 
+
+//=======================================================================
+//function : Value
+//purpose  : 
+//=======================================================================
+const AppParCurves_MultiBSpCurve& ApproxInt_Approx::Value(const Standard_Integer ) const
+{ 
+  if(myApproxBez)
+  { 
     return(myBezToBSpl.Value());
   }
-  else { 
+  else
+  { 
     return(myComputeLine.Value());
   }
 }
-//--------------------------------------------------------------------------------
+
+//=======================================================================
+//function : CorrectFinishIdx
+//purpose  : 
+//=======================================================================
 Standard_Integer ApproxInt_Approx::CorrectFinishIdx(const Standard_Integer theMinIdx,
                                                     const Standard_Integer theMaxIdx,
                                                     const Handle(TheWLine)& theline)
 {
   const Standard_Real aNullCoeff = 1.0e-16;
-  Standard_Real aLimitMaxCoeff = 1.0 / 2500.0;
+  const Standard_Real aLimitMaxCoeff = 1.0 / 2500.0;
   Standard_Real aDist = theline->Point(theMinIdx).Value().SquareDistance(
                         theline->Point(theMinIdx + 1).Value());
 
   for(Standard_Integer anIdx = theMinIdx + 1; anIdx < theMaxIdx - 1; anIdx++)
   {
-    Standard_Real aNextDist = theline->Point(anIdx).Value().SquareDistance(
-                              theline->Point(anIdx + 1).Value());
-    Standard_Real aCoeff = Min (aNextDist, aDist) / Max (aNextDist, aDist);
+    const Standard_Real aNextDist = theline->Point(anIdx).Value().
+                                      SquareDistance(theline->Point(anIdx + 1).Value());
+    const Standard_Real aCoeff = Min (aNextDist, aDist) / Max (aNextDist, aDist);
 
     //
     if (aCoeff < aLimitMaxCoeff &&        // Base criteria.
index c6ee0836577e236600de660cc83c0fdeebd77c58..d1266119d605f782353fa7438dd2c6c50536d59b 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#define DEBUG 0
-
-
 #include <TColStd_Array1OfReal.hxx>
-#include <IntSurf_LineOn2S.hxx>
 #include <gp_Pnt2d.hxx>
 #include <gp_Pnt.hxx>
 #include <gp_Vec2d.hxx>
 #include <gp_Vec.hxx>
 
-ApproxInt_MultiLine::ApproxInt_MultiLine(const Handle_TheLine&    line,
-                                        const Standard_Address   svsurf,
-                                        const Standard_Integer   NbP3d,
-                                        const Standard_Integer   NbP2d,
-                                        const Standard_Real      xo,
-                                        const Standard_Real      ax,
-                                        const Standard_Real      yo,
-                                        const Standard_Real      ay,
-                                        const Standard_Real      zo,
-                                        const Standard_Real      az,
-                                        const Standard_Real      u1o,
-                                        const Standard_Real      a1u,
-                                        const Standard_Real      v1o,
-                                        const Standard_Real      a1v,
-                                        const Standard_Real      u2o,
-                                        const Standard_Real      a2u,
-                                        const Standard_Real      v2o,
-                                        const Standard_Real      a2v,
-                                        const Standard_Boolean   P2DOnFirst,
-                                        const Standard_Integer   IndMin,
-                                        const Standard_Integer   IndMax):
-
-       PtrOnmySvSurfaces(svsurf),
-       myLine(line), 
-       indicemin(IndMin),
-       indicemax(IndMax),
-       nbp3d(NbP3d),
-       nbp2d(NbP2d),
-       p2donfirst(P2DOnFirst),
-       Xo(xo),Ax(ax),Yo(yo),Ay(ay),Zo(zo),Az(az),
-       U1o(u1o),A1u(a1u),V1o(v1o),A1v(a1v),
-       U2o(u2o),A2u(a2u),V2o(v2o),A2v(a2v)
+//=======================================================================
+//function : Constructor
+//purpose  : 
+//=======================================================================
+ApproxInt_MultiLine::
+  ApproxInt_MultiLine(const Handle_TheLine& line,
+                      const Standard_Address svsurf,
+                      const Standard_Integer NbP3d,
+                      const Standard_Integer NbP2d,
+                      const Standard_Boolean P2DOnFirst,
+                      const Standard_Integer IndMin,
+                      const Standard_Integer IndMax):PtrOnmySvSurfaces(svsurf), 
+                                                      myLine(line),
+                                                      indicemin(Min(IndMin, IndMax)),
+                                                      indicemax(Max(IndMin, IndMax)),
+                                                      nbp3d(NbP3d),
+                                                      nbp2d(NbP2d),
+                                                      p2donfirst(P2DOnFirst)
 {
-#if DEBUG 
-  if(indicemin>=indicemax) {
-    cout<<"\n********************************************";
-    cout<<"\n*****       ApproxInt_MultiLine     ********";
-    cout<<"\n***** indicemin = indicemax = "<<indicemin;
-    cout<<"\n********************************************"<<endl;
-
-  }
+#if OCCT_DEBUG 
+  //if(indicemin == indicemax)
+  //{
+  //  cout<<"ApproxInt_MultiLine: indicemin = indicemax = " << indicemin << endl;
+  //}
 #endif
 }
-//--------------------------------------------------------------------------------
-ApproxInt_MultiLine::ApproxInt_MultiLine(const Handle_TheLine&    line,
-                                        const Standard_Integer   NbP3d,
-                                        const Standard_Integer   NbP2d,
-                                        const Standard_Real      xo,
-                                        const Standard_Real      ax,
-                                        const Standard_Real      yo,
-                                        const Standard_Real      ay,
-                                        const Standard_Real      zo,
-                                        const Standard_Real      az,
-                                        const Standard_Real      u1o,
-                                        const Standard_Real      a1u,
-                                        const Standard_Real      v1o,
-                                        const Standard_Real      a1v,
-                                        const Standard_Real      u2o,
-                                        const Standard_Real      a2u,
-                                        const Standard_Real      v2o,
-                                        const Standard_Real      a2v,
-                                        const Standard_Boolean   P2DOnFirst,
-                                        const Standard_Integer   IndMin,
-                                        const Standard_Integer   IndMax):
 
-       PtrOnmySvSurfaces(0),
-       myLine(line), 
-       indicemin(IndMin),
-       indicemax(IndMax),
-       nbp3d(NbP3d),
-       nbp2d(NbP2d),
-       p2donfirst(P2DOnFirst),
-       Xo(xo),Ax(ax),Yo(yo),Ay(ay),Zo(zo),Az(az),
-       U1o(u1o),A1u(a1u),V1o(v1o),A1v(a1v),
-       U2o(u2o),A2u(a2u),V2o(v2o),A2v(a2v)
+//=======================================================================
+//function : Constructor
+//purpose  : 
+//=======================================================================
+ApproxInt_MultiLine::
+  ApproxInt_MultiLine(const Handle_TheLine& line,
+                      const Standard_Integer NbP3d,
+                      const Standard_Integer NbP2d,
+                      const Standard_Boolean P2DOnFirst,
+                      const Standard_Integer IndMin,
+                      const Standard_Integer IndMax):PtrOnmySvSurfaces(0),
+                                                      myLine(line),
+                                                      indicemin(Min(IndMin, IndMax)),
+                                                      indicemax(Max(IndMin, IndMax)),
+                                                      nbp3d(NbP3d),
+                                                      nbp2d(NbP2d),
+                                                      p2donfirst(P2DOnFirst)
 {
-  if(indicemin>=indicemax) {
-#if DEBUG
-    cout<<"\n********************************************";
-    cout<<"\n*****       ApproxInt_MultiLine     ********";
-    cout<<"\n***** indicemin = indicemax = "<<indicemin;
-    cout<<"\n********************************************"<<endl;
+#if OCCT_DEBUG
+  //if(indicemin == indicemax)
+  //{
+  //  cout<<"ApproxInt_MultiLine: indicemin = indicemax = " << indicemin << endl;
+  //}
 #endif
-  }
-}
-//--------------------------------------------------------------------------------
-Standard_Integer ApproxInt_MultiLine::FirstPoint() const { 
-  return(indicemin);
-}
-//--------------------------------------------------------------------------------
-Standard_Integer ApproxInt_MultiLine::LastPoint() const { 
-  return(indicemax);
-}
-//--------------------------------------------------------------------------------
-Approx_Status ApproxInt_MultiLine::WhatStatus() const { 
-  if(PtrOnmySvSurfaces)
-    return(Approx_PointsAdded);
-  else 
-    return(Approx_NoPointsAdded);
-}
-//--------------------------------------------------------------------------------
-Standard_Integer ApproxInt_MultiLine::NbP3d() const { 
-  return(nbp3d);
-}
-//--------------------------------------------------------------------------------
-Standard_Integer ApproxInt_MultiLine::NbP2d() const { 
-  return(nbp2d);
 }
-//================================================================================
-void ApproxInt_MultiLine::Value(const Standard_Integer  Index,
-                               TColgp_Array1OfPnt&     TabPnt)  const 
-{ 
-  IntSurf_PntOn2S POn2S(myLine->Point(Index));
-  Standard_Real X = POn2S.Value().X();
-  Standard_Real Y = POn2S.Value().Y();
-  Standard_Real Z = POn2S.Value().Z();
-  TabPnt(1) = gp_Pnt(X*Ax + Xo, Y*Ay + Yo, Z*Az + Zo);
-}
-//--------------------------------------------------------------------------------
-void ApproxInt_MultiLine::Value( const Standard_Integer Index
-                               ,TColgp_Array1OfPnt2d&  TabPnt2d) const 
+
+//=======================================================================
+//function : Value
+//purpose  : 
+//=======================================================================
+void ApproxInt_MultiLine::Value(const Standard_Integer MPointIndex,
+                                TColgp_Array1OfPnt2d&  TabPnt2d) const 
 {
-  IntSurf_PntOn2S POn2S(myLine->Point(Index));
-  Standard_Real u1,u2,v1,v2;
-  POn2S.Parameters(u1,v1,u2,v2);
-  if(nbp2d==1) { 
-    if(p2donfirst) { 
-      TabPnt2d(1) = gp_Pnt2d(u1 * A1u + U1o , v1 * A1v + V1o);
+  const IntSurf_PntOn2S& POn2S = myLine->Point(MPointIndex);
+  Standard_Real u1 = 0.0, u2 = 0.0, v1 = 0.0, v2 = 0.0;
+  POn2S.Parameters(u1, v1, u2, v2);
+  if(nbp2d==1)
+  { 
+    if(p2donfirst)
+    { 
+      TabPnt2d(1) = gp_Pnt2d(u1, v1);
     }
-    else { 
-      TabPnt2d(1) = gp_Pnt2d(u2 * A2u + U2o , v2 * A2v + V2o);
+    else
+    {
+      TabPnt2d(1) = gp_Pnt2d(u2, v2);
     }
   }
-  else { 
-    TabPnt2d(1) = gp_Pnt2d(u1 * A1u + U1o , v1 * A1v + V1o);
-    if(TabPnt2d.Length()>=2) { 
-      TabPnt2d(2) = gp_Pnt2d(u2 * A2u + U2o , v2 * A2v + V2o);
+  else
+  {
+    TabPnt2d(1) = gp_Pnt2d(u1, v1);
+    if(TabPnt2d.Length() >= 2)
+    { 
+      TabPnt2d(2) = gp_Pnt2d(u2, v2);
     } 
   }
 }
-//--------------------------------------------------------------------------------
-void ApproxInt_MultiLine::Value( const Standard_Integer Index
-                               ,TColgp_Array1OfPnt&    TabPnt
-                               ,TColgp_Array1OfPnt2d&  TabPnt2d)  const 
-{ 
-  IntSurf_PntOn2S POn2S(myLine->Point(Index));
-  Standard_Real u1,u2,v1,v2;
-  POn2S.Parameters(u1,v1,u2,v2);
-  if(nbp2d==1) { 
-    if(p2donfirst) { 
-      TabPnt2d(1) = gp_Pnt2d(u1 * A1u + U1o , v1 * A1v + V1o);
-    }
-    else { 
-      TabPnt2d(1) = gp_Pnt2d(u2 * A2u + U2o , v2 * A2v + V2o); 
-    }
-  }
-  else { 
-    TabPnt2d(1) = gp_Pnt2d(u1 * A1u + U1o , v1 * A1v + V1o);
-    if(TabPnt2d.Length()>=2) { 
-      TabPnt2d(2) = gp_Pnt2d(u2 * A2u + U2o , v2 * A2v + V2o);
-    }
-  }
-  Standard_Real X = POn2S.Value().X();
-  Standard_Real Y = POn2S.Value().Y();
-  Standard_Real Z = POn2S.Value().Z();
-  TabPnt(1) = gp_Pnt(X * Ax + Xo, Y * Ay + Yo, Z * Az + Zo);
-}
-//--------------------------------------------------------------------------------
-//--------------------------------------------------------------------------------
-Standard_Boolean ApproxInt_MultiLine::Tangency( const Standard_Integer Index
-                                              ,TColgp_Array1OfVec&    TabVec) const 
-{ 
+
+//=======================================================================
+//function : Tangency
+//purpose  : 
+//=======================================================================
+Standard_Boolean ApproxInt_MultiLine::Tangency( const Standard_Integer Index,
+                                                TColgp_Array1OfVec&    TabVec) const 
+{
   if(PtrOnmySvSurfaces==NULL) 
-    return(Standard_False);
+    return Standard_False;
 
-  IntSurf_PntOn2S POn2S(myLine->Point(Index));
-  Standard_Real u1,u2,v1,v2;
-  gp_Vec Tg;
+  const IntSurf_PntOn2S& POn2S = myLine->Point(Index);
+  Standard_Real u1 = 0.0, u2 = 0.0, v1 = 0.0, v2 = 0.0;
   POn2S.Parameters(u1,v1,u2,v2);
-  Standard_Boolean ret=((TheSvSurfaces *)PtrOnmySvSurfaces)->Tangency( u1,v1,u2,v2,Tg);
-  if(ret) { 
-    Standard_Real X = Tg.X();
-    Standard_Real Y = Tg.Y();
-    Standard_Real Z = Tg.Z();
-    TabVec(1) = gp_Vec(X * Ax, Y * Ay, Z * Az);
+
+  Standard_Boolean ret=
+            ((TheSvSurfaces *)PtrOnmySvSurfaces)->Tangency(u1, v1, u2, v2, TabVec(1));
+  if(!ret)
+  {
+    TabVec(1) = gp_Vec(0.0, 0.0, 0.0);
   }
-  else 
-    TabVec(1) = gp_Vec(0.0,0.0,0.0);
-  return(ret);
+
+  return ret;
 }
-//--------------------------------------------------------------------------------
-Standard_Boolean ApproxInt_MultiLine::Tangency( const Standard_Integer Index
-                                              ,TColgp_Array1OfVec2d&  TabVec2d) const 
-{ 
+
+//=======================================================================
+//function : Tangency
+//purpose  : 
+//=======================================================================
+Standard_Boolean ApproxInt_MultiLine::Tangency( const Standard_Integer Index,
+                                                TColgp_Array1OfVec2d&  TabVec2d) const 
+{
   if(PtrOnmySvSurfaces==NULL) 
-    return(Standard_False);
+    return Standard_False;
 
-  IntSurf_PntOn2S POn2S(myLine->Point(Index));
-  Standard_Real u1,u2,v1,v2,U,V;
-  gp_Vec2d Tg2d;
-  Standard_Boolean ret;
+  const IntSurf_PntOn2S& POn2S = myLine->Point(Index);
+  Standard_Real u1 = 0.0, u2 = 0.0, v1 = 0.0, v2 = 0.0;
   POn2S.Parameters(u1,v1,u2,v2);
-  if(nbp2d==1) { 
-    Standard_Real Au = A1u;
-    Standard_Real Av = A1v;
-    if(p2donfirst) { 
-      ret=((TheSvSurfaces *)PtrOnmySvSurfaces)->TangencyOnSurf1( u1,v1,u2,v2,Tg2d);
-    }
-    else { 
-      ret=((TheSvSurfaces *)PtrOnmySvSurfaces)->TangencyOnSurf2( u1,v1,u2,v2,Tg2d);
-      Au = A2u;
-      Av = A2v;
+
+  Standard_Boolean ret = Standard_False;
+  if(nbp2d==1)
+  { 
+    if(p2donfirst)
+    {
+      ret=((TheSvSurfaces *)PtrOnmySvSurfaces)->TangencyOnSurf1(u1, v1, u2, v2, TabVec2d(1));
     }
-    if(ret) { 
-      U = Tg2d.X();
-      V = Tg2d.Y();
-      TabVec2d(1) = gp_Vec2d(U * Au, V * Av);
+    else
+    { 
+      ret=((TheSvSurfaces *)PtrOnmySvSurfaces)->TangencyOnSurf2(u1, v1, u2, v2, TabVec2d(1));
     }
-    else {
-     TabVec2d(1) = gp_Vec2d(0.0,0.0);
-   }
   }
-  else { 
-    ret=((TheSvSurfaces *)PtrOnmySvSurfaces)->TangencyOnSurf1( u1,v1,u2,v2,Tg2d);
-    if(ret) { 
-      U = Tg2d.X();
-      V = Tg2d.Y();
-      TabVec2d(1) = gp_Vec2d(U * A1u, V * A1v);
-    
-      if(TabVec2d.Length()>=2) { 
-       ret&=((TheSvSurfaces *)PtrOnmySvSurfaces)->TangencyOnSurf2( u1,v1,u2,v2,Tg2d);
-       U = Tg2d.X();
-       V = Tg2d.Y();
-       TabVec2d(2) = gp_Vec2d(U * A2u, V * A2v);
-      }
-      else { 
-       TabVec2d(1) = gp_Vec2d(0.0,0.0);
-       if(TabVec2d.Length()>=2) { 
-         TabVec2d(2) = gp_Vec2d(0.0,0.0);
-       }
+  else
+  {
+    ret=((TheSvSurfaces *)PtrOnmySvSurfaces)->TangencyOnSurf1(u1, v1, u2, v2, TabVec2d(1));
+    if(ret)
+    { 
+      if(TabVec2d.Length()>=2)
+      {
+        ret = 
+              (ret && 
+              ((TheSvSurfaces *)PtrOnmySvSurfaces)->
+                                          TangencyOnSurf2(u1, v1, u2, v2, TabVec2d(2)));
       }
     }
   }
-  return(ret);
-}
-//--------------------------------------------------------------------------------
-Standard_Boolean ApproxInt_MultiLine::Tangency( const Standard_Integer Index
-                                           ,TColgp_Array1OfVec&       TabVec
-                                           ,TColgp_Array1OfVec2d&     TabVec2d) const 
-{ 
-  if(PtrOnmySvSurfaces==NULL) 
-    return(Standard_False);
 
-  IntSurf_PntOn2S POn2S(myLine->Point(Index));
-  Standard_Real u1,u2,v1,v2,U,V;
-  gp_Vec2d Tg2d;
-  gp_Vec   Tg;
-  Standard_Boolean ret;
-  POn2S.Parameters(u1,v1,u2,v2);
-  if(nbp2d==1) {
-    Standard_Real Au = A1u;
-    Standard_Real Av = A1v;
-    if(p2donfirst) { 
-      ret=((TheSvSurfaces *)PtrOnmySvSurfaces)->TangencyOnSurf1( u1,v1,u2,v2,Tg2d);
-    }
-    else { 
-      ret=((TheSvSurfaces *)PtrOnmySvSurfaces)->TangencyOnSurf2( u1,v1,u2,v2,Tg2d);
-      Au = A2u;
-      Av = A2v;
-    }
-    if(ret) { 
-      U = Tg2d.X();
-      V = Tg2d.Y();
-      TabVec2d(1) = gp_Vec2d(U * Au, V * Av);  
-    }
-    else { 
-      TabVec2d(1) = gp_Vec2d(0.0,0.0);
-    }
-  }
-  else { 
-    ret=((TheSvSurfaces *)PtrOnmySvSurfaces)->TangencyOnSurf1( u1,v1,u2,v2,Tg2d);
-    if(ret) { 
-      U = Tg2d.X();
-      V = Tg2d.Y();
-      TabVec2d(1) = gp_Vec2d(U * A1u, V * A1v);
-      if(TabVec2d.Length()>=2) { 
-       ret&=((TheSvSurfaces *)PtrOnmySvSurfaces)->TangencyOnSurf2( u1,v1,u2,v2,Tg2d);
-       U = Tg2d.X();
-       V = Tg2d.Y();
-       TabVec2d(2) = gp_Vec2d(U * A2u, V * A2v);
-      }
-    }
-    else { 
-      TabVec2d(1) = gp_Vec2d(0.0,0.0);
-      if(TabVec2d.Length()>=2) {
-       TabVec2d(2) = gp_Vec2d(0.0,0.0);
-      }
+  if(!ret)
+  {
+    TabVec2d(1) = gp_Vec2d(0.0, 0.0);
+    if(TabVec2d.Length() >= 2)
+    {
+      TabVec2d(2) = gp_Vec2d(0.0,0.0);
     }
   }
-  if(ret) { 
-    ret&=((TheSvSurfaces *)PtrOnmySvSurfaces)->Tangency( u1,v1,u2,v2,Tg);
-    Standard_Real X = Tg.X();
-    Standard_Real Y = Tg.Y();
-    Standard_Real Z = Tg.Z();
-    TabVec(1) = gp_Vec(X * Ax, Y * Ay, Z * Az);
-  }
-  else { 
-    TabVec(1) = gp_Vec(0.0,0.0,0.0);
-  }
-  return(ret);
-}
-//--------------------------------------------------------------------------------
-
 
+  return ret;
+}
 
-//================================================================================
-ApproxInt_MultiLine  ApproxInt_MultiLine::MakeMLBetween(const Standard_Integer Low,
-                                                       const Standard_Integer High,
-                                                       const Standard_Integer aNbPntsToInsert)
-const { 
-  if(PtrOnmySvSurfaces==NULL) {
-    //-- cout<<"\n Erreur dans : ApproxInt_MultiLine  ApproxInt_MultiLine::MakeMLBetween "<<endl;
+//=======================================================================
+//function : MakeMLBetween
+//purpose  : 
+//=======================================================================
+ApproxInt_MultiLine
+  ApproxInt_MultiLine::MakeMLBetween( const Standard_Integer Low,
+                                      const Standard_Integer High,
+                                      const Standard_Integer aNbPntsToInsert) const
+{ 
+  if(PtrOnmySvSurfaces==NULL)
+  {
+    //-- cout<<"\n Erreur dans : ApproxInt_MultiLine "
+    //             "ApproxInt_MultiLine::MakeMLBetween "<<endl;
     Handle(IntSurf_LineOn2S) vide1 = new IntSurf_LineOn2S();
     Handle(TheLine) vide = new TheLine(vide1,Standard_False);
-    return(ApproxInt_MultiLine(vide,
-                              NULL,
-                              nbp3d,
-                              nbp2d,
-                              Xo,Ax,Yo,Ay,Zo,Az,
-                              U1o,A1u,V1o,A1v,
-                              U2o,A2u,V2o,A2v,
-                              p2donfirst,
-                              1,1));
+    return(ApproxInt_MultiLine(vide, NULL, nbp3d, nbp2d, p2donfirst, 1, 1));
     //-- return(*this);
   }
+
   Standard_Integer NbPntsToInsert=aNbPntsToInsert;
   if(NbPntsToInsert<(High-Low)) NbPntsToInsert=(High-Low);
   Standard_Integer NbPnts = NbPntsToInsert + High - Low + 1;
@@ -401,7 +242,6 @@ const {
   AC(Low) =0.0;
   
 #if 0 
-  
   for( i=Low+1; i<=High; i++) { 
     myLine->Point(i).Parameters(u1,v1,u2,v2);
     U1(i) = u1;
@@ -416,26 +256,24 @@ const {
   }
 #else 
   //-- Essai du 19 juin 96 (parametrage selon abs curv en XYZ)
-  for( i=Low+1; i<=High; i++) { 
+  for( i=Low+1; i<=High; i++)
+  {
     myLine->Point(i).Parameters(u1,v1,u2,v2);
     U1(i) = u1;
     V1(i) = v1;
     U2(i) = u2;
     V2(i) = v2;    
-    AC(i) = AC(i-1) 
-      + (myLine->Point(i-1).Value()).Distance(myLine->Point(i).Value());
+    AC(i) = AC(i-1) + (myLine->Point(i-1).Value()).Distance(myLine->Point(i).Value());
   }
 
 #endif
   //-------------------------------------------------------------
   //-- Creation des structures contenant les resultats
   
-  Handle(IntSurf_LineOn2S) ResultPntOn2SLine
-    = new IntSurf_LineOn2S();
+  Handle(IntSurf_LineOn2S) ResultPntOn2SLine = new IntSurf_LineOn2S();
   
   IntSurf_PntOn2S StartPOn2S;  
-  TColStd_Array1OfReal StartParams(1,4);
-  
+  TColStd_Array1OfReal StartParams(1,4);  
   
   ds = AC(High) / (NbPnts-1);
   Standard_Integer Indice = Low;
@@ -443,15 +281,19 @@ const {
   Standard_Real dsmin = ds*0.3;
   Standard_Real smax  = AC(High);
   
-  for(i=2,s=ds; (s < smax && Indice <= High-1); i++,s+=ds) { 
+  for(i=2,s=ds; (s < smax && Indice <= High-1); i++,s+=ds)
+  { 
     //----------------------------------------------------------
     //-- Recherche des indices des points                     --
     //-- Point           :    2       i       NbPnts-1        --
     //-- s                            s                       --
     //-- Current Indice tel que AC(Indice)<= s < AC(Indice+1) --
     //----------------------------------------------------------
-    while(AC(Indice+1) <= s) { 
-      if(!HasBeenInserted) ResultPntOn2SLine->Add(myLine->Point(Indice));
+    while(AC(Indice+1) <= s)
+    { 
+      if(!HasBeenInserted)
+        ResultPntOn2SLine->Add(myLine->Point(Indice));
+
       HasBeenInserted = Standard_False;
       Indice++;
       if (Indice == High)
@@ -461,10 +303,12 @@ const {
     if (Indice == High)
       break;
     
-    if(!HasBeenInserted  && AC(Indice) <= s) { 
+    if(!HasBeenInserted  && AC(Indice) <= s)
+    { 
       ResultPntOn2SLine->Add(myLine->Point(Indice));
       HasBeenInserted = Standard_True;
     }
+    
     Standard_Real a = s - AC(Indice);
     Standard_Real b = AC(Indice+1) - s;
     Standard_Real nab = 1.0/(a+b);
@@ -474,48 +318,57 @@ const {
     //--                 Si Dist au precedent point < dsmin   --
     //--                                                      --
     //----------------------------------------------------------
-    if((a>dsmin) && (b>dsmin)) {       
-      
+    if((a>dsmin) && (b>dsmin))
+    {
       u1 = (U1(Indice) * b   +  U1(Indice+1) * a) * nab;
       v1 = (V1(Indice) * b   +  V1(Indice+1) * a) * nab;
       u2 = (U2(Indice) * b   +  U2(Indice+1) * a) * nab;
       v2 = (V2(Indice) * b   +  V2(Indice+1) * a) * nab;
-      
-      
-      if(((TheSvSurfaces *)PtrOnmySvSurfaces)->Compute(u1,v1,u2,v2,P,T,TS1,TS2)) { 
-       StartPOn2S.SetValue(P,u1,v1,u2,v2);
-       //-- cout<<" Insertion du point calcule : "<<u1<<","<<v1<<","<<u2<<","<<v2<<",";
-       //-- cout<<P.X()<<","<<P.Y()<<","<<P.Z()<<endl;
-       ResultPntOn2SLine->Add(StartPOn2S);
+            
+      if(((TheSvSurfaces *)PtrOnmySvSurfaces)->Compute(u1,v1,u2,v2,P,T,TS1,TS2))
+      {
+        StartPOn2S.SetValue(P,u1,v1,u2,v2);
+        //-- cout<<" Insertion du point calcule : "<<u1<<","<<v1<<","<<u2<<","<<v2<<",";
+        //-- cout<<P.X()<<","<<P.Y()<<","<<P.Z()<<endl;
+        ResultPntOn2SLine->Add(StartPOn2S);
       }
-      else { 
-       //-- cout<<" Probleme Non Traite ds ApproxInt_ApproxIntIntersection "<<endl;
+      else
+      {
+        //-- cout<<" Probleme Non Traite ds ApproxInt_ApproxIntIntersection "<<endl;
       }
     }
-    else { 
+    else
+    {
       //-- Point non situe a distance suffisante de 2 pts existants
       //-- avec le point p[indice] deja insere
       
-      if(b<0.0) {
-       while(AC(Indice+1) <= s) { 
-         if(!HasBeenInserted) ResultPntOn2SLine->Add(myLine->Point(Indice));
-         //-- cout<<" Insertion du point :"<<Indice<<endl;
-         HasBeenInserted = Standard_False;
-         Indice++;
+      if(b<0.0)
+      {
+        while(AC(Indice+1) <= s)
+        {
+          if(!HasBeenInserted)
+            ResultPntOn2SLine->Add(myLine->Point(Indice));
+
+          //-- cout<<" Insertion du point :"<<Indice<<endl;
+          HasBeenInserted = Standard_False;
+          Indice++;
+
           if (Indice == High)
             break;
-       }
-    
-        if (Indice == High)
+        }
+
+        if(Indice == High)
           break;
-    
-       if(!HasBeenInserted  && AC(Indice) <= s) { 
-         ResultPntOn2SLine->Add(myLine->Point(Indice));
-         HasBeenInserted = Standard_True;
-       } 
+
+        if(!HasBeenInserted  && AC(Indice) <= s)
+        {
+          ResultPntOn2SLine->Add(myLine->Point(Indice));
+          HasBeenInserted = Standard_True;
+        }
       }
-      else { 
-       s+=dsmin - ds;
+      else
+      {
+        s+= (dsmin - ds);
       }
     }
   }
@@ -538,7 +391,8 @@ const {
 
   Standard_Integer CodeErreur=0; 
   
-  for(i=3,NbPnts=temp->NbPnts();CodeErreur==0 &&  i<=NbPnts; i++) {
+  for(i=3,NbPnts=temp->NbPnts();CodeErreur==0 &&  i<=NbPnts; i++)
+  {
     Standard_Real d,du,dv,duv2;
     temp->Point(i).Parameters(u1,v1,u2,v2);
     //-- Virage P1A P1B P1C
@@ -551,11 +405,13 @@ const {
     du = P1C.X() - u1;
     dv = P1C.Y() - v1;
     d = du*du+dv*dv;
-    if(d>duv2) { 
+    if(d>duv2)
+    { 
       CodeErreur = 1;
       CodeErreur = 1;
       break;
     }
+    
     //-- Virage P2A P2B P2C
     P2C.SetCoord(u2,v2);
     du  = P2B.X()-P2A.X();
@@ -566,53 +422,51 @@ const {
     du = P2C.X() - u2;
     dv = P2C.Y() - v2;
     d = du*du+dv*dv;
-    if(d>duv2) {
+    if(d>duv2)
+    {
       CodeErreur = 2;
       break;
     }
+    
     P1A=P1B;
     P2A=P2B;
     P1B=P1C;
     P2B=P2C;
   }
-#if DEBUG
-  if (temp->NbPnts() < NbPntsToInsert + High - Low + 1) { 
-    cout<<" *** Pas assez de points entre :"<<Low<<" et "<<High<<" -> "<<temp->NbPnts()<<endl;
-  }
-  if(CodeErreur) { 
-    cout<<" *** CodeErreur : "<<CodeErreur<<endl;
-  }
+
+#if OCCT_DEBUG
+  //if (temp->NbPnts() < NbPntsToInsert + High - Low + 1)
+  //{ 
+  //  cout<<" *** Pas assez de points entre :"<<
+  //            Low<<" et "<<High<<" -> "<<temp->NbPnts()<<endl;
+  //}
+
+  //if(CodeErreur)
+  //{ 
+  //  cout<<" *** CodeErreur : "<<CodeErreur<<endl;
+  //}
 #endif
-  if((temp->NbPnts() >= NbPntsToInsert + High - Low + 1)
-     && (CodeErreur==0)) { 
-    return(ApproxInt_MultiLine(temp,
-                              (High-Low>10)? PtrOnmySvSurfaces : NULL,
-                              nbp3d,
-                              nbp2d,
-                              Xo,Ax,Yo,Ay,Zo,Az,
-                              U1o,A1u,V1o,A1v,
-                              U2o,A2u,V2o,A2v,
-                              p2donfirst,
-                              1,ResultPntOn2SLine->NbPoints()));
+
+  if((temp->NbPnts() >= NbPntsToInsert + High - Low + 1) && (CodeErreur==0))
+  {
+    return(ApproxInt_MultiLine( temp, 
+                                (High-Low>10)? PtrOnmySvSurfaces : NULL,
+                                nbp3d, nbp2d, p2donfirst, 1, ResultPntOn2SLine->NbPoints()));
   }
-  else { 
+  else
+  {
     //-- cout<<" ApproxInt_MultiLine "<<endl;
     //-- cout<<" Pas de Rajout de points ds1min =  "<<minds1<<" ds2min = "<<minds2<<endl;
     Handle(IntSurf_LineOn2S) vide1 = new IntSurf_LineOn2S();
     Handle(TheLine) vide = new TheLine(vide1,Standard_False);
-    return(ApproxInt_MultiLine(vide,
-                              NULL,
-                              nbp3d,
-                              nbp2d,
-                              Xo,Ax,Yo,Ay,Zo,Az,
-                              U1o,A1u,V1o,A1v,
-                              U2o,A2u,V2o,A2v,
-                              p2donfirst,
-                              1,1));
+    return(ApproxInt_MultiLine(vide, NULL, nbp3d, nbp2d, p2donfirst, 1, 1));
   }
 }
-  //======================================================================
 
+//=======================================================================
+//function : Dump
+//purpose  : 
+//=======================================================================
 void ApproxInt_MultiLine::Dump() const
 {
   TColgp_Array1OfPnt anArr1(1, 1);
index 0cba54c3f1497b7ac0f2ff245ac8f5abbeafc311..d0c9f6e0372fe873cb0b33cc8ff68aea740d93ab 100644 (file)
@@ -42,8 +42,7 @@
 BRepAlgo_BooleanOperations::BRepAlgo_BooleanOperations() :
 myApproxNbPntMax (30) ,
 myApproxTol3D (1.e-7) ,
-myApproxTol2D (1.e-7) ,
-myApproxRelativeTol (Standard_True)
+myApproxTol2D (1.e-7)
 {
 }
 
@@ -109,13 +108,11 @@ myApproxRelativeTol (Standard_True)
 //=======================================================================
   void BRepAlgo_BooleanOperations::SetApproxParameters (const Standard_Integer NbPntMax,
                                                        const Standard_Real Tol3D,
-                                                       const Standard_Real Tol2D,
-                                                       const Standard_Boolean RelativeTol)
+                                                       const Standard_Real Tol2D)
 {
   myApproxNbPntMax = NbPntMax ;
   myApproxTol3D = Tol3D ;
   myApproxTol2D = Tol2D ;
-  myApproxRelativeTol = RelativeTol ;
 }
 
 //=======================================================================
@@ -140,7 +137,7 @@ myApproxRelativeTol (Standard_True)
   TopOpeBRepDS_BuildTool& BTofBuilder = myDSA.myHB->ChangeBuildTool();
   TopOpeBRepTool_GeomTool& GTofBTofBuilder = BTofBuilder.ChangeGeomTool();
   GTofBTofBuilder.SetNbPntMax(myApproxNbPntMax);
-  GTofBTofBuilder.SetTolerances (myApproxTol3D, myApproxTol2D, myApproxRelativeTol) ;
+  GTofBTofBuilder.SetTolerances (myApproxTol3D, myApproxTol2D) ;
   Handle(TopOpeBRepBuild_HBuilder)& HB = myDSA.myHB;
   Handle(TopOpeBRepDS_HDataStructure)& HDS = myDSA.ChangeDS();
   HB->Perform(HDS,myS1,myS2);
index a00b4f7cb97daddb984937ef8e420fd2998f9209..b11a8f8cbed0056b2e60152f96175e3afb3b6a1e 100644 (file)
@@ -58,7 +58,8 @@ public:
   //! the same time in one curve.
   //! Tol3D, Tol2D : Tolerances to be reached by the approximation.
   //! RelativeTol : The given tolerances are relative.
-  Standard_EXPORT void SetApproxParameters (const Standard_Integer NbPntMax, const Standard_Real Tol3D, const Standard_Real Tol2D, const Standard_Boolean RelativeTol);
+  Standard_EXPORT void SetApproxParameters (const Standard_Integer NbPntMax,
+                                  const Standard_Real Tol3D, const Standard_Real Tol2D);
   
   Standard_EXPORT void Define (const TopoDS_Shape& S1, const TopoDS_Shape& S2, Handle(TopOpeBRepDS_HDataStructure)& HDS);
   
@@ -129,9 +130,6 @@ private:
   Standard_Integer myApproxNbPntMax;
   Standard_Real myApproxTol3D;
   Standard_Real myApproxTol2D;
-  Standard_Boolean myApproxRelativeTol;
-
-
 };
 
 
index c3c5bbd7e2b201410a2fd14a90fafe5342120a37..4b1e02d37fa028619df38cc465ab9a17fb0ef8f7 100644 (file)
@@ -59,13 +59,31 @@ public:
   
   Standard_EXPORT BRepApprox_Approx();
   
-  Standard_EXPORT void Perform (const BRepAdaptor_Surface& Surf1, const BRepAdaptor_Surface& Surf2, const Handle(BRepApprox_ApproxLine)& aLine, const Standard_Boolean ApproxXYZ = Standard_True, const Standard_Boolean ApproxU1V1 = Standard_True, const Standard_Boolean ApproxU2V2 = Standard_True, const Standard_Integer indicemin = 0, const Standard_Integer indicemax = 0);
+  Standard_EXPORT void Perform (const BRepAdaptor_Surface& Surf1,
+                                const BRepAdaptor_Surface& Surf2,
+                                const Handle(BRepApprox_ApproxLine)& aLine,
+                                const Standard_Boolean ApproxXYZ = Standard_True,
+                                const Standard_Boolean ApproxU1V1 = Standard_True,
+                                const Standard_Boolean ApproxU2V2 = Standard_True,
+                                const Standard_Integer indicemin = 0,
+                                const Standard_Integer indicemax = 0);
   
-  Standard_EXPORT void Perform (const Handle(BRepApprox_ApproxLine)& aLine, const Standard_Boolean ApproxXYZ = Standard_True, const Standard_Boolean ApproxU1V1 = Standard_True, const Standard_Boolean ApproxU2V2 = Standard_True, const Standard_Integer indicemin = 0, const Standard_Integer indicemax = 0);
+  Standard_EXPORT void Perform (const Handle(BRepApprox_ApproxLine)& aLine,
+                                const Standard_Boolean ApproxXYZ = Standard_True,
+                                const Standard_Boolean ApproxU1V1 = Standard_True,
+                                const Standard_Boolean ApproxU2V2 = Standard_True,
+                                const Standard_Integer indicemin = 0,
+                                const Standard_Integer indicemax = 0);
   
-  Standard_EXPORT void SetParameters (const Standard_Real Tol3d, const Standard_Real Tol2d, const Standard_Integer DegMin, const Standard_Integer DegMax, const Standard_Integer NbIterMax, const Standard_Boolean ApproxWithTangency = Standard_True, const Approx_ParametrizationType Parametrization = Approx_ChordLength);
-  
-  Standard_EXPORT void SetParameters (const Standard_Real Tol3d, const Standard_Real Tol2d, const Standard_Boolean RelativeTol, const Standard_Integer DegMin, const Standard_Integer DegMax, const Standard_Integer NbIterMax, const Standard_Integer NbPntMax, const Standard_Boolean ApproxWithTangency = Standard_True, const Approx_ParametrizationType Parametrization = Approx_ChordLength);
+  Standard_EXPORT 
+      void SetParameters (const Standard_Real Tol3d, const Standard_Real Tol2d,
+                          const Standard_Integer DegMin, 
+                          const Standard_Integer DegMax,
+                          const Standard_Integer NbIterMax,
+                          const Standard_Integer NbPntMax = 30,
+                          const Standard_Boolean ApproxWithTangency = Standard_True,
+                          const Approx_ParametrizationType
+                                          Parametrization = Approx_ChordLength);
   
   Standard_EXPORT void Perform();
   
@@ -77,7 +95,8 @@ public:
   
   Standard_EXPORT Standard_Integer NbMultiCurves() const;
   
-  Standard_EXPORT const AppParCurves_MultiBSpCurve& Value (const Standard_Integer Index) const;
+  Standard_EXPORT const AppParCurves_MultiBSpCurve&
+                                              Value (const Standard_Integer Index) const;
 
 
 
@@ -90,11 +109,19 @@ protected:
 
 private:
 
-  Standard_EXPORT Standard_Integer CorrectFinishIdx(const Standard_Integer theMinIdx,
-                                                    const Standard_Integer theMaxIdx,
-                                                    const Handle(BRepApprox_ApproxLine)& theline);
+  Standard_EXPORT Standard_Integer
+                    CorrectFinishIdx( const Standard_Integer theMinIdx,
+                                      const Standard_Integer theMaxIdx,
+                                      const Handle(BRepApprox_ApproxLine)& theline);
   
-  Standard_EXPORT void Perform (const BRepAdaptor_Surface& Surf1, const IntSurf_Quadric& Surf2, const Handle(BRepApprox_ApproxLine)& aLine, const Standard_Boolean ApproxXYZ, const Standard_Boolean ApproxU1V1, const Standard_Boolean ApproxU2V2, const Standard_Integer indicemin, const Standard_Integer indicemax);
+  Standard_EXPORT void Perform (const BRepAdaptor_Surface& Surf1,
+                                const IntSurf_Quadric& Surf2,
+                                const Handle(BRepApprox_ApproxLine)& aLine,
+                                const Standard_Boolean ApproxXYZ,
+                                const Standard_Boolean ApproxU1V1,
+                                const Standard_Boolean ApproxU2V2,
+                                const Standard_Integer indicemin,
+                                const Standard_Integer indicemax);
   
   Standard_EXPORT void Perform (const IntSurf_Quadric& Surf1, const BRepAdaptor_Surface& Surf2, const Handle(BRepApprox_ApproxLine)& aLine, const Standard_Boolean ApproxXYZ, const Standard_Boolean ApproxU1V1, const Standard_Boolean ApproxU2V2, const Standard_Integer indicemin, const Standard_Integer indicemax);
   
@@ -104,22 +131,16 @@ private:
   BRepApprox_TheComputeLineOfApprox myComputeLine;
   BRepApprox_TheComputeLineBezierOfApprox myComputeLineBezier;
   Approx_MCurvesToBSpCurve myBezToBSpl;
-  Standard_Boolean myTolReached;
   Standard_Boolean myApproxBez;
   Standard_Boolean myWithTangency;
   Standard_Real myTol3d;
   Standard_Real myTol2d;
-  Standard_Boolean myRelativeTol;
   Standard_Integer myDegMin;
   Standard_Integer myDegMax;
   Standard_Integer myNbPntMax;
   Standard_Integer myNbIterMax;
-  Standard_Real myMinFactorXYZ;
-  Standard_Real myMinFactorUV;
   Standard_Real myTolReached3d;
   Standard_Real myTolReached2d;
-
-
 };
 
 
index 331323eb045bce41a3c478c67f185be21ef6e078..576a3a6326a392168ab5a4427ea14319c18b7426 100644 (file)
@@ -83,47 +83,88 @@ public:
   Standard_EXPORT void Perform (const BRepApprox_TheMultiLineOfApprox& Line);
   
   //! changes the degrees of the approximation.
-  Standard_EXPORT void SetDegrees (const Standard_Integer degreemin, const Standard_Integer degreemax);
+  Standard_EXPORT void SetDegrees ( const Standard_Integer degreemin, 
+                                    const Standard_Integer degreemax)
+  {
+    mydegremin = degreemin;
+    mydegremax = degreemax;
+  }
   
   //! Changes the tolerances of the approximation.
-  Standard_EXPORT void SetTolerances (const Standard_Real Tolerance3d, const Standard_Real Tolerance2d);
+  Standard_EXPORT void SetTolerances (const Standard_Real Tolerance3d,
+                                      const Standard_Real Tolerance2d)
+  {
+    mytol3d = Tolerance3d;
+    mytol2d = Tolerance2d;
+  }
   
   //! changes the first and the last constraint points.
-  Standard_EXPORT void SetConstraints (const AppParCurves_Constraint firstC, const AppParCurves_Constraint lastC);
+  Standard_EXPORT void SetConstraints (const AppParCurves_Constraint FirstC,
+                                        const AppParCurves_Constraint LastC)
+  {
+    myfirstC = FirstC;
+    mylastC = LastC;
+  }
   
   //! returns False if at a moment of the approximation,
   //! the status NoApproximation has been sent by the user
   //! when more points were needed.
-  Standard_EXPORT Standard_Boolean IsAllApproximated() const;
+  Standard_EXPORT Standard_Boolean IsAllApproximated() const
+  {
+    return alldone;
+  }
   
   //! returns False if the status NoPointsAdded has been sent.
-  Standard_EXPORT Standard_Boolean IsToleranceReached() const;
+  Standard_EXPORT Standard_Boolean IsToleranceReached() const
+  {
+    return tolreached;
+  }
   
   //! returns the tolerances 2d and 3d of the <Index> MultiCurve.
-  Standard_EXPORT void Error (const Standard_Integer Index, Standard_Real& tol3d, Standard_Real& tol2d) const;
+  Standard_EXPORT void Error (const Standard_Integer Index,
+                              Standard_Real& tol3d,
+                              Standard_Real& tol2d) const
+  {
+    tol3d = Tolers3d.Value(Index);
+    tol2d = Tolers2d.Value(Index);
+  }
   
   //! Returns the number of MultiCurve doing the approximation
   //! of the MultiLine.
-  Standard_EXPORT Standard_Integer NbMultiCurves() const;
+  Standard_EXPORT Standard_Integer NbMultiCurves() const
+  {
+    return myMultiCurves.Length();
+  }
   
   //! returns the result of the approximation.
-  Standard_EXPORT const AppParCurves_MultiCurve& Value (const Standard_Integer Index = 1) const;
+  Standard_EXPORT const AppParCurves_MultiCurve&
+                                      Value (const Standard_Integer Index = 1) const
+  {
+    return myMultiCurves.Value(Index);
+  }
   
   //! returns the result of the approximation.
-  Standard_EXPORT AppParCurves_MultiCurve& ChangeValue (const Standard_Integer Index = 1);
+  Standard_EXPORT AppParCurves_MultiCurve& ChangeValue (const Standard_Integer Index = 1)
+  {
+    return myMultiCurves.ChangeValue(Index);
+  }
   
   //! returns the result of the approximation.
   Standard_EXPORT const AppParCurves_MultiBSpCurve& SplineValue();
   
   //! returns the type  of  parametrization
-  Standard_EXPORT void Parametrization (Approx_ParametrizationType& partype) const;
+  Standard_EXPORT Approx_ParametrizationType Parametrization () const
+  {
+    return Par;
+  }
   
   //! returns the new parameters of the approximation
   //! corresponding to the points of the multicurve <Index>.
-  Standard_EXPORT const TColStd_Array1OfReal& Parameters (const Standard_Integer Index = 1) const;
-
-
-
+  Standard_EXPORT const TColStd_Array1OfReal&
+                                    Parameters (const Standard_Integer Index = 1) const
+  {
+    return (myPar.Value(Index))->Array1();
+  }
 
 protected:
 
index 8df99ddb033dd04923843e05264c71bb26c084ae..65d2dd58416c2c86f4899d902065320a787de15d 100644 (file)
@@ -30,7 +30,9 @@
 #include <TColgp_Array1OfPnt2d.hxx>
 #include <TColgp_Array1OfVec.hxx>
 #include <TColgp_Array1OfVec2d.hxx>
-class BRepApprox_ApproxLine;
+#include <IntSurf_LineOn2S.hxx>
+#include <BRepApprox_ApproxLine.hxx>
+
 class ApproxInt_SvSurfaces;
 
 
@@ -40,105 +42,113 @@ class BRepApprox_TheMultiLineOfApprox
 public:
 
   DEFINE_STANDARD_ALLOC
-
   
-  //! The  class   SvSurfaces     is used   when    the
-  //! approximation algorithm needs some extra points on
-  //! the line <line>. A New line  is then created which
-  //! shares  the    same  surfaces    and    functions.
-  //!
-  //! SvSurfaces is   a  deferred   class  which  allows
-  //! several implementations of  this  algorithm   with
-  //! different surfaces   (bi-parametric     ones,   or
+  //! The class SvSurfaces is used when the approximation algorithm 
+  //! needs some extra points on the line <line>. 
+  //! A New line  is then created which shares the same surfaces and functions.
+  //! SvSurfaces is a deferred class which allows several implementations of
+  //! this  algorithm with different surfaces (bi-parametric ones, or 
   //! implicit and biparametric ones)
-  Standard_EXPORT BRepApprox_TheMultiLineOfApprox(const Handle(BRepApprox_ApproxLine)& line, const Standard_Address PtrSvSurfaces, const Standard_Integer NbP3d, const Standard_Integer NbP2d, const Standard_Real xo, const Standard_Real ax, const Standard_Real yo, const Standard_Real ay, const Standard_Real zo, const Standard_Real az, const Standard_Real u1o, const Standard_Real a1u, const Standard_Real v1o, const Standard_Real a1v, const Standard_Real u2o, const Standard_Real a2u, const Standard_Real v2o, const Standard_Real a2v, const Standard_Boolean P2DOnFirst, const Standard_Integer IndMin = 0, const Standard_Integer IndMax = 0);
-  
+  Standard_EXPORT BRepApprox_TheMultiLineOfApprox(const Handle(BRepApprox_ApproxLine)& line,
+                                                  const Standard_Address PtrSvSurfaces,
+                                                  const Standard_Integer NbP3d,
+                                                  const Standard_Integer NbP2d,
+                                                  const Standard_Boolean P2DOnFirst,
+                                                  const Standard_Integer IndMin = 0,
+                                                  const Standard_Integer IndMax = 0);
+
   //! No Extra points will be added on the current line
-  Standard_EXPORT BRepApprox_TheMultiLineOfApprox(const Handle(BRepApprox_ApproxLine)& line, const Standard_Integer NbP3d, const Standard_Integer NbP2d, const Standard_Real xo, const Standard_Real ax, const Standard_Real yo, const Standard_Real ay, const Standard_Real zo, const Standard_Real az, const Standard_Real u1o, const Standard_Real a1u, const Standard_Real v1o, const Standard_Real a1v, const Standard_Real u2o, const Standard_Real a2u, const Standard_Real v2o, const Standard_Real a2v, const Standard_Boolean P2DOnFirst, const Standard_Integer IndMin = 0, const Standard_Integer IndMax = 0);
-  
-  Standard_EXPORT Standard_Integer FirstPoint() const;
-  
-  Standard_EXPORT Standard_Integer LastPoint() const;
-  
-  //! Returns the number of 2d points of a TheLine.
-  Standard_EXPORT Standard_Integer NbP2d() const;
+  Standard_EXPORT BRepApprox_TheMultiLineOfApprox(const Handle(BRepApprox_ApproxLine)& line,
+                                                  const Standard_Integer NbP3d,
+                                                  const Standard_Integer NbP2d,
+                                                  const Standard_Boolean P2DOnFirst,
+                                                  const Standard_Integer IndMin = 0,
+                                                  const Standard_Integer IndMax = 0);
+
+  Standard_EXPORT Standard_Integer FirstPoint() const
+  {
+    return indicemin;
+  }
   
+  Standard_EXPORT Standard_Integer LastPoint() const
+  {
+    return indicemax;
+  }
+
+  Standard_EXPORT Approx_Status WhatStatus() const
+  {
+    if(PtrOnmySvSurfaces)
+      return(Approx_PointsAdded);
+    else 
+      return(Approx_NoPointsAdded);
+  }
+
   //! Returns the number of 3d points of a TheLine.
-  Standard_EXPORT Standard_Integer NbP3d() const;
-  
-  Standard_EXPORT Approx_Status WhatStatus() const;
-  
-  //! returns the 3d points of the multipoint <MPointIndex>
-  //! when only 3d points exist.
-  Standard_EXPORT void Value (const Standard_Integer MPointIndex, TColgp_Array1OfPnt& tabPt) const;
+  Standard_EXPORT Standard_Integer NbP3d() const
+  {
+    return nbp3d;
+  }
+
+  //! Returns the number of 2d points of a TheLine.
+  Standard_EXPORT Standard_Integer NbP2d() const
+  {
+    return nbp2d;
+  }
   
-  //! returns the 2d points of the multipoint <MPointIndex>
-  //! when only 2d points exist.
-  Standard_EXPORT void Value (const Standard_Integer MPointIndex, TColgp_Array1OfPnt2d& tabPt2d) const;
+  //! Returns the 3d points of the multipoint <MPointIndex> when only 3d points exist.
+  Standard_EXPORT void Value (const Standard_Integer MPointIndex,
+                              TColgp_Array1OfPnt& tabPt) const
+  {
+    tabPt(1) = myLine->Point(MPointIndex).Value();
+  }
   
-  //! returns the 3d and 2d points of the multipoint
-  //! <MPointIndex>.
-  Standard_EXPORT void Value (const Standard_Integer MPointIndex, TColgp_Array1OfPnt& tabPt, TColgp_Array1OfPnt2d& tabPt2d) const;
+  //! Returns the 3d and 2d points of the multipoint <MPointIndex>.
+  Standard_EXPORT void Value (const Standard_Integer MPointIndex,
+                              TColgp_Array1OfPnt& tabPt,
+                              TColgp_Array1OfPnt2d& tabPt2d) const
+  {
+    Value(MPointIndex, tabPt);
+    Value(MPointIndex, tabPt2d);
+  }
+
+  //! Returns the 2d points of the multipoint <MPointIndex> when only 2d points exist.
+  Standard_EXPORT void Value (const Standard_Integer MPointIndex,
+                              TColgp_Array1OfPnt2d& tabPt2d) const;
   
-  //! returns the 3d points of the multipoint <MPointIndex>
-  //! when only 3d points exist.
-  Standard_EXPORT Standard_Boolean Tangency (const Standard_Integer MPointIndex, TColgp_Array1OfVec& tabV) const;
+  //! Returns the 3d tangency points of the multipoint <MPointIndex> only
+  //! when 3d points exist.
+  Standard_EXPORT Standard_Boolean Tangency ( const Standard_Integer MPointIndex,
+                                              TColgp_Array1OfVec& tabV) const;
   
-  //! returns the 2d tangency points of the multipoint
-  //! <MPointIndex> only when 2d points exist.
-  Standard_EXPORT Standard_Boolean Tangency (const Standard_Integer MPointIndex, TColgp_Array1OfVec2d& tabV2d) const;
+  //! Returns the 2d tangency points of the multipoint <MPointIndex> only
+  //! when 2d points exist.
+  Standard_EXPORT Standard_Boolean Tangency ( const Standard_Integer MPointIndex,
+                                              TColgp_Array1OfVec2d& tabV2d) const;
   
-  //! returns the 3d and 2d points of the multipoint
-  //! <MPointIndex>.
-  Standard_EXPORT Standard_Boolean Tangency (const Standard_Integer MPointIndex, TColgp_Array1OfVec& tabV, TColgp_Array1OfVec2d& tabV2d) const;
+  //! Returns the 3d and 2d points of the multipoint <MPointIndex>.
+  Standard_EXPORT Standard_Boolean Tangency ( const Standard_Integer MPointIndex,
+                                              TColgp_Array1OfVec& tabV,
+                                              TColgp_Array1OfVec2d& tabV2d) const
+  {
+    return (Tangency(MPointIndex, tabV) && Tangency(MPointIndex, tabV2d));
+  }
   
   Standard_EXPORT BRepApprox_TheMultiLineOfApprox MakeMLBetween (const Standard_Integer Low, const Standard_Integer High, const Standard_Integer NbPointsToInsert) const;
   
   //! Dump of the current multi-line.
   Standard_EXPORT void Dump() const;
 
-
-
-
 protected:
-
-
-
-
+  BRepApprox_TheMultiLineOfApprox operator=(BRepApprox_TheMultiLineOfApprox&);
 
 private:
-
-
-
-  Standard_Address PtrOnmySvSurfaces;
-  Handle(BRepApprox_ApproxLine) myLine;
-  Standard_Integer indicemin;
-  Standard_Integer indicemax;
-  Standard_Integer nbp3d;
-  Standard_Integer nbp2d;
-  Standard_Boolean p2donfirst;
-  Standard_Real Xo;
-  Standard_Real Ax;
-  Standard_Real Yo;
-  Standard_Real Ay;
-  Standard_Real Zo;
-  Standard_Real Az;
-  Standard_Real U1o;
-  Standard_Real A1u;
-  Standard_Real V1o;
-  Standard_Real A1v;
-  Standard_Real U2o;
-  Standard_Real A2u;
-  Standard_Real V2o;
-  Standard_Real A2v;
-
-
+  const Standard_Address PtrOnmySvSurfaces;
+  const Handle(BRepApprox_ApproxLine) myLine;
+  const Standard_Integer indicemin;
+  const Standard_Integer indicemax;
+  const Standard_Integer nbp3d;
+  const Standard_Integer nbp2d;
+  const Standard_Boolean p2donfirst;
 };
 
-
-
-
-
-
-
 #endif // _BRepApprox_TheMultiLineOfApprox_HeaderFile
index 9dc4e638e8ccad90f2e48d66103e252bea3ae960..9ba0cf32f2958b3c422deab00ef9359ab5b28946 100644 (file)
@@ -3039,8 +3039,6 @@ Standard_Boolean ChFi3d_ComputeCurves(const Handle(Adaptor3d_HSurface)&   S1,
   Standard_Real&              tolreached,
   const Standard_Boolean      wholeCurv) 
 {
-  Standard_Real Step = 0.1;
-
   gp_Pnt pdeb1 = S1->Value(Pardeb(1),Pardeb(2));
   gp_Pnt pfin1 = S1->Value(Parfin(1),Parfin(2));
   gp_Pnt pdeb2 = S2->Value(Pardeb(3),Pardeb(4));
@@ -3267,7 +3265,8 @@ Standard_Boolean ChFi3d_ComputeCurves(const Handle(Adaptor3d_HSurface)&   S1,
                 else         Ul = Uok;
               }
               else { // both projected, but where?
-                if (Uf == Ul) continue;
+                if (Abs(Uf - Ul) < Precision::PConfusion())
+                  continue;
               }
               ptestdeb = C3d->Value(Uf);
               ptestfin = C3d->Value(Ul);
@@ -3323,7 +3322,8 @@ Standard_Boolean ChFi3d_ComputeCurves(const Handle(Adaptor3d_HSurface)&   S1,
 
   // At this stage : 
   // classic intersections have failed, the path is approached in vain.
-  //  Standard_Real Step = 0.1;
+
+  Standard_Real Step = 0.1;
   for(;;) {
     //Attention the parameters of arrow for the path and
     //the tolerance for the approximation can't be taken as those of the  
@@ -3451,8 +3451,12 @@ Standard_Boolean ChFi3d_ComputeCurves(const Handle(Adaptor3d_HSurface)&   S1,
       //
       Handle(IntPatch_WLine)   WL = new IntPatch_WLine(L2S,Standard_False);
 
+#ifdef OCCT_DEBUG
+      //WL->Dump(0);
+#endif
+
       GeomInt_WLApprox approx;
-      approx.SetParameters(tolap,tol2d,4,8,0,1);
+      approx.SetParameters(tolap, tol2d, 4, 8, 0, 30, Standard_True);
       // manage here the approximations that are not useful on planes!
       approx.Perform(S1,S2,WL,
         Standard_True,Standard_True,Standard_True,
index 91832c5e044ec31adce89e02300ca59a37148ace..ae57b3ad197c76a82907b3e61ff577571a410fb5 100644 (file)
@@ -562,7 +562,7 @@ void GeomInt_IntSS::MakeCurve(const Standard_Integer Index,
       GeomInt_WLApprox theapp3d;
       Standard_Real tol2d = myTolApprox;
       //       
-      theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, Standard_True);
+      theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, 30, Standard_True);
 
       aNbParts=myLConstruct.NbParts();
       for (i=1; i<=aNbParts; i++) {
@@ -658,12 +658,17 @@ void GeomInt_IntSS::MakeCurve(const Standard_Integer Index,
   }// case IntPatch_Analytic:
   break;
 
-                          //########################################  
-                          // Walking
-                          //######################################## 
+  //########################################  
+  // Walking
+  //######################################## 
   case IntPatch_Walking:{
     Handle(IntPatch_WLine) WL = 
       Handle(IntPatch_WLine)::DownCast(L);
+
+#ifdef OCCT_DEBUG
+    //WL->Dump(0);
+#endif
+
     //
     Standard_Integer ifprm, ilprm;
     //
@@ -701,10 +706,10 @@ void GeomInt_IntSS::MakeCurve(const Standard_Integer Index,
       tol2d = myTolApprox;
       aTolSS=2.e-7;
       if(myHS1 == myHS2) { 
-        theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, Standard_False);     
+        theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, 30, Standard_False);
       }
       else { 
-        theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, Standard_True);
+        theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, 30, Standard_True);
       }
       //
       bIsDecomposited = 
@@ -749,7 +754,7 @@ void GeomInt_IntSS::MakeCurve(const Standard_Integer Index,
             if ((typs1==GeomAbs_BezierSurface || typs1==GeomAbs_BSplineSurface) &&
               (typs2==GeomAbs_BezierSurface || typs2==GeomAbs_BSplineSurface)) {
 
-                theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, Standard_True);
+                theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, 30, Standard_True);
                 //Standard_Boolean bUseSurfaces;
                 //bUseSurfaces=NotUseSurfacesForApprox(myFace1, myFace2, WL, ifprm,  ilprm);
                 //if (bUseSurfaces) {
@@ -2134,6 +2139,9 @@ void GeomInt_IntSS::TreatRLine(const Handle(IntPatch_RLine)& theRL,
     anAHC2d = theRL->ArcOnS1();
     theRL->ParamOnS1(tf, tl);
     theC2d1 = Geom2dAdaptor::MakeCurve(anAHC2d->Curve2d());
+    tf = Max(tf, theC2d1->FirstParameter());
+    tl = Min(tl, theC2d1->LastParameter());
+    theC2d1 = new Geom2d_TrimmedCurve(theC2d1, tf, tl);
   }
   else if (theRL->IsArcOnS2())
   {
@@ -2141,6 +2149,9 @@ void GeomInt_IntSS::TreatRLine(const Handle(IntPatch_RLine)& theRL,
     anAHC2d = theRL->ArcOnS2();
     theRL->ParamOnS2(tf, tl);
     theC2d2 = Geom2dAdaptor::MakeCurve(anAHC2d->Curve2d());
+    tf = Max(tf, theC2d2->FirstParameter());
+    tl = Min(tl, theC2d2->LastParameter());
+    theC2d2 = new Geom2d_TrimmedCurve(theC2d2, tf, tl);
   }
   else
   {
index aa296ca796b9abda38db8ee760345f90bfbc4d10..193bdef08ee75e1b71e92239247cdaaaa9d9d753 100644 (file)
@@ -83,54 +83,93 @@ public:
   Standard_EXPORT void Perform (const GeomInt_TheMultiLineOfWLApprox& Line);
   
   //! changes the degrees of the approximation.
-  Standard_EXPORT void SetDegrees (const Standard_Integer degreemin, const Standard_Integer degreemax);
+  Standard_EXPORT void SetDegrees ( const Standard_Integer degreemin,
+                                    const Standard_Integer degreemax)
+  {
+    mydegremin = degreemin;
+    mydegremax = degreemax;
+  }
   
   //! Changes the tolerances of the approximation.
-  Standard_EXPORT void SetTolerances (const Standard_Real Tolerance3d, const Standard_Real Tolerance2d);
+  Standard_EXPORT void SetTolerances (const Standard_Real Tolerance3d,
+                                      const Standard_Real Tolerance2d)
+  {
+    mytol3d = Tolerance3d;
+    mytol2d = Tolerance2d;
+  }
   
   //! changes the first and the last constraint points.
-  Standard_EXPORT void SetConstraints (const AppParCurves_Constraint firstC, const AppParCurves_Constraint lastC);
+  Standard_EXPORT void SetConstraints ( const AppParCurves_Constraint FirstC,
+                                        const AppParCurves_Constraint LastC)
+  {
+    myfirstC = FirstC;
+    mylastC = LastC;
+  }
   
   //! returns False if at a moment of the approximation,
   //! the status NoApproximation has been sent by the user
   //! when more points were needed.
-  Standard_EXPORT Standard_Boolean IsAllApproximated() const;
+  Standard_EXPORT Standard_Boolean IsAllApproximated() const
+  {
+    return alldone;
+  }
   
   //! returns False if the status NoPointsAdded has been sent.
-  Standard_EXPORT Standard_Boolean IsToleranceReached() const;
+  Standard_EXPORT Standard_Boolean IsToleranceReached() const
+  {
+    return tolreached;
+  }
   
   //! returns the tolerances 2d and 3d of the <Index> MultiCurve.
-  Standard_EXPORT void Error (const Standard_Integer Index, Standard_Real& tol3d, Standard_Real& tol2d) const;
+  Standard_EXPORT void Error (const Standard_Integer Index, Standard_Real& tol3d,
+                              Standard_Real& tol2d) const
+  {
+    tol3d = Tolers3d.Value(Index);
+    tol2d = Tolers2d.Value(Index);
+  }
   
   //! Returns the number of MultiCurve doing the approximation
   //! of the MultiLine.
-  Standard_EXPORT Standard_Integer NbMultiCurves() const;
+  Standard_EXPORT Standard_Integer NbMultiCurves() const
+  {
+    return myMultiCurves.Length();
+  }
   
   //! returns the result of the approximation.
-  Standard_EXPORT const AppParCurves_MultiCurve& Value (const Standard_Integer Index = 1) const;
+  Standard_EXPORT const AppParCurves_MultiCurve& 
+                                        Value (const Standard_Integer Index = 1) const
+  {
+    return myMultiCurves.Value(Index);
+  }
   
   //! returns the result of the approximation.
-  Standard_EXPORT AppParCurves_MultiCurve& ChangeValue (const Standard_Integer Index = 1);
+  Standard_EXPORT AppParCurves_MultiCurve& ChangeValue (const Standard_Integer Index = 1)
+  {
+    return myMultiCurves.ChangeValue(Index);
+  }
   
   //! returns the result of the approximation.
   Standard_EXPORT const AppParCurves_MultiBSpCurve& SplineValue();
   
   //! returns the type  of  parametrization
-  Standard_EXPORT void Parametrization (Approx_ParametrizationType& partype) const;
-  
+  Standard_EXPORT Approx_ParametrizationType Parametrization () const
+  {
+    return Par;
+  }
+
   //! returns the new parameters of the approximation
   //! corresponding to the points of the multicurve <Index>.
-  Standard_EXPORT const TColStd_Array1OfReal& Parameters (const Standard_Integer Index = 1) const;
-
-
-
+  Standard_EXPORT const TColStd_Array1OfReal&
+                                        Parameters (const Standard_Integer Index = 1) const
+  {
+    return (myPar.Value(Index))->Array1();
+  }
 
 protected:
 
 
 
 
-
 private:
 
   
index 3582728aa1940a70b264d55afa98e402dd6cab88..24d75506b121b753fad7d64719149dbe29d2d798 100644 (file)
@@ -30,7 +30,9 @@
 #include <TColgp_Array1OfPnt2d.hxx>
 #include <TColgp_Array1OfVec.hxx>
 #include <TColgp_Array1OfVec2d.hxx>
-class IntPatch_WLine;
+#include <IntPatch_WLine.hxx>
+
+
 class ApproxInt_SvSurfaces;
 
 
@@ -41,58 +43,99 @@ public:
 
   DEFINE_STANDARD_ALLOC
 
-  
-  //! The  class   SvSurfaces     is used   when    the
-  //! approximation algorithm needs some extra points on
-  //! the line <line>. A New line  is then created which
-  //! shares  the    same  surfaces    and    functions.
-  //!
-  //! SvSurfaces is   a  deferred   class  which  allows
-  //! several implementations of  this  algorithm   with
-  //! different surfaces   (bi-parametric     ones,   or
+  //! The class SvSurfaces is used when the approximation algorithm 
+  //! needs some extra points on the line <line>. 
+  //! A New line  is then created which shares the same surfaces and functions.
+  //! SvSurfaces is a deferred class which allows several implementations of
+  //! this  algorithm with different surfaces (bi-parametric ones, or 
   //! implicit and biparametric ones)
-  Standard_EXPORT GeomInt_TheMultiLineOfWLApprox(const Handle(IntPatch_WLine)& line, const Standard_Address PtrSvSurfaces, const Standard_Integer NbP3d, const Standard_Integer NbP2d, const Standard_Real xo, const Standard_Real ax, const Standard_Real yo, const Standard_Real ay, const Standard_Real zo, const Standard_Real az, const Standard_Real u1o, const Standard_Real a1u, const Standard_Real v1o, const Standard_Real a1v, const Standard_Real u2o, const Standard_Real a2u, const Standard_Real v2o, const Standard_Real a2v, const Standard_Boolean P2DOnFirst, const Standard_Integer IndMin = 0, const Standard_Integer IndMax = 0);
+  Standard_EXPORT GeomInt_TheMultiLineOfWLApprox( const Handle(IntPatch_WLine)& line,
+                                                  const Standard_Address PtrSvSurfaces,
+                                                  const Standard_Integer NbP3d,
+                                                  const Standard_Integer NbP2d,
+                                                  const Standard_Boolean P2DOnFirst,
+                                                  const Standard_Integer IndMin = 0,
+                                                  const Standard_Integer IndMax = 0);
   
   //! No Extra points will be added on the current line
-  Standard_EXPORT GeomInt_TheMultiLineOfWLApprox(const Handle(IntPatch_WLine)& line, const Standard_Integer NbP3d, const Standard_Integer NbP2d, const Standard_Real xo, const Standard_Real ax, const Standard_Real yo, const Standard_Real ay, const Standard_Real zo, const Standard_Real az, const Standard_Real u1o, const Standard_Real a1u, const Standard_Real v1o, const Standard_Real a1v, const Standard_Real u2o, const Standard_Real a2u, const Standard_Real v2o, const Standard_Real a2v, const Standard_Boolean P2DOnFirst, const Standard_Integer IndMin = 0, const Standard_Integer IndMax = 0);
+  Standard_EXPORT GeomInt_TheMultiLineOfWLApprox( const Handle(IntPatch_WLine)& line,
+                                                  const Standard_Integer NbP3d,
+                                                  const Standard_Integer NbP2d,
+                                                  const Standard_Boolean P2DOnFirst,
+                                                  const Standard_Integer IndMin = 0,
+                                                  const Standard_Integer IndMax = 0);
   
-  Standard_EXPORT Standard_Integer FirstPoint() const;
-  
-  Standard_EXPORT Standard_Integer LastPoint() const;
-  
-  //! Returns the number of 2d points of a TheLine.
-  Standard_EXPORT Standard_Integer NbP2d() const;
+  Standard_EXPORT Standard_Integer FirstPoint() const
+  {
+    return indicemin;
+  }
   
+  Standard_EXPORT Standard_Integer LastPoint() const
+  {
+    return indicemax;
+  }
+
+  Standard_EXPORT Approx_Status WhatStatus() const
+  {
+    if(PtrOnmySvSurfaces)
+      return(Approx_PointsAdded);
+    else 
+      return(Approx_NoPointsAdded);
+  }
+
   //! Returns the number of 3d points of a TheLine.
-  Standard_EXPORT Standard_Integer NbP3d() const;
+  Standard_EXPORT Standard_Integer NbP3d() const
+  {
+    return nbp3d;
+  }
   
-  Standard_EXPORT Approx_Status WhatStatus() const;
+  //! Returns the number of 2d points of a TheLine.
+  Standard_EXPORT Standard_Integer NbP2d() const
+  {
+    return nbp2d;
+  }
   
-  //! returns the 3d points of the multipoint <MPointIndex>
-  //! when only 3d points exist.
-  Standard_EXPORT void Value (const Standard_Integer MPointIndex, TColgp_Array1OfPnt& tabPt) const;
+  //! Returns the 3d points of the multipoint <MPointIndex> when only 3d points exist.
+  Standard_EXPORT void Value (const Standard_Integer MPointIndex,
+                              TColgp_Array1OfPnt& tabPt) const
+  {
+    tabPt(1) = myLine->Point(MPointIndex).Value();
+  }
   
-  //! returns the 2d points of the multipoint <MPointIndex>
-  //! when only 2d points exist.
-  Standard_EXPORT void Value (const Standard_Integer MPointIndex, TColgp_Array1OfPnt2d& tabPt2d) const;
+  //! returns the 3d and 2d points of the multipoint <MPointIndex>.
+  Standard_EXPORT void Value (const Standard_Integer MPointIndex,
+                              TColgp_Array1OfPnt& tabPt, TColgp_Array1OfPnt2d& tabPt2d) const
+  {
+    Value(MPointIndex, tabPt);
+    Value(MPointIndex, tabPt2d);
+  }
   
-  //! returns the 3d and 2d points of the multipoint
-  //! <MPointIndex>.
-  Standard_EXPORT void Value (const Standard_Integer MPointIndex, TColgp_Array1OfPnt& tabPt, TColgp_Array1OfPnt2d& tabPt2d) const;
+  //! Returns the 2d points of the multipoint <MPointIndex> when only 2d points exist.
+  Standard_EXPORT void Value (const Standard_Integer MPointIndex,
+                              TColgp_Array1OfPnt2d& tabPt2d) const;  
   
-  //! returns the 3d points of the multipoint <MPointIndex>
-  //! when only 3d points exist.
-  Standard_EXPORT Standard_Boolean Tangency (const Standard_Integer MPointIndex, TColgp_Array1OfVec& tabV) const;
+  //! Returns the 3d tangency points of the multipoint <MPointIndex> only
+  //! when 3d points exist.
+  Standard_EXPORT Standard_Boolean Tangency ( const Standard_Integer MPointIndex,
+                                              TColgp_Array1OfVec& tabV) const;
   
-  //! returns the 2d tangency points of the multipoint
-  //! <MPointIndex> only when 2d points exist.
-  Standard_EXPORT Standard_Boolean Tangency (const Standard_Integer MPointIndex, TColgp_Array1OfVec2d& tabV2d) const;
+  //! Returns the 2d tangency points of the multipoint <MPointIndex> only
+  //! when 2d points exist.
+  Standard_EXPORT Standard_Boolean Tangency ( const Standard_Integer MPointIndex,
+                                              TColgp_Array1OfVec2d& tabV2d) const;
   
-  //! returns the 3d and 2d points of the multipoint
-  //! <MPointIndex>.
-  Standard_EXPORT Standard_Boolean Tangency (const Standard_Integer MPointIndex, TColgp_Array1OfVec& tabV, TColgp_Array1OfVec2d& tabV2d) const;
+  //! Returns the 3d and 2d points of the multipoint <MPointIndex>.
+  Standard_EXPORT Standard_Boolean Tangency ( const Standard_Integer MPointIndex,
+                                              TColgp_Array1OfVec& tabV,
+                                              TColgp_Array1OfVec2d& tabV2d) const
+  {
+    return (Tangency(MPointIndex, tabV) && Tangency(MPointIndex, tabV2d));
+  }
   
-  Standard_EXPORT GeomInt_TheMultiLineOfWLApprox MakeMLBetween (const Standard_Integer Low, const Standard_Integer High, const Standard_Integer NbPointsToInsert) const;
+  Standard_EXPORT GeomInt_TheMultiLineOfWLApprox
+                          MakeMLBetween ( const Standard_Integer Low,
+                                          const Standard_Integer High,
+                                          const Standard_Integer NbPointsToInsert) const;
   
   //! Dump of the current multi-line.
   Standard_EXPORT void Dump() const;
@@ -101,44 +144,16 @@ public:
 
 
 protected:
-
-
-
-
+  GeomInt_TheMultiLineOfWLApprox operator=(GeomInt_TheMultiLineOfWLApprox&);
 
 private:
-
-
-
-  Standard_Address PtrOnmySvSurfaces;
-  Handle(IntPatch_WLine) myLine;
-  Standard_Integer indicemin;
-  Standard_Integer indicemax;
-  Standard_Integer nbp3d;
-  Standard_Integer nbp2d;
-  Standard_Boolean p2donfirst;
-  Standard_Real Xo;
-  Standard_Real Ax;
-  Standard_Real Yo;
-  Standard_Real Ay;
-  Standard_Real Zo;
-  Standard_Real Az;
-  Standard_Real U1o;
-  Standard_Real A1u;
-  Standard_Real V1o;
-  Standard_Real A1v;
-  Standard_Real U2o;
-  Standard_Real A2u;
-  Standard_Real V2o;
-  Standard_Real A2v;
-
-
+  const Standard_Address PtrOnmySvSurfaces;
+  const Handle(IntPatch_WLine) myLine;
+  const Standard_Integer indicemin;
+  const Standard_Integer indicemax;
+  const Standard_Integer nbp3d;
+  const Standard_Integer nbp2d;
+  const Standard_Boolean p2donfirst;
 };
 
-
-
-
-
-
-
 #endif // _GeomInt_TheMultiLineOfWLApprox_HeaderFile
index b86aadc441414c3605a3eb8c44ab842bac5df12e..91d1a40b49251e0f70e8f67f78f1fed04bcac360 100644 (file)
@@ -63,9 +63,15 @@ public:
   
   Standard_EXPORT void Perform (const Handle(IntPatch_WLine)& aLine, const Standard_Boolean ApproxXYZ = Standard_True, const Standard_Boolean ApproxU1V1 = Standard_True, const Standard_Boolean ApproxU2V2 = Standard_True, const Standard_Integer indicemin = 0, const Standard_Integer indicemax = 0);
   
-  Standard_EXPORT void SetParameters (const Standard_Real Tol3d, const Standard_Real Tol2d, const Standard_Integer DegMin, const Standard_Integer DegMax, const Standard_Integer NbIterMax, const Standard_Boolean ApproxWithTangency = Standard_True, const Approx_ParametrizationType Parametrization = Approx_ChordLength);
-  
-  Standard_EXPORT void SetParameters (const Standard_Real Tol3d, const Standard_Real Tol2d, const Standard_Boolean RelativeTol, const Standard_Integer DegMin, const Standard_Integer DegMax, const Standard_Integer NbIterMax, const Standard_Integer NbPntMax, const Standard_Boolean ApproxWithTangency = Standard_True, const Approx_ParametrizationType Parametrization = Approx_ChordLength);
+  Standard_EXPORT 
+      void SetParameters (const Standard_Real Tol3d, const Standard_Real Tol2d,
+                          const Standard_Integer DegMin, 
+                          const Standard_Integer DegMax,
+                          const Standard_Integer NbIterMax,
+                          const Standard_Integer NbPntMax = 30,
+                          const Standard_Boolean ApproxWithTangency = Standard_True,
+                          const Approx_ParametrizationType
+                                          Parametrization = Approx_ChordLength);
   
   Standard_EXPORT void Perform();
   
@@ -77,7 +83,8 @@ public:
   
   Standard_EXPORT Standard_Integer NbMultiCurves() const;
   
-  Standard_EXPORT const AppParCurves_MultiBSpCurve& Value (const Standard_Integer Index) const;
+  Standard_EXPORT const AppParCurves_MultiBSpCurve&
+                                      Value (const Standard_Integer Index) const;
 
 
 
@@ -90,11 +97,19 @@ protected:
 
 private:
 
-  Standard_EXPORT Standard_Integer CorrectFinishIdx(const Standard_Integer theMinIdx,
-                                                    const Standard_Integer theMaxIdx,
-                                                    const Handle(IntPatch_WLine)& theline);
-
-  Standard_EXPORT void Perform (const Handle(Adaptor3d_HSurface)& Surf1, const IntSurf_Quadric& Surf2, const Handle(IntPatch_WLine)& aLine, const Standard_Boolean ApproxXYZ, const Standard_Boolean ApproxU1V1, const Standard_Boolean ApproxU2V2, const Standard_Integer indicemin, const Standard_Integer indicemax);
+Standard_EXPORT Standard_Integer
+                    CorrectFinishIdx( const Standard_Integer theMinIdx,
+                                      const Standard_Integer theMaxIdx,
+                                      const Handle(IntPatch_WLine)& theline);
+
+  Standard_EXPORT void Perform (const Handle(Adaptor3d_HSurface)& Surf1,
+                                const IntSurf_Quadric& Surf2,
+                                const Handle(IntPatch_WLine)& aLine,
+                                const Standard_Boolean ApproxXYZ,
+                                const Standard_Boolean ApproxU1V1,
+                                const Standard_Boolean ApproxU2V2,
+                                const Standard_Integer indicemin,
+                                const Standard_Integer indicemax);
   
   Standard_EXPORT void Perform (const IntSurf_Quadric& Surf1, const Handle(Adaptor3d_HSurface)& Surf2, const Handle(IntPatch_WLine)& aLine, const Standard_Boolean ApproxXYZ, const Standard_Boolean ApproxU1V1, const Standard_Boolean ApproxU2V2, const Standard_Integer indicemin, const Standard_Integer indicemax);
   
@@ -104,22 +119,16 @@ private:
   GeomInt_TheComputeLineOfWLApprox myComputeLine;
   GeomInt_TheComputeLineBezierOfWLApprox myComputeLineBezier;
   Approx_MCurvesToBSpCurve myBezToBSpl;
-  Standard_Boolean myTolReached;
   Standard_Boolean myApproxBez;
   Standard_Boolean myWithTangency;
   Standard_Real myTol3d;
   Standard_Real myTol2d;
-  Standard_Boolean myRelativeTol;
   Standard_Integer myDegMin;
   Standard_Integer myDegMax;
   Standard_Integer myNbPntMax;
   Standard_Integer myNbIterMax;
-  Standard_Real myMinFactorXYZ;
-  Standard_Real myMinFactorUV;
   Standard_Real myTolReached3d;
   Standard_Real myTolReached2d;
-
-
 };
 
 
index 084c495e975837968caa1a543d71bf88bdc455d1..3effd51944493fcce65bbc294a45debf767a81eb 100644 (file)
@@ -280,16 +280,14 @@ static Standard_Integer extrema(Draw_Interpretor& di, Standard_Integer n, const
 //function : intersect
 //purpose  : 
 //=======================================================================
-
 static Standard_Integer intersect(Draw_Interpretor& di, Standard_Integer n, const char** a)
 {
   if( n < 2) 
   {
-#ifdef OCCT_DEBUG
     cout<< "2dintersect curve curve [Tol]"<<endl;
-#endif
     return 1;
   }
+
   Standard_Integer k = 1;
   Handle(Geom2d_Curve) C1 = DrawTrSurf::GetCurve2d(a[k++]);
   if ( C1.IsNull()) 
@@ -331,6 +329,7 @@ static Standard_Integer intersect(Draw_Interpretor& di, Standard_Integer n, cons
   Handle(Geom2d_Curve) S1,S2;
   Handle(DrawTrSurf_Curve2d) CD;
   for ( i = 1; i <= Intersector.NbSegments(); i++) {
+    di << "Segment #" << i << " found.\n";
     Intersector.Segment(i,S1,S2);
     CD = new DrawTrSurf_Curve2d(S1, Draw_bleu, 30);
     dout << CD;
index a673935bb49137935b0654e827c0e350c737f4a1..44beb3840339d4719bcf74c2324e741ff4f6c07e 100644 (file)
@@ -450,7 +450,7 @@ void  HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
                  
                   //-- cout<<"\nHLRTopoBRep_DSFiller : nbp="<<nbp<<"  Tol3d="<<TOL3d<<"   Tol2d="<<TOL2d<<endl;
 
-                  Approx.SetParameters(TOL3d,TOL2d,dmin,dmax,niter,tg);
+                  Approx.SetParameters(TOL3d, TOL2d, dmin, dmax, niter, 30, tg);
                   Approx.Perform(AppLine,Standard_True,Standard_True,Standard_False,1,nbp);
                   if (!Approx.IsDone()) {
                     C = AppC;
index 3e4c7db594605632cbe0241f8f56c95e9ef73383..b62f5260d444f95aba0e43f6e437cf3473384557 100644 (file)
@@ -420,6 +420,136 @@ static void JoinWLines(IntPatch_SequenceOfLine& theSlin,
   }
 }
 
+//=======================================================================
+//function : CleanWline
+//purpose  : Iterates set of points in theWline and removes several of it
+//            if they led to too non-uniform distribution.
+//ATTENTION!!!
+//          1. Removed point must not be vertex.
+//          2. In the future, this method should be improved to make it more universal.
+//            Now, it is created only in order to avoid regressions.
+//=======================================================================
+static void CleanWline( const GeomAbs_SurfaceType theTypeS1,
+                        const GeomAbs_SurfaceType theTypeS2,
+                        const Handle(IntPatch_WLine)& theWline)
+{
+  const Standard_Real aFactor = 100.0;
+  const Standard_Integer aNbVertices = theWline->NbVertex();
+
+  Standard_Boolean  isSurfS1WithSeam = (theTypeS1 == GeomAbs_Cylinder) ||
+                                      (theTypeS1 == GeomAbs_Cone) ||
+                                      (theTypeS1 == GeomAbs_Sphere) ||
+                                      (theTypeS1 == GeomAbs_Torus) ||
+                                      (theTypeS1 == GeomAbs_SurfaceOfRevolution),
+                    isSurfS2WithSeam = (theTypeS2 == GeomAbs_Cylinder) ||
+                                      (theTypeS2 == GeomAbs_Cone) ||
+                                      (theTypeS2 == GeomAbs_Sphere) ||
+                                      (theTypeS2 == GeomAbs_Torus) ||
+                                      (theTypeS2 == GeomAbs_SurfaceOfRevolution);
+
+  if(!isSurfS1WithSeam && !isSurfS2WithSeam)
+    return;
+
+  //Sometimes WLine contains several vertices which have same ParameterOnLine
+  //(i.e. one IntSurf_PntOn2S is marked by several vertices).
+  //However, neighbour points should be deleted once. To provide it, we enter
+  //following variable.
+  Standard_Integer aVertIndPrev = -1;
+
+  for(Standard_Integer aVertID = 1; aVertID <= aNbVertices; aVertID++)
+  {
+    Standard_Integer aRemoveInd = -1;
+    const IntPatch_Point& aVert = theWline->Vertex(aVertID);
+    
+    {
+      //Consider only vertices which in the seam. Another vertices are rejected.
+      Standard_Real u1 = 0.0, v1 = 0.0, u2 = 0.0, v2 = 0.0;
+      aVert.Parameters(u1, v1, u2, v2);
+      if( (!isSurfS1WithSeam || (!IsEqual(u1, 0.0) && !IsEqual(u1, 2.0*M_PI))) &&
+          (!isSurfS2WithSeam || (!IsEqual(u2, 0.0) && !IsEqual(u2, 2.0*M_PI))))
+        continue;
+    }
+
+    const Standard_Integer aVertInd = static_cast<Standard_Integer>(aVert.ParameterOnLine());
+
+    if(aVertInd == aVertIndPrev)
+    {//Go to the next vertex, whose ParameterOnLine is different from aVertInd.
+      continue;
+    }
+
+    aVertIndPrev = aVertInd;
+
+    //This condition should be removed (it is added in order to make checking easier)
+    if((aVertInd == 1) || (aVertInd == theWline->NbPnts()))
+      continue;
+
+    const gp_Pnt  &aPCurr = aVert.Value();
+    const gp_Pnt  &aPPrev = theWline->Curve()->Value(aVertInd-1).Value(),
+                  &aPNext = theWline->Curve()->Value(aVertInd+1).Value();
+
+    const Standard_Real aSqD1 = aPCurr.SquareDistance(aPPrev),
+                        aSqD2 = aPCurr.SquareDistance(aPNext);
+
+    if(aSqD1 > aFactor*aSqD2)
+    {
+      aRemoveInd = aVertInd+1;
+
+      //Check, if removed point is not the Vertex
+      if(aVertID < aNbVertices)
+      {
+        Standard_Integer aNextVertParam = static_cast<Standard_Integer>(theWline->Vertex(aVertID+1).ParameterOnLine());
+        if(aNextVertParam == aRemoveInd)
+        {//The candidate is the Vertex. Removing is forbidden.
+          aRemoveInd = -1;
+        }
+      }
+    }
+    else if(aSqD2 > aFactor*aSqD1)
+    {
+      aRemoveInd = aVertInd-1;
+
+      //Check, if removed point is not the Vertex
+      if(aVertID > 1)
+      {
+        Standard_Integer aNextVertParam = static_cast<Standard_Integer>(theWline->Vertex(aVertID-1).ParameterOnLine());
+        if(aNextVertParam == aRemoveInd)
+        {//The candidate is the Vertex. Removing is forbidden.
+          aRemoveInd = -1;
+        }
+      }
+    }
+    else
+    {
+      aRemoveInd = -1;
+    }
+
+    if(aRemoveInd < 1)
+      continue;
+
+    //Removing
+    theWline->Curve()->RemovePoint(aRemoveInd);
+
+    //After removing points, ParameterOnLine for some vertices should be shifted
+    //(usualy it means the number of this vertex in
+    //the sequence of Walking-line points).
+    for(Standard_Integer aVID = 1; aVID <= aNbVertices; aVID++)
+    {
+      const Standard_Integer aVertParam = 
+            static_cast<Standard_Integer>(theWline->Vertex(aVID).ParameterOnLine());
+      
+      if(aVertParam < aRemoveInd)
+        continue;
+
+      IntPatch_Point aVertTemp(theWline->Vertex(aVID));
+      aVertTemp.SetParameter(aVertParam-1);
+      theWline->Replace(aVID, aVertTemp);
+
+      if(aVID == aVertID)
+        aVertIndPrev--;
+    }
+  }//for(Standard_Integer aVertID = 1; aVertID <= aNbVertices; aVertID++)
+}
+
 //======================================================================
 // function: SequenceOfLine
 //======================================================================
@@ -1336,6 +1466,14 @@ void IntPatch_Intersection::Perform(const Handle(Adaptor3d_HSurface)&  theS1,
     ParamParamPerfom(theS1, theD1, theS2, theD2, TolArc,
                         TolTang, ListOfPnts, RestrictLine, typs1, typs2);
   }
+
+  for(Standard_Integer i = slin.Lower(); i <= slin.Upper(); i++)
+  {
+    const Handle(IntPatch_WLine) WL = Handle(IntPatch_WLine)::DownCast(slin(i));
+
+    if(!WL.IsNull())
+      CleanWline(typs1, typs2, WL);
+  }
 }
 
 //=======================================================================
@@ -1555,6 +1693,14 @@ void IntPatch_Intersection::Perform(const Handle(Adaptor3d_HSurface)&  theS1,
               TolArc, TolTang, ListOfPnts, RestrictLine, typs1, typs2);
     }
   }
+
+  for(Standard_Integer i = slin.Lower(); i <= slin.Upper(); i++)
+  {
+    const Handle(IntPatch_WLine) WL = Handle(IntPatch_WLine)::DownCast(slin(i));
+
+    if(!WL.IsNull())
+      CleanWline(typs1, typs2, WL);
+  }
 }
 
 //=======================================================================
index 349393db336ab991958046d23db5497b3d987984..1d6f1acb27bcb7ae1543932de73b09ac4a5151cf 100644 (file)
@@ -1394,7 +1394,7 @@ void IntTools_FaceFace::MakeCurve(const Standard_Integer Index,
       // 
       Standard_Real tol2d = myTolApprox;
       //         
-      theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, Standard_True);
+      theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, 30, Standard_True);
       
       aNbParts=myLConstruct.NbParts();
       for (i=1; i<=aNbParts; i++) {
@@ -1578,17 +1578,18 @@ void IntTools_FaceFace::MakeCurve(const Standard_Integer Index,
       }
         
       if(myHS1 == myHS2) { 
-        theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, Standard_False, aParType);
+        theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, 30, Standard_False, aParType);
         rejectSurface = Standard_True;
       }
       else { 
         if(reApprox && !rejectSurface)
-          theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, Standard_False, aParType);
+          theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, 30, Standard_False, aParType);
         else {
           Standard_Integer iDegMax, iDegMin, iNbIter;
           //
           ApproxParameters(myHS1, myHS2, iDegMin, iDegMax, iNbIter);
-          theapp3d.SetParameters(myTolApprox, tol2d, iDegMin, iDegMax, iNbIter, Standard_True, aParType);
+          theapp3d.SetParameters(myTolApprox, tol2d, iDegMin, iDegMax,
+                                                  iNbIter, 30, Standard_True, aParType);
         }
       }
       //
@@ -1654,7 +1655,8 @@ void IntTools_FaceFace::MakeCurve(const Standard_Integer Index,
             if ((typs1==GeomAbs_BezierSurface || typs1==GeomAbs_BSplineSurface) &&
                 (typs2==GeomAbs_BezierSurface || typs2==GeomAbs_BSplineSurface)) {
              
-              theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, Standard_True, aParType);
+              theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, 30,
+                                                                Standard_True, aParType);
               
               Standard_Boolean bUseSurfaces;
               bUseSurfaces = IntTools_WLineTool::NotUseSurfacesForApprox(myFace1, myFace2, WL, ifprm,  ilprm);
@@ -1662,7 +1664,8 @@ void IntTools_FaceFace::MakeCurve(const Standard_Integer Index,
                 // ######
                 rejectSurface = Standard_True;
                 // ######
-                theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, Standard_False, aParType);
+                theapp3d.SetParameters(myTolApprox, tol2d, 4, 8, 0, 30,
+                                                                Standard_False, aParType);
               }
             }
           }
index e7711308128dc2020efed8175155af06adaccd49..319ab4a231c44002fc547cb4872be649178d6518 100644 (file)
@@ -19,6 +19,7 @@ QABugs_16.cxx
 QABugs_17.cxx
 QABugs_18.cxx
 QABugs_19.cxx
+QABugs_20.cxx
 QABugs_MyText.cxx
 QABugs_MyText.hxx
 QABugs_PresentableObject.cxx
index 06807c966c4e61b927a80511109ab0a8ad1e8ae7..9449d710009cf95ece7ff5e1da07a65cbed7f647 100644 (file)
@@ -35,6 +35,7 @@ void QABugs::Commands(Draw_Interpretor& theCommands) {
   QABugs::Commands_17(theCommands);
   QABugs::Commands_18(theCommands);
   QABugs::Commands_19(theCommands);
+  QABugs::Commands_20(theCommands);
 
   return;
 }
index fa3a47a3f540323e9b40223ff28f9732c2f6cd48..bfd1a989cb282abc2945a5dd73cae399b1ca2244 100644 (file)
@@ -73,6 +73,7 @@ public:
   
   Standard_EXPORT static void Commands_19 (Draw_Interpretor& DI);
 
+  Standard_EXPORT static void Commands_20 (Draw_Interpretor& DI);
 
 
 
index b619e3f63fa4b75bf2211b04533840ece32dced1..a5cb2dd91e8608650e22b3f2ab486f7680f6d89b 100644 (file)
@@ -1695,14 +1695,9 @@ static Standard_Integer OCC708 (Draw_Interpretor& di, Standard_Integer argc, con
 //purpose  :
 //=======================================================================
 #include <TColStd_Array2OfInteger.hxx>
-static Standard_Integer OCC670 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
+static Standard_Integer OCC670 (Draw_Interpretor&, Standard_Integer, const char **)
 {
-  if(argc != 1){
-    di<<"Usage : " << argv[0] << "\n";
-    return -1;
-  }
-  TColStd_Array2OfInteger Array2OfInteger(1,1,1,1);
-  Array2OfInteger.SetValue(5,5,55);
+  Standard_OutOfRange::Raise();
   return 0;
 }
 
diff --git a/src/QABugs/QABugs_20.cxx b/src/QABugs/QABugs_20.cxx
new file mode 100644 (file)
index 0000000..bcb373a
--- /dev/null
@@ -0,0 +1,1251 @@
+// Created on: 2015-10-26
+// Created by: Nikolai BUKHALOV
+// Copyright (c) 2002-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <QABugs.hxx>
+
+#include <gp_Ax2.hxx>
+#include <Geom_Circle.hxx>
+#include <Geom_SurfaceOfLinearExtrusion.hxx>
+#include <TColgp_Array2OfPnt.hxx>
+#include <TColStd_Array2OfReal.hxx>
+#include <TColStd_Array1OfReal.hxx>
+#include <TColStd_Array1OfInteger.hxx>
+#include <Geom_BSplineSurface.hxx>
+#include <DrawTrSurf.hxx>
+
+//=======================================================================
+//function : SurfaceGenOCC26675_1 
+//purpose  : Generates a surface for intersect (in corresponding
+//            test case). If we save these surfaces to the disk
+//            then bug will not be reproduced. Therefore, this generator
+//            is very important (despite its taking many lines of the code).
+//=======================================================================
+static Standard_Integer SurfaceGenOCC26675_1( Draw_Interpretor& theDI,
+                                              Standard_Integer  theNArg,
+                                              const char ** theArgVal)
+{
+
+  if(theNArg < 2)
+  {
+    theDI << "Use OCC26675_1 result\n";
+    return 1;
+  }
+
+  const gp_Pnt aCircCenter(-112.93397037070100000000, +177.52792379072199000000, +10.63374076104853900000);
+  const gp_Dir aCircN(+0.00000000000000000000, +1.00000000000000000000, +0.00000000000000000000);
+  const gp_Dir aCircX(+0.00000000000000000000, -0.00000000000000000000, +1.00000000000000000000);
+  const gp_Dir anExtrDir(-500.00000000000000000000, -866.02540378443609000000, +0.00000000000000000000);
+  const gp_Ax2 aCircAxes(aCircCenter, aCircN, aCircX);
+  const Handle(Geom_Curve) aCurv = new Geom_Circle(aCircAxes, +50.00000000000000000000);
+
+  const Handle(Geom_Surface) aS2 = new Geom_SurfaceOfLinearExtrusion(aCurv, anExtrDir);
+
+  TColgp_Array2OfPnt aPoles(1, 7, 1, 81);
+  TColStd_Array2OfReal aWeights(1, 7, 1, 81);
+  TColStd_Array1OfReal aUKnots(1, 2), aVKnots(1, 12);
+  TColStd_Array1OfInteger aUMult(1, 2), aVMult(1, 12);
+  const Standard_Integer aUDegree = 6, aVDegree = 8;
+
+  aUKnots(1) = +0.00000000000000000000;
+  aUKnots(2) = +1.00000000000000000000;
+  aVKnots(1) = +0.08911853946147080300;
+  aVKnots(2) = +0.11779167587451674000;
+  aVKnots(3) = +0.14583467562325506000;
+  aVKnots(4) = +0.20255081178503931000;
+  aVKnots(5) = +0.25926694794682359000;
+  aVKnots(6) = +0.31598308410860781000;
+  aVKnots(7) = +0.34262437462234741000;
+  aVKnots(8) = +0.37067364397889985000;
+  aVKnots(9) = +0.39731552779654306000;
+  aVKnots(10) = +0.42536420384919182000;
+  aVKnots(11) = +0.45200329235672548000;
+  aVKnots(12) = +0.47802918742799144000;
+
+  aUMult(1) = 7;
+  aUMult(2) = 7;
+  aVMult(1) = 9;
+  aVMult(2) = 7;
+  aVMult(3) = 7;
+  aVMult(4) = 7;
+  aVMult(5) = 7;
+  aVMult(6) = 7;
+  aVMult(7) = 7;
+  aVMult(8) = 7;
+  aVMult(9) = 7;
+  aVMult(10) = 8;
+  aVMult(11) = 8;
+  aVMult(12) = 9;
+
+  ////
+  {
+    aWeights.ChangeValue(1, 1) = +1.02986327036737910000;
+    aPoles.ChangeValue(1, 1) = gp_Pnt(+131.75315905495660000000, +2.88570510351864900000, -66.24709307590461500000);
+    aWeights.ChangeValue(1, 2) = +1.02989244478761060000;
+    aPoles.ChangeValue(1, 2) = gp_Pnt(+128.70876344053133000000, +2.88791208181246970000, -67.92914281439198000000);
+    aWeights.ChangeValue(1, 3) = +1.02991676091113950000;
+    aPoles.ChangeValue(1, 3) = gp_Pnt(+125.64133203841195000000, +2.88975018186799830000, -69.56968825975690200000);
+    aWeights.ChangeValue(1, 4) = +1.02993613450133650000;
+    aPoles.ChangeValue(1, 4) = gp_Pnt(+122.55164101294532000000, +2.89121448973680460000, -71.16831921321855200000);
+    aWeights.ChangeValue(1, 5) = +1.02995970896170810000;
+    aPoles.ChangeValue(1, 5) = gp_Pnt(+119.44028474076808000000, +2.89299532863950050000, -72.72471137484106400000);
+    aWeights.ChangeValue(1, 6) = +1.02998196300928410000;
+    aPoles.ChangeValue(1, 6) = gp_Pnt(+116.30796917345266000000, +2.89467567823625730000, -74.23853925439507900000);
+    aWeights.ChangeValue(1, 7) = +1.02999781361772440000;
+    aPoles.ChangeValue(1, 7) = gp_Pnt(+113.15537818476763000000, +2.89587201010380560000, -75.70949847615843000000);
+    aWeights.ChangeValue(1, 8) = +1.03001626830283270000;
+    aPoles.ChangeValue(1, 8) = gp_Pnt(+109.98323502828077000000, +2.89726468512897210000, -77.13723994508107800000);
+    aWeights.ChangeValue(1, 9) = +1.03004822145815230000;
+    aPoles.ChangeValue(1, 9) = gp_Pnt(+103.60126699909762000000, +2.89967510685080440000, -79.90571269046952800000);
+    aWeights.ChangeValue(1, 10) = +1.03006364818936770000;
+    aPoles.ChangeValue(1, 10) = gp_Pnt(+100.39144092265354000000, +2.90083845616186050000, -81.24644132200651800000);
+    aWeights.ChangeValue(1, 11) = +1.03007725635592000000;
+    aPoles.ChangeValue(1, 11) = gp_Pnt(+97.16342330855667300000, +2.90186436688425700000, -82.54338871675531700000);
+    aWeights.ChangeValue(1, 12) = +1.03009045031501500000;
+    aPoles.ChangeValue(1, 12) = gp_Pnt(+93.91790293022438600000, +2.90285879918974650000, -83.79626764915399000000);
+    aWeights.ChangeValue(1, 13) = +1.03010285398183930000;
+    aPoles.ChangeValue(1, 13) = gp_Pnt(+90.65560197798836800000, +2.90379346029782100000, -85.00479786905465600000);
+    aWeights.ChangeValue(1, 14) = +1.03011393120350900000;
+    aPoles.ChangeValue(1, 14) = gp_Pnt(+87.37722618415423900000, +2.90462796925060120000, -86.16871841453435400000);
+    aWeights.ChangeValue(1, 15) = +1.03012484065787050000;
+    aPoles.ChangeValue(1, 15) = gp_Pnt(+84.08346762829417300000, +2.90544970249433290000, -87.28777941880029800000);
+    aWeights.ChangeValue(1, 16) = +1.03015471267321200000;
+    aPoles.ChangeValue(1, 16) = gp_Pnt(+74.15848807058078800000, +2.90769927244280210000, -90.50962423575197100000);
+    aWeights.ChangeValue(1, 17) = +1.03017194800922400000;
+    aPoles.ChangeValue(1, 17) = gp_Pnt(+67.48342008926763900000, +2.90899668032978950000, -92.47701903504494700000);
+    aWeights.ChangeValue(1, 18) = +1.03018680682765670000;
+    aPoles.ChangeValue(1, 18) = gp_Pnt(+60.75515833606132100000, +2.91011480947056490000, -94.26204121664201800000);
+    aWeights.ChangeValue(1, 19) = +1.03019958109549670000;
+    aPoles.ChangeValue(1, 19) = gp_Pnt(+53.97928154760177200000, +2.91107580930771360000, -95.86305268935117900000);
+    aWeights.ChangeValue(1, 20) = +1.03021050389503350000;
+    aPoles.ChangeValue(1, 20) = gp_Pnt(+47.16164692132413400000, +2.91189735380426780000, -97.27865560180262600000);
+    aWeights.ChangeValue(1, 21) = +1.03021974942385830000;
+    aPoles.ChangeValue(1, 21) = gp_Pnt(+40.30838837608569500000, +2.91259264267907050000, -98.50769317562559000000);
+    aWeights.ChangeValue(1, 22) = +1.03022743299486370000;
+    aPoles.ChangeValue(1, 22) = gp_Pnt(+33.42591476110869300000, +2.91317040233699530000, -99.54925039136011800000);
+    aWeights.ChangeValue(1, 23) = +1.03023979631718900000;
+    aPoles.ChangeValue(1, 23) = gp_Pnt(+19.61576136171939000000, +2.91409991934468550000, -101.25602945077115000000);
+    aWeights.ChangeValue(1, 24) = +1.03024450452679140000;
+    aPoles.ChangeValue(1, 24) = gp_Pnt(+12.68754355991407800000, +2.91445385083459700000, -101.92122234436175000000);
+    aWeights.ChangeValue(1, 25) = +1.03024781840890120000;
+    aPoles.ChangeValue(1, 25) = gp_Pnt(+5.74236948737514120000, +2.91470294045230770000, -102.39751844510502000000);
+    aWeights.ChangeValue(1, 26) = +1.03024979501192000000;
+    aPoles.ChangeValue(1, 26) = gp_Pnt(-1.21367831605073050000, +2.91485150371151920000, -102.68442590550356000000);
+    aWeights.ChangeValue(1, 27) = +1.03025046568879790000;
+    aPoles.ChangeValue(1, 27) = gp_Pnt(-8.17455041611474620000, +2.91490191238154670000, -102.78167594353056000000);
+    aWeights.ChangeValue(1, 28) = +1.03024983609703540000;
+    aPoles.ChangeValue(1, 28) = gp_Pnt(-15.13423127055194300000, +2.91485459458572780000, -102.68922293042964000000);
+    aWeights.ChangeValue(1, 29) = +1.03024788619868260000;
+    aPoles.ChangeValue(1, 29) = gp_Pnt(-22.08674002008992700000, +2.91470803482494080000, -102.40724441194320000000);
+    aWeights.ChangeValue(1, 30) = +1.03024126030624540000;
+    aPoles.ChangeValue(1, 30) = gp_Pnt(-35.96556766132121700000, +2.91420996731856930000, -101.46503408514069000000);
+    aWeights.ChangeValue(1, 31) = +1.03023657011944230000;
+    aPoles.ChangeValue(1, 31) = gp_Pnt(-42.89191729472150200000, +2.91385737699769360000, -100.80479886745856000000);
+    aWeights.ChangeValue(1, 32) = +1.03023047292900880000;
+    aPoles.ChangeValue(1, 32) = gp_Pnt(-49.79923779841396900000, +2.91339898565004060000, -99.95583114848535900000);
+    aWeights.ChangeValue(1, 33) = +1.03022290017099550000;
+    aPoles.ChangeValue(1, 33) = gp_Pnt(-56.68161614207340900000, +2.91282960709223810000, -98.91875138839027700000);
+    aWeights.ChangeValue(1, 34) = +1.03021374148842180000;
+    aPoles.ChangeValue(1, 34) = gp_Pnt(-63.53316994906088400000, +2.91214088593828220000, -97.69440448679608800000);
+    aWeights.ChangeValue(1, 35) = +1.03020284473128080000;
+    aPoles.ChangeValue(1, 35) = gp_Pnt(-70.34804877511381000000, +2.91132129711663760000, -96.28385939245710300000);
+    aWeights.ChangeValue(1, 36) = +1.03019001595653580000;
+    aPoles.ChangeValue(1, 36) = gp_Pnt(-77.12043535415037400000, +2.91035614521427500000, -94.68840860671046800000);
+    aWeights.ChangeValue(1, 37) = +1.03016805964614980000;
+    aPoles.ChangeValue(1, 37) = gp_Pnt(-86.96652166958519100000, +2.90870378328618400000, -92.08365976972685000000);
+    aWeights.ChangeValue(1, 38) = +1.03016062145972500000;
+    aPoles.ChangeValue(1, 38) = gp_Pnt(-90.07809790629383400000, +2.90814392820824040000, -91.21821667329717800000);
+    aWeights.ChangeValue(1, 39) = +1.03015268516758060000;
+    aPoles.ChangeValue(1, 39) = gp_Pnt(-93.17869710255469300000, +2.90754650188789080000, -90.31338955501080100000);
+    aWeights.ChangeValue(1, 40) = +1.03014422393874510000;
+    aPoles.ChangeValue(1, 40) = gp_Pnt(-96.26774201507643600000, +2.90690946644790090000, -89.36934028436292000000);
+    aWeights.ChangeValue(1, 41) = +1.03013520381253840000;
+    aPoles.ChangeValue(1, 41) = gp_Pnt(-99.34465666946248100000, +2.90623024256504880000, -88.38624129906430900000);
+    aWeights.ChangeValue(1, 42) = +1.03012558369857450000;
+    aPoles.ChangeValue(1, 42) = gp_Pnt(-102.40886646020824000000, +2.90550570939860810000, -87.36427556081821400000);
+    aWeights.ChangeValue(1, 43) = +1.03011531537676040000;
+    aPoles.ChangeValue(1, 43) = gp_Pnt(-105.45979824903711000000, +2.90473220450791560000, -86.30363650725728100000);
+    aWeights.ChangeValue(1, 44) = +1.03009266486593140000;
+    aPoles.ChangeValue(1, 44) = gp_Pnt(-111.76765655411073000000, +2.90302557752729130000, -84.02084620865503000000);
+    aWeights.ChangeValue(1, 45) = +1.03007954250893910000;
+    aPoles.ChangeValue(1, 45) = gp_Pnt(-115.02237879255169000000, +2.90203661863772000000, -82.79254553120374300000);
+    aWeights.ChangeValue(1, 46) = +1.03006700046846360000;
+    aPoles.ChangeValue(1, 46) = gp_Pnt(-118.26033551796380000000, +2.90109123094133370000, -81.51987347500843800000);
+    aWeights.ChangeValue(1, 47) = +1.03005153385518430000;
+    aPoles.ChangeValue(1, 47) = gp_Pnt(-121.48081153033489000000, +2.89992503429592440000, -80.20310945547186100000);
+    aWeights.ChangeValue(1, 48) = +1.03003663316288070000;
+    aPoles.ChangeValue(1, 48) = gp_Pnt(-124.68310204708784000000, +2.89880123910694910000, -78.84252385592422700000);
+    aWeights.ChangeValue(1, 49) = +1.03002002524051230000;
+    aPoles.ChangeValue(1, 49) = gp_Pnt(-127.86649232671233000000, +2.89754829341323060000, -77.43842231968982000000);
+    aWeights.ChangeValue(1, 50) = +1.03000192732161230000;
+    aPoles.ChangeValue(1, 50) = gp_Pnt(-131.03028254956638000000, +2.89618247462029290000, -75.99111259804850200000);
+    aWeights.ChangeValue(1, 51) = +1.02996526567113600000;
+    aPoles.ChangeValue(1, 51) = gp_Pnt(-137.09281139094972000000, +2.89341459629042360000, -73.11712223836046600000);
+    aWeights.ChangeValue(1, 52) = +1.02994403451589630000;
+    aPoles.ChangeValue(1, 52) = gp_Pnt(-139.99435839258939000000, +2.89181101472158900000, -71.69634981883045600000);
+    aWeights.ChangeValue(1, 53) = +1.02992866105538440000;
+    aPoles.ChangeValue(1, 53) = gp_Pnt(-142.87784656482347000000, +2.89064973421052680000, -70.23882874204873900000);
+    aWeights.ChangeValue(1, 54) = +1.02989968743283590000;
+    aPoles.ChangeValue(1, 54) = gp_Pnt(-145.74271824362268000000, +2.88845983550875030000, -68.74489127449217600000);
+    aWeights.ChangeValue(1, 55) = +1.02988222474524970000;
+    aPoles.ChangeValue(1, 55) = gp_Pnt(-148.58838121276386000000, +2.88713941077432070000, -67.21475112846350400000);
+    aWeights.ChangeValue(1, 56) = +1.02985386954408620000;
+    aPoles.ChangeValue(1, 56) = gp_Pnt(-151.41432118416620000000, +2.88499463682574180000, -65.64875099202183200000);
+    aWeights.ChangeValue(1, 57) = +1.02982704006090460000;
+    aPoles.ChangeValue(1, 57) = gp_Pnt(-154.21993049579214000000, +2.88296397171855910000, -64.04717955157212800000);
+    aWeights.ChangeValue(1, 58) = +1.02976639514278400000;
+    aPoles.ChangeValue(1, 58) = gp_Pnt(-160.00375832753414000000, +2.87837140815595260000, -60.64735416015690100000);
+    aWeights.ChangeValue(1, 59) = +1.02972545417711370000;
+    aPoles.ChangeValue(1, 59) = gp_Pnt(-162.97914403387477000000, +2.87526824819569480000, -58.84445149944087200000);
+    aWeights.ChangeValue(1, 60) = +1.02970377642253300000;
+    aPoles.ChangeValue(1, 60) = gp_Pnt(-165.92810584856278000000, +2.87362619373759860000, -56.99783055334398100000);
+    aWeights.ChangeValue(1, 61) = +1.02963665582001740000;
+    aPoles.ChangeValue(1, 61) = gp_Pnt(-168.85438185317770000000, +2.86853152516479340000, -55.11698298198095400000);
+    aWeights.ChangeValue(1, 62) = +1.02961756328192160000;
+    aPoles.ChangeValue(1, 62) = gp_Pnt(-171.75125340157436000000, +2.86708271055963240000, -53.19057330425229700000);
+    aWeights.ChangeValue(1, 63) = +1.02954937293527580000;
+    aPoles.ChangeValue(1, 63) = gp_Pnt(-174.62251681022158000000, +2.86190007017706360000, -51.22700225930964300000);
+    aWeights.ChangeValue(1, 64) = +1.02950097342691520000;
+    aPoles.ChangeValue(1, 64) = gp_Pnt(-177.46620192435449000000, +2.85821732043423180000, -49.22415777229338100000);
+    aWeights.ChangeValue(1, 65) = +1.02943612532291810000;
+    aPoles.ChangeValue(1, 65) = gp_Pnt(-180.28206426096281000000, +2.85327724467687100000, -47.18300981722491400000);
+    aWeights.ChangeValue(1, 66) = +1.02937840445786000000;
+    aPoles.ChangeValue(1, 66) = gp_Pnt(-182.89713737694305000000, +2.84888100315162470000, -45.28741010449485300000);
+    aWeights.ChangeValue(1, 67) = +1.02929786839840220000;
+    aPoles.ChangeValue(1, 67) = gp_Pnt(-185.48808576506855000000, +2.84272935508061810000, -43.35897595091199000000);
+    aWeights.ChangeValue(1, 68) = +1.02927785532845030000;
+    aPoles.ChangeValue(1, 68) = gp_Pnt(-188.05509745668041000000, +2.84122612975151250000, -41.39706700987362400000);
+    aWeights.ChangeValue(1, 69) = +1.02909457173363930000;
+    aPoles.ChangeValue(1, 69) = gp_Pnt(-190.59634219852757000000, +2.82717082550985440000, -39.40453806610211300000);
+    aWeights.ChangeValue(1, 70) = +1.02915656102508410000;
+    aPoles.ChangeValue(1, 70) = gp_Pnt(-193.11296933822229000000, +2.83195841118334000000, -37.37763511391345600000);
+    aWeights.ChangeValue(1, 71) = +1.02891246603941110000;
+    aPoles.ChangeValue(1, 71) = gp_Pnt(-195.60305999702362000000, +2.81322479805689340000, -35.32107774203857500000);
+    aWeights.ChangeValue(1, 72) = +1.02884001996307940000;
+    aPoles.ChangeValue(1, 72) = gp_Pnt(-198.06589030811097000000, +2.80764438138268390000, -33.23208121127716900000);
+    aWeights.ChangeValue(1, 73) = +1.02870418206103250000;
+    aPoles.ChangeValue(1, 73) = gp_Pnt(-200.50111697620073000000, +2.79717360924099090000, -31.11182660391394400000);
+    aWeights.ChangeValue(1, 74) = +1.02860417892814660000;
+    aPoles.ChangeValue(1, 74) = gp_Pnt(-202.93720652839650000000, +2.78949733525485710000, -28.99085629216911300000);
+    aWeights.ChangeValue(1, 75) = +1.02826579045547110000;
+    aPoles.ChangeValue(1, 75) = gp_Pnt(-205.34394850673777000000, +2.76315604312090550000, -26.83940109433629200000);
+    aWeights.ChangeValue(1, 76) = +1.02871793966742330000;
+    aPoles.ChangeValue(1, 76) = gp_Pnt(-207.72575255584553000000, +2.79855565223875710000, -24.65500081264426800000);
+    aWeights.ChangeValue(1, 77) = +1.02728787827176630000;
+    aPoles.ChangeValue(1, 77) = gp_Pnt(-210.07706367406874000000, +2.68725363743552850000, -22.43634910730148800000);
+    aWeights.ChangeValue(1, 78) = +1.02767535385809120000;
+    aPoles.ChangeValue(1, 78) = gp_Pnt(-212.39605978578481000000, +2.71705476277515070000, -20.20562112100595800000);
+    aWeights.ChangeValue(1, 79) = +1.02745809923169020000;
+    aPoles.ChangeValue(1, 79) = gp_Pnt(-214.68098626410506000000, +2.69985190382785320000, -17.91605900374278100000);
+    aWeights.ChangeValue(1, 80) = +1.02725110106359850000;
+    aPoles.ChangeValue(1, 80) = gp_Pnt(-216.94385389331507000000, +2.68435107488514250000, -15.61289037092123000000);
+    aWeights.ChangeValue(1, 81) = +1.02619749797986360000;
+    aPoles.ChangeValue(1, 81) = gp_Pnt(-219.16685583874414000000, +2.59983520096898510000, -13.28583956380401400000);
+    aWeights.ChangeValue(2, 1) = +1.00955713824395700000;
+    aPoles.ChangeValue(2, 1) = gp_Pnt(+131.76756408216349000000, +2.10451717388867540000, -66.27316135719137000000);
+    aWeights.ChangeValue(2, 2) = +1.00956608612165600000;
+    aPoles.ChangeValue(2, 2) = gp_Pnt(+128.72252404033563000000, +2.10631182699007670000, -67.95492700832653600000);
+    aWeights.ChangeValue(2, 3) = +1.00957354292813030000;
+    aPoles.ChangeValue(2, 3) = gp_Pnt(+125.65455798821807000000, +2.10780700070896730000, -69.59522708152212500000);
+    aWeights.ChangeValue(2, 4) = +1.00957948395970430000;
+    aPoles.ChangeValue(2, 4) = gp_Pnt(+122.56436007131990000000, +2.10899819276768510000, -71.19369911011085600000);
+    aWeights.ChangeValue(2, 5) = +1.00958671248272140000;
+    aPoles.ChangeValue(2, 5) = gp_Pnt(+119.45249930698063000000, +2.11044722765431250000, -72.74983445837314400000);
+    aWeights.ChangeValue(2, 6) = +1.00959353559448470000;
+    aPoles.ChangeValue(2, 6) = gp_Pnt(+116.31971419268339000000, +2.11181476538007030000, -74.26341133748536500000);
+    aWeights.ChangeValue(2, 7) = +1.00959839503054960000;
+    aPoles.ChangeValue(2, 7) = gp_Pnt(+113.16673272248508000000, +2.11278857229853930000, -75.73421464457315700000);
+    aWeights.ChangeValue(2, 8) = +1.00960405269294800000;
+    aPoles.ChangeValue(2, 8) = gp_Pnt(+109.99417142410560000000, +2.11392227976110990000, -77.16175403351917300000);
+    aWeights.ChangeValue(2, 9) = +1.00961384794963970000;
+    aPoles.ChangeValue(2, 9) = gp_Pnt(+103.61137952541701000000, +2.11588481923337430000, -79.92991318438167500000);
+    aWeights.ChangeValue(2, 10) = +1.00961857675621050000;
+    aPoles.ChangeValue(2, 10) = gp_Pnt(+100.40113044627800000000, +2.11683214779396200000, -81.27049552555527600000);
+    aWeights.ChangeValue(2, 11) = +1.00962274789480260000;
+    aPoles.ChangeValue(2, 11) = gp_Pnt(+97.17272090352022900000, +2.11766766635255620000, -82.56731642507010300000);
+    aWeights.ChangeValue(2, 12) = +1.00962679188946770000;
+    aPoles.ChangeValue(2, 12) = gp_Pnt(+93.92682593436140300000, +2.11847763961438810000, -83.82006598438695700000);
+    aWeights.ChangeValue(2, 13) = +1.00963059350869510000;
+    aPoles.ChangeValue(2, 13) = gp_Pnt(+90.66416580726762200000, +2.11923900414192050000, -85.02847304317147300000);
+    aWeights.ChangeValue(2, 14) = +1.00963398843777610000;
+    aPoles.ChangeValue(2, 14) = gp_Pnt(+87.38545325411524800000, +2.11991885797243330000, -86.19228543784532800000);
+    aWeights.ChangeValue(2, 15) = +1.00963733185346640000;
+    aPoles.ChangeValue(2, 15) = gp_Pnt(+84.09136475788710600000, +2.12058835416503610000, -87.31123582184922300000);
+    aWeights.ChangeValue(2, 16) = +1.00964648640037450000;
+    aPoles.ChangeValue(2, 16) = gp_Pnt(+74.16530685267888100000, +2.12242134451684360000, -90.53282418399284400000);
+    aWeights.ChangeValue(2, 17) = +1.00965176794147850000;
+    aPoles.ChangeValue(2, 17) = gp_Pnt(+67.48955141808187400000, +2.12347869023601370000, -92.50007118315201600000);
+    aWeights.ChangeValue(2, 18) = +1.00965632094816660000;
+    aPoles.ChangeValue(2, 18) = gp_Pnt(+60.76066172731987800000, +2.12439006790716880000, -94.28495774595940300000);
+    aWeights.ChangeValue(2, 19) = +1.00966023501695720000;
+    aPoles.ChangeValue(2, 19) = gp_Pnt(+53.98420072674593900000, +2.12517346720689600000, -95.88584819516199800000);
+    aWeights.ChangeValue(2, 20) = +1.00966358166845400000;
+    aPoles.ChangeValue(2, 20) = gp_Pnt(+47.16601123883578600000, +2.12584324589548320000, -97.30134659055448800000);
+    aWeights.ChangeValue(2, 21) = +1.00966641434734730000;
+    aPoles.ChangeValue(2, 21) = gp_Pnt(+40.31221541713015500000, +2.12641013013135180000, -98.53029698991525700000);
+    aWeights.ChangeValue(2, 22) = +1.00966876842241260000;
+    aPoles.ChangeValue(2, 22) = gp_Pnt(+33.42921418500849000000, +2.12688121470786750000, -99.57178366381829400000);
+    aWeights.ChangeValue(2, 23) = +1.00967255617655650000;
+    aPoles.ChangeValue(2, 23) = gp_Pnt(+19.61796125907087400000, +2.12763915883061920000, -101.27845724558523000000);
+    aWeights.ChangeValue(2, 24) = +1.00967399859793750000;
+    aPoles.ChangeValue(2, 24) = gp_Pnt(+12.68919279606528900000, +2.12792777824197280000, -101.94361028295506000000);
+    aWeights.ChangeValue(2, 25) = +1.00967501382968900000;
+    aPoles.ChangeValue(2, 25) = gp_Pnt(+5.74348853231593990000, +2.12813091177048630000, -102.41987704106546000000);
+    aWeights.ChangeValue(2, 26) = +1.00967561936957820000;
+    aPoles.ChangeValue(2, 26) = gp_Pnt(-1.21307744928976070000, +2.12825206894226590000, -102.70676666240287000000);
+    aWeights.ChangeValue(2, 27) = +1.00967582483410380000;
+    aPoles.ChangeValue(2, 27) = gp_Pnt(-8.17446448579617170000, +2.12829317854427910000, -102.80401081431219000000);
+    aWeights.ChangeValue(2, 28) = +1.00967563195849760000;
+    aPoles.ChangeValue(2, 28) = gp_Pnt(-15.13466558037753100000, +2.12825458864942170000, -102.71156371647888000000);
+    aWeights.ChangeValue(2, 29) = +1.00967503459672270000;
+    aPoles.ChangeValue(2, 29) = gp_Pnt(-22.08770764998126900000, +2.12813506662251010000, -102.42960214757312000000);
+    aWeights.ChangeValue(2, 30) = +1.00967300468446490000;
+    aPoles.ChangeValue(2, 30) = gp_Pnt(-35.96760988752987500000, +2.12772890088942160000, -101.48744752427969000000);
+    aWeights.ChangeValue(2, 31) = +1.00967156777535580000;
+    aPoles.ChangeValue(2, 31) = gp_Pnt(-42.89448004815705000000, +2.12744138030294440000, -100.82725372327035000000);
+    aWeights.ChangeValue(2, 32) = +1.00966969979090780000;
+    aPoles.ChangeValue(2, 32) = gp_Pnt(-49.80232400744441900000, +2.12706759457740000000, -99.97834162579670200000);
+    aWeights.ChangeValue(2, 33) = +1.00966737970297200000;
+    aPoles.ChangeValue(2, 33) = gp_Pnt(-56.68523628384353000000, +2.12660332632729520000, -98.94133225857957800000);
+    aWeights.ChangeValue(2, 34) = +1.00966457365849260000;
+    aPoles.ChangeValue(2, 34) = gp_Pnt(-63.53734456971785200000, +2.12604178346724470000, -97.71706998895581400000);
+    aWeights.ChangeValue(2, 35) = +1.00966123497950600000;
+    aPoles.ChangeValue(2, 35) = gp_Pnt(-70.35281013187348300000, +2.12537359908900880000, -96.30662240267085400000);
+    aWeights.ChangeValue(2, 36) = +1.00965730416314050000;
+    aPoles.ChangeValue(2, 36) = gp_Pnt(-77.12582820180557500000, +2.12458683129447450000, -94.71128014840769500000);
+    aWeights.ChangeValue(2, 37) = +1.00965057624220010000;
+    aPoles.ChangeValue(2, 37) = gp_Pnt(-86.97287762202962800000, +2.12324005462031540000, -92.10671540000876700000);
+    aWeights.ChangeValue(2, 38) = +1.00964829695753690000;
+    aPoles.ChangeValue(2, 38) = gp_Pnt(-90.08473551349412400000, +2.12278376932639290000, -91.24134329153459100000);
+    aWeights.ChangeValue(2, 39) = +1.00964586498084840000;
+    aPoles.ChangeValue(2, 39) = gp_Pnt(-93.18562459494498300000, +2.12229689243319890000, -90.33659169532975900000);
+    aWeights.ChangeValue(2, 40) = +1.00964327207694590000;
+    aPoles.ChangeValue(2, 40) = gp_Pnt(-96.27496896689456200000, +2.12177776971417840000, -89.39262240039663300000);
+    aWeights.ChangeValue(2, 41) = +1.00964050782222770000;
+    aPoles.ChangeValue(2, 41) = gp_Pnt(-99.35219429474524600000, +2.12122430736176200000, -88.40960770124299000000);
+    aWeights.ChangeValue(2, 42) = +1.00963755960468140000;
+    aPoles.ChangeValue(2, 42) = gp_Pnt(-102.41672784011750000000, +2.12063397196916760000, -87.38773038403248000000);
+    aWeights.ChangeValue(2, 43) = +1.00963441262388320000;
+    aPoles.ChangeValue(2, 43) = gp_Pnt(-105.46799849165807000000, +2.12000379050942020000, -86.32718371153289600000);
+    aWeights.ChangeValue(2, 44) = +1.00962747055142050000;
+    aPoles.ChangeValue(2, 44) = gp_Pnt(-111.77654530973133000000, +2.11861352771318150000, -84.04460889409097000000);
+    aWeights.ChangeValue(2, 45) = +1.00962344856326270000;
+    aPoles.ChangeValue(2, 45) = gp_Pnt(-115.03162075269803000000, +2.11780798556167320000, -82.81644583890866300000);
+    aWeights.ChangeValue(2, 46) = +1.00961960432211730000;
+    aPoles.ChangeValue(2, 46) = gp_Pnt(-118.26993104545312000000, +2.11703799459344700000, -81.54389579486141300000);
+    aWeights.ChangeValue(2, 47) = +1.00961486342011010000;
+    aPoles.ChangeValue(2, 47) = gp_Pnt(-121.49080060905077000000, +2.11608829135299810000, -80.22729418526657200000);
+    aWeights.ChangeValue(2, 48) = +1.00961029578343630000;
+    aPoles.ChangeValue(2, 48) = gp_Pnt(-124.69348951442340000000, +2.11517321690879800000, -78.86685283462101400000);
+    aWeights.ChangeValue(2, 49) = +1.00960520454014850000;
+    aPoles.ChangeValue(2, 49) = gp_Pnt(-127.87731027004676000000, +2.11415312105035590000, -77.46291256687052900000);
+    aWeights.ChangeValue(2, 50) = +1.00959965618773250000;
+    aPoles.ChangeValue(2, 50) = gp_Pnt(-131.04156234039974000000, +2.11304129636208420000, -76.01577573259778800000);
+    aWeights.ChangeValue(2, 51) = +1.00958841592243690000;
+    aPoles.ChangeValue(2, 51) = gp_Pnt(-137.10496896782513000000, +2.11078854745601690000, -73.14215015354327000000);
+    aWeights.ChangeValue(2, 52) = +1.00958190609540830000;
+    aPoles.ChangeValue(2, 52) = gp_Pnt(-140.00695092509352000000, +2.10948365684345340000, -71.72161996530125800000);
+    aWeights.ChangeValue(2, 53) = +1.00957719225994170000;
+    aPoles.ChangeValue(2, 53) = gp_Pnt(-142.89082065884315000000, +2.10853873486620720000, -70.26423921243410600000);
+    aWeights.ChangeValue(2, 54) = +1.00956830737110970000;
+    aPoles.ChangeValue(2, 54) = gp_Pnt(-145.75622246387837000000, +2.10675729535240960000, -68.77065477701791000000);
+    aWeights.ChangeValue(2, 55) = +1.00956295195561060000;
+    aPoles.ChangeValue(2, 55) = gp_Pnt(-148.60233584192389000000, +2.10568335609513650000, -67.24065593702246700000);
+    aWeights.ChangeValue(2, 56) = +1.00955425555818930000;
+    aPoles.ChangeValue(2, 56) = gp_Pnt(-151.42883073983140000000, +2.10393921590561070000, -65.67497260857376800000);
+    aWeights.ChangeValue(2, 57) = +1.00954602613011150000;
+    aPoles.ChangeValue(2, 57) = gp_Pnt(-154.23502547473331000000, +2.10228833319884910000, -64.07366145615235100000);
+    aWeights.ChangeValue(2, 58) = +1.00952742278729300000;
+    aPoles.ChangeValue(2, 58) = gp_Pnt(-160.02004322449872000000, +2.09855561509982950000, -60.67448614970191300000);
+    aWeights.ChangeValue(2, 59) = +1.00951486183164940000;
+    aPoles.ChangeValue(2, 59) = gp_Pnt(-162.99613088380306000000, +2.09603444654779600000, -58.87207545484513800000);
+    aWeights.ChangeValue(2, 60) = +1.00950821186194630000;
+    aPoles.ChangeValue(2, 60) = gp_Pnt(-165.94554723216726000000, +2.09470002788322150000, -57.02566663092176900000);
+    aWeights.ChangeValue(2, 61) = +1.00948761363819010000;
+    aPoles.ChangeValue(2, 61) = gp_Pnt(-168.87287521283019000000, +2.09056345777511910000, -55.14566924440539700000);
+    aWeights.ChangeValue(2, 62) = +1.00948175483840210000;
+    aPoles.ChangeValue(2, 62) = gp_Pnt(-171.77025983587509000000, +2.08938700649796160000, -53.21936605947655600000);
+    aWeights.ChangeValue(2, 63) = +1.00946082358399410000;
+    aPoles.ChangeValue(2, 63) = gp_Pnt(-174.64262250370552000000, +2.08518149324171190000, -51.25662423685646700000);
+    aWeights.ChangeValue(2, 64) = +1.00944596410269540000;
+    aPoles.ChangeValue(2, 64) = gp_Pnt(-177.48726621628353000000, +2.08219461660139650000, -49.25423871740036900000);
+    aWeights.ChangeValue(2, 65) = +1.00942605045267530000;
+    aPoles.ChangeValue(2, 65) = gp_Pnt(-180.30433731845508000000, +2.07819005191471670000, -47.21374002625280800000);
+    aWeights.ChangeValue(2, 66) = +1.00940832657289500000;
+    aPoles.ChangeValue(2, 66) = gp_Pnt(-182.92026834009920000000, +2.07462614892136180000, -45.31887901738367200000);
+    aWeights.ChangeValue(2, 67) = +1.00938358350026620000;
+    aPoles.ChangeValue(2, 67) = gp_Pnt(-185.51252638985017000000, +2.06964535925843180000, -43.39137009339865600000);
+    aWeights.ChangeValue(2, 68) = +1.00937745534293180000;
+    aPoles.ChangeValue(2, 68) = gp_Pnt(-188.07970214515959000000, +2.06841969296490240000, -41.42984981640538000000);
+    aWeights.ChangeValue(2, 69) = +1.00932110415642830000;
+    aPoles.ChangeValue(2, 69) = gp_Pnt(-190.62397551723822000000, +2.05705915800362950000, -39.43932945784815300000);
+    aWeights.ChangeValue(2, 70) = +1.00934018958961060000;
+    aPoles.ChangeValue(2, 70) = gp_Pnt(-193.13969442040633000000, +2.06091733419064350000, -37.41169132931209200000);
+    aWeights.ChangeValue(2, 71) = +1.00926513417552190000;
+    aPoles.ChangeValue(2, 71) = gp_Pnt(-195.63329272671066000000, +2.04578165519120160000, -35.35822241980492500000);
+    aWeights.ChangeValue(2, 72) = +1.00924284324010150000;
+    aPoles.ChangeValue(2, 72) = gp_Pnt(-198.09761820165846000000, +2.04128022217386820000, -33.26975126412686700000);
+    aWeights.ChangeValue(2, 73) = +1.00920104311988150000;
+    aPoles.ChangeValue(2, 73) = gp_Pnt(-200.53514329838038000000, +2.03283693524956680000, -31.15087616958502200000);
+    aWeights.ChangeValue(2, 74) = +1.00917029694372660000;
+    aPoles.ChangeValue(2, 74) = gp_Pnt(-202.97255799662608000000, +2.02663657044316060000, -29.03126127135719200000);
+    aWeights.ChangeValue(2, 75) = +1.00906597799637380000;
+    aPoles.ChangeValue(2, 75) = gp_Pnt(-205.38430250588374000000, +2.00548607046822540000, -26.88375382824776200000);
+    aWeights.ChangeValue(2, 76) = +1.00920552993214340000;
+    aPoles.ChangeValue(2, 76) = gp_Pnt(-207.76049754988114000000, +2.03384304897263670000, -24.69318019977189100000);
+    aWeights.ChangeValue(2, 77) = +1.00876475817298510000;
+    aPoles.ChangeValue(2, 77) = gp_Pnt(-210.12674832523484000000, +1.94448851661030540000, -22.49703905023471500000);
+    aWeights.ChangeValue(2, 78) = +1.00888387250469380000;
+    aPoles.ChangeValue(2, 78) = gp_Pnt(-212.44800842772909000000, +1.96852329008748410000, -20.25405344977475500000);
+    aWeights.ChangeValue(2, 79) = +1.00881670070680670000;
+    aPoles.ChangeValue(2, 79) = gp_Pnt(-214.73260668420895000000, +1.95481624964232450000, -17.97008076073228700000);
+    aWeights.ChangeValue(2, 80) = +1.00875338528797620000;
+    aPoles.ChangeValue(2, 80) = gp_Pnt(-216.99878954601004000000, +1.94217039944868790000, -15.66960286452947800000);
+    aWeights.ChangeValue(2, 81) = +1.00842683370719490000;
+    aPoles.ChangeValue(2, 81) = gp_Pnt(-219.23765241170187000000, +1.87520469423183880000, -13.35291936652889800000);
+    aWeights.ChangeValue(3, 1) = +0.99802424639217791000;
+    aPoles.ChangeValue(3, 1) = gp_Pnt(+131.89876890515018000000, +1.35189067474276530000, -66.51059820355672500000);
+    aWeights.ChangeValue(3, 2) = +0.99802234515929278000;
+    aPoles.ChangeValue(3, 2) = gp_Pnt(+128.85071311608803000000, +1.35313353595059940000, -68.19368716153405800000);
+    aWeights.ChangeValue(3, 3) = +0.99802076064203826000;
+    aPoles.ChangeValue(3, 3) = gp_Pnt(+125.77977143028471000000, +1.35416922698475650000, -69.83529373030198400000);
+    aWeights.ChangeValue(3, 4) = +0.99801949820651126000;
+    aPoles.ChangeValue(3, 4) = gp_Pnt(+122.68659332837821000000, +1.35499438550965670000, -71.43508181423516100000);
+    aWeights.ChangeValue(3, 5) = +0.99801796211084914000;
+    aPoles.ChangeValue(3, 5) = gp_Pnt(+119.57173533591266000000, +1.35599832254451200000, -72.99244308799212900000);
+    aWeights.ChangeValue(3, 6) = +0.99801651211145281000;
+    aPoles.ChangeValue(3, 6) = gp_Pnt(+116.43595392098000000000, +1.35694592285710100000, -74.50721127326711700000);
+    aWeights.ChangeValue(3, 7) = +0.99801547938002733000;
+    aPoles.ChangeValue(3, 7) = gp_Pnt(+113.28000153804584000000, +1.35762078417993900000, -75.97921900496575600000);
+    aWeights.ChangeValue(3, 8) = +0.99801427699595313000;
+    aPoles.ChangeValue(3, 8) = gp_Pnt(+110.10443724854701000000, +1.35840649430771500000, -77.40790012997213400000);
+    aWeights.ChangeValue(3, 9) = +0.99801219521191387000;
+    aPoles.ChangeValue(3, 9) = gp_Pnt(+103.71561277285424000000, +1.35976677896647580000, -80.17831514578958300000);
+    aWeights.ChangeValue(3, 10) = +0.99801119017200446000;
+    aPoles.ChangeValue(3, 10) = gp_Pnt(+100.50232486897988000000, +1.36042346207845170000, -81.51999289835789900000);
+    aWeights.ChangeValue(3, 11) = +0.99801030363459775000;
+    aPoles.ChangeValue(3, 11) = gp_Pnt(+97.27087733082035500000, +1.36100269005924380000, -82.81788136334564900000);
+    aWeights.ChangeValue(3, 12) = +0.99800944410125381000;
+    aPoles.ChangeValue(3, 12) = gp_Pnt(+94.02193936655145000000, +1.36156425167614130000, -84.07165794609035500000);
+    aWeights.ChangeValue(3, 13) = +0.99800863606857426000;
+    aPoles.ChangeValue(3, 13) = gp_Pnt(+90.75622955795523700000, +1.36209214789795310000, -85.28105659074749700000);
+    aWeights.ChangeValue(3, 14) = +0.99800791446328430000;
+    aPoles.ChangeValue(3, 14) = gp_Pnt(+87.47446474935537700000, +1.36256356235759690000, -86.44582972368263500000);
+    aWeights.ChangeValue(3, 15) = +0.99800720379689600000;
+    aPoles.ChangeValue(3, 15) = gp_Pnt(+84.17731596959211500000, +1.36302781837419680000, -87.56569962027794000000);
+    aWeights.ChangeValue(3, 16) = +0.99800525790220496000;
+    aPoles.ChangeValue(3, 16) = gp_Pnt(+74.24198734063921300000, +1.36429897306986340000, -90.78996991844945800000);
+    aWeights.ChangeValue(3, 17) = +0.99800413521623321000;
+    aPoles.ChangeValue(3, 17) = gp_Pnt(+67.56001809965197000000, +1.36503231983535440000, -92.75885901427626800000);
+    aWeights.ChangeValue(3, 18) = +0.99800316736440942000;
+    aPoles.ChangeValue(3, 18) = gp_Pnt(+60.82490109578901600000, +1.36566449260567850000, -94.54523441794054900000);
+    aWeights.ChangeValue(3, 19) = +0.99800233531441818000;
+    aPoles.ChangeValue(3, 19) = gp_Pnt(+54.04219505707111900000, +1.36620793936844790000, -96.14746061467829500000);
+    aWeights.ChangeValue(3, 20) = +0.99800162387306934000;
+    aPoles.ChangeValue(3, 20) = gp_Pnt(+47.21773986109732800000, +1.36667259642912180000, -97.56414160157402200000);
+    aWeights.ChangeValue(3, 21) = +0.99800102168630012000;
+    aPoles.ChangeValue(3, 21) = gp_Pnt(+40.35765665228271400000, +1.36706588836418840000, -98.79412083143951400000);
+    aWeights.ChangeValue(3, 22) = +0.99800052123917371000;
+    aPoles.ChangeValue(3, 22) = gp_Pnt(+33.46834796257081700000, +1.36739272798589770000, -99.83648116661171900000);
+    aWeights.ChangeValue(3, 23) = +0.99799971600020576000;
+    aPoles.ChangeValue(3, 23) = gp_Pnt(+19.64441706716387900000, +1.36791861440644060000, -101.54459131896159000000);
+    aWeights.ChangeValue(3, 24) = +0.99799940935225717000;
+    aPoles.ChangeValue(3, 24) = gp_Pnt(+12.70928858254282900000, +1.36811887624638580000, -102.21030492597274000000);
+    aWeights.ChangeValue(3, 25) = +0.99799919351964705000;
+    aPoles.ChangeValue(3, 25) = gp_Pnt(+5.75722078489831280000, +1.36825982711689180000, -102.68697252648171000000);
+    aWeights.ChangeValue(3, 26) = +0.99799906478455291000;
+    aPoles.ChangeValue(3, 26) = gp_Pnt(-1.20571159764999210000, +1.36834389755229970000, -102.97410341218257000000);
+    aWeights.ChangeValue(3, 27) = +0.99799902110371730000;
+    aPoles.ChangeValue(3, 27) = gp_Pnt(-8.17346746041202720000, +1.36837242333404090000, -103.07142929357101000000);
+    aWeights.ChangeValue(3, 28) = +0.99799906210844536000;
+    aPoles.ChangeValue(3, 28) = gp_Pnt(-15.14003926915473600000, +1.36834564548690430000, -102.97890429403182000000);
+    aWeights.ChangeValue(3, 29) = +0.99799918910460783000;
+    aPoles.ChangeValue(3, 29) = gp_Pnt(-22.09945300681867100000, +1.36826271027814080000, -102.69670494840925000000);
+    aWeights.ChangeValue(3, 30) = +0.99799962065035785000;
+    aPoles.ChangeValue(3, 30) = gp_Pnt(-35.99208002634647800000, +1.36798088374117890000, -101.75375562004130000000);
+    aWeights.ChangeValue(3, 31) = +0.99799992612548816000;
+    aPoles.ChangeValue(3, 31) = gp_Pnt(-42.92529183965938000000, +1.36778138671521220000, -101.09300634269859000000);
+    aWeights.ChangeValue(3, 32) = +0.99800032324181509000;
+    aPoles.ChangeValue(3, 32) = gp_Pnt(-49.83946240643516700000, +1.36752203923507090000, -100.24338136864999000000);
+    aWeights.ChangeValue(3, 33) = +0.99800081646744487000;
+    aPoles.ChangeValue(3, 33) = gp_Pnt(-56.72868525600537000000, +1.36719992054037180000, -99.20550257416397200000);
+    aWeights.ChangeValue(3, 34) = +0.99800141299480705000;
+    aPoles.ChangeValue(3, 34) = gp_Pnt(-63.58708851299418500000, +1.36681032802942060000, -97.98021473616272200000);
+    aWeights.ChangeValue(3, 35) = +0.99800212274065336000;
+    aPoles.ChangeValue(3, 35) = gp_Pnt(-70.40883481115771800000, +1.36634677727753220000, -96.56858555851044900000);
+    aWeights.ChangeValue(3, 36) = +0.99800295834605834000;
+    aPoles.ChangeValue(3, 36) = gp_Pnt(-77.18812120943384500000, +1.36580100206191160000, -94.97190570545618000000);
+    aWeights.ChangeValue(3, 37) = +0.99800438851666018000;
+    aPoles.ChangeValue(3, 37) = gp_Pnt(-87.04430869357409500000, +1.36486684103840930000, -92.36516064771883800000);
+    aWeights.ChangeValue(3, 38) = +0.99800487302440710000;
+    aPoles.ChangeValue(3, 38) = gp_Pnt(-90.15904180478642600000, +1.36455036334574700000, -91.49906951050012100000);
+    aWeights.ChangeValue(3, 39) = +0.99800538998403165000;
+    aPoles.ChangeValue(3, 39) = gp_Pnt(-93.26280104894121300000, +1.36421268117563340000, -90.59356682763008500000);
+    aWeights.ChangeValue(3, 40) = +0.99800594114472085000;
+    aPoles.ChangeValue(3, 40) = gp_Pnt(-96.35501076566437500000, +1.36385265030680070000, -89.64881447076304300000);
+    aWeights.ChangeValue(3, 41) = +0.99800652872047668000;
+    aPoles.ChangeValue(3, 41) = gp_Pnt(-99.43509702281136200000, +1.36346882243976730000, -88.66498478868943800000);
+    aWeights.ChangeValue(3, 42) = +0.99800715539011531000;
+    aPoles.ChangeValue(3, 42) = gp_Pnt(-102.50248760972849000000, +1.36305944519955100000, -87.64226061031386900000);
+    aWeights.ChangeValue(3, 43) = +0.99800782429726853000;
+    aPoles.ChangeValue(3, 43) = gp_Pnt(-105.55661203062589000000, +1.36262246213878830000, -86.58083524789229600000);
+    aWeights.ChangeValue(3, 44) = +0.99800929984388531000;
+    aPoles.ChangeValue(3, 44) = gp_Pnt(-111.87105232543304000000, +1.36165848631400000000, -84.29637819122412200000);
+    aWeights.ChangeValue(3, 45) = +0.99801015470554688000;
+    aPoles.ChangeValue(3, 45) = gp_Pnt(-115.12916723990907000000, +1.36109998387148300000, -83.06721412498791300000);
+    aWeights.ChangeValue(3, 46) = +0.99801097177629106000;
+    aPoles.ChangeValue(3, 46) = gp_Pnt(-118.37050305702043000000, +1.36056615831231790000, -81.79361556056927900000);
+    aWeights.ChangeValue(3, 47) = +0.99801197939908182000;
+    aPoles.ChangeValue(3, 47) = gp_Pnt(-121.59440429164877000000, +1.35990780214188640000, -80.47594855348815200000);
+    aWeights.ChangeValue(3, 48) = +0.99801295017732938000;
+    aPoles.ChangeValue(3, 48) = gp_Pnt(-124.80011198391350000000, +1.35927349774917520000, -79.11439339164216700000);
+    aWeights.ChangeValue(3, 49) = +0.99801403220993246000;
+    aPoles.ChangeValue(3, 49) = gp_Pnt(-127.98695272451793000000, +1.35856646260703170000, -77.70931006235629500000);
+    aWeights.ChangeValue(3, 50) = +0.99801521135673477000;
+    aPoles.ChangeValue(3, 50) = gp_Pnt(-131.15422466608416000000, +1.35779592883408770000, -76.26099835790641600000);
+    aWeights.ChangeValue(3, 51) = +0.99801760008173268000;
+    aPoles.ChangeValue(3, 51) = gp_Pnt(-137.22341426940562000000, +1.35623488186342090000, -73.38505097675174200000);
+    aWeights.ChangeValue(3, 52) = +0.99801898347031770000;
+    aPoles.ChangeValue(3, 52) = gp_Pnt(-140.12817143218851000000, +1.35533077140178190000, -71.96340636458091900000);
+    aWeights.ChangeValue(3, 53) = +0.99801998518653323000;
+    aPoles.ChangeValue(3, 53) = gp_Pnt(-143.01477271081365000000, +1.35467609324036100000, -70.50482384325539400000);
+    aWeights.ChangeValue(3, 54) = +0.99802187318341851000;
+    aPoles.ChangeValue(3, 54) = gp_Pnt(-145.88296929650440000000, +1.35344206211285110000, -69.01011970904052400000);
+    aWeights.ChangeValue(3, 55) = +0.99802301113749214000;
+    aPoles.ChangeValue(3, 55) = gp_Pnt(-148.73181832948791000000, +1.35269822187277230000, -67.47885556090747600000);
+    aWeights.ChangeValue(3, 56) = +0.99802485896116799000;
+    aPoles.ChangeValue(3, 56) = gp_Pnt(-151.56108889838526000000, +1.35149030610332030000, -65.91196867904423600000);
+    aWeights.ChangeValue(3, 57) = +0.99802660746081140000;
+    aPoles.ChangeValue(3, 57) = gp_Pnt(-154.37005843077941000000, +1.35034719652907540000, -64.30939181125272300000);
+    aWeights.ChangeValue(3, 58) = +0.99803055992501810000;
+    aPoles.ChangeValue(3, 58) = gp_Pnt(-160.16078498432634000000, +1.34776300585323040000, -60.90758294114521500000);
+    aWeights.ChangeValue(3, 59) = +0.99803322842151521000;
+    aPoles.ChangeValue(3, 59) = gp_Pnt(-163.13986451909619000000, +1.34601805132734250000, -59.10384793755353900000);
+    aWeights.ChangeValue(3, 60) = +0.99803464125751229000;
+    aPoles.ChangeValue(3, 60) = gp_Pnt(-166.09208359425281000000, +1.34509430571165490000, -57.25595351707911400000);
+    aWeights.ChangeValue(3, 61) = +0.99803901668572381000;
+    aPoles.ChangeValue(3, 61) = gp_Pnt(-169.02259847263389000000, +1.34223252516315280000, -55.37471701865561600000);
+    aWeights.ChangeValue(3, 62) = +0.99804026123487555000;
+    aPoles.ChangeValue(3, 62) = gp_Pnt(-171.92274649713781000000, +1.34141857200850120000, -53.44681670722970100000);
+    aWeights.ChangeValue(3, 63) = +0.99804470691034153000;
+    aPoles.ChangeValue(3, 63) = gp_Pnt(-174.79824691248783000000, +1.33851025764084610000, -51.48277226031661500000);
+    aWeights.ChangeValue(3, 64) = +0.99804786265209489000;
+    aPoles.ChangeValue(3, 64) = gp_Pnt(-177.64589658566118000000, +1.33644541377468110000, -49.47887210970986900000);
+    aWeights.ChangeValue(3, 65) = +0.99805209132461004000;
+    aPoles.ChangeValue(3, 65) = gp_Pnt(-180.46609411219177000000, +1.33367801102763010000, -47.43691639460438100000);
+    aWeights.ChangeValue(3, 66) = +0.99805585511720041000;
+    aPoles.ChangeValue(3, 66) = gp_Pnt(-183.08478109176986000000, +1.33121501172845690000, -45.54077967192022000000);
+    aWeights.ChangeValue(3, 67) = +0.99806110806405779000;
+    aPoles.ChangeValue(3, 67) = gp_Pnt(-185.68001727848417000000, +1.32777577033982250000, -43.61205685047624300000);
+    aWeights.ChangeValue(3, 68) = +0.99806241123000117000;
+    aPoles.ChangeValue(3, 68) = gp_Pnt(-188.24953622256075000000, +1.32692526187276720000, -41.64902509374122300000);
+    aWeights.ChangeValue(3, 69) = +0.99807437025077705000;
+    aPoles.ChangeValue(3, 69) = gp_Pnt(-190.79766796840426000000, +1.31909012471800140000, -39.65777616520052400000);
+    aWeights.ChangeValue(3, 70) = +0.99807032269259688000;
+    aPoles.ChangeValue(3, 70) = gp_Pnt(-193.31511620328166000000, +1.32174544077043810000, -37.62798636408343400000);
+    aWeights.ChangeValue(3, 71) = +0.99808625039380772000;
+    aPoles.ChangeValue(3, 71) = gp_Pnt(-195.81278252670535000000, +1.31130937814640340000, -35.57429171163009600000);
+    aWeights.ChangeValue(3, 72) = +0.99809097922828749000;
+    aPoles.ChangeValue(3, 72) = gp_Pnt(-198.28008499427182000000, +1.30820906528388470000, -33.48422839734306700000);
+    aWeights.ChangeValue(3, 73) = +0.99809984631895698000;
+    aPoles.ChangeValue(3, 73) = gp_Pnt(-200.72099421295775000000, +1.30239515227575060000, -31.36416391357070300000);
+    aWeights.ChangeValue(3, 74) = +0.99810637147759285000;
+    aPoles.ChangeValue(3, 74) = gp_Pnt(-203.16127009409345000000, +1.29812048781277520000, -29.24337154392900800000);
+    aWeights.ChangeValue(3, 75) = +0.99812847998895315000;
+    aPoles.ChangeValue(3, 75) = gp_Pnt(-205.57777363915829000000, +1.28359951668439790000, -27.09591401257074100000);
+    aWeights.ChangeValue(3, 76) = +0.99809892249848597000;
+    aPoles.ChangeValue(3, 76) = gp_Pnt(-207.95321979211485000000, +1.30303533816127510000, -24.90029856221717000000);
+    aWeights.ChangeValue(3, 77) = +0.99819234539248169000;
+    aPoles.ChangeValue(3, 77) = gp_Pnt(-210.32920376311637000000, +1.24168994973372330000, -22.71372419603407900000);
+    aWeights.ChangeValue(3, 78) = +0.99816706733577565000;
+    aPoles.ChangeValue(3, 78) = gp_Pnt(-212.65404345030839000000, +1.25824740351837460000, -20.46200135460381000000);
+    aWeights.ChangeValue(3, 79) = +0.99818127776964660000;
+    aPoles.ChangeValue(3, 79) = gp_Pnt(-214.94032188963598000000, +1.24888524402456480000, -18.17894168737611000000);
+    aWeights.ChangeValue(3, 80) = +0.99819475509197664000;
+    aPoles.ChangeValue(3, 80) = gp_Pnt(-217.21049138159862000000, +1.24010538580557930000, -15.87773552075580100000);
+    aWeights.ChangeValue(3, 81) = +0.99826376750414003000;
+    aPoles.ChangeValue(3, 81) = gp_Pnt(-219.45963474898130000000, +1.19454909379966280000, -13.56324778739743800000);
+    aWeights.ChangeValue(4, 1) = +0.99424302042862245000;
+    aPoles.ChangeValue(4, 1) = gp_Pnt(+132.13618409480023000000, +0.70840889522526063000, -66.94024029007874800000);
+    aWeights.ChangeValue(4, 2) = +0.99423758610938695000;
+    aPoles.ChangeValue(4, 2) = gp_Pnt(+129.08297406972278000000, +0.70909252303575865000, -68.62615176496952100000);
+    aWeights.ChangeValue(4, 3) = +0.99423305718875432000;
+    aPoles.ChangeValue(4, 3) = gp_Pnt(+126.00685240811242000000, +0.70966228194967051000, -70.27050713058781600000);
+    aWeights.ChangeValue(4, 4) = +0.99422944886444642000;
+    aPoles.ChangeValue(4, 4) = gp_Pnt(+122.90845587213282000000, +0.71011623149435366000, -71.87297804945868100000);
+    aWeights.ChangeValue(4, 5) = +0.99422505844796127000;
+    aPoles.ChangeValue(4, 5) = gp_Pnt(+119.78834767262531000000, +0.71066859395963999000, -73.43294438704307900000);
+    aWeights.ChangeValue(4, 6) = +0.99422091417503022000;
+    aPoles.ChangeValue(4, 6) = gp_Pnt(+116.64728496160824000000, +0.71119000548737488000, -74.95024473036627900000);
+    aWeights.ChangeValue(4, 7) = +0.99421796254996875000;
+    aPoles.ChangeValue(4, 7) = gp_Pnt(+113.48602386120655000000, +0.71156137519735096000, -76.42471498016054500000);
+    aWeights.ChangeValue(4, 8) = +0.99421452605999638000;
+    aPoles.ChangeValue(4, 8) = gp_Pnt(+110.30511547520040000000, +0.71199375553590705000, -77.85578472764748900000);
+    aWeights.ChangeValue(4, 9) = +0.99420857626658776000;
+    aPoles.ChangeValue(4, 9) = gp_Pnt(+103.90553506044348000000, +0.71274238201017392000, -80.63083668700706100000);
+    aWeights.ChangeValue(4, 10) = +0.99420570386914531000;
+    aPoles.ChangeValue(4, 10) = gp_Pnt(+100.68683453164211000000, +0.71310380757531833000, -81.97476109354066400000);
+    aWeights.ChangeValue(4, 11) = +0.99420317017586146000;
+    aPoles.ChangeValue(4, 11) = gp_Pnt(+97.44994659335081600000, +0.71342262156961334000, -83.27482261755635300000);
+    aWeights.ChangeValue(4, 12) = +0.99420071368291341000;
+    aPoles.ChangeValue(4, 12) = gp_Pnt(+94.19554253170841200000, +0.71373172711717636000, -84.53069694549194000000);
+    aWeights.ChangeValue(4, 13) = +0.99419840439350793000;
+    aPoles.ChangeValue(4, 13) = gp_Pnt(+90.92433917217061900000, +0.71402231445757036000, -85.74211902365664200000);
+    aWeights.ChangeValue(4, 14) = +0.99419634212229768000;
+    aPoles.ChangeValue(4, 14) = gp_Pnt(+87.63705473050230000000, +0.71428182289044062000, -86.90884124933938900000);
+    aWeights.ChangeValue(4, 15) = +0.99419431112670464000;
+    aPoles.ChangeValue(4, 15) = gp_Pnt(+84.33436439436984200000, +0.71453739893908408000, -88.03058362353205300000);
+    aWeights.ChangeValue(4, 16) = +0.99418875003915341000;
+    aPoles.ChangeValue(4, 16) = gp_Pnt(+74.38231313217285400000, +0.71523720648163680000, -91.26025430410756200000);
+    aWeights.ChangeValue(4, 17) = +0.99418554160984429000;
+    aPoles.ChangeValue(4, 17) = gp_Pnt(+67.68910051798944500000, +0.71564096751482986000, -93.23244050128337800000);
+    aWeights.ChangeValue(4, 18) = +0.99418277570171931000;
+    aPoles.ChangeValue(4, 18) = gp_Pnt(+60.94265918181897500000, +0.71598904839509359000, -95.02180567308657500000);
+    aWeights.ChangeValue(4, 19) = +0.99418039790864621000;
+    aPoles.ChangeValue(4, 19) = gp_Pnt(+54.14855416044807900000, +0.71628829211206946000, -96.62671289123449000000);
+    aWeights.ChangeValue(4, 20) = +0.99417836479981814000;
+    aPoles.ChangeValue(4, 20) = gp_Pnt(+47.31263275511362600000, +0.71654416141740851000, -98.04576467050098600000);
+    aWeights.ChangeValue(4, 21) = +0.99417664391975691000;
+    aPoles.ChangeValue(4, 21) = gp_Pnt(+40.44102486854357200000, +0.71676073875086976000, -99.27780280738555500000);
+    aWeights.ChangeValue(4, 22) = +0.99417521378830997000;
+    aPoles.ChangeValue(4, 22) = gp_Pnt(+33.54014335198198900000, +0.71694072618465221000, -100.32190824729783000000);
+    aWeights.ChangeValue(4, 23) = +0.99417291266204433000;
+    aPoles.ChangeValue(4, 23) = gp_Pnt(+19.69298272358705000000, +0.71723033475882103000, -102.03287833894613000000);
+    aWeights.ChangeValue(4, 24) = +0.99417203636017570000;
+    aPoles.ChangeValue(4, 24) = gp_Pnt(+12.74619890889187300000, +0.71734062296661449000, -102.69970663658552000000);
+    aWeights.ChangeValue(4, 25) = +0.99417141958182476000;
+    aPoles.ChangeValue(4, 25) = gp_Pnt(+5.78245043030823250000, +0.71741824902277995000, -103.17717197796689000000);
+    aWeights.ChangeValue(4, 26) = +0.99417105170022846000;
+    aPoles.ChangeValue(4, 26) = gp_Pnt(-1.19217909208406270000, +0.71746454980293017000, -103.46478315098152000000);
+    aWeights.ChangeValue(4, 27) = +0.99417092687508068000;
+    aPoles.ChangeValue(4, 27) = gp_Pnt(-8.17163978203099180000, +0.71748026003105458000, -103.56227159755184000000);
+    aWeights.ChangeValue(4, 28) = +0.99417104405253187000;
+    aPoles.ChangeValue(4, 28) = gp_Pnt(-15.14991535484593800000, +0.71746551227361877000, -103.46959139663633000000);
+    aWeights.ChangeValue(4, 29) = +0.99417140696519068000;
+    aPoles.ChangeValue(4, 29) = gp_Pnt(-22.12102296425817400000, +0.71741983693815459000, -103.18691926012113000000);
+    aWeights.ChangeValue(4, 30) = +0.99417264018315676000;
+    aPoles.ChangeValue(4, 30) = gp_Pnt(-36.03699423807252300000, +0.71726462804712465000, -102.24239043165372000000);
+    aWeights.ChangeValue(4, 31) = +0.99417351313460955000;
+    aPoles.ChangeValue(4, 31) = gp_Pnt(-42.98185258768797500000, +0.71715476185170723000, -101.58053487832193000000);
+    aWeights.ChangeValue(4, 32) = +0.99417464796983568000;
+    aPoles.ChangeValue(4, 32) = gp_Pnt(-49.90763755490115700000, +0.71701193671091712000, -100.72948788576410000000);
+    aWeights.ChangeValue(4, 33) = +0.99417605745995530000;
+    aPoles.ChangeValue(4, 33) = gp_Pnt(-56.80843390632649900000, +0.71683454604177377000, -99.68987236817491700000);
+    aWeights.ChangeValue(4, 34) = +0.99417776216385467000;
+    aPoles.ChangeValue(4, 34) = gp_Pnt(-63.67836146608049600000, +0.71662000367742562000, -98.46253420440308400000);
+    aWeights.ChangeValue(4, 35) = +0.99417979042818705000;
+    aPoles.ChangeValue(4, 35) = gp_Pnt(-70.51157486810592400000, +0.71636474389607163000, -97.04854231351581000000);
+    aWeights.ChangeValue(4, 36) = +0.99418217838737100000;
+    aPoles.ChangeValue(4, 36) = gp_Pnt(-77.30226331485057800000, +0.71606422146024096000, -95.44918875092946600000);
+    aWeights.ChangeValue(4, 37) = +0.99418626551507883000;
+    aPoles.ChangeValue(4, 37) = gp_Pnt(-87.17503156127875700000, +0.71554987190288122000, -92.83807781738744300000);
+    aWeights.ChangeValue(4, 38) = +0.99418765014289556000;
+    aPoles.ChangeValue(4, 38) = gp_Pnt(-90.29499963358738100000, +0.71537562386381059000, -91.97053762881716900000);
+    aWeights.ChangeValue(4, 39) = +0.99418912751868260000;
+    aPoles.ChangeValue(4, 39) = gp_Pnt(-93.40397633478176000000, +0.71518970580821706000, -91.06351986664817800000);
+    aWeights.ChangeValue(4, 40) = +0.99419070264287346000;
+    aPoles.ChangeValue(4, 40) = gp_Pnt(-96.50138523104767800000, +0.71499148886670094000, -90.11718659777564300000);
+    aWeights.ChangeValue(4, 41) = +0.99419238184469383000;
+    aPoles.ChangeValue(4, 41) = gp_Pnt(-99.58665166110419900000, +0.71478017704711161000, -89.13171035602891800000);
+    aWeights.ChangeValue(4, 42) = +0.99419417278216393000;
+    aPoles.ChangeValue(4, 42) = gp_Pnt(-102.65920271683186000000, +0.71455480723882170000, -88.10727415073346000000);
+    aWeights.ChangeValue(4, 43) = +0.99419608444209617000;
+    aPoles.ChangeValue(4, 43) = gp_Pnt(-105.71846722422283000000, +0.71431424921765596000, -87.04407147601585800000);
+    aWeights.ChangeValue(4, 44) = +0.99420030141669824000;
+    aPoles.ChangeValue(4, 44) = gp_Pnt(-112.04353021881408000000, +0.71378360593609291000, -84.75579106017932000000);
+    aWeights.ChangeValue(4, 45) = +0.99420274455295243000;
+    aPoles.ChangeValue(4, 45) = gp_Pnt(-115.30712351688430000000, +0.71347617951477893000, -83.52457168950516600000);
+    aWeights.ChangeValue(4, 46) = +0.99420507969516914000;
+    aPoles.ChangeValue(4, 46) = gp_Pnt(-118.55391065270935000000, +0.71318234625457844000, -82.24884224143599500000);
+    aWeights.ChangeValue(4, 47) = +0.99420795946419460000;
+    aPoles.ChangeValue(4, 47) = gp_Pnt(-121.78323693095153000000, +0.71281998990170370000, -80.92897147787398600000);
+    aWeights.ChangeValue(4, 48) = +0.99421073394729520000;
+    aPoles.ChangeValue(4, 48) = gp_Pnt(-124.99434061394447000000, +0.71247088780699119000, -79.56513754354314500000);
+    aWeights.ChangeValue(4, 49) = +0.99421382643715051000;
+    aPoles.ChangeValue(4, 49) = gp_Pnt(-128.18654935306802000000, +0.71208178090166396000, -78.15770189412481300000);
+    aWeights.ChangeValue(4, 50) = +0.99421719652005114000;
+    aPoles.ChangeValue(4, 50) = gp_Pnt(-131.35915951555538000000, +0.71165775668839981000, -76.70696466864815500000);
+    aWeights.ChangeValue(4, 51) = +0.99422402375653052000;
+    aPoles.ChangeValue(4, 51) = gp_Pnt(-137.43857370930490000000, +0.71079877890710363000, -73.82620311743470200000);
+    aWeights.ChangeValue(4, 52) = +0.99422797768691740000;
+    aPoles.ChangeValue(4, 52) = gp_Pnt(-140.34822128390073000000, +0.71030132584778982000, -72.40218284379008700000);
+    aWeights.ChangeValue(4, 53) = +0.99423084075610579000;
+    aPoles.ChangeValue(4, 53) = gp_Pnt(-143.23968120103163000000, +0.70994112075449667000, -70.94115847846593700000);
+    aWeights.ChangeValue(4, 54) = +0.99423623706224973000;
+    aPoles.ChangeValue(4, 54) = gp_Pnt(-146.11271315064005000000, +0.70926223398833632000, -69.44395856663618400000);
+    aWeights.ChangeValue(4, 55) = +0.99423948964319253000;
+    aPoles.ChangeValue(4, 55) = gp_Pnt(-148.96636467875118000000, +0.70885305306993507000, -67.91012785943519200000);
+    aWeights.ChangeValue(4, 56) = +0.99424477127021760000;
+    aPoles.ChangeValue(4, 56) = gp_Pnt(-151.80041102174371000000, +0.70818863107582075000, -66.34061951491401000000);
+    aWeights.ChangeValue(4, 57) = +0.99424976912431906000;
+    aPoles.ChangeValue(4, 57) = gp_Pnt(-154.61412826195317000000, +0.70755993553172780000, -64.73535576374381200000);
+    aWeights.ChangeValue(4, 58) = +0.99426106692542415000;
+    aPoles.ChangeValue(4, 58) = gp_Pnt(-160.41462700323274000000, +0.70613881146866808000, -61.32785485541679500000);
+    aWeights.ChangeValue(4, 59) = +0.99426869485276259000;
+    aPoles.ChangeValue(4, 59) = gp_Pnt(-163.39874797129167000000, +0.70517937516238605000, -59.52109641918814000000);
+    aWeights.ChangeValue(4, 60) = +0.99427273335051769000;
+    aPoles.ChangeValue(4, 60) = gp_Pnt(-166.35588428707737000000, +0.70467140031138198000, -57.67014968010805400000);
+    aWeights.ChangeValue(4, 61) = +0.99428524121150996000;
+    aPoles.ChangeValue(4, 61) = gp_Pnt(-169.29147402675417000000, +0.70309833118760823000, -55.78569706052214600000);
+    aWeights.ChangeValue(4, 62) = +0.99428879891231192000;
+    aPoles.ChangeValue(4, 62) = gp_Pnt(-172.19641321622018000000, +0.70265088960130029000, -53.85463096447261900000);
+    aWeights.ChangeValue(4, 63) = +0.99430150819260854000;
+    aPoles.ChangeValue(4, 63) = gp_Pnt(-175.07684836851479000000, +0.70105264832187786000, -51.88726956537038900000);
+    aWeights.ChangeValue(4, 64) = +0.99431053021705873000;
+    aPoles.ChangeValue(4, 64) = gp_Pnt(-177.92932492963632000000, +0.69991818857623234000, -49.88000737868681300000);
+    aWeights.ChangeValue(4, 65) = +0.99432262020918794000;
+    aPoles.ChangeValue(4, 65) = gp_Pnt(-180.75433885652521000000, +0.69839807993520564000, -47.83460859504128800000);
+    aWeights.ChangeValue(4, 66) = +0.99433338093448842000;
+    aPoles.ChangeValue(4, 66) = gp_Pnt(-183.37745173242254000000, +0.69704510882650861000, -45.93530736698277700000);
+    aWeights.ChangeValue(4, 67) = +0.99434840096468768000;
+    aPoles.ChangeValue(4, 67) = gp_Pnt(-185.97711214268182000000, +0.69515696483250133000, -44.00334265992864100000);
+    aWeights.ChangeValue(4, 68) = +0.99435212441487342000;
+    aPoles.ChangeValue(4, 68) = gp_Pnt(-188.55092060214918000000, +0.69468843290184534000, -42.03706245316480100000);
+    aWeights.ChangeValue(4, 69) = +0.99438632495837886000;
+    aPoles.ChangeValue(4, 69) = gp_Pnt(-191.10351948864678000000, +0.69039032514405918000, -40.04240176159244400000);
+    aWeights.ChangeValue(4, 70) = +0.99437474610357146000;
+    aPoles.ChangeValue(4, 70) = gp_Pnt(-193.62512272227769000000, +0.69184483548244469000, -38.00925246210125900000);
+    aWeights.ChangeValue(4, 71) = +0.99442029730057158000;
+    aPoles.ChangeValue(4, 71) = gp_Pnt(-196.12715745709386000000, +0.68612074693666814000, -35.95207510226987300000);
+    aWeights.ChangeValue(4, 72) = +0.99443382321708784000;
+    aPoles.ChangeValue(4, 72) = gp_Pnt(-198.59871781224271000000, +0.68442148883790921000, -33.85842837168388500000);
+    aWeights.ChangeValue(4, 73) = +0.99445918644353237000;
+    aPoles.ChangeValue(4, 73) = gp_Pnt(-201.04387700918369000000, +0.68123533540985159000, -31.73471330438436400000);
+    aWeights.ChangeValue(4, 74) = +0.99447784672499884000;
+    aPoles.ChangeValue(4, 74) = gp_Pnt(-203.48830197003542000000, +0.67889067518118906000, -29.61036197082074800000);
+    aWeights.ChangeValue(4, 75) = +0.99454111417144087000;
+    aPoles.ChangeValue(4, 75) = gp_Pnt(-205.90905874701556000000, +0.67094847421818948000, -27.45911353863423800000);
+    aWeights.ChangeValue(4, 76) = +0.99445650432969468000;
+    aPoles.ChangeValue(4, 76) = gp_Pnt(-208.28851122415659000000, +0.68156618053615436000, -25.25989914496455000000);
+    aWeights.ChangeValue(4, 77) = +0.99472383917628937000;
+    aPoles.ChangeValue(4, 77) = gp_Pnt(-210.66819860636727000000, +0.64801004101885640000, -23.06997485052475800000);
+    aWeights.ChangeValue(4, 78) = +0.99465154011060308000;
+    aPoles.ChangeValue(4, 78) = gp_Pnt(-212.99829629837927000000, +0.65709020698928045000, -20.81293704958459000000);
+    aWeights.ChangeValue(4, 79) = +0.99469225299704522000;
+    aPoles.ChangeValue(4, 79) = gp_Pnt(-215.28778722004142000000, +0.65198647566642243000, -18.52648999480212300000);
+    aWeights.ChangeValue(4, 80) = +0.99473072608314816000;
+    aPoles.ChangeValue(4, 80) = gp_Pnt(-217.56233176434088000000, +0.64714607636795729000, -16.22125679272672700000);
+    aWeights.ChangeValue(4, 81) = +0.99492849872148770000;
+    aPoles.ChangeValue(4, 81) = gp_Pnt(-219.81591407133737000000, +0.62237708094437050000, -13.90082269618381800000);
+    aWeights.ChangeValue(5, 1) = +0.99802424639217535000;
+    aPoles.ChangeValue(5, 1) = gp_Pnt(+132.45622778603641000000, +0.24240580374773624000, -67.51941232824347600000);
+    aWeights.ChangeValue(5, 2) = +0.99802234515930366000;
+    aPoles.ChangeValue(5, 2) = gp_Pnt(+129.39621499227619000000, +0.24264599956164210000, -69.20932849809996400000);
+    aWeights.ChangeValue(5, 3) = +0.99802076064199163000;
+    aPoles.ChangeValue(5, 3) = gp_Pnt(+126.31320722587012000000, +0.24284620475411531000, -70.85757023346207000000);
+    aWeights.ChangeValue(5, 4) = +0.99801949820656444000;
+    aPoles.ChangeValue(5, 4) = gp_Pnt(+123.20785947444472000000, +0.24300571706284735000, -72.46379895615213200000);
+    aWeights.ChangeValue(5, 5) = +0.99801796211084626000;
+    aPoles.ChangeValue(5, 5) = gp_Pnt(+120.08075545981777000000, +0.24319982314295371000, -74.02745916652884300000);
+    aWeights.ChangeValue(5, 6) = +0.99801651211139986000;
+    aPoles.ChangeValue(5, 6) = gp_Pnt(+116.93263892914923000000, +0.24338306180645181000, -75.54835063375608700000);
+    aWeights.ChangeValue(5, 7) = +0.99801547938007906000;
+    aPoles.ChangeValue(5, 7) = gp_Pnt(+113.76425167349765000000, +0.24351357797625062000, -77.02627451676777100000);
+    aWeights.ChangeValue(5, 8) = +0.99801427699593348000;
+    aPoles.ChangeValue(5, 8) = gp_Pnt(+110.57618061475338000000, +0.24366553774363486000, -78.46071663606139200000);
+    aWeights.ChangeValue(5, 9) = +0.99801219521177365000;
+    aPoles.ChangeValue(5, 9) = gp_Pnt(+104.16217613984874000000, +0.24392865233284403000, -81.24228081548614000000);
+    aWeights.ChangeValue(5, 10) = +0.99801119017243534000;
+    aPoles.ChangeValue(5, 10) = gp_Pnt(+100.93622072836907000000, +0.24405568433254640000, -82.58935804874866400000);
+    aWeights.ChangeValue(5, 11) = +0.99801030363411136000;
+    aPoles.ChangeValue(5, 11) = gp_Pnt(+97.69202612265307600000, +0.24416774311013159000, -83.89246252379766100000);
+    aWeights.ChangeValue(5, 12) = +0.99800944410126124000;
+    aPoles.ChangeValue(5, 12) = gp_Pnt(+94.43027249107268500000, +0.24427639255629080000, -85.15127753548810600000);
+    aWeights.ChangeValue(5, 13) = +0.99800863606905588000;
+    aPoles.ChangeValue(5, 13) = gp_Pnt(+91.15167507122404800000, +0.24437853537532742000, -86.36553541507953500000);
+    aWeights.ChangeValue(5, 14) = +0.99800791446282866000;
+    aPoles.ChangeValue(5, 14) = gp_Pnt(+87.85695090009397700000, +0.24446975628264125000, -87.53498464352057300000);
+    aWeights.ChangeValue(5, 15) = +0.99800720379704511000;
+    aPoles.ChangeValue(5, 15) = gp_Pnt(+84.54678770958248900000, +0.24455959646371978000, -88.65934979276558200000);
+    aWeights.ChangeValue(5, 16) = +0.99800525790220262000;
+    aPoles.ChangeValue(5, 16) = gp_Pnt(+74.57222162875666500000, +0.24480559775636487000, -91.89655746079053200000);
+    aWeights.ChangeValue(5, 17) = +0.99800413521623044000;
+    aPoles.ChangeValue(5, 17) = gp_Pnt(+67.86385477996348900000, +0.24494753702776123000, -93.87334138726605200000);
+    aWeights.ChangeValue(5, 18) = +0.99800316736440708000;
+    aPoles.ChangeValue(5, 18) = gp_Pnt(+61.10212188651380700000, +0.24506990714535715000, -95.66687639706128700000);
+    aWeights.ChangeValue(5, 19) = +0.99800233531441618000;
+    aPoles.ChangeValue(5, 19) = gp_Pnt(+54.29260355218377000000, +0.24517511152453569000, -97.27552257290322800000);
+    aWeights.ChangeValue(5, 20) = +0.99800162387306812000;
+    aPoles.ChangeValue(5, 20) = gp_Pnt(+47.44116356008504500000, +0.24526506890417449000, -98.69787956398771200000);
+    aWeights.ChangeValue(5, 21) = +0.99800102168629923000;
+    aPoles.ChangeValue(5, 21) = gp_Pnt(+40.55394899036769400000, +0.24534121333759545000, -99.93278652962781900000);
+    aWeights.ChangeValue(5, 22) = +0.99800052123917249000;
+    aPoles.ChangeValue(5, 22) = gp_Pnt(+33.63739034141031700000, +0.24540449418574758000, -100.97932209286283000000);
+    aWeights.ChangeValue(5, 23) = +0.99799971600020576000;
+    aPoles.ChangeValue(5, 23) = gp_Pnt(+19.75877904385457000000, +0.24550631764576064000, -102.69427034587730000000);
+    aWeights.ChangeValue(5, 24) = +0.99799940935225595000;
+    aPoles.ChangeValue(5, 24) = gp_Pnt(+12.79621461719473900000, +0.24554509442498113000, -103.36264862290150000000);
+    aWeights.ChangeValue(5, 25) = +0.99799919351964361000;
+    aPoles.ChangeValue(5, 25) = gp_Pnt(+5.81664173483571470000, +0.24557238768930081000, -103.84122357926364000000);
+    aWeights.ChangeValue(5, 26) = +0.99799906478454914000;
+    aPoles.ChangeValue(5, 26) = gp_Pnt(-1.17384006705611750000, +0.24558866712534574000, -104.12950288114470000000);
+    aWeights.ChangeValue(5, 27) = +0.99799902110371452000;
+    aPoles.ChangeValue(5, 27) = gp_Pnt(-8.16916502467035950000, +0.24559419086566145000, -104.22721740658889000000);
+    aWeights.ChangeValue(5, 28) = +0.99799906210844525000;
+    aPoles.ChangeValue(5, 28) = gp_Pnt(-15.16330109337111900000, +0.24558900548798951000, -104.13432123956672000000);
+    aWeights.ChangeValue(5, 29) = +0.99799918910460916000;
+    aPoles.ChangeValue(5, 29) = gp_Pnt(-22.15024989420349800000, +0.24557294601509544000, -103.85099166853988000000);
+    aWeights.ChangeValue(5, 30) = +0.99799962065035952000;
+    aPoles.ChangeValue(5, 30) = gp_Pnt(-36.09784025928350100000, +0.24551837507724711000, -102.90426687944763000000);
+    aWeights.ChangeValue(5, 31) = +0.99799992612548860000;
+    aPoles.ChangeValue(5, 31) = gp_Pnt(-43.05848024708384300000, +0.24547974681812620000, -102.24087223758063000000);
+    aWeights.ChangeValue(5, 32) = +0.99800032324181287000;
+    aPoles.ChangeValue(5, 32) = gp_Pnt(-50.00000136683811300000, +0.24542953068576923000, -101.38784584473753000000);
+    aWeights.ChangeValue(5, 33) = +0.99800081646744143000;
+    aPoles.ChangeValue(5, 33) = gp_Pnt(-56.91647304260395400000, +0.24536716218422927000, -100.34581179308852000000);
+    aWeights.ChangeValue(5, 34) = +0.99800141299480460000;
+    aPoles.ChangeValue(5, 34) = gp_Pnt(-63.80199929133657100000, +0.24529173277606747000, -99.11561770524215800000);
+    aWeights.ChangeValue(5, 35) = +0.99800212274065292000;
+    aPoles.ChangeValue(5, 35) = gp_Pnt(-70.65071863638867500000, +0.24520198988589620000, -97.69833476064030700000);
+    aWeights.ChangeValue(5, 36) = +0.99800295834605834000;
+    aPoles.ChangeValue(5, 36) = gp_Pnt(-77.45680402323041800000, +0.24509633690518939000, -96.09525772913629300000);
+    aWeights.ChangeValue(5, 37) = +0.99800438851665707000;
+    aPoles.ChangeValue(5, 37) = gp_Pnt(-87.35194268844766400000, +0.24491551610541196000, -93.47806376363495000000);
+    aWeights.ChangeValue(5, 38) = +0.99800487302440644000;
+    aPoles.ChangeValue(5, 38) = gp_Pnt(-90.47898339307414500000, +0.24485425955861742000, -92.60850028621504700000);
+    aWeights.ChangeValue(5, 39) = +0.99800538998403221000;
+    aPoles.ChangeValue(5, 39) = gp_Pnt(-93.59500505694055100000, +0.24478890139349116000, -91.69936647202810300000);
+    aWeights.ChangeValue(5, 40) = +0.99800594114472096000;
+    aPoles.ChangeValue(5, 40) = gp_Pnt(-96.69942959625443300000, +0.24471922075774133000, -90.75082469114758500000);
+    aWeights.ChangeValue(5, 41) = +0.99800652872047502000;
+    aPoles.ChangeValue(5, 41) = gp_Pnt(-99.79168063143930600000, +0.24464493811196314000, -89.76304779373697300000);
+    aWeights.ChangeValue(5, 42) = +0.99800715539011187000;
+    aPoles.ChangeValue(5, 42) = gp_Pnt(-102.87118348036965000000, +0.24456571523016235000, -88.73621911304020700000);
+    aWeights.ChangeValue(5, 43) = +0.99800782429726465000;
+    aPoles.ChangeValue(5, 43) = gp_Pnt(-105.93736515171811000000, +0.24448115520035879000, -87.67053246863201800000);
+    aWeights.ChangeValue(5, 44) = +0.99800929984371112000;
+    aPoles.ChangeValue(5, 44) = gp_Pnt(-112.27672847568951000000, +0.24429462970498794000, -85.37690123862388700000);
+    aWeights.ChangeValue(5, 45) = +0.99801015470633669000;
+    aPoles.ChangeValue(5, 45) = gp_Pnt(-115.54769755356581000000, +0.24418656943131900000, -84.14279592325505100000);
+    aWeights.ChangeValue(5, 46) = +0.99801097177455889000;
+    aPoles.ChangeValue(5, 46) = gp_Pnt(-118.80182311076892000000, +0.24408328894344730000, -82.86408351153079400000);
+    aWeights.ChangeValue(5, 47) = +0.99801197940129383000;
+    aPoles.ChangeValue(5, 47) = gp_Pnt(-122.03843417449148000000, +0.24395592759703674000, -81.54111184389478200000);
+    aWeights.ChangeValue(5, 48) = +0.99801295017559344000;
+    aPoles.ChangeValue(5, 48) = gp_Pnt(-125.25678060282321000000, +0.24383322797751039000, -80.17408187890907800000);
+    aWeights.ChangeValue(5, 49) = +0.99801403221073270000;
+    aPoles.ChangeValue(5, 49) = gp_Pnt(-128.45617956663568000000, +0.24369647262362162000, -78.76334161483092100000);
+    aWeights.ChangeValue(5, 50) = +0.99801521135655380000;
+    aPoles.ChangeValue(5, 50) = gp_Pnt(-131.63592529803751000000, +0.24354745092247693000, -77.30919404502431300000);
+    aWeights.ChangeValue(5, 51) = +0.99801760008187401000;
+    aPoles.ChangeValue(5, 51) = gp_Pnt(-137.72900951211963000000, +0.24324557860805471000, -74.42165429070698200000);
+    aWeights.ChangeValue(5, 52) = +0.99801898346970708000;
+    aPoles.ChangeValue(5, 52) = gp_Pnt(-140.64518873661288000000, +0.24307076523393223000, -72.99426192178911800000);
+    aWeights.ChangeValue(5, 53) = +0.99801998518786039000;
+    aPoles.ChangeValue(5, 53) = gp_Pnt(-143.54316005505726000000, +0.24294418386170585000, -71.52981926220020600000);
+    aWeights.ChangeValue(5, 54) = +0.99802187318168345000;
+    aPoles.ChangeValue(5, 54) = gp_Pnt(-146.42260629144496000000, +0.24270562978064991000, -70.02903356238938700000);
+    aWeights.ChangeValue(5, 55) = +0.99802301113888081000;
+    aPoles.ChangeValue(5, 55) = gp_Pnt(-149.28266198929455000000, +0.24256185427332766000, -68.49161271016626500000);
+    aWeights.ChangeValue(5, 56) = +0.99802485896051119000;
+    aPoles.ChangeValue(5, 56) = gp_Pnt(-152.12302992679020000000, +0.24232840183433180000, -66.91836178765569800000);
+    aWeights.ChangeValue(5, 57) = +0.99802660746095961000;
+    aPoles.ChangeValue(5, 57) = gp_Pnt(-154.94301695331424000000, +0.24210751871096883000, -65.30929034698890200000);
+    aWeights.ChangeValue(5, 58) = +0.99803055992501044000;
+    aPoles.ChangeValue(5, 58) = gp_Pnt(-160.75642720778953000000, +0.24160825342055195000, -61.89368007550259400000);
+    aWeights.ChangeValue(5, 59) = +0.99803322842160846000;
+    aPoles.ChangeValue(5, 59) = gp_Pnt(-163.74717060555361000000, +0.24127121961594802000, -60.08255013672670200000);
+    aWeights.ChangeValue(5, 60) = +0.99803464125717123000;
+    aPoles.ChangeValue(5, 60) = gp_Pnt(-166.71086689375946000000, +0.24109275824918924000, -58.22731479955884700000);
+    aWeights.ChangeValue(5, 61) = +0.99803901668628470000;
+    aPoles.ChangeValue(5, 61) = gp_Pnt(-169.65297207222594000000, +0.24054025241076704000, -56.33806928337021700000);
+    aWeights.ChangeValue(5, 62) = +0.99804026123435818000;
+    aPoles.ChangeValue(5, 62) = gp_Pnt(-172.56427255537395000000, +0.24038308942389072000, -54.40260496408483000000);
+    aWeights.ChangeValue(5, 63) = +0.99804470691060532000;
+    aPoles.ChangeValue(5, 63) = gp_Pnt(-175.45101016300779000000, +0.23982181928534163000, -52.43032166263763100000);
+    aWeights.ChangeValue(5, 64) = +0.99804786265202527000;
+    aPoles.ChangeValue(5, 64) = gp_Pnt(-178.30970270493245000000, +0.23942347201733374000, -50.41823769283568900000);
+    aWeights.ChangeValue(5, 65) = +0.99805209132460959000;
+    aPoles.ChangeValue(5, 65) = gp_Pnt(-181.14080917168710000000, +0.23888978094458979000, -48.36782293133622100000);
+    aWeights.ChangeValue(5, 66) = +0.99805585511722006000;
+    aPoles.ChangeValue(5, 66) = gp_Pnt(-183.76963089028271000000, +0.23841474156011525000, -46.46384963887197700000);
+    aWeights.ChangeValue(5, 67) = +0.99806110806389992000;
+    aPoles.ChangeValue(5, 67) = gp_Pnt(-186.37480135254410000000, +0.23775204017864099000, -44.52702607060874100000);
+    aWeights.ChangeValue(5, 68) = +0.99806241123039841000;
+    aPoles.ChangeValue(5, 68) = gp_Pnt(-188.95443339023049000000, +0.23758721013871806000, -42.55611011320790700000);
+    aWeights.ChangeValue(5, 69) = +0.99807437025022461000;
+    aPoles.ChangeValue(5, 69) = gp_Pnt(-191.51185439080101000000, +0.23607937004601673000, -40.55588840407725800000);
+    aWeights.ChangeValue(5, 70) = +0.99807032269304363000;
+    aPoles.ChangeValue(5, 70) = gp_Pnt(-194.03956238778505000000, +0.23658914396266717000, -38.51843887702921200000);
+    aWeights.ChangeValue(5, 71) = +0.99808625039358922000;
+    aPoles.ChangeValue(5, 71) = gp_Pnt(-196.54607703546344000000, +0.23458111537982981000, -36.45513422497234800000);
+    aWeights.ChangeValue(5, 72) = +0.99809097922833689000;
+    aPoles.ChangeValue(5, 72) = gp_Pnt(-199.02284030117690000000, +0.23398526561785285000, -34.35633603568415100000);
+    aWeights.ChangeValue(5, 73) = +0.99809984631895676000;
+    aPoles.ChangeValue(5, 73) = gp_Pnt(-201.47284391020807000000, +0.23286808083306546000, -32.22700780168109700000);
+    aWeights.ChangeValue(5, 74) = +0.99810637147739267000;
+    aPoles.ChangeValue(5, 74) = gp_Pnt(-203.92239692899503000000, +0.23204542949601353000, -30.09717639714928000000);
+    aWeights.ChangeValue(5, 75) = +0.99812847998973830000;
+    aPoles.ChangeValue(5, 75) = gp_Pnt(-206.34684289021220000000, +0.22926391512904498000, -27.93902362306789300000);
+    aWeights.ChangeValue(5, 76) = +0.99809892249694432000;
+    aPoles.ChangeValue(5, 76) = gp_Pnt(-208.73420674519565000000, +0.23297935369059405000, -25.73750919512989600000);
+    aWeights.ChangeValue(5, 77) = +0.99819234539430379000;
+    aPoles.ChangeValue(5, 77) = gp_Pnt(-211.11258262007470000000, +0.22122441504945897000, -23.53328220960779800000);
+    aWeights.ChangeValue(5, 78) = +0.99816706733442118000;
+    aPoles.ChangeValue(5, 78) = gp_Pnt(-213.44890831521380000000, +0.22441150695403267000, -21.27426418813643800000);
+    aWeights.ChangeValue(5, 79) = +0.99818127777024523000;
+    aPoles.ChangeValue(5, 79) = gp_Pnt(-215.74298068197336000000, +0.22262736656649654000, -18.98075706196405200000);
+    aWeights.ChangeValue(5, 80) = +0.99819475509184485000;
+    aPoles.ChangeValue(5, 80) = gp_Pnt(-218.02209738817496000000, +0.22092240555297402000, -16.66880151580776100000);
+    aWeights.ChangeValue(5, 81) = +0.99826376750413803000;
+    aPoles.ChangeValue(5, 81) = gp_Pnt(-220.27506837008727000000, +0.21227676902692139000, -14.33587171753685400000);
+    aWeights.ChangeValue(6, 1) = +1.00955713824395920000;
+    aPoles.ChangeValue(6, 1) = gp_Pnt(+132.82497533600920000000, -0.00000000000000355271, -68.18672206105269100000);
+    aWeights.ChangeValue(6, 2) = +1.00956608612165510000;
+    aPoles.ChangeValue(6, 2) = gp_Pnt(+129.75720107675980000000, -0.00000000000001501048, -69.88134023490506800000);
+    aWeights.ChangeValue(6, 3) = +1.00957354292813720000;
+    aPoles.ChangeValue(6, 3) = gp_Pnt(+126.66630562875893000000, +0.00000000000001468880, -71.53414324810810900000);
+    aWeights.ChangeValue(6, 4) = +1.00957948395969920000;
+    aPoles.ChangeValue(6, 4) = gp_Pnt(+123.55299204973852000000, -0.00000000000002420214, -73.14476521965842400000);
+    aWeights.ChangeValue(6, 5) = +1.00958671248272540000;
+    aPoles.ChangeValue(6, 5) = gp_Pnt(+120.41786571412476000000, +0.00000000000000774289, -74.71276629883676900000);
+    aWeights.ChangeValue(6, 6) = +1.00959353559449030000;
+    aPoles.ChangeValue(6, 6) = gp_Pnt(+117.26165038381876000000, +0.00000000000002827238, -76.23787924846354300000);
+    aWeights.ChangeValue(6, 7) = +1.00959839503053540000;
+    aPoles.ChangeValue(6, 7) = gp_Pnt(+114.08506189168672000000, -0.00000000000002567399, -77.71984701658058700000);
+    aWeights.ChangeValue(6, 8) = +1.00960405269295440000;
+    aPoles.ChangeValue(6, 8) = gp_Pnt(+110.88875430250306000000, +0.00000000000001531652, -79.15824703626482500000);
+    aWeights.ChangeValue(6, 9) = +1.00961384794965610000;
+    aPoles.ChangeValue(6, 9) = gp_Pnt(+104.45816547225203000000, +0.00000000000002372811, -81.94743615023858800000);
+    aWeights.ChangeValue(6, 10) = +1.00961857675613920000;
+    aPoles.ChangeValue(6, 10) = gp_Pnt(+101.22387341781818000000, -0.00000000000003253030, -83.29820264563102200000);
+    aWeights.ChangeValue(6, 11) = +1.00962274789490230000;
+    aPoles.ChangeValue(6, 11) = gp_Pnt(+97.97127406275538400000, +0.00000000000002165813, -84.60486564781918200000);
+    aWeights.ChangeValue(6, 12) = +1.00962679188945900000;
+    aPoles.ChangeValue(6, 12) = gp_Pnt(+94.70106106239124700000, +0.00000000000003307844, -85.86712155505158300000);
+    aWeights.ChangeValue(6, 13) = +1.00963059350859920000;
+    aPoles.ChangeValue(6, 13) = gp_Pnt(+91.41394873512904000000, -0.00000000000001002370, -87.08469757155246800000);
+    aWeights.ChangeValue(6, 14) = +1.00963398843787310000;
+    aPoles.ChangeValue(6, 14) = gp_Pnt(+88.11065082060795800000, -0.00000000000001620026, -88.25733602781997400000);
+    aWeights.ChangeValue(6, 15) = +1.00963733185343440000;
+    aPoles.ChangeValue(6, 15) = gp_Pnt(+84.79187377942922400000, +0.00000000000001387836, -89.38476986722990600000);
+    aWeights.ChangeValue(6, 16) = +1.00964648640037490000;
+    aPoles.ChangeValue(6, 16) = gp_Pnt(+74.79138897281484300000, +0.00000000000001147648, -92.63077806554609600000);
+    aWeights.ChangeValue(6, 17) = +1.00965176794147980000;
+    aPoles.ChangeValue(6, 17) = gp_Pnt(+68.06556894151637500000, +0.00000000000001348105, -94.61292925638954900000);
+    aWeights.ChangeValue(6, 18) = +1.00965632094816880000;
+    aPoles.ChangeValue(6, 18) = gp_Pnt(+61.28620656548358900000, +0.00000000000001132208, -96.41133393799678700000);
+    aWeights.ChangeValue(6, 19) = +1.00966023501695920000;
+    aPoles.ChangeValue(6, 19) = gp_Pnt(+54.45890525472331200000, +0.00000000000000779610, -98.02434736777235000000);
+    aWeights.ChangeValue(6, 20) = +1.00966358166845540000;
+    aPoles.ChangeValue(6, 20) = gp_Pnt(+47.58955228763309700000, +0.00000000000000496426, -99.45056478986435900000);
+    aWeights.ChangeValue(6, 21) = +1.00966641434734750000;
+    aPoles.ChangeValue(6, 21) = gp_Pnt(+40.68431826182812500000, +0.00000000000000415229, -100.68882169811890000000);
+    aWeights.ChangeValue(6, 22) = +1.00966876842241240000;
+    aPoles.ChangeValue(6, 22) = gp_Pnt(+33.74965652868991100000, +0.00000000000000595055, -101.73819405254569000000);
+    aWeights.ChangeValue(6, 23) = +1.00967255617655690000;
+    aPoles.ChangeValue(6, 23) = gp_Pnt(+19.83474481990451800000, +0.00000000000000626687, -103.45778313292877000000);
+    aWeights.ChangeValue(6, 24) = +1.00967399859793900000;
+    aPoles.ChangeValue(6, 24) = gp_Pnt(+12.85396744583563800000, +0.00000000000000961706, -104.12796934503771000000);
+    aWeights.ChangeValue(6, 25) = +1.00967501382969150000;
+    aPoles.ChangeValue(6, 25) = gp_Pnt(+5.85612456199985140000, +0.00000000000001451316, -104.60783896197547000000);
+    aWeights.ChangeValue(6, 26) = +1.00967561936958040000;
+    aPoles.ChangeValue(6, 26) = gp_Pnt(-1.15266320632332260000, +0.00000000000001739414, -104.89689790453474000000);
+    aWeights.ChangeValue(6, 27) = +1.00967582483410530000;
+    aPoles.ChangeValue(6, 27) = gp_Pnt(-8.16630892272242730000, +0.00000000000001688939, -104.99487618531697000000);
+    aWeights.ChangeValue(6, 28) = +1.00967563195849790000;
+    aPoles.ChangeValue(6, 28) = gp_Pnt(-15.17875958769639600000, +0.00000000000001381871, -104.90172793642448000000);
+    aWeights.ChangeValue(6, 29) = +1.00967503459672230000;
+    aPoles.ChangeValue(6, 29) = gp_Pnt(-22.18399638815323600000, +0.00000000000001119232, -104.61763141615558000000);
+    aWeights.ChangeValue(6, 30) = +1.00967300468446440000;
+    aPoles.ChangeValue(6, 30) = gp_Pnt(-36.16808769247344200000, +0.00000000000001926896, -103.66834538209933000000);
+    aWeights.ChangeValue(6, 31) = +1.00967156777535520000;
+    aPoles.ChangeValue(6, 31) = gp_Pnt(-43.14695215605046700000, +0.00000000000002086710, -103.00315490229345000000);
+    aWeights.ChangeValue(6, 32) = +1.00966969979090850000;
+    aPoles.ChangeValue(6, 32) = gp_Pnt(-50.10664482445217500000, +0.00000000000002115378, -102.14781821392242000000);
+    aWeights.ChangeValue(6, 33) = +1.00966737970297340000;
+    aPoles.ChangeValue(6, 33) = gp_Pnt(-57.04121502398449900000, +0.00000000000002158031, -101.10296070558179000000);
+    aWeights.ChangeValue(6, 34) = +1.00966457365849420000;
+    aPoles.ChangeValue(6, 34) = gp_Pnt(-63.94474533155499800000, +0.00000000000002290082, -99.86943240681669900000);
+    aWeights.ChangeValue(6, 35) = +1.00966123497950670000;
+    aPoles.ChangeValue(6, 35) = gp_Pnt(-70.81135197820185600000, +0.00000000000002517228, -98.44830786498150100000);
+    aWeights.ChangeValue(6, 36) = +1.00965730416314160000;
+    aPoles.ChangeValue(6, 36) = gp_Pnt(-77.63518524225725100000, +0.00000000000002775445, -96.84088598857995600000);
+    aWeights.ChangeValue(6, 37) = +1.00965057624219750000;
+    aPoles.ChangeValue(6, 37) = gp_Pnt(-87.55609990295042200000, +0.00000000000002423047, -94.21659328767886200000);
+    aWeights.ChangeValue(6, 38) = +1.00964829695753600000;
+    aPoles.ChangeValue(6, 38) = gp_Pnt(-90.69129861847109500000, +0.00000000000002587407, -93.34466557470412300000);
+    aWeights.ChangeValue(6, 39) = +1.00964586498085130000;
+    aPoles.ChangeValue(6, 39) = gp_Pnt(-93.81544408055053500000, +0.00000000000003006614, -92.43305897005754400000);
+    aWeights.ChangeValue(6, 40) = +1.00964327207695040000;
+    aPoles.ChangeValue(6, 40) = gp_Pnt(-96.92795589621758300000, +0.00000000000003388207, -91.48193626907418300000);
+    aWeights.ChangeValue(6, 41) = +1.00964050782223150000;
+    aPoles.ChangeValue(6, 41) = gp_Pnt(-100.02825520717420000000, +0.00000000000003564727, -90.49147079864104600000);
+    aWeights.ChangeValue(6, 42) = +1.00963755960468200000;
+    aPoles.ChangeValue(6, 42) = gp_Pnt(-103.11576472135789000000, +0.00000000000003493709, -89.46184640324143800000);
+    aWeights.ChangeValue(6, 43) = +1.00963441262388120000;
+    aPoles.ChangeValue(6, 43) = gp_Pnt(-106.18990874397944000000, +0.00000000000003257692, -88.39325742978746800000);
+    aWeights.ChangeValue(6, 44) = +1.00962747055172470000;
+    aPoles.ChangeValue(6, 44) = gp_Pnt(-112.54574015681582000000, +0.00000000000006160655, -86.09336936272072200000);
+    aWeights.ChangeValue(6, 45) = +1.00962344856191890000;
+    aPoles.ChangeValue(6, 45) = gp_Pnt(-115.82520602454126000000, -0.00000000000003931317, -84.85588414554271700000);
+    aWeights.ChangeValue(6, 46) = +1.00961960432502520000;
+    aPoles.ChangeValue(6, 46) = gp_Pnt(-119.08778487668772000000, +0.00000000000016494845, -83.57368219250022900000);
+    aWeights.ChangeValue(6, 47) = +1.00961486341637220000;
+    aPoles.ChangeValue(6, 47) = gp_Pnt(-122.33277704237545000000, -0.00000000000006102663, -82.24707666574315100000);
+    aWeights.ChangeValue(6, 48) = +1.00961029578642010000;
+    aPoles.ChangeValue(6, 48) = gp_Pnt(-125.55945424028559000000, +0.00000000000005443726, -80.87630621413205700000);
+    aWeights.ChangeValue(6, 49) = +1.00960520453872830000;
+    aPoles.ChangeValue(6, 49) = gp_Pnt(-128.76711471386264000000, +0.00000000000006731284, -79.46169679871513800000);
+    aWeights.ChangeValue(6, 50) = +1.00959965618806670000;
+    aPoles.ChangeValue(6, 50) = gp_Pnt(-131.95505034236234000000, +0.00000000000001744703, -78.00355594499717400000);
+    aWeights.ChangeValue(6, 51) = +1.00958841592259230000;
+    aPoles.ChangeValue(6, 51) = gp_Pnt(-138.06383173526737000000, +0.00000000000005091738, -75.10807262033468100000);
+    aWeights.ChangeValue(6, 52) = +1.00958190609477040000;
+    aPoles.ChangeValue(6, 52) = gp_Pnt(-140.98751167669514000000, +0.00000000000001249767, -73.67671445695528100000);
+    aWeights.ChangeValue(6, 53) = +1.00957719226123470000;
+    aPoles.ChangeValue(6, 53) = gp_Pnt(-143.89297197091258000000, +0.00000000000004304958, -72.20827197874005800000);
+    aWeights.ChangeValue(6, 54) = +1.00956830736954160000;
+    aPoles.ChangeValue(6, 54) = gp_Pnt(-146.77976177895343000000, +0.00000000000014315600, -70.70325097869228200000);
+    aWeights.ChangeValue(6, 55) = +1.00956295195680430000;
+    aPoles.ChangeValue(6, 55) = gp_Pnt(-149.64716302220674000000, -0.00000000000013374459, -69.16163316263994400000);
+    aWeights.ChangeValue(6, 56) = +1.00955425555763600000;
+    aPoles.ChangeValue(6, 56) = gp_Pnt(-152.49476001470052000000, +0.00000000000014982315, -67.58397318476696100000);
+    aWeights.ChangeValue(6, 57) = +1.00954602613024340000;
+    aPoles.ChangeValue(6, 57) = gp_Pnt(-155.32190503332637000000, -0.00000000000000021066, -65.97043121899140800000);
+    aWeights.ChangeValue(6, 58) = +1.00952742278739690000;
+    aPoles.ChangeValue(6, 58) = gp_Pnt(-161.15007234465017000000, -0.00000000000001992904, -62.54527347940126700000);
+    aWeights.ChangeValue(6, 59) = +1.00951486183122910000;
+    aPoles.ChangeValue(6, 59) = gp_Pnt(-164.14837014605524000000, +0.00000000000023572067, -60.72896647597298900000);
+    aWeights.ChangeValue(6, 60) = +1.00950821186278380000;
+    aPoles.ChangeValue(6, 60) = gp_Pnt(-167.11960531963629000000, -0.00000000000028988207, -58.86870049528032900000);
+    aWeights.ChangeValue(6, 61) = +1.00948761363721440000;
+    aPoles.ChangeValue(6, 61) = gp_Pnt(-170.06906478280905000000, +0.00000000000040689923, -56.97372124744497800000);
+    aWeights.ChangeValue(6, 62) = +1.00948175483910860000;
+    aPoles.ChangeValue(6, 62) = gp_Pnt(-172.98765254825670000000, -0.00000000000024250881, -55.03312548926784600000);
+    aWeights.ChangeValue(6, 63) = +1.00946082358368820000;
+    aPoles.ChangeValue(6, 63) = gp_Pnt(-175.88148729884773000000, +0.00000000000015443744, -53.05496328096450000000);
+    aWeights.ChangeValue(6, 64) = +1.00944596410276510000;
+    aPoles.ChangeValue(6, 64) = gp_Pnt(-178.74719668858941000000, +0.00000000000002184305, -51.03719587787818300000);
+    aWeights.ChangeValue(6, 65) = +1.00942605045267690000;
+    aPoles.ChangeValue(6, 65) = gp_Pnt(-181.58512029181043000000, +0.00000000000003863576, -48.98084041218928800000);
+    aWeights.ChangeValue(6, 66) = +1.00940832657292460000;
+    aPoles.ChangeValue(6, 66) = gp_Pnt(-184.22041885135505000000, +0.00000000000012642202, -47.07128183802177500000);
+    aWeights.ChangeValue(6, 67) = +1.00938358350016230000;
+    aPoles.ChangeValue(6, 67) = gp_Pnt(-186.83172267077580000000, -0.00000000000026075896, -45.12863792869809700000);
+    aWeights.ChangeValue(6, 68) = +1.00937745534316470000;
+    aPoles.ChangeValue(6, 68) = gp_Pnt(-189.41814135962036000000, +0.00000000000050815389, -43.15221363464823400000);
+    aWeights.ChangeValue(6, 69) = +1.00932110415609880000;
+    aPoles.ChangeValue(6, 69) = gp_Pnt(-191.98049421722968000000, -0.00000000000036869153, -41.14519558079494000000);
+    aWeights.ChangeValue(6, 70) = +1.00934018958992230000;
+    aPoles.ChangeValue(6, 70) = gp_Pnt(-194.51554398045388000000, +0.00000000000024701945, -39.10283303403318900000);
+    aWeights.ChangeValue(6, 71) = +1.00926513417534820000;
+    aPoles.ChangeValue(6, 71) = gp_Pnt(-197.02654362639632000000, +0.00000000000002378284, -37.03182458375535900000);
+    aWeights.ChangeValue(6, 72) = +1.00924284324015100000;
+    aPoles.ChangeValue(6, 72) = gp_Pnt(-199.50902604112426000000, +0.00000000000001468063, -34.92696457232537500000);
+    aWeights.ChangeValue(6, 73) = +1.00920104311988210000;
+    aPoles.ChangeValue(6, 73) = gp_Pnt(-201.96417476016930000000, +0.00000000000004485301, -32.79087292323346500000);
+    aWeights.ChangeValue(6, 74) = +1.00917029694376930000;
+    aPoles.ChangeValue(6, 74) = gp_Pnt(-204.41947086956830000000, +0.00000000000007013856, -30.65436716589900700000);
+    aWeights.ChangeValue(6, 75) = +1.00906597799622610000;
+    aPoles.ChangeValue(6, 75) = gp_Pnt(-206.84718146821811000000, -0.00000000000006381675, -28.48746943619916600000);
+    aWeights.ChangeValue(6, 76) = +1.00920552993238920000;
+    aPoles.ChangeValue(6, 76) = gp_Pnt(-209.24487385523256000000, +0.00000000000020688933, -26.28443183778934900000);
+    aWeights.ChangeValue(6, 77) = +1.00876475817276390000;
+    aPoles.ChangeValue(6, 77) = gp_Pnt(-211.61934752962611000000, -0.00000000000012087895, -24.05869960942788700000);
+    aWeights.ChangeValue(6, 78) = +1.00888387250480620000;
+    aPoles.ChangeValue(6, 78) = gp_Pnt(-213.96155431166437000000, +0.00000000000019025578, -21.80066237623914200000);
+    aWeights.ChangeValue(6, 79) = +1.00881670070678450000;
+    aPoles.ChangeValue(6, 79) = gp_Pnt(-216.26151615033589000000, -0.00000000000009572292, -19.49741392382435400000);
+    aWeights.ChangeValue(6, 80) = +1.00875338528797620000;
+    aPoles.ChangeValue(6, 80) = gp_Pnt(-218.54531424806936000000, +0.00000000000008182630, -17.17704407009146500000);
+    aWeights.ChangeValue(6, 81) = +1.00842683370719580000;
+    aPoles.ChangeValue(6, 81) = gp_Pnt(-220.79435406720884000000, +0.00000000000004973799, -14.82789528118522200000);
+    aWeights.ChangeValue(7, 1) = +1.02986327036737910000;
+    aPoles.ChangeValue(7, 1) = gp_Pnt(+133.20307692191452000000, -0.00000000000000177636, -68.87095947031473000000);
+    aWeights.ChangeValue(7, 2) = +1.02989244478762340000;
+    aPoles.ChangeValue(7, 2) = gp_Pnt(+130.12738123407763000000, -0.00000000000000516390, -70.57040146390383500000);
+    aWeights.ChangeValue(7, 3) = +1.02991676091110000000;
+    aPoles.ChangeValue(7, 3) = gp_Pnt(+127.02840986317391000000, +0.00000000000000554535, -72.22789464235242500000);
+    aWeights.ChangeValue(7, 4) = +1.02993613450137910000;
+    aPoles.ChangeValue(7, 4) = gp_Pnt(+123.90694758506712000000, -0.00000000000000702621, -73.84302715009133100000);
+    aWeights.ChangeValue(7, 5) = +1.02995970896171030000;
+    aPoles.ChangeValue(7, 5) = gp_Pnt(+120.76360256847768000000, -0.00000000000000047370, -75.41549467632542300000);
+    aWeights.ChangeValue(7, 6) = +1.02998196300924330000;
+    aPoles.ChangeValue(7, 6) = gp_Pnt(+117.59908279457284000000, +0.00000000000000772901, -76.94495426059752700000);
+    aWeights.ChangeValue(7, 7) = +1.02999781361776170000;
+    aPoles.ChangeValue(7, 7) = gp_Pnt(+114.41407453952652000000, -0.00000000000000327310, -78.43108601253017300000);
+    aWeights.ChangeValue(7, 8) = +1.03001626830282000000;
+    aPoles.ChangeValue(7, 8) = gp_Pnt(+111.20931631680004000000, +0.00000000000000421483, -79.87356087705671800000);
+    aWeights.ChangeValue(7, 9) = +1.03004822145821140000;
+    aPoles.ChangeValue(7, 9) = gp_Pnt(+104.76172782897289000000, +0.00000000000000259283, -82.67059011797552200000);
+    aWeights.ChangeValue(7, 10) = +1.03006364818919470000;
+    aPoles.ChangeValue(7, 10) = gp_Pnt(+101.51889932580750000000, +0.00000000000000793496, -84.02514647707548100000);
+    aWeights.ChangeValue(7, 11) = +1.03007725635610380000;
+    aPoles.ChangeValue(7, 11) = gp_Pnt(+98.25768758130365700000, +0.00000000000000127608, -85.33546669488836800000);
+    aWeights.ChangeValue(7, 12) = +1.03009045031501540000;
+    aPoles.ChangeValue(7, 12) = gp_Pnt(+94.97880175952953200000, +0.00000000000000289709, -86.60126064632369500000);
+    aWeights.ChangeValue(7, 13) = +1.03010285398165520000;
+    aPoles.ChangeValue(7, 13) = gp_Pnt(+91.68295682468645700000, +0.00000000000000548904, -87.82224920548925700000);
+    aWeights.ChangeValue(7, 14) = +1.03011393120368040000;
+    aPoles.ChangeValue(7, 14) = gp_Pnt(+88.37086140882031800000, -0.00000000000000004450, -88.99816853898946100000);
+    aWeights.ChangeValue(7, 15) = +1.03012484065781210000;
+    aPoles.ChangeValue(7, 15) = gp_Pnt(+85.04324466385365600000, +0.00000000000000407116, -90.12875955698966400000);
+    aWeights.ChangeValue(7, 16) = +1.03015471267321310000;
+    aPoles.ChangeValue(7, 16) = gp_Pnt(+75.01621211174902700000, +0.00000000000001208092, -93.38380423550353300000);
+    aWeights.ChangeValue(7, 17) = +1.03017194800922480000;
+    aPoles.ChangeValue(7, 17) = gp_Pnt(+68.27251352067813200000, +0.00000000000001147779, -95.37146758037383200000);
+    aWeights.ChangeValue(7, 18) = +1.03018680682765580000;
+    aPoles.ChangeValue(7, 18) = gp_Pnt(+61.47507566136914600000, +0.00000000000000851456, -97.17487791831784700000);
+    aWeights.ChangeValue(7, 19) = +1.03019958109549560000;
+    aPoles.ChangeValue(7, 19) = gp_Pnt(+54.62953031922813800000, +0.00000000000000645560, -98.79238303220959900000);
+    aWeights.ChangeValue(7, 20) = +1.03021050389503310000;
+    aPoles.ChangeValue(7, 20) = gp_Pnt(+47.74179355100338300000, +0.00000000000000683493, -100.22257163394704000000);
+    aWeights.ChangeValue(7, 21) = +1.03021974942385920000;
+    aPoles.ChangeValue(7, 21) = gp_Pnt(+40.81806392732334400000, +0.00000000000000945638, -101.46427420633951000000);
+    aWeights.ChangeValue(7, 22) = +1.03022743299486530000;
+    aPoles.ChangeValue(7, 22) = gp_Pnt(+33.86482072309787100000, +0.00000000000001239365, -102.51656369616552000000);
+    aWeights.ChangeValue(7, 23) = +1.03023979631718960000;
+    aPoles.ChangeValue(7, 23) = gp_Pnt(+19.91267581058432200000, +0.00000000000001269021, -104.24092170462040000000);
+    aWeights.ChangeValue(7, 24) = +1.03024450452679180000;
+    aPoles.ChangeValue(7, 24) = gp_Pnt(+12.91322103073442500000, +0.00000000000001310657, -104.91296575233191000000);
+    aWeights.ChangeValue(7, 25) = +1.03024781840890150000;
+    aPoles.ChangeValue(7, 25) = gp_Pnt(+5.89663552968925500000, +0.00000000000001362222, -105.39416639705574000000);
+    aWeights.ChangeValue(7, 26) = +1.03024979501191980000;
+    aPoles.ChangeValue(7, 26) = gp_Pnt(-1.13093554742009240000, +0.00000000000001442955, -105.68402704533355000000);
+    aWeights.ChangeValue(7, 27) = +1.03025046568879810000;
+    aPoles.ChangeValue(7, 27) = gp_Pnt(-8.16338049757019310000, +0.00000000000001553070, -105.78227646648484000000);
+    aWeights.ChangeValue(7, 28) = +1.03024983609703620000;
+    aPoles.ChangeValue(7, 28) = gp_Pnt(-15.19462185431612500000, +0.00000000000001673746, -105.68886888131540000000);
+    aWeights.ChangeValue(7, 29) = +1.03024788619868390000;
+    aPoles.ChangeValue(7, 29) = gp_Pnt(-22.21861718693262200000, +0.00000000000001767135, -105.40398398356824000000);
+    aWeights.ChangeValue(7, 30) = +1.03024126030624560000;
+    aPoles.ChangeValue(7, 30) = gp_Pnt(-36.24014829916134100000, +0.00000000000002019891, -104.45206611492652000000);
+    aWeights.ChangeValue(7, 31) = +1.03023657011944200000;
+    aPoles.ChangeValue(7, 31) = gp_Pnt(-43.23771519136024500000, +0.00000000000002161068, -103.78502949380328000000);
+    aWeights.ChangeValue(7, 32) = +1.03023047292900840000;
+    aPoles.ChangeValue(7, 32) = gp_Pnt(-50.21605719916001900000, +0.00000000000002249329, -102.92731708926736000000);
+    aWeights.ChangeValue(7, 33) = +1.03022290017099440000;
+    aPoles.ChangeValue(7, 33) = gp_Pnt(-57.16920057960702200000, +0.00000000000002320995, -101.87955571848956000000);
+    aWeights.ChangeValue(7, 34) = +1.03021374148842140000;
+    aPoles.ChangeValue(7, 34) = gp_Pnt(-64.09120253994868200000, +0.00000000000002399266, -100.64259867222304000000);
+    aWeights.ChangeValue(7, 35) = +1.03020284473128120000;
+    aPoles.ChangeValue(7, 35) = gp_Pnt(-70.97615252947152000000, +0.00000000000002494226, -99.21752532044712300000);
+    aWeights.ChangeValue(7, 36) = +1.03019001595653670000;
+    aPoles.ChangeValue(7, 36) = gp_Pnt(-77.81817349811507300000, +0.00000000000002602838, -97.60564061068184600000);
+    aWeights.ChangeValue(7, 37) = +1.03016805964614980000;
+    aPoles.ChangeValue(7, 37) = gp_Pnt(-87.76549855749630100000, +0.00000000000002703745, -94.97405836608523100000);
+    aWeights.ChangeValue(7, 38) = +1.03016062145972500000;
+    aPoles.ChangeValue(7, 38) = gp_Pnt(-90.90906843451735100000, +0.00000000000002735353, -94.09969925934423400000);
+    aWeights.ChangeValue(7, 39) = +1.03015268516758060000;
+    aPoles.ChangeValue(7, 39) = gp_Pnt(-94.04154842308000200000, +0.00000000000002795160, -93.18554984223239000000);
+    aWeights.ChangeValue(7, 40) = +1.03014422393874510000;
+    aPoles.ChangeValue(7, 40) = gp_Pnt(-97.16235536263198500000, +0.00000000000002873660, -92.23177350871787900000);
+    aWeights.ChangeValue(7, 41) = +1.03013520381253840000;
+    aPoles.ChangeValue(7, 41) = gp_Pnt(-100.27090735629974000000, +0.00000000000002960449, -91.23854430518403500000);
+    aWeights.ChangeValue(7, 42) = +1.03012558369857450000;
+    aPoles.ChangeValue(7, 42) = gp_Pnt(-103.36662387191370000000, +0.00000000000003044224, -90.20604688574815100000);
+    aWeights.ChangeValue(7, 43) = +1.03011531537676040000;
+    aPoles.ChangeValue(7, 43) = gp_Pnt(-106.44892584135401000000, +0.00000000000003112785, -89.13447646370049400000);
+    aWeights.ChangeValue(7, 44) = +1.03009266486582220000;
+    aPoles.ChangeValue(7, 44) = gp_Pnt(-112.82164316087234000000, +0.00000000000002877514, -86.82815610446842000000);
+    aWeights.ChangeValue(7, 45) = +1.03007954250937140000;
+    aPoles.ChangeValue(7, 45) = gp_Pnt(-116.10982863064515000000, +0.00000000000005217709, -85.58719260568324200000);
+    aWeights.ChangeValue(7, 46) = +1.03006700046765860000;
+    aPoles.ChangeValue(7, 46) = gp_Pnt(-119.38108228759732000000, -0.00000000000000364635, -84.30140001571530200000);
+    aWeights.ChangeValue(7, 47) = +1.03005153385603830000;
+    aPoles.ChangeValue(7, 47) = gp_Pnt(-122.63466837574235000000, +0.00000000000007773224, -82.97105629274108200000);
+    aWeights.ChangeValue(7, 48) = +1.03003663316235050000;
+    aPoles.ChangeValue(7, 48) = gp_Pnt(-125.86988610286646000000, +0.00000000000000501775, -81.59643931580511400000);
+    aWeights.ChangeValue(7, 49) = +1.03002002524069390000;
+    aPoles.ChangeValue(7, 49) = gp_Pnt(-129.08600965998806000000, +0.00000000000004872530, -80.17785297868806500000);
+    aWeights.ChangeValue(7, 50) = +1.03000192732158440000;
+    aPoles.ChangeValue(7, 50) = gp_Pnt(-132.28232849510800000000, +0.00000000000003627431, -78.71561001568775900000);
+    aWeights.ChangeValue(7, 51) = +1.02996526567106140000;
+    aPoles.ChangeValue(7, 51) = gp_Pnt(-138.40719443250111000000, +0.00000000000004030865, -75.81195871455292900000);
+    aWeights.ChangeValue(7, 52) = +1.02994403451619650000;
+    aPoles.ChangeValue(7, 52) = gp_Pnt(-141.33856968181306000000, +0.00000000000003444592, -74.37651555974527200000);
+    aWeights.ChangeValue(7, 53) = +1.02992866105480000000;
+    aPoles.ChangeValue(7, 53) = gp_Pnt(-144.25171811139330000000, +0.00000000000003429445, -72.90395453557894700000);
+    aWeights.ChangeValue(7, 54) = +1.02989968743351530000;
+    aPoles.ChangeValue(7, 54) = gp_Pnt(-147.14603336223070000000, +0.00000000000004355038, -71.39457006641885100000);
+    aWeights.ChangeValue(7, 55) = +1.02988222474475720000;
+    aPoles.ChangeValue(7, 55) = gp_Pnt(-150.02095857157173000000, +0.00000000000003217269, -69.84863841933133700000);
+    aWeights.ChangeValue(7, 56) = +1.02985386954430420000;
+    aPoles.ChangeValue(7, 56) = gp_Pnt(-152.87595706513403000000, +0.00000000000003648661, -68.26644064265008200000);
+    aWeights.ChangeValue(7, 57) = +1.02982704006085530000;
+    aPoles.ChangeValue(7, 57) = gp_Pnt(-155.71041601974636000000, +0.00000000000003591181, -66.64830754728993200000);
+    aWeights.ChangeValue(7, 58) = +1.02976639514271140000;
+    aPoles.ChangeValue(7, 58) = gp_Pnt(-161.55369960091491000000, +0.00000000000003646415, -63.21332070345936700000);
+    aWeights.ChangeValue(7, 59) = +1.02972545417744080000;
+    aPoles.ChangeValue(7, 59) = gp_Pnt(-164.55974256681068000000, +0.00000000000003294676, -61.39167299907511900000);
+    aWeights.ChangeValue(7, 60) = +1.02970377642180270000;
+    aPoles.ChangeValue(7, 60) = gp_Pnt(-167.53873683551103000000, +0.00000000000002190344, -59.52621075357659900000);
+    aWeights.ChangeValue(7, 61) = +1.02963665582099750000;
+    aPoles.ChangeValue(7, 61) = gp_Pnt(-170.49570646978711000000, +0.00000000000009010479, -57.62531748377598000000);
+    aWeights.ChangeValue(7, 62) = +1.02961756328110620000;
+    aPoles.ChangeValue(7, 62) = gp_Pnt(-173.42176702363508000000, -0.00000000000003499440, -55.67944052993496500000);
+    aWeights.ChangeValue(7, 63) = +1.02954937293567860000;
+    aPoles.ChangeValue(7, 63) = gp_Pnt(-176.32284460610933000000, +0.00000000000007636921, -53.69521656711459900000);
+    aWeights.ChangeValue(7, 64) = +1.02950097342681770000;
+    aPoles.ChangeValue(7, 64) = gp_Pnt(-179.19569709355173000000, +0.00000000000003273955, -51.67161593723249500000);
+    aWeights.ChangeValue(7, 65) = +1.02943612532291810000;
+    aPoles.ChangeValue(7, 65) = gp_Pnt(-182.04053139917158000000, +0.00000000000003996803, -49.60917258111981500000);
+    aWeights.ChangeValue(7, 66) = +1.02937840445762090000;
+    aPoles.ChangeValue(7, 66) = gp_Pnt(-184.68250151172640000000, +0.00000000000004112926, -47.69381589112448700000);
+    aWeights.ChangeValue(7, 67) = +1.02929786839945800000;
+    aPoles.ChangeValue(7, 67) = gp_Pnt(-187.30004443981446000000, +0.00000000000003629801, -45.74517623046489900000);
+    aWeights.ChangeValue(7, 68) = +1.02927785532615720000;
+    aPoles.ChangeValue(7, 68) = gp_Pnt(-189.89358418563035000000, +0.00000000000003708012, -43.76295173174737800000);
+    aWeights.ChangeValue(7, 69) = +1.02909457173661250000;
+    aPoles.ChangeValue(7, 69) = gp_Pnt(-192.46070903458983000000, +0.00000000000005500515, -41.74904085552218200000);
+    aWeights.ChangeValue(7, 70) = +1.02915656102268340000;
+    aPoles.ChangeValue(7, 70) = gp_Pnt(-195.00353322314638000000, +0.00000000000002645256, -39.70148425813464900000);
+    aWeights.ChangeValue(7, 71) = +1.02891246604057510000;
+    aPoles.ChangeValue(7, 71) = gp_Pnt(-197.51895024482548000000, +0.00000000000005006422, -37.62251287581096900000);
+    aWeights.ChangeValue(7, 72) = +1.02884001996279940000;
+    aPoles.ChangeValue(7, 72) = gp_Pnt(-200.00717902020989000000, +0.00000000000003866246, -35.51147139839754600000);
+    aWeights.ChangeValue(7, 73) = +1.02870418206103280000;
+    aPoles.ChangeValue(7, 73) = gp_Pnt(-202.46745722827831000000, +0.00000000000003996803, -33.36845405838467800000);
+    aWeights.ChangeValue(7, 74) = +1.02860417892808040000;
+    aPoles.ChangeValue(7, 74) = gp_Pnt(-204.92874075079348000000, +0.00000000000003952569, -31.22492832365916000000);
+    aWeights.ChangeValue(7, 75) = +1.02826579045574770000;
+    aPoles.ChangeValue(7, 75) = gp_Pnt(-207.35951843182116000000, +0.00000000000002864861, -29.04902036970887700000);
+    aWeights.ChangeValue(7, 76) = +1.02871793966685040000;
+    aPoles.ChangeValue(7, 76) = gp_Pnt(-209.76815931164757000000, +0.00000000000007786791, -26.84449461829588300000);
+    aWeights.ChangeValue(7, 77) = +1.02728787827248790000;
+    aPoles.ChangeValue(7, 77) = gp_Pnt(-212.13952611955784000000, -0.00000000000002645359, -24.59453985262025100000);
+    aWeights.ChangeValue(7, 78) = +1.02767535385751650000;
+    aPoles.ChangeValue(7, 78) = gp_Pnt(-214.48523983715771000000, +0.00000000000011316462, -22.34028621398329100000);
+    aWeights.ChangeValue(7, 79) = +1.02745809923196680000;
+    aPoles.ChangeValue(7, 79) = gp_Pnt(-216.79261871005519000000, -0.00000000000002978790, -20.02558452892611700000);
+    aWeights.ChangeValue(7, 80) = +1.02725110106353260000;
+    aPoles.ChangeValue(7, 80) = gp_Pnt(-219.08116944862113000000, +0.00000000000005732296, -17.69632354506026700000);
+    aWeights.ChangeValue(7, 81) = +1.02619749797986360000;
+    aPoles.ChangeValue(7, 81) = gp_Pnt(-221.32510969435936000000, +0.00000000000004618528, -15.33078661161192400000);
+  }
+  ////
+
+  const Handle(Geom_Surface) aS1 = new Geom_BSplineSurface(aPoles, aWeights, aUKnots, aVKnots, aUMult, aVMult, aUDegree, aVDegree);
+
+  char buff[1024];
+
+  Sprintf(buff, "%s_1", theArgVal[1]);
+  DrawTrSurf::Set(buff, aS1);
+  theDI << buff << " ";
+
+  Sprintf(buff, "%s_2", theArgVal[1]);
+  DrawTrSurf::Set(buff, aS2);
+  theDI << buff << "\n";
+
+  return 0;
+}
+
+void QABugs::Commands_20(Draw_Interpretor& theCommands) {
+  const char *group = "QABugs";
+
+  theCommands.Add ("OCC26675_1", "OCC26675_1 result", __FILE__, SurfaceGenOCC26675_1, group);
+
+  return;
+}
index 87ce5db80f2a7499785114541c1faa9c45e623a8..363f72ad7b59d8212ba18b78cc69719940244b9e 100644 (file)
@@ -286,17 +286,15 @@ static Standard_Integer BUC60652(Draw_Interpretor& di, Standard_Integer argc, co
 static Standard_Integer defNbPntMax = 30;
 static Standard_Real defTol3d = 1.e-7;
 static Standard_Real defTol2d = 1.e-7;
-static Standard_Boolean defRelativeTol=Standard_True;
 Standard_Integer NbPntMax = defNbPntMax;
 Standard_Real Toler3d =defTol3d;
 Standard_Real Toler2d = defTol2d;
-Standard_Boolean RelativeTol= defRelativeTol;
 //              //== // ksection : operateur section appelant BRepAlgo_BooleanOperation
 //== // ksection : operateur section appelant BRepAlgo_BooleanOperations
 //=======================================================================
 Standard_Integer ksection(Draw_Interpretor& di, Standard_Integer n, const char ** a) {
   if (n < 8) {
-    di << "Usage : " << a[0] << " resultat shell1 shell2 NbPntMax Toler3d Toler2d RelativeTol"   << "\n";
+    di << "Usage : " << a[0] << " resultat shell1 shell2 NbPntMax Toler3d Toler2d"   << "\n";
     return -1;
   }
   // a[1]= resultat
@@ -305,20 +303,18 @@ Standard_Integer ksection(Draw_Interpretor& di, Standard_Integer n, const char *
   // a[4]= NbPntMax
   // a[5]= Toler3d
   // a[6]= Toler2d
-  // a[7]= RelativeTol
   TopoDS_Shape s1 = DBRep::Get(a[2],TopAbs_SHELL);
   TopoDS_Shape s2 = DBRep::Get(a[3],TopAbs_SHELL);
   if (s1.IsNull() || s2.IsNull()) return 1;
   NbPntMax=Draw::Atoi(a[4]);
   Toler3d=Draw::Atof(a[5]);
   Toler2d=Draw::Atof(a[6]);
-  RelativeTol=Draw::Atoi(a[7]);
 
   di << "BRepAlgo_BooleanOperations myalgo" << "\n";
   BRepAlgo_BooleanOperations myalgo;
 
   myalgo.Shapes(s1, s2);
-  myalgo.SetApproxParameters(NbPntMax,Toler3d,Toler2d,RelativeTol);
+  myalgo.SetApproxParameters(NbPntMax,Toler3d,Toler2d);
   TopoDS_Shape res; res = myalgo.Section();
   DBRep::Set(a[1],res);
   return 0;
@@ -1816,10 +1812,10 @@ void QABugs::Commands_3(Draw_Interpretor& theCommands) {
   theCommands.Add("BUC60609","BUC60609 shape name [U V]",__FILE__,BUC60609,group);
   theCommands.Add("BUC60632","BUC60632 mode length",__FILE__,BUC60632,group);
   theCommands.Add("BUC60652","BUC60652 face",__FILE__,BUC60652,group);
-  theCommands.Add("ksection","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d RelativeTol",__FILE__,ksection,group);
-  theCommands.Add("BUC60682","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d RelativeTol",__FILE__,ksection,group);  
-  theCommands.Add("BUC60669","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d RelativeTol",__FILE__,ksection,group);  
-  theCommands.Add("PRO19626","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d RelativeTol",__FILE__,ksection,group);  
+  theCommands.Add("ksection","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d",__FILE__,ksection,group);
+  theCommands.Add("BUC60682","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d",__FILE__,ksection,group);  
+  theCommands.Add("BUC60669","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d",__FILE__,ksection,group);  
+  theCommands.Add("PRO19626","ksection resultat shell1 shell2 NbPntMax Toler3d Toler2d",__FILE__,ksection,group);  
   theCommands.Add("BUC60574","BUC60574 ",__FILE__,BUC60574,group);
 
   theCommands.Add("BUC60699","BUC60699 ",__FILE__,BUC60699,group);
index 62a985c2de4dd5880ef34389d6dd7faf2d41a493..d7ad117808c8abec8442a1abad69eda1ae33a5d1 100644 (file)
@@ -217,7 +217,7 @@ void ShapeAlgo_AlgoContainer::ApproxBSplineCurve (const Handle(Geom_BSplineCurve
       }
       GeomInt_WLApprox theapp3d;
       Standard_Real Tol = Precision::Approximation();
-      theapp3d.SetParameters(Tol, Tol, 4, 8, 0, Standard_True);
+      theapp3d.SetParameters(Tol, Tol, 4, 8, 0, 30, Standard_True);
       Handle(IntPatch_WLine) WL = new IntPatch_WLine(R, Standard_False);
       Standard_Integer indicemin = 1;
       Standard_Integer indicemax = jpole;
@@ -349,7 +349,7 @@ void ShapeAlgo_AlgoContainer::ApproxBSplineCurve (const Handle(Geom2d_BSplineCur
       }
       GeomInt_WLApprox theapp3d;
       Standard_Real Tol = Precision::PApproximation();
-      theapp3d.SetParameters(Tol, Tol, 4, 8, 0, Standard_True);
+      theapp3d.SetParameters(Tol, Tol, 4, 8, 0, 30, Standard_True);
       Handle(IntPatch_WLine) WL = new IntPatch_WLine(R, Standard_False);
       Standard_Integer indicemin = 1;
       Standard_Integer indicemax = jpole;
index d66abadccb7a0626783b294dc0e89dfbf2dea5be..2bdfe386ca28158c0315829908b7ff3f020bfb49 100644 (file)
@@ -318,8 +318,7 @@ Standard_Boolean  TopOpeBRepTool_CurveTool::MakeCurves
   Standard_Boolean CompPC1 = myGeomTool.CompPC1();
   Standard_Boolean CompPC2 = myGeomTool.CompPC2();
   Standard_Real tol3d,tol2d;
-  Standard_Boolean RelativeTol;
-  myGeomTool.GetTolerances(tol3d,tol2d,RelativeTol);
+  myGeomTool.GetTolerances(tol3d,tol2d);
   Standard_Integer NbPntMax = myGeomTool.NbPntMax();
 
 #ifdef OCCT_DEBUG
@@ -599,7 +598,7 @@ Standard_Boolean  TopOpeBRepTool_CurveTool::MakeCurves
   Handle(BRepApprox_ApproxLine) AL;
   AL = new BRepApprox_ApproxLine(HC3D,HPC1,HPC2);
 
-    Approx.SetParameters(tol3d,tol2d,RelativeTol,degmin,degmax,nitmax,NbPntMax,withtangency,
+    Approx.SetParameters(tol3d,tol2d,degmin,degmax,nitmax,NbPntMax,withtangency,
                         parametrization);
 
     if     (CompC3D && CompPC1 && BAS1.GetType() == GeomAbs_Plane) { 
index f70264ea254b20a82213a891d799ad3352bb57b1..5c37c7622d4f72df95914744731460fc86e4ce9f 100644 (file)
@@ -33,7 +33,6 @@ TopOpeBRepTool_GeomTool::TopOpeBRepTool_GeomTool
    myCompPC2(CompPC2),
    myTol3d(Precision::Approximation()),
    myTol2d(Precision::PApproximation()),
-   myRelativeTol(Standard_True),
    myNbPntMax(30)
 {
 }
@@ -133,34 +132,6 @@ void TopOpeBRepTool_GeomTool::SetTolerances
 {
   myTol3d = tol3d;
   myTol2d = tol2d;
-  myRelativeTol = Standard_True;
-}
-
-//=======================================================================
-//function : GetTolerances
-//purpose  : 
-//=======================================================================
-
-void TopOpeBRepTool_GeomTool::GetTolerances
-  (Standard_Real& tol3d, Standard_Real& tol2d, Standard_Boolean& relative) const
-{
-  tol3d = myTol3d;
-  tol2d = myTol2d;
-  relative = myRelativeTol;
-}
-
-
-//=======================================================================
-//function : SetTolerances
-//purpose  : 
-//=======================================================================
-
-void TopOpeBRepTool_GeomTool::SetTolerances
-  (const Standard_Real tol3d, const Standard_Real tol2d, const Standard_Boolean relative)
-{
-  myTol3d = tol3d;
-  myTol2d = tol2d;
-  myRelativeTol = relative;
 }
 
 //=======================================================================
index 1efda8ece97bf67fa4021e96914e62a06ba00c9e..9b64eab7632e0a5b1706980ad2ed065ead81cce8 100644 (file)
@@ -63,10 +63,6 @@ public:
   
   Standard_EXPORT void SetTolerances (const Standard_Real tol3d, const Standard_Real tol2d);
   
-  Standard_EXPORT void GetTolerances (Standard_Real& tol3d, Standard_Real& tol2d, Standard_Boolean& relative) const;
-  
-  Standard_EXPORT void SetTolerances (const Standard_Real tol3d, const Standard_Real tol2d, const Standard_Boolean relative);
-  
   Standard_EXPORT Standard_Integer NbPntMax() const;
   
   Standard_EXPORT void SetNbPntMax (const Standard_Integer NbPntMax);
@@ -98,7 +94,6 @@ private:
 
   Standard_Real myTol3d;
   Standard_Real myTol2d;
-  Standard_Boolean myRelativeTol;
   Standard_Integer myNbPntMax;
 
 
index 56aa0fbae95d63102c543412add6ffe7e796fea6..a640b6d34ebbf2ec9f360813d7af9524291ef5fb 100644 (file)
@@ -11,4 +11,4 @@ mkevol result s
 updatevol s_7 0 10 1 20 2 10
 buildevol
 
-set square 11500.5
+set square 12023.4
index cfb6e23eee1b9dac9d79f116d12cfd4bc7c01e1f..4bd5ec485b805e2e466cc397a5ee4dd4a6934689 100644 (file)
@@ -4,6 +4,8 @@
 ## Comment : From CV tests serie page 25/26
 ## ===========================================
 
+puts "TODO #OCC26740 ALL: Faulty shapes in variables faulty_1 to faulty_"
+
 restore [locate_data_file CCV_1_h1_gsk.rle] s
 explode s E
 blend result s 30 s_14
index 3a0c90f34829a0fc7a8dc4b9dacf97dbcd1b60ce..ff731620e9f1d280c10f218d4866cfe0b40db20f 100644 (file)
@@ -1,14 +1,10 @@
 puts "BUC60290 (the same problem with cut and common)"
 
+puts "TODO OCC1111 ALL: Error : The area of the resulting shape is"
+
 restore [locate_data_file buc60290a.rle] sol1
 restore [locate_data_file buc60290b.rle] sol2
 
 bcommon result sol2 sol1
 
-set square 667287
-if { [regexp {Windows} [dversion]] } {
-  if { [regexp {64} [dversion]] } {
-    #set square 804392
-    puts "TODO OCC1111 Windows: Error : The area of the resulting shape is"
-  }
-}
+set square 667287
\ No newline at end of file
index 08a3f95292957d92af4204793a45f8bff15c87ce..3bf78734d648c975efaa7d3c6cad384921441717 100644 (file)
@@ -1,3 +1,5 @@
+puts "TODO #OCC26777 ALL: Error : The length of the resulting shape is"
+
 restore [locate_data_file GEN758_nofog.rle] a
 explode a
 bsection result a_1 a_2
index 936f6a6ee96a6bce86fa700e5e6513f34cec5619..e58a815f3c648eb7221aec54adfe37f28b4aa4a6 100644 (file)
@@ -2,4 +2,4 @@ restore [locate_data_file GEN778_nofog.rle] a
 explode a
 bsection result a_1 a_2
 
-set length 456.707
+set length 456.706
index ae758156b8a029fe35d82a1de6822ab770039389..294ced79c78a0af5503172ad78a67dc18a14db94 100644 (file)
@@ -1,3 +1,5 @@
+puts "TODO #OCC26814 ALL: Error : The length of the resulting shape is"
+
 restore [locate_data_file lh3d_px1.brep] a
 plane p 0 0 0 1 0 0
 mkface f p
index 84c9fb86ebd600006f8ab469ec7e1eb7a73a3a24..2c8a4b60af809f544ec648a1376d2d19c5404b56 100644 (file)
@@ -1,8 +1,6 @@
 # test script on make volume operation
 # cone cylinder plane
 
-puts "TODO OCC26020 ALL: Faulty shapes in variables faulty_1 to faulty_"
-
 # planar face 
 plane pln_f1 2.3537565147188571e-015 -592.35294118000002 1.1044592656221142e-015 0.90529096719956037 4.7161388709779336e-017 0.42479202523927467
 erase pln_f1
@@ -41,5 +39,5 @@ mkface f7 cyl_f7 0 6.2831853071795862 -1000000 1000000
 # make volume operation 
 mkvolume result f1 f2 f3 f4 f5 f6 f7
 
-set square 1.71122e+013
+set square 9.42987e+007
 
index d7be6d1778a70c0f188c8624d1f1dab9a69b29c9..93ad36a42f2c854cdc96b245c0bfe25e8301430f 100644 (file)
@@ -2,6 +2,8 @@
 # cone cylinder plane
 # Error status: 102
 
+puts "TODO OCC26020 ALL: Error :  is WRONG because number of "
+
 # conical face 
 cone con_f1 -59.814698440000001 384.36473473000001 127 0.41716766026590824 -0.90882954575006414 -5.4874902763032048e-016 89.995898744693349 0
 erase con_f1
@@ -24,3 +26,6 @@ mkface f4 cyl_f4 0 6.2831853071795862 -1000000 1000000
 
 # make volume operation 
 mkvolume result f1 f2 f3 f4
+
+checknbshapes result -vertex 6 -edge 11 -wire 11 -face 8 -shell 4 -solid 2 -compsolid 0 -compound 1 -shape 43
+
index 8f988fa8be59aa7a18eb8729092dd9b6817812c8..df023999df315fb8f6a07e471ae6691427d48e9a 100755 (executable)
@@ -33,5 +33,5 @@ if { $MaxFaceTolerance > 1 || $MaxEdgeTolerance > 1 || $MaxVertexTolerance > 1 }
     puts "Tolerance of shape is less then 1.0"
 }
 
-set square 4.21741e+007
+set square 3.92897e+007
 set 2dviewer 0
index a9ff829af827069b2ebe15b8bd244dd18467efee..95c24dde63f7814657c6227aa492c9b9ebce565c 100755 (executable)
@@ -50,5 +50,5 @@ if { $MaxFaceTolerance > 1 || $MaxEdgeTolerance > 1 || $MaxVertexTolerance > 1 }
 } else {
     puts "Tolerance of shape is less then 1.0"
 }
-set square 4.03996e+007
+set square 3.67079e+007
 set 2dviewer 0
index 48c897fd10bfc1c482205aa701d56368a186a99d..94eec800e1071c723465c0045bcd0966c40fd4de 100755 (executable)
@@ -66,5 +66,5 @@ if { $MaxFaceTolerance > 2 || $MaxEdgeTolerance > 2 || $MaxVertexTolerance > 2 }
 } else {
     puts "Tolerance of shape is less then 2.0"
 }
-set square 1.74934e+007
+set square 1.24589e+07
 set 2dviewer 0
index a342807910e6fe49b7c2ae2f9f8f2415d81b3721..33844c6ad42fc81e1370c2da74d5ec5b320c8970 100755 (executable)
@@ -1,4 +1,5 @@
 puts "TODO OCC11111 ALL: Error :  is WRONG because number of "
+puts "TODO OCC11111 ALL: Error : The square of result shape is "
 
 puts "============"
 puts "OCC10160"
index 2b123caf0bd2d9fe397ae64e33a1e1092b0a0101..2b4ac8114ccb25bf69ec34787cc041517e443628 100755 (executable)
@@ -1,5 +1,4 @@
 puts "TODO OCC11111 ALL: Error :  is WRONG because number of "
-puts "TODO OCC11111 ALL: Error : The square of result shape is"
 puts "============"
 puts "OCC10160"
 puts "============"
index 30580f84363c2b84df0154742a53b29f917b345a..3b09f007b8f5d078041a5ff4e1b5f3193e72a9df 100755 (executable)
@@ -2,7 +2,11 @@ puts "================"
 puts "OCC1255"
 puts "================"
 puts ""
-# Exception in command 'section'
+###############################################
+## Exception in command 'section'
+###############################################
+
+puts "TODO #OCC26815 ALL: Error : The length of result shape is"
 
 restore [locate_data_file OCC1255.brep] a 
 checkshape a
index b0df2d6821de8e5a34dbec1542b4e6bee421cb86..e5327fc770361541f98ebd9eb76c30ab3380089a 100755 (executable)
@@ -7,6 +7,8 @@ puts ""
 #  (This script tests new topology)
 ###############################################
 
+puts "TODO #OCC26815 ALL: Error : The length of result shape is"
+
 restore [locate_data_file OCC1255.brep] a 
 checkshape a
 
index 56892c21fcaac7ea01804f81355603941bfcd682..879507c2cd963c448c9d118a1f7424d7c1a215fd 100755 (executable)
@@ -1,6 +1,3 @@
-puts "TODO OCC21564 ALL: The square of result shape is"
-puts "TODO OCC21564 ALL: Error :  is WRONG because number of "
-
 puts "============"
 puts "OCC22557"
 puts "============"
@@ -24,7 +21,7 @@ puts "Start boolean operation ..."
 bopcut result
 puts "Finish boolean operation ..."
 
-set square 0.172993
+set square 0.172994
 
 checknbshapes result -vertex 192 -edge 288 -wire 98 -face 98 -shell 1 -solid 1 -compsolid 0 -compound 1 -shape 679
 
index 8f85786fa08e6c91ff814e18cecabce1b1fe1df9..1abae605e5d02cd8949dd18681d0cc8b4f93ad54 100755 (executable)
@@ -30,7 +30,7 @@ set distance -0.1
 catch { OFFSETSHAPE $distance {s_3} $calcul $type }
 
 
-set square 1470.32
+set square 1485.39
 
 checknbshapes result -vertex 4 -edge 6 -wire 6 -face 5 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 23
 
index 0245268c17734d41b937abd10d290f3c215837c3..f62ee9cec3fa61563e4d1390c9289023c5b0f1d1 100755 (executable)
@@ -1,5 +1,6 @@
-puts "TODO OCC12345 ALL: Faulty shapes in variables faulty_1 to faulty_"
-puts "TODO OCC12345 ALL: Error : The square of result shape is"
+puts "TODO OCC00000 ALL: Faulty OCC602: function BLEND works wrongly"
+puts "TODO OCC00000 ALL: Tcl Exception: result is not a topological shape!!!"
+puts "TODO OCC00000 ALL: TEST INCOMPLETE"
 
 puts "========================"
 puts " OCC602 "
index bd7a99f1884124a4ea6f69b8869b37eb3a6e08eb..1f77e9495b2de53000721ba6b9c292b8e7427d82 100644 (file)
@@ -5,6 +5,9 @@ puts ""
 ###########################################################
 # Wrong pcurve of the section curve
 ###########################################################
+
+puts "TODO OCC26752 ALL: Error: Tolerance is too big!"
+
 set MaxTol 1.05e-6
 set NbCurv_OK 1
 
index 3cdee87475b1389b03d41622de6c485a14a1c23b..0dd6201ea490a582a26e67e51cf449f57ea29a89 100755 (executable)
@@ -1,10 +1,7 @@
 puts "TODO OCC25929 ALL: Error: Tolerance is too big!"
 
-puts "TODO OCC21564 Linux: Error : T=0.464646\tD=0.000326627"
-puts "TODO OCC21564 Linux: Error : T=0.464646\tD=0.00032747"
-
-puts "TODO OCC21564 Windows: Error : T=0.464646\tD=0.000326671"
-puts "TODO OCC21564 Windows: Error : T=0.464646\tD=0.000327516"
+puts "TODO OCC25929 ALL: Error : T=0.505051    D=0.000100165"
+puts "TODO OCC25929 ALL: Error : T=0.505051    D=0.000100918"
 
 puts "========="
 puts "CR24915"
index 1215eccd89e1628858da180295dfccc5c4d8f7e8..402ceca490f14867a6193f98c00b29ac5d33bf86 100644 (file)
@@ -6,6 +6,8 @@ puts ""
 # IntTools_FaceFace enters to infinite loop on the attached case
 ###########################################################
 
+puts "TODO OCC26431 ALL: Error :  is WRONG because number of "
+
 restore [locate_data_file bug24981_shapes.brep] a
 restore [locate_data_file bug24981_tools.brep] b
 
index f0cbc8891ea3527e6d296ba47b825f817478644b..167adfa1e31972368f51dbab25cc26be4797f1c1 100755 (executable)
@@ -6,6 +6,8 @@ puts ""
 # The section curve between two cylindrical faces is incomplete
 #######################################################################
 
+puts "TODO OCC26431 ALL: Faulty shapes in variables faulty_1 to faulty_2"
+
 restore [locate_data_file bug25224_Input_5.brep]  b1
 restore [locate_data_file bug25224_Input_21.brep] b2
 
index 31448b0af18ced9bb3434ee639ed85d225d3ed46..0e02a42413224dadd176394f0ae92545dc76a5cd 100644 (file)
@@ -1,5 +1,3 @@
-puts "TODO OCC26417 ALL: Faulty shapes in variables faulty_1"
-
 puts "================"
 puts "OCC25319"
 puts "================"
@@ -15,5 +13,5 @@ bcommon result b1 b2
 
 set square 1690.81
 
-checknbshapes result -vertex 19 -edge 30 -wire 13 -face 13 -shell 1 -solid 1 -compsolid 0 -compound 1 -shape 78
+checknbshapes result -vertex 20 -edge 31 -wire 13 -face 13 -shell 1 -solid 1 -compsolid 0 -compound 1 -shape 80
 set 2dviewer 1
index 60dc3fd1130969098b1ff4db4c6c3e7017da61a0..4ab5d8b53430313d56e000ca78945ce125706802 100644 (file)
@@ -1,5 +1,3 @@
-puts "TODO OCC26417 ALL: Faulty shapes in variables faulty_1"
-
 puts "================"
 puts "OCC25319"
 puts "================"
@@ -18,5 +16,5 @@ bcommon result b1 b2
 
 set square 1690.81
 
-checknbshapes result -vertex 19 -edge 30 -wire 13 -face 13 -shell 1 -solid 1 -compsolid 0 -compound 1 -shape 78
+checknbshapes result -vertex 20 -edge 31 -wire 13 -face 13 -shell 1 -solid 1 -compsolid 0 -compound 1 -shape 80
 set 2dviewer 1
index 610b6ef56ef730c8560f38ec062c444e9bf9843c..c619c1353ffd10461aea7fd0aa9c283b9c62af3c 100644 (file)
@@ -5,6 +5,8 @@ puts ""
 ###############################################
 # Wrong result obtained by General Fuse operator.
 ###############################################
+puts "TODO #OCC26816 ALL: Error : Result done by General Fuse operator is WRONG because number of"
+puts "TODO #OCC26816 ALL: Faulty shapes in variables faulty_1 to faulty_"
 
 restore [locate_data_file bug25715_p02c3s1.brep] b1
 restore [locate_data_file bug25838_p02c3s2.brep] b2
diff --git a/tests/bugs/modalg_6/bug26675 b/tests/bugs/modalg_6/bug26675
new file mode 100644 (file)
index 0000000..f2b6cc3
--- /dev/null
@@ -0,0 +1,60 @@
+puts "============"
+puts "OCC26675"
+puts "============"
+puts ""
+###############################
+## 0026675: Eliminate normalization of coordinates in ApproxInt package
+###############################
+
+puts "TODO OCC25929 ALL: Error : T="
+
+set GoodNbCurv 1
+
+pload QAcommands
+OCC26675_1 ss
+
+intersect res ss_1 ss_2
+
+set che [whatis res]
+set ind [string first "3d curve" $che]
+if {${ind} >= 0} {
+  #Only variable "res" exists
+  renamevar res res_1
+}
+
+
+set ic 1
+set AllowRepeate 1
+while { $AllowRepeate != 0 } {
+  set che [whatis res_$ic]
+  set ind [string first "3d curve" $che]
+  if {${ind} < 0} {
+    set AllowRepeate 0
+  } else {
+    display res_$ic
+    
+    bounds res_$ic U1 U2
+    
+    dval U1
+    dval U2
+    
+    if {[dval U2-U1] < 1.0e-20} {
+      puts "Error: Wrong curve's range!"
+    }
+    
+    xdistcs res_$ic ss_1 U1 U2 10 1e-7    
+    xdistcs res_$ic ss_2 U1 U2 10 1e-7
+    
+    incr ic
+  }
+}
+
+if {[expr {$ic - 1}] == $GoodNbCurv} {
+  puts "OK: Curve Number is good!"
+} else {
+  puts "Error: Curve Number is bad!"
+}
+
+smallview
+fit
+set only_screen_axo 1
index c6579f443b04bb914e68e0b0e277545eaea8440d..a6d99363b585dad8caf06e55eaeda517e25d9bfd 100755 (executable)
@@ -1,7 +1,4 @@
 #E6----------------------------------------------
-#puts "TODO OCC22803 ALL: Faulty shapes in variables faulty_1 to faulty_"
-puts "TODO OCC26426 ALL: Error: The tolerance of the resulting shape is too big "
-
 
 ptorus pt 25 24 90
 profile pr o 20 18 5  p 0 -1 0 1 0 0 l 10 t 0 30 \
index da3b87fe82f94fbfa00d66e6e07e844ef675eeb2..1fb5ca66e81c591c25510427babfd88f0492a2fe 100644 (file)
@@ -1,3 +1,5 @@
+puts "TODO #OCC26431 ALL: Faulty shapes in variables faulty_1 to "
+
 #A2----------------------------------------------
 plane p 0 0 0 1 0 0 0 -.5 1
 pcylinder p p 10 20