1 -- Created on: 1992-10-20
2 -- Created by: Remi GILET
3 -- Copyright (c) 1992-1999 Matra Datavision
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.
19         ---Purpose: This class implements the algorithms used to
20         --          create 2d circles tangent to one curve and a
21         --          point/line/circle/curv and with a given radius.
22         --          For each construction methods arguments are:
23         --            - Two Qualified elements for tangency constrains.
24         --            (for example EnclosedCirc if we want the
25         --            solution inside the argument EnclosedCirc).
26         --            - Two Reals. One (Radius) for the radius and the
27         --            other (Tolerance) for the tolerance.
28         --          Tolerance is only used for the limit cases.
29         --          For example :
30         --          We want to create a circle inside a circle C1 and
31         --          inside a curve Cu2 with a radius Radius and a
32         --          tolerance Tolerance.
33         --          If we did not used Tolerance it is impossible to
34         --          find a solution in the the following case : Cu2 is
35         --          inside C1 and there is no intersection point
36         --          between the two elements.
37         --          with Tolerance we will give a solution if the
38         --          lowest distance between C1 and Cu2 is lower than or
39         --          equal Tolerance.
41 -- inherits Entity from Standard
43 uses QualifiedCurve   from Geom2dGcc,
44      Integer          from Standard,
45      Boolean          from Standard,
46      Pnt2d            from gp,
47      Point            from Geom2d,
48      Circ2d           from gp,
49      Array1OfPnt2d    from TColgp,
50      Array1OfCirc2d   from TColgp,
51      Array1OfInteger  from TColStd,
52      Array1OfReal     from TColStd,
55      Position         from GccEnt,
56      Array1OfPosition from GccEnt
58 raises OutOfRange    from Standard,
60        NotDone       from StdFail,
61        NegativeValue from Standard
63 is
65 Create(Qualified1 : QualifiedCurve from Geom2dGcc ;
66        Qualified2 : QualifiedCurve from Geom2dGcc ;
67        Radius     : Real           from Standard  ;
68        Tolerance  : Real           from Standard  )
72 Create(Qualified1 : QualifiedCurve from Geom2dGcc ;
73        Point      : Point          from Geom2d    ;
74        Radius     : Real           from Standard  ;
75        Tolerance  : Real           from Standard  )
79 Create(Point1     : Point          from Geom2d    ;
80        Point2     : Point          from Geom2d    ;
81        Radius     : Real           from Standard  ;
82        Tolerance  : Real           from Standard  )
84 raises NegativeValue;
86         ---Purpose: These constructors create one or more 2D circles of radius Radius either
87         -- -   tangential to the 2 curves Qualified1 and Qualified2,   or
88         -- -   tangential to the curve Qualified1 and passing through the point Point, or
89         -- -   passing through two points Point1 and Point2.
90         -- Tolerance is a tolerance criterion used by the algorithm
91         -- to find a solution when, mathematically, the problem
92         -- posed does not have a solution, but where there is
93         -- numeric uncertainty attached to the arguments.
94         -- For example, take two circles C1 and C2, such that C2
95         -- is inside C1, and almost tangential to C1. There is, in
96         -- fact, no point of intersection between C1 and C2. You
97         -- now want to find a circle of radius R (smaller than the
98         -- radius of C2), which is tangential to C1 and C2, and
99         -- inside these two circles: a pure mathematical resolution
100         -- will not find a solution. This is where the tolerance
101         -- criterion is used: the algorithm considers that C1 and
102         -- C2 are tangential if the shortest distance between these
103         -- two circles is less than or equal to Tolerance. Thus, a
104         -- solution is found by the algorithm.
105         -- Exceptions
106         -- GccEnt_BadQualifier if a qualifier is inconsistent with
107         -- the argument it qualifies (for example, enclosing for a line).
108         -- Standard_NegativeValue if Radius is negative.
111 Results(me   : in out                         ;
112         Circ :        Circ2d2TanRad from GccAna)
113 is static;
115 Results(me   : in out                              ;
116         Circ :        Circ2d2TanRadGeo from Geom2dGcc)
117 is static;
119 IsDone(me) returns Boolean from Standard
120 is static;
121         ---Purpose: This method returns True if the algorithm succeeded.
122         -- Note: IsDone protects against a failure arising from a
123         -- more internal intersection algorithm, which has reached its numeric limits.
125 NbSolutions(me) returns Integer from Standard
126 raises NotDone
127 is static;
128         ---Purpose: This method returns the number of solutions.
129         --          NotDone is raised if the algorithm failed.
130         -- Exceptions
131         -- StdFail_NotDone if the construction fails.
133 ThisSolution(me ; Index : Integer from Standard) returns Circ2d from gp
134 raises OutOfRange, NotDone
135 is static;
136         ---Purpose: Returns the solution number Index and raises OutOfRange
137         -- exception if Index is greater than the number of solutions.
138         -- Be carefull: the Index is only a way to get all the
139         -- solutions, but is not associated to theses outside the context of the algorithm-object.
140         -- Warning
141         -- This indexing simply provides a means of consulting the
142         -- solutions. The index values are not associated with
143         -- these solutions outside the context of the algorithm object.
144         -- Exceptions
145         -- Standard_OutOfRange if Index is less than zero or
146         -- greater than the number of solutions computed by this algorithm.
147         -- StdFail_NotDone if the construction fails.
149 WhichQualifier(me                                  ;
150                Index   :     Integer  from Standard;
151                Qualif1 : out Position from GccEnt  ;
152                Qualif2 : out Position from GccEnt  )
153 raises OutOfRange, NotDone
154 is static;
155         ---Purpose: Returns the qualifiers Qualif1 and Qualif2 of the
156         -- tangency arguments for the solution of index Index
157         -- computed by this algorithm.
158         -- The returned qualifiers are:
159         -- -   those specified at the start of construction when the
160         --   solutions are defined as enclosed, enclosing or
161         --   outside with respect to the arguments, or
162         -- -   those computed during construction (i.e. enclosed,
163         --   enclosing or outside) when the solutions are defined
164         --   as unqualified with respect to the arguments, or
165         -- -   GccEnt_noqualifier if the tangency argument is a point, or
166         -- -   GccEnt_unqualified in certain limit cases where it
167         --   is impossible to qualify the solution as enclosed, enclosing or outside.
168         -- Exceptions
169         -- Standard_OutOfRange if Index is less than zero or
170         -- greater than the number of solutions computed by this algorithm.
171         -- StdFail_NotDone if the construction fails.
173 Tangency1(me                                     ;
174           Index         : Integer   from Standard;
175           ParSol,ParArg : out Real  from Standard;
176           PntSol        : out Pnt2d from gp      )
177 raises OutOfRange, NotDone
178 is static;
179         ---Purpose: Returns informations about the tangency point between the
180         -- result number Index and the first argument.
181         -- ParSol is the intrinsic parameter of the point PntSol on the solution curv.
182         -- ParArg is the intrinsic parameter of the point PntSol on the argument curv.
183         -- OutOfRange is raised if Index is greater than the number of solutions.
184         -- notDone is raised if the construction algorithm did not succeed.
186 Tangency2(me                                     ;
187           Index         : Integer   from Standard;
188           ParSol,ParArg : out Real  from Standard;
189           PntSol        : out Pnt2d from gp      )
190 raises OutOfRange, NotDone
191 is static;
192         ---Purpose: Returns informations about the tangency point between the
193         -- result number Index and the second argument.
194         -- ParSol is the intrinsic parameter of the point PntSol on the solution curv.
195         -- ParArg is the intrinsic parameter of the point PntSol on the argument curv.
196         -- OutOfRange is raised if Index is greater than the number of solutions.
197         -- notDone is raised if the construction algorithm did not succeed.
199 IsTheSame1(me                            ;
200            Index : Integer  from Standard) returns Boolean from Standard
201 raises OutOfRange, NotDone
202 is static;
203         ---Purpose: Returns true if the solution of index Index and,
204         -- respectively, the first or second argument of this
205         -- algorithm are the same (i.e. there are 2 identical circles).
206         -- If Rarg is the radius of the first or second argument,
207         -- Rsol is the radius of the solution and dist is the
208         -- distance between the two centers, we consider the two
209         -- circles to be identical if |Rarg - Rsol| and dist
210         -- are less than or equal to the tolerance criterion given at
211         -- the time of construction of this algorithm.
212         -- OutOfRange is raised if Index is greater than the number of solutions.
213         -- notDone is raised if the construction algorithm did not succeed.
215 IsTheSame2(me                            ;
216            Index : Integer from Standard ) returns Boolean from Standard
217 raises OutOfRange, NotDone
218 is static;
219         ---Purpose: Returns true if the solution of index Index and,
220         -- respectively, the first or second argument of this
221         -- algorithm are the same (i.e. there are 2 identical circles).
222         -- If Rarg is the radius of the first or second argument,
223         -- Rsol is the radius of the solution and dist is the
224         -- distance between the two centers, we consider the two
225         -- circles to be identical if |Rarg - Rsol| and dist
226         -- are less than or equal to the tolerance criterion given at
227         -- the time of construction of this algorithm.
228         -- OutOfRange is raised if Index is greater than the number of solutions.
229         -- notDone is raised if the construction algorithm did not succeed.
231 fields
233     WellDone : Boolean from Standard;
234         ---Purpose: Returns True if the algorithm succeeded.
236     cirsol   : Array1OfCirc2d from TColgp;
237         ---Purpose: TheSolution.
239     NbrSol   : Integer from Standard;
240         ---Purpose: Returns the number of solutions.
242     qualifier1 : Array1OfPosition from GccEnt;
243         ---Purpose: The qualifiers of the first argument.
245     qualifier2 : Array1OfPosition from GccEnt;
246         ---Purpose: The qualifiers of the second argument.
248     TheSame1 : Array1OfInteger from TColStd;
249         ---Purpose: Returns 1 if the solution and the first argument are the same (2 circles).
250         -- if R1 is the radius of the first argument and Rsol the radius
251         -- of the solution and dist the distance between the two centers,
252         -- we concider the two circles are identical if R1+dist-Rsol is less than Tolerance.
253         -- 0 in the other cases.
255     TheSame2 : Array1OfInteger from TColStd;
256         ---Purpose: 1 if the solution and the second argument are the same (2 circles).
257         -- if R2 is the radius of the second argument and Rsol the radius
258         -- of the solution and dist the distance between the two centers,
259         -- we concider the two circles are identical if R2+dist-Rsol is less than Tolerance.
260         -- 0 in the other cases.
262     pnttg1sol   : Array1OfPnt2d from TColgp;
263         ---Purpose: The tangency point between the solution and the first argument on the solution.
265     pnttg2sol   : Array1OfPnt2d from TColgp;
266         ---Purpose: The tangency point between the solution and the second argument on the solution.
268     par1sol   : Array1OfReal from TColStd;
269         ---Purpose: The parameter of the tangency point between the solution and the first argument on the solution.
271     par2sol   : Array1OfReal from TColStd;
272         ---Purpose: The parameter of the tangency point between the solution and the second argument on the solution.
274     pararg1   : Array1OfReal from TColStd;
275         ---Purpose: The parameter of the tangency point between the solution and the first argument on the first argument.
277     pararg2   : Array1OfReal from TColStd;
278         ---Purpose: The parameter of the tangency point between the solution and the second argument on the second argument.
280     Invert   : Boolean from Standard;
282 --    CircAna  : Circ2d2TanRad from GccAna;
283 --    CircGeo  : MyrCirc2d2TanRad from Geom2dGcc;
284 --    TypeAna  : Boolean;