From a4d5c9abcc8967f013d6615256c516d42c7219eb Mon Sep 17 00:00:00 2001 From: emv Date: Thu, 5 Feb 2015 16:19:47 +0300 Subject: [PATCH] 0025766: Exception in BRepAlgo_Section class TopOpeBRep_FacesIntersector method static void MergeWLinesIfAllSegmentsAlongRestriction(IntPatch_SequenceOfLine& theSlin, const Handle(Adaptor3d_HSurface)& theSurface1, const Handle(Adaptor3d_TopolTool)& theDomain1, const Handle(Adaptor3d_HSurface)& theSurface2, const Handle(Adaptor3d_TopolTool)& theDomain2, const Standard_Real theTolArc) Protection from null wlines has been added. Test-case for issue #25766 --- .../TopOpeBRep_FacesIntersector.cxx | 56 ++++++++----------- tests/bugs/modalg_5/bug25766 | 11 ++++ 2 files changed, 35 insertions(+), 32 deletions(-) create mode 100644 tests/bugs/modalg_5/bug25766 diff --git a/src/TopOpeBRep/TopOpeBRep_FacesIntersector.cxx b/src/TopOpeBRep/TopOpeBRep_FacesIntersector.cxx index 12713c6338..f6d4d0f508 100644 --- a/src/TopOpeBRep/TopOpeBRep_FacesIntersector.cxx +++ b/src/TopOpeBRep/TopOpeBRep_FacesIntersector.cxx @@ -1167,38 +1167,25 @@ static void MergeWLinesIfAllSegmentsAlongRestriction(IntPatch_SequenceOfLine& Standard_Real Fp = 0., Lp = 0.; - if( WLineRank == 1 ) - { - Handle(IntSurf_LineOn2S) aLineOn2S = new IntSurf_LineOn2S(); - Standard_Integer arcnumber = GetArc(theSlin,WLineRank,theSurface1,theDomain1,theSurface2,testPoint,TolVrtx,aLineOn2S,Fp,Lp); - - if( arcnumber == 0 ) - return; - - Handle(IntPatch_WLine) anWLine = NULL; - anWLine = GetMergedWLineOnRestriction(theSlin,TolVrtx,aLineOn2S); -#ifdef OCCT_DEBUG - cout << "*** TopOpeBRep_FaceIntersector: Merge WLines on Restriction S1 to WLine ***" << endl; + Handle(IntSurf_LineOn2S) aLineOn2S = new IntSurf_LineOn2S(); + // + Standard_Integer arcnumber = (WLineRank == 1) ? + GetArc(theSlin,WLineRank,theSurface1,theDomain1,theSurface2,testPoint,TolVrtx,aLineOn2S,Fp,Lp) : + GetArc(theSlin,WLineRank,theSurface2,theDomain2,theSurface1,testPoint,TolVrtx,aLineOn2S,Fp,Lp); + // + if (arcnumber == 0) { + return; + } + // + Handle(IntPatch_WLine) anWLine = GetMergedWLineOnRestriction(theSlin,TolVrtx,aLineOn2S); + if (!anWLine.IsNull()) { + theSlin.Clear(); + theSlin.Append(anWLine); +#ifdef DEB + cout << "*** TopOpeBRep_FaceIntersector: Merge WLines on Restriction " + << ((WLineRank == 1) ? "S1" : "S2") << " to WLine***" << endl; #endif - theSlin.Clear(); - theSlin.Append(anWLine); - } - else - { - Handle(IntSurf_LineOn2S) aLineOn2S = new IntSurf_LineOn2S(); - Standard_Integer arcnumber = GetArc(theSlin,WLineRank,theSurface2,theDomain2,theSurface1,testPoint,TolVrtx,aLineOn2S,Fp,Lp); - - if( arcnumber == 0 ) - return; - - Handle(IntPatch_WLine) anWLine = NULL; - anWLine = GetMergedWLineOnRestriction(theSlin,TolVrtx,aLineOn2S); -#ifdef OCCT_DEBUG - cout << "*** TopOpeBRep_FaceIntersector: Merge WLines on Restriction S2 to WLine***" << endl; -#endif - theSlin.Clear(); - theSlin.Append(anWLine); - } + } } //========================================================================================= @@ -1498,6 +1485,11 @@ static Handle(IntPatch_WLine) GetMergedWLineOnRestriction(IntPatch_SequenceOfLin const Standard_Real& theVrtxTol, const Handle(IntSurf_LineOn2S)& theLineOn2S) { + Handle(IntPatch_WLine) mWLine; + if (theLineOn2S->NbPoints() == 0) { + return mWLine; + } + // IntSurf_TypeTrans trans1 = IntSurf_Undecided; IntSurf_TypeTrans trans2 = IntSurf_Undecided; Standard_Integer i = 0; @@ -1515,7 +1507,7 @@ static Handle(IntPatch_WLine) GetMergedWLineOnRestriction(IntPatch_SequenceOfLin trans2 = aWLine->TransitionOnS2(); } - Handle(IntPatch_WLine) mWLine = new IntPatch_WLine(theLineOn2S, Standard_False, trans1, trans2); + mWLine = new IntPatch_WLine(theLineOn2S, Standard_False, trans1, trans2); Standard_Integer NbPnts = mWLine->NbPnts(); IntPatch_Point aFirstVertex, aLastVertex; diff --git a/tests/bugs/modalg_5/bug25766 b/tests/bugs/modalg_5/bug25766 new file mode 100644 index 0000000000..fe7e6ee021 --- /dev/null +++ b/tests/bugs/modalg_5/bug25766 @@ -0,0 +1,11 @@ +puts "========" +puts "OCC25766" +puts "========" +puts "" +######################################################################################## +# Exception is raised during building section using BRepAlgo_Section on attached faces +######################################################################################## + +restore [locate_data_file OCC25766_surface1.brep] b1 +restore [locate_data_file OCC25766_surface2.brep] b2 +section r b1 b2