0028283: The command bopcheck crashes on the given shape
authormsv <msv@opencascade.com>
Mon, 26 Dec 2016 12:31:14 +0000 (15:31 +0300)
committerapn <apn@opencascade.com>
Thu, 29 Dec 2016 11:48:36 +0000 (14:48 +0300)
BOPAlgo_CheckerSI crashed due to building of pcurve for an edge not lying on surface. The fix avoids building of pcurves in this algorithm.
The new flag has been added in BOPAlgo_PaveFiller class (method SetAvoidBuildPCurve). It tells whether to avoid building pcurves. It is worth to set if the result is not used to create splits of faces, as in example with BOPAlgo_CheckerSI.

src/BOPAlgo/BOPAlgo_CheckerSI.cxx
src/BOPAlgo/BOPAlgo_PaveFiller.cxx
src/BOPAlgo/BOPAlgo_PaveFiller.hxx
src/BOPAlgo/BOPAlgo_PaveFiller_7.cxx
tests/bugs/modalg_6/bug28283 [new file with mode: 0644]

index cad8fc0..d038073 100644 (file)
@@ -48,6 +48,7 @@ BOPAlgo_CheckerSI::BOPAlgo_CheckerSI()
 {
   myLevelOfCheck=BOPDS_DS::NbInterfTypes()-1;
   myNonDestructive=Standard_True;
+  SetAvoidBuildPCurve(Standard_True);
 }
 //=======================================================================
 //function : ~
index 247a5b8..c3247e4 100644 (file)
@@ -39,11 +39,12 @@ BOPAlgo_PaveFiller::BOPAlgo_PaveFiller()
 :
   BOPAlgo_Algo()
 {
-  myDS=NULL;
-  myIterator=NULL;
-  myNonDestructive=Standard_False;
-  myIsPrimary=Standard_True;
-  myGlue=BOPAlgo_GlueOff;
+  myDS = NULL;
+  myIterator = NULL;
+  myNonDestructive = Standard_False;
+  myIsPrimary = Standard_True;
+  myAvoidBuildPCurve = Standard_False;
+  myGlue = BOPAlgo_GlueOff;
 }
 //=======================================================================
 //function : 
@@ -54,11 +55,12 @@ BOPAlgo_PaveFiller::BOPAlgo_PaveFiller
 :
   BOPAlgo_Algo(theAllocator)
 {
-  myDS=NULL;
-  myIterator=NULL;
-  myNonDestructive=Standard_False;
-  myIsPrimary=Standard_True;
-  myGlue=BOPAlgo_GlueOff;
+  myDS = NULL;
+  myIterator = NULL;
+  myNonDestructive = Standard_False;
+  myIsPrimary = Standard_True;
+  myAvoidBuildPCurve = Standard_False;
+  myGlue = BOPAlgo_GlueOff;
 }
 //=======================================================================
 //function : ~
index 70bcba8..1d66c94 100644 (file)
@@ -108,7 +108,17 @@ public:
   //! Returns the glue option of the algorithm
   Standard_EXPORT BOPAlgo_GlueEnum Glue() const;
 
-
+  //! Sets the flag to avoid building of p-curves of edges on faces
+  void SetAvoidBuildPCurve(const Standard_Boolean theValue)
+  {
+    myAvoidBuildPCurve = theValue;
+  }
+
+  //! Returns the flag to avoid building of p-curves of edges on faces
+  Standard_Boolean IsAvoidBuildPCurve() const
+  {
+    return myAvoidBuildPCurve;
+  }
 
 protected:
 
@@ -405,6 +415,7 @@ protected:
   BOPAlgo_SectionAttribute mySectionAttribute;
   Standard_Boolean myNonDestructive;
   Standard_Boolean myIsPrimary;
+  Standard_Boolean myAvoidBuildPCurve;
   BOPAlgo_GlueEnum myGlue;
 
 
index f2e7476..99a88d6 100644 (file)
@@ -525,6 +525,9 @@ Standard_Integer BOPAlgo_PaveFiller::SplitEdge(const Standard_Integer nE,
 //=======================================================================
 void BOPAlgo_PaveFiller::MakePCurves()
 {
+  if (myAvoidBuildPCurve ||
+      (!mySectionAttribute.PCurveOnS1() && !mySectionAttribute.PCurveOnS2()))
+    return;
   Standard_Boolean bHasPC;
   Standard_Integer i, nF1, nF2, aNbC, k, nE, aNbFF, aNbFI, nEx;
   Standard_Integer j, aNbPBIn, aNbPBOn;
diff --git a/tests/bugs/modalg_6/bug28283 b/tests/bugs/modalg_6/bug28283
new file mode 100644 (file)
index 0000000..f800db3
--- /dev/null
@@ -0,0 +1,16 @@
+puts "========"
+puts "OCC28283"
+puts "========"
+puts ""
+#################################################
+# The command bopcheck crashes on the given shape
+#################################################
+
+restore [locate_data_file bug28283_shell.brep] a
+
+bfuzzyvalue 1
+if [catch {bopcheck a}] {
+  puts "Error: bopcheck crash"
+} else {
+  puts "OK: bopcheck passed"
+}