0028187: Add possibility to avoid creation of Internal parts in the result of Volume...
authoremv <emv@opencascade.com>
Mon, 5 Dec 2016 12:52:36 +0000 (15:52 +0300)
committerapn <apn@opencascade.com>
Thu, 8 Dec 2016 13:59:25 +0000 (16:59 +0300)
1. The possibility to prevent addition of internal parts has been added into the following algorithms:
- BOPAlgo_BuilderFace;
- BOPAlgo_BuilderSolid;
- BOPAlgo_MakerVolume.

Setting the option to avoid internal parts for MakerVolume algorithm guarantees that the result solids
will be manifold and not contain any internal parts. But it does not prevent from occurrence
of the internal edges or vertices in the faces.

2. The Set/Get methods of the BOPAlgo_BuilderArea class have been made inline.

3. Draw command mkvolume has been updated to take into account the new option.

4. BRepOffset_MakeOffset::BuildShellsCompleteInter() has been modified to use the new option of BOPAlgo_MakerVolume
to speed up the construction of the final result solid.

5. Documentation has been updated with new section dedicated to BOPAlgo_MakerVolume algorithm.

6. Test case for the issue.

15 files changed:
dox/user_guides/boolean_operations/boolean_operations.md
dox/user_guides/boolean_operations/images/mkvolume_image001.png [new file with mode: 0644]
dox/user_guides/boolean_operations/images/mkvolume_image002.png [new file with mode: 0644]
dox/user_guides/boolean_operations/images/mkvolume_image003.png [new file with mode: 0644]
dox/user_guides/boolean_operations/images/mkvolume_image004.png [new file with mode: 0644]
src/BOPAlgo/BOPAlgo_BuilderArea.cxx
src/BOPAlgo/BOPAlgo_BuilderArea.hxx
src/BOPAlgo/BOPAlgo_BuilderFace.cxx
src/BOPAlgo/BOPAlgo_BuilderSolid.cxx
src/BOPAlgo/BOPAlgo_MakerVolume.cxx
src/BOPAlgo/BOPAlgo_MakerVolume.hxx
src/BOPAlgo/BOPAlgo_MakerVolume.lxx
src/BOPTest/BOPTest_BOPCommands.cxx
src/BRepOffset/BRepOffset_MakeOffset.cxx
tests/bugs/modalg_6/bug28187 [new file with mode: 0644]

index 590332e..92c49aa 100644 (file)
@@ -1862,7 +1862,81 @@ Some aspects of building the result are described in the next paragraph
 | :---- | :---- | :------ |
 | 1 | Build the result of the operation using all information contained in *FaceInfo*, Common Block, Shared entities of the arguments, etc. | *BOPAlgo_Section:: BuildSection()* |
 
+@section occt_algorithms_10b Volume Maker Algorithm
 
+The Volume Maker algorithm has been designed for building the elementary volumes (solids) from a set of connected, intersecting, or nested shapes. The algorithm can also be useful for splitting solids into parts, or constructing new solid(s) from set of intersecting or connected faces or shells.
+The algorithm creates only closed solids. In general case the result solids are non-manifold: fragments of the input shapes (wires, faces) located inside the solids are added as internal sub-shapes to these solids.
+But the algorithm allows preventing the addition of the internal for solids parts into result. In this case the result solids will be manifold and not contain any internal parts. However, this option does not prevent from the occurrence of the internal edges or vertices in the faces.<br>
+Non-closed faces, free wires etc. located outside of any solid are always excluded from the result.
+
+The Volume Maker algorithm is implemented in the class BOPAlgo_MakerVolume. It is based on the General Fuse (GF) algorithm. All the options of the GF algorithm such as possibility to run algorithm in parallel mode, fuzzy option, safe mode, glue options and history support are also available in this algorithm.
+
+The requirements for the arguments are the same as for the arguments of GF algorithm - they could be of any type, but each argument should be valid and not self-interfered.
+
+The algorithm allows disabling the calculation of intersections among the arguments. In this case the algorithm will run much faster, but the user should guarantee that the arguments do not interfere with each other, otherwise the result will be invalid (e.g. contain unexpected parts) or empty.
+This option is useful e.g. for building a solid from the faces of one shell or from the shapes that have already been intersected.
+
+@subsection occt_algorithms_10b_1 Usage
+
+#### C++ Level
+The usage of the algorithm on the API level:
+~~~~
+BOPAlgo_MakerVolume aMV;
+BOPCol_ListOfShape aLS = …; // arguments
+Standard_Boolean bRunParallel = Standard_False; /* parallel or single mode (the default value is FALSE)*/
+Standard_Boolean bIntersect = Standard_True; /* intersect or not the arguments (the default value is TRUE)*/
+Standard_Real aTol = 0.0; /* fuzzy option (default value is 0)*/
+Standard_Boolean bSafeMode = Standard_False; /* protect or not the arguments from modification*/
+BOPAlgo_Glue aGlue = BOPAlgo_GlueOff; /* Glue option to speed up intersection of the arguments*/
+Standard_Boolean bAvoidInternalShapes = Standard_False; /* Avoid or not the internal for solids shapes in the result*/
+//
+aMV.SetArguments(aLS);
+aMV.SetRunParallel(bRunParallel);
+aMV.SetIntersect(bIntersect);
+aMV.SetFuzzyValue(aTol);
+aMV.SetNonDestructive(bSafeMode);
+aMV.SetGlue(aGlue);
+aMV.SetAvoidInternalShapes(bAvoidInternalShapes);
+//
+aMV.Perform(); //perform the operation
+if (aMV.ErrorStatus()) { //check error status
+  return;
+}
+//
+const TopoDS_Shape& aResult = aMV.Shape(); // result of the operation
+~~~~
+
+#### Tcl Level
+To use the algorithm in Draw the command mkvolume has been implemented. The usage of this command is following:
+~~~~
+Usage: mkvolume r b1 b2 ... [-c] [-ni] [-ai]
+Options:
+-c - use this option to have input compounds considered as set of separate arguments (allows passing multiple arguments as one compound);
+-ni - use this option to disable the intersection of the arguments;
+-ai - use this option to avoid internal for solids shapes in the result.
+~~~~
+
+@subsection occt_algorithms_10b_2 Examples
+
+#### Example 1
+Creation of 9832 solids from sphere and set of 63 planes:
+
+<table align="center">
+<tr>
+  <td>@figure{/user_guides/boolean_operations/images/mkvolume_image001.png, "Arguments"}</td>
+  <td>@figure{/user_guides/boolean_operations/images/mkvolume_image002.png, "Results"}</td>
+</tr>
+</table>
+
+#### Example 2
+Creating compartments on a ship defined by hull shell and a set of planes. The ship is divided on compartments by five transverse bulkheads and a deck – six compartments are created:
+
+<table align="center">
+<tr>
+  <td>@figure{/user_guides/boolean_operations/images/mkvolume_image003.png, "Arguments"}</td>
+  <td>@figure{/user_guides/boolean_operations/images/mkvolume_image004.png, "Results"}</td>
+</tr>
+</table>
 
 @section occt_algorithms_10    Algorithm Limitations 
 
diff --git a/dox/user_guides/boolean_operations/images/mkvolume_image001.png b/dox/user_guides/boolean_operations/images/mkvolume_image001.png
new file mode 100644 (file)
index 0000000..7f1b6bf
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/mkvolume_image001.png differ
diff --git a/dox/user_guides/boolean_operations/images/mkvolume_image002.png b/dox/user_guides/boolean_operations/images/mkvolume_image002.png
new file mode 100644 (file)
index 0000000..ccce189
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/mkvolume_image002.png differ
diff --git a/dox/user_guides/boolean_operations/images/mkvolume_image003.png b/dox/user_guides/boolean_operations/images/mkvolume_image003.png
new file mode 100644 (file)
index 0000000..26d576e
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/mkvolume_image003.png differ
diff --git a/dox/user_guides/boolean_operations/images/mkvolume_image004.png b/dox/user_guides/boolean_operations/images/mkvolume_image004.png
new file mode 100644 (file)
index 0000000..47f7e18
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/mkvolume_image004.png differ
index 3acd240..7b378eb 100644 (file)
 
 
 #include <BOPAlgo_BuilderArea.hxx>
-#include <BOPCol_ListOfShape.hxx>
-#include <IntTools_Context.hxx>
-#include <NCollection_BaseAllocator.hxx>
-#include <TopoDS_Shape.hxx>
 
 //=======================================================================
 //function : 
@@ -33,7 +29,8 @@ BOPAlgo_BuilderArea::BOPAlgo_BuilderArea()
   myLoops(myAllocator),
   myLoopsInternal(myAllocator),
   myAreas(myAllocator),
-  myShapesToAvoid(100, myAllocator) 
+  myShapesToAvoid(100, myAllocator),
+  myAvoidInternalShapes(Standard_False)
 {
 }
 //=======================================================================
@@ -48,7 +45,8 @@ BOPAlgo_BuilderArea::BOPAlgo_BuilderArea
   myLoops(myAllocator),
   myLoopsInternal(myAllocator),
   myAreas(myAllocator),
-  myShapesToAvoid(100, myAllocator) 
+  myShapesToAvoid(100, myAllocator),
+  myAvoidInternalShapes(Standard_False)
 {
 }
 //=======================================================================
@@ -58,51 +56,3 @@ BOPAlgo_BuilderArea::BOPAlgo_BuilderArea
 BOPAlgo_BuilderArea::~BOPAlgo_BuilderArea()
 {
 }
-//=======================================================================
-//function : SetContext
-//purpose  : 
-//=======================================================================
-void BOPAlgo_BuilderArea::SetContext
-  (const Handle(IntTools_Context)& theContext)
-{
-  myContext=theContext;
-}
-//=======================================================================
-//function : SetShapes
-//purpose  : 
-//=======================================================================
-  void BOPAlgo_BuilderArea::SetShapes(const BOPCol_ListOfShape& theLF)
-{
-  BOPCol_ListIteratorOfListOfShape aIt;
-  //
-  myShapes.Clear();
-  aIt.Initialize(theLF);
-  for(; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aF=aIt.Value();
-    myShapes.Append(aF);
-  }
-}
-//=======================================================================
-//function : Shapes
-//purpose  : 
-//=======================================================================
-const BOPCol_ListOfShape& BOPAlgo_BuilderArea::Shapes()const
-{
-  return myShapes;
-}
-//=======================================================================
-//function : Loops
-//purpose  : 
-//=======================================================================
-const BOPCol_ListOfShape& BOPAlgo_BuilderArea::Loops()const
-{
-  return myLoops;
-}
-//=======================================================================
-//function : Areas
-//purpose  : 
-//=======================================================================
-  const BOPCol_ListOfShape& BOPAlgo_BuilderArea::Areas()const
-{
-  return myAreas;
-}
index 78c1dcc..fc134be 100644 (file)
@@ -37,24 +37,46 @@ public:
 
   DEFINE_STANDARD_ALLOC
 
-  
-  Standard_EXPORT void SetContext (const Handle(IntTools_Context)& theContext);
-  
-  Standard_EXPORT const BOPCol_ListOfShape& Shapes() const;
-Standard_EXPORT void SetShapes(const BOPCol_ListOfShape& theLS);
-  
-  Standard_EXPORT const BOPCol_ListOfShape& Loops() const;
-  
-  Standard_EXPORT const BOPCol_ListOfShape& Areas() const;
-
-
-
+  //! Sets the context for the algorithms
+  Standard_EXPORT void SetContext (const Handle(IntTools_Context)& theContext) {
+    myContext = theContext;
+  }
+
+  //! Returns the input shapes
+  Standard_EXPORT const BOPCol_ListOfShape& Shapes() const {
+    return myShapes;
+  }
+
+  //! Sets the shapes for building areas
+  Standard_EXPORT void SetShapes(const BOPCol_ListOfShape& theLS) {
+    myShapes = theLS;
+  }
+
+  //! Returns the found loops
+  Standard_EXPORT const BOPCol_ListOfShape& Loops() const {
+    return myLoops;
+  }
+
+  //! Returns the found areas
+  Standard_EXPORT const BOPCol_ListOfShape& Areas() const {
+    return myAreas;
+  }
+
+  //! Defines the preventing of addition of internal parts into result.
+  //! The default value is FALSE, i.e. the internal parts are added into result.
+  Standard_EXPORT void SetAvoidInternalShapes(const Standard_Boolean theAvoidInternal) {
+    myAvoidInternalShapes = theAvoidInternal;
+  }
+
+  //! Returns the AvoidInternalShapes flag
+  Standard_EXPORT Standard_Boolean IsAvoidInternalShapes() const {
+    return myAvoidInternalShapes;
+  }
 
 protected:
 
-  
   Standard_EXPORT BOPAlgo_BuilderArea();
-Standard_EXPORT virtual ~BOPAlgo_BuilderArea();
+  Standard_EXPORT virtual ~BOPAlgo_BuilderArea();
   
   Standard_EXPORT BOPAlgo_BuilderArea(const BOPCol_BaseAllocator& theAllocator);
   
@@ -73,20 +95,10 @@ Standard_EXPORT virtual ~BOPAlgo_BuilderArea();
   BOPCol_ListOfShape myLoopsInternal;
   BOPCol_ListOfShape myAreas;
   BOPCol_IndexedMapOfOrientedShape myShapesToAvoid;
-
+  Standard_Boolean myAvoidInternalShapes;
 
 private:
 
-
-
-
-
 };
 
-
-
-
-
-
-
 #endif // _BOPAlgo_BuilderArea_HeaderFile
index 9737fe4..6830e6b 100644 (file)
 #include <TopoDS_Wire.hxx>
 
 //
-//
-//
-//
-//
-//
 static
   Standard_Boolean IsGrowthWire(const TopoDS_Shape& ,
                                 const BOPCol_IndexedMapOfShape& );
@@ -688,6 +683,9 @@ void GetWire(const TopoDS_Shape& aF, TopoDS_Shape& aW)
 void BOPAlgo_BuilderFace::PerformInternalShapes()
 {
   myErrorStatus=0;
+  if (myAvoidInternalShapes) {
+    return;
+  }
   //
   Standard_Integer aNbWI=myLoopsInternal.Extent();
   if (!aNbWI) {// nothing to do
index 44e1769..eaf8258 100644 (file)
@@ -751,6 +751,9 @@ void BOPAlgo_BuilderSolid::PerformAreas()
 void BOPAlgo_BuilderSolid::PerformInternalShapes()
 {
   myErrorStatus=0;
+  if (myAvoidInternalShapes) {
+    return;
+  }
   //
   Standard_Integer aNbFI=myLoopsInternal.Extent();
   if (!aNbFI) {// nothing to do
index a7639cc..6bda860 100644 (file)
@@ -270,6 +270,7 @@ void BOPAlgo_MakerVolume::BuildSolids(BOPCol_ListOfShape& theLSR)
   aBS.SetSolid(mySBox);
   aBS.SetShapes(myFaces);
   aBS.SetRunParallel(myRunParallel);
+  aBS.SetAvoidInternalShapes(myAvoidInternalShapes);
   aBS.Perform();
   if (aBS.ErrorStatus()) {
     myErrorStatus = 103;
@@ -339,6 +340,10 @@ void BOPAlgo_MakerVolume::BuildShape(const BOPCol_ListOfShape& theLSR)
 //=======================================================================
 void BOPAlgo_MakerVolume::FillInternalShapes(const BOPCol_ListOfShape& theLSR)
 {
+  if (myAvoidInternalShapes) {
+    return;
+  }
+  //
   UserBreak();
   //
   Standard_Integer aNbSI;
index 08ae2c1..ce9e15c 100644 (file)
@@ -118,97 +118,79 @@ public:
   
 
   //! Empty contructor.
-    BOPAlgo_MakerVolume();
-virtual ~BOPAlgo_MakerVolume();
-  
+  BOPAlgo_MakerVolume();
+  virtual ~BOPAlgo_MakerVolume();
 
   //! Empty contructor.
-    BOPAlgo_MakerVolume(const BOPCol_BaseAllocator& theAllocator);
-  
+  BOPAlgo_MakerVolume(const BOPCol_BaseAllocator& theAllocator);
 
   //! Clears the data.
-    virtual void Clear() Standard_OVERRIDE;
-  
+  virtual void Clear() Standard_OVERRIDE;
 
   //! Sets the flag myIntersect:
   //! if <bIntersect> is TRUE the shapes from <myArguments> will be intersected.
   //! if <bIntersect> is FALSE no intersection will be done.
-    void SetIntersect (const Standard_Boolean bIntersect);
-  
+  void SetIntersect(const Standard_Boolean bIntersect);
 
   //! Returns the flag <myIntersect>.
-    Standard_Boolean IsIntersect() const;
-  
+  Standard_Boolean IsIntersect() const;
 
   //! Returns the solid box <mySBox>.
-    const TopoDS_Solid& Box() const;
-  
+  const TopoDS_Solid& Box() const;
 
   //! Returns the processed faces <myFaces>.
-    const BOPCol_ListOfShape& Faces() const;
-  
-
-  //! Performs the operation.
-  Standard_EXPORT virtual void Perform() Standard_OVERRIDE;
+  const BOPCol_ListOfShape& Faces() const;
 
+  //! Defines the preventing of addition of internal for solid parts into the result.
+  //! By default the internal parts are added into result.
+  Standard_EXPORT void SetAvoidInternalShapes(const Standard_Boolean theAvoidInternal) {
+    myAvoidInternalShapes = theAvoidInternal;
+  }
 
+  //! Returns the AvoidInternalShapes flag
+  Standard_EXPORT Standard_Boolean IsAvoidInternalShapes() const {
+    return myAvoidInternalShapes;
+  }
 
+  //! Performs the operation.
+  Standard_EXPORT virtual void Perform() Standard_OVERRIDE;
 
 protected:
 
-  
-
   //! Checks the data.
   Standard_EXPORT virtual void CheckData() Standard_OVERRIDE;
-  
 
   //! Performs the operation.
   Standard_EXPORT virtual void PerformInternal1 (const BOPAlgo_PaveFiller& thePF) Standard_OVERRIDE;
-  
 
   //! Collects all faces.
   Standard_EXPORT void CollectFaces();
-  
 
   //! Makes solid box.
   Standard_EXPORT void MakeBox (BOPCol_MapOfShape& theBoxFaces);
-  
 
   //! Builds solids.
   Standard_EXPORT void BuildSolids (BOPCol_ListOfShape& theLSR);
-  
 
   //! Removes the covering box.
   Standard_EXPORT void RemoveBox (BOPCol_ListOfShape& theLSR, const BOPCol_MapOfShape& theBoxFaces);
-  
 
   //! Fills the solids with internal shapes.
   Standard_EXPORT void FillInternalShapes (const BOPCol_ListOfShape& theLSR);
-  
 
   //! Builds the result.
   Standard_EXPORT void BuildShape (const BOPCol_ListOfShape& theLSR);
 
-
   Standard_Boolean myIntersect;
   Bnd_Box myBBox;
   TopoDS_Solid mySBox;
   BOPCol_ListOfShape myFaces;
-
+  Standard_Boolean myAvoidInternalShapes;
 
 private:
 
-
-
-
-
 };
 
-
 #include <BOPAlgo_MakerVolume.lxx>
 
-
-
-
-
 #endif // _BOPAlgo_MakerVolume_HeaderFile
index 5794e8f..47141ff 100644 (file)
@@ -19,7 +19,8 @@
 inline BOPAlgo_MakerVolume::BOPAlgo_MakerVolume()
 :
   BOPAlgo_Builder(),
-  myIntersect(Standard_True)
+  myIntersect(Standard_True),
+  myAvoidInternalShapes(Standard_False)
 {
 }
 
@@ -31,7 +32,8 @@ inline BOPAlgo_MakerVolume::BOPAlgo_MakerVolume
   (const Handle(NCollection_BaseAllocator)& theAllocator)
 :
   BOPAlgo_Builder(theAllocator),
-  myIntersect(Standard_True)
+  myIntersect(Standard_True),
+  myAvoidInternalShapes(Standard_False)
 {
 }
 
@@ -55,6 +57,7 @@ inline void BOPAlgo_MakerVolume::Clear()
   myBBox = Bnd_Box();
   mySBox.Nullify();
   myFaces.Clear();
+  myAvoidInternalShapes = Standard_False;
 }
 
 //=======================================================================
index 8b68725..2f7a1bb 100644 (file)
@@ -106,7 +106,7 @@ static Standard_Integer mkvolume   (Draw_Interpretor&, Standard_Integer, const c
   //
   theCommands.Add("bopcurves", "use bopcurves F1 F2 [-2d/-2d1/-2d2] [-p u1 v1 u2 v2]",
                                                       __FILE__, bopcurves, g);
-  theCommands.Add("mkvolume", "make solids from set of shapes.\nmkvolume r b1 b2 ... [-c] [-ni]", 
+  theCommands.Add("mkvolume", "make solids from set of shapes.\nmkvolume r b1 b2 ... [-c] [-ni] [-ai]",
                   __FILE__, mkvolume , g);
 }
 
@@ -726,17 +726,19 @@ Standard_Integer bopcurves (Draw_Interpretor& di,
 Standard_Integer mkvolume(Draw_Interpretor& di, Standard_Integer n, const char** a) 
 {
   if (n < 3) {
-    di << "Usage: mkvolume r b1 b2 ... [-c] [-ni]\n";
+    di << "Usage: mkvolume r b1 b2 ... [-c] [-ni] [-ai]\n";
     di << "Options:\n";
     di << " -c  - use this option if the arguments are compounds\n";
     di << "       containing shapes that should be interfered;\n";
     di << " -ni - use this option if the arguments should not be interfered;\n";
+    di << " -ai - use this option to avoid internal for solids shapes in the result.\n";
     return 1;
   }
   //
   const char* usage = "Type mkvolume without arguments for the usage of the command.\n";
   //
-  Standard_Boolean bToIntersect, bRunParallel, bNonDestructive, bCompounds;
+  Standard_Boolean bToIntersect, bRunParallel, bNonDestructive;
+  Standard_Boolean bCompounds, bAvoidInternal;
   Standard_Integer i;
   Standard_Real aTol;
   TopoDS_Shape aS;
@@ -749,6 +751,7 @@ Standard_Integer mkvolume(Draw_Interpretor& di, Standard_Integer n, const char**
   //
   bToIntersect = Standard_True;
   bCompounds = Standard_False;
+  bAvoidInternal = Standard_False;
   //
   for (i = 2; i < n; ++i) {
     aS = DBRep::Get(a[i]);
@@ -762,6 +765,9 @@ Standard_Integer mkvolume(Draw_Interpretor& di, Standard_Integer n, const char**
       else if (!strcmp(a[i], "-ni")) {
         bToIntersect = Standard_False;
       }
+      else if (!strcmp(a[i], "-ai")) {
+        bAvoidInternal = Standard_True;
+      }
     }
   }
   //
@@ -796,6 +802,7 @@ Standard_Integer mkvolume(Draw_Interpretor& di, Standard_Integer n, const char**
   aMV.SetRunParallel(bRunParallel);
   aMV.SetFuzzyValue(aTol);
   aMV.SetNonDestructive(bNonDestructive);
+  aMV.SetAvoidInternalShapes(bAvoidInternal);
   aMV.SetGlue(aGlue);
   //
   aMV.Perform();
index 9fea562..f05b9a1 100644 (file)
@@ -4049,6 +4049,7 @@ Standard_Boolean BuildShellsCompleteInter(const BOPCol_ListOfShape& theLF,
   aMV1.SetArguments(theLF);
   // we need to intersect the faces to process the tangential faces
   aMV1.SetIntersect(Standard_True);
+  aMV1.SetAvoidInternalShapes(Standard_True);
   aMV1.Perform();
   //
   Standard_Boolean bDone = (aMV1.ErrorStatus() == 0);
@@ -4092,6 +4093,7 @@ Standard_Boolean BuildShellsCompleteInter(const BOPCol_ListOfShape& theLF,
   aMV2.SetArguments(aLF2);
   // no need to intersect this time
   aMV2.SetIntersect(Standard_False);
+  aMV2.SetAvoidInternalShapes(Standard_True);
   aMV2.Perform();
   bDone = (aMV2.ErrorStatus() == 0);
   if (!bDone) {
@@ -4136,6 +4138,7 @@ Standard_Boolean BuildShellsCompleteInter(const BOPCol_ListOfShape& theLF,
   BOPAlgo_MakerVolume aMV3;
   aMV3.SetArguments(aLF3);
   aMV3.SetIntersect(Standard_False);
+  aMV3.SetAvoidInternalShapes(Standard_True);
   aMV3.Perform();
   bDone = (aMV3.ErrorStatus() == 0);
   if (!bDone) {
diff --git a/tests/bugs/modalg_6/bug28187 b/tests/bugs/modalg_6/bug28187
new file mode 100644 (file)
index 0000000..e249c91
--- /dev/null
@@ -0,0 +1,21 @@
+puts "========"
+puts "OCC28187"
+puts "========"
+puts ""
+#################################################
+# Add possibility to avoid creation of Internal parts in the result of Volume maker algorithm
+#################################################
+
+restore [locate_data_file bug28187_faces.brep] cf
+vertex v1 1 1 1
+vertex v2 1 9 1
+edge e v1 v2
+compound v1 v2 e int_sh
+
+mkvolume result cf int_sh -c -ai
+
+checkshape result
+checknbshapes result -vertex 16 -edge 22 -wire 10 -face 8 -shell 1 -solid 1
+checkprops result -v 750 -s 550
+
+checkview -display result -2d -path ${imagedir}/${test_image}.png
\ No newline at end of file