1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
15 #include <BSplSLib.hxx>
16 #include <Convert_GridPolynomialToPoles.hxx>
17 #include <Geom_BezierSurface.hxx>
18 #include <Geom_BSplineSurface.hxx>
19 #include <Geom_OsculatingSurface.hxx>
20 #include <Geom_Surface.hxx>
22 #include <Precision.hxx>
23 #include <TColgp_Array1OfPnt.hxx>
24 #include <TColgp_Array2OfPnt.hxx>
25 #include <TColgp_Array2OfVec.hxx>
26 #include <TColgp_HArray2OfPnt.hxx>
27 #include <TColStd_Array1OfInteger.hxx>
28 #include <TColStd_Array1OfReal.hxx>
29 #include <TColStd_HArray1OfInteger.hxx>
30 #include <TColStd_HArray1OfReal.hxx>
31 #include <TColStd_HArray2OfInteger.hxx>
33 IMPLEMENT_STANDARD_RTTIEXT(Geom_OsculatingSurface,Standard_Transient)
35 //=======================================================================
36 //function : Geom_OffsetOsculatingSurface
38 //=======================================================================
39 Geom_OsculatingSurface::Geom_OsculatingSurface()
43 myAlong.Init(Standard_False);
45 //=======================================================================
46 //function : Geom_OffsetOsculatingSurface
48 //=======================================================================
50 Geom_OsculatingSurface::Geom_OsculatingSurface(const Handle(Geom_Surface)& BS,
51 const Standard_Real Tol)
57 //=======================================================================
60 //=======================================================================
62 void Geom_OsculatingSurface::Init(const Handle(Geom_Surface)& BS,
63 const Standard_Real Tol)
67 Standard_Real TolMin=0.;//consider all singularities below Tol, not just above 1.e-12 (id23943)
68 Standard_Boolean OsculSurf = Standard_True;
69 myBasisSurf = Handle(Geom_Surface)::DownCast(BS->Copy());
70 myOsculSurf1 = new Geom_HSequenceOfBSplineSurface();
71 myOsculSurf2 = new Geom_HSequenceOfBSplineSurface();
72 if ((BS->IsKind(STANDARD_TYPE(Geom_BSplineSurface))) ||
73 (BS->IsKind(STANDARD_TYPE(Geom_BezierSurface))))
75 Standard_Real U1=0,U2=0,V1=0,V2=0;
77 Standard_Integer i = 1;
78 BS->Bounds(U1,U2,V1,V2);
79 myAlong.SetValue(1,IsQPunctual(BS,V1,GeomAbs_IsoV,TolMin,Tol));
80 myAlong.SetValue(2,IsQPunctual(BS,V2,GeomAbs_IsoV,TolMin,Tol));
81 myAlong.SetValue(3,IsQPunctual(BS,U1,GeomAbs_IsoU,TolMin,Tol));
82 myAlong.SetValue(4,IsQPunctual(BS,U2,GeomAbs_IsoU,TolMin,Tol));
84 std::cout<<myAlong(1)<<std::endl<<myAlong(2)<<std::endl<<myAlong(3)<<std::endl<<myAlong(4)<<std::endl;
86 if (myAlong(1) || myAlong(2) || myAlong(3) || myAlong(4))
88 Handle(Geom_BSplineSurface) InitSurf, L,S;
89 if (BS->IsKind(STANDARD_TYPE(Geom_BezierSurface)))
91 Handle(Geom_BezierSurface) BzS = Handle(Geom_BezierSurface)::DownCast(BS);
92 TColgp_Array2OfPnt P(1,BzS->NbUPoles(),1,BzS->NbVPoles());
93 TColStd_Array1OfReal UKnots(1,2);
94 TColStd_Array1OfReal VKnots(1,2);
95 TColStd_Array1OfInteger UMults(1,2);
96 TColStd_Array1OfInteger VMults(1,2);
99 UKnots.SetValue(i,(i-1));
100 VKnots.SetValue(i,(i-1));
101 UMults.SetValue(i,BzS->UDegree()+1);
102 VMults.SetValue(i,BzS->VDegree()+1);
105 InitSurf = new Geom_BSplineSurface(P,UKnots,VKnots,
114 InitSurf = Handle(Geom_BSplineSurface)::DownCast(myBasisSurf);
117 std::cout<<"UDEG: "<<InitSurf->UDegree()<<std::endl;
118 std::cout<<"VDEG: "<<InitSurf->VDegree()<<std::endl;
121 if(IsAlongU() && IsAlongV()) ClearOsculFlags();
122 // Standard_ConstructionError_Raise_if((IsAlongU() && IsAlongV()),"Geom_OsculatingSurface");
123 if ((IsAlongU() && InitSurf->VDegree()>1) ||
124 (IsAlongV() && InitSurf->UDegree()>1))
126 myKdeg = new TColStd_HSequenceOfInteger();
127 Standard_Integer k=0;
128 Standard_Boolean IsQPunc;
129 Standard_Integer UKnot,VKnot;
130 if (myAlong(1) || myAlong(2))
132 for (i=1;i<InitSurf->NbUKnots();i++)
136 S = InitSurf; k=0; IsQPunc=Standard_True;
141 OsculSurf = BuildOsculatingSurface(V1,UKnot,VKnot,S,L);
142 if(!OsculSurf) break;
145 std::cout<<"1.k = "<<k<<std::endl;
147 IsQPunc=IsQPunctual(L,V1,GeomAbs_IsoV,0.,Tol);
154 myOsculSurf1->Append(L);
156 ClearOsculFlags(); //myAlong.SetValue(1,Standard_False);
157 if (myAlong(2) && OsculSurf)
159 S = InitSurf; k=0; IsQPunc=Standard_True;
161 VKnot=InitSurf->NbVKnots()-1;
165 OsculSurf = BuildOsculatingSurface(V2,UKnot,VKnot,S,L);
166 if(!OsculSurf) break;
169 std::cout<<"2.k = "<<k<<std::endl;
171 IsQPunc=IsQPunctual(L,V2,GeomAbs_IsoV,0.,Tol);
178 myOsculSurf2->Append(L);
186 S = InitSurf; k=0; IsQPunc=Standard_True;
188 VKnot=InitSurf->NbVKnots()-1;
191 OsculSurf = BuildOsculatingSurface(V2,UKnot,VKnot,S,L);
192 if(!OsculSurf) break;
195 std::cout<<"2.k = "<<k<<std::endl;
197 IsQPunc=IsQPunctual(L,V2,GeomAbs_IsoV,0.,Tol);
205 myOsculSurf2->Append(L);
209 ClearOsculFlags(); //myAlong.SetValue(2,Standard_False);
213 if (myAlong(3) || myAlong(4))
215 for (i=1;i<InitSurf->NbVKnots();i++)
219 S = InitSurf; k=0; IsQPunc=Standard_True;
224 OsculSurf = BuildOsculatingSurface(U1,UKnot,VKnot,S,L);
225 if(!OsculSurf) break;
228 std::cout<<"1.k = "<<k<<std::endl;
230 IsQPunc=IsQPunctual(L,U1,GeomAbs_IsoU,0.,Tol);
236 myOsculSurf1->Append(L);
238 ClearOsculFlags(); //myAlong.SetValue(3,Standard_False);
239 if (myAlong(4) && OsculSurf )
241 S = InitSurf; k=0; IsQPunc=Standard_True;
242 UKnot=InitSurf->NbUKnots()-1;
246 OsculSurf = BuildOsculatingSurface(U2,UKnot,VKnot,S,L);
247 if(!OsculSurf) break;
250 std::cout<<"2.k = "<<k<<std::endl;
252 IsQPunc=IsQPunctual(L,U2,GeomAbs_IsoU,0.,Tol);
259 myOsculSurf2->Append(L);
266 S = InitSurf; k=0; IsQPunc=Standard_True;
267 UKnot=InitSurf->NbUKnots()-1;
271 OsculSurf = BuildOsculatingSurface(U2,UKnot,VKnot,S,L);
272 if(!OsculSurf) break;
275 std::cout<<"2.k = "<<k<<std::endl;
277 IsQPunc=IsQPunctual(L,U2,GeomAbs_IsoU,0.,Tol);
284 myOsculSurf2->Append(L);
288 ClearOsculFlags(); //myAlong.SetValue(4,Standard_False);
303 //=======================================================================
304 //function : BasisSurface
306 //=======================================================================
308 Handle(Geom_Surface) Geom_OsculatingSurface::BasisSurface() const
313 //=======================================================================
314 //function : Tolerance
316 //=======================================================================
318 Standard_Real Geom_OsculatingSurface::Tolerance() const
323 //=======================================================================
324 //function : UOscSurf
326 //=======================================================================
328 Standard_Boolean Geom_OsculatingSurface::UOscSurf
329 (const Standard_Real U,
330 const Standard_Real V,
332 Handle(Geom_BSplineSurface)& L) const
334 Standard_Boolean along = Standard_False;
335 if (myAlong(1) || myAlong(2))
337 Standard_Integer NU = 1, NV = 1;
338 Standard_Real u1,u2,v1,v2;
340 myBasisSurf->Bounds(u1,u2,v1,v2);
341 Standard_Integer NbUK,NbVK;
342 Standard_Boolean isToSkipSecond = Standard_False;
343 if (myBasisSurf->IsKind(STANDARD_TYPE(Geom_BSplineSurface)))
345 Handle(Geom_BSplineSurface) BSur =
346 Handle(Geom_BSplineSurface)::DownCast (myBasisSurf);
347 NbUK = BSur->NbUKnots();
348 NbVK = BSur->NbVKnots();
349 TColStd_Array1OfReal UKnots(1,NbUK);
350 TColStd_Array1OfReal VKnots(1,NbVK);
351 BSur->UKnots(UKnots);
352 BSur->VKnots(VKnots);
353 BSplCLib::Hunt(UKnots,U,NU);
354 BSplCLib::Hunt(VKnots,V,NV);
356 if (NU >= NbUK) NU=NbUK-1;
357 if (NbVK==2 && NV==1)
358 // Need to find the closest end
359 if (VKnots(NbVK)-V > V-VKnots(1))
360 isToSkipSecond = Standard_True;
362 else {NU = 1; NV = 1 ; NbVK = 2 ;}
364 if (myAlong(1) && NV == 1)
366 L = *((Handle(Geom_BSplineSurface)*)& myOsculSurf1->Value(NU));
367 along = Standard_True;
369 if (myAlong(2) && (NV == NbVK-1) && !isToSkipSecond)
371 // t means that derivative vector of osculating surface is opposite
372 // to the original. This happens when (v-t)^k is negative, i.e.
373 // difference between degrees (k) is odd and t is the last parameter
374 if (myKdeg->Value(NU)%2) t = Standard_True;
375 L = *((Handle(Geom_BSplineSurface)*)& myOsculSurf2->Value(NU));
376 along = Standard_True;
382 //=======================================================================
383 //function : VOscSurf
385 //=======================================================================
387 Standard_Boolean Geom_OsculatingSurface::VOscSurf
388 (const Standard_Real U,
389 const Standard_Real V,
391 Handle(Geom_BSplineSurface)& L) const
393 Standard_Boolean along = Standard_False;
394 if (myAlong(3) || myAlong(4))
396 Standard_Integer NU = 1, NV = 1;
397 Standard_Real u1,u2,v1,v2;
399 myBasisSurf->Bounds(u1,u2,v1,v2);
400 Standard_Integer NbUK,NbVK;
401 Standard_Boolean isToSkipSecond = Standard_False;
402 if (myBasisSurf->IsKind(STANDARD_TYPE(Geom_BSplineSurface)))
404 Handle(Geom_BSplineSurface) BSur =
405 Handle(Geom_BSplineSurface)::DownCast (myBasisSurf);
406 NbUK = BSur->NbUKnots();
407 NbVK = BSur->NbVKnots();
408 TColStd_Array1OfReal UKnots(1,NbUK);
409 TColStd_Array1OfReal VKnots(1,NbVK);
410 BSur->UKnots(UKnots);
411 BSur->VKnots(VKnots);
412 BSplCLib::Hunt(UKnots,U,NU);
413 BSplCLib::Hunt(VKnots,V,NV);
415 if (NV >= NbVK) NV=NbVK-1;
416 if (NbUK==2 && NU==1)
417 // Need to find the closest end
418 if (UKnots(NbUK)-U > U-UKnots(1))
419 isToSkipSecond = Standard_True;
421 else {NU = 1; NV = 1 ; NbUK = 2;}
423 if (myAlong(3) && NU == 1)
425 L = *((Handle(Geom_BSplineSurface)*)& myOsculSurf1->Value(NV));
426 along = Standard_True;
428 if (myAlong(4) && (NU == NbUK-1) && !isToSkipSecond)
430 if (myKdeg->Value(NV)%2) t = Standard_True;
431 L = *((Handle(Geom_BSplineSurface)*)& myOsculSurf2->Value(NV));
432 along = Standard_True;
438 //=======================================================================
439 //function : BuildOsculatingSurface
441 //=======================================================================
443 Standard_Boolean Geom_OsculatingSurface::BuildOsculatingSurface
444 (const Standard_Real Param,
445 const Standard_Integer SUKnot,
446 const Standard_Integer SVKnot,
447 const Handle(Geom_BSplineSurface)& BS,
448 Handle(Geom_BSplineSurface)& BSpl) const
450 Standard_Boolean OsculSurf=Standard_True;
452 std::cout<<"t = "<<Param<<std::endl;
453 std::cout<<"======================================"<<std::endl<<std::endl;
457 Standard_Integer MinDegree,
459 Standard_Real udeg, vdeg;
460 udeg = BS->UDegree();
461 vdeg = BS->VDegree();
462 if( (IsAlongU() && vdeg <=1) || (IsAlongV() && udeg <=1))
465 std::cout<<" surface osculatrice nulle "<<std::endl;
467 //throw Standard_ConstructionError("Geom_OsculatingSurface");
468 OsculSurf=Standard_False;
472 MinDegree = (Standard_Integer ) Min(udeg,vdeg) ;
473 MaxDegree = (Standard_Integer ) Max(udeg,vdeg) ;
475 TColgp_Array2OfPnt cachepoles(1, MaxDegree + 1, 1, MinDegree + 1);
478 // for polynomial grid
479 Standard_Integer MaxUDegree, MaxVDegree;
480 Standard_Integer UContinuity, VContinuity;
482 Handle(TColStd_HArray2OfInteger) NumCoeffPerSurface =
483 new TColStd_HArray2OfInteger(1, 1, 1, 2);
484 Handle(TColStd_HArray1OfReal) PolynomialUIntervals =
485 new TColStd_HArray1OfReal(1, 2);
486 Handle(TColStd_HArray1OfReal) PolynomialVIntervals =
487 new TColStd_HArray1OfReal(1, 2);
488 Handle(TColStd_HArray1OfReal) TrueUIntervals =
489 new TColStd_HArray1OfReal(1, 2);
490 Handle(TColStd_HArray1OfReal) TrueVIntervals =
491 new TColStd_HArray1OfReal(1, 2);
492 MaxUDegree = (Standard_Integer ) udeg;
493 MaxVDegree = (Standard_Integer ) vdeg;
495 for (Standard_Integer i = 1; i <= 2; i++)
497 PolynomialUIntervals->ChangeValue(i) = i-1;
498 PolynomialVIntervals->ChangeValue(i) = i-1;
499 TrueUIntervals->ChangeValue(i) = BS->UKnot(SUKnot+i-1);
500 TrueVIntervals->ChangeValue(i) = BS->VKnot(SVKnot+i-1);
504 Standard_Integer OscUNumCoeff=0, OscVNumCoeff=0;
508 std::cout<<">>>>>>>>>>> AlongU"<<std::endl;
510 OscUNumCoeff = (Standard_Integer ) udeg + 1;
511 OscVNumCoeff = (Standard_Integer ) vdeg;
516 std::cout<<">>>>>>>>>>> AlongV"<<std::endl;
518 OscUNumCoeff = (Standard_Integer ) udeg;
519 OscVNumCoeff = (Standard_Integer ) vdeg + 1;
521 NumCoeffPerSurface->ChangeValue(1,1) = OscUNumCoeff;
522 NumCoeffPerSurface->ChangeValue(1,2) = OscVNumCoeff;
523 Standard_Integer nbc = NumCoeffPerSurface->Value(1,1)*NumCoeffPerSurface->Value(1,2)*3;
527 return Standard_False;
530 Handle(TColStd_HArray1OfReal) Coefficients = new TColStd_HArray1OfReal(1, nbc);
531 // end for polynomial grid
533 // building the cache
534 Standard_Integer ULocalIndex, VLocalIndex;
535 Standard_Real ucacheparameter, vcacheparameter,uspanlength, vspanlength;
536 TColgp_Array2OfPnt NewPoles(1, BS->NbUPoles(), 1, BS->NbVPoles());
538 Standard_Integer aUfKnotsLength = BS->NbUPoles() + BS->UDegree() + 1;
539 Standard_Integer aVfKnotsLength = BS->NbVPoles() + BS->VDegree() + 1;
541 if(BS->IsUPeriodic())
543 TColStd_Array1OfInteger aMults(1, BS->NbUKnots());
544 BS->UMultiplicities(aMults);
545 aUfKnotsLength = BSplCLib::KnotSequenceLength(aMults, BS->UDegree(), Standard_True);
548 if(BS->IsVPeriodic())
550 TColStd_Array1OfInteger aMults(1, BS->NbVKnots());
551 BS->VMultiplicities(aMults);
552 aVfKnotsLength = BSplCLib::KnotSequenceLength(aMults, BS->VDegree(), Standard_True);
555 TColStd_Array1OfReal UFlatKnots(1, aUfKnotsLength);
556 TColStd_Array1OfReal VFlatKnots(1, aVfKnotsLength);
558 BS->UKnotSequence(UFlatKnots);
559 BS->VKnotSequence(VFlatKnots);
563 ucacheparameter = BS->UKnot(SUKnot);
564 vcacheparameter = BS->VKnot(SVKnot);
565 vspanlength = BS->VKnot(SVKnot + 1) - BS->VKnot(SVKnot);
566 uspanlength = BS->UKnot(SUKnot + 1) - BS->UKnot(SUKnot);
568 // On se ramene toujours a un parametrage tel que localement ce soit l'iso
569 // u=0 ou v=0 qui soit degeneree
571 Standard_Boolean IsVNegative = Param > vcacheparameter + vspanlength/2;
572 Standard_Boolean IsUNegative = Param > ucacheparameter + uspanlength/2;
574 if (IsAlongU() && (Param > vcacheparameter + vspanlength/2))
575 vcacheparameter = vcacheparameter + vspanlength;
576 if (IsAlongV() && (Param > ucacheparameter + uspanlength/2))
577 ucacheparameter = ucacheparameter + uspanlength;
579 BSplSLib::BuildCache(ucacheparameter,
592 BSplSLib::NoWeights(),
594 BSplSLib::NoWeights());
595 Standard_Integer m, n, index;
596 TColgp_Array2OfPnt OscCoeff(1,OscUNumCoeff , 1, OscVNumCoeff);
602 for(n = 1; n <= udeg + 1; n++)
603 for(m = 1; m <= vdeg; m++)
604 OscCoeff(n,m) = cachepoles(n,m+1) ;
608 for(n = 1; n <= udeg + 1; n++)
609 for(m = 1; m <= vdeg; m++)
610 OscCoeff(n,m) = cachepoles(m+1,n) ;
612 if (IsVNegative) PLib::VTrimming(-1,0,OscCoeff,PLib::NoWeights2());
615 for(n = 1; n <= udeg + 1; n++)
616 for(m = 1; m <= vdeg; m++)
618 Coefficients->ChangeValue(index++) = OscCoeff(n,m).X();
619 Coefficients->ChangeValue(index++) = OscCoeff(n,m).Y();
620 Coefficients->ChangeValue(index++) = OscCoeff(n,m).Z();
628 for(n = 1; n <= udeg; n++)
629 for(m = 1; m <= vdeg + 1; m++)
630 OscCoeff(n,m) = cachepoles(n+1,m);
634 for(n = 1; n <= udeg; n++)
635 for(m = 1; m <= vdeg + 1; m++)
636 OscCoeff(n,m) = cachepoles(m,n+1);
638 if (IsUNegative) PLib::UTrimming(-1,0,OscCoeff,PLib::NoWeights2());
640 for(n = 1; n <= udeg; n++)
641 for(m = 1; m <= vdeg + 1; m++)
643 Coefficients->ChangeValue(index++) = OscCoeff(n,m).X();
644 Coefficients->ChangeValue(index++) = OscCoeff(n,m).Y();
645 Coefficients->ChangeValue(index++) = OscCoeff(n,m).Z();
649 if (IsAlongU()) MaxVDegree--;
650 if (IsAlongV()) MaxUDegree--;
654 Convert_GridPolynomialToPoles Data(1,1,
661 PolynomialUIntervals,
662 PolynomialVIntervals,
666 // Handle(Geom_BSplineSurface) BSpl =
667 BSpl =new Geom_BSplineSurface(Data.Poles()->Array2(),
668 Data.UKnots()->Array1(),
669 Data.VKnots()->Array1(),
670 Data.UMultiplicities()->Array1(),
671 Data.VMultiplicities()->Array1(),
676 std::cout<<"^====================================^"<<std::endl<<std::endl;
684 //=======================================================================
685 //function : IsQPunctual
687 //=======================================================================
689 Standard_Boolean Geom_OsculatingSurface::IsQPunctual
690 (const Handle(Geom_Surface)& S,
691 const Standard_Real Param,
692 const GeomAbs_IsoType IT,
693 const Standard_Real TolMin,
694 const Standard_Real TolMax) const
696 Standard_Real U1=0,U2=0,V1=0,V2=0,T;
697 Standard_Boolean Along = Standard_True;
698 S->Bounds(U1,U2,V1,V2);
701 Standard_Real Step,D1NormMax;
702 if (IT == GeomAbs_IsoV)
706 for (T=U1;T<=U2;T=T+Step)
708 S->D1(T,Param,P,D1U,D1V);
709 D1NormMax=Max(D1NormMax,D1U.Magnitude());
713 std::cout << " D1NormMax = " << D1NormMax << std::endl;
715 if (D1NormMax >TolMax || D1NormMax < TolMin )
716 Along = Standard_False;
722 for (T=V1;T<=V2;T=T+Step)
724 S->D1(Param,T,P,D1U,D1V);
725 D1NormMax=Max(D1NormMax,D1V.Magnitude());
728 std::cout << " D1NormMax = " << D1NormMax << std::endl;
730 if (D1NormMax >TolMax || D1NormMax < TolMin )
731 Along = Standard_False;
738 //=======================================================================
739 //function : HasOscSurf
741 //=======================================================================
743 Standard_Boolean Geom_OsculatingSurface::HasOscSurf() const
745 return (myAlong(1) || myAlong(2) || myAlong(3) || myAlong(4));
748 //=======================================================================
749 //function : IsAlongU
751 //=======================================================================
753 Standard_Boolean Geom_OsculatingSurface::IsAlongU() const
755 return (myAlong(1) || myAlong(2));
757 //=======================================================================
758 //function : IsAlongV
760 //=======================================================================
762 Standard_Boolean Geom_OsculatingSurface::IsAlongV() const
764 return (myAlong(3) || myAlong(4));
768 //=======================================================================
769 //function : IsGetSeqOfL1
771 //=======================================================================
773 const Geom_SequenceOfBSplineSurface& Geom_OsculatingSurface::GetSeqOfL1() const
775 return myOsculSurf1->Sequence();
777 //=======================================================================
778 //function : IsGetSeqOfL2
780 //=======================================================================
782 const Geom_SequenceOfBSplineSurface& Geom_OsculatingSurface::GetSeqOfL2() const
784 return myOsculSurf2->Sequence();
786 //=======================================================================
787 //function : ClearOsculFlags
789 //=======================================================================
791 void Geom_OsculatingSurface::ClearOsculFlags()
793 myAlong.SetValue(1,Standard_False);
794 myAlong.SetValue(2,Standard_False);
795 myAlong.SetValue(3,Standard_False);
796 myAlong.SetValue(4,Standard_False);
800 //=======================================================================
801 //function : DumpJson
803 //=======================================================================
804 void Geom_OsculatingSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
806 OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
808 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myBasisSurf.get())
809 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTol)
811 if (!myOsculSurf1.IsNull())
812 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myOsculSurf1->Size())
813 if (!myOsculSurf2.IsNull())
814 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myOsculSurf2->Size())
815 if (!myKdeg.IsNull())
816 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myKdeg->Size())
818 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAlong.Size())