38ad2173333c9334733d8e91a985a6b0cc3a2d3c
[occt.git] / src / ChFi2d / ChFi2d_ChamferAPI.cxx
1 // Copyright (c) 1999-2012 OPEN CASCADE SAS
2 //
3 // The content of this file is subject to the Open CASCADE Technology Public
4 // License Version 6.5 (the "License"). You may not use the content of this file
5 // except in compliance with the License. Please obtain a copy of the License
6 // at http://www.opencascade.org and read it completely before using this file.
7 //
8 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
9 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
10 //
11 // The Original Code and all software distributed under the License is
12 // distributed on an "AS IS" basis, without warranty of any kind, and the
13 // Initial Developer hereby disclaims all such warranties, including without
14 // limitation, any warranties of merchantability, fitness for a particular
15 // purpose or non-infringement. Please see the License for the specific terms
16 // and conditions governing the rights and limitations under the License.
17
18 #include <ChFi2d_ChamferAPI.hxx>
19
20 #include <Precision.hxx>
21 #include <gp_Pnt.hxx>
22 #include <GC_MakeLine.hxx>
23 #include <BRep_Tool.hxx>
24 #include <BRepBuilderAPI_MakeEdge.hxx>
25 #include <TopoDS_Iterator.hxx>
26 #include <TopoDS.hxx>
27
28 // An empty constructor.
29 ChFi2d_ChamferAPI::ChFi2d_ChamferAPI()
30 {
31
32 }
33
34 // A constructor accepting a wire consisting of two linear edges.
35 ChFi2d_ChamferAPI::ChFi2d_ChamferAPI(const TopoDS_Wire& theWire)
36 {
37   Init(theWire);
38 }
39
40 // A constructor accepting two linear edges.
41 ChFi2d_ChamferAPI::ChFi2d_ChamferAPI(const TopoDS_Edge& theEdge1, const TopoDS_Edge& theEdge2)
42 {
43   Init(theEdge1, theEdge2);
44 }
45
46 // Initializes the class by a wire consisting of two libear edges.
47 void ChFi2d_ChamferAPI::Init(const TopoDS_Wire& theWire)
48 {
49   TopoDS_Edge E1, E2;
50   TopoDS_Iterator itr(theWire);
51   for (; itr.More(); itr.Next())
52   {
53     if (E1.IsNull())
54       E1 = TopoDS::Edge(itr.Value());
55     else if (E2.IsNull())
56       E2 = TopoDS::Edge(itr.Value());
57     else
58       break;
59   }
60   Init(E1, E2);
61 }
62
63 // Initializes the class by two linear edges.
64 void ChFi2d_ChamferAPI::Init(const TopoDS_Edge& theEdge1, const TopoDS_Edge& theEdge2)
65 {
66   myEdge1 = theEdge1;
67   myEdge2 = theEdge2;
68 }
69
70 // Constructs a chamfer edge.
71 // Returns true if the edge is constructed.
72 Standard_Boolean ChFi2d_ChamferAPI::Perform()
73 {
74   myCurve1 = BRep_Tool::Curve(myEdge1, myStart1, myEnd1);
75   myCurve2 = BRep_Tool::Curve(myEdge2, myStart2, myEnd2);
76   // searching for common points
77   if (myCurve1->Value(myStart1).IsEqual(myCurve2->Value(myEnd2), Precision::Confusion())) 
78   {
79     myCommonStart1 = true;
80     myCommonStart2 = false;
81   } 
82   else 
83   {
84     if (myCurve1->Value(myEnd1).IsEqual(myCurve2->Value(myStart2), Precision::Confusion())) 
85     {
86       myCommonStart1 = false;
87       myCommonStart2 = true;
88     } 
89     else
90     {
91       if (myCurve1->Value(myEnd1).IsEqual(myCurve2->Value(myEnd2), Precision::Confusion())) 
92       {
93         myCommonStart1 = false;
94         myCommonStart2 = false;
95       } 
96       else 
97       {
98         myCommonStart1 = true;
99         myCommonStart2 = true;
100       }
101     }
102   }
103   return Standard_True;
104 }
105
106 // Returns the result (chamfer edge, modified edge1, modified edge2).
107 TopoDS_Edge ChFi2d_ChamferAPI::Result(TopoDS_Edge& theEdge1, TopoDS_Edge& theEdge2,
108                                       const Standard_Real theLength1, const Standard_Real theLength2) 
109 {
110   TopoDS_Edge aResult;
111   if (Abs(myEnd1 - myStart1) < theLength1) 
112     return aResult;
113   if (Abs(myEnd2 - myStart2) < theLength2) 
114     return aResult;
115
116   Standard_Real aCommon1 = (myCommonStart1?myStart1:myEnd1) + (((myStart1 > myEnd1)^myCommonStart1)?theLength1:-theLength1);
117   Standard_Real aCommon2 = (myCommonStart2?myStart2:myEnd2) + (((myStart2 > myEnd2)^myCommonStart2)?theLength2:-theLength2);
118
119   // make chamfer edge
120   GC_MakeLine aML(myCurve1->Value(aCommon1), myCurve2->Value(aCommon2));
121   BRepBuilderAPI_MakeEdge aBuilder(aML.Value(), myCurve1->Value(aCommon1), myCurve2->Value(aCommon2));
122   aResult = aBuilder.Edge();
123   // divide first edge
124   BRepBuilderAPI_MakeEdge aDivider1(myCurve1, aCommon1, (myCommonStart1?myEnd1:myStart1));
125   theEdge1 = aDivider1.Edge();
126   // divide second edge
127   BRepBuilderAPI_MakeEdge aDivider2(myCurve2, aCommon2, (myCommonStart2?myEnd2:myStart2));
128   theEdge2 = aDivider2.Edge();
129
130   return aResult;
131 }