0031642: Visualization - crash in Graphic3d_Structure::SetVisual() on redisplaying...
[occt.git] / src / GeomConvert / GeomConvert_CompBezierSurfacesToBSplineSurface.hxx
CommitLineData
42cf5bc1 1// Created on: 1996-06-06
2// Created by: Philippe MANGIN
3// Copyright (c) 1996-1999 Matra Datavision
4// Copyright (c) 1999-2014 OPEN CASCADE SAS
5//
6// This file is part of Open CASCADE Technology software library.
7//
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.
13//
14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
16
17#ifndef _GeomConvert_CompBezierSurfacesToBSplineSurface_HeaderFile
18#define _GeomConvert_CompBezierSurfacesToBSplineSurface_HeaderFile
19
20#include <Standard.hxx>
21#include <Standard_DefineAlloc.hxx>
22#include <Standard_Handle.hxx>
23
24#include <Standard_Integer.hxx>
25#include <TColStd_HArray1OfInteger.hxx>
26#include <TColStd_HArray1OfReal.hxx>
27#include <TColgp_HArray2OfPnt.hxx>
28#include <Standard_Boolean.hxx>
29#include <TColGeom_Array2OfBezierSurface.hxx>
30#include <Standard_Real.hxx>
31#include <TColStd_Array1OfReal.hxx>
32#include <GeomAbs_Shape.hxx>
33class Standard_DimensionError;
34class Standard_NotImplemented;
35class Standard_ConstructionError;
36
37
38//! An algorithm to convert a grid of adjacent
39//! non-rational Bezier surfaces (with continuity CM) into a
40//! BSpline surface (with continuity CM).
41//! A CompBezierSurfacesToBSplineSurface object
42//! provides a framework for:
43//! - defining the grid of adjacent Bezier surfaces
44//! which is to be converted into a BSpline surface,
45//! - implementing the computation algorithm, and
46//! - consulting the results.
47//! Warning
48//! Do not attempt to convert rational Bezier surfaces using such an algorithm.
49//! Input is array of Bezier patch
50//! 1 2 3 4 -> VIndex [1, NbVPatches] -> VDirection
51//! -----------------------
52//! 1 | | | | |
53//! -----------------------
54//! 2 | | | | |
55//! -----------------------
56//! 3 | | | | |
57//! -----------------------
58//! UIndex [1, NbUPatches] Udirection
59//!
60//! Warning! Patches must have compatible parametrization
61class GeomConvert_CompBezierSurfacesToBSplineSurface
62{
63public:
64
65 DEFINE_STANDARD_ALLOC
66
67
68 //! Computes all the data needed to build a "C0"
69 //! continuous BSpline surface equivalent to the grid of
70 //! adjacent non-rational Bezier surfaces Beziers.
71 //! Each surface in the Beziers grid becomes a natural
72 //! patch, limited by knots values, on the BSpline surface
73 //! whose data is computed. Surfaces in the grid must
74 //! satisfy the following conditions:
75 //! - Coincident bounding curves between two
76 //! consecutive surfaces in a row of the Beziers grid
77 //! must be u-isoparametric bounding curves of these two surfaces.
78 //! - Coincident bounding curves between two
79 //! consecutive surfaces in a column of the Beziers
80 //! grid must be v-isoparametric bounding curves of these two surfaces.
81 //! The BSpline surface whose data is computed has the
82 //! following characteristics:
83 //! - Its degree in the u (respectively v) parametric
84 //! direction is equal to that of the Bezier surface
85 //! which has the highest degree in the u
86 //! (respectively v) parametric direction in the Beziers grid.
87 //! - It is a "Piecewise Bezier" in both u and v
88 //! parametric directions, i.e.:
89 //! - the knots are regularly spaced in each
90 //! parametric direction (i.e. the difference between
91 //! two consecutive knots is a constant), and
92 //! - all the multiplicities of the surface knots in a
93 //! given parametric direction are equal to
94 //! Degree, which is the degree of the BSpline
95 //! surface in this parametric direction, except for
96 //! the first and last knots for which the multiplicity is
97 //! equal to Degree + 1.
98 //! - Coincident bounding curves between two
99 //! consecutive columns of Bezier surfaces in the
100 //! Beziers grid become u-isoparametric curves,
101 //! corresponding to knots values of the BSpline surface.
102 //! - Coincident bounding curves between two
103 //! consecutive rows of Bezier surfaces in the Beziers
104 //! grid become v-isoparametric curves
105 //! corresponding to knots values of the BSpline surface.
106 //! Use the available consultation functions to access the
107 //! computed data. This data may be used to construct the BSpline surface.
108 //! Warning
109 //! The surfaces in the Beziers grid must be adjacent, i.e.
110 //! two consecutive Bezier surfaces in the grid (in a row
111 //! or column) must have a coincident bounding curve. In
112 //! addition, the location of the parameterization on each
113 //! of these surfaces (i.e. the relative location of u and v
114 //! isoparametric curves on the surface) is of importance
115 //! with regard to the positioning of the surfaces in the
116 //! Beziers grid. Care must be taken with respect to the
117 //! above, as these properties are not checked and an
118 //! error may occur if they are not satisfied.
119 //! Exceptions
120 //! Standard_NotImplemented if one of the Bezier
121 //! surfaces of the Beziers grid is rational.
122 Standard_EXPORT GeomConvert_CompBezierSurfacesToBSplineSurface(const TColGeom_Array2OfBezierSurface& Beziers);
123
124 //! Build an Ci uniform (Rational) BSpline surface
125 //! The higest Continuity Ci is imposed, like the
126 //! maximal deformation is lower than <Tolerance>.
127 //! Warning: The Continuity C0 is imposed without any check.
128 Standard_EXPORT GeomConvert_CompBezierSurfacesToBSplineSurface(const TColGeom_Array2OfBezierSurface& Beziers, const Standard_Real Tolerance, const Standard_Boolean RemoveKnots = Standard_True);
129
130 //! Computes all the data needed to construct a BSpline
131 //! surface equivalent to the adjacent non-rational
132 //! Bezier surfaces Beziers grid.
133 //! Each surface in the Beziers grid becomes a natural
134 //! patch, limited by knots values, on the BSpline surface
135 //! whose data is computed. Surfaces in the grid must
136 //! satisfy the following conditions:
137 //! - Coincident bounding curves between two
138 //! consecutive surfaces in a row of the Beziers grid
139 //! must be u-isoparametric bounding curves of these two surfaces.
140 //! - Coincident bounding curves between two
141 //! consecutive surfaces in a column of the Beziers
142 //! grid must be v-isoparametric bounding curves of these two surfaces.
143 //! The BSpline surface whose data is computed has the
144 //! following characteristics:
145 //! - Its degree in the u (respectively v) parametric
146 //! direction is equal to that of the Bezier surface
147 //! which has the highest degree in the u
148 //! (respectively v) parametric direction in the Beziers grid.
149 //! - Coincident bounding curves between two
150 //! consecutive columns of Bezier surfaces in the
151 //! Beziers grid become u-isoparametric curves
152 //! corresponding to knots values of the BSpline surface.
153 //! - Coincident bounding curves between two
154 //! consecutive rows of Bezier surfaces in the Beziers
155 //! grid become v-isoparametric curves
156 //! corresponding to knots values of the BSpline surface.
157 //! Knots values of the BSpline surface are given in the two tables:
158 //! - UKnots for the u parametric direction (which
159 //! corresponds to the order of Bezier surface columns in the Beziers grid), and
160 //! - VKnots for the v parametric direction (which
161 //! corresponds to the order of Bezier surface rows in the Beziers grid).
162 //! The dimensions of UKnots (respectively VKnots)
163 //! must be equal to the number of columns (respectively,
164 //! rows) of the Beziers grid, plus 1 .
165 //! UContinuity and VContinuity, which are both
166 //! defaulted to GeomAbs_C0, specify the required
167 //! continuity on the BSpline surface. If the required
168 //! degree of continuity is greater than 0 in a given
169 //! parametric direction, a deformation is applied locally
170 //! on the initial surface (as defined by the Beziers grid)
171 //! to satisfy this condition. This local deformation is not
172 //! applied however, if it is greater than Tolerance
173 //! (defaulted to 1.0 e-7). In such cases, the
174 //! continuity condition is not satisfied, and the function
175 //! IsDone will return false. A small tolerance value
176 //! prevents any modification of the surface and a large
177 //! tolerance value "smoothes" the surface.
178 //! Use the available consultation functions to access the
179 //! computed data. This data may be used to construct the BSpline surface.
180 //! Warning
181 //! The surfaces in the Beziers grid must be adjacent, i.e.
182 //! two consecutive Bezier surfaces in the grid (in a row
183 //! or column) must have a coincident bounding curve. In
184 //! addition, the location of the parameterization on each
185 //! of these surfaces (i.e. the relative location of u and v
186 //! isoparametric curves on the surface) is of importance
187 //! with regard to the positioning of the surfaces in the
188 //! Beziers grid. Care must be taken with respect to the
189 //! above, as these properties are not checked and an
190 //! error may occur if they are not satisfied.
191 //! Exceptions
192 //! Standard_DimensionMismatch:
193 //! - if the number of knots in the UKnots table (i.e. the
194 //! length of the UKnots array) is not equal to the
195 //! number of columns of Bezier surfaces in the
196 //! Beziers grid plus 1, or
197 //! - if the number of knots in the VKnots table (i.e. the
198 //! length of the VKnots array) is not equal to the
199 //! number of rows of Bezier surfaces in the Beziers grid, plus 1.
200 //! Standard_ConstructionError:
201 //! - if UContinuity and VContinuity are not equal to
202 //! one of the following values: GeomAbs_C0,
203 //! GeomAbs_C1, GeomAbs_C2 and GeomAbs_C3; or
204 //! - if the number of columns in the Beziers grid is
205 //! greater than 1, and the required degree of
206 //! continuity in the u parametric direction is greater
207 //! than that of the Bezier surface with the highest
208 //! degree in the u parametric direction (in the Beziers grid), minus 1; or
209 //! - if the number of rows in the Beziers grid is
210 //! greater than 1, and the required degree of
211 //! continuity in the v parametric direction is greater
212 //! than that of the Bezier surface with the highest
213 //! degree in the v parametric direction (in the Beziers grid), minus 1 .
214 //! Standard_NotImplemented if one of the Bezier
215 //! surfaces in the Beziers grid is rational.
216 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);
217
218 //! Returns the number of knots in the U direction
219 //! of the BSpline surface whose data is computed in this framework.
220 Standard_Integer NbUKnots() const;
221
222 //! Returns number of poles in the U direction
223 //! of the BSpline surface whose data is computed in this framework.
224 Standard_Integer NbUPoles() const;
225
226 //! Returns the number of knots in the V direction
227 //! of the BSpline surface whose data is computed in this framework.
228 Standard_Integer NbVKnots() const;
229
230 //! Returns the number of poles in the V direction
231 //! of the BSpline surface whose data is computed in this framework.
232 Standard_Integer NbVPoles() const;
233
234 //! Returns the table of poles of the BSpline surface
235 //! whose data is computed in this framework.
236 const Handle(TColgp_HArray2OfPnt)& Poles() const;
237
238 //! Returns the knots table for the u parametric
239 //! direction of the BSpline surface whose data is computed in this framework.
240 const Handle(TColStd_HArray1OfReal)& UKnots() const;
241
242 //! Returns the degree for the u parametric
243 //! direction of the BSpline surface whose data is computed in this framework.
244 Standard_Integer UDegree() const;
245
246 //! Returns the knots table for the v parametric
247 //! direction of the BSpline surface whose data is computed in this framework.
248 const Handle(TColStd_HArray1OfReal)& VKnots() const;
249
250 //! Returns the degree for the v parametric
251 //! direction of the BSpline surface whose data is computed in this framework.
252 Standard_Integer VDegree() const;
253
254
255 //! Returns the multiplicities table for the u
256 //! parametric direction of the knots of the BSpline
257 //! surface whose data is computed in this framework.
258 const Handle(TColStd_HArray1OfInteger)& UMultiplicities() const;
259
260 //! -- Returns the multiplicities table for the v
261 //! parametric direction of the knots of the BSpline
262 //! surface whose data is computed in this framework.
263 const Handle(TColStd_HArray1OfInteger)& VMultiplicities() const;
264
265 //! Returns true if the conversion was successful.
266 //! Unless an exception was raised at the time of
267 //! construction, the conversion of the Bezier surface
268 //! grid assigned to this algorithm is always carried out.
269 //! IsDone returns false if the constraints defined at the
270 //! time of construction cannot be respected. This occurs
271 //! when there is an incompatibility between a required
272 //! degree of continuity on the BSpline surface, and the
273 //! maximum tolerance accepted for local deformations
274 //! of the surface. In such a case the computed data
275 //! does not satisfy all the initial constraints.
276 Standard_EXPORT Standard_Boolean IsDone() const;
277
278
279
280
281protected:
282
283
284
285
286
287private:
288
289
290 //! It used internaly by the constructors.
291 Standard_EXPORT void Perform (const TColGeom_Array2OfBezierSurface& Beziers);
292
293
294 Standard_Integer myUDegree;
295 Standard_Integer myVDegree;
296 Handle(TColStd_HArray1OfInteger) myVMults;
297 Handle(TColStd_HArray1OfInteger) myUMults;
298 Handle(TColStd_HArray1OfReal) myUKnots;
299 Handle(TColStd_HArray1OfReal) myVKnots;
300 Handle(TColgp_HArray2OfPnt) myPoles;
301 Standard_Boolean isrational;
302 Standard_Boolean myDone;
303
304
305};
306
307
308#include <GeomConvert_CompBezierSurfacesToBSplineSurface.lxx>
309
310
311
312
313
314#endif // _GeomConvert_CompBezierSurfacesToBSplineSurface_HeaderFile