e3719b9ebb66285187afe883ace90b1e9777efa7
[occt.git] / src / FairCurve / FairCurve_Batten.hxx
1 // Created on: 1996-02-05
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 _FairCurve_Batten_HeaderFile
18 #define _FairCurve_Batten_HeaderFile
19
20 #include <Standard.hxx>
21 #include <Standard_DefineAlloc.hxx>
22 #include <Standard_Handle.hxx>
23
24 #include <FairCurve_AnalysisCode.hxx>
25 #include <gp_Pnt2d.hxx>
26 #include <Standard_Real.hxx>
27 #include <Standard_Boolean.hxx>
28 #include <Standard_Integer.hxx>
29 #include <TColgp_HArray1OfPnt2d.hxx>
30 #include <TColStd_HArray1OfReal.hxx>
31 #include <TColStd_HArray1OfInteger.hxx>
32 #include <Standard_OStream.hxx>
33 class Standard_NegativeValue;
34 class Standard_NullValue;
35 class gp_Pnt2d;
36 class gp_Vec2d;
37 class Geom2d_BSplineCurve;
38
39
40 //! Constructs curves with a constant or linearly increasing
41 //! section to be used in the design of wooden or plastic
42 //! battens. These curves are two-dimensional, and
43 //! simulate physical splines or battens.
44 class FairCurve_Batten 
45 {
46 public:
47
48   DEFINE_STANDARD_ALLOC
49
50   
51   //! Constructor  with the two points and the geometrical
52   //! characteristics of the batten (elastic beam)
53   //! Height is the height of the deformation, and Slope is the
54   //! slope value, initialized at 0. The user can then supply the
55   //! desired slope value by the method, SetSlope.
56   //! Other parameters are initialized as follow :
57   //! - FreeSliding = False
58   //! - ConstraintOrder1 = 1
59   //! - ConstraintOrder2 = 1
60   //! - Angle1 = 0
61   //! - Angle2 = 0
62   //! - SlidingFactor = 1
63   //! Exceptions
64   //! NegativeValue if Height is less than or equal to 0.
65   //! NullValue if the distance between P1 and P2 is less
66   //! than or equal to the tolerance value for distance in
67   //! Precision::Confusion: P1.IsEqual(P2,
68   //! Precision::Confusion()). The function
69   //! gp_Pnt2d::IsEqual tests to see if this is the case.
70   Standard_EXPORT FairCurve_Batten(const gp_Pnt2d& P1, const gp_Pnt2d& P2, const Standard_Real Height, const Standard_Real Slope = 0);
71   
72   Standard_EXPORT virtual void Delete();
73 Standard_EXPORT virtual ~FairCurve_Batten(){Delete();}
74   
75   //! Freesliding is initialized with the default setting false.
76   //! When Freesliding is set to true and, as a result, sliding
77   //! is free, the sliding factor is automatically computed to
78   //! satisfy the equilibrium of the batten.
79     void SetFreeSliding (const Standard_Boolean FreeSliding);
80   
81   //! Allows you to change the order of the constraint on the
82   //! first point. ConstraintOrder has the default setting of 1.
83   //! The following settings are available:
84   //! -   0-the curve must pass through a point
85   //! -   1-the curve must pass through a point and have a given tangent
86   //! -   2-the curve must pass through a point, have a given tangent and a given curvature.
87   //! The third setting is only valid for
88   //! FairCurve_MinimalVariation curves.
89   //! These constraints, though geometric, represent the
90   //! mechanical constraints due, for example, to the
91   //! resistance of the material the actual physical batten is made of.
92     void SetConstraintOrder1 (const Standard_Integer ConstraintOrder);
93   
94   //! Allows you to change the order of the constraint on the
95   //! second point. ConstraintOrder is initialized with the default setting of 1.
96   //! The following settings are available:
97   //! -   0-the curve must pass through a point
98   //! -   1-the curve must pass through a point and have a given tangent
99   //! -   2-the curve must pass through a point, have a given
100   //! tangent and a given curvature.
101   //! The third setting is only valid for
102   //! FairCurve_MinimalVariation curves.
103   //! These constraints, though geometric, represent the
104   //! mechanical constraints due, for example, to the
105   //! resistance of the material the actual physical batten is made of.
106     void SetConstraintOrder2 (const Standard_Integer ConstraintOrder);
107   
108   //! Allows you to change the location of the point, P1, and in
109   //! doing so, modify the curve.
110   //! Warning
111   //! This method changes the angle as well as the point.
112   //! Exceptions
113   //! NullValue if the distance between P1 and P2 is less
114   //! than or equal to the tolerance value for distance in
115   //! Precision::Confusion: P1.IsEqual(P2,
116   //! Precision::Confusion()). The function
117   //! gp_Pnt2d::IsEqual tests to see if this is the case.
118   Standard_EXPORT void SetP1 (const gp_Pnt2d& P1);
119   
120   //! Allows you to change the location of the point, P1, and in
121   //! doing so, modify the curve.
122   //! Warning
123   //! This method changes the angle as well as the point.
124   //! Exceptions
125   //! NullValue if the distance between P1 and P2 is less
126   //! than or equal to the tolerance value for distance in
127   //! Precision::Confusion: P1.IsEqual(P2,
128   //! Precision::Confusion()). The function
129   //! gp_Pnt2d::IsEqual tests to see if this is the case.
130   Standard_EXPORT void SetP2 (const gp_Pnt2d& P2);
131   
132   //! Allows you to change the angle Angle1 at the first point,
133   //! P1. The default setting is 0.
134     void SetAngle1 (const Standard_Real Angle1);
135   
136   //! Allows you to change the angle Angle2 at the second
137   //! point, P2. The default setting is 0.
138     void SetAngle2 (const Standard_Real Angle2);
139   
140   //! Allows you to change the height of the deformation.
141   //! Raises  NegativeValue; -- if  Height <= 0
142   //! if  Height <= 0
143     void SetHeight (const Standard_Real Height);
144   
145   //! Allows you to set the slope value, Slope.
146     void SetSlope (const Standard_Real Slope);
147   
148   //! Allows you to change the ratio SlidingFactor. This
149   //! compares the length of the batten and the reference
150   //! length, which is, in turn, a function of the constraints.
151   //! This modification has one of the following two effects:
152   //! -   if you increase the value, it inflates the batten
153   //! -   if you decrease the value, it flattens the batten.
154   //! When sliding is free, the sliding factor is automatically
155   //! computed to satisfy the equilibrium of the batten. When
156   //! sliding is imposed, a value is required for the sliding factor.
157   //! SlidingFactor is initialized with the default setting of 1.
158     void SetSlidingFactor (const Standard_Real SlidingFactor);
159   
160   //! Performs the algorithm, using the arguments Code,
161   //! NbIterations and Tolerance and computes the curve
162   //! with respect to the constraints.
163   //! Code will have one of the following values:
164   //! -   OK
165   //! -   NotConverged
166   //! -   InfiniteSliding
167   //! -   NullHeight
168   //! The parameters Tolerance and NbIterations control
169   //! how precise the computation is, and how long it will take.
170   Standard_EXPORT virtual Standard_Boolean Compute (FairCurve_AnalysisCode& Code, const Standard_Integer NbIterations = 50, const Standard_Real Tolerance = 1.0e-3);
171   
172   //! Computes the real number value for length Sliding of
173   //! Reference for new constraints. If you want to give a
174   //! specific length to a batten curve, use the following
175   //! syntax: b.SetSlidingFactor(L /
176   //! b.SlidingOfReference()) where b is the
177   //! name of the batten curve object.
178   Standard_EXPORT Standard_Real SlidingOfReference() const;
179   
180   //! Returns the initial free sliding value, false by default.
181   //! Free sliding is generally more aesthetically pleasing
182   //! than constrained sliding. However, the computation can
183   //! fail with values such as angles greater than PI/2. This is
184   //! because the resulting batten length is theoretically infinite.
185     Standard_Boolean GetFreeSliding() const;
186   
187   //! Returns the established first constraint order.
188     Standard_Integer GetConstraintOrder1() const;
189   
190   //! Returns the established second constraint order.
191     Standard_Integer GetConstraintOrder2() const;
192   
193   //! Returns the established location of the point P1.
194     const gp_Pnt2d& GetP1() const;
195   
196   //! Returns the established location of the point P2.
197     const gp_Pnt2d& GetP2() const;
198   
199   //! Returns the established first angle.
200     Standard_Real GetAngle1() const;
201   
202   //! Returns the established second angle.
203     Standard_Real GetAngle2() const;
204   
205   //! Returns the thickness of the lathe.
206     Standard_Real GetHeight() const;
207   
208   //! Returns the established slope value.
209     Standard_Real GetSlope() const;
210   
211   //! Returns the initial sliding factor.
212     Standard_Real GetSlidingFactor() const;
213   
214   //! Returns the computed curve a 2d BSpline.
215   Standard_EXPORT Handle(Geom2d_BSplineCurve) Curve() const;
216   
217   //! Prints on the stream o information on the current state
218   //! of the object.
219   //!
220   //! Private methodes  --------------------------------------
221   Standard_EXPORT virtual void Dump (Standard_OStream& o) const;
222
223
224
225
226 protected:
227
228   
229   Standard_EXPORT Standard_Real SlidingOfReference (const Standard_Real D, const Standard_Real A1, const Standard_Real A2) const;
230   
231   Standard_EXPORT Standard_Real Compute (const Standard_Real D, const Standard_Real A1, const Standard_Real A2) const;
232   
233   //! Returns the effective geometrical constraints at  the
234   //! last batten  computation.  This effectives values may
235   //! be not equal with the wanted values if
236   //! - if the value is "free"
237   //! - in the case of incomplete computation : collapse,
238   //! infinite sliding, height of batten will be negative at end points
239   Standard_EXPORT Standard_Real Compute (const Standard_Real D, const Standard_Real A) const;
240
241
242   FairCurve_AnalysisCode myCode;
243   gp_Pnt2d OldP1;
244   gp_Pnt2d OldP2;
245   Standard_Real OldAngle1;
246   Standard_Real OldAngle2;
247   Standard_Real OldHeight;
248   Standard_Real OldSlope;
249   Standard_Real OldSlidingFactor;
250   Standard_Boolean OldFreeSliding;
251   Standard_Integer OldConstraintOrder1;
252   Standard_Integer OldConstraintOrder2;
253   gp_Pnt2d NewP1;
254   gp_Pnt2d NewP2;
255   Standard_Real NewAngle1;
256   Standard_Real NewAngle2;
257   Standard_Real NewHeight;
258   Standard_Real NewSlope;
259   Standard_Real NewSlidingFactor;
260   Standard_Boolean NewFreeSliding;
261   Standard_Integer NewConstraintOrder1;
262   Standard_Integer NewConstraintOrder2;
263   Standard_Integer Degree;
264   Handle(TColgp_HArray1OfPnt2d) Poles;
265   Handle(TColStd_HArray1OfReal) Flatknots;
266   Handle(TColStd_HArray1OfReal) Knots;
267   Handle(TColStd_HArray1OfInteger) Mults;
268
269
270 private:
271
272   
273   //! compute the curve with respect of the delta-constraints.
274   Standard_EXPORT Standard_Boolean Compute (const gp_Vec2d& DeltaP1, const gp_Vec2d& DeltaP2, const Standard_Real DeltaAngle1, const Standard_Real DeltaAngle2, FairCurve_AnalysisCode& ACode, const Standard_Integer NbIterations, const Standard_Real Tolerance);
275   
276   Standard_EXPORT void Angles (const gp_Pnt2d& P1, const gp_Pnt2d& P2);
277
278
279
280
281 };
282
283
284 #include <FairCurve_Batten.lxx>
285
286
287
288
289
290 #endif // _FairCurve_Batten_HeaderFile