]> OCCT Git - occt.git/commitdiff
0032814: Modeling algorithms - Unifysamedom produces invalid result
authorjgv <jgv@opencascade.com>
Mon, 14 Feb 2022 21:41:00 +0000 (00:41 +0300)
committerkgv <kgv@opencascade.com>
Fri, 22 Apr 2022 08:21:54 +0000 (11:21 +0300)
Minor correction in ShapeUpgrade_UnifySameDomain::IntUnifyFaces: correct collecting splitting vertices in the new wire

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

index cb69e34e95f8d27ca15366fa775793fa1be6e277..f48c390f0f279a49784249223c6d96cf14f40f61 100644 (file)
 
 IMPLEMENT_STANDARD_RTTIEXT(ShapeUpgrade_UnifySameDomain,Standard_Transient)
 
+static Standard_Boolean IsOnSingularity(const TopTools_ListOfShape& theEdgeList)
+{
+  TopTools_ListIteratorOfListOfShape anItl (theEdgeList);
+  for (; anItl.More(); anItl.Next())
+  {
+    const TopoDS_Edge& anEdge = TopoDS::Edge (anItl.Value());
+    if (BRep_Tool::Degenerated (anEdge))
+      return Standard_True;
+  }
+
+  return Standard_False;
+}
+
 static void SplitWire (const TopoDS_Wire&                theWire,
                        const TopoDS_Face&                theFace,
                        const TopTools_IndexedMapOfShape& theVmap,
@@ -3292,6 +3305,10 @@ void ShapeUpgrade_UnifySameDomain::IntUnifyFaces(const TopoDS_Shape& theInpShape
           if (NextEdge.IsNull())
           {
             Standard_Boolean EndOfWire = Standard_False;
+
+            Standard_Boolean anIsOnSingularity = IsOnSingularity (Elist);
+            if (!anIsOnSingularity && Elist.Extent() > 1)
+              SplittingVertices.Add (CurVertex);
             
             TopTools_ListOfShape TmpElist, TrueElist;
             //<TrueElist> will be the list of candidates to become <NextEdge>
@@ -3311,7 +3328,6 @@ void ShapeUpgrade_UnifySameDomain::IntUnifyFaces(const TopoDS_Shape& theInpShape
             else
             {
               //we must choose the closest direction - the biggest angle
-              SplittingVertices.Add (CurVertex);
               Standard_Real MaxAngle = RealFirst();
               TopoDS_Edge TrueEdge;
               Handle(Geom2d_Curve) CurPCurve = BRep_Tool::CurveOnSurface(CurEdge, F_RefFace, fpar, lpar);
diff --git a/tests/bugs/heal/bug32814_1 b/tests/bugs/heal/bug32814_1
new file mode 100644 (file)
index 0000000..d4225f4
--- /dev/null
@@ -0,0 +1,23 @@
+puts "=============================================="
+puts "OCC32814: Unifysamedom produces invalid result"
+puts "=============================================="
+puts ""
+
+restore [locate_data_file bug32814_1.brep] s
+
+unifysamedom result s -a 1e-4
+
+checkshape result
+bopargcheck result
+
+checknbshapes result -t -face 7 -wire 13 -edge 70 -vertex 64
+
+set tolres [checkmaxtol result]
+
+if { ${tolres} > 1.e-7} {
+   puts "Error: bad tolerance of result"
+}
+
+checkprops result -s 5.54082e+06
+
+checkview -display result -2d -path ${imagedir}/${test_image}.png
\ No newline at end of file
diff --git a/tests/bugs/heal/bug32814_2 b/tests/bugs/heal/bug32814_2
new file mode 100644 (file)
index 0000000..96f6b4d
--- /dev/null
@@ -0,0 +1,23 @@
+puts "=============================================="
+puts "OCC32814: Unifysamedom produces invalid result"
+puts "=============================================="
+puts ""
+
+restore [locate_data_file bug32814_2.brep] s
+
+unifysamedom result s
+
+checkshape result
+bopargcheck result
+
+checknbshapes result -t -solid 1 -shell 1 -face 78 -wire 110 -edge 220 -vertex 136
+
+set tolres [checkmaxtol result]
+
+if { ${tolres} > 2.e-7} {
+   puts "Error: bad tolerance of result"
+}
+
+checkprops result -s 1.61456e+06 -v 3e+07
+
+checkview -display result -2d -path ${imagedir}/${test_image}.png
\ No newline at end of file