mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-14 13:30:48 +03:00
Patch of issue #26718: Big tolerance value of the edge in the result of Genral Fuse operation
This commit is contained in:
@@ -74,6 +74,8 @@ void AppCont_LeastSquare::FixSingleBorderPoint(const AppCont_Function& the
|
|||||||
aPrevP = aTabP;
|
aPrevP = aTabP;
|
||||||
aPrevP2d = aTabP2d;
|
aPrevP2d = aTabP2d;
|
||||||
aPrevDist = aCurrDist;
|
aPrevDist = aCurrDist;
|
||||||
|
if(aCurrDist == 0.0)//protection of the division by 0 in the next iteration.
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
theFix2d = aPrevP2d;
|
theFix2d = aPrevP2d;
|
||||||
theFix = aPrevP;
|
theFix = aPrevP;
|
||||||
|
@@ -54,6 +54,12 @@ static
|
|||||||
static
|
static
|
||||||
Standard_Boolean IsClosed(const TopoDS_Edge& ,
|
Standard_Boolean IsClosed(const TopoDS_Edge& ,
|
||||||
const TopoDS_Face& );
|
const TopoDS_Face& );
|
||||||
|
static
|
||||||
|
Standard_Real ComputeTol(const TopoDS_Edge& theE,
|
||||||
|
const Standard_Real theFirst,
|
||||||
|
const Standard_Real theLast,
|
||||||
|
const Handle(Geom2d_Curve)& theC,
|
||||||
|
const TopoDS_Face& theF);
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@@ -68,7 +74,7 @@ Standard_Integer BOPTools_AlgoTools2D::AttachExistingPCurve
|
|||||||
{
|
{
|
||||||
Standard_Boolean bIsToReverse, bIsClosed;
|
Standard_Boolean bIsToReverse, bIsClosed;
|
||||||
Standard_Integer iRet;
|
Standard_Integer iRet;
|
||||||
Standard_Real aTol, aT11, aT12, aT21, aT22, aTolPPC;
|
Standard_Real aTol, aTolSP, aT11, aT12, aT21, aT22, aTolPPC;
|
||||||
Handle(Geom2d_Curve) aC2Dold, aC2DoldC;
|
Handle(Geom2d_Curve) aC2Dold, aC2DoldC;
|
||||||
Handle(Geom2d_TrimmedCurve) aC2DT;
|
Handle(Geom2d_TrimmedCurve) aC2DT;
|
||||||
BRep_Builder aBB;
|
BRep_Builder aBB;
|
||||||
@@ -97,13 +103,10 @@ Standard_Integer BOPTools_AlgoTools2D::AttachExistingPCurve
|
|||||||
//
|
//
|
||||||
aC2DT=new Geom2d_TrimmedCurve(aC2DoldC, aT21, aT22);
|
aC2DT=new Geom2d_TrimmedCurve(aC2DoldC, aT21, aT22);
|
||||||
//
|
//
|
||||||
aTol=BRep_Tool::Tolerance(aE1);
|
|
||||||
BRep_Tool::Range (aE1, aT11, aT12);
|
|
||||||
aBB.SameRange(aE1, Standard_False);
|
|
||||||
aBB.SameParameter(aE1, Standard_False);
|
|
||||||
|
|
||||||
aTolPPC=Precision::PConfusion();
|
aTolPPC=Precision::PConfusion();
|
||||||
//
|
//
|
||||||
|
BRep_Tool::Range (aE1, aT11, aT12);
|
||||||
|
//
|
||||||
GeomLib::SameRange(aTolPPC, aC2DT, aT21, aT22, aT11, aT12, aC2DT);
|
GeomLib::SameRange(aTolPPC, aC2DT, aT21, aT22, aT11, aT12, aC2DT);
|
||||||
//
|
//
|
||||||
if (aC2DT.IsNull()){
|
if (aC2DT.IsNull()){
|
||||||
@@ -111,6 +114,19 @@ Standard_Integer BOPTools_AlgoTools2D::AttachExistingPCurve
|
|||||||
return iRet;
|
return iRet;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
|
// check the curves on same parameter to prevent
|
||||||
|
// big tolerance increasing
|
||||||
|
aTol = BRep_Tool::Tolerance(aE1);
|
||||||
|
aTolSP = ComputeTol(aE1, aT11, aT12, aC2DT, aF);
|
||||||
|
//
|
||||||
|
if ((aTolSP > 10.*aTol) && aTolSP > 0.1) {
|
||||||
|
iRet = 3;
|
||||||
|
return iRet;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
aBB.SameRange(aE1, Standard_False);
|
||||||
|
aBB.SameParameter(aE1, Standard_False);
|
||||||
|
//
|
||||||
aBB.UpdateEdge(aE1, aC2DT, aF, aTol);
|
aBB.UpdateEdge(aE1, aC2DT, aF, aTol);
|
||||||
BRepLib::SameParameter(aE1);
|
BRepLib::SameParameter(aE1);
|
||||||
BRepLib::SameRange(aE1);
|
BRepLib::SameRange(aE1);
|
||||||
@@ -119,7 +135,7 @@ Standard_Integer BOPTools_AlgoTools2D::AttachExistingPCurve
|
|||||||
if (bIsClosed) {
|
if (bIsClosed) {
|
||||||
iRet=UpdateClosedPCurve(aE2, aE1, aF, aCtx);
|
iRet=UpdateClosedPCurve(aE2, aE1, aF, aCtx);
|
||||||
if(iRet) {
|
if(iRet) {
|
||||||
iRet=3;
|
iRet=4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
@@ -309,4 +325,40 @@ Standard_Boolean IsClosed(const TopoDS_Edge& aE,
|
|||||||
}
|
}
|
||||||
return bRet;
|
return bRet;
|
||||||
}
|
}
|
||||||
|
//=======================================================================
|
||||||
|
//function : ComputeTol
|
||||||
|
//purpose :
|
||||||
|
//=======================================================================
|
||||||
|
Standard_Real ComputeTol(const TopoDS_Edge& theE,
|
||||||
|
const Standard_Real theFirst,
|
||||||
|
const Standard_Real theLast,
|
||||||
|
const Handle(Geom2d_Curve)& theC,
|
||||||
|
const TopoDS_Face& theF)
|
||||||
|
{
|
||||||
|
Standard_Real f, l, aD, aDMax, aT, aDt;
|
||||||
|
gp_Pnt aP1, aP2;
|
||||||
|
gp_Pnt2d aP2d;
|
||||||
|
//
|
||||||
|
const Standard_Integer NCONTROL = 22;
|
||||||
|
//
|
||||||
|
const Handle(Geom_Curve)& aC = BRep_Tool::Curve(theE, f, l);
|
||||||
|
const Handle(Geom_Surface)& aS = BRep_Tool::Surface(theF);
|
||||||
|
//
|
||||||
|
aDMax = 0.;
|
||||||
|
aDt = (theLast - theFirst) / NCONTROL;
|
||||||
|
//
|
||||||
|
for (aT = theFirst; aT <= theLast; aT += aDt) {
|
||||||
|
theC->D0(aT, aP2d);
|
||||||
|
aS->D0(aP2d.X(), aP2d.Y(), aP1);
|
||||||
|
//
|
||||||
|
aC->D0(aT, aP2);
|
||||||
|
//
|
||||||
|
aD = aP1.SquareDistance(aP2);
|
||||||
|
if (aD > aDMax) {
|
||||||
|
aDMax = aD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
aDMax = sqrt(aDMax);
|
||||||
|
return aDMax;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user