]> OCCT Git - occt.git/commitdiff
0032578: Modeling Algorithms - Splitting face by set of edges fails
authoremv <emv@opencascade.com>
Mon, 20 Sep 2021 15:07:30 +0000 (18:07 +0300)
committersmoskvin <smoskvin@opencascade.com>
Mon, 27 Sep 2021 17:12:00 +0000 (20:12 +0300)
Update information about ON/IN sub-shapes for all touched faces when intersection with shapes of lower types (edges and vertices) complete.
Previously only the faces participating in the Face/Face intersection were updated.

src/BOPAlgo/BOPAlgo_Builder_2.cxx
src/BOPAlgo/BOPAlgo_PaveFiller_11.cxx
src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx
src/BOPAlgo/BOPAlgo_PaveFiller_7.cxx
tests/bugs/modalg_7/bug32578 [new file with mode: 0644]

index 186cd8839968ea8dae0f8e515836df6f70085a04..07bbf9bbbf1b4639bd954f8da36bbced647933a1 100644 (file)
@@ -471,6 +471,7 @@ void BOPAlgo_Builder::BuildSplitFaces(const Message_ProgressRange& theRange)
     for (j=1; j<=aNbPBIn; ++j) {
       const Handle(BOPDS_PaveBlock)& aPB=aMPBIn(j);
       nSp=aPB->Edge();
+      Standard_ASSERT(nSp >= 0, "Face information is not up to date", continue);
       aSp=(*(TopoDS_Edge*)(&myDS->Shape(nSp)));
       //
       aSp.Orientation(TopAbs_FORWARD);
index e60fa18540eec66504ebe863f86a2702bf487695..7a3f312d1884596ed1b7fea3991f4ac8f1e8981c 100644 (file)
@@ -152,6 +152,7 @@ void BOPAlgo_PaveFiller::CheckSelfInterference()
           Standard_Integer iPB, aNbPB = aMPBF.Extent();
           for (iPB = 1; iPB <= aNbPB; ++iPB) {
             const Handle(BOPDS_PaveBlock)& aPB = aMPBF(iPB);
+            Standard_ASSERT(aPB->HasEdge(), "Face information is not up to date", continue);
             const TopoDS_Shape& aE = myDS->Shape(aPB->Edge());
             // add connection
             TopTools_IndexedMapOfShape* pMSOr = aMCSI.ChangeSeek(aE);
index 51558709ab1ac30a6c0453e0f0ddbb62ec69af97..a0824caf245a95892aa91687969fb8153e705259 100644 (file)
@@ -237,13 +237,42 @@ typedef NCollection_Vector<BOPAlgo_FaceFace> BOPAlgo_VectorOfFaceFace;
 //=======================================================================
 void BOPAlgo_PaveFiller::PerformFF(const Message_ProgressRange& theRange)
 {
+  // Update face info for all Face/Face intersection pairs
+  // and also for the rest of the faces with FaceInfo already initialized,
+  // i.e. anyhow touched faces.
   myIterator->Initialize(TopAbs_FACE, TopAbs_FACE);
   Standard_Integer iSize = myIterator->ExpectedLength();
-  Message_ProgressScope aPSOuter(theRange, NULL, 1);
-  if (!iSize) {
-    return; 
+
+  // Collect faces from intersection pairs
+  TColStd_MapOfInteger aMIFence;
+  Standard_Integer nF1, nF2;
+  for (; myIterator->More(); myIterator->Next())
+  {
+    myIterator->Value(nF1, nF2);
+    aMIFence.Add (nF1);
+    aMIFence.Add (nF2);
   }
-  //
+  // Collect the rest of the touched faces
+  for (Standard_Integer i = 0; i < myDS->NbSourceShapes(); ++i)
+  {
+    const BOPDS_ShapeInfo& aSI = myDS->ShapeInfo (i);
+    if (aSI.ShapeType() == TopAbs_FACE && aSI.HasReference())
+    {
+      aMIFence.Add (i);
+    }
+  }
+  // Update face info
+  myDS->UpdateFaceInfoOn (aMIFence);
+  myDS->UpdateFaceInfoIn (aMIFence);
+
+  if (!iSize)
+  {
+    // no intersection pairs found
+    return;
+  }
+
+  Message_ProgressScope aPSOuter(theRange, NULL, 1);
+
   BOPDS_VectorOfInterfFF& aFFs = myDS->InterfFF();
   aFFs.SetIncrement(iSize);
   //
@@ -255,23 +284,8 @@ void BOPAlgo_PaveFiller::PerformFF(const Message_ProgressRange& theRange)
   // Post-processing options
   Standard_Boolean bSplitCurve = Standard_False;
   //
-  // Fence map to store faces with updated FaceInfo structure
-  TColStd_MapOfInteger aMIFence;
   // Prepare the pairs of faces for intersection
   BOPAlgo_VectorOfFaceFace aVFaceFace;
-  Standard_Integer nF1, nF2;
-  //
-  for (; myIterator->More(); myIterator->Next()) {
-    myIterator->Value(nF1, nF2);
-
-    aMIFence.Add (nF1);
-    aMIFence.Add (nF2);
-  }
-  // Update face info
-  myDS->UpdateFaceInfoOn (aMIFence);
-  myDS->UpdateFaceInfoIn (aMIFence);
-
-  // Initialize interferences
   myIterator->Initialize(TopAbs_FACE, TopAbs_FACE);
   for (; myIterator->More(); myIterator->Next()) {
     if (UserBreak(aPSOuter))
index 1ba29aae8a6f64b2739befe7c9509dac12b5e385..969d3e1b4496b21a231983150cd254a8bc7bf971 100644 (file)
@@ -634,6 +634,7 @@ void BOPAlgo_PaveFiller::MakePCurves(const Message_ProgressRange& theRange)
     for (j = 1; j <= aNbPBIn; ++j) {
       const Handle(BOPDS_PaveBlock)& aPB = aMPBIn(j);
       nE=aPB->Edge();
+      Standard_ASSERT(nE >= 0, "Face information is not up to date", continue);
       const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&myDS->Shape(nE)));
       //
       BOPAlgo_MPC& aMPC=aVMPC.Appended();
diff --git a/tests/bugs/modalg_7/bug32578 b/tests/bugs/modalg_7/bug32578
new file mode 100644 (file)
index 0000000..4e11206
--- /dev/null
@@ -0,0 +1,28 @@
+puts "================================================="
+puts "OCC32578: Modeling Algorithms - Splitting face by set of edges fails"
+puts "================================================="
+puts ""
+
+restore [locate_data_file bug32578_face.brep] f
+restore [locate_data_file bug32578_edges.brep] ce
+
+bfuzzyvalue 0.01
+
+bclearobjects
+bcleartools
+baddobjects f
+eval baddtools [explode ce]
+bfillds
+bsplit result
+
+checkshape result
+if {![regexp "This shape seems to be OK" [bopcheck result]]} {
+  puts "Error: result is a self-interferring shape"
+}
+
+checknbshapes result -vertex 646 -edge 1234 -wire 589 -face 589 -t
+checkprops result -s 351.033
+
+checkview -display result -2d -path ${imagedir}/${test_image}.png
+
+boptions -default