0031939: Coding - correction of spelling errors in comments [part 3]
[occt.git] / src / GeomFill / GeomFill_Pipe.hxx
1 // Created on: 1994-04-13
2 // Created by: Eric BONNARDEL
3 // Copyright (c) 1994-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 _GeomFill_Pipe_HeaderFile
18 #define _GeomFill_Pipe_HeaderFile
19
20 #include <Adaptor3d_Curve.hxx>
21 #include <GeomFill_Trihedron.hxx>
22 #include <GeomAbs_Shape.hxx>
23 #include <TColGeom_SequenceOfCurve.hxx>
24
25 class Geom_Surface;
26 class GeomFill_LocationLaw;
27 class GeomFill_SectionLaw;
28 class Geom_Curve;
29 class Geom2d_Curve;
30 class gp_Dir;
31
32 //! Describes functions to construct pipes. A pipe is built by
33 //! sweeping a curve (the section) along another curve (the path).
34 //! The Pipe class provides the following types of construction:
35 //! -   pipes with a circular section of constant radius,
36 //! -   pipes with a constant section,
37 //! -   pipes with a section evolving between two given curves.
38 //! All standard specific cases are detected in order to build,
39 //! where required, a plane, cylinder, cone, sphere, torus,
40 //! surface of linear extrusion or surface of revolution.
41 //! Generally speaking, the result is a BSpline surface (NURBS).
42 //! A Pipe object provides a framework for:
43 //! -   defining the pipe to be built,
44 //! -   implementing the construction algorithm, and
45 //! -   consulting the resulting surface.
46 //! There are several methods to instantiate a Pipe:
47 //! 1) give a path and  a radius : the section is
48 //! a circle.  This location  is the first  point
49 //! of the path,  and this direction is the first
50 //! derivate (calculate at  the  first point ) of
51 //! the path.
52 //!
53 //! 2) give a path and a section.
54 //! Differtent options are available
55 //! 2.a) Use the classical Frenet trihedron
56 //! - or the CorrectedFrenet trihedron
57 //! (To avoid twisted surface)
58 //! - or a constant trihedron to have all the sections
59 //! in a same plane
60 //! 2.b) Define a ConstantBinormal Direction to keep the
61 //! same angle between the Direction and the sections
62 //! along the sweep surface.
63 //! 2.c) Define the path by a surface and a 2dcurve,
64 //! the surface is used to define the trihedron's normal.
65 //! It is useful to keep a constant angle between
66 //! input surface and the pipe.                           --
67 //! 3) give a  path and two sections. The section
68 //! evoluate from First to Last Section.
69 //!
70 //! 3) give a  path and N sections. The section
71 //! evoluate from First to Last Section.
72 //!
73 //! In general case the result is a NURBS. But we
74 //! can  generate plane,  cylindrical, spherical,
75 //! conical, toroidal surface in some particular case.
76 //!
77 //! The natural parametrization of the result is:
78 //!
79 //! U-Direction along the section.
80 //! V-Direction along the path.
81 //!
82 //! But, in some particular case, the surface must
83 //! be construct otherwise.
84 //! The method "EchangeUV" return false in such cases.
85 class GeomFill_Pipe 
86 {
87 public:
88
89   DEFINE_STANDARD_ALLOC
90
91   
92
93   //! Constructs an empty algorithm for building pipes. Use
94   //! the function Init to initialize it.
95   Standard_EXPORT GeomFill_Pipe();
96   
97   Standard_EXPORT GeomFill_Pipe(const Handle(Geom_Curve)& Path, const Standard_Real Radius);
98   
99   //! Create  a  pipe  with  a  constant  section
100   //! (<FirstSection>)  and a path (<Path>)
101   //! Option can be  - GeomFill_IsCorrectedFrenet
102   //! - GeomFill_IsFrenet
103   //! - GeomFill_IsConstant
104   Standard_EXPORT GeomFill_Pipe(const Handle(Geom_Curve)& Path, const Handle(Geom_Curve)& FirstSect, const GeomFill_Trihedron Option = GeomFill_IsCorrectedFrenet);
105   
106   //! Create  a  pipe  with  a  constant  section
107   //! (<FirstSection>)  and a path defined by <Path> and <Support>
108   Standard_EXPORT GeomFill_Pipe(const Handle(Geom2d_Curve)& Path, const Handle(Geom_Surface)& Support, const Handle(Geom_Curve)& FirstSect);
109   
110   //! Create  a  pipe with  a  constant section
111   //! (<FirstSection>) and a   path <Path>  and a fixed
112   //! binormal direction <Dir>
113   Standard_EXPORT GeomFill_Pipe(const Handle(Geom_Curve)& Path, const Handle(Geom_Curve)& FirstSect, const gp_Dir& Dir);
114   
115   //! Create a pipe with an evolving section
116   //! The section evoluate from First to Last Section
117   Standard_EXPORT GeomFill_Pipe(const Handle(Geom_Curve)& Path, const Handle(Geom_Curve)& FirstSect, const Handle(Geom_Curve)& LastSect);
118   
119   //! Create a pipe with N  sections
120   //! The section evoluate from First to Last Section
121   Standard_EXPORT GeomFill_Pipe(const Handle(Geom_Curve)& Path, const TColGeom_SequenceOfCurve& NSections);
122   
123   //! Create  a pipe  with  a constant  radius with  2
124   //! guide-line.
125   Standard_EXPORT GeomFill_Pipe(const Handle(Geom_Curve)& Path, const Handle(Geom_Curve)& Curve1, const Handle(Geom_Curve)& Curve2, const Standard_Real Radius);
126   
127   //! Create  a pipe  with  a constant  radius with  2
128   //! guide-line.
129   Standard_EXPORT GeomFill_Pipe(const Handle(Adaptor3d_Curve)& Path, const Handle(Adaptor3d_Curve)& Curve1, const Handle(Adaptor3d_Curve)& Curve2, const Standard_Real Radius);
130   
131   //! Create a pipe with a constant section and  with 1
132   //! guide-line.
133   //! Use the function Perform to build the surface.
134   //! All standard specific cases are detected in order to
135   //! construct, according to the respective geometric
136   //! nature of Path and the sections, a planar, cylindrical,
137   //! conical, spherical or toroidal surface, a surface of
138   //! linear extrusion or a surface of revolution.
139   //! In the general case, the result is a BSpline surface
140   //! (NURBS) built by approximation of a series of sections where:
141   //! -   the number of sections N is chosen automatically
142   //! by the algorithm according to the respective
143   //! geometries of Path and the sections. N is greater than or equal to 2;
144   //! -   N points Pi (with i in the range [ 1,N ]) are
145   //! defined at regular intervals along the curve Path
146   //! from its first point to its end point. At each point Pi,
147   //! a coordinate system Ti is computed with Pi as
148   //! origin, and with the tangential and normal vectors
149   //! to Path defining two of its coordinate axes.
150   //! In the case of a pipe with a constant circular section,
151   //! the first section is a circle of radius Radius centered
152   //! on the origin of Path and whose "Z Axis" is aligned
153   //! along the vector tangential to the origin of Path. In the
154   //! case of a pipe with a constant section, the first section
155   //! is the curve FirstSect. In these two cases, the ith
156   //! section (for values of i greater than 1) is obtained by
157   //! applying to a copy of this first section the geometric
158   //! transformation which transforms coordinate system
159   //! T1 into coordinate system Ti.
160   //! In the case of an evolving section, N-2 intermediate
161   //! curves Si are first computed (if N is greater than 2,
162   //! and with i in the range [ 2,N-1 ]) whose geometry
163   //! evolves regularly from the curve S1=FirstSect to the
164   //! curve SN=LastSect. The first section is FirstSect,
165   //! and the ith section (for values of i greater than 1) is
166   //! obtained by applying to the curve Si the geometric
167   //! transformation which transforms coordinate system
168   //! T1 into coordinate system Ti.
169   Standard_EXPORT GeomFill_Pipe(const Handle(Geom_Curve)& Path, const Handle(Adaptor3d_Curve)& Guide, const Handle(Geom_Curve)& FirstSect, const Standard_Boolean ByACR, const Standard_Boolean rotat);
170   
171   Standard_EXPORT void Init (const Handle(Geom_Curve)& Path, const Standard_Real Radius);
172   
173   Standard_EXPORT void Init (const Handle(Geom_Curve)& Path, const Handle(Geom_Curve)& FirstSect, const GeomFill_Trihedron Option = GeomFill_IsCorrectedFrenet);
174   
175   Standard_EXPORT void Init (const Handle(Geom2d_Curve)& Path, const Handle(Geom_Surface)& Support, const Handle(Geom_Curve)& FirstSect);
176   
177   Standard_EXPORT void Init (const Handle(Geom_Curve)& Path, const Handle(Geom_Curve)& FirstSect, const gp_Dir& Dir);
178   
179   Standard_EXPORT void Init (const Handle(Geom_Curve)& Path, const Handle(Geom_Curve)& FirstSect, const Handle(Geom_Curve)& LastSect);
180   
181   Standard_EXPORT void Init (const Handle(Geom_Curve)& Path, const TColGeom_SequenceOfCurve& NSections);
182   
183   //! Create  a pipe  with  a constant  radius with  2
184   //! guide-line.
185   Standard_EXPORT void Init (const Handle(Adaptor3d_Curve)& Path, const Handle(Adaptor3d_Curve)& Curve1, const Handle(Adaptor3d_Curve)& Curve2, const Standard_Real Radius);
186   
187
188   //! Initializes this pipe algorithm to build the following surface:
189   //! -   a pipe with a constant circular section of radius
190   //! Radius along the path Path, or
191   //! -   a pipe with constant section FirstSect along the path Path, or
192   //! -   a pipe where the section evolves from FirstSect to
193   //! LastSect along the path Path.
194   //! Use the function Perform to build the surface.
195   //! Note: a description of the resulting surface is given under Constructors.
196   Standard_EXPORT void Init (const Handle(Geom_Curve)& Path, const Handle(Adaptor3d_Curve)& Guide, const Handle(Geom_Curve)& FirstSect, const Standard_Boolean ByACR, const Standard_Boolean rotat);
197   
198   //! Builds the pipe defined at the time of initialization of this
199   //! algorithm. A description of the resulting surface is given under Constructors.
200   //! If WithParameters (defaulted to false) is set to true, the
201   //! approximation algorithm (used only in the general case
202   //! of construction of a BSpline surface) builds the surface
203   //! with a u parameter corresponding to the one of the path.
204   //! Exceptions
205   //! Standard_ConstructionError if a surface cannot be constructed from the data.
206   //! Warning: It is the old Perform method, the next methode is recommended.
207   Standard_EXPORT void Perform (const Standard_Boolean WithParameters = Standard_False, const Standard_Boolean myPolynomial = Standard_False);
208   
209   //! detects the  particular cases.  And compute the surface.
210   //! if  none   particular  case  is  detected we make an approximation
211   //! with respect of the Tolerance <Tol>, the continuty <Conti>, the
212   //! maximum degree <MaxDegree>, the maximum number of span <NbMaxSegment>
213   //! and the spine parametrization.
214   //! If we can't create a surface with the data
215   Standard_EXPORT void Perform (const Standard_Real Tol, const Standard_Boolean Polynomial, const GeomAbs_Shape Conti = GeomAbs_C1, const Standard_Integer MaxDegree = 11, const Standard_Integer NbMaxSegment = 30);
216   
217   //! Returns the surface built by this algorithm.
218   //! Warning
219   //! Do not use this function before the surface is built (in this
220   //! case the function will return a null handle).
221     const Handle(Geom_Surface)& Surface() const;
222   
223   //! The u parametric direction of the surface constructed by
224   //! this algorithm usually corresponds to the evolution
225   //! along the path and the v parametric direction
226   //! corresponds to the evolution along the section(s).
227   //! However, this rule is not respected when constructing
228   //! certain specific Geom surfaces (typically cylindrical
229   //! surfaces, surfaces of revolution, etc.) for which the
230   //! parameterization is inversed.
231   //! The ExchangeUV function checks for this, and returns
232   //! true in all these specific cases.
233   //! Warning
234   //! Do not use this function before the surface is built.
235   Standard_Boolean ExchangeUV() const;
236   
237   //! Sets a flag  to  try to   create as many   planes,
238   //! cylinder,...    as  possible.  Default  value   is
239   //! <Standard_False>.
240     void GenerateParticularCase (const Standard_Boolean B);
241   
242   //! Returns the flag.
243     Standard_Boolean GenerateParticularCase() const;
244   
245   //! Returns the approximation's error.  if the Surface
246   //! is plane, cylinder ... this error can be 0.
247     Standard_Real ErrorOnSurf() const;
248
249   //! Returns whether approximation was done.
250     Standard_Boolean IsDone() const;
251
252
253
254 protected:
255
256
257
258
259
260 private:
261
262   
263   Standard_EXPORT void Init();
264   
265   //! The result  (<mySurface>)  is an approximation.  Using
266   //! <SweepSectionGenerator>  to      do    that.        If
267   //! <WithParameters>    is   set  to <Standard_True>,  the
268   //! apprxoximation will be   done in respect to  the spine
269   //! parametrization.
270   Standard_EXPORT void ApproxSurf (const Standard_Boolean WithParameters);
271   
272   Standard_EXPORT Standard_Boolean KPartT4();
273
274
275   Standard_Boolean myIsDone;
276   Standard_Real myRadius;
277   Standard_Real myError;
278   Handle(Adaptor3d_Curve) myAdpPath;
279   Handle(Adaptor3d_Curve) myAdpFirstSect;
280   Handle(Adaptor3d_Curve) myAdpLastSect;
281   Handle(Geom_Surface) mySurface;
282   Handle(GeomFill_LocationLaw) myLoc;
283   Handle(GeomFill_SectionLaw) mySec;
284   Standard_Integer myType;
285   Standard_Boolean myExchUV;
286   Standard_Boolean myKPart;
287   Standard_Boolean myPolynomial;
288
289
290 };
291
292
293 #include <GeomFill_Pipe.lxx>
294
295
296
297
298
299 #endif // _GeomFill_Pipe_HeaderFile