From c58055adebd132fceda08c7c71bc33598dc26a8b Mon Sep 17 00:00:00 2001 From: emv Date: Fri, 3 Mar 2017 15:58:11 +0300 Subject: [PATCH] 0026874: Implementation of the Partition operator in OCCT 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. --- .../boolean_operations/boolean_operations.md | 443 +++++++++++++++++- .../images/bsplit_image001.png | Bin 0 -> 38912 bytes .../images/bsplit_image002.png | Bin 0 -> 37099 bytes .../images/bsplit_image003.png | Bin 0 -> 27559 bytes .../images/bsplit_image004.png | Bin 0 -> 9577 bytes .../images/bsplit_image005.png | Bin 0 -> 19626 bytes .../images/bsplit_image006.png | Bin 0 -> 12548 bytes .../images/operations_image065.png | Bin 0 -> 11876 bytes .../images/operations_image065.svg | 407 ---------------- .../draw_test_harness/draw_test_harness.md | 4 +- src/BOPAlgo/BOPAlgo_Splitter.cxx | 148 ++++++ src/BOPAlgo/BOPAlgo_Splitter.hxx | 84 ++++ src/BOPAlgo/FILES | 4 +- src/BOPTest/BOPTest_APICommands.cxx | 50 +- src/BOPTest/BOPTest_Objects.cxx | 10 + src/BOPTest/BOPTest_Objects.hxx | 20 +- src/BOPTest/BOPTest_PartitionCommands.cxx | 76 ++- src/BRepAlgoAPI/BRepAlgoAPI_Splitter.cxx | 131 ++++++ src/BRepAlgoAPI/BRepAlgoAPI_Splitter.hxx | 70 +++ src/BRepAlgoAPI/FILES | 2 + tests/boolean/grids.list | 1 + tests/boolean/splitter/A1 | 24 + tests/boolean/splitter/A2 | 26 + tests/boolean/splitter/A3 | 25 + tests/boolean/splitter/A4 | 46 ++ tests/boolean/splitter/A5 | 31 ++ tests/boolean/splitter/A6 | 36 ++ tests/boolean/splitter/B1 | 24 + tests/boolean/splitter/B2 | 26 + tests/boolean/splitter/B3 | 25 + tests/boolean/splitter/B4 | 46 ++ tests/boolean/splitter/B5 | 31 ++ tests/boolean/splitter/B6 | 36 ++ 33 files changed, 1391 insertions(+), 435 deletions(-) create mode 100644 dox/user_guides/boolean_operations/images/bsplit_image001.png create mode 100644 dox/user_guides/boolean_operations/images/bsplit_image002.png create mode 100644 dox/user_guides/boolean_operations/images/bsplit_image003.png create mode 100644 dox/user_guides/boolean_operations/images/bsplit_image004.png create mode 100644 dox/user_guides/boolean_operations/images/bsplit_image005.png create mode 100644 dox/user_guides/boolean_operations/images/bsplit_image006.png create mode 100644 dox/user_guides/boolean_operations/images/operations_image065.png delete mode 100644 dox/user_guides/boolean_operations/images/operations_image065.svg create mode 100644 src/BOPAlgo/BOPAlgo_Splitter.cxx create mode 100644 src/BOPAlgo/BOPAlgo_Splitter.hxx create mode 100644 src/BRepAlgoAPI/BRepAlgoAPI_Splitter.cxx create mode 100644 src/BRepAlgoAPI/BRepAlgoAPI_Splitter.hxx create mode 100644 tests/boolean/splitter/A1 create mode 100644 tests/boolean/splitter/A2 create mode 100644 tests/boolean/splitter/A3 create mode 100644 tests/boolean/splitter/A4 create mode 100644 tests/boolean/splitter/A5 create mode 100644 tests/boolean/splitter/A6 create mode 100644 tests/boolean/splitter/B1 create mode 100644 tests/boolean/splitter/B2 create mode 100644 tests/boolean/splitter/B3 create mode 100644 tests/boolean/splitter/B4 create mode 100644 tests/boolean/splitter/B5 create mode 100644 tests/boolean/splitter/B6 diff --git a/dox/user_guides/boolean_operations/boolean_operations.md b/dox/user_guides/boolean_operations/boolean_operations.md index 0b900176ef..0edfe0a945 100644 --- a/dox/user_guides/boolean_operations/boolean_operations.md +++ b/dox/user_guides/boolean_operations/boolean_operations.md @@ -40,6 +40,8 @@ where: **Note** There is an operation *Cut21*, which is an extension for forward Cut operation, i.e Cut21=Cut(G2, G1). +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 *RGF* contains the components of *RB* 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 *G1* consists of shapes *S1* and *S The fact that the *RGF* contains the components of *RPA* 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: * S1, S2 ... Sn -- 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 +~~~~ + + + + + + +
@figure{/user_guides/boolean_operations/images/bsplit_image001.png, "Arguments"}@figure{/user_guides/boolean_operations/images/bsplit_image002.png, "Result"}
+ +@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 +~~~~ + + + + + + +
@figure{/user_guides/boolean_operations/images/bsplit_image003.png, "Arguments"}@figure{/user_guides/boolean_operations/images/bsplit_image004.png, "Result"}
+ +@subsubsection occt_algorithms_8_4_3 Example 3 + +Splitting shell hull by the planes: + + + + + +
@figure{/user_guides/boolean_operations/images/bsplit_image005.png, "Arguments"}@figure{/user_guides/boolean_operations/images/bsplit_image006.png, "Results"}
+ @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 bnondestructive 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 +#include +#include +// +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 index 0000000000000000000000000000000000000000..e903c9fdad974a483bda779f8b0a18ba2dc05f31 GIT binary patch literal 38912 zcmY&=2{@E(`0v;WsZ_FLib5HTElZ-3w1}kAASR3@JCP+55sAps7*Udz5w-}i5O#GN)b60wlHr_4|I2e0d)Q-@Hf(j?)POMLKeA>U)T02FF{Bl5x3 z?DNbSg-XA7{K%oR!S+)RmWFnj`b{k8H14=__o!wH{?6~gfn|x{t9Oom{Bh)P1Q*XZ zf50!f$m!)HKk8du+V~`v;Xm2{kf*wTa?ciR&8&OgGzCr6&b zgJtlkiT^^R3w*jQ`jWc?K5dc4^W8^YxsSR|D}IZu(6SHXjO|usSIULbd+;q!OZ^q% zw`5jq!K>c8SB5Jbz!aeZeimkZaBOmM=evK>m65Pjd7rW})$W9{YsH09+y$=jk2ZQ` zO}9H5wu;{8o2xA;^efEMy2iptN!mnq!s+LxZf^)pFZ+=_*i zRp8FG3Q++a7u+ixoA9ZqC#Zl^IQMGDCI!Bh$6U`)0dmSk)`bJRHsFq+wz!!)KV{u6 z@=~T^_H~~S-fH`1-=2e8MGx|ktx7-MZlV{T;!Z}cJASsX+_AL6osZn~zWifK6aC>9 z{MJnB36HI|VX!=&+{#5bPcIyoOQ}#%xm#(46MSPH{^_~+BGJsvJL35takppS+&?*b zH1Z$j9jWYGZqeloeQ~J}3EaC+Tv^4|bE!z|;O3Qg=(;OciQ)g;KJdcAzQUFDvtXgn zFks5Q&%vSInx*sI;>#;*)>7u57ps59YhS2+p;)t?E=*qxXH?b}eNhrK_6M%CPWLIQ4n-M-VNmnG zJr)XA*{@OU(tlnUno?H`xaNhwJA}^I_oe%Me#72>a6UZD+F_Y$*r(%N!pTGr=d=H8 zUp_ms)Ga*84mMQD9Iv}wectBPfPZGB;9Am`M&?xh%=z#ig(`g)C%m5 zUt%3jhi9({phFI^8uu?05wG;u^(D=GsVdH2+_mrLpC_GR7gf#7hvV^U94@wC2`seqHFBTqBJXoteK?R1v_4h4v3fP4gbt!ilve^1A>J!U6?r{s0nLlbie_`5|BSIX3ADwdY^QQnhE2Q)} z&i$t&&7F7S74OBqX0Kvz1NZdFt=!{Y`P1h=6OW3TDbu9q$>Gk`51O?oD?{f=%J|i1 z0@&;8>#vVYX3Gv#v7307`|u*oeH8AFEoC1+Hj%oxFQ^(i1_UxnGYgm&!%tr?edcZ7 zK~qoq**cfxV8b(S$vv*9f^C%~ho&8;w$tXM$lC~Q26>7!u6Dsw+=OVjVKu`_2Nq3W zp!bdSWk@fQl)Pv+AxjAe{GFUxPyjDR;X3EZZ{E+!wfJW=UyF!vZ;ZF0 z*ulm!Q>$r7WoRTlCseOj`$$>I|IXd6iYt!PyD=_YaD6FwYK!uS<@9M zX}tv1;xe&NL)x5jqGX5DZA`s<%Utp7;~bn(St^5ze1f!Qb4WapAA4P%D$>1D^;JZA z?q(g;Pb9z%`r+0QZkZi4H78u%$v`JTwaYF3YRri_Y+IHiJxRh|>jFs}Gf&Bia6g(M zb$|ByS^;0I;-q0La^2r|REy^Y$?117rokUX^=ob&%|HiHh^Y2^oox3Of1dW^glYk^ z#p_hG>!Loq{DSfq-8;z5*k3IBi+=6gMD0qyr*f0X;6}6C1jVdd__@Gh^5;Y{r zY6(>5>sQt$tG<5>3V@Ccjro0dh+d6S%iK8{dnev}lYQ?=l99n_l552C@M#owf*K7Y z#P*nR^UW#>(R`|fEkw1uQ;3e1sLpNYnkO4OLkS9Wj2NCj`KLOfj~gXkxvc_o-b_+| z>X6!}hYo5+E&+ktxdKuO(KQn^e?BuQLZ@oYvpqB}Gi#Cn-dv8Rg00BSI>*y+10{|u zS&qo|KM@?AS&!}ZT8HRjT;jQAHC2K*qnyO%mT|9BZ& zTPRELhwtoh;SBdBvvMcYe}8#Q;OvT&e5ALTEOlS%p)!9gAGZRGyn%*o`pmc2E5id< z3Uq#t=ri+)&wMqRv1;%4grH#yeX=0!A2nHbU#TiUR`X!MW_v9=k}dvr^H}!Nj?gvD zmrVtJrP}U4o(XKkCJ`A&>$>l<`58It67_m_kdwSBBlErtF zEPO^fV`}y>u5~V}=R;>_H%Ztf-g?Z@<72mFQt;CI$tV5Z--Jaec3=4{Zc4CH7#Sh$ zX&3=);L@b19bXC|~b& zjGly=ACw|{(=A+sKO7_FH^e{jo;AmP;cE9QBc^okTD-$!Hf6=bKj?PI%g@8!^VBwd zrE&G7kiPemY5g;&FV5cxTzQzu8jF?)!5IbDGjkexTG*GcyvR-6V~FBYN}@4Uszc^{ zQf}#d6-`AUrP`N%JThH{cQALL|D5$qS+V{?(f+xxs^_zhcfybGxr?!;X6>rEwR59^ zUR#zWJ&8|YILfhe>d)`s_oaSSnc}v;1|@7S8&4Q4FIg0*es;PTI4OPgS!W0>vG1nO zNZbfoktr~9CzUmJQ{q$#OFYt8HuCw=jE&?kFkd7exku^=!oporHt#=pCCUgdq~XNaHI_xGx!^!)V-)%Ev;K68R-K@!LAW}1$x<47liEe}KYwAN>u+VKPoQigdP)0tBj z#TdSvH-%kSw^B)CO1D++g-B_(Tt~lb;ZkqL8X6#Pm;vBvB!tAV}a4oxg zH|L(J+WB~V2^02&zA*m2The0Lp}rAkG(+U9@00W?CM-1_A~}S2m%U($h3#{QzEeTu zkCtFih=mw5w2ixrjpXlKNRy)W8m;mkyRGTlGI5UNfj`0Vm6gW7RmUW&^nciF>t^hl zR+!!MMJt7ozJ0cEa&HQwe>?lvWS;zGw{LHhlUY4`XrkEWdkk)<1J~KRV*j&kRICX& zyrUK-(B;*mFDG4SSC2Gp{n)+n_djy2Y`u8Gl6l`#Iht5VP~g~TSMisy-m-#)?N(8# zjqx>w*{Js46e2qosjux+nft894RRKTdr+N!_apq^RwZ#3g&LjvkS0h5BwXMGqxY8(4)*sAf(Sm-v5@&73G@QoiM z@sP(_{9jQ`kNRo6h;l;vimC_k>5ARHSX|{(y|+1)Aw_;>G^toZbB0wuKl0=8VR~2V zF4{(WUL0|w^HSt4nwV7UoUIUf#^}$dK7pi?oKK<8W>4c}BlJ3EAFJXLU!R)KX%N}v zzgi!eCD4>LG-X@dRzdB}H4`=SE1pO}0R1`b>4+B6fp%moOd)Ik((RIh*Nb#WWq!#?cjvv@<AQZT8*Nxp}i8sV|LWjG{fcdnuWp3dRyl1Vpm6qf6(p49u3(>;uI06To)^b28 zD1_%O{TzQAB^@JyZ}9uIckC90Bz?(z!R2m9%7@p1@eNjkP(xje|Vf=7P z&V&({>*+35E|y*PZwtMtbw#(9Zn2j+F)p8dG5jBGX2G(3RbA+;=+IfQdiTspao+YY z^QF&|bynF{;lKWwI4hRDl*RrgZyKDu@|iJDV(~~UwkQ>glYL>2-TLM~{3pD&mYE}C z0d@Cyb)eqxptP|IV3nNe`C8YG%&Ty9P#0zF#}U*VXFJl^3H>`GM-}w)fR7 z;cL#Dbxz`MJMHi7nvTDCPkRgQAxdHJPR?;1*@OXWz9YI-P6ID`D+UHNu28Q2s^96t zX|XZ-QLc|HEVTYui4e*Pg4VmjRA-EK)A-1#F%rM|j;_ZSU!hwxiheghHgtUG^Z9Js1H?_?r}{ z&NP+Xn~(?>8x1i_VJw(J6@{#a^&02vDl!bS6g}l58}Je{lhrKK>R&f|!xrCJfLX9h zJk+)cf7$Is_~>G>;nwOsSh&n7{5q}7zpylQ=>A|9Q^O_>zvxHRO&15U!i7`hrvTGNs`$p{MmhJ3Sna#p#Qdul<)zJNI z--Xo|0qhFAQ|%vmV@`N9EsM?HN&8?QBx~hdJ)G4&?RMR}88;Zcob5MtyNF;sq3=48 z-!HZW;COe)SWo;WoDsRXms0bv8Au;0^=JlaJT;x(ofQkfHHcf>kRLlLyE))*s}K&f z;7*mvW{&;jX@9R|)#da8UZJ^)(oxQAs1w$T?|9c;I_SaqQJBp>)bP9zoy-u+a}Gg` zJ2C9h2}v~{(yR+MXWoY6JE6c1|QmEh!8pG_Oj;WXNg)T&@d{{(-}+d<7b zLK4>UQ}s1}#mV!s8k`WheBQH2TEEYIZTad8r_e%{6~X}TGVFtsTl}LXxX2h-DLI;Y z+sX=|-XVPS_S)N#lO0aQN9ke?&))JGYTRb>D%f##{tqI#fGcJSr#qE)JLCD?-dno3 zp^-r#k8NcsrFIGF<(+!ajeYj=_-^})e7wg$FwL>6{~6!|;1 zSxg=`wDfdK1#h?0+)4qLBMvWHwB}XiJ2tg+=iFrleDm0MEUELyw(5T z9U1~NGEbJ!rvAg4OTk!kCs3?hjF{IjH*`0iR2k~7=2K#~FL|EM3D5WJ8F2ze!@Vb3 z;!+X1ldUecWh<_8)MOVZ4sl**a7O9~*X9Kw1Gdzp_Vv@@cOEUVn3sLWo%NpNpfnGc z31CgTe+fZ*F+0%qZeet*@BdVZ)gwSqGOXmWWT*RD%-A8Dh~r;UVC_GD=Ov#Ob}|6ueoA3nDTVF%>Mm@} zzkf#g5tt=cI42G zLeu`BmZX|28 z@nU(jB+1`HWm9t`4?Z%@(AH8&XGq~c@C?5^fY2K0h<^;y#<(?}$vSvKB(e^J*} z1q9bQN$V%sGbb>LOvNgCQj5Q*(Jp3lr&B0JCf5u#|3+u+606qsvak7mX1;RGvzU*9 zXO6o`QQfyWX8Up;P6VMvtqB!JGji&_T@#rkBW(*RbEGfVjNc`~#hg?Xk%4F|$L=&m zU3hiCpUzs^?D=Q+X4@0S&7-mF3Mz;j?48SqyK0V6h%bTn#Krm<{HgRRu&AxI-!WA- zGmz+zZQ%Q6a(-s8m^~C#Sx^@|8`PJ+{?qAj#!Jz@kz`va4KrjGEsQM3_KCGvx*llr zT?FMAHkCZdEgDLQ!{2l^^or|)U?cda~2c#>X%Z85a z^A6s4^$H>{mB^Onu-VB&)+4%?mnSp7j~Iq7E79tAQVdY@`}xU6H5D;=51N1NrbWpB zg71Dek;*MTeaO;o@OZr|f=OxI0WvsMFFAQL-AZx1xr{xp7__|2xWxR~vC`|oE9j~y z*XIlQp2}7yN}p<6x!>qenGD#lhxW$kh|}%y%zS;Gu}xi8lX~ zugzYCb*8JFF`e^95!o;Iw9Ub zH`X|*s^z%< z>9pxQ3U)^`Dlis2Ry6-#`CMlH$~36ki=!s;I74oQqZt=yvL1(i|BnAzZ%sX4S?(z8 z^#ddDt3F46atqLII{Q%Uz1VdYujyi|vMH>2ZCBZzREE(3f)z`1F--9B%yoN~*mtFZ zlccfzW$V>8El|k;pVl*&oFih4V5(=!oUe$#0f63r+b$t3F1(uhD+S012_uH^8~6(A z(P{H&2~KSa$X$h1Ic4}F5F=UvI=;M!Gpep2UV%%ijhcj)5rbu|Zc5;AtMXEW)eA>6 zcxl<$ub;CO{bf!%;JyfxeFey6+X#bGmPzl!UKC=mt))eL%AGode0+(s{qR%;!PFotg zfwAo!1Db%04pU(H!C4YBq`d@-^}r=Qy8D<^XC=?vKoZ|r=0wg;y8zmC|` zyrY>X2^8C3^0eJGEzrV8^lJpW3nL|+_1>Ow26=eSS?|0gXA_q=)XlY&qZ!u&YLkB` zyA@cvl=5j_NeS3j)z3Z@yitETP=T4xIXxO$lx>JJS~MG1S8w}=LUataG$%>p-&-mm zIwWd-;_8Ye%i_DPVI)tR1b}LU@`RmkuZChc%Rd=oE!=KMu}iE<$5_vUKEFra>{tCs zQa*(U;O=4bX58u#)VOQ$XVAL`RwVTW>1@57g~-@jIejUG@uSAC!~cdttb`ur8W4#^ z^Zm#ulE*uy3E}@FGei&*LgIVmhFv(1vIN_+Fk)1*n-X!DHM_fvff?75p@Ptr`v;g#7cbc^ZHiY($O#yzAnsyL ztaIkb*ctc4NQho!#x}m8l^IfBDyj)6VJHkaFvuW%Il68r5EQ(}1ozrqqK9$SOpq-Q&q?nbWUvOJn5{ zs@t6mk3%P0k0-JxrS6LxC;U-=r=VIgFejxS3v6F(3jpIEzV0}~RagquqZt7n-nl?Thn9zV804aBa?hw{%a!x;&xohV}U!2TU6G0kXf zh_?f6*xk80L4&K^A$&2Zz#;s5($atxVE5$YFlyFK%-`7yq$-mY#cnI$8^2qaEp>k? zq`es4x3C*1^RTNdNlvnwEpuIVwzN45b?ic+Y_%h|TVnNR^3yH0F2?x>gFlo8Kf|`p zX%dREXHSn7R}isD8Me%PAG%m&59Qj*?BhI`MirQT>WcPCr&N|G{$oMHfHSW^|G&L( z{?P#A?=Tj^dbrU8)7YWZXqr;MF}j6^Z0c~EKfeM1WF@05_GxYG4-}apnt=k({EGtx zrb6WFfgy-)v~PMtZ^kZUdSnUU9<~As4y1R5%K@hVonOK}+Uu_@mxWnl0X;&i!_cS~ zN~}cLofZ%^dxct;{Z^a$_`kh?s1Rc0I}Wr)b*c(BfHKSt{aAv$?*5(G$Jn+bOBZ%) zNg$%3Ld_4qWPpXOu)W99`?_UBG|HRF`&LO!q@HJ*$LV4vtTBVL15n$U01V}TMrX_8 z#{nvYqha@)peHHQw&N!)0od9_EUC@DStZkwU_;_50=}bRzG7rwP_&Sz)3&nZjV!uirk$ zMkf5xiG#is|NcRwey`uo8l?()Qus4$rDO_A^GXr=mq4!BcKcrVdGjzYA7U0F_LOk9 zZ`Nx1eeo4P&=KIJfY17+2z&7jmJ(cf3D~7q+}NG8-`6cjN#p8o8spDUhF5J8DIe#_ zr*Phl@#XNa!9!k{bmDDaRvkVAN*6ezgZ)1zkZcVQ$JF4q`3fCu@CCw{OLqRnl_f;?4Bcp{}z5wyu_eQiz=g7 z^K3Uwh&1O>9W9Y#0B=DN5e+YpVnfVY<^+Vu3l8OBfip`ykB%>A_QL2W^)r36olQ25etV&SlR;5=Sh9;JYVVg?DUJ1NU1Nj?KZ^w~UPtf?i zq)Rc-PWl7|##k?;b{U?%I2dRlBYd_m-gGgAP7RJ|dFqGlsqBt1_a&Fnlbktrx#Q|k zZv#PKbm$<~AIi#=gRe)8zrq~h+RBZ}S8n9;v_G8}V}KC%D6-wVHtSswv9 zM9v2L?*z_|3L-F}fjUj5BC4kiL?T6+SMbI^2Y?NiV5;WHerc`L6({~YT?egy4*ZpS zg^jPFy+`{0LQL09I8_)acF?jP9w8-_(Z$-*W*jf6&OEs6_xTZb2y>J9=L z7Aul44V#=5t)VB87+EZ1>aY3Jmwt_8BH+@PZsCKQM$L~Hv5gAWc9_0-djM&b4W-v- z!rz3`p2`T2MR5(rX1ARPd?zMAuCz}hpO}$Rb9OAu$|G(aC+)%m^q07Pq z-6cV_!*ntI^X+V*Q4vKsl+{0JakeLcoAU^kPec(TT`mQE^YViPc_fS~vuwD_^ zzT=w_$8$==oCl=l!6i9`^fg4m2CwcXmv|z_27eis*kv_OUM!5sL)&XXUFp;uYxPf? zh?UswtjCo~`1fPJ5d`P2l5c(o6+iuwP0g!sb`-v(`#Xy@|Kg5c5xT{{kToBf?sf6= zA!=G7dcB$k5IvmHY!E$(8#;|z%`xYt1)(fhOX&ji!&h;@ylzV56lOuiNmGVVfV!s- z%^S^l-LPsbrCBQ2OGlJXqkuq_8i|@k0_D$djCW3p>k2>+9e~SEA?-03G?$gLUfX2q zzm6ao#{GKy7e9y?EL*4nV{mFbjxJ)A@wjpx1$>_SRuo$DS7u;#ga3k=;QMI)_IzNl;LZUBsOCIkWzrlTet=juNrw@0iSd!n8M3Lp2BSSyKi&v_mp)Eu;xYzcN;Gcv%M zJJ`pISXMj%GxlIgcDZm4lH_Y{O{hm<>KSPl3#845p8_276j5A$WHeOw8sDF9ojy~M z*ci_)W<@#BmJQEt`|Cj(CFJghcEy=X*#6?Wf)8yDIJ$A_K|L^OBlje79@ieY(4dW} zaN57RpU=!+)a>A76l$KW*%)j)(;T~>H zu2Z^|Z>uA&9@b32T3Rn^HN=!-ABEN0fK}DP zm}!~Iyoag(_3WMi2#f)7qKY~$oaoqf*(I`j3xWJJ$B&vQ2EpopC+K1gNV61KCL2mk zfNa?VRx0%EPembSyJ?bH;YTz0gEz(;h!mt6xZ1oV6KH~w^Z%Vm#Bg9Pp?^GOu zevL3MVbaj7oTtun3>vTk;Y~eB0Jn;sn7Y832-*KMQpoyI{El*J`#~#U zgoH=-x(VmF02d!NRx2C)+?-I{e2J6I6h z9sQn-+dVkGbPGYX21NCJg5GPFqyZDYa!MKCW{(}@LojoQk9MGeSND3@s=1e&REx*5vv%c2LGqL{57W;S2;*W&z=HW$XlxB69Z#RVtZ+|KIcJ!P8;NkR5OIMVCvX26;oMJQ~skS`zOg5^Q|f-Fvs(n>P0-?)BqNZVO?vWQMNn zD`naiEa1a%!e7*4IeuZ(Hr4H4`E#kdXan?>9w1{qbrR+q$iLLALgR^pr z7eG(=b(aB&uInnG$r0AKvVU%|KSGhohV;x`#snX(Zm^QAt+a1TW1MF(D;H^{AMS!h zak-2*8Pe|ZABY7?6|Uo4E!=*Eo+JPwyCuK9{59?bUh~CaX@U*xu}!cNv~G z9wznine{q6iW_VAo%6+4nfCjBDw4~&dQ;+4h?z9x2NE@wV?Zu?2pW!SM`3mchNfn4 zEwCZpK)Ks)Q)65jqO<~>9f)0b{TMRmoBtS7h;={Ooq}#kTpFoH(gk1EshvpBu%bFE z;z##OIRdChnaAW`a~bw7xtPw^&w49JX6~ULsTBn`|NOAh>8pMq_02rND4qt10{R}d z;Yi3sO#eI?3{dB4gW6k&u&dfzy5hBVE(2yXphD4c0!DPK&?1n zl8>dioo>SAaajU2{b`Jh*~baMJ^r+^4`uwEl~bWL8ss6u&@nnY4rjEp=2)Vay(jVV z8Ba{35TL><7+~vN6=7mqWH~m|?M_E=57(Ry!;A0KtKwMQFev zeqYyu`7!nrP2>3rP5jd4vJ_(CdXP6RK*L%7rq6^?2T&!_wT!rF)Wn9w)W0?4K(kEz z3*=w^b2LMw{RlnjCS-qZW11_2@8HX+THTukbhURCF)3#dg(GpNB6vK0#v9$f9gV77 zZgStRHF!WfX%8r2pqSJmJ@uKzNFn-RvzaqzM~&b}RPL8sn(rebMl$6yO9nSfJL`tD zu=Pg!GGFu@Bb{_TN#G0@|DCwO+wZe_Oi8)kzA$zv=Z#4o{Sl3ZavQ=>;)zpdzQXA3 z76}{=6}!ur6*TiN-#)m(YiZt!8JO1n{^Rtl;i!p0n+Ww+8++++gaXZ9J1L`$ojfb2 z2BSSS^sxmkt*7SGO5d{!YK?LG{~@q!j6QzoehaabP4>|awC%Wu0A|+$DAyo|cdZEh zTup|01ZO3r_Sjmq{VY8xNLcUShUFUzTnYx>9#nVQi8~r))Mx<^%7 zKRRYFr(zW=w$~Hg&t$_3?k zdT$}ZBj37?IdfVdz>y*5=+ow(CZyEj_a}wHWjNO9r1AaT7VM|SWhF&oEYfD$HuwhJ z(Fp5s`q+^RNLm;~2*FdA1Im|;YQn5U&HS?@-nD}!dJYwcx)*`|{YdKJbACsqOf;AyLuPwgtAuSn}PHsgR`%?Y>f87Cf$gK#_rw%JK%EdnR9dS*6q?oY*%1@^b-cP=0PRO0=H_E8oAL z5(O18ZoY;3Wd8Pi{CvXvouAuK;+(HSuj3v&e7&UdL-B{&51s1))F6Y}sMUXdR{794 z!W@yn_g6Ns(d?aUdG_wSJ9i(%R6M_16tfyOo_Y0|Iq|cCy^RfJaQxHwo1mu0Lb}*P z>v7Wrcq^X}fkCSi)YC+rBt0fjhGJ2*lzrVGu$jH$+HU-TyC*VFx2p&ywa`~f2F+m%EB@9 zzS60hp_TrZ+oa7mAI5ID{r2Aw#%MXF3R-bFBzb{I*Lh5+S72sBpZR*Eed2mv30=HEpnasseC?%v4_!!R|F z)9~X8j8G6zX2X-gyM|DtZc;0vM6T1?CdZ`|8Xad{E?l#qWW}{!_R;_(w%&;K@|9F# zM9p+3W1nijRJ8=VZ6nzi17e4(y$=?kulHuv#Kr z@aV^*IDEsFUvh#fSj}!2fTrPJ&yWPng0vfCcF~Nb)wSfYZxBhY3vPB1ZdL-XK+t1} zTaa=cMq@CPl~Elp_&=iI9`f|N{Q9V< z;xSj~%$D*@Q_y7Q0Z&bZKx%v)_UB_alxBiPAOLfw3c$U5AZTs$+;#++M~X*jM$lgK zU5p-$rbeHXd?syw(Je+_=aD;D;pM;ua{*m_cn|bYLkOJAq1neXvQ?$KfhKBE?8eoL zFwJMh@~(9^pLR9lJFxiPEBLZtxaGLIQ}9L>j>Pc!l$=i<*JCQW^4$;c)YZ#EX8UMP zLvA7Zb$liu2`T_)KiM)@piljj;TVZKyJRz_g#;)@?nA7oYupyk`61WQqSPe#ncQSZ0wJY|XLIuqi2$?|}yA4R<~8 z-?kNE)`0GVr}ik$3q-F!aotaX3UVYPj>|?K|FWCrmn)7-oL`!9s`R1x>#xb<>_<-L zV)BWaDU95Z_C=4SI93S~6kVubB2nk8#`ql|ynev>d`ZsF*g+F}I0gckiv6AbTdgKZ z4qI(KfG`0j{}DYFBf$djM2u;7f>FUkAuh_vcX3$(29UnoZL;l8blw;GYn854#+ebj z;1526SxC%60ec4|XfRyi+BT%?^UtO-!MFO^;*SWoyG}gnyvsQD=7uvUXD3 z1J*v&{Z23YEVBLHtU88kFa@F_{$BbU{n~L+MPA&-U=~DJufB#%+D;SFn9sxJvq&N> z%M2K*f^s-cpF@z|Loq`joY})7BPIM5E$e&D1kH-KLlo2UWabkIjfr_bk$jJ z@P%I66-YF=Xx1E~f$%9fVeP!spEzvDJuk!!d>_&te*>65($Pc)+nFwwm)XhgX<}Cl z55i3ei7Jk5U-tPb@jc@+0zIg%o z>eRZK8+o7Y->4RdLUnQ}Ois1<_e#U~`{S0N0nMT@-dB|ua%(^t>O$Y~gBOs-fD;qz z)!=amsiip3W)|mJMTO{h5@Q0V^rlTJn~FIplIHw}v9nTTL^CAqc5G)Wd+A+fcI&7~ zQY|Z^PjRG9VHDV(EZ~Y}&h1+UYFu#&{WAqF&HHABG$%SxPmx zyxE{oPlDU!`8x@JTtx9O(9Ell{++fiDVYxMU{9|0`&b=VjPZJr1oCAEI|L;CzW&64 zhZB`wNAyF(WbX)K58x6%h|pkf#`%XrPj&kPiN$_Fv}+o0^SUH!;c7u+KC_@uu_=+H z5h3q|ovMVmtN*c;U{oF$R;yc0hx#BNWH5Z!pE8^Yp+^JAk!89$$)>X7Q9U$3=#L>d z({lulHH52uehvRQ^@Wwvw1Vsj^xI9_%o`%rUVwBY(73j{<_8B(@QrmxU&YdvXCb_-wu!6VIv8(Oq9^@$-0VQ9Ug5uZRZ4OdHN1?W%Fhsvy2Z^E-+mx#aTN&*>@!9%((e?ZeWK6u? zy>Sk?_Uz?7AjNX+;me4n2&wqELiF?OPPU%!+L9g9)z0>zJno?Jn0$@krEQ4lEphK~ zF#nf{LUhXh7KEokG##kYiVDuiVi&BxRjkBM2joQK_rE!orZ+F=auROy{>y&AS$FYB zlf*yaVsMKW?@-+Et}X^;B{QXVeTecpBF^b$cLD@8j@14?BV-&z_~wr1I{_Z!(R2`9 z8sdY~j!#_QMPo|8h?Y1I@-^rLsj4v^#F1!;>&n~C&G9uA0lp_Ks&U$`azKcPNlV=5u zxpzCf{I2IVI5ny(5M05i?%s@l{Ka@&od@E{p72haJ{aIsM@{?-2W_F-Njfj-;*1t* zgTf1BfZBU-WGbnU%CxPMx7lFaIF@_?3j4haUCa+RYN}NwDtV#YlL_5I)|N zftd*<+O{&GDR}q0h}oQzCAQmF=jx0T3Br9QW9eJI;1?} zcrih5uorCMpLaoUAYt+YCIA(+*FkXN&-S4T=juQqwU0%B_lcd^Bv$AUqje5qKy8?GDw2Aqg3+@h}i@Xvv-y*>&f5k0Zs94+tJEp z_GDci0Py&J!EBVgsM1w98YOYbEn?5iyos4?y(zSmV%poKAEIV_9jgCD@4(YtTm61& zBU#r7lCisKfYHvH?q!+|HnWv#S_)a>;1J*GQ+F8`9Pd{-9JcMuz3*fkRX<@t zj8$w=x0Ed-J{tqKzfKd}jag)^FCwcB!Xoe1`ydA>vRlTwF*_g zGp2XR6|ppn;h6c$oVNfv$gn`oh&coikmr#wjZmOhNL~8+`0YYD2F}2RP_7L_mIHbc zH>INC3mp(uFiiegqu@Y_|TD& zQ`)uIV*{R*5)$@hAa;h~{pNN8rv0XuswQ9B`D8>o?Ku<0h*U&E9%ZM0AiSXlOy^jGN4rvD)bk80dATJR!I0vlIdkpj< zL?n%6A41CSQ(^Y})e!baXU=yJ&2Nf`hEJ}sACQqscr@l0yfN?y1V~#z>8%mm9t;Z3 zVja>D?2#B(7{v|==sV+I%*v%H&x37`ySxCuRiYU^^_p8!rw$ZcPbQ_Y3$ZMly} z^Pu=zQm(e{TfqYDx!ZSy@C_=naw5&Vc|pC$(;0^~dnG5_wu0>Y9l~G`Wyt`8H&M&l zf}|61JUjvtXMYbP55x2XnYDV9z}fN9=|ewTvVWbHb;C2w5D(5Q!V|&IjDY+A!d)u8 z+U7Q5)$hMG(Fffh-;GdGf-p7!XLLb+rD|fP7qxBpuxi6gMeJx0`r8@)Nq&nv8uCAQ zuztlzT6Jkaz?rl7FI$ivHGy>ScJ6#-nkIHcT^lpiGY)bx5`hZwHzpD?f*hsUus$Z3GEB6{d3XJ{Uk;9sbv=4^=SL1@Pb}q!Q zV6En#67)Jx+Pm1ZVNH~ zI|u<*MruHgmJ^XSaqQDh?o%qXCCA5I zs(THRUzRcuAprzlK}=M@5yx+oKp!fqmAB_I z&XwID8@n54G;s)7m}EwEA^KMoK`(H2Cqf1Q@hl@q2syKfe^H1QHG_Dl*(<70_Fpkn zh<8o+>o1;Dp$}Ba8*WGEbKx9L28}R(nAR3C|S=<)fx< zC$ze$3L+eHignPT5Lf+8&6f{MpUZqvcGW(U8eP-^}ayM^O8MrISo$QT>^}&TL z%~rr>!aXhNaYLnn{7>_j2A?G!!X1FuB(BI1Tp}cMK0z3dTl1h5&pJ3fq4n7mKzgb;GG z2&E>OWgIRZ-U~v@sL5|~|Ffdc^4ZBbhj!BZbdENkAb_~Bae5j;7^aZj8LBKY`oKDSmGlNf{zxgayO2T}wo(6?-0YgS-PCEfq)^E%Y_PN$Cr{CNVWB7{e_ z+`_fEZ@cX3JK1$_DE!t*$#1IIR$Bz9M)&-lD}_hpSH7|HA}=J8A)IXNA1Qe>!#>z@ zE~nuTsk!OHKL!e)@qCZ~oYjgMve~RX}(qc>7H>QR>#!j;T zq)a(A!&-y1Ec7R-&Luo>gh|%~0SSB$L%nizyD1z8-qBGqP{dI~ddYNw9M&p8Mt+WqU8) zQhr}kV_00_>9PDH-_y-(s@V#uBXry(0hO?W$in+9IK;ti$?2kgS>*~j2xn^@D3mWfG>X-@bA z29e8ok^uG}5`$Y-H|gvB2ns4nczE&KuB6kyP(ecHc()_YCOh_j`&=^g4yJn) zJW^DdgFNK7Z`7zKwdR`L7~2C`DqqPx679%Be&fVn zFH`GLjU|*}X-OURovWWMkGU-!Tq6`v!Kw4c5Qy=UWhsddHM{|SQMQ}*b0vwWQsVRM zha!1lx|98UIoqBY3l=bi_{7@-5#av4zu~ywy^{qCxMqsX_Foj9Ih>I^?qL`E?JDwP z0)}JPF`GV6C^fG1t|!!JVUf~$bGN23urtsSy)fj?!L0B?RcgU1bVdGM_@ zAm))h`&bb250HYIoTc?#{TfIF1sZKi@;DemjrJILt1U8m?L&&r!RPhHB|+#K^u$~A zw323T2J^G)U)6AMYhuv*kaC2LgViTf5|lNchADy6iYsRz9BONLrQe@!(Rsq-|Md0d z(NwPC-}p9%q>h6~R0?H|3>h1pO5|wTNHPm0GRAHzQ7IG&8Im#-$(E@kkqp~Z$&fN6 z6e&XzlHcdvo$vd7-+z8*opsh(t=Ri{p8L7)>-tQWv5m7XbvP^^n_1P~?t~LPs=i1(FT9E|d0?Wnp1n}jV(SLO^8rvFZL68i4I+0!z*)F(b+$mr~lNY4x)$+6~ zo){)@r=J_JAvK`-0!vB#E!wKj&v&(TT3+|0G-}{D&ajIs#Bp-9O}ZX29`J{}C8%DT z=JVSM-)d(3e~ondH~}tPVy#{`lLeVjc1pO9<$>kmujt_$avs*ig@(F9KnXCdBZ|6m zA}%XiN|D?Z5cQ(xlB>7I7yFft-YWZ3(-A1>GX-8z!_7^0LtL+{K>i*jkI%AZO=^|_ zf5iH+qf;xp)`gc}aPp40sm(6a_BawEUsT>%_Wl5?8|*&llG_G~69T=VWzy8H#+m8A zHxb#;%-zPBO^3_;ro7)QSyL+Ka%bNQ6?Jil&07VPpWP$cz4KqYK6#+ed3;J9DKTu2 zJzVn4VPUpPEOLjLDDMyWne9SR9WkIf zA{T8Gx3YAB_eZnqXZW_rTw0&^La;JJS*4fHQ#>Rn_`-n>N$;qq?o@ZGwQ|nN^5?1t zol)J-5&D4``dB9j7<61QLm^|L`zmVvw}kj5V&vADmsA5+mz!9w`Cp~c7A{F_p)WSqi`%w6!i}zGI?M&?$}&HHs6mG=NtS#U5)KaXFvls} z9D6JY}dv`mgdmX@#(MSozc>HgT)=b$X|`0zqN zc_^me9F?1g4CzNXmRd@770oWbKK|THFqGmCczP?xZFs-5*&X#u|JfeTZY;+JaxRgH znzPAnbKX|!u>sZ8lNPRXQLEOu&KW!2xfZZg^Dl3?`sq*EQr}W5AUx_^oljdDS7}c? zAWxt%`YM;tANMhc&ikonpS?d{+y}rop|81Rtlsc?pEGLKVMwIzWrw_4&*aa4|^4Vn|H7)_6WT7zV!7#mrP+8-FLY7t5D%hA-1Kk-qm(g1>3P$tM z1+=fU$$*FfkG7d-Th8r>&3#iqdr|P}U$HHHSi!(}?6o)AV-xONb!^d?*I(8MC{m)6 z*AAotzX{W`B`;T@`dqTO!+Mo!yg}a_AhL^!Hgn>SW4oj%_-#1Ixy|7YUCcpyImh<+ zOf}ujLej>?5aejsI&ZfbAVwP$@LrNanudu7aAbI)%3F?(v~^~>M!roJmbRRfzpT~U zce*+(ynMF)JhP%w3(imGI4OAAmqI~hwK_VsfAWw2^`x14Fg0?07$Co7QUxFI%#kV^ zt=UliT=64k=y-FFetAgeT)8_{Nu8kc+hcb<5rh7+IJg}&cKX$RXFCd{X)Qkpl$2E& zj_OZWV|#py=5|J@U5*sH3^_bta0#={>uQ+UBxC8HIqJ9HLg9$>(%L7x9RLPR=*oCE z??tOFb#>BiP}Q8AifP6znyd}k3s2)Kn^3NJ+>g`>ibz?;O2?IL^pz#L>RM&T^$cHs z<+;xc9<)bSTnzHV5__xP!3$iDG5x)vEin*{9Es6x+;R@}kFHG1`9_kg@UJ38CixJ3 z=7WrYH=*|Q#`pAg9xf|DVe2IG+)hcOW@or|==Nu?52y9k*GgHWx`B@;XQA}=$LkYKx z(%zPmHE{gTI?UZ3P~}QkqR+Nne2+zJ-($b!e_4M#<8_g>S@Wsj-Itee52@~R7*wq# zcYgb~D+@AS2R0GdTRiTzH8>*Y-upwSw zz6ZvQoRr7b1!a%m6L{jI*WHW1{+Z>8u$H*|%hCw-dC*kx<iKhZup* z1Uuo5fzhHc@1|>cv!PJeQt!J{Beb4EUC{(~nd^J59E_* z6kq)@TZ$dvCnCSTSwLTOJ2I;s&$@A`_*SCGUzskDB=|3n*H&wo0hO7avZV|3)rWaZ zzrYP2o;Jqrf*Wb@Vxs}l3b2vS56F4(F?7pi*Dw{!dnn5ag==^z=H)H-jglBod@NfJ zGIS-5b2=KeMkX5hg~-rr)9Ql({+&?5jf!&ck0jEJmb#hL8@j*`b{`(HX3%7cUIo-O zFHOr%S&j&&`7IzVgP&x+5&WPp&h2Tk(?G8u7v;)IzN@#x3tRQ_ckg@7R}^Eb z8ZBJM?ebPL4^IL#TlCQ7y7h3TulS8I^r~K8_C8(FGEL)*hZhncAcVlU0EM95YZEHMB zzctvA?Y+Ksob+Ay58DPwjqhO40wUKdetFIn^D(gZYIW0>sfzBLpm?6sC;u-g;cNE% zP{*GIx)k#P)x7U{*ZRA3Wg62Ya=iuP!0|H@%RqLnV&)|QkDY@s;{1%^rLmW}?FW~C zzq-CIF*av<|5lE~8QG_m%bBo$MtcK=1Rnbc210#1=Gj}_Qt;vACY0VbTu<8$P*frXo-;s z|Bn#5Y>iF(wZjT6N*Ld+)+XUoIiT{l)L9sq7i{Rh>P+|Yp>1^fC()7Iq8a-+!;LOf z>n6JyV8ell*(s#j`hxb!4us&x1I)^`t5kYLh|zqHB>u-!V5vB0R)ybpN_kYO=D1#M zhqT9(N|wpbCC9#uuF|X93vOkYXE0|ab4Ldb`(-3V;6bZt?M!@G&ga(W&-#vVflBbX zh-S@Avqsl(d#oTd5#3AvqbwXx6F3DYs!Gp6Y;AqbOI6@pcvB8MfQ1Gvxg=(D)Tm^< z2pk)Kf02lhbQ9pB=*Xn)9dgQRm@h-uQX_mK!G$fD6_*``FH)oQ{9b-~t*G3a1NJD> zuD*S?+loQE8EQ*H45t)Wn6(XWT|%VBp3<12z^zhm{VQ-bSU z&#C<^v&Wu&WR?GxN+hM*)`YhxE^&)`%$WCjzn&8%#qI9NGPlTpn(jhff!$g|=Qmtf8kd=`S!YZ!hvINxG+S!5#6fDr zbIt>}*PS73&NI=Pm78RUMuTn={8d+V=2t@{@`%fMoZ}MH>N&DLd06eI|y6s zwGT;j<@OiHJ-Cbl(&qki3j-}0zcE7o79aVWqyY5DbkUE9s$A=w8?7?A&m1R5H+K+w z+``>#WNW4%qo%LanHq5^2LioBePKGHSw7Z{FSXt~ZxP}3hUJPv51e1Hp^c$sa|6}1 z7jLa+Eg?p0R-DvNu3qimLX0dBXw>6K(@{jDj8vFIHrS^r9Kq>4P^LSFEieucz96r{ z9=9Uc|M#9}yWX8q+WbIS<&BfiVL*nXL=3MU_aC**bOdL_H|I936BJI)%E^lDKYOP!q}sNh)giq)Axm;jP<6S( z9}`97+_2rfYW_|aOQKh$>K7R}aYFich%?oD+W2um_g5aJ{&F(|*y`EH;i*Fr%JmFf zi@YWcWO`!pI4*_gDwPuvas#Sk9>Q#n|Hej613HlhI)VhMolp!vw4bYg*SdfBU#HCr zxGTbcrdF&Z5h8+xwGMFe6Cw#oq{W%&NPa9CRIQXl$_gb8i;w_nI`k}J81rPiSmT)( zs0IGzHM=>-!gy`Jf+$#lE)wr@^d`gm!L^eb(#BgkYsMUd(QL!o|F%%CZXpnK!bgKF zv`6+qMp-bzF!%IYp&~W|QDg*4Z_nWu?|v=W7MpuMCthTL)f& zvl7J2tSDQ`5e&Yit|P(OLI0njJ+d3gHS{I)NAWRcF7M9D#G&qhH>Y(i^NUi2s?(vv!@WBB%Doo zA3u549reH81gMYd%x%zbCOj*Xt(_S|U0wff%ej}Cs>|+ulPJ2var27yzgVcY&$q$Q1|Epj;}K^gffDY80xDH~nO;QE zd(#xKF%qd^Cs8Y=AXHkCjvs|2dy5~Y8W6Q^6R6s{+6VxnN9Cb$T zHk`2E4U7e$#Wt2soqKuuP8V6{1$SJ%C7Ri0k7wr7AY^%2@?c#GVc5|X#6Y9r3UfMA zPzO^h{4y1jx$%(gLoP5V$hb}xP(H&$>T0V^i$>}w56g`=sg(+P49%S%X1py=G>+B0 zDMqhlB)**(%s6&Y+SpCHOO|luBxw$Hn$6`|6r^B;6DPfhpF>LFPQ;pFCw;fi7Lq*3 zjX5}MBw{qdLL)cIhl!dEj-Wo9@4H1|>72gP6q`sI&3%+vexgcl@P{!NsDGf-+;(8} z)v=X4lw0n-LBYI(?gCow)c^2pqu4MF7sA|_L)ergCC|(g9ARbgSa+-U<@UEgetj)l zsy?`gaA!C$zMI+4{d1^!03PJ?2CGay~?d`-v3ZN7J zqTiS3KXO7nq-m>71RgYkd<1mHD8?rqYU1(q+XH525j1i0GiY7?O<_sZ!hb z!TDt0I6R=#2u601Jp|Ut$d#9v+sX870%`qyZI~#ci<-g|8^p?k6Z5A(AH#P_zz(-u z-;v~s!SF3V|7u8j; zyWG|H`6F%1f^7`q2q1nRtp4*+oK{Rhqj6GbyXRJbgdw6QS|j^fH; zuK0^u&PI}zj`Xa|_FF1np|*lK7PUXb{boMMdw9D+vz-h+uTbraghjj_e|RhsPOniJ zuCC5z9K&p0Agx5_q%W!I@hbh}>)DM1a<=ue8n^6R4omN|z+B{?e7HRnA%IUZlX)xq z|CZi3d^eXN)q`L8gPBay{1pWjv!%ey>b_*}|2{WrpG@zzB$oE*p$o5ag0dx_Gp_0~ zLeapa6hBm$Ld+j>H^X_ltK@{3%Yb&$JCduvr&!03lPFZ?@_i(!l&mrbgLd<1z7+bi;gJ)ism%0~)tnfJOD zgrmM)xb+4sHq+0>mQBACfQj-d5Sl@uIpW41>?Cjx3 zLBO4_sz#|rZ2+9~$q!8+-hBv}$6szam+`RG6k0YUSnWB+ANT#PQ9RwOjon53D@kL65E8hHdqqCCGo|5VYAjKez*BPTjg5F>b;v;_8ECp7t;|zZ@Aqq3AD(ul)65a6$u{G1(e#c3vBQw;hNqcH*+7ce zMNT!Srf(_8lIWxm(cbAC0qXA`2ub{9q(1 zTk5zZxN)mM)Wow@+cq9UqCY}o5N|drW(^!v#B-q`9g#o1y=sr8iWTKI)LpuHK-xIi z=~sbO?YI(|^?+0Au#WBQLxpeP;4ws_GS})bIWrM8^y|F;Ujpo-X)=c|Jq*gjV$#}@ zdE0&)TBq*>uO;A45X8uT0(h?V`{0;%uYoadn!IZND>fKi&Yy=&=&6U3vG5Oxdh70he^w#hRe z=&CskU5sL^;&bZeHK^ZUJ-yZsq`ed3xqTu=v-R`$M2+&%;pluwR)Bc=QTYsVFXs2h z+O5Vcjj-&LE(YS&Ydix@SF~yl8yUDi=@ql7xFa!^sPHX%GOdZ{Etjd^QFb*0qDWwK z1T-8AaaBsLL}BV0lp_$&APMYd$b+Mlm?eMzTRTIwx-qMEj&COp_gDyVzJb>fET!ET z+QbIup44LugN8Auyj}J`tTTb0C^X%+; zWBzfeL!hEU1b4LsD>u;UiKiSm3*3YH)y7mX9nYS0Vf_tCO^INXujh8Js#z*Co@0qoO+;enha2?zJE7(`sW5D zy_t3ymY1%jOo*Ug&gd%goh+F8W*#)hf$>GfK`BF)|7VzywvRLqu^_DVMOn-AlytZY zCC_U_|6c1~rEN~;&{$&6Ddu7!jYlJU>J0%1qpRbBtXV5E3u0}tHQI@9cQ@*ks@7d9 zN8AYz#z9qBx-u6Nz#Q3paf{9m5WRmBLs4>x=iPG5sFOKsSez?1S^T+8;6fR?NyYwt6Ua=fnb+!%@h0vq{MmchdnZ6*`T z&Zgph`h59qubaV;O%Le81`M5mY3%UmtzxYNmS*Xs-%GjSL8>Yu>P0Uf`%(SmuKk?C z-G&jdEmgn+{R!V?C7Z`pK`-%q=$%6MxJ>yY*kv^+|h3B4`c4 z2E;@5u88CY0@*#*2LB|Oz}qzRJ!9@lP2%fdp?o}c?Nsi)`|pdaB}Q5?aq2y727{p* z-~JmEa?_tRYilJE@JO<@0>;){=|3ttv7_GZm7LJLDU!>eVLDt67ou_KK$$L9%4#PY z+R5%A*1V`MWp7WLh;G=vmEo3st-tR+QdYifs8f#;qS&5BY~sBpzf)W$ke(WkE2tn) z3EhH$opUHM^8|P`WpyIgdb~oe2LTzw({{8racn}iB4B0*nDt+J(-oc$a1Go3C))@= z>gC(IXJ!3F&*b=%)_rXfPfH&4-ab@(_DKreKkO%F2jVxWVeHdYCofp(lyT`nYe z^SOR6LV#^v%q>QscQ_2h4>)){Kx zjmK(Xd`XX|KfiGxQ={~Kyu9ZwJl?CB!jSi62yP_fAQZ6uA&H&69+`=iV*o>cS%5)k z{pLzS+^9I>G?3-!f=Do-X6V{6pK73bLBhwUfgT1*`2~h=`D(|x7hbcQA5)u48ZCMc z_WDG^zvTAHt|TvC+pZo|F$6wM0Ps=7q<>@1du;BfweFVN(I?5`c6P6aF+>g z^L-=Dh zEmoouM)6F~Mr&TK2v0oB)T931Rx{2fC`|h`f2?znvM2DDE$4P4Y=yHvZFBaCysE+y z?X&Dr{DR#jk3Pg92ITl^>Thdt2O1sZ|FZ4zzC2Xg)2qmgH`^K8*X9W#50C0HGWKKc zqau1PC)CWTVkUEwm-_og*x`e71AWSus!`!T`O^elmS&A?GMS zelf~T2!N5`B4U(JJg`S%!2NR)>0t_Ow(uAc=py82RArI6?-H=Ni#G$V2U&&{2fSe1 zAPs(-n_{TiMbz4LazYN9V>uG$H#h$}@Ke^hhBR(E=!qm#+c^^ar1~pZJaN{pCyl1& z1i0D+HY~FI3&5b}T+nxl%&_~cM7BWfp+vYoi4mj3kNIfm0YC_K4N<2h*R*DD4j#BJ zSy1wbk386K__9Oy5z0)BSj0m*2EmQJ+s-m*2$u0(23>x>T4_xkbaMy}HH13KgI%VM z3$74Kx@X{z;|xa=x}zvzy2L{fopsvIvV~1)mf=99MmTKX#z=wel>1~SW;rt+tY!Ct z@oNaV#IciJ9c&OqH+J@a_C6(I$!9sKc7ZSPcjMpz(dBvZ4$}q5n0oIwu0*~UEet1l z^)QMINC}}5Tt?pG5i*@G8A-1@F6o& zk;$$W5i;_@nZrT*Pp3p9hKv`rGh&QZQ}o`4h6g_#IQDVFbe?-&|AT#c(Nvob<@Ql^p04GgQk9NJHu+zzgwb%#eNy|s9y~C3gfmJ z?V9-09}Ul)Pc!k5f^qGB#!|;MOfRZIx6ZM&tNo3->7v&5XsyUnb0q;w#0#>n-gT~& z#uK5YKReA8$8@~6s3BjFrcbI%FG3_6!1kW2HeAiCJXDWCXSSVX3|%qn)llo>F0%yI z9b<3UC$7AmpSUtt^5n}#gN3^}06)rdrYrGGp4B88B#s2`IAoBqMZb&gzgz%Wk0TiU zCSD9gL4cl%!(1W)){xnzL0Dk_Ob?W5CYA+ibzJ6QkF^LRS(s3I&5>%tK@{|t*2B9|Ep=u!NzPOO1jLp=afH#F zj5~vw`$!C`HFkANhOVgfR#HA91!OMQvb$!+C1-LX9RW1DYN^LWOS&l-HAQ5K=vTr!pK6EGrPP!R|$NiVz~diER#MMAmY6 z0%6;0+g(ogy!L0QrIPHkURa>9Gpt~K+ldv@Y42wiMiPXulb~zO?dsjO9x0{um)G0* zU13Wv|Lb%StW9xGgN#e+c#cCMm4IS;)(`>Dljkx9RM{Hy>`T}Ov|Q%`)e1-n0~kLV z1C;b~sW3i55(RYsol;fotNp+0!CIvveJ4~D)tfMZ8#+NR2UUQXAYoZ4$Rk=}y;UEk z%S?spQyyXtGN4~-O&$z$8T)|loR&GYSI*CZD?~fBRmcyHw$B( z4xP@^kDsh`orAIePSG{J$Ej+)m^tTk9dh$)usaL>c*#dl#>((Z3P9h_&ZQG}bAP#8Ba+%c-mI)MA#NA_*FrbJb2RJDyK-!zv&5 zRd*o#MtE8tnL!7JZlVD%2ZE;Wp@Vsn^QA)|iFZDL1nfL#=<4qMxpFz0W$hnoAo-Z6 zL9T%d1G&PsnwC=;{#Uab#sk%@a2|e?~}aI`!FFXGi+y&G~GIR&%lmCE9MY z<4Evzj{c$R=@9YK=E2bNbSi5LY)WqTr8rmRq{-tw{taEqm(5E z1W;dU__p)mtl+M6g{c7qm0-aHevTTEX~NcmF(Sk^ePvR*+8l+Bj>c@ho6cWz2G=KF z`y!fjyo+j}H=sHxhfht-PG$Vklo@uC0P`z$6UmiGUJ#9aae_OPq;Qe&>UeR79|Fo1 zgCEwCq6g_TlzhlJM2vEdRVN|BM$UBu!CkZp!tCAt|wP4diHB-8(D*}c$MTjr-0Nu%N* zLFPEa4V)k2i^l;!HYtBdHPC$Ockkc<`#D6}7C7bWb(%O;=oIb743S@Yh=3!fzgX~& zuX7eS7Uh)JGQ;2o@B)Ub+uwejr#dlh#M{d0I8m7s+g-T?lGnUrvXO4};R%uHIYDdi z!I{L^mcn`ox$hJanE&&nv6*V1ye_T2z%gH^^Fl<3Zw7e~a0tI3NobhD0}QgC4K@NH zIKB8-4on|Ip~cUCD=hVrEE4RI;KN>zp$--#;mhyD!w@X@>M?tmxoY3vRE`o`=O zJ696e`^YUsl*BCoT@x?rNE+MfRPh+~c_bxH4}ga?g8Ayk_xhQ^B^lFZ6f4N9e6d-A zVq8p*>WsIld^ypopU89iqy2OXwRy!5~|gEw}FB&F(+~spQj#> z_q{P&V!hXX`fWi+;-s-th3v*sgrKY_{gk^PVG9u8CY-k}6f|($G9Z}M=w2d>KnciG z#JXljTlH^Cu*)_Yr4Y|>eX^kN51L|i!q}mwu|`B4YxYCEbduaYi9M||Yg-?FPMMBq z3^DbWR6`7;Ke)8TD$%{$cE%19hcLhL&f4*Jx-vK8k^300#;<(l)J=X&q>ykp;qlo2 zX`Y~^NbrO~o}mS6`U(YBzmeSjfD`JM*5fQgW(#CvVWI*S!x>j5^S4lkGnRIqYzmBw z2ssW7?j;4Z0x*pQVyD5Yh7m7~cF)7XeOj9Y zc@yBohLQ>>)#$3}0*T3M1b-r9S)g>Ac)R<}G-v%;>wmY$S7q{twAH%(V|44=+w7FR zeoO5Au?PcCzspWp3C79=A;if%)cc2yM?Na|_Lo%Y$V%3_LFr#XHMt4U11k&Ot!g0Jnr5a zW^YbVi02+QIM^UQ96!T!&u0=NYsJv36ZjR zRK44(9`5cE;`WjGt>G@@;4eeO4{D?%Ee}C>jzYvht*4WukiK({)P{Rz?mnTkZ{V~YzJR)Iw z8NuRgzzVxafDROslIsG0GA}A9w-%0_dd``|YYCd=C2Ok4gQtn48$E>^E(;EDx*3P9>m>CVBEr3sh}NZVu7Nt4)+_^VMjA)BIV;8HBN!AU#JYPfs6i9xdJea5TPiFEEMC*7UxHqe`U*KTF$<7xKf05 zBQ`W#>zSo_>~D7CW07h%_-_j|%(#S#z9Gx})zjG1ljjA{%9V!kb!MmN{4T}CtzFHG zl%~>tG-4e5tHJ=ivl|^2DvP77K@~r*NDgO*7%{qbmckTGk*9c6FEoxvyC1`_y51U5 z?)dn|WDUK8*Z6whwkK70c9Zy+9nf{jIQZL2dNq?JdOtg*v4FM+mf}sVP4~baS3Ppy zm&*H%MFpUDy1DQ_fti3x#-z%kz^7c~*FP@J6WkZ;m!Z%^fj03iWpeweo_)WrbDB`{ zS3-&gdoUgpBpdx(G#@fR>|m2YoIT1tsl$1;Yc1b*ZAubilwu?V2BX3u1&4nADuynH zu@C#QLKnJH@qdfIjn`NrY|2%ejufbw7dQTKmU<}MHRv<4lKGg_%RoT`KQBH5N8k`E z&-R@ygZ9P3U=)$l*^xQcg1pPUo&PBAz#zw5LpX6Q4$qgxu&nH#m-@O%b!p!RO66N`oS1!i8JbO0$I`@`LxK^XdNljsm69hSv_917IVoP<|8nHp z&;7m3_TKAVn+HFh{`?IGOf)<~{h00rnHJ?l@Qz$<8)*L*eS9D|-HCBsleBhk>N6dq zcn;zLS(?`;0nTQs>eM;WJNEvoN;9n`a&!<^r3*0|yobqGC%t;YHCnz2%eNlEhwL4E zei#cGDe0^j08ePYo9)SXNQv1cKULJdFcs#e^q|iQOb421Ei?8{Dt~@rDGUc?G)cW1XU6L_6jCGM~D+fF_1OTJJb`i z(Qrn)p=C$c)lZ3jZT#5YAf-xWAnRb09)*nv9icW2=N>>in(VsNvomUVD!b@MDwD5E zyY7ox76zGu975RaATRe3JoyX*49p^?^s)RcMWz=ctbqU<9Ivl| zB>U)dLVeDaxQ8GNFc5o&pK&qWT0sY^53dyW5zUVRzcdNK6dgF%p@z zL?KG19HP}%z1wzByRJ-5{Ol}hz^uJ2IjN%{h19nDo-w9=~oFM&<|hbBT{jNXZg-BdAHNS$hl_ z4q}*9(Q!N{1zC@ocF^gv@|Y!aHGO2`hZji@(0tmZ)wma%V$C}XVX0L! zoG{`qSr@4lzK*Yc;YO3a2i;)^=HjL`#H!tigQfC#2Y~|CZ_&%%6zdf8Mrcb&62=oj(J{ z-z9$(z=}}cm*ljLxnrMBE(A3}LV4h?hNds|Ge@YuV=;>i zFV~IGhWk91JGEUN%Q4yTE>sI(t0Lou)aYFO!)>co6xEm4xcoUK_fp>#eoRWM-$5c} zk5f$=(~KY0_Pz^>ym`U8r*52AYTdh%)<_JP$4S-xx4Vy?^O?pAib(aUg+IWVf&7ub zF*1PFrBvuOb4_7-PtIK2_@1&BWK~Bv(G{-$IN}VsGK7L^brA7FAgG+E`R@Bo5f7z9 zf4VSexd5$QCBp(%p;GkLK|5w^UeNLV*4mRMUskfej#!U!>2Pcqzdlj6Zcy*FI*rnE zK|?QVZWU`^kUUbcC1}q9>lM2p=1i+!sKS+yW9G<>U5X80mn5CHioS322_+QxHKas> zEFviPPfqyzptj*yfU1DjAuRVA|a zh5JaQnK{v!_B&`mHETJ8s6Za05GRxnd)xxCEvq>j?*wIz!lMKYbXqR;u)*G?AZ|KX z(~*S8(dcONdStix*TnWt=++RL$yHz0yKPA#9|BC%S;sCp7Z2?p{afWu8AT=~%tJvW z&L<`-7+Mcrc<&H}g{0Hv`k^Z86LVY2dd zZdgYq92tC`d9oJG(OuG!%Q;eiM%y#RicC_2b_v z9lQsBN^;bnO(bL9y4sECw|`)Qe1s7S((=E3gUOu9#J7dJVv8!m>*a)Y@ZkvjoaeW6 zmz9M3D>$xXz`32CZXF|X`v zBh02P`jJ+5R*+2w4HMUH7eQ@qKgjtI{Q$TNtXP_{?s=}rxyrtI8OS_9z|K2ZR%fT= zZ^kU>Lfb0GBhgdY!e0{QvdBi^l~#{R18&Xs`)rSTSoK)g+DObWXx{7HS}m=4Zb8E$ zYU7}CF%Nowq^y`?EUOFTAf?{lhQfJ{x4~!ryvFk}8TIsFk@BOFros=St6(ItCXdJU zMz(K`$KY0%tn3se)^x(2Oatp^WWgBLQx-A*sl1=c1wWi20Qy|r|;N&b%b{6YF0YuUT< zbM4kxr-lhgskP0YcriMc&GBeV*7DhB_b_3qX!dB#Hhs>xQPNGD83uR$o7IX|53w@BEZ`X#?zYmcRJ!F-gMJSwI?abQ3s~R*x%c{l;SEtW3QSu|9st{`2 z!xy!l;>u=HVpS@+)V%9$FH@$9g3)PNO5ZN+Y>p9H6 z`OAT`s{J{nKYyHNyw52}7Y+gKt_8+N!xZpX)|Ovt#`rh!BRl<;q@3<+7`+vuAX~k0 z%Jkiyvw+1S6?Y-Bq08wIxtb3er5O!ogIjmQSj0yn4fdN;)?>GHRMYZDgd8?tev9EMR=A@S}e6$1xY9IP#M2$T@I{LCaP+ zecU|OU`Lv9sAa`#*EwA#NG9hZQW9J%y7S3hYXSH3b+zL$X}V7gEm#GBIl(t;^>8=c zF0U6>0k-T+wth@zt#7g}IxzWj!zmxs!FqeOFe9sU_R$bDvwPiy-CS;72+t6T`<}ot zu$rMeD7P$^1$qdQUk8j2PPv<36028#TW-Cz*%)y$AcdyeC<6tY_4hECjzj}=TeX@3 zv}axZw?O3li&*+wCP>Qme8+?xCw8e&gvNo5?-#ikl&E}cyjaS-3uPGLk)QwWlZ!UQ zvTM|p@y8@1DWYgO?KNjDVf|f6-kR2IDJW=cG086860rjg5=`fq)0-~-Ysh%mTo%I9y zC9Rw=!5OkrGScD_a*R$-rVk~Kt3=q|bKcc9;bADQQd~Tm0B;nBEw^W@p4~&|A z{XExt)yPE$@3=in&^F5wjpr z+k0-iI%YW&i;LB9o^!`-*&hF=H8U4E{Ocn$(Z@ORwNY^|BI9uo*F2yaO^Ry@#uG@D z+>&(A5B&V~&DrDa=~sv@braIw7GMNlt?OKips@Zum2`4M!AhCc9TQI!M7VpA?T*+_X=nmKBd`mT)=R#e8NR;!4NA z0L;QbzagH3JChVi)kpE#Pc^W>s9zQv-@7eY;WV;->HhQQ9v_%WetJ&l$T8Nf!gFp2 zS9DT7siaiehiRfK|J&~E>UOcI)s0hj>Mt5M!P>lpgA$Gn97CinY6=y72{GIB4lqdm z#_R(eq9fMteV@e+B~uz4Tbm-%V5}?13K12)A#Yih99L32%DdtX{r~jec-f2jQAL@? zPN-hNyg)8kkX9e`sU1gda8I@ro&nO%%lM1-O0BW!@@^CXN>9dNr(DJLce#}W*hPl( zcb}(B;A}c;dtLL#%6_?~T2#pvu@hrlO>AC{7~4uBsvl7e)a$keX_v}TCTQ$3_S5eN zk7W_<&qvI;&GgV6u&o++9(zyoM``h>VrbksoT=vzVM{&JPey1Fi(a@g;$N=xPl2E( zx|7JoDh7T7$1u>0P-iKA*;N-Ct|*#DO8A}V?Nt09v<6~UMf`LZNk~fljI?~=@kD4n zoIpT8)Ce!03&DXAQe@z|Yclw?Z#Wrt)3mJagLBnDXKdPm2>%mDxnpVb@K)|)9c4rgJ8(Gv!)d`$%U3!_4>UoKaijHid4{pk1 zX7CyZr*o$-hjGjt$lYojs`rV%m^I9x-oDi|s(*?bum=O3ZrK#ZZ{5HIucz{VI8Zn^{DXNbj}_*>DkjTTK0(d}#WV)>&{|_tE=X zQY^o8X^({S&q`1AeDW7n33860cUZ>yvcY(OF!E>rMwsd_$DdUe!oyerd6Dx8&-aNUr)2v|I64p$SGt8a*D)aUXRh((JOq0&hf;hu!8cFkPYL zaG4S~ol-L%?VEL9yDZd^ykxi9Km2GGJ8V_zyRP!=8k8@7rZzxnxmnLA+E6T2ELi(S zw$!oCwa`lgIm3K7$TKhl3X#F>e`j+;Tyj=3gqg+B7fk4znAW z8eskK$i7C`Jlnp5!H%X|vQSwpcV5H>fSdib7>adwYS~U0o*bJ-cG8@>JI2-a9G?V4EP8B8mMU-4cZr;rxj76EK(gBa&tC zhe%0GsjHzI; z{i0VC3}$-3M$3ftqh?fHW!61R%#N_l; z)qc*y?+V3>tqD)ZcH;dh(VrhSHBM>8w0f(>>?0x?1Br3tw+dZCA*=zN+%-__KLrHw<$1XYY4R;)$dta zby4x`wd7K95z3j<)5eh0ZJ_70eS z`Z-`jHu)Tj&mHm(<{{?|ck295POHyijbe!_x*@A7HHLJaqu*JN{v0{sEx8T61RPm`-7qZveR<+)~cF)-g zWA696?Y1bn_#%(>huPQUT{4AjMC1$8bF6l6aeqnKOTNb594j;CG2H%(yWi9a7u2)9 zTT71BKITz!Jq^$6t`%gHN$2gx*;Z7hGwToQ>)sT&vHqrUj@1#SBl+=$mO9}=W7Z$m z=U6#ZT@;qrD95;2Vfp=Tbj;nA-=E!%p&JVOvk&I6kzaT)&z2+G5Lakh#m%}+RTl*w q;NIdVm)Vft`2X_@y7upzm)cVOaeU2)<_rb@?AT_q_5Nm?GyfmfA0=A= literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..bc0c2ae9b08de1c21e97d4edc1f3aaef7060e409 GIT binary patch literal 37099 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≀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 o45|O$*;8-!GsaSu?E5k* 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 Nbxu=PgP>*}^glWkh1dW9 literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..e1cd59d204fb543959a8a9e9545f3e3ab2eafde9 GIT binary patch literal 19626 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 II;Vst0RAobKL7v# literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..80bfb654c16c2772cac0dd4890d1fe0e48111051 GIT binary patch literal 12548 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�jfjtf=&=wvo?eF)Yn~XJY?8^86nA` z>;jw8)h$Ta7Zc>kVB~aj+&@!27|cby{F=n2Q(S@nA^Bo+PYwT z0+r=`(@XCx{3pcNY5CTAW}OJ9PO;;6j+GxT3I;ZNvcM}YSB)Y#cqmxyzI^eep;PLe zoLn2yWP$jpuE+55oJ-6L_~Q<)i|YZm=BvYYN>KxIsy5}f6+K>lcX8#HY?c(jn*7u@ z)D1J^;-$yimOK%I6{v{ryw`gV3@Z&oC*fd>%91Ye2OGav{Kct3`4CqJJ7rv%ZJ)Ps z!mit39VY73oWp7pi?k1;A_*r_6 z%bt7&ecr6cEW~0`@3dP8&B4KRLrg&N2~?RDm^rE1Ox=bP4U!=gG(>4I;B}ene&bWb zWYOglkue-jHwU-Ln!fAYXb3@J5=+jt zhXg3+UJ4-Tg25W~{>?EhY)V5c9?a%uV!(ltv&tKb{M-xS8=8n3&)9@dhM5`nS`)kX zDk&+2VZQUr>!-4~ji5HlL85QxlgUcM^ogh~GHUNV&w<&v(70l~l5)LTBIUzz5y&W9FwYJSyHL*w4f?zj;WZtLi|V;=Ugk z_`xV~O?JYqNoM!{fFX~V)O~{bw_I$B_1Pums>OzIKNasHPOs#-Ryfh(sLh^CJh}Gd z>EI8CL>GxpyC@4~G8CL`Y2!3NEPu~E8V&Ce733RU2=il;JjZCoKl=6Z`};3WVI=KH9`%TZ{~Hw03A&kVEDV0BOpuvwn+QmF`mlsXaZnJmJ0T2 z*D{f}xLHHSYJ59CgG3MZAQ&&3CEVT?$b*Vl@X&lbx0LfY?UWOljJ1xweFY(#?BIe+ z#(TL+sD3V#kJ#;|x3vpmLGxKAo;o~o!;`ID25pbeJqIW#W9qeqw0_}ak!^NdvxMf) z@0LI4VkgV_z7d zM{%KLYlb@o20qWFlvkKsR{b=Slc^E{$KBdQykglUL!I?xG8t9|xv@QAkr0EC?94T9 zn}jLT!|6eXx2$;G0SYD{ZHMgpD-gnVAQN0_`%Z;ntqO{-niOhqH3>S*n}~W`1neA`!v&WqN*6`J4QP^Q hF#G?x4{hH3GL;xK{aAD|ba)H+!CTo`mYdTe{}=G5y5s-= literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..53161ce848fe0591f0cc84796f545a90a50c3063 GIT binary patch literal 11876 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 f-MOx=MG?8EV=&4oSvJL+?va}&q literal 0 HcmV?d00001 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 index 0fc507ad69..0000000000 --- a/dox/user_guides/boolean_operations/images/operations_image065.svg +++ /dev/null @@ -1,407 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - BRepAlgoAPI_BuilderAlgo - - - BRepAlgoAPI_Fuse - - - - - BRepAlgoAPI_BooleanOperation - - - - - BRepAlgoAPI_Cut - - - - - - - - - - BRepAlgoAPI_Common - - - BRepAlgoAPI_Section - - BRepAlgoAPI_Algo - - - BRepBuilderAPI_MakeShape - - - diff --git a/dox/user_guides/draw_test_harness/draw_test_harness.md b/dox/user_guides/draw_test_harness/draw_test_harness.md index 7c4872255d..e7b5861e8b 100644 --- a/dox/user_guides/draw_test_harness/draw_test_harness.md +++ b/dox/user_guides/draw_test_harness/draw_test_harness.md @@ -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 index 0000000000..74a0ecb2cc --- /dev/null +++ b/src/BOPAlgo/BOPAlgo_Splitter.cxx @@ -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 +#include + +//======================================================================= +//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 index 0000000000..364554f4e0 --- /dev/null +++ b/src/BOPAlgo/BOPAlgo_Splitter.hxx @@ -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 +#include +#include + +#include + +//! The class is a General Fuse (GF) based algorithm.
+//! It provides means to split an arbitrary number of shapes of arbitrary +//! dimensions by other arbitrary shapes.
+//! 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).
+//! The result of the operation contains only the split parts of the Objects.
+//! The split parts of the Tools are excluded from the result.
+//! If there are no Tool shapes, the operation will be equivalent to General Fuse.
+//! +//! 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.
+//! +//! The implementation of the algorithm is minimal - only the methods +//! CheckData() and Perform() have been overridden.
+//! 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 diff --git a/src/BOPAlgo/FILES b/src/BOPAlgo/FILES index 6f1e522bea..e32194e56a 100644 --- a/src/BOPAlgo/FILES +++ b/src/BOPAlgo/FILES @@ -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 diff --git a/src/BOPTest/BOPTest_APICommands.cxx b/src/BOPTest/BOPTest_APICommands.cxx index a61adc1741..87bc4d3c17 100644 --- a/src/BOPTest/BOPTest_APICommands.cxx +++ b/src/BOPTest/BOPTest_APICommands.cxx @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -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; +} diff --git a/src/BOPTest/BOPTest_Objects.cxx b/src/BOPTest/BOPTest_Objects.cxx index 2fad73b694..7c703e80fa 100644 --- a/src/BOPTest/BOPTest_Objects.cxx +++ b/src/BOPTest/BOPTest_Objects.cxx @@ -19,6 +19,7 @@ #include #include #include +#include #include 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 : //======================================================================= diff --git a/src/BOPTest/BOPTest_Objects.hxx b/src/BOPTest/BOPTest_Objects.hxx index e1d24ac5c5..96cdd8525d 100644 --- a/src/BOPTest/BOPTest_Objects.hxx +++ b/src/BOPTest/BOPTest_Objects.hxx @@ -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 diff --git a/src/BOPTest/BOPTest_PartitionCommands.cxx b/src/BOPTest/BOPTest_PartitionCommands.cxx index a86e0c9ba7..ea60954da4 100644 --- a/src/BOPTest/BOPTest_PartitionCommands.cxx +++ b/src/BOPTest/BOPTest_PartitionCommands.cxx @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -32,9 +33,10 @@ #include // // -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 index 0000000000..7c5c0ea60c --- /dev/null +++ b/src/BRepAlgoAPI/BRepAlgoAPI_Splitter.cxx @@ -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 + +#include +#include + +//======================================================================= +// 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 index 0000000000..c655761619 --- /dev/null +++ b/src/BRepAlgoAPI/BRepAlgoAPI_Splitter.hxx @@ -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 +#include +#include + +#include + +//! The class contains API level of the Splitter algorithm.
+//! It provides means to split an arbitrary number of shapes of arbitrary +//! dimensions by other arbitrary shapes.
+//! 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).
+//! The result of the operation contains only the split parts of the Objects.
+//! The split parts of the Tools are excluded from the result.
+//! If there are no Tool shapes, the operation will be equivalent to General Fuse.
+//! +//! The algorithm returns the following Error statuses:
+//! - 0 - in case of success;
+//! - 1 - in case there is no enough arguments for the operation;
+//! - 2 - in case the Intersection of the arguments has failed;
+//! - 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.
+ //! 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 diff --git a/src/BRepAlgoAPI/FILES b/src/BRepAlgoAPI/FILES index 91a8786aba..9a12d65b5d 100644 --- a/src/BRepAlgoAPI/FILES +++ b/src/BRepAlgoAPI/FILES @@ -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 diff --git a/tests/boolean/grids.list b/tests/boolean/grids.list index 3d964960dc..87d08f1ff8 100644 --- a/tests/boolean/grids.list +++ b/tests/boolean/grids.list @@ -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 index 0000000000..73bb2ecd2f --- /dev/null +++ b/tests/boolean/splitter/A1 @@ -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 index 0000000000..5ddeb0e7a8 --- /dev/null +++ b/tests/boolean/splitter/A2 @@ -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 index 0000000000..3dccb86f66 --- /dev/null +++ b/tests/boolean/splitter/A3 @@ -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 index 0000000000..7060c0a28b --- /dev/null +++ b/tests/boolean/splitter/A4 @@ -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 index 0000000000..4c9c93f517 --- /dev/null +++ b/tests/boolean/splitter/A5 @@ -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 index 0000000000..6c57158763 --- /dev/null +++ b/tests/boolean/splitter/A6 @@ -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 index 0000000000..dd0dc3475d --- /dev/null +++ b/tests/boolean/splitter/B1 @@ -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 index 0000000000..b1ccd9a191 --- /dev/null +++ b/tests/boolean/splitter/B2 @@ -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 index 0000000000..d07ab4c250 --- /dev/null +++ b/tests/boolean/splitter/B3 @@ -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 index 0000000000..f6b3e1687d --- /dev/null +++ b/tests/boolean/splitter/B4 @@ -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 index 0000000000..5b2e5ffcef --- /dev/null +++ b/tests/boolean/splitter/B5 @@ -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 index 0000000000..ef98821924 --- /dev/null +++ b/tests/boolean/splitter/B6 @@ -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 -- 2.20.1