From 52e7e5b5fdb5f1d5309ddddf6aa273de013b9267 Mon Sep 17 00:00:00 2001 From: nbv Date: Tue, 28 Feb 2017 18:02:43 +0300 Subject: [PATCH] Fix for issue #28491 --- src/BOPInt/BOPInt_Context.cxx | 58 +++++++++++++++++++---------------- tests/bugs/modalg_6/bug28491 | 15 +++++++++ 2 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 tests/bugs/modalg_6/bug28491 diff --git a/src/BOPInt/BOPInt_Context.cxx b/src/BOPInt/BOPInt_Context.cxx index 601d6f954e..b4506ae04e 100644 --- a/src/BOPInt/BOPInt_Context.cxx +++ b/src/BOPInt/BOPInt_Context.cxx @@ -666,40 +666,44 @@ Standard_Integer BOPInt_Context::ComputeVF(const TopoDS_Vertex& aV1, //function : IsValidBlockForFaces //purpose : //======================================================================= - Standard_Boolean BOPInt_Context::IsValidBlockForFaces (const Standard_Real aT1, - const Standard_Real aT2, - const IntTools_Curve& aC, - const TopoDS_Face& aF1, - const TopoDS_Face& aF2, - const Standard_Real aTol) +Standard_Boolean BOPInt_Context::IsValidBlockForFaces(const Standard_Real theT1, + const Standard_Real theT2, + const IntTools_Curve& theC, + const TopoDS_Face& theF1, + const TopoDS_Face& theF2, + const Standard_Real theTol) { - Standard_Boolean bFlag1, bFlag2; - // - Handle(Geom2d_Curve) aPC1 = aC.FirstCurve2d(); - Handle(Geom2d_Curve) aPC2 = aC.SecondCurve2d(); - if( !aPC1.IsNull() && !aPC2.IsNull() ) { - Standard_Real aMidPar = IntTools_Tools::IntermediatePoint(aT1, aT2); - gp_Pnt2d aPnt2D; + const Standard_Integer aNbElem = 2; + const Handle(Geom2d_Curve) &aPC1 = theC.FirstCurve2d(); + const Handle(Geom2d_Curve) &aPC2 = theC.SecondCurve2d(); + const Handle(Geom_Curve) &aC3D = theC.Curve(); + const Handle(Geom2d_Curve)* anArrPC[aNbElem] = { &aPC1, &aPC2 }; + const TopoDS_Face* anArrF[aNbElem] = { &theF1, &theF2 }; - aPC1->D0(aMidPar, aPnt2D); - bFlag1 = IsPointInOnFace(aF1, aPnt2D); + const Standard_Real aMidPar = IntTools_Tools::IntermediatePoint(theT1, theT2); + const gp_Pnt aP(aC3D->Value(aMidPar)); - if( !bFlag1 ) - return bFlag1; + Standard_Boolean bFlag = Standard_True; + gp_Pnt2d aPnt2D; - aPC2->D0(aMidPar, aPnt2D); - bFlag2 = IsPointInOnFace(aF2, aPnt2D); - return bFlag2; - } - // + for (Standard_Integer i = 0; (i < 2) && bFlag; ++i) + { + const Handle(Geom2d_Curve) &aPC = *anArrPC[i]; + const TopoDS_Face &aF = *anArrF[i]; - bFlag1=IsValidBlockForFace (aT1, aT2, aC, aF1, aTol); - if (!bFlag1) { - return bFlag1; + if (!aPC.IsNull()) + { + aPC->D0(aMidPar, aPnt2D); + bFlag = IsPointInOnFace(aF, aPnt2D); + } + else + { + bFlag = IsValidPointForFace(aP, aF, theTol); + } } - bFlag2=IsValidBlockForFace (aT1, aT2, aC, aF2, aTol); - return bFlag2; + + return bFlag; } //======================================================================= //function : IsVertexOnLine diff --git a/tests/bugs/modalg_6/bug28491 b/tests/bugs/modalg_6/bug28491 new file mode 100644 index 0000000000..477e917b5c --- /dev/null +++ b/tests/bugs/modalg_6/bug28491 @@ -0,0 +1,15 @@ +puts "========" +puts "OCC28491" +puts "========" +puts "" +########################################## +## Incomplete section curve +########################################## + +restore [locate_data_file bug28491_H0.brep] h0 +restore [locate_data_file bug28491_Prism.brep] s1 +explode h0 f + +bsection result h0_57 s1 -n2d2 + +set length 4.60797 -- 2.39.5