0028828: Modeling Algorithms - New functionalities of BRepFilletAPI_MakeChamfer algorithm
[occt.git] / src / ChFiKPart / ChFiKPart_ComputeData_ChPlnPln.cxx
index 9c83f27..ec66eb3 100644 (file)
 //=======================================================================
 Standard_Boolean ChFiKPart_MakeChamfer(TopOpeBRepDS_DataStructure& DStr,
                                       const Handle(ChFiDS_SurfData)& Data, 
+                                       const ChFiDS_ChamfMode theMode,
                                       const gp_Pln& Pl1, 
                                       const gp_Pln& Pl2, 
                                       const TopAbs_Orientation Or1,
                                       const TopAbs_Orientation Or2,
-                                      const Standard_Real Dis1, 
-                                      const Standard_Real Dis2, 
+                                      const Standard_Real theDis1, 
+                                      const Standard_Real theDis2, 
                                       const gp_Lin& Spine, 
                                       const Standard_Real First, 
                                       const TopAbs_Orientation Of1)
@@ -95,6 +96,24 @@ Standard_Boolean ChFiKPart_MakeChamfer(TopOpeBRepDS_DataStructure& DStr,
   if ( VecTransl2.Dot(D1) <=0. )
     VecTransl2.Reverse();
 
+  Standard_Real Dis1 = theDis1, Dis2 = theDis2;
+  Standard_Real Alpha = VecTransl1.Angle(VecTransl2);
+  Standard_Real CosHalfAlpha = Cos(Alpha/2);
+  if (theMode == ChFiDS_ConstThroatChamfer)
+    Dis1 = Dis2 = theDis1 / CosHalfAlpha;
+  else if (theMode == ChFiDS_ConstThroatWithPenetrationChamfer)
+  {
+    Standard_Real aDis1 = Min(theDis1, theDis2);
+    Standard_Real aDis2 = Max(theDis1, theDis2);
+    Standard_Real dis1dis1 = aDis1*aDis1, dis2dis2 = aDis2*aDis2;
+    Standard_Real SinAlpha = Sin(Alpha);
+    Standard_Real CosAlpha = Cos(Alpha);
+    Standard_Real CotanAlpha = CosAlpha/SinAlpha;
+    Dis1 = sqrt(dis2dis2 - dis1dis1) - aDis1*CotanAlpha;
+    Standard_Real CosBeta = sqrt(1-dis1dis1/dis2dis2)*CosAlpha + aDis1/aDis2*SinAlpha;
+    Standard_Real FullDist1 = aDis2/CosBeta;
+    Dis2 = FullDist1 - aDis1/SinAlpha;
+  }
 
     // Compute a point on the plane Pl1 and on the chamfer
   gp_Pnt P1( P.X()+Dis1*VecTransl1.X(),