0023987: 2D fillets
[occt.git] / src / ChFi2d / ChFi2d_AnaFilletAlgo.hxx
1 // Created on: 2013-05-20
2 // Created by: Vlad ROMASHKO
3 // Copyright (c) 2003-2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20 #ifndef _ANAFILLETALGO_H_
21 #define _ANAFILLETALGO_H_
22
23 #include <TopoDS_Wire.hxx>
24 #include <TopoDS_Edge.hxx>
25 #include <gp_Pln.hxx>
26
27 //! An analytical algorithm for calculation of the fillets.
28 //! It is implemented for segments and arcs of circle only.
29 class ChFi2d_AnaFilletAlgo
30 {
31 public:
32
33   //! An empty constructor.
34   //! Use the method Init() to initialize the class.
35   Standard_EXPORT ChFi2d_AnaFilletAlgo();
36
37   //! A constructor.
38   //! It expects a wire consisting of two edges of type (any combination of):
39   //! - segment
40   //! - arc of circle.
41   Standard_EXPORT ChFi2d_AnaFilletAlgo(const TopoDS_Wire& theWire, 
42                                        const gp_Pln& thePlane);
43
44   //! A constructor.
45   //! It expects two edges having a common point of type:
46   //! - segment
47   //! - arc of circle.
48   Standard_EXPORT ChFi2d_AnaFilletAlgo(const TopoDS_Edge& theEdge1, 
49                                        const TopoDS_Edge& theEdge2,
50                                        const gp_Pln& thePlane);
51
52   //! Initializes the class by a wire consisting of two edges.
53   Standard_EXPORT void Init(const TopoDS_Wire& theWire, const gp_Pln& thePlane);
54
55   //! Initializes the class by two edges.
56   Standard_EXPORT void Init(const TopoDS_Edge& theEdge1, const TopoDS_Edge& theEdge2, 
57                             const gp_Pln& thePlane);
58
59   //! Calculates a fillet.
60   Standard_EXPORT Standard_Boolean Perform(const Standard_Real radius);
61
62   //! Retrieves a result (fillet and shrinked neighbours).
63   Standard_EXPORT const TopoDS_Edge& Result(TopoDS_Edge& e1, TopoDS_Edge& e2);
64
65 private:
66
67   // WW5 method to compute fillet.
68   // It returns a constructed fillet definition:
69   //     center point (xc, yc)
70   //     point on the 1st segment (xstart, ystart)
71   //     point on the 2nd segment (xend, yend)
72   //     is the arc of fillet clockwise (cw = true) or counterclockwise (cw = false).
73   Standard_Boolean SegmentFilletSegment(const Standard_Real radius, 
74                                         Standard_Real& xc, Standard_Real& yc, 
75                                         Standard_Boolean& cw,
76                                         Standard_Real& start, Standard_Real& end);
77
78   // A function constructs a fillet between a segment and an arc.
79   Standard_Boolean SegmentFilletArc(const Standard_Real radius, 
80                                     Standard_Real& xc, Standard_Real& yc, 
81                                     Standard_Boolean& cw,
82                                     Standard_Real& start, Standard_Real& end, 
83                                     Standard_Real& xend, Standard_Real& yend);
84
85   // A function constructs a fillet between an arc and a segment.
86   Standard_Boolean ArcFilletSegment(const Standard_Real radius, 
87                                     Standard_Real& xc, Standard_Real& yc, 
88                                     Standard_Boolean& cw,
89                                     Standard_Real& start, Standard_Real& end, 
90                                     Standard_Real& xstart, Standard_Real& ystart);
91
92   // WW5 method to compute fillet: arc - arc.
93   // It returns a constructed fillet definition:
94   //     center point (xc, yc)
95   //     shrinking parameter of the 1st circle (start)
96   //     shrinking parameter of the 2nd circle (end)
97   //     if the arc of fillet clockwise (cw = true) or counterclockwise (cw = false).
98   Standard_Boolean ArcFilletArc(const Standard_Real radius, 
99                                 Standard_Real& xc, Standard_Real& yc, 
100                                 Standard_Boolean& cw,
101                                 Standard_Real& start, Standard_Real& end);
102
103   // Cuts intersecting edges of a contour.
104   Standard_Boolean Cut(const gp_Pln& plane, TopoDS_Edge& e1, TopoDS_Edge& e2);
105
106   // Plane.
107   gp_Pln           plane;
108
109   // Left neighbour.
110   TopoDS_Edge      e1;
111   Standard_Boolean segment1;
112   Standard_Real    x11;
113   Standard_Real    y11;
114   Standard_Real    x12;
115   Standard_Real    y12;
116   Standard_Real    xc1;
117   Standard_Real    yc1;
118   Standard_Real    radius1;
119   Standard_Boolean cw1;
120
121   // Right neighbour.
122   TopoDS_Edge      e2;
123   Standard_Boolean segment2;
124   Standard_Real    x21;
125   Standard_Real    y21;
126   Standard_Real    x22;
127   Standard_Real    y22;
128   Standard_Real    xc2;
129   Standard_Real    yc2;
130   Standard_Real    radius2;
131   Standard_Boolean cw2;
132
133   // Fillet (result).
134   TopoDS_Edge fillet;
135   TopoDS_Edge shrinke1;
136   TopoDS_Edge shrinke2;
137 };
138
139 #endif // _ANAFILLETALGO_H_