diff --git a/src/BRepFill/BRepFill_OffsetWire.cxx b/src/BRepFill/BRepFill_OffsetWire.cxx index 2b515f3bc8..9036735f1f 100755 --- a/src/BRepFill/BRepFill_OffsetWire.cxx +++ b/src/BRepFill/BRepFill_OffsetWire.cxx @@ -500,10 +500,11 @@ GeomAbs_JoinType BRepFill_OffsetWire::JoinType() const void BRepFill_OffsetWire::Perform (const Standard_Real Offset, const Standard_Real Alt) { -// Modified by skv - Fri Jul 8 11:21:38 2005 OCC9145 Begin - try { + // Modified by skv - Fri Jul 8 11:21:38 2005 OCC9145 Begin + try + { OCC_CATCH_SIGNALS - myCallGen = Standard_False; + myCallGen = Standard_False; if (KPartCircle(mySpine,Offset,Alt,myShape,myMap,myIsDone)) return; TopoDS_Face oldWorkSpain = myWorkSpine; @@ -511,7 +512,8 @@ void BRepFill_OffsetWire::Perform (const Standard_Real Offset, TopTools_ListOfShape BadEdges; CheckBadEdges(myWorkSpine,Offset,myBilo,myLink,BadEdges); - if(!BadEdges.IsEmpty()) { + if(!BadEdges.IsEmpty()) + { // Modification of myWorkSpine; //cout << "Modification of myWorkSpine : " << BadEdges.Extent() << endl; BRepTools_Substitution aSubst; @@ -522,128 +524,131 @@ void BRepFill_OffsetWire::Perform (const Standard_Real Offset, TColgp_SequenceOfPnt Points; for(; it.More(); it.Next()) { - aL.Clear(); - Parameters.Clear(); - Points.Clear(); - const TopoDS_Shape& anE = it.Value(); - TopoDS_Vertex Vf, Vl; - TopExp::Vertices(TopoDS::Edge(anE), Vf, Vl); + aL.Clear(); + Parameters.Clear(); + Points.Clear(); + const TopoDS_Shape& anE = it.Value(); - Standard_Real f, l; - Handle(Geom_Curve) G3d = BRep_Tool::Curve(TopoDS::Edge(anE),f,l); - GeomAdaptor_Curve AC(G3d,f,l); + TopoDS_Vertex Vf, Vl; + TopExp::Vertices(TopoDS::Edge(anE), Vf, Vl); - PerformCurve(Parameters, Points, AC, aDefl, f, - l, Precision::Confusion(), 2); + Standard_Real f, l; + Handle(Geom_Curve) G3d = BRep_Tool::Curve(TopoDS::Edge(anE),f,l); + GeomAdaptor_Curve AC(G3d,f,l); - Standard_Integer NPnts = Points.Length(); - if(NPnts > 2) { - //cout << NPnts << " points " << endl; - TopoDS_Vertex FV = Vf; - TopoDS_Vertex LV; - TopoDS_Edge newE; - Standard_Integer np; - for(np = 2; np < NPnts; np++) { - gp_Pnt LP = Points(np); - LV = BRepLib_MakeVertex(LP); - newE = BRepLib_MakeEdge(FV, LV); - aL.Append(newE); - FV = LV; - } - LV = Vl; - newE = BRepLib_MakeEdge(FV, LV); - aL.Append(newE); - } - else { - //cout << " 2 points " << endl; - TopoDS_Edge newE = BRepLib_MakeEdge(Vf, Vl); - aL.Append(newE); - } - //Update myMapSpine - if (myMapSpine.IsBound( anE )) - { - TopTools_ListIteratorOfListOfShape newit( aL ); - for (; newit.More(); newit.Next()) - { - TopoDS_Edge NewEdge = TopoDS::Edge( newit.Value() ); - myMapSpine.Bind( NewEdge, myMapSpine(anE) ); - TopoDS_Vertex NewV1, NewV2; - EdgeVertices( NewEdge, NewV1, NewV2 ); - if (!myMapSpine.IsBound(NewV1)) myMapSpine.Bind( NewV1, myMapSpine(anE) ); - if (!myMapSpine.IsBound(NewV2)) myMapSpine.Bind( NewV2, myMapSpine(anE) ); - } - myMapSpine.UnBind( anE ); - } - /////////////////// - aSubst.Substitute(anE, aL); + PerformCurve(Parameters, Points, AC, aDefl, f, + l, Precision::Confusion(), 2); + + Standard_Integer NPnts = Points.Length(); + if(NPnts > 2) + { + //cout << NPnts << " points " << endl; + TopoDS_Vertex FV = Vf; + TopoDS_Vertex LV; + TopoDS_Edge newE; + Standard_Integer np; + for(np = 2; np < NPnts; np++) { + gp_Pnt LP = Points(np); + LV = BRepLib_MakeVertex(LP); + newE = BRepLib_MakeEdge(FV, LV); + aL.Append(newE); + FV = LV; + } + LV = Vl; + newE = BRepLib_MakeEdge(FV, LV); + aL.Append(newE); + } + else + { + //cout << " 2 points " << endl; + TopoDS_Edge newE = BRepLib_MakeEdge(Vf, Vl); + aL.Append(newE); + } + //Update myMapSpine + if (myMapSpine.IsBound( anE )) + { + TopTools_ListIteratorOfListOfShape newit( aL ); + for (; newit.More(); newit.Next()) + { + TopoDS_Edge NewEdge = TopoDS::Edge( newit.Value() ); + myMapSpine.Bind( NewEdge, myMapSpine(anE) ); + TopoDS_Vertex NewV1, NewV2; + EdgeVertices( NewEdge, NewV1, NewV2 ); + if (!myMapSpine.IsBound(NewV1)) myMapSpine.Bind( NewV1, myMapSpine(anE) ); + if (!myMapSpine.IsBound(NewV2)) myMapSpine.Bind( NewV2, myMapSpine(anE) ); + } + myMapSpine.UnBind( anE ); + } + /////////////////// + aSubst.Substitute(anE, aL); } TopTools_DataMapOfShapeListOfShape wwmap; TopoDS_Iterator itws( myWorkSpine ); for (; itws.More(); itws.Next()) - { - TopoDS_Shape aWire = itws.Value(); - aSubst.Build( aWire ); - if (aSubst.IsCopied(aWire)) - { - TopoDS_Wire NewWire = TopoDS::Wire( aSubst.Copy(aWire).First() ); - NewWire.Closed( aWire.Closed() ); - TopTools_ListOfShape Lw; - Lw.Append( NewWire ); - wwmap.Bind( aWire, Lw ); - } - } + { + TopoDS_Shape aWire = itws.Value(); + aSubst.Build( aWire ); + if (aSubst.IsCopied(aWire)) + { + TopoDS_Wire NewWire = TopoDS::Wire( aSubst.Copy(aWire).First() ); + NewWire.Closed( aWire.Closed() ); + TopTools_ListOfShape Lw; + Lw.Append( NewWire ); + wwmap.Bind( aWire, Lw ); + } + } aSubst.Clear(); TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itmap( wwmap ); for (; itmap.More(); itmap.Next()) - aSubst.Substitute( itmap.Key(), itmap.Value() ); + aSubst.Substitute( itmap.Key(), itmap.Value() ); + aSubst.Build(myWorkSpine); + if(aSubst.IsCopied(myWorkSpine)) { - myWorkSpine = TopoDS::Face(aSubst.Copy(myWorkSpine).First()); - //sprintf(name,"WS1"); - //DBRep::Set(name,myWorkSpine); - - BRepMAT2d_Explorer newExp; - newExp.Perform(myWorkSpine); - BRepMAT2d_BisectingLocus newBilo; - BRepMAT2d_LinkTopoBilo newLink; - newBilo.Compute(newExp,1,MAT_Left); + myWorkSpine = TopoDS::Face(aSubst.Copy(myWorkSpine).First()); + //sprintf(name,"WS1"); + //DBRep::Set(name,myWorkSpine); - if(!newBilo.IsDone()) - { - myShape.Nullify(); - myIsDone = Standard_False; - return; - } + BRepMAT2d_Explorer newExp; + newExp.Perform(myWorkSpine); + BRepMAT2d_BisectingLocus newBilo; + BRepMAT2d_LinkTopoBilo newLink; + newBilo.Compute(newExp,1,MAT_Left); - newLink.Perform(newExp,newBilo); - PerformWithBiLo(myWorkSpine,Offset,newBilo,newLink,myJoinType,Alt); + if(!newBilo.IsDone()) + { + myShape.Nullify(); + myIsDone = Standard_False; + return; + } - myWorkSpine = oldWorkSpain; + newLink.Perform(newExp,newBilo); + PerformWithBiLo(myWorkSpine,Offset,newBilo,newLink,myJoinType,Alt); + myWorkSpine = oldWorkSpain; } else { - PerformWithBiLo(myWorkSpine,Offset,myBilo,myLink,myJoinType,Alt); + PerformWithBiLo(myWorkSpine,Offset,myBilo,myLink,myJoinType,Alt); } - } - else { + else + { PerformWithBiLo(myWorkSpine,Offset,myBilo,myLink,myJoinType,Alt); } - } catch (...)//Every exception was caught. - { + { myShape.Nullify(); myIsDone = Standard_False; cout<<"An exception was caught in BRepFill_OffsetWire::Perform : "; Standard_Failure::Caught()->Print(cout); cout< MaxTol) - MaxTol = Tol; - } + { + const TopoDS_Vertex& aVertex = TopoDS::Vertex( Explo.Current() ); + Standard_Real Tol = BRep_Tool::Tolerance(aVertex); + if (Tol > MaxTol) + MaxTol = Tol; + } MaxTol *= 100.; Explo.Init( myShape, TopAbs_WIRE ); for (; Explo.More(); Explo.Next()) + { + TopoDS_Shape aWire = Explo.Current(); + // Remove duplicated edges + TopTools_DataMapOfShapeListOfShape EEmap; + TopoDS_Iterator it( aWire ); + for (; it.More(); it.Next()) { - TopoDS_Shape aWire = Explo.Current(); - // Remove duplicated edges - TopTools_DataMapOfShapeListOfShape EEmap; - TopoDS_Iterator it( aWire ); - for (; it.More(); it.Next()) - { - const TopoDS_Shape& anEdge = it.Value(); - if (! EEmap.IsBound( anEdge )) - { - TopTools_ListOfShape LE; - EEmap.Bind( anEdge, LE ); - } - else - EEmap(anEdge).Append( anEdge ); - } - aWire.Free( Standard_True ); - TopTools_DataMapIteratorOfDataMapOfShapeListOfShape mapit( EEmap ); - for (; mapit.More(); mapit.Next()) - { - const TopTools_ListOfShape& LE = mapit.Value(); - TopTools_ListIteratorOfListOfShape itl( LE ); - for (; itl.More(); itl.Next()) - BB.Remove( aWire, itl.Value() ); - } - // Sorting - if (aWire.Closed()) - ClosedWires.Append( aWire ); + const TopoDS_Shape& anEdge = it.Value(); + if (! EEmap.IsBound( anEdge )) + { + TopTools_ListOfShape LE; + EEmap.Bind( anEdge, LE ); + } else - UnclosedWires.Append( aWire ); + EEmap(anEdge).Append( anEdge ); } - - while (!UnclosedWires.IsEmpty()) + aWire.Free( Standard_True ); + TopTools_DataMapIteratorOfDataMapOfShapeListOfShape mapit( EEmap ); + for (; mapit.More(); mapit.Next()) { - TopoDS_Wire& Base = TopoDS::Wire( UnclosedWires(1) ); - TopoDS_Vertex Vf, Vl; - TopExp::Vertices( Base, Vf, Vl ); - if(Vf.IsNull() || Vl.IsNull()) + const TopTools_ListOfShape& LE = mapit.Value(); + TopTools_ListIteratorOfListOfShape itl( LE ); + for (; itl.More(); itl.Next()) + BB.Remove( aWire, itl.Value() ); + } + // Sorting + if (aWire.Closed()) + ClosedWires.Append( aWire ); + else + UnclosedWires.Append( aWire ); + } + + while (!UnclosedWires.IsEmpty()) + { + TopoDS_Wire& Base = TopoDS::Wire( UnclosedWires(1) ); + TopoDS_Vertex Vf, Vl; + TopExp::Vertices( Base, Vf, Vl ); + if(Vf.IsNull() || Vl.IsNull()) + Standard_Failure::Raise("BRepFill_OffsetWire::FixHoles(): Wrong wire."); + gp_Pnt Pf, Pl; + Pf = BRep_Tool::Pnt(Vf); + Pl = BRep_Tool::Pnt(Vl); + Standard_Real DistF = RealLast(), DistL = RealLast(); + Standard_Integer IndexF = 1, IndexL = 1; + Standard_Boolean IsFirstF = Standard_False, IsFirstL = Standard_False; + for (Standard_Integer i = 2; i <= UnclosedWires.Length(); i++) + { + TopoDS_Wire aWire = TopoDS::Wire( UnclosedWires(i) ); + TopoDS_Vertex V1, V2; + TopExp::Vertices( aWire, V1, V2 ); + + if(V1.IsNull() || V2.IsNull()) Standard_Failure::Raise("BRepFill_OffsetWire::FixHoles(): Wrong wire."); - gp_Pnt Pf, Pl; + + gp_Pnt P1, P2; + P1 = BRep_Tool::Pnt(V1); + P2 = BRep_Tool::Pnt(V2); + Standard_Real dist = Pf.Distance( P1 ); + if (dist < DistF) + { + DistF = dist; + IndexF = i; + IsFirstF = Standard_True; + } + dist = Pf.Distance( P2 ); + if (dist < DistF) + { + DistF = dist; + IndexF = i; + IsFirstF = Standard_False; + } + dist = Pl.Distance( P1 ); + if (dist < DistL) + { + DistL = dist; + IndexL = i; + IsFirstL = Standard_True; + } + dist = Pl.Distance( P2 ); + if (dist < DistL) + { + DistL = dist; + IndexL = i; + IsFirstL = Standard_False; + } + } + TopoDS_Wire theWire; + TopoDS_Edge theEdge; + TopoDS_Vertex theVertex; + Standard_Real CommonTol; + Standard_Boolean TryToClose = Standard_True; + if (DistF <= MaxTol && DistL <= MaxTol && IndexF == IndexL && IsFirstF == IsFirstL) + { + if (DistF < DistL) + { + DistL = RealLast(); + IndexL++; + } + else + { + DistF = RealLast(); + IndexF++; + } + TryToClose = Standard_False; + } + if (DistF <= MaxTol) + { + theWire = TopoDS::Wire( UnclosedWires(IndexF) ); + TopoDS_Vertex V1, V2; + TopExp::Vertices( theWire, V1, V2 ); + TopTools_IndexedDataMapOfShapeListOfShape VEmap; + TopExp::MapShapesAndAncestors( theWire, TopAbs_VERTEX, TopAbs_EDGE, VEmap ); + theEdge = (IsFirstF)? TopoDS::Edge(VEmap.FindFromKey( V1 ).First()) : + TopoDS::Edge(VEmap.FindFromKey( V2 ).First()); + TopoDS_Iterator it( theWire ); + for (; it.More(); it.Next()) + { + TopoDS_Edge anEdge = TopoDS::Edge( it.Value() ); + if (IsFirstF) anEdge.Reverse(); + if (!anEdge.IsSame( theEdge )) + BB.Add( Base, anEdge ); + } + theVertex = (IsFirstF)? V1 : V2; + CommonTol = Max( BRep_Tool::Tolerance(Vf), BRep_Tool::Tolerance(theVertex) ); + if (DistF <= CommonTol) + { + theEdge.Free( Standard_True ); + Vf.Orientation( theVertex.Orientation() ); + BB.Remove( theEdge, theVertex ); + BB.Add( theEdge, Vf ); + BB.UpdateVertex( Vf, CommonTol ); + if (IsFirstF) theEdge.Reverse(); + BB.Add( Base, theEdge ); + } + else + { + if (IsFirstF) theEdge.Reverse(); + BB.Add( Base, theEdge ); + // Creating new edge from theVertex to Vf + TopoDS_Edge NewEdge = BRepLib_MakeEdge( theVertex, Vf ); + BB.Add( Base, NewEdge ); + } + } + if (DistL <= MaxTol && IndexL != IndexF) + { + theWire = TopoDS::Wire( UnclosedWires(IndexL) ); + TopoDS_Vertex V1, V2; + TopExp::Vertices( theWire, V1, V2 ); + TopTools_IndexedDataMapOfShapeListOfShape VEmap; + TopExp::MapShapesAndAncestors( theWire, TopAbs_VERTEX, TopAbs_EDGE, VEmap ); + theEdge = (IsFirstL)? TopoDS::Edge(VEmap.FindFromKey( V1 ).First()) : + TopoDS::Edge(VEmap.FindFromKey( V2 ).First()); + TopoDS_Iterator it( theWire ); + for (; it.More(); it.Next()) + { + TopoDS_Edge anEdge = TopoDS::Edge( it.Value() ); + if (!IsFirstL) anEdge.Reverse(); + if (!anEdge.IsSame( theEdge )) + BB.Add( Base, anEdge ); + } + theVertex = (IsFirstL)? V1 : V2; + CommonTol = Max( BRep_Tool::Tolerance(Vl), BRep_Tool::Tolerance(theVertex) ); + if (DistL <= CommonTol) + { + theEdge.Free( Standard_True ); + Vl.Orientation( theVertex.Orientation() ); + BB.Remove( theEdge, theVertex ); + BB.Add( theEdge, Vl ); + BB.UpdateVertex( Vl, CommonTol ); + if (!IsFirstL) theEdge.Reverse(); + BB.Add( Base, theEdge ); + } + else + { + if (!IsFirstL) theEdge.Reverse(); + BB.Add( Base, theEdge ); + // Creating new edge from Vl to theVertex + TopoDS_Edge NewEdge = BRepLib_MakeEdge( Vl, theVertex ); + BB.Add( Base, NewEdge ); + } + } + // Check if it is possible to close resulting wire + if (TryToClose) + { + TopExp::Vertices( Base, Vf, Vl ); + CommonTol = Max( BRep_Tool::Tolerance(Vf), BRep_Tool::Tolerance(Vl) ); + TopTools_IndexedDataMapOfShapeListOfShape VEmap; + TopExp::MapShapesAndAncestors( Base, TopAbs_VERTEX, TopAbs_EDGE, VEmap ); + TopoDS_Edge Efirst, Elast; + Efirst = TopoDS::Edge(VEmap.FindFromKey( Vf ).First()); + Elast = TopoDS::Edge(VEmap.FindFromKey( Vl ).First()); Pf = BRep_Tool::Pnt(Vf); Pl = BRep_Tool::Pnt(Vl); - Standard_Real DistF = RealLast(), DistL = RealLast(); - Standard_Integer IndexF = 1, IndexL = 1; - Standard_Boolean IsFirstF = Standard_False, IsFirstL = Standard_False; - for (Standard_Integer i = 2; i <= UnclosedWires.Length(); i++) - { - TopoDS_Wire aWire = TopoDS::Wire( UnclosedWires(i) ); - TopoDS_Vertex V1, V2; - TopExp::Vertices( aWire, V1, V2 ); - gp_Pnt P1, P2; - P1 = BRep_Tool::Pnt(V1); - P2 = BRep_Tool::Pnt(V2); - Standard_Real dist = Pf.Distance( P1 ); - if (dist < DistF) - { - DistF = dist; - IndexF = i; - IsFirstF = Standard_True; - } - dist = Pf.Distance( P2 ); - if (dist < DistF) - { - DistF = dist; - IndexF = i; - IsFirstF = Standard_False; - } - dist = Pl.Distance( P1 ); - if (dist < DistL) - { - DistL = dist; - IndexL = i; - IsFirstL = Standard_True; - } - dist = Pl.Distance( P2 ); - if (dist < DistL) - { - DistL = dist; - IndexL = i; - IsFirstL = Standard_False; - } - } - TopoDS_Wire theWire; - TopoDS_Edge theEdge; - TopoDS_Vertex theVertex; - Standard_Real CommonTol; - Standard_Boolean TryToClose = Standard_True; - if (DistF <= MaxTol && DistL <= MaxTol && IndexF == IndexL && IsFirstF == IsFirstL) - { - if (DistF < DistL) - { - DistL = RealLast(); - IndexL++; - } - else - { - DistF = RealLast(); - IndexF++; - } - TryToClose = Standard_False; - } - if (DistF <= MaxTol) - { - theWire = TopoDS::Wire( UnclosedWires(IndexF) ); - TopoDS_Vertex V1, V2; - TopExp::Vertices( theWire, V1, V2 ); - TopTools_IndexedDataMapOfShapeListOfShape VEmap; - TopExp::MapShapesAndAncestors( theWire, TopAbs_VERTEX, TopAbs_EDGE, VEmap ); - theEdge = (IsFirstF)? TopoDS::Edge(VEmap.FindFromKey( V1 ).First()) : - TopoDS::Edge(VEmap.FindFromKey( V2 ).First()); - TopoDS_Iterator it( theWire ); - for (; it.More(); it.Next()) - { - TopoDS_Edge anEdge = TopoDS::Edge( it.Value() ); - if (IsFirstF) anEdge.Reverse(); - if (!anEdge.IsSame( theEdge )) - BB.Add( Base, anEdge ); - } - theVertex = (IsFirstF)? V1 : V2; - CommonTol = Max( BRep_Tool::Tolerance(Vf), BRep_Tool::Tolerance(theVertex) ); - if (DistF <= CommonTol) - { - theEdge.Free( Standard_True ); - Vf.Orientation( theVertex.Orientation() ); - BB.Remove( theEdge, theVertex ); - BB.Add( theEdge, Vf ); - BB.UpdateVertex( Vf, CommonTol ); - if (IsFirstF) theEdge.Reverse(); - BB.Add( Base, theEdge ); - } - else - { - if (IsFirstF) theEdge.Reverse(); - BB.Add( Base, theEdge ); - // Creating new edge from theVertex to Vf - TopoDS_Edge NewEdge = BRepLib_MakeEdge( theVertex, Vf ); - BB.Add( Base, NewEdge ); - } - } - if (DistL <= MaxTol && IndexL != IndexF) - { - theWire = TopoDS::Wire( UnclosedWires(IndexL) ); - TopoDS_Vertex V1, V2; - TopExp::Vertices( theWire, V1, V2 ); - TopTools_IndexedDataMapOfShapeListOfShape VEmap; - TopExp::MapShapesAndAncestors( theWire, TopAbs_VERTEX, TopAbs_EDGE, VEmap ); - theEdge = (IsFirstL)? TopoDS::Edge(VEmap.FindFromKey( V1 ).First()) : - TopoDS::Edge(VEmap.FindFromKey( V2 ).First()); - TopoDS_Iterator it( theWire ); - for (; it.More(); it.Next()) - { - TopoDS_Edge anEdge = TopoDS::Edge( it.Value() ); - if (!IsFirstL) anEdge.Reverse(); - if (!anEdge.IsSame( theEdge )) - BB.Add( Base, anEdge ); - } - theVertex = (IsFirstL)? V1 : V2; - CommonTol = Max( BRep_Tool::Tolerance(Vl), BRep_Tool::Tolerance(theVertex) ); - if (DistL <= CommonTol) - { - theEdge.Free( Standard_True ); - Vl.Orientation( theVertex.Orientation() ); - BB.Remove( theEdge, theVertex ); - BB.Add( theEdge, Vl ); - BB.UpdateVertex( Vl, CommonTol ); - if (!IsFirstL) theEdge.Reverse(); - BB.Add( Base, theEdge ); - } - else - { - if (!IsFirstL) theEdge.Reverse(); - BB.Add( Base, theEdge ); - // Creating new edge from Vl to theVertex - TopoDS_Edge NewEdge = BRepLib_MakeEdge( Vl, theVertex ); - BB.Add( Base, NewEdge ); - } - } - // Check if it is possible to close resulting wire - if (TryToClose) - { - TopExp::Vertices( Base, Vf, Vl ); - CommonTol = Max( BRep_Tool::Tolerance(Vf), BRep_Tool::Tolerance(Vl) ); - TopTools_IndexedDataMapOfShapeListOfShape VEmap; - TopExp::MapShapesAndAncestors( Base, TopAbs_VERTEX, TopAbs_EDGE, VEmap ); - TopoDS_Edge Efirst, Elast; - Efirst = TopoDS::Edge(VEmap.FindFromKey( Vf ).First()); - Elast = TopoDS::Edge(VEmap.FindFromKey( Vl ).First()); - Pf = BRep_Tool::Pnt(Vf); - Pl = BRep_Tool::Pnt(Vl); - Standard_Real Dist = Pf.Distance(Pl); - if (Dist <= CommonTol) - { - Elast.Free( Standard_True ); - Vf.Orientation( Vl.Orientation() ); - BB.Remove( Elast, Vl ); - BB.Add( Elast, Vf ); - BB.UpdateVertex( Vf, CommonTol ); - Base.Closed( Standard_True ); - } - else if (Dist <= MaxTol) - { - // Creating new edge from Vl to Vf - TopoDS_Edge NewEdge = BRepLib_MakeEdge( Vf, Vl ); - BB.Add( Base, NewEdge ); - Base.Closed( Standard_True ); - } - } - // Updating sequences ClosedWires and UnclosedWires - if (DistF <= MaxTol) - UnclosedWires.Remove( IndexF ); - if (DistL <= MaxTol && IndexL != IndexF) - { - if (DistF <= MaxTol && IndexL > IndexF) - IndexL--; - UnclosedWires.Remove( IndexL ); - } - if (Base.Closed()) - { - ClosedWires.Append( Base ); - UnclosedWires.Remove( 1 ); - } - else if (DistF > MaxTol && DistL > MaxTol) - { - IsolatedWires.Append( Base ); - UnclosedWires.Remove( 1 ); - } + Standard_Real Dist = Pf.Distance(Pl); + if (Dist <= CommonTol) + { + Elast.Free( Standard_True ); + Vf.Orientation( Vl.Orientation() ); + BB.Remove( Elast, Vl ); + BB.Add( Elast, Vf ); + BB.UpdateVertex( Vf, CommonTol ); + Base.Closed( Standard_True ); + } + else if (Dist <= MaxTol) + { + // Creating new edge from Vl to Vf + TopoDS_Edge NewEdge = BRepLib_MakeEdge( Vf, Vl ); + BB.Add( Base, NewEdge ); + Base.Closed( Standard_True ); + } } + // Updating sequences ClosedWires and UnclosedWires + if (DistF <= MaxTol) + UnclosedWires.Remove( IndexF ); + if (DistL <= MaxTol && IndexL != IndexF) + { + if (DistF <= MaxTol && IndexL > IndexF) + IndexL--; + UnclosedWires.Remove( IndexL ); + } + if (Base.Closed()) + { + ClosedWires.Append( Base ); + UnclosedWires.Remove( 1 ); + } + else if (DistF > MaxTol && DistL > MaxTol) + { + IsolatedWires.Append( Base ); + UnclosedWires.Remove( 1 ); + } + } // Updating myShape if (ClosedWires.Length() + IsolatedWires.Length() == 1) - { - if (!ClosedWires.IsEmpty()) - myShape = ClosedWires.First(); - else - myShape = IsolatedWires.First(); - } + { + if (!ClosedWires.IsEmpty()) + myShape = ClosedWires.First(); + else + myShape = IsolatedWires.First(); + } else - { - TopoDS_Compound R; - BB.MakeCompound( R ); - for (i = 1; i <= ClosedWires.Length(); i++) - BB.Add( R, ClosedWires(i) ); - for (i = 1; i <= IsolatedWires.Length(); i++) - BB.Add( R, IsolatedWires(i) ); - myShape = R; - } + { + TopoDS_Compound R; + BB.MakeCompound( R ); + for (i = 1; i <= ClosedWires.Length(); i++) + BB.Add( R, ClosedWires(i) ); + for (i = 1; i <= IsolatedWires.Length(); i++) + BB.Add( R, IsolatedWires(i) ); + myShape = R; + } } //======================================================================= @@ -2335,14 +2345,22 @@ static Standard_Boolean PerformCurve (TColStd_SequenceOfReal& Parameters, Points.Append(Pdeb); C.D1(UU2,Pfin,Dfin); - QuasiFleche(C,Deflection*Deflection, - UU1,Pdeb, - Ddeb, - UU2,Pfin, - Dfin, - Nbmin, - EPSILON*EPSILON, - Parameters,Points); + + const Standard_Real aDelta = UU2 - UU1; + const Standard_Real aDist = Pdeb.Distance(Pfin); + + if((aDelta/aDist) > 5.0e-14) + { + QuasiFleche(C,Deflection*Deflection, + UU1,Pdeb, + Ddeb, + UU2,Pfin, + Dfin, + Nbmin, + EPSILON*EPSILON, + Parameters,Points); + } + return Standard_True; } //======================================================================= diff --git a/src/Bisector/Bisector_BisecCC.cxx b/src/Bisector/Bisector_BisecCC.cxx index eecb923a7c..3900880491 100755 --- a/src/Bisector/Bisector_BisecCC.cxx +++ b/src/Bisector/Bisector_BisecCC.cxx @@ -50,8 +50,9 @@ #include -static Standard_Real ProjOnCurve (const gp_Pnt2d& P, - const Handle(Geom2d_Curve)& C); +static Standard_Boolean ProjOnCurve (const gp_Pnt2d& P, + const Handle(Geom2d_Curve)& C, + Standard_Real& theParam); static Standard_Real Curvature (const Handle(Geom2d_Curve)& C, Standard_Real U, @@ -125,8 +126,14 @@ void Bisector_BisecCC::Perform(const Handle(Geom2d_Curve)& Cu1, //--------------------------------------------- // Calculate first point of the polygon. //--------------------------------------------- - U = ProjOnCurve (Origin,curve1); - P = ValueByInt (U,UC1,UC2,Dist); + Standard_Boolean isProjDone = ProjOnCurve (Origin,curve1, U); + P = ValueByInt (U,UC1,UC2,Dist); + + if(!isProjDone) + { + isEmpty = Standard_True; + return; + } if (Dist < Precision::Infinite()) { //---------------------------------------------------- @@ -152,11 +159,11 @@ void Bisector_BisecCC::Perform(const Handle(Geom2d_Curve)& Cu1, for (Standard_Integer i = 1; i <= NbPnts - 1; i++) { P = ValueByInt(U,UC1,UC2,Dist); if (Dist < Precision::Infinite()) { - USol = SearchBound(U - dU,U); - P = ValueByInt(USol,UC1,UC2,Dist); - startIntervals.Append(USol); - myPolygon.Append(Bisector_PointOnBis(UC1,UC2,USol,Dist,P)); - break; + USol = SearchBound(U - dU,U); + P = ValueByInt(USol,UC1,UC2,Dist); + startIntervals.Append(USol); + myPolygon.Append(Bisector_PointOnBis(UC1,UC2,USol,Dist,P)); + break; } U += dU; } @@ -174,26 +181,26 @@ void Bisector_BisecCC::Perform(const Handle(Geom2d_Curve)& Cu1, dU = DU/(NbPnts - 1); U += dU; -// modified by NIZHNY-EAP Fri Jan 21 09:33:20 2000 ___BEGIN___ -// prevent addition of the same point + // modified by NIZHNY-EAP Fri Jan 21 09:33:20 2000 ___BEGIN___ + // prevent addition of the same point gp_Pnt2d prevPnt = P; for (Standard_Integer i = 1; i <= NbPnts - 1; i++) { P = ValueByInt(U,UC1,UC2,Dist); if (Dist < Precision::Infinite()) { - if (P.Distance (prevPnt) > Precision::Confusion()) - myPolygon.Append(Bisector_PointOnBis(UC1,UC2,U,Dist,P)); + if (P.Distance (prevPnt) > Precision::Confusion()) + myPolygon.Append(Bisector_PointOnBis(UC1,UC2,U,Dist,P)); } else { - USol = SearchBound(U - dU,U); - P = ValueByInt(USol,UC1,UC2,Dist); - endIntervals.SetValue(1,USol); - if (P.Distance (prevPnt) > Precision::Confusion()) - myPolygon.Append(Bisector_PointOnBis(UC1,UC2,USol,Dist,P)); - break; + USol = SearchBound(U - dU,U); + P = ValueByInt(USol,UC1,UC2,Dist); + endIntervals.SetValue(1,USol); + if (P.Distance (prevPnt) > Precision::Confusion()) + myPolygon.Append(Bisector_PointOnBis(UC1,UC2,USol,Dist,P)); + break; } U += dU; prevPnt=P; -// modified by NIZHNY-EAP Fri Jan 21 09:33:24 2000 ___END___ + // modified by NIZHNY-EAP Fri Jan 21 09:33:24 2000 ___END___ } } else { @@ -202,7 +209,7 @@ void Bisector_BisecCC::Perform(const Handle(Geom2d_Curve)& Cu1, //---------------- YaPoly = Standard_False; } - + extensionStart = Standard_False; extensionEnd = Standard_False; pointStart = Origin; @@ -220,7 +227,7 @@ void Bisector_BisecCC::Perform(const Handle(Geom2d_Curve)& Cu1, // the extension at the beginning is taken into account if the origin is found above. // ie : the origin is not the in the polygon. //----------------------------------------------------------------------------- - + //--------------------------------- // Do the extensions exist ? //--------------------------------- @@ -249,19 +256,19 @@ void Bisector_BisecCC::Perform(const Handle(Geom2d_Curve)& Cu1, //------------------------------------------------------ if (YaPoly) { if (extensionStart) { - gp_Pnt2d P1 = myPolygon.First().Point(); - Standard_Real UFirst = startIntervals.First() - pointStart.Distance(P1); - startIntervals.InsertBefore(1,UFirst); - endIntervals .InsertBefore(1,startIntervals.Value(2)); + gp_Pnt2d P1 = myPolygon.First().Point(); + Standard_Real UFirst = startIntervals.First() - pointStart.Distance(P1); + startIntervals.InsertBefore(1,UFirst); + endIntervals .InsertBefore(1,startIntervals.Value(2)); } if (extensionEnd) { - gp_Pnt2d P1; - Standard_Real UFirst,ULast; - P1 = myPolygon.Last().Point(); - UFirst = endIntervals.Last(); - ULast = UFirst + pointEnd.Distance(P1); - startIntervals.Append(UFirst); - endIntervals .Append(ULast ); + gp_Pnt2d P1; + Standard_Real UFirst,ULast; + P1 = myPolygon.Last().Point(); + UFirst = endIntervals.Last(); + ULast = UFirst + pointEnd.Distance(P1); + startIntervals.Append(UFirst); + endIntervals .Append(ULast ); } } else { @@ -274,10 +281,10 @@ void Bisector_BisecCC::Perform(const Handle(Geom2d_Curve)& Cu1, } if (!YaPoly && !extensionStart && !extensionEnd) isEmpty = Standard_True; -// modified by NIZHNY-EAP Mon Jan 17 17:32:40 2000 ___BEGIN___ + // modified by NIZHNY-EAP Mon Jan 17 17:32:40 2000 ___BEGIN___ if (myPolygon.Length() <= 2) isEmpty = Standard_True; -// modified by NIZHNY-EAP Mon Jan 17 17:32:42 2000 ___END___ + // modified by NIZHNY-EAP Mon Jan 17 17:32:42 2000 ___END___ } //============================================================================= @@ -1409,9 +1416,11 @@ Standard_Real Bisector_BisecCC::Parameter(const gp_Pnt2d& P) const else if (P.IsEqual(Value(LastParameter()),Precision::Confusion())) { UOnCurve = LastParameter(); } - else { - UOnCurve = ProjOnCurve(P,curve1); + else + { + ProjOnCurve(P, curve1, UOnCurve); } + return UOnCurve; } @@ -1623,42 +1632,56 @@ Standard_Real Bisector_BisecCC::SearchBound (const Standard_Real U1, //function : ProjOnCurve // purpose : //============================================================================= -static Standard_Real ProjOnCurve (const gp_Pnt2d& P, - const Handle(Geom2d_Curve)& C) +static Standard_Boolean ProjOnCurve (const gp_Pnt2d& P, + const Handle(Geom2d_Curve)& C, + Standard_Real& theParam) { - Standard_Real UOnCurve =0.; + //Standard_Real UOnCurve =0.; + theParam = 0.0; gp_Pnt2d PF,PL; gp_Vec2d TF,TL; C->D1(C->FirstParameter(),PF,TF); C->D1(C->LastParameter() ,PL,TL); - if (P.IsEqual(PF ,Precision::Confusion())) { - return C->FirstParameter(); + if (P.IsEqual(PF ,Precision::Confusion())) + { + theParam = C->FirstParameter(); + return Standard_True; } - if (P.IsEqual(PL ,Precision::Confusion())) { - return C->LastParameter(); + + if (P.IsEqual(PL ,Precision::Confusion())) + { + theParam = C->LastParameter(); + return Standard_True; } + gp_Vec2d PPF(PF.X() - P.X(), PF.Y() - P.Y()); TF.Normalize(); - if ( Abs (PPF.Dot(TF)) < Precision::Confusion()) { - return C->FirstParameter(); + + if ( Abs (PPF.Dot(TF)) < Precision::Confusion()) + { + theParam = C->FirstParameter(); + return Standard_True; } gp_Vec2d PPL (PL.X() - P.X(), PL.Y() - P.Y()); TL.Normalize(); - if ( Abs (PPL.Dot(TL)) < Precision::Confusion()) { - return C->LastParameter(); + if ( Abs (PPL.Dot(TL)) < Precision::Confusion()) + { + theParam = C->LastParameter(); + return Standard_True; } Geom2dAPI_ProjectPointOnCurve Proj(P,C, C->FirstParameter(), C->LastParameter()); if (Proj.NbPoints() > 0) { - UOnCurve = Proj.LowerDistanceParameter(); + theParam = Proj.LowerDistanceParameter(); } else { - Standard_OutOfRange::Raise(); + return Standard_False; } - return UOnCurve; + + return Standard_True; } //============================================================================= diff --git a/tests/bugs/modalg_4/bug62 b/tests/bugs/modalg_4/bug62 index 9b9c2a75b1..8c2c216df0 100755 --- a/tests/bugs/modalg_4/bug62 +++ b/tests/bugs/modalg_4/bug62 @@ -40,5 +40,13 @@ checkshape res5 renamevar res5 result -set square 1.21497e+7 +set OCC62_square 1.23063e+7 +puts "The expected square is ${OCC62_square}" + +set sq_persent 0.03 +regexp {Mass +: +([-0-9.+eE]+)} [sprops result] full m +if { (${OCC62_square} != 0 && [expr abs(${OCC62_square} - $m)/${OCC62_square}] > ${sq_persent}) || (${OCC62_square} == 0 && $m != 0) } { + puts "Error : The square of result shape is $m" +} + set 2dviewer 0 diff --git a/tests/offset/wire_unclosed_outside_0_005/C3 b/tests/offset/wire_unclosed_outside_0_005/C3 index 37dc0880ae..5341199c3b 100755 --- a/tests/offset/wire_unclosed_outside_0_005/C3 +++ b/tests/offset/wire_unclosed_outside_0_005/C3 @@ -1,8 +1,10 @@ -puts "TODO ?OCC23068 ALL: TEST INCOMPLETE" -puts "TODO ?OCC23068 ALL: Error : The offset cannot be built." -puts "TODO ?OCC23068 ALL: An exception was caught" -puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" -puts "TODO ?OCC23068 ALL: Error : result is not a topological shape!!!" +#puts "TODO ?OCC23068 ALL: TEST INCOMPLETE" +puts "TODO OCC23068 ALL: Error : The offset cannot be built." +puts "TODO OCC23068 ALL: An exception was caught" +#puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" +#puts "TODO ?OCC23068 ALL: Error : result is not a topological shape!!!" +puts "TODO OCC23068 ALL: Error: Offset is not done." + restore [locate_data_file offset_wire_074.brep] s set length 0 diff --git a/tests/offset/wire_unclosed_outside_0_005/C4 b/tests/offset/wire_unclosed_outside_0_005/C4 index 20462f88e1..44b22e3f3e 100644 --- a/tests/offset/wire_unclosed_outside_0_005/C4 +++ b/tests/offset/wire_unclosed_outside_0_005/C4 @@ -1,7 +1,7 @@ -puts "TODO ?OCC23068 ALL: Error : The offset cannot be built." -puts "TODO ?OCC23068 ALL: An exception was caught" -puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" -puts "TODO ?OCC23748 ALL: Error: Offset is not done." +#puts "TODO ?OCC23068 ALL: Error : The offset cannot be built." +#puts "TODO ?OCC23068 ALL: An exception was caught" +#puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" +#puts "TODO ?OCC23748 ALL: Error: Offset is not done." restore [locate_data_file offset_wire_075.brep] s diff --git a/tests/offset/wire_unclosed_outside_0_025/C3 b/tests/offset/wire_unclosed_outside_0_025/C3 index 37dc0880ae..5341199c3b 100755 --- a/tests/offset/wire_unclosed_outside_0_025/C3 +++ b/tests/offset/wire_unclosed_outside_0_025/C3 @@ -1,8 +1,10 @@ -puts "TODO ?OCC23068 ALL: TEST INCOMPLETE" -puts "TODO ?OCC23068 ALL: Error : The offset cannot be built." -puts "TODO ?OCC23068 ALL: An exception was caught" -puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" -puts "TODO ?OCC23068 ALL: Error : result is not a topological shape!!!" +#puts "TODO ?OCC23068 ALL: TEST INCOMPLETE" +puts "TODO OCC23068 ALL: Error : The offset cannot be built." +puts "TODO OCC23068 ALL: An exception was caught" +#puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" +#puts "TODO ?OCC23068 ALL: Error : result is not a topological shape!!!" +puts "TODO OCC23068 ALL: Error: Offset is not done." + restore [locate_data_file offset_wire_074.brep] s set length 0 diff --git a/tests/offset/wire_unclosed_outside_0_025/C4 b/tests/offset/wire_unclosed_outside_0_025/C4 index 1e561e050c..164d122029 100644 --- a/tests/offset/wire_unclosed_outside_0_025/C4 +++ b/tests/offset/wire_unclosed_outside_0_025/C4 @@ -1,7 +1,7 @@ -puts "TODO ?OCC23068 ALL: Error : The offset cannot be built." -puts "TODO ?OCC23068 ALL: An exception was caught" -puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" -puts "TODO ?OCC23748 ALL: Error: Offset is not done." +#puts "TODO ?OCC23068 ALL: Error : The offset cannot be built." +#puts "TODO ?OCC23068 ALL: An exception was caught" +#puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" +#puts "TODO ?OCC23748 ALL: Error: Offset is not done." restore [locate_data_file offset_wire_075.brep] s diff --git a/tests/offset/wire_unclosed_outside_0_075/C3 b/tests/offset/wire_unclosed_outside_0_075/C3 index 37dc0880ae..5341199c3b 100755 --- a/tests/offset/wire_unclosed_outside_0_075/C3 +++ b/tests/offset/wire_unclosed_outside_0_075/C3 @@ -1,8 +1,10 @@ -puts "TODO ?OCC23068 ALL: TEST INCOMPLETE" -puts "TODO ?OCC23068 ALL: Error : The offset cannot be built." -puts "TODO ?OCC23068 ALL: An exception was caught" -puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" -puts "TODO ?OCC23068 ALL: Error : result is not a topological shape!!!" +#puts "TODO ?OCC23068 ALL: TEST INCOMPLETE" +puts "TODO OCC23068 ALL: Error : The offset cannot be built." +puts "TODO OCC23068 ALL: An exception was caught" +#puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" +#puts "TODO ?OCC23068 ALL: Error : result is not a topological shape!!!" +puts "TODO OCC23068 ALL: Error: Offset is not done." + restore [locate_data_file offset_wire_074.brep] s set length 0 diff --git a/tests/offset/wire_unclosed_outside_0_075/C4 b/tests/offset/wire_unclosed_outside_0_075/C4 index cb4375c8d3..db61e28fb5 100644 --- a/tests/offset/wire_unclosed_outside_0_075/C4 +++ b/tests/offset/wire_unclosed_outside_0_075/C4 @@ -1,7 +1,7 @@ -puts "TODO ?OCC23068 ALL: Error : The offset cannot be built." -puts "TODO ?OCC23068 ALL: An exception was caught" -puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" -puts "TODO ?OCC23748 ALL: Error: Offset is not done." +#puts "TODO ?OCC23068 ALL: Error : The offset cannot be built." +#puts "TODO ?OCC23068 ALL: An exception was caught" +#puts "TODO ?OCC23068 ALL: \\*\\* Exception \\*\\*.*" +#puts "TODO ?OCC23748 ALL: Error: Offset is not done." restore [locate_data_file offset_wire_075.brep] s