//=======================================================================
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)
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(),