From fdabc2117e9fe330a7b4930dbc6a1873da165623 Mon Sep 17 00:00:00 2001 From: ika Date: Thu, 25 Jul 2013 12:39:12 +0400 Subject: [PATCH] 0023746: IGES wheel model fails to load when OCCT unit is meters Add check for too small distances during edges reordering Fix writing TrimmedSurface (Type 144). Fix checking for too small distances between loops of edges during edge's reordering. Add checking for too small BSpline segments during reading and writing IGES. Fix wire splitting by adding checking that vertexes same not only in 3d, but in 2d too. use tolerance of vertexes recomputed through resolution surface, not 2d curves. Adding test case for this fix Modified test case bugs iges bug23746 and cases in group de according to new reference data --- src/BRepToIGES/BRepToIGES_BRShell.cxx | 10 ++- src/GeomToIGES/GeomToIGES_GeomCurve.cxx | 3 +- src/IGESGeom/IGESGeom_ToolTrimmedSurface.cxx | 5 +- src/IGESToBRep/IGESToBRep_BRepEntity.cxx | 2 +- src/IGESToBRep/IGESToBRep_BasicCurve.cxx | 3 +- src/IGESToBRep/IGESToBRep_TopoSurface.cxx | 6 +- src/ShapeAnalysis/ShapeAnalysis_WireOrder.cxx | 6 +- src/ShapeFix/ShapeFix_Face.cxx | 34 +++++++-- tests/bugs/iges/bug23746 | 76 +++++++++++++++++++ tests/de/iges_1/A4 | 5 +- tests/de/iges_1/A5 | 5 +- tests/de/iges_1/A6 | 5 +- tests/de/iges_1/A8 | 6 +- tests/de/iges_1/D1 | 2 +- tests/de/iges_1/H2 | 6 +- tests/de/iges_1/H5 | 7 +- tests/de/iges_1/H7 | 7 +- tests/de/iges_1/I2 | 8 +- tests/de/iges_1/I7 | 7 +- tests/de/iges_1/J2 | 12 +-- tests/de/iges_1/J3 | 8 +- tests/de/iges_1/K2 | 6 +- tests/de/iges_1/K3 | 8 +- tests/de/iges_1/K4 | 8 +- tests/de/iges_1/K6 | 5 +- tests/de/iges_1/K7 | 5 +- tests/de/iges_1/K8 | 8 +- tests/de/iges_1/L5 | 8 +- tests/de/iges_1/L9 | 8 +- tests/de/iges_1/M9 | 7 +- tests/de/iges_1/N3 | 6 +- tests/de/iges_1/N4 | 6 +- tests/de/iges_1/O4 | 7 +- tests/de/iges_1/P7 | 13 ++-- tests/de/iges_1/Q2 | 6 +- tests/de/iges_1/R1 | 6 +- tests/de/iges_1/R4 | 8 +- tests/de/iges_1/R6 | 9 ++- tests/de/iges_1/R7 | 9 +-- tests/de/iges_2/A1 | 2 +- tests/de/iges_2/A2 | 4 +- tests/de/iges_2/A5 | 6 +- tests/de/iges_2/B2 | 8 +- tests/de/iges_2/B3 | 8 +- tests/de/iges_2/B8 | 8 +- tests/de/iges_2/B9 | 9 +-- tests/de/iges_2/C2 | 8 +- tests/de/iges_2/C3 | 4 +- tests/de/iges_2/C5 | 6 +- tests/de/iges_2/C9 | 6 +- tests/de/iges_2/D1 | 4 +- tests/de/iges_2/D3 | 7 +- tests/de/iges_2/E6 | 10 ++- tests/de/iges_2/F1 | 8 +- tests/de/iges_2/F8 | 8 +- tests/de/iges_2/G2 | 8 +- tests/de/iges_2/G3 | 6 +- tests/de/iges_2/G6 | 5 +- tests/de/iges_2/G8 | 10 +-- tests/de/iges_2/G9 | 6 +- tests/de/iges_2/H5 | 9 ++- tests/de/iges_2/H6 | 5 +- tests/de/iges_2/I8 | 8 +- tests/de/iges_2/I9 | 10 +-- tests/de/iges_2/J1 | 6 +- tests/de/iges_3/A3 | 9 ++- tests/de/iges_3/A4 | 6 +- tests/de/iges_3/A5 | 24 +++--- tests/de/iges_3/A6 | 6 +- tests/de/iges_3/A7 | 8 +- tests/de/iges_3/B1 | 4 +- tests/de/step_1/E3 | 11 +-- tests/de/step_3/E6 | 11 +-- tests/de/step_5/A1 | 16 ++-- 74 files changed, 359 insertions(+), 271 deletions(-) create mode 100755 tests/bugs/iges/bug23746 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