diff --git a/src/BRepToIGES/BRepToIGES_BRShell.cxx b/src/BRepToIGES/BRepToIGES_BRShell.cxx index 57a8123811..52953a6c8e 100755 --- a/src/BRepToIGES/BRepToIGES_BRShell.cxx +++ b/src/BRepToIGES/BRepToIGES_BRShell.cxx @@ -249,9 +249,15 @@ Handle(IGESData_IGESEntity) BRepToIGES_BRShell ::TransferFace(const TopoDS_Face& // returns the TrimmedSurface // -------------------------- - Standard_Boolean Flag = Standard_True; // pour l`instant + Standard_Boolean Flag = Standard_True; Handle(IGESGeom_TrimmedSurface) TrimmedSurf = new IGESGeom_TrimmedSurface; - TrimmedSurf-> Init (ISurf, Flag, IOuter, Tab); + if (BRep_Tool::NaturalRestriction(start)) { + //if face bounds and surface bounds are same, outer wire is unnecessary + Standard_Boolean Flag = Standard_False; + TrimmedSurf-> Init (ISurf, Flag, NULL, Tab); + } + else + TrimmedSurf-> Init (ISurf, Flag, IOuter, Tab); res = TrimmedSurf; if (IsReversed) myface.Reverse(); diff --git a/src/GeomToIGES/GeomToIGES_GeomCurve.cxx b/src/GeomToIGES/GeomToIGES_GeomCurve.cxx index 2697ce86ce..99187c1e08 100755 --- a/src/GeomToIGES/GeomToIGES_GeomCurve.cxx +++ b/src/GeomToIGES/GeomToIGES_GeomCurve.cxx @@ -324,7 +324,8 @@ Handle(IGESData_IGESEntity) GeomToIGES_GeomCurve::TransferCurve OCC_CATCH_SIGNALS Handle(Geom_BSplineCurve) bspl = Handle(Geom_BSplineCurve)::DownCast ( mycurve->Copy() ); if ( ! bspl.IsNull() ) { - bspl->Segment ( Umin, Umax ); + if (Abs(Umax-Umin) > Precision::PConfusion()) + bspl->Segment ( Umin, Umax ); mycurve = bspl; } } diff --git a/src/IGESGeom/IGESGeom_ToolTrimmedSurface.cxx b/src/IGESGeom/IGESGeom_ToolTrimmedSurface.cxx index 80d37a9d85..52a9ed61e1 100755 --- a/src/IGESGeom/IGESGeom_ToolTrimmedSurface.cxx +++ b/src/IGESGeom/IGESGeom_ToolTrimmedSurface.cxx @@ -186,7 +186,10 @@ void IGESGeom_ToolTrimmedSurface::WriteOwnParams IW.Send(ent->OuterBoundaryType()); IW.Send(up); - IW.Send(ent->OuterContour()); + if (ent->OuterBoundaryType()) + IW.Send(ent->OuterContour()); + else + IW.Send(0); Standard_Integer I; for (I = 1; I <= up; I ++) IW.Send(ent->InnerContour(I)); diff --git a/src/IGESToBRep/IGESToBRep_BRepEntity.cxx b/src/IGESToBRep/IGESToBRep_BRepEntity.cxx index 6d628e7fd3..6899e95cae 100755 --- a/src/IGESToBRep/IGESToBRep_BRepEntity.cxx +++ b/src/IGESToBRep/IGESToBRep_BRepEntity.cxx @@ -496,7 +496,7 @@ TopoDS_Shape IGESToBRep_BRepEntity::TransferFace //#62 rln 10.01.99 PRO17015 (reading back IGES written in 'BRep' mode) face #65 F = TopoDS::Face (myshape); F.EmptyCopy(); - if (!hasouterloop) B.NaturalRestriction (F,Standard_True); + if (nbloops == 0) B.NaturalRestriction (F,Standard_True); // Loops // ----- diff --git a/src/IGESToBRep/IGESToBRep_BasicCurve.cxx b/src/IGESToBRep/IGESToBRep_BasicCurve.cxx index fe86fdedef..e67d398b1e 100755 --- a/src/IGESToBRep/IGESToBRep_BasicCurve.cxx +++ b/src/IGESToBRep/IGESToBRep_BasicCurve.cxx @@ -1130,7 +1130,8 @@ Handle(Geom_Curve) IGESToBRep_BasicCurve::TransferBSplineCurve (Last-Ufin)>-Precision::PConfusion()) && Udeb<=Ufin ) { try { OCC_CATCH_SIGNALS - BSplineRes->Segment(Udeb, Ufin); + if (Abs(Ufin-Udeb) > Precision::PConfusion()) + BSplineRes->Segment(Udeb, Ufin); res = BSplineRes; } catch (Standard_Failure) { diff --git a/src/IGESToBRep/IGESToBRep_TopoSurface.cxx b/src/IGESToBRep/IGESToBRep_TopoSurface.cxx index b72f1d237a..e65114c9b5 100755 --- a/src/IGESToBRep/IGESToBRep_TopoSurface.cxx +++ b/src/IGESToBRep/IGESToBRep_TopoSurface.cxx @@ -1231,7 +1231,11 @@ TopoDS_Shape IGESToBRep_TopoSurface::TransferTrimmedSurface face.EmptyCopy(); TopoDS_Shape myshape1 = TC.TransferCurveOnFace (face, st->OuterContour(), trans, uFact, Standard_False); // si ca se passe mal , on recupere au moins la face avec NaturalRestriction - if (myshape1 .IsNull()) face = faceres; + if (myshape1 .IsNull()) { + face = faceres; + BRep_Builder B; + B.NaturalRestriction(face,Standard_False); + } } for (Standard_Integer i = 1; i <= st->NbInnerContours(); i++) { TopoDS_Shape myshape2 = TC.TransferCurveOnFace (face, st->InnerContour(i), trans, uFact, Standard_False); diff --git a/src/ShapeAnalysis/ShapeAnalysis_WireOrder.cxx b/src/ShapeAnalysis/ShapeAnalysis_WireOrder.cxx index 352319b86e..d218e75354 100755 --- a/src/ShapeAnalysis/ShapeAnalysis_WireOrder.cxx +++ b/src/ShapeAnalysis/ShapeAnalysis_WireOrder.cxx @@ -353,13 +353,13 @@ void ShapeAnalysis_WireOrder::Perform(const Standard_Boolean /*closed*/) } else minDist = revDist; - if(minDist < distmin) { + if(minDist < distmin && Abs(distmin - minDist) > tol2) { distmin = minDist; direct = (dirDist <= revDist); lloop = j; } } - if(distmin tol2) { minLocDist = distmin; LocDirect = direct; LocNumInLoop = lloop; @@ -367,7 +367,7 @@ void ShapeAnalysis_WireOrder::Perform(const Standard_Boolean /*closed*/) } } - if(minLocDist < minLoopDist) { + if(minLocDist < minLoopDist && Abs(minLoopDist - minLocDist) > tol2) { minLoopDist = minLocDist; loopNum = i; loopDirect = LocDirect; diff --git a/src/ShapeFix/ShapeFix_Face.cxx b/src/ShapeFix/ShapeFix_Face.cxx index 70274608d7..e433ed746c 100755 --- a/src/ShapeFix/ShapeFix_Face.cxx +++ b/src/ShapeFix/ShapeFix_Face.cxx @@ -41,6 +41,7 @@ #include #include +#include #include #include #include @@ -270,7 +271,7 @@ void ShapeFix_Face::Add (const TopoDS_Wire& wire) //purpose : auxilary - try to split wire (it is needed if some segments // were removed in ShapeFix_Wire::FixSelfIntersection() //======================================================================= -static Standard_Boolean SplitWire(const TopoDS_Wire& wire, +static Standard_Boolean SplitWire(const TopoDS_Face &face, const TopoDS_Wire& wire, TopTools_SequenceOfShape& aResWires) { TColStd_MapOfInteger UsedEdges; @@ -288,9 +289,10 @@ static Standard_Boolean SplitWire(const TopoDS_Wire& wire, sewd1->Add(E1); Standard_Boolean IsConnectedEdge = Standard_True; for(j=2; j<=sewd->NbEdges() && IsConnectedEdge; j++) { + TopoDS_Edge E2; for(k=2; k<=sewd->NbEdges(); k++) { if(UsedEdges.Contains(k)) continue; - TopoDS_Edge E2 = sewd->Edge(k); + E2 = sewd->Edge(k); TopoDS_Vertex V21 = sae.FirstVertex(E2); TopoDS_Vertex V22 = sae.LastVertex(E2); if( sae.FirstVertex(E2).IsSame(V1) ) { @@ -300,15 +302,31 @@ static Standard_Boolean SplitWire(const TopoDS_Wire& wire, break; } } - if(V1.IsSame(V0)) { - // new wire is closed, put it into sequence - aResWires.Append(sewd1->Wire()); - break; - } if(k>sewd->NbEdges()) { IsConnectedEdge = Standard_False; break; } + if(V1.IsSame(V0)) { + //check that V0 and V1 are same in 2d too + Standard_Real a1,b1,a2,b2; + Handle (Geom2d_Curve) curve1 = BRep_Tool::CurveOnSurface(E1,face,a1,b1); + Handle (Geom2d_Curve) curve2 = BRep_Tool::CurveOnSurface(E2,face,a2,b2); + gp_Pnt2d v0,v1; + if (E1.Orientation() == TopAbs_REVERSED) + a1 = b1; + if (E2.Orientation() == TopAbs_REVERSED) + b2 = a2; + curve1->D0(a1,v0); + curve2->D0(b2,v1); + GeomAdaptor_Surface anAdaptor(BRep_Tool::Surface(face)); + Standard_Real tol = Max(BRep_Tool::Tolerance(V0),BRep_Tool::Tolerance(V1)); + Standard_Real maxResolution = 2 * Max ( anAdaptor.UResolution(tol), anAdaptor.VResolution(tol) ); + if (v0.SquareDistance(v1) < maxResolution) { + // new wire is closed, put it into sequence + aResWires.Append(sewd1->Wire()); + break; + } + } } if(!IsConnectedEdge) { // create new notclosed wire @@ -595,7 +613,7 @@ Standard_Boolean ShapeFix_Face::Perform() } nbw++; TopoDS_Wire wire = TopoDS::Wire ( iter.Value() ); - SplitWire(wire,aWires); + SplitWire(tmpFace,wire,aWires); } if(nbw