]> OCCT Git - occt.git/commitdiff
0032623: [Regression] Modelling Algorithms - UnifySameDomain invalid result only... V7_5_3p1
authorjgv <jgv@opencascade.com>
Mon, 18 Oct 2021 17:00:20 +0000 (20:00 +0300)
committerjfa <jfa@opencascade.com>
Tue, 19 Oct 2021 09:52:31 +0000 (12:52 +0300)
Correct local function ReconstructMissedSeam: use copy of existing pcurve for seam edge reconstruction to prevent possible corruption of another edges.

src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.cxx
tests/bugs/heal/bug32623 [new file with mode: 0644]

index 14166e9d52f0d793634486a97f540dcfd8ff00c5..a501194c72e46f4837997d83b700f1f6a0e4247c 100644 (file)
@@ -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 (file)
index 0000000..dfd097f
--- /dev/null
@@ -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