From: emv Date: Fri, 30 Jan 2015 08:20:16 +0000 (+0300) Subject: 0025766: Exception in BRepAlgo_Section X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=40c4421b7a222675d7a6ca05cc6dad0678f0bb87;p=occt-copy.git 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. --- diff --git a/src/TopOpeBRep/TopOpeBRep_FacesIntersector.cxx b/src/TopOpeBRep/TopOpeBRep_FacesIntersector.cxx index e4e02f91b3..83148459f6 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 DEB - cout << "*** TopOpeBRep_FaceIntersector: Merge WLines on Restriction S1 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); + 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 S2 to WLine***" << endl; + cout << "*** TopOpeBRep_FaceIntersector: Merge WLines on Restriction " + << ((WLineRank == 1) ? "S1" : "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;