1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

Correct angular tolerance in BRepOffset_Analyse and change DefineConnectType function accordingly the newest version

This commit is contained in:
akaftasev
2020-05-12 22:58:17 +03:00
parent eb2fcaa940
commit 2f7f720226

View File

@@ -48,7 +48,10 @@
#include <BRepAdaptor_Surface.hxx>
#include <Adaptor3d_Surface.hxx>
//
static void Correct2dPoint(const Adaptor3d_Surface& theS, gp_Pnt2d& theP2d);
static void Correct2dPoint(const TopoDS_Face& theF, gp_Pnt2d& theP2d);
//
static Standard_Real IntermediatePoint(const Standard_Real aFirst,
const Standard_Real aLast);
//
static BRepOffset_Type DefineConnectType(const TopoDS_Edge& E,
const TopoDS_Face& F1,
@@ -173,7 +176,7 @@ void BRepOffset_Analyse::Perform (const TopoDS_Shape& S,
myShape = S;
angle = Angle;
Standard_Real SinTol = Sin(Angle);
Standard_Real SinTol = Abs(Sin(Angle));
// Build ancestors.
BuildAncestors (S,ancestors);
@@ -486,42 +489,60 @@ void BRepOffset_Analyse::AddFaces (const TopoDS_Face& Face,
//function : Correct2dPoint
//purpose :
//=======================================================================
void Correct2dPoint(const Adaptor3d_Surface& theS, gp_Pnt2d& theP2d)
void Correct2dPoint(const TopoDS_Face& theF, gp_Pnt2d& theP2d)
{
BRepAdaptor_Surface aBAS(theF, Standard_False);
if (aBAS.GetType() < GeomAbs_BezierSurface) {
return;
}
//
const Standard_Real coeff = 0.01;
Standard_Real eps;
Standard_Real u1, u2, v1, v2;
if(theS.GetType() >= GeomAbs_BezierSurface)
//
aBAS.Initialize(theF, Standard_True);
u1 = aBAS.FirstUParameter();
u2 = aBAS.LastUParameter();
v1 = aBAS.FirstVParameter();
v2 = aBAS.LastVParameter();
if (!(Precision::IsInfinite(u1) || Precision::IsInfinite(u2)))
{
u1 = theS.FirstUParameter();
u2 = theS.LastUParameter();
v1 = theS.FirstVParameter();
v2 = theS.LastVParameter();
if(!(Precision::IsInfinite(u1) || Precision::IsInfinite(u2)))
eps = Max(coeff*(u2 - u1), Precision::PConfusion());
if (Abs(theP2d.X() - u1) < eps)
{
eps = Max(coeff*(u2-u1), Precision::PConfusion());
if(Abs(theP2d.X()-u1) < eps)
{
theP2d.SetX(u1 + eps);
}
if(Abs(theP2d.X()-u2) < eps)
{
theP2d.SetX(u2 - eps);
}
theP2d.SetX(u1 + eps);
}
if(!(Precision::IsInfinite(v1) || Precision::IsInfinite(v2)))
if (Abs(theP2d.X() - u2) < eps)
{
eps = Max(coeff*(v2-v1), Precision::PConfusion());
if(Abs(theP2d.Y()-v1) < eps)
{
theP2d.SetY(v1 + eps);
}
if(Abs(theP2d.Y()-v2) < eps)
{
theP2d.SetY(v2 - eps);
}
theP2d.SetX(u2 - eps);
}
}
if (!(Precision::IsInfinite(v1) || Precision::IsInfinite(v2)))
{
eps = Max(coeff*(v2 - v1), Precision::PConfusion());
if (Abs(theP2d.Y() - v1) < eps)
{
theP2d.SetY(v1 + eps);
}
if (Abs(theP2d.Y() - v2) < eps)
{
theP2d.SetY(v2 - eps);
}
}
}
//=======================================================================
//function : IntermediatePoint
//purpose :
//=======================================================================
Standard_Real IntermediatePoint(const Standard_Real aFirst,
const Standard_Real aLast)
{
//define parameter division number as 10*e^(-M_PI) = 0.43213918
const Standard_Real PAR_T = 0.43213918;
Standard_Real aParm;
aParm = (1. - PAR_T)*aFirst + PAR_T*aLast;
return aParm;
}
//=======================================================================
@@ -534,75 +555,86 @@ BRepOffset_Type DefineConnectType(const TopoDS_Edge& E,
const Standard_Real SinTol,
const Standard_Boolean CorrectPoint)
{
TopLoc_Location L;
Standard_Real f,l;
BRepAdaptor_Surface S1(F1), S2(F2);
Handle (Geom2d_Curve) C1 = BRep_Tool::CurveOnSurface(E,F1,f,l);
Handle (Geom2d_Curve) C2 = BRep_Tool::CurveOnSurface(E,F2,f,l);
const Handle(Geom_Surface)& S1 = BRep_Tool::Surface(F1);
const Handle(Geom_Surface)& S2 = BRep_Tool::Surface(F2);
//
Standard_Real f, l;
Handle(Geom2d_Curve) C1 = BRep_Tool::CurveOnSurface(E, F1, f, l);
//For the case of seam edge
TopoDS_Edge EE = E;
if (F1.IsSame(F2))
EE.Reverse();
Handle(Geom2d_Curve) C2 = BRep_Tool::CurveOnSurface(EE, F2, f, l);
if (C1.IsNull() || C2.IsNull())
return BRepOffset_Other;
BRepAdaptor_Curve C(E);
f = C.FirstParameter();
l = C.LastParameter();
//
Standard_Real ParOnC = 0.5*(f+l);
gp_Vec T1 = C.DN(ParOnC,1).Transformed(L.Transformation());
//
Standard_Real ParOnC = 0.5*(f + l);
gp_Vec T1 = C.DN(ParOnC, 1);
if (T1.SquareMagnitude() <= gp::Resolution())
{
ParOnC = IntermediatePoint(f, l);
T1 = C.DN(ParOnC, 1);
}
if (T1.SquareMagnitude() > gp::Resolution()) {
T1.Normalize();
}
if (BRepOffset_Tool::OriEdgeInFace(E,F1) == TopAbs_REVERSED) {
if (BRepOffset_Tool::OriEdgeInFace(E, F1) == TopAbs_REVERSED) {
T1.Reverse();
}
if (F1.Orientation() == TopAbs_REVERSED) T1.Reverse();
gp_Pnt2d P = C1->Value(ParOnC);
gp_Pnt2d P = C1->Value(ParOnC);
gp_Pnt P3;
gp_Vec D1U,D1V;
if(CorrectPoint)
Correct2dPoint(S1, P);
gp_Vec D1U, D1V;
if (CorrectPoint)
Correct2dPoint(F1, P);
//
S1.D1(P.X(),P.Y(),P3,D1U,D1V);
S1->D1(P.X(), P.Y(), P3, D1U, D1V);
gp_Vec DN1(D1U^D1V);
if (F1.Orientation() == TopAbs_REVERSED) DN1.Reverse();
P = C2->Value(ParOnC);
if(CorrectPoint)
Correct2dPoint(S2, P);
S2.D1(P.X(),P.Y(),P3,D1U,D1V);
if (CorrectPoint)
Correct2dPoint(F2, P);
S2->D1(P.X(), P.Y(), P3, D1U, D1V);
gp_Vec DN2(D1U^D1V);
if (F2.Orientation() == TopAbs_REVERSED) DN2.Reverse();
DN1.Normalize();
DN2.Normalize();
gp_Vec ProVec = DN1^DN2;
Standard_Real NormProVec = ProVec.Magnitude();
gp_Vec ProVec = DN1^DN2;
Standard_Real NormProVec = ProVec.Magnitude();
if (Abs(NormProVec) < SinTol) {
if (NormProVec < SinTol) {
// plane
if (DN1.Dot(DN2) > 0) {
if (DN1.Dot(DN2) > 0) {
//Tangent
return BRepOffset_Tangent;
}
else {
else {
//Mixed not finished!
#ifdef OCCT_DEBUG
cout <<" faces locally mixed"<<endl;
std::cout << " faces locally mixed" << std::endl;
#endif
return BRepOffset_Convex;
}
}
else {
else {
if (NormProVec > gp::Resolution())
ProVec.Normalize();
Standard_Real Prod = T1.Dot(DN1^DN2);
if (Prod > 0.) {
ProVec /= NormProVec;
Standard_Real Prod = T1.Dot(ProVec);
if (Prod > 0.) {
//
return BRepOffset_Convex;
}
else {
else {
//reenters
return BRepOffset_Concave;
}