0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / GeomConvert / GeomConvert_CompBezierSurfacesToBSplineSurface.hxx
diff --git a/src/GeomConvert/GeomConvert_CompBezierSurfacesToBSplineSurface.hxx b/src/GeomConvert/GeomConvert_CompBezierSurfacesToBSplineSurface.hxx
new file mode 100644 (file)
index 0000000..be53d01
--- /dev/null
@@ -0,0 +1,314 @@
+// Created on: 1996-06-06
+// Created by: Philippe MANGIN
+// Copyright (c) 1996-1999 Matra Datavision
+// Copyright (c) 1999-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.
+
+#ifndef _GeomConvert_CompBezierSurfacesToBSplineSurface_HeaderFile
+#define _GeomConvert_CompBezierSurfacesToBSplineSurface_HeaderFile
+
+#include <Standard.hxx>
+#include <Standard_DefineAlloc.hxx>
+#include <Standard_Handle.hxx>
+
+#include <Standard_Integer.hxx>
+#include <TColStd_HArray1OfInteger.hxx>
+#include <TColStd_HArray1OfReal.hxx>
+#include <TColgp_HArray2OfPnt.hxx>
+#include <Standard_Boolean.hxx>
+#include <TColGeom_Array2OfBezierSurface.hxx>
+#include <Standard_Real.hxx>
+#include <TColStd_Array1OfReal.hxx>
+#include <GeomAbs_Shape.hxx>
+class Standard_DimensionError;
+class Standard_NotImplemented;
+class Standard_ConstructionError;
+
+
+//! An algorithm to convert a grid of adjacent
+//! non-rational Bezier surfaces (with continuity CM) into a
+//! BSpline surface (with continuity CM).
+//! A CompBezierSurfacesToBSplineSurface object
+//! provides a framework for:
+//! -   defining the grid of adjacent Bezier surfaces
+//! which is to be converted into a BSpline surface,
+//! -   implementing the computation algorithm, and
+//! -   consulting the results.
+//! Warning
+//! Do not attempt to convert rational Bezier surfaces using such an algorithm.
+//! Input is array of Bezier patch
+//! 1    2    3     4  -> VIndex [1, NbVPatches] -> VDirection
+//! -----------------------
+//! 1    |    |    |    |      |
+//! -----------------------
+//! 2    |    |    |    |      |
+//! -----------------------
+//! 3    |    |    |    |      |
+//! -----------------------
+//! UIndex [1, NbUPatches]  Udirection
+//!
+//! Warning! Patches must have compatible parametrization
+class GeomConvert_CompBezierSurfacesToBSplineSurface 
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+
+  
+  //! Computes all the data needed to build a "C0"
+  //! continuous BSpline surface equivalent to the grid of
+  //! adjacent non-rational Bezier surfaces Beziers.
+  //! Each surface in the Beziers grid becomes a natural
+  //! patch, limited by knots values, on the BSpline surface
+  //! whose data is computed. Surfaces in the grid must
+  //! satisfy the following conditions:
+  //! -   Coincident bounding curves between two
+  //! consecutive surfaces in a row of the Beziers grid
+  //! must be u-isoparametric bounding curves of these two surfaces.
+  //! -   Coincident bounding curves between two
+  //! consecutive surfaces in a column of the Beziers
+  //! grid must be v-isoparametric bounding curves of these two surfaces.
+  //! The BSpline surface whose data is computed has the
+  //! following characteristics:
+  //! -   Its degree in the u (respectively v) parametric
+  //! direction is equal to that of the Bezier surface
+  //! which has the highest degree in the u
+  //! (respectively v) parametric direction in the Beziers grid.
+  //! -   It is a "Piecewise Bezier" in both u and v
+  //! parametric directions, i.e.:
+  //! -   the knots are regularly spaced in each
+  //! parametric direction (i.e. the difference between
+  //! two consecutive knots is a constant), and
+  //! -   all the multiplicities of the surface knots in a
+  //! given parametric direction are equal to
+  //! Degree, which is the degree of the BSpline
+  //! surface in this parametric direction, except for
+  //! the first and last knots for which the multiplicity is
+  //! equal to Degree + 1.
+  //! -   Coincident bounding curves between two
+  //! consecutive columns of Bezier surfaces in the
+  //! Beziers grid become u-isoparametric curves,
+  //! corresponding to knots values of the BSpline surface.
+  //! -   Coincident bounding curves between two
+  //! consecutive rows of Bezier surfaces in the Beziers
+  //! grid become v-isoparametric curves
+  //! corresponding to knots values of the BSpline surface.
+  //! Use the available consultation functions to access the
+  //! computed data. This data may be used to construct the BSpline surface.
+  //! Warning
+  //! The surfaces in the Beziers grid must be adjacent, i.e.
+  //! two consecutive Bezier surfaces in the grid (in a row
+  //! or column) must have a coincident bounding curve. In
+  //! addition, the location of the parameterization on each
+  //! of these surfaces (i.e. the relative location of u and v
+  //! isoparametric curves on the surface) is of importance
+  //! with regard to the positioning of the surfaces in the
+  //! Beziers grid. Care must be taken with respect to the
+  //! above, as these properties are not checked and an
+  //! error may occur if they are not satisfied.
+  //! Exceptions
+  //! Standard_NotImplemented if one of the Bezier
+  //! surfaces of the Beziers grid is rational.
+  Standard_EXPORT GeomConvert_CompBezierSurfacesToBSplineSurface(const TColGeom_Array2OfBezierSurface& Beziers);
+  
+  //! Build an Ci uniform (Rational) BSpline surface
+  //! The higest Continuity Ci is imposed, like the
+  //! maximal deformation is lower than <Tolerance>.
+  //! Warning:  The Continuity C0 is imposed without any check.
+  Standard_EXPORT GeomConvert_CompBezierSurfacesToBSplineSurface(const TColGeom_Array2OfBezierSurface& Beziers, const Standard_Real Tolerance, const Standard_Boolean RemoveKnots = Standard_True);
+  
+  //! Computes all the data needed to construct a BSpline
+  //! surface equivalent to the adjacent non-rational
+  //! Bezier surfaces Beziers grid.
+  //! Each surface in the Beziers grid becomes a natural
+  //! patch, limited by knots values, on the BSpline surface
+  //! whose data is computed. Surfaces in the grid must
+  //! satisfy the following conditions:
+  //! -   Coincident bounding curves between two
+  //! consecutive surfaces in a row of the Beziers grid
+  //! must be u-isoparametric bounding curves of these two surfaces.
+  //! -   Coincident bounding curves between two
+  //! consecutive surfaces in a column of the Beziers
+  //! grid must be v-isoparametric bounding curves of these two surfaces.
+  //! The BSpline surface whose data is computed has the
+  //! following characteristics:
+  //! -   Its degree in the u (respectively v) parametric
+  //! direction is equal to that of the Bezier surface
+  //! which has the highest degree in the u
+  //! (respectively v) parametric direction in the Beziers grid.
+  //! -   Coincident bounding curves between two
+  //! consecutive columns of Bezier surfaces in the
+  //! Beziers grid become u-isoparametric curves
+  //! corresponding to knots values of the BSpline surface.
+  //! -   Coincident bounding curves between two
+  //! consecutive rows of Bezier surfaces in the Beziers
+  //! grid become v-isoparametric curves
+  //! corresponding to knots values of the BSpline surface.
+  //! Knots values of the BSpline surface are given in the two tables:
+  //! -   UKnots for the u parametric direction (which
+  //! corresponds to the order of Bezier surface columns in the Beziers grid), and
+  //! -   VKnots for the v parametric direction (which
+  //! corresponds to the order of Bezier surface rows in the Beziers grid).
+  //! The dimensions of UKnots (respectively VKnots)
+  //! must be equal to the number of columns (respectively,
+  //! rows) of the Beziers grid, plus 1 .
+  //! UContinuity and VContinuity, which are both
+  //! defaulted to GeomAbs_C0, specify the required
+  //! continuity on the BSpline surface. If the required
+  //! degree of continuity is greater than 0 in a given
+  //! parametric direction, a deformation is applied locally
+  //! on the initial surface (as defined by the Beziers grid)
+  //! to satisfy this condition. This local deformation is not
+  //! applied however, if it is greater than Tolerance
+  //! (defaulted to 1.0 e-7). In such cases, the
+  //! continuity condition is not satisfied, and the function
+  //! IsDone will return false. A small tolerance value
+  //! prevents any modification of the surface and a large
+  //! tolerance value "smoothes" the surface.
+  //! Use the available consultation functions to access the
+  //! computed data. This data may be used to construct the BSpline surface.
+  //! Warning
+  //! The surfaces in the Beziers grid must be adjacent, i.e.
+  //! two consecutive Bezier surfaces in the grid (in a row
+  //! or column) must have a coincident bounding curve. In
+  //! addition, the location of the parameterization on each
+  //! of these surfaces (i.e. the relative location of u and v
+  //! isoparametric curves on the surface) is of importance
+  //! with regard to the positioning of the surfaces in the
+  //! Beziers grid. Care must be taken with respect to the
+  //! above, as these properties are not checked and an
+  //! error may occur if they are not satisfied.
+  //! Exceptions
+  //! Standard_DimensionMismatch:
+  //! -   if the number of knots in the UKnots table (i.e. the
+  //! length of the UKnots array) is not equal to the
+  //! number of columns of Bezier surfaces in the
+  //! Beziers grid plus 1, or
+  //! -   if the number of knots in the VKnots table (i.e. the
+  //! length of the VKnots array) is not equal to the
+  //! number of rows of Bezier surfaces in the Beziers grid, plus 1.
+  //! Standard_ConstructionError:
+  //! -   if UContinuity and VContinuity are not equal to
+  //! one of the following values: GeomAbs_C0,
+  //! GeomAbs_C1, GeomAbs_C2 and GeomAbs_C3; or
+  //! -   if the number of columns in the Beziers grid is
+  //! greater than 1, and the required degree of
+  //! continuity in the u parametric direction is greater
+  //! than that of the Bezier surface with the highest
+  //! degree in the u parametric direction (in the Beziers grid), minus 1; or
+  //! -   if the number of rows in the Beziers grid is
+  //! greater than 1, and the required degree of
+  //! continuity in the v parametric direction is greater
+  //! than that of the Bezier surface with the highest
+  //! degree in the v parametric direction (in the Beziers grid), minus 1 .
+  //! Standard_NotImplemented if one of the Bezier
+  //! surfaces in the Beziers grid is rational.
+  Standard_EXPORT GeomConvert_CompBezierSurfacesToBSplineSurface(const TColGeom_Array2OfBezierSurface& Beziers, const TColStd_Array1OfReal& UKnots, const TColStd_Array1OfReal& VKnots, const GeomAbs_Shape UContinuity = GeomAbs_C0, const GeomAbs_Shape VContinuity = GeomAbs_C0, const Standard_Real Tolerance = 1.0e-4);
+  
+  //! Returns the number of knots in the U direction
+  //! of the BSpline surface whose data is computed in this framework.
+    Standard_Integer NbUKnots() const;
+  
+  //! Returns number of poles in the U direction
+  //! of the BSpline surface whose data is computed in this framework.
+    Standard_Integer NbUPoles() const;
+  
+  //! Returns the number of knots in the V direction
+  //! of the BSpline surface whose data is computed in this framework.
+    Standard_Integer NbVKnots() const;
+  
+  //! Returns the number of poles in the V direction
+  //! of the BSpline surface whose data is computed in this framework.
+    Standard_Integer NbVPoles() const;
+  
+  //! Returns the table of poles of the BSpline surface
+  //! whose data is computed in this framework.
+    const Handle(TColgp_HArray2OfPnt)& Poles() const;
+  
+  //! Returns the knots table for the u parametric
+  //! direction of the BSpline surface whose data is computed in this framework.
+    const Handle(TColStd_HArray1OfReal)& UKnots() const;
+  
+  //! Returns the degree for the u  parametric
+  //! direction of the BSpline surface whose data is computed in this framework.
+    Standard_Integer UDegree() const;
+  
+  //! Returns the knots table for the v parametric
+  //! direction of the BSpline surface whose data is computed in this framework.
+    const Handle(TColStd_HArray1OfReal)& VKnots() const;
+  
+  //! Returns the degree for the v  parametric
+  //! direction of the BSpline surface whose data is computed in this framework.
+    Standard_Integer VDegree() const;
+  
+
+  //! Returns the multiplicities table for the u
+  //! parametric direction of the knots of the BSpline
+  //! surface whose data is computed in this framework.
+    const Handle(TColStd_HArray1OfInteger)& UMultiplicities() const;
+  
+  //! -- Returns the multiplicities table for the v
+  //! parametric direction of the knots of the BSpline
+  //! surface whose data is computed in this framework.
+    const Handle(TColStd_HArray1OfInteger)& VMultiplicities() const;
+  
+  //! Returns true if the conversion was successful.
+  //! Unless an exception was raised at the time of
+  //! construction, the conversion of the Bezier surface
+  //! grid assigned to this algorithm is always carried out.
+  //! IsDone returns false if the constraints defined at the
+  //! time of construction cannot be respected. This occurs
+  //! when there is an incompatibility between a required
+  //! degree of continuity on the BSpline surface, and the
+  //! maximum tolerance accepted for local deformations
+  //! of the surface. In such a case the computed data
+  //! does not satisfy all the initial constraints.
+  Standard_EXPORT Standard_Boolean IsDone() const;
+
+
+
+
+protected:
+
+
+
+
+
+private:
+
+  
+  //! It used internaly by the constructors.
+  Standard_EXPORT void Perform (const TColGeom_Array2OfBezierSurface& Beziers);
+
+
+  Standard_Integer myUDegree;
+  Standard_Integer myVDegree;
+  Handle(TColStd_HArray1OfInteger) myVMults;
+  Handle(TColStd_HArray1OfInteger) myUMults;
+  Handle(TColStd_HArray1OfReal) myUKnots;
+  Handle(TColStd_HArray1OfReal) myVKnots;
+  Handle(TColgp_HArray2OfPnt) myPoles;
+  Standard_Boolean isrational;
+  Standard_Boolean myDone;
+
+
+};
+
+
+#include <GeomConvert_CompBezierSurfacesToBSplineSurface.lxx>
+
+
+
+
+
+#endif // _GeomConvert_CompBezierSurfacesToBSplineSurface_HeaderFile