1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2012 OPEN CASCADE SAS
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
19 #include <BRepGProp_Face.ixx>
20 #include <BRep_Tool.hxx>
22 #include <GeomAdaptor_Surface.hxx>
23 #include <Geom_Surface.hxx>
24 #include <Geom_BezierSurface.hxx>
25 #include <Geom_BSplineSurface.hxx>
26 #include <Geom2d_BezierCurve.hxx>
27 #include <Geom2d_BSplineCurve.hxx>
29 #include <Bnd_Box2d.hxx>
30 #include <BndLib_Add2dCurve.hxx>
31 #include <GeomAdaptor_Curve.hxx>
32 #include <Geom_BSplineCurve.hxx>
33 #include <Precision.hxx>
34 #include <TColStd_SequenceOfReal.hxx>
35 #include <Geom_SurfaceOfLinearExtrusion.hxx>
36 #include <Geom2d_Line.hxx>
38 //=======================================================================
39 //function : UIntegrationOrder
41 //=======================================================================
43 Standard_Integer BRepGProp_Face::UIntegrationOrder() const {
46 switch (mySurface.GetType()) {
52 case GeomAbs_BezierSurface :
54 Nu = (*((Handle(Geom_BezierSurface)*)&((mySurface.Surface()).Surface())))->UDegree()+1;
58 case GeomAbs_BSplineSurface :
60 Standard_Integer a = (*((Handle(Geom_BSplineSurface)*)&((mySurface.Surface()).Surface())))->UDegree()+1;
61 Standard_Integer b = (*((Handle(Geom_BSplineSurface)*)&((mySurface.Surface()).Surface())))->NbUKnots()-1;
73 //=======================================================================
74 //function : VIntegrationOrder
76 //=======================================================================
78 Standard_Integer BRepGProp_Face::VIntegrationOrder() const
81 switch (mySurface.GetType()) {
87 case GeomAbs_BezierSurface :
89 Nv = (*((Handle(Geom_BezierSurface)*)&((mySurface.Surface()).Surface())))->VDegree()+1;
94 case GeomAbs_BSplineSurface :
96 Standard_Integer a = (*((Handle(Geom_BSplineSurface)*)&((mySurface.Surface()).Surface())))->VDegree()+1;
97 Standard_Integer b = (*((Handle(Geom_BSplineSurface)*)&((mySurface.Surface()).Surface())))->NbVKnots()-1;
109 //=======================================================================
110 //function : IntegrationOrder
112 //=======================================================================
114 Standard_Integer BRepGProp_Face::IntegrationOrder() const
118 switch (myCurve.GetType()) {
124 case GeomAbs_Circle :
125 case GeomAbs_Ellipse :
126 case GeomAbs_Hyperbola :
130 case GeomAbs_Parabola :
134 case GeomAbs_BezierCurve :
136 N = (*((Handle(Geom2d_BezierCurve)*)&(myCurve.Curve())))->Degree() + 1;
140 case GeomAbs_BSplineCurve :
142 Standard_Integer a = (*((Handle(Geom2d_BSplineCurve)*)&(myCurve.Curve())))->Degree() + 1;
143 Standard_Integer b = (*((Handle(Geom2d_BSplineCurve)*)&(myCurve.Curve())))->NbKnots() - 1;
156 //=======================================================================
159 //=======================================================================
161 void BRepGProp_Face::Bounds(Standard_Real& U1,
164 Standard_Real& V2)const
166 U1 = mySurface.FirstUParameter();
167 U2 = mySurface.LastUParameter();
168 V1 = mySurface.FirstVParameter();
169 V2 = mySurface.LastVParameter();
172 //=======================================================================
175 //=======================================================================
177 void BRepGProp_Face::Load(const TopoDS_Edge& E)
180 Handle(Geom2d_Curve) C =
181 BRep_Tool::CurveOnSurface(E, mySurface.Face(), a,b);
182 if (E.Orientation() == TopAbs_REVERSED) {
184 a = C->ReversedParameter(b);
185 b = C->ReversedParameter(x);
191 //=======================================================================
194 //=======================================================================
196 void BRepGProp_Face::Load(const TopoDS_Face& F)
198 TopoDS_Shape aLocalShape = F.Oriented(TopAbs_FORWARD);
199 mySurface.Initialize(TopoDS::Face(aLocalShape));
200 // mySurface.Initialize(TopoDS::Face(F.Oriented(TopAbs_FORWARD)));
201 mySReverse = (F.Orientation() == TopAbs_REVERSED);
204 //=======================================================================
207 //=======================================================================
209 void BRepGProp_Face::Normal (const Standard_Real U,
210 const Standard_Real V,
215 mySurface.D1(U,V,P,D1U,D1V);
216 VNor = D1U.Crossed(D1V);
217 if (mySReverse) VNor.Reverse();
221 // APO 17.04.2002 (OCC104)
222 // This is functions that calculate coeff. to optimize "integration order".
223 //They had been produced experementally for some hard example.
224 static Standard_Real AS = -0.15, AL = -0.50, B = 1.0, C = 0.75, D = 0.25;
225 static inline Standard_Real SCoeff(const Standard_Real Eps){
226 return Eps < 0.1? AS*(B+Log10(Eps)) + C: C;
228 static inline Standard_Real LCoeff(const Standard_Real Eps){
229 return Eps < 0.1? AL*(B+Log10(Eps)) + D: D;
232 //=======================================================================
233 //function : SIntOrder
235 //=======================================================================
237 Standard_Integer BRepGProp_Face::SIntOrder(const Standard_Real Eps) const
239 Standard_Integer Nv, Nu;
240 switch (mySurface.GetType()) {
242 Nu = 1; Nv = 1; break;
243 case GeomAbs_Cylinder:
244 Nu = 2; Nv = 1; break;
246 Nu = 2; Nv = 1; break;
248 Nu = 2; Nv = 2; break;
250 Nu = 2; Nv = 2; break;
251 case GeomAbs_BezierSurface:
252 Nv = (*((Handle(Geom_BezierSurface)*)&((mySurface.Surface()).Surface())))->VDegree();
253 Nu = (*((Handle(Geom_BezierSurface)*)&((mySurface.Surface()).Surface())))->UDegree();
255 case GeomAbs_BSplineSurface:
256 Nv = (*((Handle(Geom_BSplineSurface)*)&((mySurface.Surface()).Surface())))->VDegree();
257 Nu = (*((Handle(Geom_BSplineSurface)*)&((mySurface.Surface()).Surface())))->UDegree();
260 Nu = 2; Nv = 2; break;
262 return Min(RealToInt(Ceiling(SCoeff(Eps)*Max((Nu+1),(Nv+1)))), math::GaussPointsMax());
265 //=======================================================================
266 //function : SUIntSubs
268 //=======================================================================
270 Standard_Integer BRepGProp_Face::SUIntSubs() const
273 switch (mySurface.GetType()) {
276 case GeomAbs_Cylinder:
284 case GeomAbs_BezierSurface:
286 case GeomAbs_BSplineSurface:
287 N = (*((Handle(Geom_BSplineSurface)*)&((mySurface.Surface()).Surface())))->NbUKnots(); break;
294 //=======================================================================
295 //function : SVIntSubs
297 //=======================================================================
299 Standard_Integer BRepGProp_Face::SVIntSubs() const
302 switch (mySurface.GetType()) {
305 case GeomAbs_Cylinder:
313 case GeomAbs_BezierSurface:
315 case GeomAbs_BSplineSurface:
316 N = (*((Handle(Geom_BSplineSurface)*)&((mySurface.Surface()).Surface())))->NbVKnots();
324 //=======================================================================
327 //=======================================================================
329 void BRepGProp_Face::UKnots(TColStd_Array1OfReal& Knots) const
331 switch (mySurface.GetType()) {
333 Knots(1) = mySurface.FirstUParameter(); Knots(2) = mySurface.LastUParameter();
335 case GeomAbs_Cylinder:
339 Knots(1) = 0.0; Knots(2) = M_PI*2.0/3.0; Knots(3) = M_PI*4.0/3.0; Knots(4) = M_PI*6.0/3.0;
341 case GeomAbs_BSplineSurface:
342 (*((Handle(Geom_BSplineSurface)*)&((mySurface.Surface()).Surface())))->UKnots(Knots);
345 Knots(1) = mySurface.FirstUParameter(); Knots(2) = mySurface.LastUParameter();
350 //=======================================================================
353 //=======================================================================
355 void BRepGProp_Face::VKnots(TColStd_Array1OfReal& Knots) const
357 switch (mySurface.GetType()) {
359 case GeomAbs_Cylinder:
361 Knots(1) = mySurface.FirstUParameter(); Knots(2) = mySurface.LastUParameter();
364 Knots(1) = -M_PI/2.0; Knots(2) = 0.0; Knots(3) = +M_PI/2.0;
367 Knots(1) = 0.0; Knots(2) = M_PI*2.0/3.0; Knots(3) = M_PI*4.0/3.0; Knots(4) = M_PI*6.0/3.0;
369 case GeomAbs_BSplineSurface:
370 (*((Handle(Geom_BSplineSurface)*)&((mySurface.Surface()).Surface())))->VKnots(Knots);
373 Knots(1) = mySurface.FirstUParameter(); Knots(2) = mySurface.LastUParameter();
378 //=======================================================================
379 //function : LIntOrder
381 //=======================================================================
383 Standard_Integer BRepGProp_Face::LIntOrder(const Standard_Real Eps) const
387 BndLib_Add2dCurve::Add(myCurve, 1.e-7, aBox);
388 Standard_Real aXmin, aXmax, aYmin, aYmax;
389 aBox.Get(aXmin, aYmin, aXmax, aYmax);
390 Standard_Real aVmin = mySurface.FirstVParameter();
391 Standard_Real aVmax = mySurface.LastVParameter();
393 Standard_Real anR = Min((aYmax-aYmin)/(aVmax-aVmin), 1.);
395 // Standard_Integer anRInt = Max(RealToInt(Ceiling(SVIntSubs()*anR)), 2);
396 Standard_Integer anRInt = RealToInt(Ceiling(SVIntSubs()*anR));
397 Standard_Integer aLSubs = LIntSubs();
400 // Standard_Real NL, NS = Max(SIntOrder(1.0)*anRInt/LIntSubs(), 1);
401 Standard_Real NL, NS = Max(SIntOrder(1.)*anRInt/aLSubs, 1);
402 switch (myCurve.GetType()) {
406 NL = 2 * 3; break; //correction for the spans of converted curve
407 case GeomAbs_Ellipse:
408 NL = 2 * 3; break; //
409 case GeomAbs_Parabola:
411 case GeomAbs_Hyperbola:
413 case GeomAbs_BezierCurve:
414 NL = (*((Handle(Geom2d_BezierCurve)*)&(myCurve.Curve())))->Degree();
416 case GeomAbs_BSplineCurve:
417 NL = (*((Handle(Geom2d_BSplineCurve)*)&(myCurve.Curve())))->Degree();
425 Standard_Integer nn =
426 RealToInt (aLSubs <= 4 ? Ceiling(LCoeff(Eps)*(NL+1)) : NL+1);
428 //return Min(RealToInt(Ceiling(LCoeff(Eps)*(NL+1)*NS)), math::GaussPointsMax());
429 return Min(nn, math::GaussPointsMax());
432 //=======================================================================
433 //function : LIntSubs
435 //=======================================================================
437 Standard_Integer BRepGProp_Face::LIntSubs() const
440 switch (myCurve.GetType()) {
444 case GeomAbs_Ellipse:
446 case GeomAbs_Parabola:
447 case GeomAbs_Hyperbola:
449 case GeomAbs_BSplineCurve:
450 N = (*((Handle(Geom2d_BSplineCurve)*)&(myCurve.Curve())))->NbKnots();
458 //=======================================================================
461 //=======================================================================
463 void BRepGProp_Face::LKnots(TColStd_Array1OfReal& Knots) const
465 switch (myCurve.GetType()) {
467 Knots(1) = myCurve.FirstParameter(); Knots(2) = myCurve.LastParameter();
470 case GeomAbs_Ellipse:
471 Knots(1) = 0.0; Knots(2) = M_PI*2.0/3.0; Knots(3) = M_PI*4.0/3.0; Knots(2) = M_PI*6.0/3.0;
473 case GeomAbs_Parabola:
474 case GeomAbs_Hyperbola:
475 Knots(1) = myCurve.FirstParameter(); Knots(2) = myCurve.LastParameter();
477 case GeomAbs_BSplineCurve:
478 (*((Handle(Geom2d_BSplineCurve)*)&(myCurve.Curve())))->Knots(Knots);
481 Knots(1) = myCurve.FirstParameter(); Knots(2) = myCurve.LastParameter();
486 //=======================================================================
489 //=======================================================================
491 void BRepGProp_Face::Load(const Standard_Boolean IsFirstParam,
492 const GeomAbs_IsoType theIsoType)
502 Bounds(aU1, aU2, aV1, aV2);
504 if (theIsoType == GeomAbs_IsoU) {
508 aLoc.SetCoord(aU1, aV2);
509 aDir.SetCoord(0., -1.);
511 aLoc.SetCoord(aU2, aV1);
512 aDir.SetCoord(0., 1.);
514 } else if (theIsoType == GeomAbs_IsoV) {
518 aLoc.SetCoord(aU1, aV1);
519 aDir.SetCoord(1., 0.);
521 aLoc.SetCoord(aU2, aV2);
522 aDir.SetCoord(-1., 0.);
527 Handle(Geom2d_Curve) aLin = new Geom2d_Line(aLoc, aDir);
529 myCurve.Load(aLin, 0., aLen);
532 //=======================================================================
533 //function : GetRealKnots
535 //=======================================================================
537 static void GetRealKnots(const Standard_Real theMin,
538 const Standard_Real theMax,
539 const Handle(TColStd_HArray1OfReal) &theKnots,
540 Handle(TColStd_HArray1OfReal) &theRealKnots)
542 Standard_Integer i = theKnots->Lower() - 1;
543 Standard_Integer iU = theKnots->Upper();
544 Standard_Integer aStartI = 0;
545 Standard_Integer aEndI = 0;
546 Standard_Real aTol = Precision::Confusion();
549 if (aStartI == 0 && theKnots->Value(i) > theMin + aTol)
552 if (aEndI == 0 && theKnots->Value(i + 1) > theMax - aTol)
555 if (aStartI != 0 && aEndI != 0)
562 Standard_Integer aNbNode = Max(0, aEndI - aStartI + 1) + 2;
565 theRealKnots = new TColStd_HArray1OfReal(1, aNbNode);
566 theRealKnots->SetValue(1, theMin);
567 theRealKnots->SetValue(aNbNode, theMax);
570 for (i = 2, j = aStartI; j <= aEndI; i++, j++)
571 theRealKnots->SetValue(i, theKnots->Value(j));
574 //=======================================================================
575 //function : GetCurveKnots
577 //=======================================================================
579 static void GetCurveKnots(const Standard_Real theMin,
580 const Standard_Real theMax,
581 const Geom2dAdaptor_Curve &theCurve,
582 Handle(TColStd_HArray1OfReal) &theKnots)
584 Standard_Boolean isSBSpline = theCurve.GetType() == GeomAbs_BSplineCurve;
587 Handle(Geom2d_BSplineCurve) aCrv;
588 Standard_Integer aNbKnots;
589 Handle(TColStd_HArray1OfReal) aCrvKnots;
591 aCrv = Handle(Geom2d_BSplineCurve)::DownCast(theCurve.Curve());
592 aNbKnots = aCrv->NbKnots();
593 aCrvKnots = new TColStd_HArray1OfReal(1, aNbKnots);
594 aCrv->Knots(aCrvKnots->ChangeArray1());
595 GetRealKnots(theMin, theMax, aCrvKnots, theKnots);
597 theKnots = new TColStd_HArray1OfReal(1, 2);
598 theKnots->SetValue(1, theMin);
599 theKnots->SetValue(2, theMax);
603 //=======================================================================
604 //function : GetIntervalNbr
606 //=======================================================================
608 static Standard_Integer GetIntervalNbr
609 (const Standard_Real theParam,
610 const Handle(TColStd_HArray1OfReal) &theSurfKnots,
611 const Standard_Integer theIndStart,
612 const Standard_Integer theIndEnd)
615 Standard_Real aTol = Precision::Confusion();
617 for (i = theIndStart + 1; i < theIndEnd; i++) {
618 if (theSurfKnots->Value(i) > theParam + aTol)
622 return Min(theIndStart, theIndEnd - 1);
625 //=======================================================================
626 //function : GetRealCurveKnots
628 //=======================================================================
630 static void GetRealCurveKnots
631 (const Handle(TColStd_HArray1OfReal) &theCurveKnots,
632 const Handle(TColStd_HArray1OfReal) &theSurfKnots,
633 const Geom2dAdaptor_Curve &theCurve,
634 Handle(TColStd_HArray1OfReal) &theTKnots)
636 Standard_Integer i = theCurveKnots->Lower();
637 Standard_Integer iU = theCurveKnots->Upper();
638 Standard_Integer aNbIntPnt = 23;
639 TColStd_SequenceOfReal aSeqKnot;
640 Standard_Real aTol = Precision::Confusion();
641 Standard_Real aTParam;
644 Standard_Real aT1 = theCurveKnots->Value(i++);
645 Standard_Real aT2 = theCurveKnots->Value(i);
646 Standard_Real aStep = (aT2 - aT1)/(aNbIntPnt + 1.);
650 Standard_Integer aSurfLInd = theSurfKnots->Lower();
651 Standard_Integer aSurfUInd = theSurfKnots->Upper();
652 Standard_Integer anIntrvlInd;
653 Standard_Real aTParamOld;
654 Standard_Real aVParam;
655 Standard_Real aVParamOld;
656 Standard_Real aDiffOld;
660 // Append the first curve knot of each interval in the sequence of knots.
661 aSeqKnot.Append(aT1);
664 theCurve.D0(aTParamOld, aValue);
665 aVParamOld = aValue.Y();
666 anIntrvlInd = GetIntervalNbr(aVParamOld, theSurfKnots,
667 aSurfLInd, aSurfUInd);
668 aDiffOld = Min(Abs(aVParamOld - theSurfKnots->Value(anIntrvlInd)),
669 Abs(aVParamOld - theSurfKnots->Value(anIntrvlInd + 1)));
671 for (j = 1; j <= aNbIntPnt; j++) {
672 aTParam = aT1 + j*aStep;
673 theCurve.D1(aTParam, aValue, aDir);
674 aVParam = aValue.Y();
675 aDiff = Min(Abs(aVParam - theSurfKnots->Value(anIntrvlInd)),
676 Abs(aVParam - theSurfKnots->Value(anIntrvlInd + 1)));
678 // Skip points if the curve goes along V isoline.
679 if (Abs(aDir.Y()) > aTol) {
680 Standard_Boolean isLower =
681 (aVParam - aTol < theSurfKnots->Value(anIntrvlInd));
682 Standard_Boolean isUpper =
683 (aVParam + aTol > theSurfKnots->Value(anIntrvlInd + 1));
685 if (isLower || isUpper) {
687 aSurfLInd = theSurfKnots->Lower();
688 aSurfUInd = anIntrvlInd - 1;
689 } else if (isUpper) {
690 aSurfLInd = anIntrvlInd + 1;
691 aSurfUInd = theSurfKnots->Upper();
694 // The V interval is changed. Find new interval.
695 anIntrvlInd = GetIntervalNbr(aVParam, theSurfKnots,
696 aSurfLInd, aSurfUInd);
698 // Add the value that is closer to surface knots.
699 // Check if the previous value is already added.
700 if (aDiff < aDiffOld)
701 aSeqKnot.Append(aTParam);
702 else if (Abs(aSeqKnot.Last() - aTParamOld) > aTol)
703 aSeqKnot.Append(aTParamOld);
707 // Prepare data for the next iteration.
708 aTParamOld = aTParam;
709 aVParamOld = aVParam;
714 // Add the last curve knot to the sequence.
715 aSeqKnot.Append(theCurveKnots->Value(iU));
717 // Fill the array of knots.
718 Standard_Integer aKnotsLen = aSeqKnot.Length();
720 theTKnots = new TColStd_HArray1OfReal(1, aKnotsLen);
722 for (i = 1; i <= aKnotsLen; i++) {
723 aTParam = aSeqKnot.Value(i);
724 theTKnots->SetValue(i, aTParam);
728 //=======================================================================
729 //function : GetUKnots
731 //=======================================================================
733 void BRepGProp_Face::GetUKnots
734 (const Standard_Real theUMin,
735 const Standard_Real theUMax,
736 Handle(TColStd_HArray1OfReal) &theUKnots) const
738 Standard_Boolean isSBSpline = mySurface.GetType() == GeomAbs_BSplineSurface;
739 Standard_Boolean isCBSpline = Standard_False;
742 // Check the basis curve of the surface of linear extrusion.
743 if (mySurface.GetType() == GeomAbs_SurfaceOfExtrusion) {
744 GeomAdaptor_Curve aCurve;
745 Handle(Geom_Surface) aSurf = mySurface.Surface().Surface();
747 aCurve.Load((*((Handle(Geom_SurfaceOfLinearExtrusion)*)&aSurf))->BasisCurve());
748 isCBSpline = aCurve.GetType() == GeomAbs_BSplineCurve;
752 if (myIsUseSpan && (isSBSpline || isCBSpline)) {
753 // Using span decomposition for BSpline.
754 Handle(TColStd_HArray1OfReal) aKnots;
755 Standard_Integer aNbKnots;
758 // Get U knots of BSpline surface.
759 Handle(Geom_Surface) aSurf = mySurface.Surface().Surface();
760 Handle(Geom_BSplineSurface) aBSplSurf;
762 aBSplSurf = Handle(Geom_BSplineSurface)::DownCast(aSurf);
763 aNbKnots = aBSplSurf->NbUKnots();
764 aKnots = new TColStd_HArray1OfReal(1, aNbKnots);
765 aBSplSurf->UKnots(aKnots->ChangeArray1());
767 // Get U knots of BSpline curve - basis curve of
768 // the surface of linear extrusion.
769 GeomAdaptor_Curve aCurve;
770 Handle(Geom_Surface) aSurf = mySurface.Surface().Surface();
771 Handle(Geom_BSplineCurve) aBSplCurve;
773 aCurve.Load((*((Handle(Geom_SurfaceOfLinearExtrusion)*)&aSurf))->BasisCurve());
774 aBSplCurve = aCurve.BSpline();
775 aNbKnots = aBSplCurve->NbKnots();
776 aKnots = new TColStd_HArray1OfReal(1, aNbKnots);
777 aBSplCurve->Knots(aKnots->ChangeArray1());
780 // Compute number of knots inside theUMin and theUMax.
781 GetRealKnots(theUMin, theUMax, aKnots, theUKnots);
783 // No span decomposition.
784 theUKnots = new TColStd_HArray1OfReal(1, 2);
785 theUKnots->SetValue(1, theUMin);
786 theUKnots->SetValue(2, theUMax);
790 //=======================================================================
791 //function : GetTKnots
793 //=======================================================================
795 void BRepGProp_Face::GetTKnots
796 (const Standard_Real theTMin,
797 const Standard_Real theTMax,
798 Handle(TColStd_HArray1OfReal) &theTKnots) const
800 Standard_Boolean isBSpline = mySurface.GetType() == GeomAbs_BSplineSurface;
802 if (myIsUseSpan && isBSpline) {
803 // Using span decomposition for BSpline.
804 Handle(TColStd_HArray1OfReal) aSurfKnots;
805 Standard_Integer aNbKnots;
807 // Get V knots of BSpline surface.
808 Handle(Geom_Surface) aSurf = mySurface.Surface().Surface();
809 Handle(Geom_BSplineSurface) aBSplSurf;
811 aBSplSurf = Handle(Geom_BSplineSurface)::DownCast(aSurf);
812 aNbKnots = aBSplSurf->NbVKnots();
813 aSurfKnots = new TColStd_HArray1OfReal(1, aNbKnots);
814 aBSplSurf->VKnots(aSurfKnots->ChangeArray1());
816 // Handle(TColStd_HArray1OfReal) aCurveKnots;
818 // GetCurveKnots(theTMin, theTMax, myCurve, aCurveKnots);
819 // GetRealCurveKnots(aCurveKnots, aSurfKnots, myCurve, theTKnots);
820 GetCurveKnots(theTMin, theTMax, myCurve, theTKnots);
822 theTKnots = new TColStd_HArray1OfReal(1, 2);
823 theTKnots->SetValue(1, theTMin);
824 theTKnots->SetValue(2, theTMax);