From de878dad9a41ef2c67ef5ed17484018a18249c15 Mon Sep 17 00:00:00 2001 From: JGV <> Date: Fri, 23 Dec 2011 06:42:09 +0000 Subject: [PATCH] 0022823: Exception in thickshell operation --- src/BRepOffset/BRepOffset_MakeOffset.cxx | 120 ++++++++++++----------- 1 file changed, 61 insertions(+), 59 deletions(-) diff --git a/src/BRepOffset/BRepOffset_MakeOffset.cxx b/src/BRepOffset/BRepOffset_MakeOffset.cxx index 524c8ce323..4ebb2e3e93 100755 --- a/src/BRepOffset/BRepOffset_MakeOffset.cxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.cxx @@ -2827,65 +2827,67 @@ void BRepOffset_MakeOffset::MakeMissingWalls () Standard_Boolean IsPlanar = Standard_False; if (BAcurve.GetType() == GeomAbs_Circle && BAcurveOE.GetType() == GeomAbs_Circle) - { - gp_Circ aCirc = BAcurve.Circle(); - gp_Dir CircAxisDir = aCirc.Axis().Direction(); - if (OffsetDir.IsParallel( CircAxisDir, Precision::Confusion() )) //case of cylinder - theSurf = GC_MakeCylindricalSurface(aCirc).Value(); - else if (Abs(OffsetDir * CircAxisDir) > Precision::PConfusion()) //case of cone - { - gp_Circ aCircOE = BAcurveOE.Circle(); - gp_Cone theCone = gce_MakeCone(aCirc.Location(), aCircOE.Location(), - aCirc.Radius(), aCircOE.Radius()); - gp_Ax3 theAx3(aCirc.Position()); - if (CircAxisDir * theCone.Axis().Direction() < 0.) - { - theAx3.ZReverse(); - CircAxisDir.Reverse(); - } - theCone.SetPosition(theAx3); - theSurf = new Geom_ConicalSurface(theCone); - } - if (!theSurf.IsNull()) - { - TopLoc_Location Loc; - EdgeLine2d = new Geom2d_Line(gp_Pnt2d(0., 0.), gp_Dir2d(1., 0.)); - BB.UpdateEdge(anEdge, EdgeLine2d, theSurf, Loc, Precision::Confusion()); - Standard_Real Coeff = (OffsetDir * CircAxisDir > 0.)? 1. : -1.; - OELine2d = new Geom2d_Line(gp_Pnt2d(0., OffsetVal*Coeff), gp_Dir2d(1., 0.)); - BB.UpdateEdge(OE, OELine2d, theSurf, Loc, Precision::Confusion()); - aLine2d = new Geom2d_Line(gp_Pnt2d(ParV2, 0.), gp_Dir2d(0., Coeff)); - aLine2d2 = new Geom2d_Line(gp_Pnt2d(ParV1, 0.), gp_Dir2d(0., Coeff)); - if (E3.IsSame(E4)) - { - if (Coeff > 0.) - BB.UpdateEdge(E3, aLine2d, aLine2d2, theSurf, Loc, Precision::Confusion()); - else - { - BB.UpdateEdge(E3, aLine2d2, aLine2d, theSurf, Loc, Precision::Confusion()); - theWire.Nullify(); - BB.MakeWire(theWire); - BB.Add(theWire, anEdge.Oriented(TopAbs_REVERSED)); - BB.Add(theWire, E4); - BB.Add(theWire, OE.Oriented(TopAbs_FORWARD)); - BB.Add(theWire, E3); - theWire.Closed(Standard_True); - } - } - else - { - BB.SameParameter(E3, Standard_False); - BB.SameRange(E3, Standard_False); - BB.SameParameter(E4, Standard_False); - BB.SameRange(E4, Standard_False); - BB.UpdateEdge(E3, aLine2d, theSurf, Loc, Precision::Confusion()); - BB.Range(E3, theSurf, Loc, 0., OffsetVal); - BB.UpdateEdge(E4, aLine2d2, theSurf, Loc, Precision::Confusion()); - BB.Range(E4, theSurf, Loc, 0., OffsetVal); - } - NewFace = BRepLib_MakeFace(theSurf, theWire); - } - } + { + gp_Circ aCirc = BAcurve.Circle(); + gp_Circ aCircOE = BAcurveOE.Circle(); + gp_Lin anAxisLine(aCirc.Axis()); + gp_Dir CircAxisDir = aCirc.Axis().Direction(); + if (aCirc.Axis().IsParallel(aCircOE.Axis(), Precision::Confusion()) && + anAxisLine.Contains(aCircOE.Location(), Precision::Confusion())) + { //cylinder or cone + if (Abs(aCirc.Radius() - aCircOE.Radius()) <= Precision::Confusion()) //case of cylinder + theSurf = GC_MakeCylindricalSurface(aCirc).Value(); + else //case of cone + { + gp_Cone theCone = gce_MakeCone(aCirc.Location(), aCircOE.Location(), + aCirc.Radius(), aCircOE.Radius()); + gp_Ax3 theAx3(aCirc.Position()); + if (CircAxisDir * theCone.Axis().Direction() < 0.) + { + theAx3.ZReverse(); + CircAxisDir.Reverse(); + } + theCone.SetPosition(theAx3); + theSurf = new Geom_ConicalSurface(theCone); + } + TopLoc_Location Loc; + EdgeLine2d = new Geom2d_Line(gp_Pnt2d(0., 0.), gp_Dir2d(1., 0.)); + BB.UpdateEdge(anEdge, EdgeLine2d, theSurf, Loc, Precision::Confusion()); + Standard_Real Coeff = (OffsetDir * CircAxisDir > 0.)? 1. : -1.; + OELine2d = new Geom2d_Line(gp_Pnt2d(0., OffsetVal*Coeff), gp_Dir2d(1., 0.)); + BB.UpdateEdge(OE, OELine2d, theSurf, Loc, Precision::Confusion()); + aLine2d = new Geom2d_Line(gp_Pnt2d(ParV2, 0.), gp_Dir2d(0., Coeff)); + aLine2d2 = new Geom2d_Line(gp_Pnt2d(ParV1, 0.), gp_Dir2d(0., Coeff)); + if (E3.IsSame(E4)) + { + if (Coeff > 0.) + BB.UpdateEdge(E3, aLine2d, aLine2d2, theSurf, Loc, Precision::Confusion()); + else + { + BB.UpdateEdge(E3, aLine2d2, aLine2d, theSurf, Loc, Precision::Confusion()); + theWire.Nullify(); + BB.MakeWire(theWire); + BB.Add(theWire, anEdge.Oriented(TopAbs_REVERSED)); + BB.Add(theWire, E4); + BB.Add(theWire, OE.Oriented(TopAbs_FORWARD)); + BB.Add(theWire, E3); + theWire.Closed(Standard_True); + } + } + else + { + BB.SameParameter(E3, Standard_False); + BB.SameRange(E3, Standard_False); + BB.SameParameter(E4, Standard_False); + BB.SameRange(E4, Standard_False); + BB.UpdateEdge(E3, aLine2d, theSurf, Loc, Precision::Confusion()); + BB.Range(E3, theSurf, Loc, 0., OffsetVal); + BB.UpdateEdge(E4, aLine2d2, theSurf, Loc, Precision::Confusion()); + BB.Range(E4, theSurf, Loc, 0., OffsetVal); + } + NewFace = BRepLib_MakeFace(theSurf, theWire); + } //cylinder or cone + } //if both edges are arcs of circles if (NewFace.IsNull()) { BRepLib_MakeFace MF(theWire, Standard_True); //Only plane