0025937: Failed Cut Edge or Face by HalfSpace.
authorpkv <pkv@opencascade.com>
Thu, 30 Apr 2015 10:49:25 +0000 (13:49 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 30 Apr 2015 10:51:04 +0000 (13:51 +0300)
Addressing the causes of warnings.

Test cases for issue CR25937

src/BOPAlgo/BOPAlgo_BuilderFace.cxx
src/BOPAlgo/BOPAlgo_BuilderSolid.cxx
src/IntTools/IntTools_Context.cdl
src/IntTools/IntTools_Context.cxx
tests/boolean/bcut_complex/O7 [changed mode: 0644->0755]
tests/bugs/modalg_6/bug25937_1 [new file with mode: 0755]
tests/bugs/modalg_6/bug25937_2 [new file with mode: 0755]
tests/bugs/modalg_6/bug25937_3 [new file with mode: 0755]

index d9104c9..b1c5387 100644 (file)
@@ -480,6 +480,17 @@ void BOPAlgo_BuilderFace::PerformAreas()
   //
   myAreas.Clear();
   //
+  if (myLoops.IsEmpty()) {
+    if (myContext->IsInfiniteFace(myFace)) {
+      aBB.MakeFace(aFace, aS, aLoc, aTol);
+      if (BRep_Tool::NaturalRestriction(myFace)) {
+        aBB.NaturalRestriction(aFace, Standard_True);
+      }
+      myAreas.Append(aFace); 
+    }
+    return;
+  }
+  //
   // 1. Growthes and Holes -> aDMISB: [Index/ShapeBox2D]
   aIt1.Initialize(myLoops);
   for (k=0 ; aIt1.More(); aIt1.Next(), ++k) {
index 89bb2be..c361954 100644 (file)
@@ -463,7 +463,17 @@ void BOPAlgo_BuilderSolid::PerformLoops()
   // 1. Shells Usual
   aIt.Initialize (myShapes);
   for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aF=aIt.Value();
+    const TopoDS_Face& aF=*((TopoDS_Face*)&aIt.Value());
+    if (myContext->IsInfiniteFace(aF)) {
+      TopoDS_Shell aSh;
+      BRep_Builder aBB;
+      //
+      aBB.MakeShell(aSh);
+      aBB.Add(aSh, aF);
+      myLoops.Append(aSh);
+      continue;
+    }
+    //
     if (!myShapesToAvoid.Contains(aF)) {
       aSSp.AddStartElement(aF);
     }
@@ -511,9 +521,11 @@ void BOPAlgo_BuilderSolid::PerformLoops()
   // c. add all edges that are not processed to myShapesToAvoid
   aIt.Initialize (myShapes);
   for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aF=aIt.Value();
-    if (!aMP.Contains(aF)) {
-      myShapesToAvoid.Add(aF);
+    const TopoDS_Face& aF=*((TopoDS_Face*)&aIt.Value());
+    if (!myContext->IsInfiniteFace(aF)) {
+      if (!aMP.Contains(aF)) {
+        myShapesToAvoid.Add(aF);
+      }
     }
   }
   //=================================================
index 7bbcd9b..4b17a93 100644 (file)
@@ -25,13 +25,15 @@ class Context from IntTools
 
 
 uses  
-
+     
+    Box from Bnd,
     Pnt2d from gp,
     Pnt   from gp, 
     State from TopAbs,  
     Curve from Geom,   
     ProjectPointOnCurve from GeomAPI, 
     ProjectPointOnSurf  from GeomAPI,
+    Shape  from TopoDS, 
     Vertex from TopoDS, 
     Face   from TopoDS,
     Edge   from TopoDS, 
@@ -300,7 +302,19 @@ is
     --- Returns false if projection algorithm failed
     --- other wiese returns true.
     ---
-     
+    BndBox(me:mutable; 
+        theS:Shape from TopoDS) 
+    returns Box from Bnd; 
+    ---C++: return &  
+    --- Returns a reference to boundong box 
+    --- for given shape  <theS>
+    ---  
+    IsInfiniteFace(me:mutable;   
+        theFace:Face from TopoDS)  
+    returns Boolean from Standard;  
+    ---Purpose: Returns true if the solid <theFace> has 
+    --          infinite bounds     
 fields 
     myAllocator  : BaseAllocator from BOPCol is protected;
     myFClass2dMap:DataMapOfShapeAddress from BOPCol is protected; 
@@ -309,7 +323,8 @@ fields
     mySClassMap  :DataMapOfShapeAddress from BOPCol is protected;
     myProjPTMap  :DataMapOfTransientAddress from BOPCol is protected;    
     myHatcherMap :DataMapOfShapeAddress from BOPCol is protected; 
-    myProjSDataMap:DataMapOfShapeAddress from BOPCol is protected; 
+    myProjSDataMap:DataMapOfShapeAddress from BOPCol is protected;  
+    myBndBoxDataMap:DataMapOfShapeAddress from BOPCol is protected;  
     myCreateFlag :Integer from Standard is protected; 
      
 end Context;
index 71432b3..6c3ad6a 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <BRep_Tool.hxx>
 #include <BRepAdaptor_Surface.hxx>
+#include <BRepBndLib.hxx>
 
 #include <IntTools_Tools.hxx>
 #include <IntTools_FClass2d.hxx>
@@ -56,6 +57,7 @@ IntTools_Context::IntTools_Context()
   myProjPTMap(100, myAllocator),
   myHatcherMap(100, myAllocator),
   myProjSDataMap(100, myAllocator),
+  myBndBoxDataMap(100, myAllocator),
   myCreateFlag(0)
 {
 }
@@ -74,6 +76,7 @@ IntTools_Context::IntTools_Context
   myProjPTMap(100, myAllocator),
   myHatcherMap(100, myAllocator),
   myProjSDataMap(100, myAllocator),
+  myBndBoxDataMap(100, myAllocator),
   myCreateFlag(1)
 {
 }
@@ -158,6 +161,69 @@ IntTools_Context::~IntTools_Context()
     myAllocator->Free(anAdr);
   }
   myProjSDataMap.Clear();
+  //
+  Bnd_Box* pBox;
+  aIt.Initialize(myBndBoxDataMap);
+  for (; aIt.More(); aIt.Next()) {
+    anAdr=aIt.Value();
+    pBox=(Bnd_Box*)anAdr;
+    (*pBox).~Bnd_Box();
+    myAllocator->Free(anAdr); 
+  }
+  myBndBoxDataMap.Clear();
+}
+//=======================================================================
+//function : BndBox
+//purpose  : 
+//=======================================================================
+Bnd_Box& IntTools_Context::BndBox(const TopoDS_Shape& aS)
+{
+  Standard_Address anAdr;
+  Bnd_Box* pBox;
+  //
+  if (!myBndBoxDataMap.IsBound(aS)) {
+    //
+    pBox=(Bnd_Box*)myAllocator->Allocate(sizeof(Bnd_Box));
+    new (pBox) Bnd_Box();
+    //
+    Bnd_Box &aBox=*pBox;
+    BRepBndLib::Add(aS, aBox);
+    //
+    anAdr=(Standard_Address)pBox;
+    myBndBoxDataMap.Bind(aS, anAdr);
+  }
+  else {
+    anAdr=myBndBoxDataMap.Find(aS);
+    pBox=(Bnd_Box*)anAdr;
+  }
+  return *pBox;
+}
+//=======================================================================
+//function : IsInfiniteFace
+//purpose  : 
+//=======================================================================
+Standard_Boolean IntTools_Context::IsInfiniteFace
+  (const TopoDS_Face& aFace)
+{
+  Standard_Boolean bRet;
+  Standard_Integer i;
+  Standard_Real aX[6];
+  //
+  bRet=Standard_False;
+  //
+  if (!BRep_Tool::NaturalRestriction(aFace)) {
+    return bRet; 
+  }
+  //
+  Bnd_Box& aBox=BndBox(aFace);
+  //
+  aBox.Get(aX[0], aX[1], aX[2], aX[3], aX[4], aX[5]);
+  //
+  for (i=0; (i<6) && (!bRet); ++i) {
+    bRet=Precision::IsInfinite(aX[i]);
+  }
+  //
+  return bRet; 
 }
 //=======================================================================
 //function : FClass2d
old mode 100644 (file)
new mode 100755 (executable)
index 58dfee9..3d39bc6
@@ -1,8 +1,9 @@
-puts "TODO #22911 ALL: Error : The $command is not valid. The area is 0."
+puts "TODO #25937 ALL: Faulty shapes in variables faulty_1"
+#puts "TODO #22911 ALL: Error : The $command is not valid. The area is 0."
 
 restore [locate_data_file CTO908_topo108-o.brep] obj
 restore [locate_data_file pro12903b.rle] out
 
 bcut result obj out
 
-set square 0
+set square 281453
diff --git a/tests/bugs/modalg_6/bug25937_1 b/tests/bugs/modalg_6/bug25937_1
new file mode 100755 (executable)
index 0000000..fcb8c6b
--- /dev/null
@@ -0,0 +1,34 @@
+puts "============"
+puts "OCC25937"
+puts "============"
+puts ""
+###############################
+## Failed Cut Edge or Face by HalfSpace.
+###############################
+
+# Cut a wire by halfspace
+plane h 0 0 0 1 0 0
+mkface h h
+halfspace h h 10 0 0
+polyline a -10 -10 0 10 -10 0 10 10 0 -10 10 0 -10 -10 0
+
+bop a h
+bopcut result
+
+set length 40.
+
+set nbshapes_expected "
+Number of shapes in shape
+ VERTEX    : 4
+ EDGE      : 3
+ WIRE      : 1
+ FACE      : 0
+ SHELL     : 0
+ SOLID     : 0
+ COMPSOLID : 0
+ COMPOUND  : 1
+ SHAPE     : 9
+"
+checknbshapes result -ref ${nbshapes_expected} -t -m "Result obtained by Cut a wire by halfspace"
+
+set 3dviewer 1
diff --git a/tests/bugs/modalg_6/bug25937_2 b/tests/bugs/modalg_6/bug25937_2
new file mode 100755 (executable)
index 0000000..039abf1
--- /dev/null
@@ -0,0 +1,36 @@
+puts "============"
+puts "OCC25937"
+puts "============"
+puts ""
+###############################
+## Failed Cut Edge or Face by HalfSpace.
+###############################
+
+# Cut a face by halfspace
+plane h 0 0 0 1 0 0
+mkface h h
+halfspace h h 10 0 0
+plane a 0 0 0 0 0 1
+mkface a a -10 10 -10 10
+
+bop a h
+bopcut result
+
+set length 60.
+set square 200.
+
+set nbshapes_expected "
+Number of shapes in shape
+ VERTEX    : 4
+ EDGE      : 4
+ WIRE      : 1
+ FACE      : 1
+ SHELL     : 1
+ SOLID     : 0
+ COMPSOLID : 0
+ COMPOUND  : 1
+ SHAPE     : 12
+"
+checknbshapes result -ref ${nbshapes_expected} -t -m "Result obtained by Cut a wire by halfspace"
+
+set 3dviewer 1
diff --git a/tests/bugs/modalg_6/bug25937_3 b/tests/bugs/modalg_6/bug25937_3
new file mode 100755 (executable)
index 0000000..6fadf5f
--- /dev/null
@@ -0,0 +1,34 @@
+puts "============"
+puts "OCC25937"
+puts "============"
+puts ""
+###############################
+## Failed Cut Edge or Face by HalfSpace.
+###############################
+
+# Cut a solid by halfspace
+plane h 0 0 0 1 0 0
+mkface h h
+halfspace h h 10 0 0
+box a -10 -10 0 20 20 10
+
+bop a h
+bopcut result
+
+set square 1000.
+
+set nbshapes_expected "
+Number of shapes in shape
+ VERTEX    : 8
+ EDGE      : 12
+ WIRE      : 6
+ FACE      : 6
+ SHELL     : 1
+ SOLID     : 1
+ COMPSOLID : 0
+ COMPOUND  : 1
+ SHAPE     : 35
+"
+checknbshapes result -ref ${nbshapes_expected} -t -m "Result obtained by Cut a wire by halfspace"
+
+set 3dviewer 1