From b08cd044f97635a40cceb86769b2399527090001 Mon Sep 17 00:00:00 2001 From: jgv Date: Mon, 18 Oct 2021 20:00:20 +0300 Subject: [PATCH] 0032623: [Regression] Modelling Algorithms - UnifySameDomain invalid result only in release mode Correct local function ReconstructMissedSeam: use copy of existing pcurve for seam edge reconstruction to prevent possible corruption of another edges. --- .../ShapeUpgrade_UnifySameDomain.cxx | 18 +++++++++-------- tests/bugs/heal/bug32623 | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 tests/bugs/heal/bug32623 diff --git a/src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.cxx b/src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.cxx index 14166e9d52..a501194c72 100644 --- a/src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.cxx +++ b/src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.cxx @@ -699,6 +699,8 @@ static void ReconstructMissedSeam(const TopTools_SequenceOfShape& theEdges, { //make edge a real seam edge with 2 pcurves on ref face Handle(Geom2d_Curve) aPC = BRep_Tool::CurveOnSurface (MissedSeam, theFrefFace, Param1, Param2); + Handle(Geom2d_Curve) aCopyPC = Handle(Geom2d_Curve)::DownCast(aPC->Copy()); + gp_Pnt2d aP2d = aPC->Value(Param1); if (Abs(aP2d.Coord(IndCoord) - theCurPoint.Coord(IndCoord)) > thePeriod/2) { @@ -713,18 +715,18 @@ static void ReconstructMissedSeam(const TopTools_SequenceOfShape& theEdges, else Offset.SetCoord (0., anOffset); - aPC->Translate(Offset); + aCopyPC->Translate(Offset); } gp_Pnt2d aFirstP2d, aLastP2d; if (MissedSeam.Orientation() == TopAbs_FORWARD) { - aFirstP2d = aPC->Value(Param1); - aLastP2d = aPC->Value(Param2); + aFirstP2d = aCopyPC->Value(Param1); + aLastP2d = aCopyPC->Value(Param2); } else { - aFirstP2d = aPC->Value(Param2); - aLastP2d = aPC->Value(Param1); + aFirstP2d = aCopyPC->Value(Param2); + aLastP2d = aCopyPC->Value(Param1); } if (theIsU) { @@ -740,16 +742,16 @@ static void ReconstructMissedSeam(const TopTools_SequenceOfShape& theEdges, else Offset.SetCoord (0., -thePeriod); } - Handle(Geom2d_Curve) AnotherPC = Handle(Geom2d_Curve)::DownCast(aPC->Copy()); + Handle(Geom2d_Curve) AnotherPC = Handle(Geom2d_Curve)::DownCast(aCopyPC->Copy()); AnotherPC->Translate(Offset); TopoDS_Edge F_MissedSeam = MissedSeam; F_MissedSeam.Orientation (TopAbs_FORWARD); Handle(Geom2d_Curve) NullPC; BB.UpdateEdge (F_MissedSeam, NullPC, theFrefFace, 0.); if (MissedSeam.Orientation() == TopAbs_FORWARD) - BB.UpdateEdge (F_MissedSeam, aPC, AnotherPC, theFrefFace, 0.); + BB.UpdateEdge (F_MissedSeam, aCopyPC, AnotherPC, theFrefFace, 0.); else - BB.UpdateEdge (F_MissedSeam, AnotherPC, aPC, theFrefFace, 0.); + BB.UpdateEdge (F_MissedSeam, AnotherPC, aCopyPC, theFrefFace, 0.); } BB.Continuity(MissedSeam, theFrefFace, theFrefFace, aContinuity); diff --git a/tests/bugs/heal/bug32623 b/tests/bugs/heal/bug32623 new file mode 100644 index 0000000000..dfd097f64a --- /dev/null +++ b/tests/bugs/heal/bug32623 @@ -0,0 +1,20 @@ +puts "=============================================================" +puts "OCC32623: UnifySameDomain invalid result only in release mode" +puts "=============================================================" +puts "" + +restore [locate_data_file bug32623.brep] a + +unifysamedom result a + +checkshape result + +checknbshapes result -t -solid 1 -shell 1 -face 58 -wire 68 -edge 163 -vertex 107 + +set tolres [checkmaxtol result] + +if { ${tolres} > 2.e-5} { + puts "Error: bad tolerance of result" +} + +checkprops result -s 56934.4 -v 244645