0024624: Lost word in license statement in source files
[occt.git] / src / AppParCurves / AppParCurves_Variational.cdl
1 -- Created on: 1996-05-14
2 -- Created by: Philippe MANGIN / Jeannine PANCIATICI
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 --              Igor  FEOKTISTOV  -  correction  14/12/98
18
19
20 generic class Variational from AppParCurves                 
21                     (MultiLine   as any;
22                      ToolLine    as any)   -- as ToolLine(MultiLine)
23
24
25     ---Purpose: This class is used to smooth N points with constraints
26     --          by   minimization  of quadratic  criterium   but  also
27     --          variational criterium in order to obtain " fair Curve "
28     --          
29
30 uses Matrix                    from math,
31      Vector                    from math,
32      HArray1OfReal             from TColStd, 
33      Array1OfReal              from TColStd, 
34      HArray1OfInteger          from TColStd,
35      Shape                     from GeomAbs,       
36      HArray1OfConstraintCouple from AppParCurves,
37      MultiBSpCurve             from AppParCurves,  
38      SmoothCriterion           from AppParCurves, 
39      Curve                     from FEmTool,
40      Assembly                  from FEmTool, 
41      Base                      from PLib,
42      Constraint                from AppParCurves
43
44 raises OutOfRange from Standard,
45        DimensionError from Standard,
46        DomainError from Standard,
47        ConstructionError from Standard,
48        NotDone    from StdFail,
49        VectorWithNullMagnitude from gp
50
51     class MyCriterion instantiates LinearCriteria from AppParCurves 
52                 (MultiLine, ToolLine); 
53     
54
55 is
56     Create(SSP: MultiLine; 
57            FirstPoint, LastPoint: Integer;
58            TheConstraints: HArray1OfConstraintCouple;
59            MaxDegree: Integer = 14;
60            MaxSegment: Integer = 100;
61            Continuity : Shape from GeomAbs = GeomAbs_C2;
62            WithMinMax : Boolean = Standard_False;
63            WithCutting: Boolean = Standard_True;
64            Tolerance : Real = 1.0;
65            NbIterations: Integer = 2)
66         ---Purpose: Constructor.   
67         --            Initialization of   the   fields.
68         --            warning :  Nc0 : number of PassagePoint consraints
69         --                       Nc2 : number  of  TangencyPoint constraints 
70         --                       Nc3 : number of    CurvaturePoint   constraints
71         --            if
72         --            ((MaxDegree-Continuity)*MaxSegment -Nc0  - 2*Nc1
73         --             -3*Nc2)
74         --            is  negative 
75         --            The problem is over-constrained.
76         --            
77         --            Limitation : The MultiLine has to be composed by
78         --            only one Line ( Dimension 2 or 3).
79            
80     returns Variational from AppParCurves;
81     
82
83     Approximate(me : in out)
84       ---Purpose: Makes the approximation with the current fields.
85     raises NotDone from StdFail
86     is static;
87     
88
89     
90 --   ====================  The Selectors  =========================== 
91
92     IsCreated(me)
93         ---Purpose: returns True if the creation is done    
94         --          and correspond  to the current fields.
95     returns Boolean
96     is static;
97
98  
99     IsDone(me)
100         ---Purpose: returns True if the  approximation is ok    
101         --          and correspond  to the current fields.
102     returns Boolean
103     is static;
104     
105     IsOverConstrained(me)
106         ---Purpose: returns True if the problem is overconstrained
107         --          in this case, approximation cannot be done.
108     returns Boolean
109     is static;
110     
111     Value(me)
112         ---Purpose: returns all the BSpline curves approximating the
113         --          MultiLine SSP after minimization of the parameter.
114
115     returns MultiBSpCurve from AppParCurves
116     raises NotDone from StdFail
117     is static;
118     
119     
120     MaxError(me)
121         ---Purpose: returns the maximum of the distances between 
122         --          the points of the multiline and the approximation 
123         --          curves.  
124     returns Real 
125     raises NotDone from StdFail
126     is static;
127     
128     MaxErrorIndex(me)
129         ---Purpose: returns the index of the MultiPoint of ErrorMax  
130     returns Integer 
131     
132     raises NotDone from StdFail
133     is static;
134
135     
136     QuadraticError(me)
137         ---Purpose: returns the quadratic average of the distances between 
138         --          the points of the multiline and the approximation 
139         --          curves.
140     returns Real
141     raises NotDone from StdFail
142         is static;
143     
144     Distance(me : in out ; mat : out Matrix from math)    
145         ---Purpose: returns the distances between the points of the 
146         --          multiline and the approximation curves.
147     raises NotDone from StdFail
148     is static;
149     
150     AverageError(me)
151        ---Purpose: returns the average error between          
152        --          the MultiLine and the approximation.
153
154     returns Real
155     raises NotDone from StdFail
156     is static;
157     
158     Parameters(me)   
159         ---Purpose: returns the parameters uses to the approximations
160         ---C++: return const&
161
162     returns HArray1OfReal
163     raises NotDone from StdFail
164     is static;
165     
166     Knots(me)   
167         ---Purpose: returns the knots uses to the approximations
168         ---C++: return const&
169     returns HArray1OfReal
170     raises NotDone from StdFail
171     is static;
172     
173     Criterium(me; VFirstOrder,  
174                   VSecondOrder,  
175                   VThirdOrder : out Real) 
176     ---Purpose: returns the values of the quality criterium.      
177     raises NotDone from StdFail
178     is static;
179     
180     CriteriumWeight(me ; 
181                     Percent1,  Percent2, Percent3 : out Real)
182     ---Purpose: returns the Weights (as percent) associed  to the criterium used in
183     --          the  optimization.
184     is static;          
185     
186     MaxDegree(me)   
187     ---Purpose: returns the Maximum Degree used in the approximation 
188     returns Integer
189     is static;
190     
191     MaxSegment(me)
192      ---Purpose: returns the Maximum of segment used in the approximation 
193     returns Integer
194     is static;   
195     
196     Continuity(me)
197     ---Purpose: returns the Continuity used in the approximation 
198     returns Shape from GeomAbs
199     is static;   
200     
201     
202     WithMinMax(me)
203     ---Purpose: returns if the  approximation  search to  minimize the
204     --          maximum Error or not.
205     returns Boolean
206     is static;   
207     
208     WithCutting(me)
209     ---Purpose: returns if the  approximation can insert new Knots or not.
210     returns Boolean
211     is static;  
212
213     Tolerance(me)
214     ---Purpose: returns the tolerance used in the approximation.
215     returns Real
216     is static;
217     
218     NbIterations(me)  
219     ---Purpose: returns the number of iterations used in the approximation.
220     returns Integer
221     is static;
222     
223     Dump(me ; o : in out OStream)
224         ---Purpose: Prints on the stream o information on the current state 
225         --          of the object.
226         --          MaxError,MaxErrorIndex,AverageError,QuadraticError,Criterium
227         --          Distances,Degre,Nombre de poles, parametres, noeuds    
228     is static;
229
230     SetConstraints(me:in out; aConstrainst:HArray1OfConstraintCouple) 
231         ---Purpose: Define the constraints to approximate
232     --          If this value is incompatible with the others fields
233     --          this method modify nothing and returns false 
234     returns Boolean
235     is static;
236     
237     SetParameters(me:in out; param : HArray1OfReal)   
238         ---Purpose: Defines the parameters used by the approximations.  
239     raises DimensionError
240     is static;
241     
242     SetKnots(me:in out; knots : HArray1OfReal)   
243         ---Purpose: Defines the knots used by the approximations
244     --          If this value is incompatible with the others fields
245     --          this method modify nothing and returns false 
246     returns Boolean
247     raises DimensionError,
248            DomainError
249     is static;
250         
251     SetMaxDegree(me: in out; Degree : Integer)   
252     ---Purpose: Define the Maximum Degree used in the approximation
253     --          If this value is incompatible with the others fields
254     --          this method modify nothing and returns false 
255     returns Boolean
256     is static;
257     
258     SetMaxSegment(me: in out;  NbSegment : Integer)   
259     ---Purpose: Define the maximum number of segments used in the approximation
260     --          If this value is incompatible with the others fields
261     --          this method modify nothing and returns false 
262     returns Boolean
263     is static;   
264     
265     SetContinuity(me: in out; C : Shape from GeomAbs)
266     ---Purpose: Define the Continuity used in the approximation 
267     --          If this value is incompatible with the others fields
268     --          this method modify nothing and returns false 
269     returns Boolean         
270     raises ConstructionError from Standard
271     is static;   
272     
273     
274     SetWithMinMax(me: in out; MinMax : Boolean)
275     ---Purpose: Define if the  approximation  search to  minimize the
276     --          maximum Error or not.
277     is static;   
278     
279     SetWithCutting(me : in out; Cutting : Boolean )
280     ---Purpose: Define if the  approximation can insert new Knots or not.
281     --          If this value is incompatible with the others fields
282     --          this method modify nothing and returns false 
283     returns Boolean
284     is static;  
285
286     SetCriteriumWeight(me : in out; 
287                        Percent1,  Percent2, Percent3 : Real)
288     ---Purpose: define the Weights (as percent) associed to the criterium used in
289     --          the  optimization.
290     --          
291     raises DomainError -- if Percent <= 0
292     is static;                  
293                                                                         
294     SetCriteriumWeight(me : in out; 
295                        Order : Integer;
296                        Percent : Real)
297     ---Purpose: define the  Weight   (as  percent)  associed  to   the
298     --          criterium   Order used in   the optimization  : Others
299     --          weights are updated.           
300     raises DomainError,  -- if Percent < 0
301            OutOfRange   -- if Order < 1 or Order > 3     
302     is static;
303   
304     SetTolerance(me:in out; Tol : Real)
305     ---Purpose: define the tolerance used in the approximation.
306     is static;
307     
308     SetNbIterations(me:in out; Iter : Integer)  
309     ---Purpose: define the number of iterations used in the approximation.
310     raises DomainError  -- if Iter < 1
311     is static; 
312
313       
314 --   ====================== The Private methods ======================   
315        
316     TheMotor(me  :  in  out; 
317              J  :  in  out SmoothCriterion from AppParCurves; 
318              WQuadratic,  WQuality  :  Real;          
319              TheCurve : in  out  Curve from  FEmTool; 
320              Ecarts : out  Array1OfReal  from  TColStd)  is  private; 
321
322     Adjusting(me  :  in  out; 
323               J  :  in  out SmoothCriterion from AppParCurves; 
324               WQuadratic,  WQuality  :  in  out  Real;                
325               TheCurve : in  out  Curve from  FEmTool; 
326               Ecarts : out  Array1OfReal  from  TColStd)  is  private; 
327       
328     Optimization(me;   
329                  J  :  in  out SmoothCriterion from AppParCurves; 
330                  A  :  in  out Assembly  from  FEmTool; 
331                  ToAssemble  : in  Boolean;      
332                  EpsDeg  :  Real; 
333                  Curve  :  out  Curve  from  FEmTool; 
334                  Parameters  :  Array1OfReal  from  TColStd)  is  private;    
335
336     Project(me;  C  :  Curve from  FEmTool;   
337                  Ti  :  Array1OfReal  from  TColStd; 
338                  ProjTi    :  out  Array1OfReal from  TColStd;  
339                  Distance  :  out  Array1OfReal from  TColStd; 
340                  NumPoints  :  out  Integer; 
341                  MaxErr,  QuaErr,  AveErr  :  out  Real; 
342                  NbIterations: Integer=2)  is  private; 
343
344     ACR(me;  Curve : in  out  Curve from  FEmTool; 
345              Ti    : in  out  Array1OfReal from  TColStd; 
346              Decima: Integer)  is  private; 
347
348     SplitCurve(me;  InCurve :  Curve from  FEmTool; 
349                     Ti      :  Array1OfReal from  TColStd;  
350                     CurveTol:  Real;
351                     OutCurve:  out Curve from  FEmTool; 
352                     iscut   :  out Boolean)  is  private; 
353                                      
354     Init(me : in out) 
355     raises NotDone from StdFail,
356            ConstructionError from Standard,
357            DimensionError from Standard
358     is private; 
359      
360     InitSmoothCriterion(me  :  in  out)   
361     is  private; 
362      
363     InitParameters(me  :  in  out;  Length  :  out  Real) 
364     raises  ConstructionError from Standard
365     is  private; 
366        
367     InitCriterionEstimations(me;  Length  :  Real;  J1,  J2,  J3  :  out  Real) 
368     is  private; 
369      
370     EstTangent(me;  ipnt  :  Integer;  VTang  :  out  Vector  from  math) 
371     is  private;
372  
373     EstSecnd(me;  ipnt  :  Integer;  VTang1,  VTang2  :  Vector  from  math; 
374                   Length  :  Real;  VScnd  :  out  Vector  from  math) 
375     is  private;
376  
377     InitCutting(me;  aBase  :  Base  from  PLib; CurvTol  :  Real;  
378                      aCurve  :  out  Curve   from  FEmTool) 
379     raises  ConstructionError from Standard
380     is  private;  
381      
382     AssemblingConstraints(me;  Curve  :  Curve  from  FEmTool; 
383                               Parameters  :  Array1OfReal  from  TColStd; 
384                               CBLONG  :  Real  from  Standard; 
385                               A  :  out  Assembly  from  FEmTool) 
386     is  private;  
387     
388     InitTthetaF(me : in out;  ndimen  :  Integer  from  Standard;
389                               typcon  :  Constraint  from  AppParCurves;
390                               begin   :  Integer  from  Standard; 
391                               jndex   :  Integer  from  Standard)
392     returns  Boolean
393     is  private;
394                               
395
396 fields
397      -- Description of the points to smooth and the constraints
398 mySSP  :  MultiLine;
399 myNbP3d  : Integer;
400 myNbP2d : Integer;
401 myDimension : Integer;
402 myFirstPoint : Integer;
403 myLastPoint : Integer;
404 myNbPoints : Integer;
405 myTabPoints : HArray1OfReal;
406 myConstraints : HArray1OfConstraintCouple;
407 myNbConstraints : Integer;
408 myTabConstraints : HArray1OfReal;
409 myNbPassPoints : Integer;
410 myNbTangPoints : Integer;
411 myNbCurvPoints : Integer;
412 myTypConstraints : HArray1OfInteger; 
413 myTtheta  :  HArray1OfReal; 
414 myTfthet  :  HArray1OfReal;
415
416      -- Context parameters
417 myMaxDegree  : Integer;
418 myMaxSegment : Integer;
419 myNbIterations: Integer;
420 myTolerance : Real; 
421
422      -- Options
423 myContinuity : Shape from GeomAbs;
424 myNivCont : Integer;
425 myWithMinMax : Boolean;
426 myWithCutting: Boolean;
427 myPercent    : Real[3];
428 myCriterium  : Real[4]; 
429 mySmoothCriterion  :  SmoothCriterion  from  AppParCurves; 
430
431      -- output
432 myParameters  : HArray1OfReal;
433 myKnots      : HArray1OfReal;
434 myMBSpCurve  : MultiBSpCurve;
435
436 myMaxError     : Real;
437 myMaxErrorIndex: Integer;
438 myAverageError : Real;
439 myIsCreated      : Boolean;
440 myIsDone         : Boolean;
441 myIsOverConstr : Boolean;
442
443 end Variational;