1 -- Created on: 1993-03-09
3 -- Copyright (c) 1993-1999 Matra Datavision
4 -- Copyright (c) 1999-2014 OPEN CASCADE SAS
6 -- This file is part of Open CASCADE Technology software library.
8 -- This library is free software; you can redistribute it and/or modify it under
9 -- the terms of the GNU Lesser General Public License version 2.1 as published
10 -- by the Free Software Foundation, with special exception defined in the file
11 -- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 -- distribution for complete text of the license and disclaimer of any warranty.
14 -- Alternatively, this file may be used under the terms of Open CASCADE
15 -- commercial license or contractual agreement.
17 class BSplineSurface from Geom inherits BoundedSurface from Geom
19 ---Purpose : Describes a BSpline surface.
20 -- In each parametric direction, a BSpline surface can be:
21 -- - uniform or non-uniform,
22 -- - rational or non-rational,
23 -- - periodic or non-periodic.
24 -- A BSpline surface is defined by:
25 -- - its degrees, in the u and v parametric directions,
26 -- - its periodic characteristic, in the u and v parametric directions,
27 -- - a table of poles, also called control points (together
28 -- with the associated weights if the surface is rational), and
29 -- - a table of knots, together with the associated multiplicities.
30 -- The degree of a Geom_BSplineSurface is limited to
31 -- a value (25) which is defined and controlled by the
32 -- system. This value is returned by the function MaxDegree.
34 -- Poles and Weights are manipulated using two associative double arrays:
35 -- - the poles table, which is a double array of gp_Pnt points, and
36 -- - the weights table, which is a double array of reals.
37 -- The bounds of the poles and weights arrays are:
38 -- - 1 and NbUPoles for the row bounds (provided
39 -- that the BSpline surface is not periodic in the u
40 -- parametric direction), where NbUPoles is the
41 -- number of poles of the surface in the u parametric direction, and
42 -- - 1 and NbVPoles for the column bounds (provided
43 -- that the BSpline surface is not periodic in the v
44 -- parametric direction), where NbVPoles is the
45 -- number of poles of the surface in the v parametric direction.
46 -- The poles of the surface are the points used to shape
47 -- and reshape the surface. They comprise a rectangular network.
48 -- If the surface is not periodic:
49 -- - The points (1, 1), (NbUPoles, 1), (1,
50 -- NbVPoles), and (NbUPoles, NbVPoles)
51 -- are the four parametric "corners" of the surface.
52 -- - The first column of poles and the last column of
53 -- poles define two BSpline curves which delimit the
54 -- surface in the v parametric direction. These are the
55 -- v isoparametric curves corresponding to the two
56 -- bounds of the v parameter.
57 -- - The first row of poles and the last row of poles
58 -- define two BSpline curves which delimit the surface
59 -- in the u parametric direction. These are the u
60 -- isoparametric curves corresponding to the two bounds of the u parameter.
61 -- If the surface is periodic, these geometric properties are not verified.
62 -- It is more difficult to define a geometrical significance
63 -- for the weights. However they are useful for
64 -- representing a quadric surface precisely. Moreover, if
65 -- the weights of all the poles are equal, the surface has
66 -- a polynomial equation, and hence is a "non-rational surface".
67 -- The non-rational surface is a special, but frequently
68 -- used, case, where all poles have identical weights.
69 -- The weights are defined and used only in the case of
70 -- a rational surface. The rational characteristic is
71 -- defined in each parametric direction. A surface can be
72 -- rational in the u parametric direction, and
73 -- non-rational in the v parametric direction.
74 -- Knots and Multiplicities
75 -- For a Geom_BSplineSurface the table of knots is
76 -- made up of two increasing sequences of reals, without
77 -- repetition, one for each parametric direction. The
78 -- multiplicities define the repetition of the knots.
79 -- A BSpline surface comprises multiple contiguous
80 -- patches, which are themselves polynomial or rational
81 -- surfaces. The knots are the parameters of the
82 -- isoparametric curves which limit these contiguous
83 -- patches. The multiplicity of a knot on a BSpline
84 -- surface (in a given parametric direction) is related to
85 -- the degree of continuity of the surface at that knot in
86 -- that parametric direction:
87 -- Degree of continuity at knot(i) = Degree - Multi(i) where:
88 -- - Degree is the degree of the BSpline surface in
89 -- the given parametric direction, and
90 -- - Multi(i) is the multiplicity of knot number i in
91 -- the given parametric direction.
92 -- There are some special cases, where the knots are
93 -- regularly spaced in one parametric direction (i.e. the
94 -- difference between two consecutive knots is a constant).
95 -- - "Uniform": all the multiplicities are equal to 1.
96 -- - "Quasi-uniform": all the multiplicities are equal to 1,
97 -- except for the first and last knots in this parametric
98 -- direction, and these are equal to Degree + 1.
99 -- - "Piecewise Bezier": all the multiplicities are equal to
100 -- Degree except for the first and last knots, which
101 -- are equal to Degree + 1. This surface is a
102 -- concatenation of Bezier patches in the given
103 -- parametric direction.
104 -- If the BSpline surface is not periodic in a given
105 -- parametric direction, the bounds of the knots and
106 -- multiplicities tables are 1 and NbKnots, where
107 -- NbKnots is the number of knots of the BSpline
108 -- surface in that parametric direction.
109 -- If the BSpline surface is periodic in a given parametric
110 -- direction, and there are k periodic knots and p
111 -- periodic poles in that parametric direction:
112 -- - the period is such that:
113 -- period = Knot(k+1) - Knot(1), and
114 -- - the poles and knots tables in that parametric
115 -- direction can be considered as infinite tables, such that:
116 -- Knot(i+k) = Knot(i) + period, and
117 -- Pole(i+p) = Pole(i)
118 -- Note: The data structure tables for a periodic BSpline
119 -- surface are more complex than those of a non-periodic one.
121 -- . A survey of curve and surface methods in CADG Wolfgang BOHM
123 -- . On de Boor-like algorithms and blossoming Wolfgang BOEHM
125 -- . Blossoming and knot insertion algorithms for B-spline curves
127 -- . Modelisation des surfaces en CAO, Henri GIAUME Peugeot SA
128 -- . Curves and Surfaces for Computer Aided Geometric Design,
129 -- a practical guide Gerald Farin
133 uses Array1OfInteger from TColStd,
134 Array1OfReal from TColStd,
135 Array2OfReal from TColStd,
136 HArray1OfInteger from TColStd,
137 HArray1OfReal from TColStd,
138 HArray2OfReal from TColStd,
139 Array1OfPnt from TColgp,
140 Array2OfPnt from TColgp,
143 HArray2OfPnt from TColgp,
147 BSplKnotDistribution from GeomAbs,
152 raises ConstructionError from Standard,
153 DimensionError from Standard,
154 DomainError from Standard,
155 OutOfRange from Standard,
156 NoSuchObject from Standard,
157 RangeError from Standard,
158 UndefinedDerivative from Geom
166 Create (Poles : Array2OfPnt from TColgp;
167 UKnots, VKnots : Array1OfReal from TColStd;
168 UMults, VMults : Array1OfInteger from TColStd;
169 UDegree, VDegree : Integer;
170 UPeriodic : Boolean = Standard_False;
171 VPeriodic : Boolean = Standard_False)
172 returns BSplineSurface
174 ---Purpose : Creates a non-rational b-spline surface (weights
175 -- default value is 1.).
176 raises ConstructionError;
177 ---Purpose: The following conditions must be verified.
178 -- 0 < UDegree <= MaxDegree.
179 -- UKnots.Length() == UMults.Length() >= 2
180 -- UKnots(i) < UKnots(i+1) (Knots are increasing)
181 -- 1 <= UMults(i) <= UDegree
182 -- On a non uperiodic surface the first and last
183 -- umultiplicities may be UDegree+1 (this is even
184 -- recommanded if you want the curve to start and finish on
185 -- the first and last pole).
186 -- On a uperiodic surface the first and the last
187 -- umultiplicities must be the same.
188 -- on non-uperiodic surfaces
189 -- Poles.ColLength() == Sum(UMults(i)) - UDegree - 1 >= 2
190 -- on uperiodic surfaces
191 -- Poles.ColLength() == Sum(UMults(i)) except the first or last
192 -- The previous conditions for U holds also for V, with the
193 -- RowLength of the poles.
198 Create (Poles : Array2OfPnt from TColgp;
199 Weights : Array2OfReal from TColStd;
200 UKnots, VKnots : Array1OfReal from TColStd;
201 UMults, VMults : Array1OfInteger from TColStd;
202 UDegree, VDegree : Integer;
203 UPeriodic : Boolean = Standard_False;
204 VPeriodic : Boolean = Standard_False)
205 returns BSplineSurface
207 ---Purpose : Creates a non-rational b-spline surface (weights
208 -- default value is 1.).
210 raises ConstructionError;
211 ---Purpose: The following conditions must be verified.
212 -- 0 < UDegree <= MaxDegree.
214 -- UKnots.Length() == UMults.Length() >= 2
216 -- UKnots(i) < UKnots(i+1) (Knots are increasing)
217 -- 1 <= UMults(i) <= UDegree
219 -- On a non uperiodic surface the first and last
220 -- umultiplicities may be UDegree+1 (this is even
221 -- recommanded if you want the curve to start and finish on
222 -- the first and last pole).
224 -- On a uperiodic surface the first and the last
225 -- umultiplicities must be the same.
227 -- on non-uperiodic surfaces
229 -- Poles.ColLength() == Sum(UMults(i)) - UDegree - 1 >= 2
231 -- on uperiodic surfaces
233 -- Poles.ColLength() == Sum(UMults(i)) except the first or
237 -- The previous conditions for U holds also for V, with the
238 -- RowLength of the poles.
242 ExchangeUV (me : mutable);
243 ---Purpose: Exchanges the u and v parametric directions on
244 -- this BSpline surface.
246 -- - the poles and weights tables are transposed,
247 -- - the knots and multiplicities tables are exchanged,
248 -- - degrees of continuity, and rational, periodic and
249 -- uniform characteristics are exchanged, and
250 -- - the orientation of the surface is inverted.
252 SetUPeriodic (me : mutable);
253 ---Purpose: Sets the surface U periodic.
255 SetVPeriodic (me : mutable);
256 ---Purpose: Modifies this surface to be periodic in the u (or v)
257 -- parametric direction.
258 -- To become periodic in a given parametric direction a
259 -- surface must be closed in that parametric direction,
260 -- and the knot sequence relative to that direction must be periodic.
261 -- To generate this periodic sequence of knots, the
262 -- functions FirstUKnotIndex and LastUKnotIndex (or
263 -- FirstVKnotIndex and LastVKnotIndex) are used to
264 -- compute I1 and I2. These are the indexes, in the
265 -- knot array associated with the given parametric
266 -- direction, of the knots that correspond to the first and
267 -- last parameters of this BSpline surface in the given
268 -- parametric direction. Hence the period is:
269 -- Knots(I1) - Knots(I2)
270 -- As a result, the knots and poles tables are modified.
272 -- Standard_ConstructionError if the surface is not
273 -- closed in the given parametric direction.
278 PeriodicNormalization(me ; U,V : in out Real) ;
280 ---Purpose : returns the parameter normalized within
281 -- the period if the surface is periodic : otherwise
282 -- does not do anything
284 SetUOrigin (me : mutable; Index : Integer)
285 ---Purpose: Assigns the knot of index Index in the knots table in
286 -- the corresponding parametric direction to be the
287 -- origin of this periodic BSpline surface. As a
288 -- consequence, the knots and poles tables are modified.
290 -- Standard_NoSuchObject if this BSpline surface is
291 -- not periodic in the given parametric direction.
292 -- Standard_DomainError if Index is outside the
293 -- bounds of the knots table in the given parametric direction.
297 SetVOrigin (me : mutable; Index : Integer)
298 ---Purpose: Assigns the knot of index Index in the knots table in
299 -- the corresponding parametric direction to be the
300 -- origin of this periodic BSpline surface. As a
301 -- consequence, the knots and poles tables are modified.
303 -- Standard_NoSuchObject if this BSpline surface is
304 -- not periodic in the given parametric direction.
305 -- Standard_DomainError if Index is outside the
306 -- bounds of the knots table in the given parametric direction.
311 SetUNotPeriodic (me : mutable);
313 SetVNotPeriodic (me : mutable);
314 ---Purpose: Modifies this surface to be periodic in the u (or v) parametric direction.
315 -- To become periodic in a given parametric direction a
316 -- surface must be closed in that parametric direction,
317 -- and the knot sequence relative to that direction must be periodic.
318 -- To generate this periodic sequence of knots, the
319 -- functions FirstUKnotIndex and LastUKnotIndex (or
320 -- FirstVKnotIndex and LastVKnotIndex) are used to
321 -- compute I1 and I2. These are the indexes, in the
322 -- knot array associated with the given parametric
323 -- direction, of the knots that correspond to the first and
324 -- last parameters of this BSpline surface in the given
325 -- parametric direction. Hence the period is:
326 -- Knots(I1) - Knots(I2)
327 -- As a result, the knots and poles tables are modified.
329 -- Standard_ConstructionError if the surface is not
330 -- closed in the given parametric direction.
332 UReverse (me : mutable);
334 VReverse (me : mutable);
335 ---Purpose: Changes the orientation of this BSpline surface in the
336 -- u (or v) parametric direction. The bounds of the
337 -- surface are not changed but the given parametric
338 -- direction is reversed. Hence the orientation of the
339 -- surface is reversed.
340 -- The knots and poles tables are modified.
342 UReversedParameter (me; U : Real) returns Real;
344 VReversedParameter (me; V : Real) returns Real;
345 ---Purpose: Computes the u (or v) parameter on the modified
346 -- surface, produced by reversing its u (or v) parametric
347 -- direction, for the point of u parameter U, (or of v
348 -- parameter V) on this BSpline surface.
349 -- For a BSpline surface, these functions return respectively:
350 -- - UFirst + ULast - U, or
351 -- - VFirst + VLast - V,
352 -- where UFirst, ULast, VFirst and VLast are
353 -- the values of the first and last parameters of this
354 -- BSpline surface, in the u and v parametric directions.
357 IncreaseDegree (me : mutable; UDegree, VDegree : Integer);
358 ---Purpose : Increases the degrees of this BSpline surface to
359 -- UDegree and VDegree in the u and v parametric
360 -- directions respectively. As a result, the tables of poles,
361 -- weights and multiplicities are modified. The tables of
362 -- knots is not changed.
363 -- Note: Nothing is done if the given degree is less than
364 -- or equal to the current degree in the corresponding
365 -- parametric direction.
367 -- Standard_ConstructionError if UDegree or
368 -- VDegree is greater than
369 -- Geom_BSplineSurface::MaxDegree().
372 InsertUKnots (me : mutable; Knots : Array1OfReal from TColStd;
373 Mults : Array1OfInteger from TColStd;
374 ParametricTolerance : Real = 0.0;
375 Add : Boolean = Standard_True);
377 InsertVKnots (me : mutable; Knots : Array1OfReal from TColStd;
378 Mults : Array1OfInteger from TColStd;
379 ParametricTolerance : Real = 0.0;
380 Add : Boolean = Standard_True);
382 ---Purpose: Inserts into the knots table for the corresponding
383 -- parametric direction of this BSpline surface:
384 -- - the value U, or V, with the multiplicity M (defaulted to 1), or
385 -- - the values of the array Knots, with their respective
386 -- multiplicities, Mults.
387 -- If the knot value to insert already exists in the table, its multiplicity is:
388 -- - increased by M, if Add is true (the default), or
389 -- - increased to M, if Add is false.
390 -- The tolerance criterion used to check the equality of
391 -- the knots is the larger of the values ParametricTolerance and
392 -- Standard_Real::Epsilon(val), where val is the knot value to be inserted.
394 -- - If a given multiplicity coefficient is null, or negative, nothing is done.
395 -- - The new multiplicity of a knot is limited to the degree of this BSpline surface in the
396 -- corresponding parametric direction.
398 -- Standard_ConstructionError if a knot value to
399 -- insert is outside the bounds of this BSpline surface in
400 -- the specified parametric direction. The comparison
401 -- uses the precision criterion ParametricTolerance.
404 RemoveUKnot(me : mutable; Index : Integer;
406 Tolerance : Real) returns Boolean
409 RemoveVKnot(me : mutable; Index : Integer;
411 Tolerance : Real) returns Boolean
414 ---Purpose : Reduces to M the multiplicity of the knot of index
415 -- Index in the given parametric direction. If M is 0, the knot is removed.
416 -- With a modification of this type, the table of poles is also modified.
417 -- Two different algorithms are used systematically to
418 -- compute the new poles of the surface. For each
419 -- pole, the distance between the pole calculated
420 -- using the first algorithm and the same pole
421 -- calculated using the second algorithm, is checked. If
422 -- this distance is less than Tolerance it ensures that
423 -- the surface is not modified by more than Tolerance.
424 -- Under these conditions, the function returns true;
425 -- otherwise, it returns false.
426 -- A low tolerance prevents modification of the
427 -- surface. A high tolerance "smoothes" the surface.
429 -- Standard_OutOfRange if Index is outside the
430 -- bounds of the knots table of this BSpline surface.
433 IncreaseUMultiplicity (me : mutable; UIndex : Integer; M : Integer)
435 -- Increases the multiplicity of the knot of range UIndex
436 -- in the UKnots sequence.
437 -- M is the new multiplicity. M must be greater than the
438 -- previous multiplicity and lower or equal to the degree
439 -- of the surface in the U parametric direction.
440 raises ConstructionError,
441 ---Purpose : Raised if M is not in the range [1, UDegree]
444 -- Raised if UIndex is not in the range [FirstUKnotIndex,
445 -- LastUKnotIndex] given by the methods with the same name.
448 IncreaseUMultiplicity (me : mutable; FromI1, ToI2 : Integer; M : Integer)
450 -- Increases until order M the multiplicity of the set of knots
451 -- FromI1,...., ToI2 in the U direction. This method can be used
452 -- to make a B_spline surface into a PiecewiseBezier B_spline
454 -- If <me> was uniform, it can become non uniform.
457 -- Raised if FromI1 or ToI2 is out of the range [FirstUKnotIndex,
461 -- M should be greater than the previous multiplicity of the
462 -- all the knots FromI1,..., ToI2 and lower or equal to the
463 -- Degree of the surface in the U parametric direction.
466 IncrementUMultiplicity (me : mutable; FromI1, ToI2 : Integer; Step : Integer)
468 -- Increments the multiplicity of the consecutives uknots FromI1..ToI2
469 -- by step. The multiplicity of each knot FromI1,.....,ToI2 must be
470 -- lower or equal to the UDegree of the B_spline.
473 -- Raised if FromI1 or ToI2 is not in the range
474 -- [FirstUKnotIndex, LastUKnotIndex]
477 -- Raised if one knot has a multiplicity greater than UDegree.
480 IncreaseVMultiplicity (me : mutable; VIndex : Integer; M : Integer)
482 -- Increases the multiplicity of a knot in the V direction.
483 -- M is the new multiplicity.
484 raises ConstructionError,
486 -- M should be greater than the previous multiplicity and lower
487 -- than the degree of the surface in the V parametric direction.
490 -- Raised if VIndex is not in the range [FirstVKnotIndex,
491 -- LastVKnotIndex] given by the methods with the same name.
494 IncreaseVMultiplicity (me : mutable; FromI1, ToI2 : Integer; M : Integer)
496 -- Increases until order M the multiplicity of the set of knots
497 -- FromI1,...., ToI2 in the V direction. This method can be used to
498 -- make a BSplineSurface into a PiecewiseBezier B_spline
499 -- surface. If <me> was uniform, it can become non-uniform.
502 -- Raised if FromI1 or ToI2 is out of the range [FirstVKnotIndex,
503 -- LastVKnotIndex] given by the methods with the same name.
506 -- M should be greater than the previous multiplicity of the
507 -- all the knots FromI1,..., ToI2 and lower or equal to the
508 -- Degree of the surface in the V parametric direction.
511 IncrementVMultiplicity (me : mutable; FromI1, ToI2 : Integer; Step : Integer)
513 -- Increments the multiplicity of the consecutives vknots FromI1..ToI2
514 -- by step. The multiplicity of each knot FromI1,.....,ToI2 must be
515 -- lower or equal to the VDegree of the B_spline.
518 -- Raised if FromI1 or ToI2 is not in the range
519 -- [FirstVKnotIndex, LastVKnotIndex]
522 -- Raised if one knot has a multiplicity greater than VDegree.
525 InsertUKnot (me : mutable; U : Real; M : Integer; ParametricTolerance : Real;
526 Add : Boolean = Standard_True)
528 -- Inserts a knot value in the sequence of UKnots. If U is a knot
529 -- value this method increases the multiplicity of the knot if the
530 -- previous multiplicity was lower than M else it does nothing. The
531 -- tolerance criterion is ParametricTolerance. ParametricTolerance
532 -- should be greater or equal than Resolution from package gp.
533 raises ConstructionError;
535 -- Raised if U is out of the bounds [U1, U2] given by the methods
536 -- Bounds, the criterion ParametricTolerance is used.
537 -- Raised if M is not in the range [1, UDegree].
540 InsertVKnot (me : mutable; V : Real; M : Integer; ParametricTolerance : Real;
541 Add : Boolean = Standard_True)
543 -- Inserts a knot value in the sequence of VKnots. If V is a knot
544 -- value this method increases the multiplicity of the knot if the
545 -- previous multiplicity was lower than M otherwise it does nothing.
546 -- The tolerance criterion is ParametricTolerance.
547 -- ParametricTolerance should be greater or equal than Resolution
549 raises ConstructionError;
551 -- raises if V is out of the Bounds [V1, V2] given by the methods
552 -- Bounds, the criterion ParametricTolerance is used.
553 -- raises if M is not in the range [1, VDegree].
556 Segment (me : mutable; U1, U2, V1, V2 : Real)
558 -- Segments the surface between U1 and U2 in the U-Direction.
559 -- between V1 and V2 in the V-Direction.
560 -- The control points are modified, the first and the last point
563 -- Even if <me> is not closed it can become closed after the
564 -- segmentation for example if U1 or U2 are out of the bounds
565 -- of the surface <me> or if the surface makes loop.
566 raises DomainError from Standard;
567 ---Purpose: raises if U2 < U1 or V2 < V1
570 CheckAndSegment (me : mutable; U1, U2, V1, V2 : Real)
572 -- Segments the surface between U1 and U2 in the U-Direction.
573 -- between V1 and V2 in the V-Direction.
575 -- same as Segment but do nothing if U1 and U2 (resp. V1 and V2) are
576 -- equal to the bounds in U (resp. in V) of <me>.
577 -- For example, if <me> is periodic in V, it will be always periodic
578 -- in V after the segmentation if the bounds in V are unchanged
581 -- Even if <me> is not closed it can become closed after the
582 -- segmentation for example if U1 or U2 are out of the bounds
583 -- of the surface <me> or if the surface makes loop.
584 raises DomainError from Standard;
585 ---Purpose: raises if U2 < U1 or V2 < V1
588 SetUKnot (me : mutable; UIndex : Integer; K : Real)
589 ---Purpose : Substitutes the UKnots of range UIndex with K.
592 -- Raised if UIndex < 1 or UIndex > NbUKnots
595 -- Raised if K >= UKnots(UIndex+1) or K <= UKnots(UIndex-1)
598 SetUKnots (me : mutable; UK : Array1OfReal from TColStd)
599 ---Purpose : Changes all the U-knots of the surface.
600 -- The multiplicity of the knots are not modified.
601 raises ConstructionError,
603 -- Raised if there is an index such that UK (Index+1) <= UK (Index).
606 -- Raised if UK.Lower() < 1 or UK.Upper() > NbUKnots
609 SetUKnot (me : mutable; UIndex : Integer; K : Real; M : Integer)
611 -- Changes the value of the UKnots of range UIndex and
612 -- increases its multiplicity.
615 -- Raised if UIndex is not in the range [FirstUKnotIndex,
616 -- LastUKnotIndex] given by the methods with the same name.
619 -- Raised if K >= UKnots(UIndex+1) or K <= UKnots(UIndex-1)
620 -- M must be lower than UDegree and greater than the previous
621 -- multiplicity of the knot of range UIndex.
624 SetVKnot (me : mutable; VIndex : Integer; K : Real)
625 ---Purpose : Substitutes the VKnots of range VIndex with K.
628 -- Raised if VIndex < 1 or VIndex > NbVKnots
631 -- Raised if K >= VKnots(VIndex+1) or K <= VKnots(VIndex-1)
634 SetVKnots (me : mutable; VK : Array1OfReal from TColStd)
635 ---Purpose : Changes all the V-knots of the surface.
636 -- The multiplicity of the knots are not modified.
637 raises ConstructionError,
639 -- Raised if there is an index such that VK (Index+1) <= VK (Index).
642 -- Raised if VK.Lower() < 1 or VK.Upper() > NbVKnots
646 SetVKnot (me : mutable; VIndex : Integer; K : Real; M : Integer)
648 -- Changes the value of the VKnots of range VIndex and increases
652 -- Raised if VIndex is not in the range [FirstVKnotIndex,
653 -- LastVKnotIndex] given by the methods with the same name.
656 -- Raised if K >= VKnots(VIndex+1) or K <= VKnots(VIndex-1)
657 -- M must be lower than VDegree and greater than the previous
658 -- multiplicity of the knot of range VIndex.
663 ParametricTolerance : Real;
664 I1, I2 : in out Integer;
665 WithKnotRepetition : Boolean = Standard_False);
667 -- Locates the parametric value U in the sequence of UKnots.
668 -- If "WithKnotRepetition" is True we consider the knot's
669 -- representation with repetition of multiple knot value,
670 -- otherwise we consider the knot's representation with
671 -- no repetition of multiple knot values.
672 -- UKnots (I1) <= U <= UKnots (I2)
673 -- . if I1 = I2 U is a knot value (the tolerance criterion
674 -- ParametricTolerance is used).
675 -- . if I1 < 1 => U < UKnots(1) - Abs(ParametricTolerance)
676 -- . if I2 > NbUKnots => U > UKnots(NbUKnots)+Abs(ParametricTolerance)
681 ParametricTolerance : Real;
682 I1, I2 : in out Integer;
683 WithKnotRepetition : Boolean = Standard_False);
685 -- Locates the parametric value U in the sequence of knots.
686 -- If "WithKnotRepetition" is True we consider the knot's
687 -- representation with repetition of multiple knot value,
688 -- otherwise we consider the knot's representation with
689 -- no repetition of multiple knot values.
690 -- VKnots (I1) <= V <= VKnots (I2)
691 -- . if I1 = I2 V is a knot value (the tolerance criterion
692 -- ParametricTolerance is used).
693 -- . if I1 < 1 => V < VKnots(1) - Abs(ParametricTolerance)
694 -- . if I2 > NbVKnots => V > VKnots(NbVKnots)+Abs(ParametricTolerance)
702 ---Purpose : poles insertion and removing
703 -- The following methods are available only if the surface
704 -- is Uniform or QuasiUniform in the considered direction
705 -- The knot repartition is modified.
710 ----Purpose : poles and weights modifications
712 SetPole (me : mutable; UIndex, VIndex : Integer; P : Pnt)
714 -- Substitutes the pole of range (UIndex, VIndex) with P.
715 -- If the surface is rational the weight of range (UIndex, VIndex)
719 -- Raised if UIndex < 1 or UIndex > NbUPoles or VIndex < 1 or
720 -- VIndex > NbVPoles.
723 SetPole (me : mutable; UIndex, VIndex : Integer; P : Pnt; Weight : Real)
725 -- Substitutes the pole and the weight of range (UIndex, VIndex)
729 -- Raised if UIndex < 1 or UIndex > NbUPoles or VIndex < 1 or
730 -- VIndex > NbVPoles.
732 ---Purpose : Raised if Weight <= Resolution from package gp.
735 SetPoleCol (me : mutable; VIndex : Integer; CPoles : Array1OfPnt from TColgp)
737 -- Changes a column of poles or a part of this column.
739 ---Purpose : Raised if Vindex < 1 or VIndex > NbVPoles.
742 -- Raised if CPoles.Lower() < 1 or CPoles.Upper() > NbUPoles.
745 SetPoleCol (me : mutable; VIndex : Integer; CPoles : Array1OfPnt from TColgp;
746 CPoleWeights : Array1OfReal from TColStd)
748 -- Changes a column of poles or a part of this column with the
749 -- corresponding weights. If the surface was rational it can
750 -- become non rational. If the surface was non rational it can
753 ---Purpose : Raised if Vindex < 1 or VIndex > NbVPoles.
756 -- Raised if CPoles.Lower() < 1 or CPoles.Upper() > NbUPoles
757 -- Raised if the bounds of CPoleWeights are not the same as the
759 -- Raised if one of the weight value of CPoleWeights is lower or
760 -- equal to Resolution from package gp.
763 SetPoleRow (me : mutable; UIndex : Integer; CPoles : Array1OfPnt from TColgp;
764 CPoleWeights : Array1OfReal from TColStd)
766 -- Changes a row of poles or a part of this row with the
767 -- corresponding weights. If the surface was rational it can
768 -- become non rational. If the surface was non rational it can
771 ---Purpose : Raised if Uindex < 1 or UIndex > NbUPoles.
774 -- Raised if CPoles.Lower() < 1 or CPoles.Upper() > NbVPoles
775 -- raises if the bounds of CPoleWeights are not the same as the
777 -- Raised if one of the weight value of CPoleWeights is lower or
778 -- equal to Resolution from package gp.
781 SetPoleRow (me : mutable; UIndex : Integer; CPoles : Array1OfPnt from TColgp)
783 -- Changes a row of poles or a part of this row.
785 ---Purpose : Raised if Uindex < 1 or UIndex > NbUPoles.
788 -- Raised if CPoles.Lower() < 1 or CPoles.Upper() > NbVPoles.
791 SetWeight (me : mutable; UIndex, VIndex : Integer; Weight : Real)
793 -- Changes the weight of the pole of range UIndex, VIndex.
794 -- If the surface was non rational it can become rational.
795 -- If the surface was rational it can become non rational.
798 -- Raised if UIndex < 1 or UIndex > NbUPoles or VIndex < 1 or
802 -- Raised if weight is lower or equal to Resolution from
806 SetWeightCol (me : mutable; VIndex : Integer;
807 CPoleWeights : Array1OfReal from TColStd)
809 -- Changes a column of weights of a part of this column.
812 -- Raised if VIndex < 1 or VIndex > NbVPoles
815 -- Raised if CPoleWeights.Lower() < 1 or
816 -- CPoleWeights.Upper() > NbUPoles.
817 -- Raised if a weight value is lower or equal to Resolution
821 SetWeightRow (me : mutable; UIndex : Integer;
822 CPoleWeights : Array1OfReal from TColStd)
824 -- Changes a row of weights or a part of this row.
827 -- Raised if UIndex < 1 or UIndex > NbUPoles
830 -- Raised if CPoleWeights.Lower() < 1 or
831 -- CPoleWeights.Upper() > NbVPoles.
832 -- Raised if a weight value is lower or equal to Resolution
835 MovePoint(me: mutable; U, V : Real; P: Pnt;
836 UIndex1, UIndex2, VIndex1, VIndex2: Integer;
837 UFirstIndex, ULastIndex, VFirstIndex, VLastIndex: out Integer)
838 ---Purpose: Move a point with parameter U and V to P.
839 -- given u,v as parameters) to reach a new position
840 -- UIndex1, UIndex2, VIndex1, VIndex2:
841 -- indicates the poles which can be moved
842 -- if Problem in BSplineBasis calculation, no change
844 -- UFirstIndex, VLastIndex = 0
845 -- VFirstIndex, VLastIndex = 0
848 -- Raised if UIndex1 < UIndex2 or VIndex1 < VIndex2 or
849 -- UIndex1 < 1 || UIndex1 > NbUPoles or
850 -- UIndex2 < 1 || UIndex2 > NbUPoles
851 -- VIndex1 < 1 || VIndex1 > NbVPoles or
852 -- VIndex2 < 1 || VIndex2 > NbVPoles
856 ---Purpose : characteristics of the surface
858 IsUClosed (me) returns Boolean;
860 -- Returns true if the first control points row and the last
861 -- control points row are identical. The tolerance criterion
862 -- is Resolution from package gp.
864 IsVClosed (me) returns Boolean;
866 -- Returns true if the first control points column and the
867 -- last last control points column are identical.
868 -- The tolerance criterion is Resolution from package gp.
871 IsCNu (me; N : Integer) returns Boolean
873 -- Returns True if the order of continuity of the surface in the
876 ---Purpose : Raised if N < 0.
879 IsCNv (me; N : Integer) returns Boolean
881 -- Returns True if the order of continuity of the surface
882 -- in the V direction is N.
884 ---Purpose : Raised if N < 0.
887 IsUPeriodic (me) returns Boolean;
889 -- Returns True if the surface is closed in the U direction
890 -- and if the B-spline has been turned into a periodic surface
891 -- using the function SetUPeriodic.
894 IsURational (me) returns Boolean;
896 -- Returns False if for each row of weights all the weights
898 -- The tolerance criterion is resolution from package gp.
901 -- if Weights = |0.5, 0.5, 0.5| returns False
905 IsVPeriodic (me) returns Boolean;
907 -- Returns True if the surface is closed in the V direction
908 -- and if the B-spline has been turned into a periodic
909 -- surface using the function SetVPeriodic.
912 IsVRational (me) returns Boolean;
914 -- Returns False if for each column of weights all the weights
916 -- The tolerance criterion is resolution from package gp.
919 -- if Weights = |1.0, 2.0, 0.5| returns False
922 Bounds (me; U1, U2, V1, V2 : out Real);
924 -- Returns the parametric bounds of the surface.
926 -- These parametric values are the bounds of the array of
927 -- knots UKnots and VKnots only if the first knots and the
928 -- last knots have a multiplicity equal to UDegree + 1 or
932 Continuity (me) returns Shape from GeomAbs;
934 -- Returns the continuity of the surface :
935 -- C0 : only geometric continuity,
936 -- C1 : continuity of the first derivative all along the Surface,
937 -- C2 : continuity of the second derivative all along the Surface,
938 -- C3 : continuity of the third derivative all along the Surface,
939 -- CN : the order of continuity is infinite.
940 -- A B-spline surface is infinitely continuously differentiable
941 -- for the couple of parameters U, V such thats U != UKnots(i)
942 -- and V != VKnots(i). The continuity of the surface at a knot
943 -- value depends on the multiplicity of this knot.
945 -- If the surface is C1 in the V direction and C2 in the U
946 -- direction this function returns Shape = C1.
949 FirstUKnotIndex (me) returns Integer;
951 -- Computes the Index of the UKnots which gives the first
952 -- parametric value of the surface in the U direction.
953 -- The UIso curve corresponding to this value is a
954 -- boundary curve of the surface.
957 FirstVKnotIndex (me) returns Integer;
959 -- Computes the Index of the VKnots which gives the
960 -- first parametric value of the surface in the V direction.
961 -- The VIso curve corresponding to this knot is a boundary
962 -- curve of the surface.
965 LastUKnotIndex (me) returns Integer;
967 -- Computes the Index of the UKnots which gives the
968 -- last parametric value of the surface in the U direction.
969 -- The UIso curve corresponding to this knot is a boundary
970 -- curve of the surface.
973 LastVKnotIndex (me) returns Integer;
975 -- Computes the Index of the VKnots which gives the
976 -- last parametric value of the surface in the V direction.
977 -- The VIso curve corresponding to this knot is a
978 -- boundary curve of the surface.
981 NbUKnots (me) returns Integer;
982 ---Purpose : Returns the number of knots in the U direction.
984 NbUPoles (me) returns Integer;
985 ---Purpose : Returns number of poles in the U direction.
987 NbVKnots (me) returns Integer;
988 ---Purpose : Returns the number of knots in the V direction.
990 NbVPoles (me) returns Integer;
991 ---Purpose : Returns the number of poles in the V direction.
994 Pole (me; UIndex, VIndex : Integer) returns Pnt
996 -- Returns the pole of range (UIndex, VIndex).
999 -- Raised if UIndex < 1 or UIndex > NbUPoles or VIndex < 1 or
1000 -- VIndex > NbVPoles.
1003 Poles (me; P : out Array2OfPnt from TColgp)
1004 ---Purpose : Returns the poles of the B-spline surface.
1005 raises DimensionError;
1007 -- Raised if the length of P in the U and V direction
1008 -- is not equal to NbUpoles and NbVPoles.
1010 returns Array2OfPnt from TColgp
1011 ---Purpose : Returns the poles of the B-spline surface.
1012 ---C++ : return const &
1016 UDegree (me) returns Integer;
1018 -- Returns the degree of the normalized B-splines Ni,n in the U
1022 UKnot (me; UIndex : Integer) returns Real
1024 -- Returns the Knot value of range UIndex.
1026 ---Purpose : Raised if UIndex < 1 or UIndex > NbUKnots
1029 UKnotDistribution (me) returns BSplKnotDistribution from GeomAbs;
1031 -- Returns NonUniform or Uniform or QuasiUniform or
1032 -- PiecewiseBezier. If all the knots differ by a
1033 -- positive constant from the preceding knot in the U
1034 -- direction the B-spline surface can be :
1035 -- - Uniform if all the knots are of multiplicity 1,
1036 -- - QuasiUniform if all the knots are of multiplicity 1
1037 -- except for the first and last knot which are of
1038 -- multiplicity Degree + 1,
1039 -- - PiecewiseBezier if the first and last knots have
1040 -- multiplicity Degree + 1 and if interior knots have
1041 -- multiplicity Degree
1042 -- otherwise the surface is non uniform in the U direction
1043 -- The tolerance criterion is Resolution from package gp.
1046 UKnots (me; Ku : out Array1OfReal from TColStd)
1047 ---Purpose : Returns the knots in the U direction.
1048 raises DimensionError;
1050 -- Raised if the length of Ku is not equal to the number of knots
1051 -- in the U direction.
1053 returns Array1OfReal from TColStd
1054 ---Purpose : Returns the knots in the U direction.
1055 ---C++ : return const &
1059 UKnotSequence (me; Ku : out Array1OfReal from TColStd)
1060 ---Purpose : Returns the uknots sequence.
1061 -- In this sequence the knots with a multiplicity greater than 1
1064 -- Ku = {k1, k1, k1, k2, k3, k3, k4, k4, k4}
1065 raises DimensionError;
1067 -- Raised if the length of Ku is not equal to NbUPoles + UDegree + 1
1069 returns Array1OfReal from TColStd
1070 ---Purpose : Returns the uknots sequence.
1071 -- In this sequence the knots with a multiplicity greater than 1
1074 -- Ku = {k1, k1, k1, k2, k3, k3, k4, k4, k4}
1075 ---C++ : return const &
1079 UMultiplicity (me; UIndex : Integer) returns Integer
1081 -- Returns the multiplicity value of knot of range UIndex in
1084 ---Purpose : Raised if UIndex < 1 or UIndex > NbUKnots.
1087 UMultiplicities (me; Mu : out Array1OfInteger from TColStd)
1089 -- Returns the multiplicities of the knots in the U direction.
1090 raises DimensionError;
1092 -- Raised if the length of Mu is not equal to the number of
1093 -- knots in the U direction.
1094 UMultiplicities (me)
1095 returns Array1OfInteger from TColStd
1096 ---Purpose : Returns the multiplicities of the knots in the U direction.
1097 ---C++ : return const &
1101 VDegree (me) returns Integer;
1103 -- Returns the degree of the normalized B-splines Ni,d in the
1107 VKnot (me; VIndex : Integer) returns Real
1108 ---Purpose : Returns the Knot value of range VIndex.
1110 --- Purpse : Raised if VIndex < 1 or VIndex > NbVKnots
1113 VKnotDistribution (me) returns BSplKnotDistribution from GeomAbs;
1115 -- Returns NonUniform or Uniform or QuasiUniform or
1116 -- PiecewiseBezier. If all the knots differ by a positive
1117 -- constant from the preceding knot in the V direction the
1118 -- B-spline surface can be :
1119 -- - Uniform if all the knots are of multiplicity 1,
1120 -- - QuasiUniform if all the knots are of multiplicity 1
1121 -- except for the first and last knot which are of
1122 -- multiplicity Degree + 1,
1123 -- - PiecewiseBezier if the first and last knots have
1124 -- multiplicity Degree + 1 and if interior knots have
1125 -- multiplicity Degree
1126 -- otherwise the surface is non uniform in the V direction.
1127 -- The tolerance criterion is Resolution from package gp.
1130 VKnots (me; Kv : out Array1OfReal from TColStd)
1131 ---Purpose : Returns the knots in the V direction.
1132 raises DimensionError;
1134 -- Raised if the length of Kv is not equal to the number of
1135 -- knots in the V direction.
1137 returns Array1OfReal from TColStd
1138 ---Purpose : Returns the knots in the V direction.
1139 ---C++ : return const &
1143 VKnotSequence (me; Kv : out Array1OfReal from TColStd)
1144 ---Purpose : Returns the vknots sequence.
1145 -- In this sequence the knots with a multiplicity greater than 1
1148 -- Kv = {k1, k1, k1, k2, k3, k3, k4, k4, k4}
1149 raises DimensionError;
1151 -- Raised if the length of Kv is not equal to NbVPoles + VDegree + 1
1153 returns Array1OfReal from TColStd
1154 ---Purpose : Returns the vknots sequence.
1155 -- In this sequence the knots with a multiplicity greater than 1
1158 -- Ku = {k1, k1, k1, k2, k3, k3, k4, k4, k4}
1159 ---C++ : return const &
1163 VMultiplicity (me; VIndex : Integer) returns Integer
1165 -- Returns the multiplicity value of knot of range VIndex in
1168 ---Purpose : Raised if VIndex < 1 or VIndex > NbVKnots
1171 VMultiplicities (me; Mv : out Array1OfInteger from TColStd)
1173 -- Returns the multiplicities of the knots in the V direction.
1174 raises DimensionError;
1176 -- Raised if the length of Mv is not equal to the number of
1177 -- knots in the V direction.
1178 VMultiplicities (me)
1179 returns Array1OfInteger from TColStd
1180 ---Purpose : Returns the multiplicities of the knots in the V direction.
1181 ---C++ : return const &
1185 Weight (me; UIndex, VIndex : Integer) returns Real
1186 ---Purpose : Returns the weight value of range UIndex, VIndex.
1189 -- Raised if UIndex < 1 or UIndex > NbUPoles or VIndex < 1
1190 -- or VIndex > NbVPoles.
1193 Weights (me; W : out Array2OfReal from TColStd)
1194 ---Purpose : Returns the weights of the B-spline surface.
1195 raises DimensionError;
1197 -- Raised if the length of W in the U and V direction is
1198 -- not equal to NbUPoles and NbVPoles.
1200 returns Array2OfReal from TColStd
1201 ---Purpose : Returns the weights of the B-spline surface.
1202 ---C++ : return const &
1210 ---Purpose : value and derivatives computation
1212 D0 (me; U, V : Real; P : out Pnt);
1215 D1 (me; U, V : Real; P : out Pnt; D1U, D1V : out Vec)
1216 raises UndefinedDerivative;
1217 ---Purpose : Raised if the continuity of the surface is not C1.
1220 D2 (me; U, V : Real; P : out Pnt; D1U, D1V, D2U, D2V, D2UV : out Vec)
1221 raises UndefinedDerivative;
1222 ---Purpose : Raised if the continuity of the surface is not C2.
1225 D3 (me; U, V : Real; P : out Pnt; D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV,
1227 raises UndefinedDerivative;
1228 ---Purpose : Raised if the continuity of the surface is not C3.
1231 DN (me; U, V : Real; Nu, Nv : Integer) returns Vec
1233 -- Nu is the order of derivation in the U parametric direction and
1234 -- Nv is the order of derivation in the V parametric direction.
1235 raises UndefinedDerivative,
1237 -- Raised if the continuity of the surface is not CNu in the U
1238 -- direction and CNv in the V direction.
1241 -- Raised if Nu + Nv < 1 or Nu < 0 or Nv < 0.
1249 -- The following functions computes the point for the
1250 -- parametric values (U, V) and the derivatives at
1251 -- this point on the B-spline surface patch delimited
1252 -- with the knots FromUK1, FromVK1 and the knots ToUK2,
1253 -- ToVK2. (U, V) can be out of these parametric bounds
1254 -- but for the computation we only use the definition
1255 -- of the surface between these knots. This method is
1256 -- useful to compute local derivative, if the order of
1257 -- continuity of the whole surface is not greater enough.
1258 -- Inside the parametric knot's domain previously defined
1259 -- the evaluations are the same as if we consider the whole
1260 -- definition of the surface. Of course the evaluations are
1261 -- different outside this parametric domain.
1264 LocalD0 (me; U, V : Real; FromUK1, ToUK2, FromVK1, ToVK2 : Integer;
1267 ---Purpose : Raised if FromUK1 = ToUK2 or FromVK1 = ToVK2.
1270 -- Raised if FromUK1, ToUK2 are not in the range [FirstUKnotIndex,
1271 -- LastUKnotIndex] or if FromVK1, ToVK2 are not in the range
1272 -- [FirstVKnotIndex, LastVKnotIndex]
1275 LocalD1 (me; U, V : Real; FromUK1, ToUK2, FromVK1, ToVK2 : Integer;
1276 P : out Pnt; D1U, D1V : out Vec)
1277 raises UndefinedDerivative,
1279 -- Raised if the local continuity of the surface is not C1
1280 -- between the knots FromUK1, ToUK2 and FromVK1, ToVK2.
1282 ---Purpose : Raised if FromUK1 = ToUK2 or FromVK1 = ToVK2.
1285 -- Raised if FromUK1, ToUK2 are not in the range [FirstUKnotIndex,
1286 -- LastUKnotIndex] or if FromVK1, ToVK2 are not in the range
1287 -- [FirstVKnotIndex, LastVKnotIndex]
1290 LocalD2 (me; U, V : Real; FromUK1, ToUK2, FromVK1, ToVK2 : Integer;
1291 P : out Pnt; D1U, D1V, D2U, D2V, D2UV : out Vec)
1292 raises UndefinedDerivative,
1294 -- Raised if the local continuity of the surface is not C2
1295 -- between the knots FromUK1, ToUK2 and FromVK1, ToVK2.
1297 ---Purpose : Raised if FromUK1 = ToUK2 or FromVK1 = ToVK2.
1300 -- Raised if FromUK1, ToUK2 are not in the range [FirstUKnotIndex,
1301 -- LastUKnotIndex] or if FromVK1, ToVK2 are not in the range
1302 -- [FirstVKnotIndex, LastVKnotIndex]
1305 LocalD3 (me; U, V : Real; FromUK1, ToUK2, FromVK1, ToVK2 : Integer;
1306 P : out Pnt; D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV :
1308 raises UndefinedDerivative,
1310 -- Raised if the local continuity of the surface is not C3
1311 -- between the knots FromUK1, ToUK2 and FromVK1, ToVK2.
1313 ---Purpose : Raised if FromUK1 = ToUK2 or FromVK1 = ToVK2.
1316 -- Raised if FromUK1, ToUK2 are not in the range [FirstUKnotIndex,
1317 -- LastUKnotIndex] or if FromVK1, ToVK2 are not in the range
1318 -- [FirstVKnotIndex, LastVKnotIndex]
1321 LocalDN (me; U, V : Real; FromUK1, ToUK2, FromVK1, ToVK2 : Integer;
1324 raises UndefinedDerivative,
1326 -- Raised if the local continuity of the surface is not CNu
1327 -- between the knots FromUK1, ToUK2 and CNv between the knots
1330 ---Purpose : Raised if FromUK1 = ToUK2 or FromVK1 = ToVK2.
1332 -- Raised if Nu + Nv < 1 or Nu < 0 or Nv < 0.
1335 -- Raised if FromUK1, ToUK2 are not in the range [FirstUKnotIndex,
1336 -- LastUKnotIndex] or if FromVK1, ToVK2 are not in the range
1337 -- [FirstVKnotIndex, LastVKnotIndex]
1339 LocalValue(me; U, V : Real; FromUK1, ToUK2, FromVK1, ToVK2 : Integer)
1341 -- Computes the point of parameter U, V on the BSpline surface patch
1342 -- defines between the knots UK1 UK2, VK1, VK2. U can be out of the
1343 -- bounds [Knot UK1, Knot UK2] and V can be outof the bounds
1344 -- [Knot VK1, Knot VK2] but for the computation we only use the
1345 -- definition of the surface between these knot values.
1348 ---Purpose : Raises if FromUK1 = ToUK2 or FromVK1 = ToVK2.
1351 -- Raises if FromUK1, ToUK2 are not in the range [FirstUKnotIndex,
1352 -- LastUKnotIndex] or if FromVK1, ToVK2 are not in the range
1353 -- [FirstVKnotIndex, LastVKnotIndex]
1357 UIso (me; U : Real) returns Curve;
1359 -- Computes the U isoparametric curve.
1360 -- A B-spline curve is returned.
1363 VIso (me; V : Real) returns Curve;
1365 -- Computes the V isoparametric curve.
1366 -- A B-spline curve is returned.
1369 UIso (me; U : Real; CheckRational : Boolean) returns Curve;
1371 -- Computes the U isoparametric curve.
1372 -- If CheckRational=False, no try to make it non-rational.
1373 -- A B-spline curve is returned.
1376 VIso (me; V : Real; CheckRational : Boolean) returns Curve;
1378 -- Computes the V isoparametric curve.
1379 -- If CheckRational=False, no try to make it non-rational.
1380 -- A B-spline curve is returned.
1386 ---Purpose : transformations
1388 Transform (me : mutable; T : Trsf) ;
1390 --- Purpose: Applies the transformation T to this BSpline surface.
1392 MaxDegree (myclass) returns Integer;
1394 -- Returns the value of the maximum degree of the normalized
1395 -- B-spline basis functions in the u and v directions.
1398 Resolution(me : mutable;
1399 Tolerance3D : Real ;
1400 UTolerance : out Real ;
1401 VTolerance : out Real)
1402 ---Purpose: Computes two tolerance values for this BSpline
1403 -- surface, based on the given tolerance in 3D space
1404 -- Tolerance3D. The tolerances computed are:
1405 -- - UTolerance in the u parametric direction, and
1406 -- - VTolerance in the v parametric direction.
1407 -- If f(u,v) is the equation of this BSpline surface,
1408 -- UTolerance and VTolerance guarantee that :
1409 -- | u1 - u0 | < UTolerance and
1410 -- | v1 - v0 | < VTolerance
1411 -- ====> |f (u1,v1) - f (u0,v0)| < Tolerance3D
1414 Copy (me) returns like me;
1416 ---Purpose: Creates a new object which is a copy of this BSpline surface.
1418 UpdateUKnots(me : mutable)
1419 ---Purpose: Recompute the flatknots, the knotsdistribution, the
1420 -- continuity for U.
1423 UpdateVKnots(me : mutable)
1424 ---Purpose: Recompute the flatknots, the knotsdistribution, the
1425 -- continuity for V.
1432 urational : Boolean;
1433 vrational : Boolean;
1434 uperiodic : Boolean;
1435 vperiodic : Boolean;
1436 uknotSet : BSplKnotDistribution from GeomAbs;
1437 vknotSet : BSplKnotDistribution from GeomAbs;
1438 Usmooth : Shape from GeomAbs;
1439 Vsmooth : Shape from GeomAbs;
1442 poles : HArray2OfPnt from TColgp;
1443 weights : HArray2OfReal from TColStd;
1444 ufknots : HArray1OfReal from TColStd;
1445 vfknots : HArray1OfReal from TColStd;
1446 uknots : HArray1OfReal from TColStd;
1447 vknots : HArray1OfReal from TColStd;
1448 umults : HArray1OfInteger from TColStd;
1449 vmults : HArray1OfInteger from TColStd;
1450 umaxderivinv : Real from Standard;
1451 vmaxderivinv : Real from Standard;
1452 maxderivinvok : Boolean from Standard;