0026874: Implementation of the Partition operator in OCCT
authoremv <emv@opencascade.com>
Fri, 3 Mar 2017 12:58:11 +0000 (15:58 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 16 Mar 2017 08:09:54 +0000 (11:09 +0300)
1. The partition operation allows splitting an arbitrary number of shapes of an arbitrary dimension
by other arbitrary shapes. The algorithm has been implemented in the class BOPAlgo_Splitter.

The API operator Splitter has been implemented in the class BRepAlgoAPI_Splitter.

2. The draw commands for usage the new algorithm have been implemented - bsplit and bapisplit.
The commands are identical, but one uses the BOPAlgo_Splitter, the other uses BRepAlgoAPI_Splitter.
Both commands should be used after Pave Filler is filled.

3. Test cases for the new algorithm.

4. Documentation has been updated.

Small corrections.

33 files changed:
dox/user_guides/boolean_operations/boolean_operations.md
dox/user_guides/boolean_operations/images/bsplit_image001.png [new file with mode: 0644]
dox/user_guides/boolean_operations/images/bsplit_image002.png [new file with mode: 0644]
dox/user_guides/boolean_operations/images/bsplit_image003.png [new file with mode: 0644]
dox/user_guides/boolean_operations/images/bsplit_image004.png [new file with mode: 0644]
dox/user_guides/boolean_operations/images/bsplit_image005.png [new file with mode: 0644]
dox/user_guides/boolean_operations/images/bsplit_image006.png [new file with mode: 0644]
dox/user_guides/boolean_operations/images/operations_image065.png [new file with mode: 0644]
dox/user_guides/boolean_operations/images/operations_image065.svg [deleted file]
dox/user_guides/draw_test_harness/draw_test_harness.md
src/BOPAlgo/BOPAlgo_Splitter.cxx [new file with mode: 0644]
src/BOPAlgo/BOPAlgo_Splitter.hxx [new file with mode: 0644]
src/BOPAlgo/FILES
src/BOPTest/BOPTest_APICommands.cxx
src/BOPTest/BOPTest_Objects.cxx
src/BOPTest/BOPTest_Objects.hxx
src/BOPTest/BOPTest_PartitionCommands.cxx
src/BRepAlgoAPI/BRepAlgoAPI_Splitter.cxx [new file with mode: 0644]
src/BRepAlgoAPI/BRepAlgoAPI_Splitter.hxx [new file with mode: 0644]
src/BRepAlgoAPI/FILES
tests/boolean/grids.list
tests/boolean/splitter/A1 [new file with mode: 0644]
tests/boolean/splitter/A2 [new file with mode: 0644]
tests/boolean/splitter/A3 [new file with mode: 0644]
tests/boolean/splitter/A4 [new file with mode: 0644]
tests/boolean/splitter/A5 [new file with mode: 0644]
tests/boolean/splitter/A6 [new file with mode: 0644]
tests/boolean/splitter/B1 [new file with mode: 0644]
tests/boolean/splitter/B2 [new file with mode: 0644]
tests/boolean/splitter/B3 [new file with mode: 0644]
tests/boolean/splitter/B4 [new file with mode: 0644]
tests/boolean/splitter/B5 [new file with mode: 0644]
tests/boolean/splitter/B6 [new file with mode: 0644]

index 0b90017..0edfe0a 100644 (file)
@@ -40,6 +40,8 @@ where:
 
 **Note** There is an operation *Cut21*, which is an extension for forward Cut operation, i.e <i>Cut21=Cut(G2, G1)</i>.
 
+For more details see @ref occt_algorithms_9 "Boolean Operations Algorithm" section.
+
 @subsubsection occt_algorithms_2_1_2 General Fuse operator
 
 The General fuse operator can be applied to an arbitrary number of arguments in terms of *TopoDS_Shape*.
@@ -71,6 +73,8 @@ This Figure shows that
 
 The fact that *R<sub>GF</sub>* contains the components of *R<sub>B</sub>* allows considering GFA as the general case of BOA. So it is possible to implement BOA as a subclass of GFA.
 
+For more details see @ref occt_algorithms_7 "General Fuse Algorithm" section.
+
 @subsubsection occt_algorithms_2_1_3 Partition operator 
 
 The Partition operator can be applied to an arbitrary number of arguments in terms of *TopoDS_Shape*. The arguments are divided on two groups: Objects, Tools. The result of PA contains all parts belonging to the Objects but does not contain the parts that belongs to the Tools only.
@@ -99,6 +103,7 @@ For example, when *G<sub>1</sub>* consists of shapes *S<sub>1</sub>* and *S<sub>
 
 The fact that the *R<sub>GF</sub>* contains the components of *R<sub>PA</sub>* allows considering GFA as the general case of PA. Thus, it is possible to implement PA as a subclass of GFA.
 
+For more details see @ref occt_algorithms_8 "Partition Algorithm" section.
 
 @subsubsection occt_algorithms_2_1_4 Section operator
 
@@ -109,6 +114,8 @@ The SA operator can be represented as follows:
 * <i>S1, S2 ... Sn</i> -- the operation arguments;
 * *n* -- the number of arguments.
 
+For more details see @ref occt_algorithms_10a "Section Algorithm" section.
+
 @subsection occt_algorithms_2_2 Parts of algorithms 
 
 GFA, BOA, PA and SA have the same Data Structure (DS). The main goal of the Data Structure is to store all necessary information for input data and intermediate results.
@@ -1042,6 +1049,158 @@ The input data for this step is a *BOPAlgo_Builder* object after building result
 | 2    | Correct tolerances of edges on faces | *BOPTools_Tools::CorrectCurveOnSurface()* |
 
 
+@section occt_algorithms_8  Partition Algorithm
+
+The Partition algorithm is a General Fuse (GF) based algorithm. It provides means to split the group of an arbitrary number of shapes of an arbitrary dimension by the other group of an arbitrary number of shapes of an arbitrary dimension.
+All the options of the GF algorithm, such as Fuzzy mode, safe mode, parallel mode, gluing mode and history support are also available in this algorithm.
+
+@subsection occt_algorithms_8_1 Arguments
+
+* The arguments of the Partition algorithms are divided on two groups - *Objects* and *Tools*;
+* The requirements for the arguments (both for *Objects* and *Tools*) are the same as for General Fuse algorithm - there could be any number of arguments of any type, but each argument should be valid and not self-interfered.
+
+@subsection occt_algorithms_8_2 Results
+
+* The result of Partition algorithm is similar to the result of General Fuse algorithm, but it contains only the split parts of the shapes included into the group of *Objects*;
+* Splits parts of the shapes included only into group of *Tools* are excluded from the result;
+* If there are no shapes in the group of *Tools* the result of the operation will be equivalent to the result of General Fuse operation.
+
+@subsection occt_algorithms_8_3 Usage
+
+@subsubsection occt_algorithms_8_3_1 API
+
+On the low level the Partition algorithm is implemented in the class *BOPAlgo_Splitter*. The usage of this algorithm looks as follows:
+~~~~~
+BOPAlgo_Splitter aSplitter;
+BOPCol_ListOfShape aLSObjects = …; // Objects
+BOPCol_ListOfShape aLSTools = …; // Tools
+Standard_Boolean bRunParallel = Standard_False; /* parallel or single mode (the default value is FALSE)*/
+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*/
+// setting arguments
+aSplitter.SetArguments(aLSObjects);
+aSplitter.SetTools(aLSTools);
+// setting options
+aSplitter.SetRunParallel(bRunParallel);
+aSplitter.SetFuzzyValue(aTol);
+aSplitter.SetNonDestructive(bSafeMode);
+aSplitter.SetGlue(aGlue);
+//
+aSplitter.Perform(); //perform the operation
+if (aSplitter.ErrorStatus()) { //check error status
+  return;
+}
+//
+const TopoDS_Shape& aResult = aSplitter.Shape(); // result of the operation
+~~~~~
+
+@subsubsection occt_algorithms_8_3_2 DRAW
+
+For the usage of the Partition algorithm in DRAW the command *bsplit* is implemented. Similarly to the *bbuild* command (for the usage of the General Fuse algorithm) the *bsplit* command should be used after the Pave Filler is filled.
+~~~~~
+# s1 s2 s3 - objects
+# t1 t2 t3 - tools
+bclearobjects
+bcleartools
+baddobjects s1 s2 s3
+baddtools t1 t2 t3
+bfillds
+bsplit result
+~~~~~
+
+@subsection occt_algorithms_8_4 Examples
+
+@subsubsection occt_algorithms_8_4_1 Example 1
+
+Splitting face by the set of edges:
+
+~~~~
+# draw script for reproducing
+bclearobjects
+bcleartools
+
+set height 20
+cylinder cyl 0 0 0 0 0 1 10
+mkface f cyl 0 2*pi -$height $height
+baddobjects f
+
+# create tool edges
+compound edges
+
+set nb_uedges 10
+set pi2 [dval 2*pi]
+set ustep [expr $pi2/$nb_uedges]
+for {set i 0} {$i <= $pi2} {set i [expr $i + $ustep]} {
+  uiso c cyl $i
+  mkedge e c -25 25
+  add e edges
+}
+
+set nb_vedges 10
+set vstep [expr 2*$height/$nb_vedges]
+for {set i -20} {$i <= 20} {set i [expr $i + $vstep]} {
+  viso c cyl $i
+  mkedge e c
+  add e edges
+}
+baddctools edges
+
+bfillds
+bsplit result
+~~~~
+
+<table align="center">
+<tr>
+  <td>@figure{/user_guides/boolean_operations/images/bsplit_image001.png, "Arguments"}</td>
+  <td>@figure{/user_guides/boolean_operations/images/bsplit_image002.png, "Result"}</td>
+</tr>
+</table>
+
+@subsubsection occt_algorithms_8_4_2 Example 2
+
+Splitting plate by the set of cylinders:
+
+~~~~
+# draw script for reproducing:
+bclearobjects
+bcleartools
+
+box plate 100 100 1
+baddobjects plate
+
+pcylinder p 1 11
+compound cylinders
+for {set i 0} {$i < 101} {incr i 5} {
+  for {set j 0} {$j < 101} {incr j 5} {
+    copy p p1;
+    ttranslate p1 $i $j -5;
+    add p1 cylinders
+  }
+}
+baddtools cylinders
+
+bfillds
+bsplit result
+~~~~
+
+<table align="center">
+<tr>
+  <td>@figure{/user_guides/boolean_operations/images/bsplit_image003.png, "Arguments"}</td>
+  <td>@figure{/user_guides/boolean_operations/images/bsplit_image004.png, "Result"}</td>
+</tr>
+</table>
+
+@subsubsection occt_algorithms_8_4_3 Example 3
+
+Splitting shell hull by the planes:
+<table align="center">
+<tr>
+  <td>@figure{/user_guides/boolean_operations/images/bsplit_image005.png, "Arguments"}</td>
+  <td>@figure{/user_guides/boolean_operations/images/bsplit_image006.png, "Results"}</td>
+</tr>
+</table>
+
 @section occt_algorithms_9     Boolean Operations Algorithm
 
 @subsection occt_algorithms_9_1        Arguments
@@ -2237,7 +2396,7 @@ This example stresses not only the validity, but also the performance issue. The
 
 @subsection occt_algorithms_11a_2 Gluing Operation
 
-The Gluing operation is the option of the Basic Operations, such as General Fuse, Boolean and Section operations.
+The Gluing operation is the option of the Basic Operations, such as General Fuse, Partition, Boolean, Section, Maker Volume operations.
 It has been designed to speed up the computation of the interferences among arguments of the operations on special cases, in which the arguments may be overlapping but do not have real intersections between their sub-shapes.
 
 This option cannot be used on the shapes having real intersections, like intersection vertex between edges, or intersection vertex between edge and a face or intersection line between faces:
@@ -2299,6 +2458,41 @@ Performance improvement from using the GlueShift option in this case is about 70
 
 Performance improvement in this case is also about 70 percent.
 
+@subsection occt_algorithms_11a_3 Safe processing mode
+
+The safe processing mode is the advanced option in Boolean Operation component. This mode can be applied to all Basic operations such as General Fuse, Partition, Boolean, Section, Maker Volume.
+This option allows keeping the input arguments untouched. In other words, switching this option on prevents the input arguments from any modification such as tolerance increase, addition of the P-Curves on edges etc.
+
+The option might be very useful for implementation of the Undo/Redo mechanism in the applications and allows performing the operation many times without changing the inputs.
+
+By default the safe processing option is switched off for the algorithms. Enabling this option might slightly decrease the performance of the operation, because instead of the modification of some entitiy it will be necessary to create the copy of this entitiy and modify it. But this degradation should be very small because the copying is performed only in case of necessity.
+
+The option is also availible in the Intersection algorithm - *BOPAlgo_PaveFiller*. Thus, if it is necessary to perform several different operations on the same arguemnts, it is possible to enable the safe processing mode in PaveFiller and prepare it only once and then use it in operations. It is enough to set the option to PaveFiller only and all algorithms taking this PaveFiller will also work in safe mode.
+
+@subsubsection occt_algorithms_11a_3_1 Usage
+
+#### API level
+
+To enable/disable the safe processing mode for the algorithm it is necessary to call the SetNonDestructive() method with appropriate value:
+~~~~
+BOPAlgo_Builder aGF;
+//
+....
+// enabling the safe processing mode to prevent modification of the input shapes
+aGF.SetNonDestructive(Standard_True);
+//
+....
+~~~~
+
+#### TCL level
+For enabling the safe processing mode for the operaton in DRAW it is necessary to call the <i>bnondestructive</i> command with appropriate value:
+* 0 - default value, the safe mode is switched off;
+* 1 - the safe mode will be switched on.
+
+~~~~
+bnondestructive 1
+~~~~
+
 
 @section occt_algorithms_11b Usage 
 
@@ -2311,13 +2505,14 @@ The package *BRepAlgoAPI* provides the Application Programming Interface of the
 The package consists of the following classes:
 * *BRepAlgoAPI_Algo* -- the root class that provides the interface for algorithms. 
 * *BRepAlgoAPI_BuilderAlgo* -- the class API level of General Fuse algorithm.
+* *BRepAlgoAPI_Splitter* -- the class API level of the Partition algorithm.
 * *BRepAlgoAPI_BooleanOperation* -- the root class for the classes *BRepAlgoAPI_Fuse*. *BRepAlgoAPI_Common*, *BRepAlgoAPI_Cut* and *BRepAlgoAPI_Section*.
 * *BRepAlgoAPI_Fuse* -- the class provides Boolean fusion operation. 
 * *BRepAlgoAPI_Common* -- the class provides Boolean common operation.
 * *BRepAlgoAPI_Cut* -- the class provides Boolean cut operation.
 * *BRepAlgoAPI_Section* -- the class provides Boolean section operation.
 
-@figure{/user_guides/boolean_operations/images/operations_image065.svg, "Diagram of BRepAlgoAPI package"} 
+@figure{/user_guides/boolean_operations/images/operations_image065.png, "Diagram of BRepAlgoAPI package"} 
 
 The detailed description of the classes can be found in the corresponding .hxx files. The examples are below in this chapter.
 
@@ -2325,11 +2520,12 @@ The detailed description of the classes can be found in the corresponding .hxx f
 The package *BOPTest* provides the usage of the Boolean Component on Tcl level. The method *BOPTest::APICommands* contains corresponding Tcl commands: 
 
 * *bapibuild* -- for General Fuse Operator;
+* *bapisplit* -- for Partition Operator;
 * *bapibop* -- for Boolean Operator and Section Operator.
 
 The examples of how to use the commands are below in this chapter.
 
-@subsubsection occt_algorithms_11b_2_1 Case 1 General Fuse operation
+@subsubsection occt_algorithms_11b_2_1 Case 1. General Fuse operation
 
 The following example illustrates how to use General Fuse operator:
 
@@ -2363,6 +2559,19 @@ The following example illustrates how to use General Fuse operator:
   //  if aFuzzyValue>0.: the Fuzzy option is on
   aBuilder.SetFuzzyValue(aFuzzyValue);
   //
+  // safe mode - avoid modification of the arguments
+  Standard_Boolean bSafeMode = Standard_True;
+  // if bSafeMode == Standard_True  - the safe mode is switched on
+  // if bSafeMode == Standard_False - the safe mode is switched off
+  aBuilder.SetNonDestructive(bSafeMode);
+  //
+  // gluing options - for coinciding arguments
+  BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
+  // if aGlueOpt == BOPAlgo_GlueOff   - the gluing mode is switched off
+  // if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
+  // if aGlueOpt == BOPAlgo_GlueFull  - the gluing mode is switched on
+  aBuilder.SetGlue(aGlueOpt);
+  //
   // run the algorithm 
   aBuilder.Build(); 
   iErr=aBuilder.ErrorStatus();
@@ -2394,17 +2603,137 @@ baddobjects b1 b2 b3
 # 1:  the parallel processing is switched on
 # 0:  the parallel processing is switched off
 brunparallel 1 
+#
 # set Fuzzy value
 # 0.    : the Fuzzy option is off
 # >0. : the Fuzzy option is on
 bfuzzyvalue 0.
 #
+# set safe processing mode
+bnondestructive 1
+# set safe mode
+# 1 - the safe processing mode is switched on
+# 0 - the safe processing mode is switched off
+#
+# set gluing mode
+bglue 1
+# set the gluing mode
+# 1 or 2 - the gluing mode is switched on
+# 0 - the gluing mode is switched off
+#
 # run the algorithm
 # r is the result of the operation
 bapibuild r 
 ~~~~
 
-@subsubsection occt_algorithms_11b_2_2 Case 2. Common operation
+@subsubsection occt_algorithms_11b_2_2 Case 2. Partition operation
+
+The following example illustrates how to use the Partition operator:
+
+#### C++ Level
+
+~~~~
+#include <TopoDS_Shape.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include <BRepAlgoAPI_Splitter.hxx>
+//
+BRepAlgoAPI_BuilderAlgo aSplitter;
+//
+// prepare the arguments
+// objects
+TopTools_ListOfShape& aLSObjects = … ;
+// tools
+TopTools_ListOfShape& aLSTools = … ;
+//
+// set the arguments
+aSplitter.SetArguments(aLSObjects);
+aSplitter.SetTools(aLSTools);
+//
+// set options
+// parallel processing mode 
+Standard_Boolean bRunParallel = Standard_True;
+// bRunParallel == Standard_True  - the parallel processing is switched on
+// bRunParallel == Standard_False - the parallel processing is switched off
+aSplitter.SetRunParallel();
+//
+// fuzzy value - additional tolerance for the operation
+Standard_Real aFuzzyValue = 1.e-5;
+// if aFuzzyValue == 0. - the Fuzzy option is off
+// if aFuzzyValue > 0.  - the Fuzzy option is on
+aSplitter.SetFuzzyValue(aFuzzyValue);
+//
+// safe mode - avoid modification of the arguments
+Standard_Boolean bSafeMode = Standard_True;
+// if bSafeMode == Standard_True  - the safe mode is switched on
+// if bSafeMode == Standard_False - the safe mode is switched off
+aSplitter.SetNonDestructive(bSafeMode);
+//
+// gluing options - for coinciding arguments
+BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
+// if aGlueOpt == BOPAlgo_GlueOff   - the gluing mode is switched off
+// if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
+// if aGlueOpt == BOPAlgo_GlueFull  - the gluing mode is switched on
+aSplitter.SetGlue(aGlueOpt);
+//
+// run the algorithm 
+aSplitter.Build(); 
+// check error status
+if (aSplitter.ErrorStatus()) {
+  return;
+}
+//
+// result of the operation aResult
+const TopoDS_Shape& aResult = aSplitter.Shape();
+~~~~
+
+#### Tcl Level
+
+~~~~
+# prepare the arguments
+# objects
+box b1 10 10 10 
+box b2 7 0 0 10 10 10
+
+# tools
+plane p 10 5 5 0 1 0
+mkface f p -20 20 -20 20
+#
+# clear inner contents
+bclearobjects; bcleartools;
+#
+# set the objects
+baddobjects b1 b2
+# set the tools
+baddtools f
+#
+# set parallel processing mode
+# 1:  the parallel processing is switched on
+# 0:  the parallel processing is switched off
+brunparallel 1 
+#
+# set Fuzzy value
+# 0.  : the Fuzzy option is off
+# >0. : the Fuzzy option is on
+bfuzzyvalue 0.
+#
+# set safe processing mode
+bnondestructive 1
+# set safe mode
+# 1 - the safe processing mode is switched on
+# 0 - the safe processing mode is switched off
+#
+# set gluing mode
+bglue 1
+# set the gluing mode
+# 1 or 2 - the gluing mode is switched on
+# 0 - the gluing mode is switched off
+#
+# run the algorithm
+# r is the result of the operation
+bapisplit r 
+~~~~
+
+@subsubsection occt_algorithms_11b_2_3 Case 3. Common operation
 
 The following example illustrates how to use Common operation:
 
@@ -2441,6 +2770,19 @@ The following example illustrates how to use Common operation:
   //  if aFuzzyValue>0.: the Fuzzy option is on
   aBuilder.SetFuzzyValue(aFuzzyValue);
   //
+  // safe mode - avoid modification of the arguments
+  Standard_Boolean bSafeMode = Standard_True;
+  // if bSafeMode == Standard_True  - the safe mode is switched on
+  // if bSafeMode == Standard_False - the safe mode is switched off
+  aBuilder.SetNonDestructive(bSafeMode);
+  //
+  // gluing options - for coinciding arguments
+  BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
+  // if aGlueOpt == BOPAlgo_GlueOff   - the gluing mode is switched off
+  // if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
+  // if aGlueOpt == BOPAlgo_GlueFull  - the gluing mode is switched on
+  aBuilder.SetGlue(aGlueOpt);
+  //
   // run the algorithm 
   aBuilder.Build(); 
   iErr=aBuilder.ErrorStatus();
@@ -2480,13 +2822,25 @@ brunparallel 1
 # >0. : the Fuzzy option is on
 bfuzzyvalue 0.
 #
+# set safe processing mode
+bnondestructive 1
+# set safe mode
+# 1 - the safe processing mode is switched on
+# 0 - the safe processing mode is switched off
+#
+# set gluing mode
+bglue 1
+# set the gluing mode
+# 1 or 2 - the gluing mode is switched on
+# 0 - the gluing mode is switched off
+#
 # run the algorithm
 # r is the result of the operation
 # 0 means Common operation
 bapibop r 0
 ~~~~
 
-@subsubsection occt_algorithms_11b_2_3 Case 3. Fuse operation
+@subsubsection occt_algorithms_11b_2_4 Case 4. Fuse operation
 
 The following example illustrates how to use Fuse operation:
 
@@ -2523,6 +2877,19 @@ The following example illustrates how to use Fuse operation:
   //  if aFuzzyValue>0.: the Fuzzy option is on
   aBuilder.SetFuzzyValue(aFuzzyValue);
   //
+  // safe mode - avoid modification of the arguments
+  Standard_Boolean bSafeMode = Standard_True;
+  // if bSafeMode == Standard_True  - the safe mode is switched on
+  // if bSafeMode == Standard_False - the safe mode is switched off
+  aBuilder.SetNonDestructive(bSafeMode);
+  //
+  // gluing options - for coinciding arguments
+  BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
+  // if aGlueOpt == BOPAlgo_GlueOff   - the gluing mode is switched off
+  // if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
+  // if aGlueOpt == BOPAlgo_GlueFull  - the gluing mode is switched on
+  aBuilder.SetGlue(aGlueOpt);
+  //
   // run the algorithm 
   aBuilder.Build(); 
   iErr=aBuilder.ErrorStatus();
@@ -2562,13 +2929,25 @@ brunparallel 1
 # >0. : the Fuzzy option is on
 bfuzzyvalue 0.
 #
+# set safe processing mode
+bnondestructive 1
+# set safe mode
+# 1 - the safe processing mode is switched on
+# 0 - the safe processing mode is switched off
+#
+# set gluing mode
+bglue 1
+# set the gluing mode
+# 1 or 2 - the gluing mode is switched on
+# 0 - the gluing mode is switched off
+#
 # run the algorithm
 # r is the result of the operation
 # 1 means Fuse operation
 bapibop r 1
 ~~~~
 
-@subsubsection occt_algorithms_11b_2_4 Case 4. Cut operation
+@subsubsection occt_algorithms_11b_2_5 Case 5. Cut operation
 
 The following example illustrates how to use Cut operation:
 
@@ -2605,6 +2984,19 @@ The following example illustrates how to use Cut operation:
   //  if aFuzzyValue>0.: the Fuzzy option is on
   aBuilder.SetFuzzyValue(aFuzzyValue);
   //
+  // safe mode - avoid modification of the arguments
+  Standard_Boolean bSafeMode = Standard_True;
+  // if bSafeMode == Standard_True  - the safe mode is switched on
+  // if bSafeMode == Standard_False - the safe mode is switched off
+  aBuilder.SetNonDestructive(bSafeMode);
+  //
+  // gluing options - for coinciding arguments
+  BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
+  // if aGlueOpt == BOPAlgo_GlueOff   - the gluing mode is switched off
+  // if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
+  // if aGlueOpt == BOPAlgo_GlueFull  - the gluing mode is switched on
+  aBuilder.SetGlue(aGlueOpt);
+  //
   // run the algorithm 
   aBuilder.Build(); 
   iErr=aBuilder.ErrorStatus();
@@ -2644,6 +3036,18 @@ brunparallel 1
 # >0. : the Fuzzy option is on
 bfuzzyvalue 0.
 #
+# set safe processing mode
+bnondestructive 1
+# set safe mode
+# 1 - the safe processing mode is switched on
+# 0 - the safe processing mode is switched off
+# set gluing mode
+#
+bglue 1
+# set the gluing mode
+# 1 or 2 - the gluing mode is switched on
+# 0 - the gluing mode is switched off
+#
 # run the algorithm
 # r is the result of the operation
 # 2 means Cut operation
@@ -2651,7 +3055,7 @@ bapibop r 2
 ~~~~
 
 
-@subsubsection occt_algorithms_11b_2_5 Case 5. Section operation
+@subsubsection occt_algorithms_11b_2_6 Case 6. Section operation
 
 The following example illustrates how to use Section operation:
 
@@ -2688,6 +3092,19 @@ The following example illustrates how to use Section operation:
   //  if aFuzzyValue>0.: the Fuzzy option is on
   aBuilder.SetFuzzyValue(aFuzzyValue);
   //
+  // safe mode - avoid modification of the arguments
+  Standard_Boolean bSafeMode = Standard_True;
+  // if bSafeMode == Standard_True  - the safe mode is switched on
+  // if bSafeMode == Standard_False - the safe mode is switched off
+  aBuilder.SetNonDestructive(bSafeMode);
+  //
+  // gluing options - for coinciding arguments
+  BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
+  // if aGlueOpt == BOPAlgo_GlueOff   - the gluing mode is switched off
+  // if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
+  // if aGlueOpt == BOPAlgo_GlueFull  - the gluing mode is switched on
+  aBuilder.SetGlue(aGlueOpt);
+  //
   // run the algorithm 
   aBuilder.Build(); 
   iErr=aBuilder.ErrorStatus();
@@ -2727,6 +3144,18 @@ brunparallel 1
 # >0. : the Fuzzy option is on
 bfuzzyvalue 0.
 #
+# set safe processing mode
+bnondestructive 1
+# set safe mode
+# 1 - the safe processing mode is switched on
+# 0 - the safe processing mode is switched off
+#
+# set gluing mode
+bglue 1
+# set the gluing mode
+# 1 or 2 - the gluing mode is switched on
+# 0 - the gluing mode is switched off
+#
 # run the algorithm
 # r is the result of the operation
 # 4 means Section operation
diff --git a/dox/user_guides/boolean_operations/images/bsplit_image001.png b/dox/user_guides/boolean_operations/images/bsplit_image001.png
new file mode 100644 (file)
index 0000000..e903c9f
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/bsplit_image001.png differ
diff --git a/dox/user_guides/boolean_operations/images/bsplit_image002.png b/dox/user_guides/boolean_operations/images/bsplit_image002.png
new file mode 100644 (file)
index 0000000..bc0c2ae
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/bsplit_image002.png differ
diff --git a/dox/user_guides/boolean_operations/images/bsplit_image003.png b/dox/user_guides/boolean_operations/images/bsplit_image003.png
new file mode 100644 (file)
index 0000000..bb8deea
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/bsplit_image003.png differ
diff --git a/dox/user_guides/boolean_operations/images/bsplit_image004.png b/dox/user_guides/boolean_operations/images/bsplit_image004.png
new file mode 100644 (file)
index 0000000..1dd930c
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/bsplit_image004.png differ
diff --git a/dox/user_guides/boolean_operations/images/bsplit_image005.png b/dox/user_guides/boolean_operations/images/bsplit_image005.png
new file mode 100644 (file)
index 0000000..e1cd59d
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/bsplit_image005.png differ
diff --git a/dox/user_guides/boolean_operations/images/bsplit_image006.png b/dox/user_guides/boolean_operations/images/bsplit_image006.png
new file mode 100644 (file)
index 0000000..80bfb65
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/bsplit_image006.png differ
diff --git a/dox/user_guides/boolean_operations/images/operations_image065.png b/dox/user_guides/boolean_operations/images/operations_image065.png
new file mode 100644 (file)
index 0000000..53161ce
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/operations_image065.png differ
diff --git a/dox/user_guides/boolean_operations/images/operations_image065.svg b/dox/user_guides/boolean_operations/images/operations_image065.svg
deleted file mode 100644 (file)
index 0fc507a..0000000
+++ /dev/null
@@ -1,407 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="500.70731"
-   height="257.98001"
-   id="svg3731"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="operations_image059.svg">
-  <defs
-     id="defs3733">
-    <marker
-       inkscape:stockid="Arrow2Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mstart"
-       style="overflow:visible">
-      <path
-         id="path4673"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(0.6,0.6)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lstart"
-       style="overflow:visible">
-      <path
-         id="path4649"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
-         transform="matrix(0.8,0,0,0.8,10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <clipPath
-       id="clipEmfPath1"
-       clipPathUnits="userSpaceOnUse">
-      <rect
-         id="rect3744"
-         height="157.5"
-         width="566.85828"
-         y="0"
-         x="0" />
-    </clipPath>
-    <clipPath
-       id="clipEmfPath2"
-       clipPathUnits="userSpaceOnUse">
-      <rect
-         id="rect3747"
-         height="15"
-         width="134.10196"
-         y="14.7"
-         x="215.55315" />
-    </clipPath>
-    <clipPath
-       id="clipEmfPath3"
-       clipPathUnits="userSpaceOnUse">
-      <rect
-         id="rect3750"
-         height="13.95"
-         width="158.85233"
-         y="118.5"
-         x="53.850784" />
-    </clipPath>
-    <clipPath
-       id="clipEmfPath4"
-       clipPathUnits="userSpaceOnUse">
-      <rect
-         id="rect3753"
-         height="15"
-         width="189.90277"
-         y="68.849998"
-         x="185.10271" />
-    </clipPath>
-    <clipPath
-       id="clipEmfPath5"
-       clipPathUnits="userSpaceOnUse">
-      <rect
-         id="rect3756"
-         height="13.95"
-         width="180.15263"
-         y="118.2"
-         x="315.3046" />
-    </clipPath>
-    <marker
-       inkscape:stockid="Arrow2Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mstart-1"
-       style="overflow:visible">
-      <path
-         id="path4673-7"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(0.6,0.6)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <clipPath
-       id="clipEmfPath1-0"
-       clipPathUnits="userSpaceOnUse">
-      <rect
-         id="rect3744-9"
-         height="157.5"
-         width="566.85828"
-         y="0"
-         x="0" />
-    </clipPath>
-    <marker
-       inkscape:stockid="Arrow2Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mstart-7"
-       style="overflow:visible">
-      <path
-         id="path4673-1"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(0.6,0.6)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mstart-2"
-       style="overflow:visible">
-      <path
-         id="path4673-76"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(0.6,0.6)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <clipPath
-       id="clipEmfPath1-4"
-       clipPathUnits="userSpaceOnUse">
-      <rect
-         id="rect3744-2"
-         height="157.5"
-         width="566.85828"
-         y="0"
-         x="0" />
-    </clipPath>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.7435336"
-     inkscape:cx="250.35365"
-     inkscape:cy="166.25673"
-     inkscape:document-units="px"
-     inkscape:current-layer="g3758"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1195"
-     inkscape:window-height="615"
-     inkscape:window-x="10"
-     inkscape:window-y="129"
-     inkscape:window-maximized="0"
-     inkscape:snap-bbox="false"
-     inkscape:bbox-nodes="false"
-     inkscape:snap-nodes="false"
-     inkscape:snap-global="true" />
-  <metadata
-     id="metadata3736">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(204.63937,-240.29985)">
-    <g
-       id="g3758"
-       transform="translate(-261.51666,329.10596)">
-      <text
-         id="text3760"
-         style="font-size:12.45018196px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
-         y="142.64999"
-         x="558.15814"
-         xml:space="preserve"> </text>
-      <path
-         id="path3762"
-         d="m 214.87814,10.5 0,23.4375 135.43322,0 0,-23.4375 z"
-         clip-path="url(#clipEmfPath1)"
-         style="fill:none;stroke:#000000;stroke-width:1.25626838px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0"
-         transform="matrix(1.8268958,0,0,0.9818143,-213.2932,-1.3165801)" />
-      <text
-         id="text3764"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="23.035164"
-         x="220.98541"
-         xml:space="preserve">BRepAlgoAPI_BuilderAlgo</text>
-      <text
-         id="text3766"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="25.049999"
-         x="327.60477"
-         xml:space="preserve"> </text>
-      <path
-         id="path3768"
-         d="m 53.175776,114.3 0,22.37812 160.127334,0 0,-22.37812 z"
-         clip-path="url(#clipEmfPath2)"
-         style="fill:none;stroke:#000000;stroke-width:1.24689317px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
-      <text
-         id="text3770"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="143.76225"
-         x="148.95631"
-         xml:space="preserve">BRepAlgoAPI_Fuse</text>
-      <text
-         id="text3772"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="128.85001"
-         x="204.603"
-         xml:space="preserve"> </text>
-      <text
-         id="text3774"
-         style="font-size:12.45018196px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
-         y="158.85001"
-         x="57.45084"
-         xml:space="preserve"> </text>
-      <path
-         id="path3776"
-         d="m 280.56035,62.94375 -0.59064,-22.621875 c -0.009,-0.346875 0.26251,-0.6375 0.60939,-0.646875 0.34688,-0.0094 0.62813,0.2625 0.63751,0.609375 l 0.59063,22.63125 c 0.009,0.346875 -0.2625,0.628125 -0.60938,0.6375 -0.34688,0.0094 -0.62814,-0.2625 -0.63751,-0.609375 z m -3.68443,-21.290625 3.55317,-7.603125 3.94694,7.40625 z"
-         clip-path="url(#clipEmfPath3)"
-         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.1500022px;stroke-linecap:butt;stroke-linejoin:bevel;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path3778"
-         d="m 177.37132,50.938071 0,23.25606 252.44098,0 0,-23.25606 z"
-         style="fill:none;stroke:#000000;stroke-width:1.43770862px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
-      <text
-         id="text3780"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="64.861305"
-         x="203.64111"
-         xml:space="preserve">BRepAlgoAPI_BooleanOperation</text>
-      <text
-         id="text3782"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="79.199997"
-         x="351.30511"
-         xml:space="preserve"> </text>
-      <text
-         id="text3784"
-         style="font-size:12.45018196px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="108.3"
-         x="188.70276"
-         xml:space="preserve"> </text>
-      <path
-         id="path3786"
-         d="m 198.98728,113.10938 20.70968,-20.700005 c 0.24375,-0.24375 0.63751,-0.24375 0.88126,0 0.24375,0.24375 0.24375,0.6375 0,0.88125 L 199.87792,114 c -0.24376,0.24375 -0.64689,0.24375 -0.89064,0 -0.24375,-0.24375 -0.24375,-0.64688 0,-0.89062 z m 17.61588,-22.031255 7.95012,-2.653125 -2.64379,7.959375 z"
-         clip-path="url(#clipEmfPath4)"
-         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.1500022px;stroke-linecap:butt;stroke-linejoin:bevel;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path3790"
-         d="m 323.06859,130.86407 0,22.45692 161.49789,0 0,-22.45692 z"
-         style="fill:none;stroke:#000000;stroke-width:1.18685222px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
-      <text
-         id="text3792"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="144.46437"
-         x="341.69354"
-         xml:space="preserve">BRepAlgoAPI_Cut</text>
-      <text
-         id="text3794"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="128.55"
-         x="480.30701"
-         xml:space="preserve"> </text>
-      <text
-         id="text3796"
-         style="font-size:12.45018196px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
-         y="158.39999"
-         x="318.75464"
-         xml:space="preserve"> </text>
-      <path
-         id="path3778-1"
-         d="m 136.65269,130.42418 0,23.58586 147.81153,0 0,-23.58586 z"
-         style="fill:none;stroke:#000000;stroke-width:1.10790598px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#916f6f;stroke:#000000;stroke-width:0.7965284px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Mstart)"
-         d="m 304.3563,32.239951 0,18.31124"
-         id="path3875"
-         inkscape:connector-curvature="0" />
-      <path
-         transform="matrix(1.1475795,0,0,0.99628756,-17.657381,-45.674459)"
-         id="path3762-4"
-         d="m 214.87814,10.5 0,23.4375 135.43322,0 0,-23.4375 z"
-         clip-path="url(#clipEmfPath1-0)"
-         style="fill:none;stroke:#000000;stroke-width:1.25626838px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path3778-1-8"
-         d="m 78.687273,88.627374 0,23.585856 147.811517,0 0,-23.585856 z"
-         style="fill:none;stroke:#000000;stroke-width:1.10790598px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:none;stroke:#000000;stroke-width:0.90858448px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
-         d="M 276.56388,74.263936 224.85315,129.41594"
-         id="path6825"
-         inkscape:connector-type="polyline"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:none;stroke:#000000;stroke-width:0.91995925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
-         d="m 325.68413,73.924924 51.41999,56.861286"
-         id="path6825-2"
-         inkscape:connector-type="polyline"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 179.52049,162.77106 c -59.64898,14.3387 -59.64898,14.3387 -59.64898,14.3387"
-         id="path6849"
-         inkscape:connector-curvature="0"
-         transform="translate(56.87729,-88.80611)" />
-      <text
-         id="text3792-4"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="103.56826"
-         x="83.965698"
-         xml:space="preserve">BRepAlgoAPI_Common</text>
-      <path
-         id="path3778-1-8-5"
-         d="m 373.01844,90.295386 0,23.546834 158.6699,0 0,-23.546834 z"
-         style="fill:none;stroke:#000000;stroke-width:1.14692891px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:none;stroke:#000000;stroke-width:1.0304904px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 389.40321,74.26698 c 58.76558,15.4553 58.76558,15.4553 58.76558,15.4553"
-         id="path6849-5"
-         inkscape:connector-curvature="0" />
-      <text
-         id="text3792-4-1"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="104.71535"
-         x="382.07281"
-         xml:space="preserve">BRepAlgoAPI_Section</text>
-      <path
-         style="fill:#916f6f;stroke:#000000;stroke-width:0.7965284px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Mstart)"
-         d="m 305.51053,-9.9971206 0,18.31124"
-         id="path3875-1"
-         inkscape:connector-curvature="0" />
-      <text
-         id="text3764-5"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="-19.759373"
-         x="249.94737"
-         xml:space="preserve">BRepAlgoAPI_Algo</text>
-      <path
-         style="fill:#916f6f;stroke:#000000;stroke-width:0.7965284px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Mstart)"
-         d="m 306.65763,-54.160308 0,18.31124"
-         id="path3875-1-1"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path3762-3"
-         d="m 214.87814,10.5 0,23.4375 135.43322,0 0,-23.4375 z"
-         clip-path="url(#clipEmfPath1-4)"
-         style="fill:none;stroke:#000000;stroke-width:1.25626838px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0"
-         transform="matrix(1.6833898,0,0,0.98459396,-169.65553,-88.430725)" />
-      <text
-         id="text3764-2"
-         style="font-size:12.45018196px;font-style:normal;font-weight:bold;text-align:start;text-anchor:start;fill:#000000;font-family:Courier New"
-         y="-65.054825"
-         x="221.258"
-         xml:space="preserve">BRepBuilderAPI_MakeShape</text>
-    </g>
-  </g>
-</svg>
index 7c48722..e7b5861 100644 (file)
@@ -7763,7 +7763,9 @@ The following terms and definitions are used in this document:
 * **baddobjects** *S1 S2...Sn* -- adds shapes *S1, S2, ... Sn* as Objects;     
 * **baddtools** *S1 S2...Sn* -- adds shapes *S1, S2, ... Sn* as Tools;
 * **bfillds** -- performs the Intersection Part of the Algorithm;      
-* **bbuild** *r* -- performs the Building Part of the Algorithm; *r* is the resulting shape.
+* **bbuild** *r* -- performs the Building Part of the Algorithm (General Fuse operation); *r* is the resulting shape;
+* **bsplit** *r* -- performs the Partition operation; *r* is the resulting shape;
+* **bbop** *r* *iOp* -- performs the Boolean operation; *r* is the resulting shape; *iOp* - type of the operation (0 - COMMON; 1 - FUSE; 2 - CUT; 3 - CUT21; 4 - SECTION).
 
 @subsection occt_draw_20_3 Commands for Intersection Part
 
diff --git a/src/BOPAlgo/BOPAlgo_Splitter.cxx b/src/BOPAlgo/BOPAlgo_Splitter.cxx
new file mode 100644 (file)
index 0000000..74a0ecb
--- /dev/null
@@ -0,0 +1,148 @@
+// Created by: Eugeny MALTCHIKOV
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+
+#include <BOPAlgo_Splitter.hxx>
+#include <BOPAlgo_PaveFiller.hxx>
+
+//=======================================================================
+//function : 
+//purpose  : 
+//=======================================================================
+BOPAlgo_Splitter::BOPAlgo_Splitter()
+:
+  BOPAlgo_Builder(),
+  myTools(myAllocator),
+  myMapTools(100, myAllocator)
+{
+}
+//=======================================================================
+//function : 
+//purpose  : 
+//=======================================================================
+BOPAlgo_Splitter::BOPAlgo_Splitter
+  (const Handle(NCollection_BaseAllocator)& theAllocator)
+:
+  BOPAlgo_Builder(theAllocator),
+  myTools(myAllocator),
+  myMapTools(100, myAllocator)
+{
+}
+//=======================================================================
+//function : ~
+//purpose  : 
+//=======================================================================
+BOPAlgo_Splitter::~BOPAlgo_Splitter()
+{
+}
+//=======================================================================
+//function : Clear
+//purpose  : 
+//=======================================================================
+void BOPAlgo_Splitter::Clear()
+{
+  BOPAlgo_Builder::Clear();
+  myTools.Clear();
+  myMapTools.Clear();
+}
+//=======================================================================
+//function : AddTool
+//purpose  : 
+//=======================================================================
+void BOPAlgo_Splitter::AddTool(const TopoDS_Shape& theShape)
+{
+  if (myMapTools.Add(theShape)) {
+    myTools.Append(theShape);
+  }
+}
+//=======================================================================
+//function : SetTools
+//purpose  : 
+//=======================================================================
+void BOPAlgo_Splitter::SetTools(const BOPCol_ListOfShape& theShapes)
+{
+  myTools.Clear();
+  BOPCol_ListIteratorOfListOfShape aIt(theShapes);
+  for (; aIt.More(); aIt.Next()) {
+    AddTool(aIt.Value());
+  }
+}
+
+//=======================================================================
+// function: CheckData
+// purpose: 
+//=======================================================================
+void BOPAlgo_Splitter::CheckData()
+{
+  myErrorStatus = 0;
+  if (myArguments.IsEmpty() ||
+      (myArguments.Extent() + myTools.Extent()) < 2) {
+    // too few arguments to process
+    myErrorStatus = 100;
+    return;
+  }
+  //
+  // Check the PaveFiller
+  if (!myPaveFiller) {
+    myErrorStatus = 101;
+    return;
+  }
+  //
+  if (myPaveFiller->ErrorStatus()) {
+    // PaveFiller has failed
+    myErrorStatus = 102;
+  }
+}
+
+//=======================================================================
+//function : Perform
+//purpose  : 
+//=======================================================================
+void BOPAlgo_Splitter::Perform()
+{
+  myErrorStatus = 0;
+  //
+  if (myEntryPoint == 1) {
+    if (myPaveFiller) {
+      delete myPaveFiller;
+      myPaveFiller = NULL;
+    }
+  }
+  //
+  // prepare shapes for intersection
+  BOPCol_ListOfShape aLS;
+  //
+  BOPCol_ListIteratorOfListOfShape aItLS(myArguments);
+  for (; aItLS.More(); aItLS.Next()) {
+    aLS.Append(aItLS.Value());
+  }
+  //
+  aItLS.Initialize(myTools);
+  for (; aItLS.More(); aItLS.Next()) {
+    aLS.Append(aItLS.Value());
+  }
+  //
+  BOPAlgo_PaveFiller *pPF = new BOPAlgo_PaveFiller();
+  pPF->SetArguments(aLS);
+  pPF->SetRunParallel(myRunParallel);
+  pPF->SetProgressIndicator(myProgressIndicator);
+  pPF->SetFuzzyValue(myFuzzyValue);
+  pPF->SetNonDestructive(myNonDestructive);
+  pPF->SetGlue(myGlue);
+  //
+  pPF->Perform();
+  //
+  myEntryPoint = 1;
+  PerformInternal(*pPF);
+}
diff --git a/src/BOPAlgo/BOPAlgo_Splitter.hxx b/src/BOPAlgo/BOPAlgo_Splitter.hxx
new file mode 100644 (file)
index 0000000..364554f
--- /dev/null
@@ -0,0 +1,84 @@
+// Created by: Eugeny MALTCHIKOV
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#ifndef _BOPAlgo_Splitter_HeaderFile
+#define _BOPAlgo_Splitter_HeaderFile
+
+#include <Standard.hxx>
+#include <Standard_DefineAlloc.hxx>
+#include <Standard_Handle.hxx>
+
+#include <BOPAlgo_Builder.hxx>
+
+//! The class is a General Fuse (GF) based algorithm.<br>
+//! It provides means to split an arbitrary number of shapes of arbitrary
+//! dimensions by other arbitrary shapes.<br>
+//! The arguments of the operation are divided on two groups - Objects
+//! (shapes that will be split) and Tools (shapes by which the objects will be split).<br>
+//! The result of the operation contains only the split parts of the Objects.<br>
+//! The split parts of the Tools are excluded from the result.<br>
+//! If there are no Tool shapes, the operation will be equivalent to General Fuse.<br>
+//!
+//! All options of the General Fuse algorithm, such as Fuzzy mode, safe mode, parallel
+//! mode, gluing mode and history support are also available in this algorithm.<br>
+//!
+//! The implementation of the algorithm is minimal - only the methods
+//! CheckData() and Perform() have been overridden.<br>
+//! The method BOPAlgo_Builder::BuildResult(), which adds the split parts of the arguments
+//! into result, does not have to be overridden, because its native implementation
+//! performs the necessary actions for the Splitter algorithm - it adds
+//! the split parts of only Objects into result, avoiding the split parts of Tools.
+class BOPAlgo_Splitter : public BOPAlgo_Builder
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+
+  //! Empty constructor
+  Standard_EXPORT BOPAlgo_Splitter();
+  Standard_EXPORT virtual ~BOPAlgo_Splitter();
+
+  Standard_EXPORT BOPAlgo_Splitter(const BOPCol_BaseAllocator& theAllocator);
+
+  //! Clears internal fields and arguments
+  Standard_EXPORT virtual void Clear() Standard_OVERRIDE;
+
+  //! Adds Tool argument of the operation
+  Standard_EXPORT virtual void AddTool(const TopoDS_Shape& theShape);
+
+  //! Adds the Tool arguments of the operation
+  Standard_EXPORT virtual void SetTools(const BOPCol_ListOfShape& theShapes);
+
+  //! Returns the Tool arguments of the operation
+  const BOPCol_ListOfShape& Tools() const
+  {
+    return myTools;
+  }
+
+  //! Performs the operation
+  Standard_EXPORT virtual void Perform() Standard_OVERRIDE;
+
+protected:
+
+  //! Checks the input data
+  Standard_EXPORT virtual void CheckData() Standard_OVERRIDE;
+
+  BOPCol_ListOfShape myTools;
+  BOPCol_MapOfShape myMapTools;
+
+private:
+
+};
+
+#endif // _BOPAlgo_Splitter_HeaderFile
index 6f1e522..e32194e 100644 (file)
@@ -65,4 +65,6 @@ BOPAlgo_WireSplitter.lxx
 BOPAlgo_WireSplitter_1.cxx
 BOPAlgo_CellsBuilder.cxx
 BOPAlgo_CellsBuilder.hxx
-BOPAlgo_GlueEnum.hxx
\ No newline at end of file
+BOPAlgo_GlueEnum.hxx
+BOPAlgo_Splitter.hxx
+BOPAlgo_Splitter.cxx
\ No newline at end of file
index a61adc1..87bc4d3 100644 (file)
@@ -23,6 +23,7 @@
 #include <BRepAlgoAPI_Cut.hxx>
 #include <BRepAlgoAPI_Fuse.hxx>
 #include <BRepAlgoAPI_Section.hxx>
+#include <BRepAlgoAPI_Splitter.hxx>
 #include <DBRep.hxx>
 #include <Draw.hxx>
 #include <TopoDS_Shape.hxx>
@@ -34,8 +35,9 @@ static
   void ConvertList(const BOPCol_ListOfShape& aLSB,
                    TopTools_ListOfShape& aLS);
 
-static Standard_Integer bapibuild(Draw_Interpretor&, Standard_Integer, const char**); 
-static Standard_Integer bapibop  (Draw_Interpretor&, Standard_Integer, const char**); 
+static Standard_Integer bapibuild(Draw_Interpretor&, Standard_Integer, const char**);
+static Standard_Integer bapibop  (Draw_Interpretor&, Standard_Integer, const char**);
+static Standard_Integer bapisplit(Draw_Interpretor&, Standard_Integer, const char**);
 
 //=======================================================================
 //function : APICommands
@@ -51,6 +53,7 @@ void BOPTest::APICommands(Draw_Interpretor& theCommands)
   // Commands  
   theCommands.Add("bapibuild", "use bapibuild r" , __FILE__, bapibuild, g);
   theCommands.Add("bapibop", "use bapibop r type" , __FILE__, bapibop, g);
+  theCommands.Add("bapisplit", "use bapisplit r" , __FILE__, bapisplit, g);
 }
 //=======================================================================
 //function : bapibop
@@ -219,3 +222,46 @@ void ConvertList(const BOPCol_ListOfShape& aLSB,
   }
 }
   
+
+//=======================================================================
+//function : bapisplit
+//purpose  : 
+//=======================================================================
+Standard_Integer bapisplit(Draw_Interpretor& di,
+  Standard_Integer n,
+  const char** a)
+{
+  if (n < 2) {
+    di << " use bapisplit r\n";
+    return 1;
+  }
+  //
+  BRepAlgoAPI_Splitter aSplitter;
+  // setting arguments
+  aSplitter.SetArguments(BOPTest_Objects::Shapes());
+  aSplitter.SetTools(BOPTest_Objects::Tools());
+  // setting options
+  aSplitter.SetRunParallel(BOPTest_Objects::RunParallel());
+  aSplitter.SetFuzzyValue(BOPTest_Objects::FuzzyValue());
+  aSplitter.SetNonDestructive(BOPTest_Objects::NonDestructive());
+  aSplitter.SetGlue(BOPTest_Objects::Glue());
+  //
+  // performing operation
+  aSplitter.Build();
+  // checking error status
+  Standard_Integer iErr = aSplitter.ErrorStatus();
+  if (iErr) {
+    di << "Error: " << iErr << "\n";
+    return 0;
+  }
+  //
+  // getting the result of the operation
+  const TopoDS_Shape& aR = aSplitter.Shape();
+  if (aR.IsNull()) {
+    di << " null shape\n";
+    return 0;
+  }
+  //
+  DBRep::Set(a[1], aR);
+  return 0;
+}
index 2fad73b..7c703e8 100644 (file)
@@ -19,6 +19,7 @@
 #include <BOPAlgo_Section.hxx>
 #include <BOPTest_Objects.hxx>
 #include <BOPAlgo_CellsBuilder.hxx>
+#include <BOPAlgo_Splitter.hxx>
 #include <NCollection_BaseAllocator.hxx>
 
 static Handle(NCollection_BaseAllocator)& Allocator1();
@@ -254,6 +255,15 @@ BOPAlgo_CellsBuilder& BOPTest_Objects::CellsBuilder()
   return sCBuilder;
 }
 //=======================================================================
+//function : Splitter
+//purpose  : 
+//=======================================================================
+BOPAlgo_Splitter& BOPTest_Objects::Splitter()
+{
+  static BOPAlgo_Splitter aSplitter(Allocator1());
+  return aSplitter;
+}
+//=======================================================================
 //function : Shapes
 //purpose  : 
 //=======================================================================
index e1d24ac..96cdd85 100644 (file)
@@ -31,10 +31,10 @@ class BOPAlgo_PaveFiller;
 class BOPAlgo_Builder;
 class BOPAlgo_BOP;
 class BOPAlgo_Section;
+class BOPAlgo_Splitter;
 
 
-
-class BOPTest_Objects 
+class BOPTest_Objects
 {
 public:
 
@@ -57,6 +57,8 @@ public:
   
   Standard_EXPORT static BOPAlgo_CellsBuilder& CellsBuilder();
   
+  Standard_EXPORT static BOPAlgo_Splitter& Splitter();
+  
   Standard_EXPORT static BOPCol_ListOfShape& Shapes();
   
   Standard_EXPORT static BOPCol_ListOfShape& Tools();
@@ -84,22 +86,8 @@ public:
 
 protected:
 
-
-
-
-
 private:
 
-
-
-
-
 };
 
-
-
-
-
-
-
 #endif // _BOPTest_Objects_HeaderFile
index a86e0c9..ea60954 100644 (file)
@@ -18,6 +18,7 @@
 #include <BOPAlgo_Operation.hxx>
 #include <BOPAlgo_PaveFiller.hxx>
 #include <BOPAlgo_Section.hxx>
+#include <BOPAlgo_Splitter.hxx>
 #include <BOPTest.hxx>
 #include <BOPTest_DrawableShape.hxx>
 #include <BOPTest_Objects.hxx>
 #include <string.h>
 //
 //
-static Standard_Integer bfillds  (Draw_Interpretor&, Standard_Integer, const char**); 
+static Standard_Integer bfillds  (Draw_Interpretor&, Standard_Integer, const char**);
 static Standard_Integer bbuild   (Draw_Interpretor&, Standard_Integer, const char**);
 static Standard_Integer bbop     (Draw_Interpretor&, Standard_Integer, const char**);
+static Standard_Integer bsplit   (Draw_Interpretor&, Standard_Integer, const char**);
 
 //=======================================================================
 //function : PartitionCommands
@@ -51,6 +53,7 @@ void BOPTest::PartitionCommands(Draw_Interpretor& theCommands)
   theCommands.Add("bfillds", "use bfillds [-t]"  , __FILE__, bfillds, g);
   theCommands.Add("bbuild" , "use bbuild r [-t]" , __FILE__, bbuild, g);
   theCommands.Add("bbop"   , "use bbop r op [-t]", __FILE__, bbop, g);
+  theCommands.Add("bsplit" , "use bsplit r [-t]" , __FILE__, bsplit, g);
 }
 //=======================================================================
 //function : bfillds
@@ -330,3 +333,74 @@ Standard_Integer bbop(Draw_Interpretor& di,
   return 0;
 }
 
+//=======================================================================
+//function : bsplit
+//purpose  : 
+//=======================================================================
+Standard_Integer bsplit(Draw_Interpretor& di,
+                        Standard_Integer n,
+                        const char** a)
+{ 
+  if (n < 2) {
+    di << " use bsplit r [-t (show time)]\n";
+    return 1;
+  }
+  //
+  BOPDS_PDS pDS = BOPTest_Objects::PDS();
+  if (!pDS) {
+    di << " prepare PaveFiller first\n";
+    return 0;
+  }
+  //
+  BOPAlgo_PaveFiller& aPF = BOPTest_Objects::PaveFiller();
+  //
+  BOPAlgo_Splitter* pSplitter = &BOPTest_Objects::Splitter();
+  pSplitter->Clear();
+  //
+  // set objects
+  const BOPCol_ListOfShape& aLSObjects = BOPTest_Objects::Shapes();
+  pSplitter->SetArguments(aLSObjects);
+  //
+  // set tools
+  BOPCol_ListOfShape& aLSTools = BOPTest_Objects::Tools();
+  pSplitter->SetTools(aLSTools);
+  //
+  // set options
+  pSplitter->SetRunParallel(BOPTest_Objects::RunParallel());
+  pSplitter->SetNonDestructive(BOPTest_Objects::NonDestructive());
+  pSplitter->SetFuzzyValue(BOPTest_Objects::FuzzyValue());
+  //
+  // measure the time of the operation
+  OSD_Timer aTimer;
+  aTimer.Start();
+  //
+  // perform the operation
+  pSplitter->PerformWithFiller(aPF);
+  //
+  aTimer.Stop();
+  //
+  Standard_Integer iErr = pSplitter->ErrorStatus();
+  if (iErr) {
+    di << " error: " << iErr << "\n";
+    return 0;
+  }
+  //
+  // show time if necessary
+  if (n == 3 && !strcmp(a[2], "-t")) {
+    char buf[20];
+    Sprintf(buf, "  Tps: %7.2lf\n", aTimer.ElapsedTime());
+    di << buf;
+  }
+  //
+  // DRAW history support
+  BOPTest_Objects::SetBuilder(pSplitter);
+  //
+  const TopoDS_Shape& aR = pSplitter->Shape();
+  if (aR.IsNull()) {
+    di << " null shape\n";
+    return 0;
+  }
+  //
+  DBRep::Set(a[1], aR);
+  return 0;
+}
diff --git a/src/BRepAlgoAPI/BRepAlgoAPI_Splitter.cxx b/src/BRepAlgoAPI/BRepAlgoAPI_Splitter.cxx
new file mode 100644 (file)
index 0000000..7c5c0ea
--- /dev/null
@@ -0,0 +1,131 @@
+// Created by: Eugeny MALTCHIKOV
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <BRepAlgoAPI_Splitter.hxx>
+
+#include <BOPAlgo_PaveFiller.hxx>
+#include <BOPAlgo_Splitter.hxx>
+
+//=======================================================================
+// function: Empty constructor
+// purpose: 
+//=======================================================================
+BRepAlgoAPI_Splitter::BRepAlgoAPI_Splitter()
+  : BRepAlgoAPI_BuilderAlgo() {}
+
+//=======================================================================
+// function: Constructor with already filled PaveFiller
+// purpose: 
+//=======================================================================
+BRepAlgoAPI_Splitter::BRepAlgoAPI_Splitter(const BOPAlgo_PaveFiller& thePF)
+  : BRepAlgoAPI_BuilderAlgo(thePF) {}
+
+//=======================================================================
+// function: Destructor
+// purpose: 
+//=======================================================================
+BRepAlgoAPI_Splitter::~BRepAlgoAPI_Splitter()
+{
+}
+
+//=======================================================================
+// function: SetTools
+// purpose: 
+//=======================================================================
+void BRepAlgoAPI_Splitter::SetTools(const TopTools_ListOfShape& theLS)
+{
+  myTools = theLS;
+}
+
+//=======================================================================
+// function: Tools
+// purpose: 
+//=======================================================================
+const TopTools_ListOfShape& BRepAlgoAPI_Splitter::Tools() const
+{
+  return myTools;
+}
+
+//=======================================================================
+// function: Build
+// purpose: 
+//=======================================================================
+void BRepAlgoAPI_Splitter::Build()
+{
+  NotDone();
+  myErrorStatus = 0;
+  //
+  if (myArguments.IsEmpty() ||
+    (myArguments.Extent() + myTools.Extent()) < 2) {
+    myErrorStatus = 1;
+    return;
+  }
+  //
+  Clear();
+  //
+  if (myEntryType) {
+    if (myDSFiller) {
+      delete myDSFiller;
+    }
+    myDSFiller = new BOPAlgo_PaveFiller(myAllocator);
+    //
+    TopTools_ListOfShape aLArgs;
+    TopTools_ListIteratorOfListOfShape aItLA(myArguments);
+    for (; aItLA.More(); aItLA.Next()) {
+      aLArgs.Append(aItLA.Value());
+    }
+    //
+    aItLA.Initialize(myTools);
+    for (; aItLA.More(); aItLA.Next()) {
+      aLArgs.Append(aItLA.Value());
+    }
+    //
+    myDSFiller->SetArguments(aLArgs);
+    //
+    myDSFiller->SetRunParallel(myRunParallel);
+    myDSFiller->SetProgressIndicator(myProgressIndicator);
+    myDSFiller->SetFuzzyValue(myFuzzyValue);
+    myDSFiller->SetNonDestructive(myNonDestructive);
+    myDSFiller->SetGlue(myGlue);
+    //
+    myDSFiller->Perform();
+    Standard_Integer iErr = myDSFiller->ErrorStatus();
+    if (iErr) {
+      myErrorStatus = 2;
+    }
+  }
+  //
+  if (myBuilder) {
+    delete myBuilder;
+  }
+  //
+  {
+    BOPAlgo_Splitter *pSplitter = new BOPAlgo_Splitter(myAllocator);
+    pSplitter->SetArguments(myArguments);
+    pSplitter->SetTools(myTools);
+    myBuilder = pSplitter;
+  }
+  //
+  myBuilder->SetRunParallel(myRunParallel);
+  myBuilder->SetProgressIndicator(myProgressIndicator);
+  //
+  myBuilder->PerformWithFiller(*myDSFiller);
+  Standard_Integer iErr = myBuilder->ErrorStatus();
+  if (iErr) {
+    myErrorStatus = 3;
+  }
+  //
+  Done();
+  myShape = myBuilder->Shape();
+}
diff --git a/src/BRepAlgoAPI/BRepAlgoAPI_Splitter.hxx b/src/BRepAlgoAPI/BRepAlgoAPI_Splitter.hxx
new file mode 100644 (file)
index 0000000..c655761
--- /dev/null
@@ -0,0 +1,70 @@
+// Created by: Eugeny MALTCHIKOV
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _BRepAlgoAPI_Splitter_HeaderFile
+#define _BRepAlgoAPI_Splitter_HeaderFile
+
+#include <Standard.hxx>
+#include <Standard_DefineAlloc.hxx>
+#include <Standard_Handle.hxx>
+
+#include <BRepAlgoAPI_BuilderAlgo.hxx>
+
+//! The class contains API level of the Splitter algorithm.<br>
+//! It provides means to split an arbitrary number of shapes of arbitrary
+//! dimensions by other arbitrary shapes.<br>
+//! The arguments of the operation are divided on two groups - Objects
+//! (shapes that will be split) and Tools (shapes by which the objects will be split).<br>
+//! The result of the operation contains only the split parts of the Objects.<br>
+//! The split parts of the Tools are excluded from the result.<br>
+//! If there are no Tool shapes, the operation will be equivalent to General Fuse.<br>
+//!
+//! The algorithm returns the following Error statuses:<br>
+//! - 0 - in case of success;<br>
+//! - 1 - in case there is no enough arguments for the operation;<br>
+//! - 2 - in case the Intersection of the arguments has failed;<br>
+//! - 3 - in case the Building of the result has failed.
+class BRepAlgoAPI_Splitter : public BRepAlgoAPI_BuilderAlgo
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+
+  //! Empty constructor
+  Standard_EXPORT BRepAlgoAPI_Splitter();
+  Standard_EXPORT virtual ~BRepAlgoAPI_Splitter();
+
+  //! Constructor with already filled PaveFiller
+  Standard_EXPORT BRepAlgoAPI_Splitter(const BOPAlgo_PaveFiller& thePF);
+
+  //! Performs the algorithm.<br>
+  //! Performs the intersection of the objects with tools and build the result of the operation.
+  Standard_EXPORT virtual void Build() Standard_OVERRIDE;
+
+  //! Sets the tools
+  Standard_EXPORT void SetTools (const TopTools_ListOfShape& theLS);
+  
+  //! Gets the tools
+  Standard_EXPORT const TopTools_ListOfShape& Tools() const;
+
+protected:
+
+  //! Tools arguments of the operation
+  TopTools_ListOfShape myTools;
+
+private:
+
+};
+
+#endif // _BRepAlgoAPI_BuilderAlgo_HeaderFile
index 91a8786..9a12d65 100644 (file)
@@ -14,3 +14,5 @@ BRepAlgoAPI_Fuse.cxx
 BRepAlgoAPI_Fuse.hxx
 BRepAlgoAPI_Section.cxx
 BRepAlgoAPI_Section.hxx
+BRepAlgoAPI_Splitter.cxx
+BRepAlgoAPI_Splitter.hxx
\ No newline at end of file
index 3d96496..87d08f1 100644 (file)
@@ -26,3 +26,4 @@
 026 gdml_public
 027 gdml_private
 028 cells_test
+029 splitter
\ No newline at end of file
diff --git a/tests/boolean/splitter/A1 b/tests/boolean/splitter/A1
new file mode 100644 (file)
index 0000000..73bb2ec
--- /dev/null
@@ -0,0 +1,24 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split box by two other boxes
+
+box b1 10 10 10
+box b2 4 -2 -2 2 14 14
+box b3 -2 4 -2 14 2 14
+
+bclearobjects
+bcleartools
+baddobjects b1
+baddtools b2 b3
+bfillds
+bsplit result
+
+checkshape result
+checknbshapes result -solid 9
+checkprops result -v 1000
diff --git a/tests/boolean/splitter/A2 b/tests/boolean/splitter/A2
new file mode 100644 (file)
index 0000000..5ddeb0e
--- /dev/null
@@ -0,0 +1,26 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split box by other solid and face
+
+box b1 10 10 10
+
+box b2 5 0 0 10 10 10
+plane p 0 0 5 0 0 1
+mkface f p -20 20 -20 20
+
+bclearobjects
+bcleartools
+baddobjects b1
+baddtools b2 f
+bfillds
+bsplit result
+
+checkshape result
+checknbshapes result -solid 4
+checkprops result -v 1000
diff --git a/tests/boolean/splitter/A3 b/tests/boolean/splitter/A3
new file mode 100644 (file)
index 0000000..3dccb86
--- /dev/null
@@ -0,0 +1,25 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split face by a sphere
+
+plane p 0 0 0 0 0 1
+mkface f p -20 20 -20 20
+
+psphere s 5
+
+bclearobjects
+bcleartools
+baddobjects f
+baddtools s
+bfillds
+bsplit result
+
+checkshape result
+checknbshapes result -face 2
+checkprops result -s 1600
\ No newline at end of file
diff --git a/tests/boolean/splitter/A4 b/tests/boolean/splitter/A4
new file mode 100644 (file)
index 0000000..7060c0a
--- /dev/null
@@ -0,0 +1,46 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split face by set of edges
+
+cylinder cyl 0 0 0 0 0 1 10
+set height 20
+mkface f cyl 0 2*pi -$height $height
+
+bclearobjects
+bcleartools
+baddobjects f
+
+# create tool edges
+compound edges
+
+set nb_uedges 10
+set pi2 [dval 2*pi]
+set ustep [expr $pi2/$nb_uedges]
+for {set i 0} {$i <= $pi2} {set i [expr $i + $ustep]} {
+  uiso c cyl $i
+  mkedge e c -25 25
+  add e edges
+}
+
+set nb_vedges 10
+set vstep [expr 2*$height/$nb_vedges]
+for {set i -20} {$i <= 20} {set i [expr $i + $vstep]} {
+  viso c cyl $i
+  mkedge e c
+  add e edges
+}
+
+baddctools edges
+
+bfillds
+bsplit result
+
+checkshape result
+checknbshapes result -face 100
+checkprops result -s 2513.27
\ No newline at end of file
diff --git a/tests/boolean/splitter/A5 b/tests/boolean/splitter/A5
new file mode 100644 (file)
index 0000000..4c9c93f
--- /dev/null
@@ -0,0 +1,31 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split shell by faces
+restore [locate_data_file bug24558_Surface_3.brep] sh
+
+restore [locate_data_file bug24558_Surface_1.brep] f1
+restore [locate_data_file bug24558_Surface_2.brep] f2
+restore [locate_data_file bug24558_Surface_4.brep] f3
+
+bclearobjects
+bcleartools
+baddobjects sh
+baddtools f1 f2 f3
+bfillds
+bsplit result
+
+checkshape result
+checknbshapes result -face 58
+checkprops result -s 2997.83
+
+smallview
+don result
+fit
+
+checkview -display result -2d -path ${imagedir}/${test_image}.png
diff --git a/tests/boolean/splitter/A6 b/tests/boolean/splitter/A6
new file mode 100644 (file)
index 0000000..6c57158
--- /dev/null
@@ -0,0 +1,36 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split plate by set of cylinders
+
+box plate 100 100 1
+
+bclearobjects
+bcleartools
+baddobjects plate
+
+pcylinder p 1 11
+
+compound cylinders
+
+for {set i 0} {$i < 101} {incr i 5} {
+  for {set j 0} {$j < 101} {incr j 5} {
+    copy p p1;
+    ttranslate p1 $i $j -5;
+    add p1 cylinders
+  }
+}
+
+baddtools cylinders
+
+bfillds
+bsplit result
+
+checkshape result
+checknbshapes result -solid 442
+checkprops result -v 10000
\ No newline at end of file
diff --git a/tests/boolean/splitter/B1 b/tests/boolean/splitter/B1
new file mode 100644 (file)
index 0000000..dd0dc34
--- /dev/null
@@ -0,0 +1,24 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split box by two other boxes
+
+box b1 10 10 10
+box b2 4 -2 -2 2 14 14
+box b3 -2 4 -2 14 2 14
+
+bclearobjects
+bcleartools
+baddobjects b1
+baddtools b2 b3
+bfillds
+bapisplit result
+
+checkshape result
+checknbshapes result -solid 9
+checkprops result -v 1000
diff --git a/tests/boolean/splitter/B2 b/tests/boolean/splitter/B2
new file mode 100644 (file)
index 0000000..b1ccd9a
--- /dev/null
@@ -0,0 +1,26 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split box by other solid and face
+
+box b1 10 10 10
+
+box b2 5 0 0 10 10 10
+plane p 0 0 5 0 0 1
+mkface f p -20 20 -20 20
+
+bclearobjects
+bcleartools
+baddobjects b1
+baddtools b2 f
+bfillds
+bapisplit result
+
+checkshape result
+checknbshapes result -solid 4
+checkprops result -v 1000
diff --git a/tests/boolean/splitter/B3 b/tests/boolean/splitter/B3
new file mode 100644 (file)
index 0000000..d07ab4c
--- /dev/null
@@ -0,0 +1,25 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split face by a sphere
+
+plane p 0 0 0 0 0 1
+mkface f p -20 20 -20 20
+
+psphere s 5
+
+bclearobjects
+bcleartools
+baddobjects f
+baddtools s
+bfillds
+bapisplit result
+
+checkshape result
+checknbshapes result -face 2
+checkprops result -s 1600
\ No newline at end of file
diff --git a/tests/boolean/splitter/B4 b/tests/boolean/splitter/B4
new file mode 100644 (file)
index 0000000..f6b3e16
--- /dev/null
@@ -0,0 +1,46 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split face by set of edges
+
+cylinder cyl 0 0 0 0 0 1 10
+set height 20
+mkface f cyl 0 2*pi -$height $height
+
+bclearobjects
+bcleartools
+baddobjects f
+
+# create tool edges
+compound edges
+
+set nb_uedges 10
+set pi2 [dval 2*pi]
+set ustep [expr $pi2/$nb_uedges]
+for {set i 0} {$i <= $pi2} {set i [expr $i + $ustep]} {
+  uiso c cyl $i
+  mkedge e c -25 25
+  add e edges
+}
+
+set nb_vedges 10
+set vstep [expr 2*$height/$nb_vedges]
+for {set i -20} {$i <= 20} {set i [expr $i + $vstep]} {
+  viso c cyl $i
+  mkedge e c
+  add e edges
+}
+
+baddctools edges
+
+bfillds
+bapisplit result
+
+checkshape result
+checknbshapes result -face 100
+checkprops result -s 2513.27
\ No newline at end of file
diff --git a/tests/boolean/splitter/B5 b/tests/boolean/splitter/B5
new file mode 100644 (file)
index 0000000..5b2e5ff
--- /dev/null
@@ -0,0 +1,31 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split shell by faces
+restore [locate_data_file bug24558_Surface_3.brep] sh
+
+restore [locate_data_file bug24558_Surface_1.brep] f1
+restore [locate_data_file bug24558_Surface_2.brep] f2
+restore [locate_data_file bug24558_Surface_4.brep] f3
+
+bclearobjects
+bcleartools
+baddobjects sh
+baddtools f1 f2 f3
+bfillds
+bapisplit result
+
+checkshape result
+checknbshapes result -face 58
+checkprops result -s 2997.83
+
+smallview
+don result
+fit
+
+checkview -display result -2d -path ${imagedir}/${test_image}.png
diff --git a/tests/boolean/splitter/B6 b/tests/boolean/splitter/B6
new file mode 100644 (file)
index 0000000..ef98821
--- /dev/null
@@ -0,0 +1,36 @@
+puts "============"
+puts "OCC26874"
+puts "============"
+puts ""
+#######################################################################
+# Implementation of the Partition operator in OCCT
+#######################################################################
+
+# split plate by set of cylinders
+
+box plate 100 100 1
+
+bclearobjects
+bcleartools
+baddobjects plate
+
+pcylinder p 1 11
+
+compound cylinders
+
+for {set i 0} {$i < 101} {incr i 5} {
+  for {set j 0} {$j < 101} {incr j 5} {
+    copy p p1;
+    ttranslate p1 $i $j -5;
+    add p1 cylinders
+  }
+}
+
+baddtools cylinders
+
+bfillds
+bapisplit result
+
+checkshape result
+checknbshapes result -solid 442
+checkprops result -v 10000
\ No newline at end of file