]> OCCT Git - occt.git/commitdiff
0032623: [Regression] Modelling Algorithms - UnifySameDomain invalid result only...
authorjgv <jgv@opencascade.com>
Mon, 18 Oct 2021 17:00:20 +0000 (20:00 +0300)
committersmoskvin <smoskvin@opencascade.com>
Wed, 20 Oct 2021 17:06:30 +0000 (20:06 +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 8d0e45aedc8d4ccb39df2fe2dd106720ed2cf996..f9185088b202e25ea005f29fd26868a259efe934 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