0028747: Incorrect result of the section operation after edge refinement
authoremv <emv@opencascade.com>
Thu, 26 Apr 2018 11:35:35 +0000 (14:35 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 14 Jun 2018 11:03:06 +0000 (14:03 +0300)
Implementation of the method for simplification of the result of Boolean Operation on the API level.
The method BRepAlgoAPI_BuilderAlgo::SimplifyResult has been added, so the derived classes such as BooleanOpeation and Splitter can also use this method.
The result shape simplification should be called after the operation is done. The simplification is performed by the means of ShapeUpgrade_UnifySameDomain algorithm.

Draw command "bsimplify" has been added to control the simplification options.
Documentation for new functionality and draw commands controlling the options of Boolean operations.
Test cases for the new functionality.

Side-effect change:
The algorithms in Boolean component have been changed to use the BRepTools_History as a History tool.
Now it became possible to disable the collection of shapes modifications during Boolean Operations, which may be useful for performance sake (in draw the option is controlled by *setfillhistory* command).
Draw command "unifysamedom" has been changed to accept the angular tolerance in degrees instead of radians.

58 files changed:
dox/dev_guides/upgrade/upgrade.md
dox/user_guides/boolean_operations/boolean_operations.md
dox/user_guides/boolean_operations/images/bop_simple_001.png [new file with mode: 0644]
dox/user_guides/boolean_operations/images/bop_simple_002.png [new file with mode: 0644]
dox/user_guides/draw_test_harness/draw_test_harness.md
dox/user_guides/modeling_algos/modeling_algos.md
src/BOPAlgo/BOPAlgo_Builder.cxx
src/BOPAlgo/BOPAlgo_Builder.hxx
src/BOPAlgo/BOPAlgo_BuilderShape.cxx [deleted file]
src/BOPAlgo/BOPAlgo_BuilderShape.hxx
src/BOPAlgo/BOPAlgo_Builder_4.cxx
src/BOPAlgo/BOPAlgo_CellsBuilder.cxx
src/BOPAlgo/BOPAlgo_CellsBuilder.hxx
src/BOPAlgo/BOPAlgo_RemoveFeatures.cxx
src/BOPAlgo/BOPAlgo_RemoveFeatures.hxx
src/BOPAlgo/FILES
src/BOPTest/BOPTest_APICommands.cxx
src/BOPTest/BOPTest_BOPCommands.cxx
src/BOPTest/BOPTest_CellsCommands.cxx
src/BOPTest/BOPTest_Objects.cxx
src/BOPTest/BOPTest_Objects.hxx
src/BOPTest/BOPTest_OptionCommands.cxx
src/BOPTest/BOPTest_PartitionCommands.cxx
src/BOPTest/BOPTest_RemoveFeaturesCommands.cxx
src/BRepAlgoAPI/BRepAlgoAPI_BooleanOperation.cxx
src/BRepAlgoAPI/BRepAlgoAPI_BooleanOperation.hxx
src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.cxx
src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.hxx
src/BRepAlgoAPI/BRepAlgoAPI_Defeaturing.cxx
src/BRepAlgoAPI/BRepAlgoAPI_Defeaturing.hxx
src/BRepAlgoAPI/BRepAlgoAPI_Splitter.cxx
src/BRepAlgoAPI/BRepAlgoAPI_Splitter.hxx
src/BRepFeat/BRepFeat_Builder.cxx
src/BRepTest/BRepTest_FeatureCommands.cxx
src/BRepTest/BRepTest_FilletCommands.cxx
src/BRepTest/BRepTest_HistoryCommands.cxx
src/BRepTest/BRepTest_Objects.cxx
src/BRepTest/BRepTest_Objects.hxx
src/BRepTest/BRepTest_SweepCommands.cxx
src/BRepTools/BRepTools_History.cxx
src/BRepTools/BRepTools_History.hxx
src/SWDRAW/SWDRAW_ShapeUpgrade.cxx
src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.hxx
tests/boolean/grids.list
tests/boolean/history/A9 [new file with mode: 0644]
tests/boolean/simplify/A1 [new file with mode: 0644]
tests/boolean/simplify/A2 [new file with mode: 0644]
tests/boolean/simplify/A3 [new file with mode: 0644]
tests/boolean/simplify/A4 [new file with mode: 0644]
tests/boolean/simplify/A5 [new file with mode: 0644]
tests/bugs/heal/bug27729
tests/bugs/modalg_6/bug28207
tests/bugs/modalg_6/bug28343_1
tests/bugs/modalg_6/bug28343_2
tests/perf/modalg/bug26513
tests/perf/modalg/bug29237_1
tests/perf/modalg/bug29237_2
tests/perf/modalg/bug29237_3

index 0ab9b28..b32ede8 100644 (file)
@@ -1587,3 +1587,13 @@ Previously the algorithm could create a shape with the same degenerated edge sha
 @subsection upgrade_740_extremaalgo Changes in behavior of Extrema algorithms
 
 Since OCCT 7.4.0 exception is thrown on the attempt of taking points in case of infinite number of solution (IsParallel status). Request of distances is available as before. Method NbExt() always returns 1 in such cases. 
+
+@subsection upgrade_740_removed Removed features
+* The following methods of the class *BRepAlgoAPI_BooleanOperation* have been removed as obsolete or replaced:
+  - *BuilderCanWork* can be replaced with *IsDone* or *HasErrors* method.
+  - *FuseEdges* removed as obsolete.
+  - *RefineEdges* replaced with new method *SimplifyResult*.
+* The method *ImagesResult* of the class *BOPAlgo_BuilderShape* has been removed as unused. The functionality of this method can be completely replaced by the history methods *Modified* and *IsDeleted*.
+* The method *TrackHistory* of the classes *BOPAlgo_RemoveFeatures* and *BRepAlgoAPI_Defeaturing* has been renamed to *SetToFillHistory*.
+* The method *GetHistory* of the class *BRepAlgoAPI_Defeaturing* has been renamed to *History*.
+
index dbd97df..3ac64f7 100644 (file)
@@ -3070,6 +3070,50 @@ generated gf2 com_hist f2
 
 ~~~~
 
+@section occt_algorithms_simplification BOP result simplification
+
+The API algorithms implementing Boolean Operations provide possibility to simplify the result shape by unification of the connected tangential edges and faces.
+This simplification is performed by the method *SimplifyResult* which is implemented in the class *BRepAlgoAPI_BuilderAlgo* (General Fuse operation).
+It makes it available for users of the classes *BRepAlgoAPI_BooleanOperation* (all Boolean Operations) and *BRepAlgoAPI_Splitter* (split operation).
+
+The simplification is performed by the means of *ShapeUpgrade_UnifySameDom* algorithm. The result of operation is overwritten with the simplified result.
+
+The simplification is performed without creation of the Internal shapes, i.e. shapes connections will never be broken. It is performed on the whole result shape.
+Thus, if the input shapes contained connected tangent edges or faces unmodified during the operation they will also be unified.
+
+History of the simplification is merged into the main history of operation, thus it will be accounted when asking for Modified, Generated and Deleted shapes.
+
+Some options of the main operation are passed into the Unifier:
+- Fuzzy tolerance of the operation is given to the Unifier as the linear tolerance.
+- Non destructive mode here controls the safe input mode in Unifier.
+
+For controlling this possibility in DRAW the command **bsimplify** has been implemented. Please see the @ref occt_draw_bop_options "Boolean Operations options" chapter in draw user guide.
+
+
+@subsection occt_algorithms_simplification_examples Examples
+
+Here is the simple example of simplification of the result of Fuse operation of two boxes:
+
+~~~~
+bsimplify -f 1
+
+box b1 10 10 15
+box b2 3 7 0 10 10 15
+bclearobjects
+bcleartools
+baddobjects b1
+baddtools b2
+bfillds
+bapibop r 1
+~~~~
+
+<table align="center">
+  <tr>
+    <td>@figure{/user_guides/boolean_operations/images/bop_simple_001.png, "Not simplified result", 420}</td>
+    <td>@figure{/user_guides/boolean_operations/images/bop_simple_002.png, "Simplified result", 420}</td>
+  </tr>
+</table>
+
 
 @section occt_algorithms_11b Usage 
 
diff --git a/dox/user_guides/boolean_operations/images/bop_simple_001.png b/dox/user_guides/boolean_operations/images/bop_simple_001.png
new file mode 100644 (file)
index 0000000..dd509cd
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/bop_simple_001.png differ
diff --git a/dox/user_guides/boolean_operations/images/bop_simple_002.png b/dox/user_guides/boolean_operations/images/bop_simple_002.png
new file mode 100644 (file)
index 0000000..7041b1f
Binary files /dev/null and b/dox/user_guides/boolean_operations/images/bop_simple_002.png differ
index ce6aee1..6c03984 100644 (file)
@@ -6876,7 +6876,10 @@ tscale c1 0 0 0 0.5
 
 @subsubsection occt_draw_7_6_1  fuse, cut, common
 
-Syntax:      
+These commands are no longer supported, so the result may be unpredictable.
+Please use the commands bfuse, bcut, bcommon instead.
+
+Syntax:
 ~~~~~
 fuse name shape1 shape2 
 cut name shape1 shape2 
@@ -6912,6 +6915,9 @@ ttranslate s4 0 -40 0
 
 @subsubsection occt_draw_7_6_2  section, psection
 
+These commands are no longer supported, so the result may be unpredictable.
+Please use the command bsection instead.
+
 Syntax:      
 ~~~~~
 section result shape1 shape2 
@@ -6955,187 +6961,15 @@ whatis sr
 sr is a shape COMPOUND FORWARD Free Modified 
 ~~~~~
 
-@subsection occt_draw_7_7  New Topological operations
-
-
-The new algorithm of Boolean operations avoids a large number of weak points and limitations presented in the old boolean operation algorithm. 
-
-
-@subsubsection occt_draw_7_7_1  bparallelmode
-
-* **bparallelmode** enable or disable parallel mode for boolean operations. Sequential computing is used by default.
-
-Syntax: 
-~~~~~
-bparallelmode [1/0]
-
-~~~~~
-
-Without arguments, bparallelmode shows current state of parallel mode for boolean operations.
-
-* *0* Disable parallel mode, 
-* *1* Enable parallel mode 
-
-**Example:**
-~~~~~
-# Enable parallel mode for boolean operations.
-bparallelmode 1
-
-# Show state of parallel mode for boolean operations.
-bparallelmode
-~~~~~
-
-@subsubsection occt_draw_7_7_2  bop, bopfuse, bopcut, boptuc, bopcommon
-
-* **bop** defines *shape1* and *shape2* subject to ulterior Boolean operations 
-* **bopfuse** creates a new shape by a boolean operation on two existing shapes. The new shape contains both originals intact. 
-* **bopcut** creates a new shape which contains all parts of the second shape but only the first shape without the intersection of the two shapes. 
-* **boptuc** is a reverced **bopcut**. 
-* **bopcommon** creates a new shape which contains only whatever is in common between the two original shapes in their intersection. 
-
-Syntax:      
-~~~~~
-bop shape1 shape2 
-bopcommon result 
-bopfuse result 
-bopcut result 
-boptuc result 
-~~~~~
+@subsection occt_draw_7_7 New Topological operations
 
-These commands have short variants: 
+The new algorithm of Boolean operations avoids a large number of weak points and limitations presented in the old Boolean operation algorithm.
+It also provides wider range of options and diagnostics.
+The algorithms of Boolean component are fully described in the @ref occt_algorithms_1 "Boolean Operations" of boolean operation user guide.
 
-~~~~~
-bcommon result shape1 shape2 
-bfuse result shape1 shape2 
-bcut result shape1 shape2 
-~~~~~
-
-
-**bop** fills data structure (DS) of boolean operation for *shape1* and *shape2*. 
-**bopcommon, bopfuse, bopcut, boptuc** commands are used after **bop** command. After one **bop** command it is possible to call several commands from the list above. For example:
-
-~~~~~
-bop S1 S2
-bopfuse R
-~~~~~ 
+For the Draw commands to perform operations in Boolean component please read the dedicated section @ref occt_draw_bop "Boolean operations commands"
 
 
-**Example:** 
-
-Let us produce all four boolean operations on a box and a cylinder: 
-
-~~~~~
-box b 0 -10 5 20 20 10 
-pcylinder c 5 20 
-
-# fills data structure 
-bop b c 
-
-bopfuse s1 
-ttranslate s1 40 0 0 
-
-bopcut s2 
-ttranslate s2 -40 0 0 
-
-boptuc s3 
-ttranslate s3 0 40 0 
-
-bopcommon s4 
-ttranslate s4 0 -40 0 
-~~~~~
-
-Now use short variants of the commands: 
-
-~~~~~
-bfuse s11 b c 
-ttranslate s11 40 0 100 
-
-bcut s12 b c 
-ttranslate s12 -40 0 100 
-
-bcommon s14 b c 
-ttranslate s14 0 -40 100 
-~~~~~
-
-@subsubsection occt_draw_7_7_3  bopsection
-
-Syntax:      
-~~~~~
-bop shape1 shape2 
-bopsection result 
-~~~~~
-
-* **bopsection** -- creates a compound object consisting of the edges for the intersection curves on the faces of two shapes.
-* **bop** -- fills data structure (DS) of boolean operation for *shape1* and *shape2*. 
-* **bopsection** -- is used after **bop** command.
-Short variant syntax:      
-~~~~~
-bsection result shape1 shape2 [-2d/-2d1/-2s2] [-a] 
-~~~~~
-
-* <i>-2d</i>  --  PCurves are computed on both parts. 
-* <i>-2d1</i> -- PCurves are computed on first part. 
-* <i>-2d2</i> -- PCurves are computed on second part. 
-* <i>-a</i>  --   built geometries  are approximated. 
-
-**Example:** 
-
-Let us build a section line between a cylinder and a box 
-~~~~~
-pcylinder c 10 20 
-box b 0 0 5 15 15 15 
-trotate b 0 0 0 1 1 1 20 
-bop b c 
-bopsection s 
-# Short variant: 
-bsection s2 b c 
-~~~~~
-
-@subsubsection occt_draw_7_7_4  bopcheck, bopargshape
-
-Syntax:      
-~~~~~
-bopcheck shape 
-bopargcheck shape1 [[shape2] [-F/O/C/T/S/U] [/R|F|T|V|E|I|P]] [#BF] 
-~~~~~
-
-**bopcheck** checks a shape for self-interference. 
-
-**bopargcheck** checks the validity of argument(s) for boolean operations. 
-
-* Boolean Operation -- (by default a section is made) : 
-  * **F** (fuse) 
-  * **O** (common) 
-  * **C** (cut) 
-  * **T** (cut21) 
-  * **S** (section) 
-  * **U** (unknown) 
-* Test Options -- (by default all options are enabled) : 
-  * **R** (disable small edges (shrink range) test) 
-  * **F** (disable faces verification test) 
-  * **T** (disable tangent faces searching test) 
-  * **V** (disable test possibility to merge vertices) 
-  * **E** (disable test possibility to merge edges) 
-  * **I** (disable self-interference test) 
-  * **P** (disable shape type test) 
-* Additional Test Options :
-  * **B** (stop test on first faulty found) -- by default it is off; 
-  * **F** (full output for faulty shapes) -- by default the output is made in a short format.
-
-**Note** that Boolean Operation and Test Options are used only for a couple of argument shapes, except for <b>I</b> and <b>P</b> options that are always used to test a couple of shapes as well as a single shape.
-
-**Example:** 
-~~~~~
-# checks a shape on self-interference 
-box b1 0 0 0 1 1 1 
-bopcheck b1 
-
-# checks the validity of argument for boolean cut operations 
-box b2 0 0 0 10 10 10 
-bopargcheck b1 b2 -C 
-~~~~~
-
 @subsection occt_draw_7_8  Drafting and blending
 
 Drafting is creation of a new shape by tilting faces through an angle. 
@@ -8051,10 +7885,44 @@ Options:
 
 Draw module for @ref occt_modalg_hist "History Information support" includes the command to save history of modifications performed by Boolean operation or sibling commands into a drawable object and the actual history commands:
 
-* *savehistory*;
-* *isdeleted*;
-* *modified*;
-* *generated*.
+* **setfillhistory**;
+* **savehistory**;
+* **isdeleted**;
+* **modified**;
+* **generated**.
+
+@subsubsection occt_draw_hist_set setfillhistory
+
+*setfillhistory* command controls if the history is needed to be filled in the supported algorithms and saved into the session after the algorithm is done.
+By default it is TRUE, i.e. the history is filled and saved.
+
+Syntax:
+~~~~
+setfillhistory  : Controls the history collection by the algorithms and its saving into the session after algorithm is done.
+                Usage: setfillhistory [flag]
+                w/o arguments prints the current state of the option;
+                flag == 0 - history will not be collected and saved;
+                flag != 0 - history will be collected and saved into the session (default).
+~~~~
+
+Example:
+~~~~
+box b1 10 10 10
+box b2 10 10 10
+setfillhistory 0
+bfuse r b1 b2
+savehistory h
+# No history has been prepared yet.
+setfillhistory 1
+bfuse r b1 b2
+savehistory h
+dump h
+# *********** Dump of h *************
+# History contains:
+#  - 2 Deleted shapes;
+#  - 52 Modified shapes;
+#  - 0 Generated shapes.
+~~~~
 
 @subsubsection occt_draw_hist_save savehistory
 
@@ -8195,16 +8063,23 @@ aSplitter.SetNonDestructive(BOPTest_Objects::NonDestructive());
 aSplitter.SetGlue(BOPTest_Objects::Glue());
 aSplitter.SetCheckInverted(BOPTest_Objects::CheckInverted());
 aSplitter.SetUseOBB(BOPTest_Objects::UseOBB());
+aSplitter.SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
 
 // performing operation
 aSplitter.Build();
 
-// Store the history for the Objects (overwrites the history in the session)
-BRepTest_Objects::SetHistory(BOPTest_Objects::Shapes(), aSplitter);
-// Add the history for the Tools
-BRepTest_Objects::AddHistory(BOPTest_Objects::Tools(), aSplitter);
+if (BRepTest_Objects::IsHistoryNeeded())
+{
+  // Store the history for the Objects (overwrites the history in the session)
+  BRepTest_Objects::SetHistory(BOPTest_Objects::Shapes(), aSplitter);
+  // Add the history for the Tools
+  BRepTest_Objects::AddHistory(BOPTest_Objects::Tools(), aSplitter);
+}
 ~~~~
 
+The method *BRepTest_Objects::IsHistoryNeeded()* controls if the history is needed to be filled in the algorithm and saved into the session after the algorithm is done (*setfillhistory* command controls this option in DRAW).
+
+
 @subsection occt_draw_7_12  Texture Mapping to a Shape
 
 Texture mapping allows you to map textures on a shape. Textures are texture image files and several are predefined. You can control the number of occurrences of the texture on a face, the position of a texture and the scale factor of the texture. 
@@ -8276,39 +8151,467 @@ The defaults are:
  * *UScale = VScale = 1*  texture covers 100% of the face 
  
  
-@section occt_draw_20 General Fuse Algorithm commands
-
-This chapter describes existing commands of Open CASCADE Draw Test Harness that are used for debugging of General Fuse Algorithm (GFA). It is also applicable for all General Fuse based algorithms such as Boolean Operations Algorithm (BOA), Splitter Algorithm (SPA), Cells Builder Algorithm etc.
+@section occt_draw_bop Boolean Operations Commands
 
+This chapter describes existing commands of Open CASCADE Draw Test Harness that are used for performing, analyzing, debugging the algorithm in Boolean Component.
 See @ref occt_user_guides__boolean_operations "Boolean operations" user's guide for the description of these algorithms.
 
-@subsection occt_draw_20_1 Definitions
+@subsection occt_draw_bop_two Boolean Operations on two operands
+
+All commands in this section perform Boolean operations on two shapes. One of them is considered as object, and the other as a tool.
+
+@subsubsection occt_draw_bop_two_bop bop, bopfuse, bopcut, boptuc, bopcommon, bopsection
 
-The following terms and definitions are used in this document:
-* **Objects** -- list of shapes that are arguments of the algorithm.
-* **Tools** -- list of shapes that are arguments of the algorithm. Difference between Objects and Tools is defined by specific requirements of the operations (Boolean Operations, Splitting Operation).
+These commands perform Boolean operations on two shapes:
+* **bop** performs intersection of given shapes and stores the intersection results into internal Data Structure.
+* **bopfuse** creates a new shape representing the union of two shapes.
+* **bopcut** creates a new shape representing a subtraction of a second argument from the first one.
+* **boptuc** creates a new shape representing a subtraction of a first argument from the second one.
+* **bopcommon** creates a new shape representing the intersection of two shapes.
+* **bopsection** creates a new shape representing the intersection edges and vertices between shapes.
+
+These commands allow intersecting the shapes only once for building all types of Boolean operations. After *bop* command is done, the other commands in this category use the intersection results prepared by *bop*.
+It may be very useful as the intersection part is usually most time-consuming part of the operation.
+
+Syntax:      
+~~~~~
+bop shape1 shape2 
+bopcommon result 
+bopfuse result 
+bopcut result 
+boptuc result 
+~~~~~
+
+**Example:** 
+
+Let's produce all four boolean operations on a box and a cylinder performing intersection only once:
+~~~~~
+box b 0 -10 5 20 20 10 
+pcylinder c 5 20 
+
+# intersect the shape, storing results into data structure 
+bop b c 
+
+# fuse operation
+bopfuse s1 
+
+# cut operation
+bopcut s2 
+
+# opposite cut operation
+boptuc s3 
+
+# common operation
+bopcommon s4 
+
+# section operation
+bopsection s5
+~~~~~
+
+
+@subsubsection occt_draw_bop_two_bapi bfuse, bcut, btuc, bcommon, bsection
+
+These commands also perform Boolean operations on two shapes. These are the short variants of the bop* commands.
+Each of these commands performs both intersection and building the result and may be useful if you need only the result of a single boolean operation.
+
+Syntax:
+~~~~~
+bcommon result shape1 shape2 
+bfuse result shape1 shape2 
+bcut result shape1 shape2 
+btuc result shape1 shape2 
+~~~~~
+
+**bection** command has some additional options for faces intersection:
+~~~~
+bsection result shape1 shape2 [-n2d/-n2d1/-n2d2] [-na]
+
+Where:
+result - result of the operation
+shape1, shape2 - arguments of the operation
+-n2d - disables PCurve construction on both objects
+-n2d1 - disables PCurve construction on first object
+-n2d2 - disables PCurve construction on second object
+-na - disables approximation of the section curves
+~~~~
+
+@subsection occt_draw_bop_multi Boolean Operations on multiple arguments
+
+The modern Boolean Operations algorithm available in Open CASCADE Technology is capable of performing a Boolean Operations not only on two shapes, but on arbitrary number of shapes.
+In terms of Boolean Operations these arguments are divided on two groups **Objects** and **Tools**. The meaning of these groups is similar to the single object and tool of Boolean Operations on two shapes.
+
+The Boolean operations are based on the General Fuse operation (see @ref occt_algorithms_7 "General Fuse algorithm") which splits all input shapes basing on the intersection results.
+Depending on the type of Boolean operation the BOP algorithm choses the necessary splits of the arguments.
+
+@subsection occt_draw_bop_general_com General commands for working with multiple arguments
+
+The algorithms based on General Fuse operation are using the same commands for adding and clearing the arguments list and for performing intersection of these arguments.
+
+@subsubsection occt_draw_bop_general_com_add Adding arguments of operation
+
+The following commands are used to add the objects and tools for Boolean operations:
+* **baddobjects** *S1 S2...Sn* -- adds shapes *S1, S2, ... Sn* as Objects;
+* **baddtools** *S1 S2...Sn* -- adds shapes *S1, S2, ... Sn* as Tools;
+
+The following commands are used to clear the objects and tools:
+* **bclearobjects** -- clears the list of Objects;
+* **bcleartools**      -- clears the list of Tools;
+
+So, when running subsequent operation in one Draw session, make sure you cleared the Objects and Tools from previous operation. Otherwise, the new arguments will be added to the current ones.
+
+@subsubsection occt_draw_bop_general_com_fill Intersection of the arguments
+
+The command **bfillds** performs intersection of the arguments (**Objects** and **Tools**) and stores the intersection results into internal Data Structure.
+
+
+@subsection occt_draw_bop_build Building the result of operations
+
+@subsubsection occt_draw_bop_build_BOP Boolean operation
+
+The command **bbop** is used for building the result of Boolean Operation. It has to be used after **bfillds** command.
+
+Syntax:
+~~~~
+bbop result iOp
+
+Where:
+result - result of the operation
+iOp - type of Boolean Operation. It could have the following values:
+0 - COMMON operation
+1 - FUSE operation
+2 - CUT operation
+3 - CUT21 (opposite CUT, i.e. objects and tools are swapped) operation
+4 - SECTION operation
+~~~~
+
+**Example**
+~~~~
+box b1 10 10 10
+box b2 5 5 5 10 10 10
+box b3 -5 -5 -5 10 10 10
+
+# Clear objects and tools from previous runs
+bclearobjects
+bcleartools
+# add b1 as object
+baddobjects b1
+# add b2 and b3 as tools
+baddtools b2 b3
+# perform intersection
+bfillds
+# build result
+bbop rcom 0
+bbop rfuse 1
+bbop rcut 2
+bbop rtuc 3
+bbop rsec 4
+~~~~
+
+@subsubsection occt_draw_bop_build_GF General Fuse operation
+
+The command **bbuild** is used for building the result of General Fuse Operation. It has to be used after **bfillds** command.
+General Fuse operation does not make the difference between Objects and Tools considering both as objects.
+
+Syntax:
+~~~~
+bbuild result
+~~~~
+**Example**
+~~~~
+box b1 10 10 10
+box b2 5 5 5 10 10 10
+box b3 -5 -5 -5 10 10 10
+
+# Clear objects and tools from previous runs
+bclearobjects
+bcleartools
+# add b1 as object
+baddobjects b1
+# add b2 and b3 as tools
+baddtools b2 b3
+# perform intersection
+bfillds
+# build result
+bbuild result
+~~~~
+
+@subsubsection occt_draw_bop_build_Split Split operation
+
+Split operation splits the **Objects** by the **Tools**.
+The command **bsplit** is used for building the result of Split operation. It has to be used after **bfillds** command.
+
+**Example**
+~~~~
+box b1 10 10 10
+box b2 5 5 5 10 10 10
+box b3 -5 -5 -5 10 10 10
+
+# Clear objects and tools from previous runs
+bclearobjects
+bcleartools
+# add b1 as object
+baddobjects b1
+# add b2 and b3 as tools
+baddtools b2 b3
+# perform intersection
+bfillds
+# build result
+bsplit result
+~~~~
+
+@subsubsection occt_draw_bop_build_CB Cells Builder
+
+Please see the @ref occt_algorithms_10c_Cells_1 "Cells Builder Usage" for the Draw usage of Cells Builder algorithm.
+
+
+@subsubsection occt_draw_bop_build_API Building result through API
+
+The following commands are used to perform the operation using API implementation of the algorithms:
+* **bapibuild** -- to perform API general fuse operation.
+* **bapibop** -- to perform API Boolean operation.
+* **bapisplit** -- to perform API Split operation.
+
+These commands have the same syntax as the analogical commands described above.
+
+
+@subsection occt_draw_bop_options Setting options for the operation
+
+The algorithms in Boolean component have a wide range of options.
+To see the current state of all option the command **boptions** should be used.
+It has the following syntax:
+~~~~
+boptions [-default]
+
+-default - allows to set all options to default state.
+~~~~
+
+To have an effect the options should be set before the operation (before *bfillds* command).
+
+@subsubsection occt_draw_bop_options_par Parallel processing mode
+
+**brunparallel** command enables/disables the parallel processing mode of the operation.
+
+Syntax:
+~~~~
+brunparallel flag
+
+Where:
+flag is the boolean flag controlling the mode:
+flag == 0 - parallel processing mode is off.
+flag != 0 - parallel processing mode is on.
+~~~~
+
+The command is applicable for all commands in the component.
+
+@subsubsection occt_draw_bop_options_safe Safe processing mode
+
+**bnondestructive** command enables/disables the safe processing mode in which the input arguments are protected from modification.
+
+Syntax:
+~~~~
+bnondestructive flag
+
+Where:
+flag is the boolean flag controlling the mode:
+flag == 0 - safe processing mode is off.
+flag != 0 - safe processing mode is on.
+~~~~
+
+The command is applicable for all commands in the component.
+
+@subsubsection occt_draw_bop_options_fuzzy Fuzzy option
+
+**bfuzzyvalue** command sets the additional tolerance for operations.
+
+Syntax:
+~~~~
+bfuzzyvalue value
+~~~~
+
+The command is applicable for all commands in the component.
+
+@subsubsection occt_draw_bop_options_glue Gluing option
+
+**bglue** command sets the gluing mode for the BOP algorithms.
+
+Syntax:
+~~~~
+bglue 0/1/2
+
+Where:
+0 - disables gluing mode.
+1 - enables the Shift gluing mode.
+2 - enables the Full gluing mode.
+~~~~
+
+The command is applicable for all commands in the component.
+
+@subsubsection occt_draw_bop_options_checkinv Check inversion of input solids
+
+**bcheckinverted** command enables/disables the check of the input solids on inverted status in BOP algorithms.
+
+Syntax:
+~~~~
+bcheckinverted 0 (off) / 1 (on)
+~~~~
+
+The command is applicable for all commands in the component.
+
+@subsubsection occt_draw_bop_options_obb OBB usage
+
+**buseobb** commannd enables/disables the usage of OBB in BOP algorithms.
+
+Syntax:
+~~~~
+buseobb 0 (off) / 1 (on)
+~~~~
+
+The command is applicable for all commands in the component.
+
+@subsubsection occt_draw_bop_options_simplify Result simplification
+
+**bsimplify** command enables/disables the result simplification after BOP. The command is applicable only to the API variants of GF, BOP and Split operations.
+
+Syntax:
+~~~~
+bsimplify [-e 0/1] [-f 0/1] [-a tol]
+
+Where:
+-e 0/1 - enables/disables edges unification
+-f 0/1 - enables/disables faces unification
+-a tol - changes default angular tolerance of unification algo.
+~~~~
+
+@subsubsection occt_draw_bop_options_warn Drawing warning shapes
+
+**bdrawwarnshapes** command enables/disables drawing of waring shapes of BOP algorithms.
+
+Syntax:
+~~~~
+bdrawwarnshapes 0 (do not draw) / 1 (draw warning shapes)
+~~~~
+
+The command is applicable for all commands in the component.
+
+
+@subsection occt_draw_bop_check Check commands
+
+The following commands are analyzing the given shape on the validity of Boolean operation.
+
+@subsubsection occt_draw_bop_check_1 bopcheck
+
+Syntax:
+~~~~
+bopcheck shape [level of check: 0 - 9]
+~~~~
+
+It checks the given shape for self-interference. The optional level of check allows limiting the check to certain intersection types. Here are the types of interferences that will be checked for given level of check:
+* 0 - only V/V;
+* 1 - V/V and V/E;
+* 2 - V/V, V/E and E/E;
+* 3 - V/V, V/E, E/E and V/F;
+* 4 - V/V, V/E, E/E, V/F and E/F;
+* 5 - V/V, V/E, E/E, V/F, E/F and F/F;
+* 6 - V/V, V/E, E/E, V/F, E/F, F/F and V/S;
+* 7 - V/V, V/E, E/E, V/F, E/F, F/F, V/S and E/S;
+* 8 - V/V, V/E, E/E, V/F, E/F, F/F, V/S, E/S and F/S;
+* 9 - V/V, V/E, E/E, V/F, E/F, F/F, V/S, E/S, F/S and S/S - all interferences (Default value)
+
+**Example:**
+~~~~
+box b1 10 10 10
+box b2 3 3 3 4 4 4
+compound b1 b2 c
+bopcheck c
+~~~~
+
+In this example one box is completely included into other box. So the output shows that all sub-shapes of b2 interfering with the solid b1.
+**bopcheck** command does not modifies the input shape, thus can be safely used.
+
+
+@subsubsection occt_draw_bop_check_2 bopargcheck
+
+**bopargcheck** syntax:
+~~~~
+bopargcheck Shape1 [[Shape2] [-F/O/C/T/S/U] [/R|F|T|V|E|I|P|C|S]] [#BF]
+
+ -<Boolean Operation>
+ F (fuse)
+ O (common)
+ C (cut)
+ T (cut21)
+ S (section)
+ U (unknown)
+ For example: "bopargcheck s1 s2 -F" enables checking for Fuse operation
+ default - section
+
+ /<Test Options>
+ R (disable small edges (shrank range) test)
+ F (disable faces verification test)
+ T (disable tangent faces searching test)
+ V (disable test possibility to merge vertices)
+ E (disable test possibility to merge edges)
+ I (disable self-interference test)
+ P (disable shape type test)
+ C (disable test for shape continuity)
+ S (disable curve on surface check)
+ For example: "bopargcheck s1 s2 /RI" disables small edge detection and self-intersection detection
+ default - all options are enabled
+
+ #<Additional Test Options>
+ B (stop test on first faulty found); default OFF
+ F (full output for faulty shapes); default - output in a short format
+
+ NOTE: <Boolean Operation> and <Test Options> are used only for couple of argument shapes, except I and P options that are always used for couple of shapes as well as for single shape test.
+~~~~
+
+As you can see *bopargcheck* performs more extended check of the given shapes than *bopcheck*.
+
+**Example:**
+Let's make an edge with big vertices:
+~~~~
+vertex v1 0 0 0
+settolerance v1 0.5
+vertex v2 1 0 0
+settolerance v2 0.5
+edge e v1 v2
+top; don e; fit
+tolsphere e
+
+bopargcheck e
+~~~~
+Here is the output of this command:
+~~~~
+Made faulty shape: s1si_1
+Made faulty shape: s1se_1
+Faulties for FIRST  shape found : 2
+---------------------------------
+Shapes are not suppotrted by BOP: NO
+Self-Intersections              : YES  Cases(1)  Total shapes(2)
+Check for SI has been aborted   : NO
+Too small edges                 : YES  Cases(1)  Total shapes(1)
+Bad faces                       : NO
+Too close vertices              : DISABLED
+Too close edges                 : DISABLED
+Shapes with Continuity C0       : NO
+Invalid Curve on Surface        : NO
+
+Faulties for SECOND  shape found : 0
+~~~~
+
+@subsection occt_draw_bop_debug Debug commands
+
+The following terms and definitions are used in this chapter:
 * **DS** -- internal data structure used by the algorithm (*BOPDS_DS* object).
 * **PaveFiller** -- intersection part of the algorithm (*BOPAlgo_PaveFiller* object).
 * **Builder** -- builder part of the algorithm (*BOPAlgo_Builder* object).
 * **IDS Index** -- the index of the vector *myLines*.
 
-@subsection occt_draw_20_2 General commands
-
-* **bclearobjects** -- clears the list of Objects;     
-* **bcleartools**      -- clears the list of Tools;    
-* **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 (General Fuse operation); *r* is the resulting shape;
-* **bsplit** *r* -- performs the Splitting 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);
-* **bcbuild** *rx* -- performs initialization of the *Cells Builder* algorithm (see @ref occt_algorithms_10c_Cells_1 "Usage of the Cells Builder algorithm" for more details).
-
-@subsection occt_draw_20_3 Commands for Intersection Part
+@subsubsection occt_draw_bop_debug_int Intersection Part commands
 
 All commands listed below  are available when the Intersection Part of the algorithm is done (i.e. after the command *bfillds*).
 
-@subsubsection occt_draw_20_3_1 bopds
+**bopds**
        
 Syntax: 
 ~~~~
@@ -8321,12 +8624,11 @@ Displays:
 * <i>-e</i> : only edges of arguments that are in the DS;
 * <i>-f</i> : only faces of arguments that are in the DS.
 
-@subsubsection occt_draw_20_3_2 bopdsdump
+**bopdsdump**
 
 Prints contents of the DS. 
 
 Example:
-
 ~~~~
  Draw[28]> bopdsdump
  *** DS ***
@@ -8350,7 +8652,8 @@ Example:
 * *SOLID* -- type of the shape;
 * <i>{ 1 }</i> -- a DS index of the successors.
 
-@subsubsection occt_draw_20_3_3 bopindex
+
+**bopindex**
 
 Syntax:
 ~~~~
@@ -8358,7 +8661,8 @@ bopindex S
 ~~~~
 Prints DS index of shape *S*.
 
-@subsubsection occt_draw_20_3_4 bopiterator
+
+**bopiterator**
 
 Syntax:
 ~~~~~
@@ -8387,7 +8691,7 @@ Example:
 * *z58 z12* -- DS indices of intersecting edge and face.
 
 
-@subsubsection occt_draw_20_3_5 bopinterf
+**bopinterf**
 
 Syntax: 
 ~~~~
@@ -8412,7 +8716,8 @@ Here, record <i>(58, 12, 68)</i> means:
 * *12* -- a DS index of the face;
 * *68* -- a DS index of the new vertex.
 
-@subsubsection occt_draw_20_3_6 bopsp  
+
+**bopsp**
 
 Displays split edges. 
 
@@ -8430,7 +8735,7 @@ Example:
 * *edge 58* -- 58 is a DS index of the original edge.
 * *z58_74 z58_75* -- split edges, where 74, 75 are DS indices of the split edges.
 
-@subsubsection occt_draw_20_3_7 bopcb
+**bopcb**
 
 Syntax:
 ~~~~
@@ -8459,10 +8764,9 @@ This command dumps common blocks for the source edge with index 17.
 * *Faces: 36* -- 36 is a DS index of the face the common block belongs to. 
 
 
-@subsubsection occt_draw_20_3_8 bopfin
+**bopfin**
 
 Syntax:
-
 ~~~~
 bopfin nF      
 ~~~~
@@ -8482,7 +8786,7 @@ Example:
 * <i>PB:{ E:71 orE:17 Pave1: { 68 3.000 } Pave2: { 18 10.000 } }</i> -- information about the Pave Block; 
 * <i>vrts In ... 18 </i> -- a DS index of the vertex IN the face.
 
-@subsubsection occt_draw_20_3_9 bopfon
+**bopfon**
 
 Syntax:
 ~~~~
@@ -8505,7 +8809,7 @@ Example:
 * <i>PB:{ E:72 orE:38 Pave1: { 69 0.000 } Pave2: { 68 10.000 } }</i> -- information about the Pave Block; 
 * <i>vrts On: ... 68 69 70 71</i> -- DS indices of the vertices ON the face.
 
-@subsubsection occt_draw_20_3_10 bopwho
+**bopwho**
 
 Syntax:
 ~~~~
@@ -8536,7 +8840,7 @@ This means that shape 68 is a result of the following interferences:
 * *FF curves: (12, 56)* -- edge from the intersection curve between faces 12 and 56
 * *FF curves: (12, 64)* -- edge from the intersection curve between faces 12 and 64
 
-@subsubsection occt_draw_20_3_11 bopnews
+**bopnews**
 
 Syntax:
 ~~~~
@@ -8546,14 +8850,13 @@ bopnews -v [-e]
 * <i>-v</i> -- displays all new vertices produced during the operation;
 * <i>-e</i> -- displays all new edges produced during the operation.
 
-@subsection occt_draw_20_4     Commands for the Building Part
+@subsubsection occt_draw_bop_debug_build Building Part commands
 
 The commands listed below are available when the Building Part of the algorithm is done (i.e. after the command *bbuild*).
 
-@subsubsection occt_draw_20_4_1 bopim
+**bopim**
 
 Syntax: 
-
 ~~~~
 bopim S
 ~~~~
index 5827c0c..e9f0003 100644 (file)
@@ -2055,7 +2055,7 @@ TopoDS_Solid R2 = BRepPrimAPI_MakeRevol(F,axis,ang);
 
 @section occt_modalg_5 Boolean  Operations
 
-Boolean operations are  used to create new shapes from the combinations of two shapes. 
+Boolean operations are used to create new shapes from the combinations of two groups of shapes.
 
 | Operation | Result |
 | :---- | :------ |
@@ -3172,7 +3172,7 @@ and the options available from base class (*BOPAlgo_Options*):
 
 Note that the other options of the base class are not supported here and will have no effect.
 
-<b>History support</b> allows tracking modification of the input shape in terms of Modified, IsDeleted and Generated. By default, the history is collected, but it is possible to disable it using the method *TrackHistory(false)*.
+<b>History support</b> allows tracking modification of the input shape in terms of Modified, IsDeleted and Generated. By default, the history is collected, but it is possible to disable it using the method *SetToFillHistory(false)*.
 On the low-level the history information is collected by the history tool *BRepTools_History*, which can be accessed through the method *BOPAlgo_RemoveFeatures::History()*. 
 
 <b>Error/Warning reporting system</b> allows obtaining the extended overview of the Errors/Warnings occurred during the operation. As soon as any error appears, the algorithm stops working. The warnings allow continuing the job and informing the user that something went wrong. The algorithm returns the following errors/warnings:
@@ -3216,7 +3216,7 @@ BRepAlgoAPI_Defeaturing aDF;             // Defeaturing algorithm
 aDF.SetShape(aSolid);                    // Set the shape
 aDF.AddFacesToRemove(aFaces);            // Add faces to remove
 aDF.SetRunParallel(bRunParallel);        // Define the processing mode (parallel or single)
-aDF.TrackHistory(isHistoryNeeded);       // Define whether to track the shapes modifications
+aDF.SetToFillHistory(isHistoryNeeded);   // Define whether to track the shapes modifications
 aDF.Build();                             // Perform the operation
 if (!aDF.IsDone())                       // Check for the errors
 {
index 249519d..c986f6a 100644 (file)
@@ -95,7 +95,7 @@ BOPAlgo_Builder::~BOPAlgo_Builder()
 //=======================================================================
 void BOPAlgo_Builder::Clear()
 {
-  BOPAlgo_Algo::Clear();
+  BOPAlgo_BuilderShape::Clear();
   myArguments.Clear();
   myMapFence.Clear();
   myImages.Clear();
@@ -167,7 +167,6 @@ void BOPAlgo_Builder::Prepare()
   // 1. myShape is empty compound
   aBB.MakeCompound(aC);
   myShape=aC;
-  myFlagHistory=Standard_True;
 }
 //=======================================================================
 //function : Perform
index 6b8cadc..c9bdc77 100644 (file)
@@ -174,21 +174,10 @@ public: //! @name Performing the operation
   Standard_EXPORT virtual void PerformWithFiller (const BOPAlgo_PaveFiller& theFiller);
 
 
-public: //! @name History methods
-
-  //! Returns the  list of shapes generated from the shape theS.
-  Standard_EXPORT virtual const TopTools_ListOfShape& Generated (const TopoDS_Shape& theS) Standard_OVERRIDE;
-
-  //! Returns the list of shapes modified from the shape theS.
-  Standard_EXPORT virtual const TopTools_ListOfShape& Modified (const TopoDS_Shape& theS) Standard_OVERRIDE;
-
-  //! Returns true if the shape theS has been deleted.
-  Standard_EXPORT virtual Standard_Boolean IsDeleted (const TopoDS_Shape& theS) Standard_OVERRIDE;
-
 protected: //! @name History methods
 
   //! Prepare information for history support.
-  Standard_EXPORT virtual void PrepareHistory() Standard_OVERRIDE;
+  Standard_EXPORT void PrepareHistory();
 
   //! Prepare history information for the input shapes taking into account possible
   //! operation-specific modifications.
@@ -209,6 +198,10 @@ protected: //! @name History methods
   //! Thus, here the method returns only splits (if any) contained in this map.
   Standard_EXPORT virtual const TopTools_ListOfShape* LocModified(const TopoDS_Shape& theS);
 
+  //! Returns the list of shapes generated from the shape theS.
+  //! Similarly to *LocModified* must be redefined for specific operations,
+  //! obtaining Generated elements differently.
+  Standard_EXPORT virtual const TopTools_ListOfShape& LocGenerated(const TopoDS_Shape& theS);
 
 public: //! @name Images/Origins
 
diff --git a/src/BOPAlgo/BOPAlgo_BuilderShape.cxx b/src/BOPAlgo/BOPAlgo_BuilderShape.cxx
deleted file mode 100644 (file)
index f6b4876..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-// Created by: Peter KURNEV
-// Copyright (c) 2010-2014 OPEN CASCADE SAS
-// Copyright (c) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
-// Copyright (c) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT,
-//                         EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// 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_BuilderShape.hxx>
-#include <TopoDS_Shape.hxx>
-
-//=======================================================================
-//function : 
-//purpose  : 
-//=======================================================================
-  BOPAlgo_BuilderShape::BOPAlgo_BuilderShape()
-:
-  BOPAlgo_Algo()
-{
-  myHasDeleted=Standard_False;
-  myHasGenerated=Standard_False;
-  myHasModified=Standard_False;
-  myFlagHistory=Standard_False;
-}
-//=======================================================================
-//function : 
-//purpose  : 
-//=======================================================================
-  BOPAlgo_BuilderShape::BOPAlgo_BuilderShape(const Handle(NCollection_BaseAllocator)& theAllocator)
-:
-  BOPAlgo_Algo(theAllocator)
-{
-  myHasDeleted=Standard_False;
-  myHasGenerated=Standard_False;
-  myHasModified=Standard_False;
-  myFlagHistory=Standard_False;
-}
-//=======================================================================
-//function : ~
-//purpose  : 
-//=======================================================================
-  BOPAlgo_BuilderShape::~BOPAlgo_BuilderShape()
-{
-}
-//=======================================================================
-//function : Shape
-//purpose  : 
-//=======================================================================
-  const TopoDS_Shape& BOPAlgo_BuilderShape::Shape() const
-{
-  return myShape;
-}
-//
-//=======================================================================
-//function : Generated
-//purpose  : 
-//=======================================================================
-  const TopTools_ListOfShape& BOPAlgo_BuilderShape::Generated(const TopoDS_Shape& )
-{
-  myHistShapes.Clear();
-  return myHistShapes;
-}
-//=======================================================================
-//function : Modified
-//purpose  : 
-//=======================================================================
-  const TopTools_ListOfShape& BOPAlgo_BuilderShape::Modified(const TopoDS_Shape& )
-{
-  myHistShapes.Clear();
-  return myHistShapes;
-}
-//=======================================================================
-//function : IsDeleted
-//purpose  : 
-//=======================================================================
-  Standard_Boolean BOPAlgo_BuilderShape::IsDeleted(const TopoDS_Shape& theS)
-{
-  Standard_Boolean bRet;
-  //
-  bRet=!myMapShape.Contains(theS);
-  return bRet;  
-}
-//=======================================================================
-//function : HasDeleted
-//purpose  : 
-//=======================================================================
-  Standard_Boolean BOPAlgo_BuilderShape::HasDeleted()const
-{
-  return myHasDeleted;
-}
-//=======================================================================
-//function : HasGenerated
-//purpose  : 
-//=======================================================================
-  Standard_Boolean BOPAlgo_BuilderShape::HasGenerated()const
-{
-  return myHasGenerated;
-}
-//=======================================================================
-//function : HasModified
-//purpose  : 
-//=======================================================================
-  Standard_Boolean BOPAlgo_BuilderShape::HasModified()const
-{
-  return myHasModified;
-}
-//=======================================================================
-//function : PrepareHistory
-//purpose  : 
-//=======================================================================
-  void BOPAlgo_BuilderShape::PrepareHistory()
-{
-  myHistShapes.Clear();
-  myMapShape.Clear();
-  myImagesResult.Clear();
-  myHasDeleted=Standard_False;
-  myHasGenerated=Standard_False;
-  myHasModified=Standard_False;
-  myFlagHistory=Standard_False;
-}
-
-//=======================================================================
-//function : ImagesResult
-//purpose  : 
-//=======================================================================
-  const TopTools_IndexedDataMapOfShapeListOfShape& 
-    BOPAlgo_BuilderShape::ImagesResult()const
-{
-  return myImagesResult;
-}
-
index 10acdef..ffdf8b1 100644 (file)
 #include <Standard.hxx>
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Handle.hxx>
-#include <Standard_Boolean.hxx>
 
 #include <BOPAlgo_Algo.hxx>
+#include <BRepTools_History.hxx>
+
+#include <Standard_Boolean.hxx>
+
 #include <NCollection_BaseAllocator.hxx>
 #include <TopoDS_Shape.hxx>
 #include <TopTools_ListOfShape.hxx>
 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
 class TopoDS_Shape;
 
-
-//! Root class for algorithms that has shape as result.<br>
+//! Root class for algorithms that has shape as result.
+//!
 //! The class provides the History mechanism, which allows
 //! tracking the modification of the input shapes during
-//! the operation.
-class BOPAlgo_BuilderShape  : public BOPAlgo_Algo
+//! the operation. It uses the *BRepTools_History* tool
+//! as a storer for history objects.
+class BOPAlgo_BuilderShape : public BOPAlgo_Algo
 {
 public:
 
   DEFINE_STANDARD_ALLOC
 
-  
+public: //! @name Getting the result
+
   //! Returns the result of algorithm
-  Standard_EXPORT const TopoDS_Shape& Shape() const;
-  
-  //! Returns the list of shapes generated from the
-  //! shape theS.
-  Standard_EXPORT virtual const TopTools_ListOfShape& Generated (const TopoDS_Shape& theS);
-  
-  //! Returns the list of shapes modified from the
-  //! shape theS.
-  Standard_EXPORT virtual const TopTools_ListOfShape& Modified (const TopoDS_Shape& theS);
-  
+  const TopoDS_Shape& Shape() const { return myShape; }
+
+
+public: //! @name History methods
+
+  //! Returns the list of shapes Modified from the shape theS.
+  const TopTools_ListOfShape& Modified(const TopoDS_Shape& theS)
+  {
+    if (myFillHistory && myHistory)
+      return myHistory->Modified(theS);
+    myHistShapes.Clear();
+    return myHistShapes;
+  }
+
+  //! Returns the list of shapes Generated from the shape theS.
+  const TopTools_ListOfShape& Generated(const TopoDS_Shape& theS)
+  {
+    if (myFillHistory && myHistory)
+      return myHistory->Generated(theS);
+    myHistShapes.Clear();
+    return myHistShapes;
+  }
+
   //! Returns true if the shape theS has been deleted.
-  Standard_EXPORT virtual Standard_Boolean IsDeleted (const TopoDS_Shape& theS);
-  
-  //! Returns true if the at least one shape(or subshape)
-  //! of arguments has been deleted.
-  Standard_EXPORT Standard_Boolean HasDeleted() const;
-  
-  //! Returns true if the at least one shape(or subshape)
-  //! of arguments has generated shapes.
-  Standard_EXPORT Standard_Boolean HasGenerated() const;
-  
-  //! Returns true if the at least one shape(or subshape)
-  //! of arguments has modified shapes.
-  Standard_EXPORT Standard_Boolean HasModified() const;
-  
-  Standard_EXPORT const TopTools_IndexedDataMapOfShapeListOfShape& ImagesResult() const;
-
-
-
-
-protected:
-
-  
-  Standard_EXPORT BOPAlgo_BuilderShape();
-Standard_EXPORT virtual ~BOPAlgo_BuilderShape();
-  
-  Standard_EXPORT BOPAlgo_BuilderShape(const Handle(NCollection_BaseAllocator)& theAllocator);
-  
-  //! Prepare information for history support
-  Standard_EXPORT virtual void PrepareHistory();
-
-
-  TopoDS_Shape myShape;
-  TopTools_ListOfShape myHistShapes;
-  TopTools_MapOfShape myMapShape;
-  Standard_Boolean myHasDeleted;
-  Standard_Boolean myHasGenerated;
-  Standard_Boolean myHasModified;
-  TopTools_IndexedDataMapOfShapeListOfShape myImagesResult;
-  Standard_Boolean myFlagHistory;
-
-private:
+  //! In this case the shape will have no Modified elements,
+  //! but can have Generated elements.
+  Standard_Boolean IsDeleted(const TopoDS_Shape& theS)
+  {
+    return (myFillHistory && myHistory ? myHistory->IsRemoved(theS) : Standard_False);
+  }
+
+  //! Returns true if any of the input shapes has been modified during operation.
+  Standard_Boolean HasModified() const
+  {
+    return (myFillHistory && myHistory ? myHistory->HasModified() : Standard_False);
+  }
+
+  //! Returns true if any of the input shapes has generated shapes during operation.
+  Standard_Boolean HasGenerated() const
+  {
+    return (myFillHistory && myHistory ? myHistory->HasGenerated() : Standard_False);
+  }
+
+  //! Returns true if any of the input shapes has been deleted during operation.
+  Standard_Boolean HasDeleted() const
+  {
+    return (myFillHistory && myHistory ? myHistory->HasRemoved() : Standard_False);
+  }
+
+  //! History Tool
+  Handle(BRepTools_History) History() const
+  {
+    return myFillHistory ? myHistory : NULL;
+  }
+
+public: //! @name Enabling/Disabling the history collection.
+
+  //! Allows disabling the history collection
+  void SetToFillHistory(const Standard_Boolean theHistFlag) { myFillHistory = theHistFlag; }
+
+  //! Returns flag of history availability
+  Standard_Boolean HasHistory() const { return myFillHistory; }
+
+protected: //! @name Constructors
+
+  //! Empty constructor
+  BOPAlgo_BuilderShape()
+  :
+    BOPAlgo_Algo(),
+    myFillHistory(Standard_True)
+  {}
+
+  //! Constructor with allocator
+  BOPAlgo_BuilderShape(const Handle(NCollection_BaseAllocator)& theAllocator)
+  :
+    BOPAlgo_Algo(theAllocator),
+    myFillHistory(Standard_True)
+  {}
+
+
+protected: //! @name Clearing
+
+  //! Clears the content of the algorithm.
+  virtual void Clear() Standard_OVERRIDE
+  {
+    BOPAlgo_Algo::Clear();
+    myHistory.Nullify();
+    myMapShape.Clear();
+  }
+
+protected: //! @name Fields
+
+  TopoDS_Shape myShape; //!< Result of the operation
+
+  TopTools_ListOfShape myHistShapes;   //!< Storer for the history shapes
+  TopTools_MapOfShape myMapShape;      //!< Cashed map of all arguments shapes
+
+  Standard_Boolean myFillHistory;      //!< Controls the history filling
+  Handle(BRepTools_History) myHistory; //!< History tool
 
 };
 
index a67801f..d592493 100644 (file)
 #include <BOPAlgo_Builder.hxx>
 #include <BOPDS_DS.hxx>
 #include <BOPTools_AlgoTools.hxx>
-#include <BOPTools_AlgoTools3D.hxx>
-#include <IntTools_Context.hxx>
 #include <TopExp.hxx>
-#include <TopoDS_Iterator.hxx>
 #include <TopoDS_Shape.hxx>
 #include <TopTools_ListOfShape.hxx>
 #include <TopTools_MapOfShape.hxx>
 
 //=======================================================================
-//function : Generated
+//function : LocGenerated
 //purpose  : 
 //=======================================================================
-const TopTools_ListOfShape& BOPAlgo_Builder::Generated
+const TopTools_ListOfShape& BOPAlgo_Builder::LocGenerated
   (const TopoDS_Shape& theS)
 {
   // The rules for Generated shapes are these:
@@ -43,9 +40,6 @@ const TopTools_ListOfShape& BOPAlgo_Builder::Generated
 
   myHistShapes.Clear();
 
-  if (!myHasGenerated)
-    return myHistShapes;
-
   if (theS.IsNull())
     return myHistShapes;
 
@@ -141,72 +135,6 @@ const TopTools_ListOfShape& BOPAlgo_Builder::Generated
   return myHistShapes;
 }
 //=======================================================================
-//function : Modified
-//purpose  : 
-//=======================================================================
-const TopTools_ListOfShape& BOPAlgo_Builder::Modified
-  (const TopoDS_Shape& theS)
-{
-  myHistShapes.Clear();
-
-  if (!myHasModified)
-    // No modified elements
-    return myHistShapes;
-
-  const TopTools_ListOfShape* pLSp = myImagesResult.Seek(theS);
-  if (!pLSp || pLSp->IsEmpty())
-    // No track in the result -> no modified
-    return myHistShapes;
-
-  // For modification check if the shape is not linked to itself
-  if (pLSp->Extent() == 1)
-  {
-    if (theS.IsSame(pLSp->First()) && !myImages.IsBound(theS))
-      // Shape is not modified
-      return myHistShapes;
-  }
-
-  // Iterate on all splits and save them with proper orientation into the result list
-  TopTools_ListIteratorOfListOfShape aIt(*pLSp);
-  for (; aIt.More(); aIt.Next())
-  {
-    TopoDS_Shape aSp = aIt.Value();
-    // Use the orientation of the input shape
-    TopAbs_ShapeEnum aType = aSp.ShapeType();
-    if (aType == TopAbs_VERTEX || aType == TopAbs_SOLID)
-      aSp.Orientation(theS.Orientation());
-    else if (BOPTools_AlgoTools::IsSplitToReverse(aSp, theS, myContext))
-      aSp.Reverse();
-
-    myHistShapes.Append(aSp);
-  }
-
-  return myHistShapes;
-}
-//=======================================================================
-//function : IsDeleted
-//purpose  : 
-//=======================================================================
-Standard_Boolean BOPAlgo_Builder::IsDeleted(const TopoDS_Shape& theS)
-{
-  // The shape is considered as Deleted if it has participated in the
-  // operation and the result shape does not contain the shape itself
-  // and none of its splits.
-
-  if (!myHasDeleted)
-    // Non of the shapes have been deleted during the operation
-    return Standard_False;
-
-  const TopTools_ListOfShape *pImages = myImagesResult.Seek(theS);
-  if (!pImages)
-    // No track about the shape, i.e. the shape has not participated
-    // in operation -> Not deleted
-    return Standard_False;
-
-  // Check if any parts of the shape has been kept in the result
-  return pImages->IsEmpty();
-}
-//=======================================================================
 //function : LocModified
 //purpose  : 
 //=======================================================================
@@ -220,91 +148,72 @@ const TopTools_ListOfShape* BOPAlgo_Builder::LocModified(const TopoDS_Shape& the
 //=======================================================================
 void BOPAlgo_Builder::PrepareHistory()
 {
-  if (!myFlagHistory)
-  {
-    // Clearing
-    BOPAlgo_BuilderShape::PrepareHistory();
+  if (!HasHistory())
     return;
-  }
 
-  // Clearing from previous operations
-  BOPAlgo_BuilderShape::PrepareHistory();
-  myFlagHistory = Standard_True;
+  // Initializing history tool
+  myHistory = new BRepTools_History;
 
   // Map the result shape
+  myMapShape.Clear();
   TopExp::MapShapes(myShape, myMapShape);
 
-  // Among all input shapes find those that have any trace in the result
-  // and save them into myImagesResult map with connection to parts
-  // kept in the result shape. If the input shape has no trace in the
-  // result shape, link it to the empty list in myImagesResult meaning
-  // that the shape has been removed.
-  //
-  // Also, set the proper values to the history flags:
-  // - myHasDeleted for Deleted shapes;
-  // - myHasModified for Modified shapes;
-  // - myHasGenerated for Generated shapes.
+  // Among all input shapes find:
+  // - Shapes that have been modified (split). Add the splits kept in the result
+  //   shape as Modified from the shape;
+  // - Shapes that have created new geometries (i.e. generated new shapes). Add
+  //   the generated elements kept in the result shape as Generated from the shape;
+  // - Shapes that have no trace in the result shape. Add them as Deleted
+  //   during the operation.
   Standard_Integer aNbS = myDS->NbSourceShapes();
   for (Standard_Integer i = 0; i < aNbS; ++i)
   {
     const TopoDS_Shape& aS = myDS->Shape(i);
 
-    // History information is only available for the shapes of type
-    // VERTEX, EDGE, FACE and SOLID. Skip all shapes of different type.
-    TopAbs_ShapeEnum aType = aS.ShapeType();
-    if (!(aType == TopAbs_VERTEX ||
-          aType == TopAbs_EDGE   ||
-          aType == TopAbs_FACE   ||
-          aType == TopAbs_SOLID))
+    // Check if History information is available for this kind of shape.
+    if (!BRepTools_History::IsSupportedType(aS))
       continue;
 
-    // Track the modification of the shape
-    TopTools_ListOfShape* pImages = &myImagesResult(myImagesResult.Add(aS, TopTools_ListOfShape()));
+    Standard_Boolean isModified = Standard_False;
 
     // Check if the shape has any splits
     const TopTools_ListOfShape* pLSp = LocModified(aS);
-    if (!pLSp)
-    {
-      // No splits, check if the result shape contains the shape itself
-      if (myMapShape.Contains(aS))
-        // Shape has passed into result without modifications -> link the shape to itself
-        pImages->Append(aS);
-      else
-        // No trace of the shape in the result -> Deleted element is found
-        myHasDeleted = Standard_True;
-    }
-    else
+    if (pLSp)
     {
       // Find all splits of the shape which are kept in the result
       TopTools_ListIteratorOfListOfShape aIt(*pLSp);
       for (; aIt.More(); aIt.Next())
       {
-        const TopoDS_Shape& aSp = aIt.Value();
-
+        TopoDS_Shape aSp = aIt.Value();
         // Check if the result shape contains the split
         if (myMapShape.Contains(aSp))
         {
-          // Link the shape to the split
-          pImages->Append(aSp);
+          // Add modified shape with proper orientation
+          TopAbs_ShapeEnum aType = aSp.ShapeType();
+          if (aType == TopAbs_VERTEX || aType == TopAbs_SOLID)
+            aSp.Orientation(aS.Orientation());
+          else if (BOPTools_AlgoTools::IsSplitToReverse(aSp, aS, myContext))
+            aSp.Reverse();
+
+          myHistory->AddModified(aS, aSp);
+          isModified = Standard_True;
         }
       }
-
-      if (!pImages->IsEmpty())
-        // Modified element is found
-        myHasModified = Standard_True;
-      else
-        // Deleted element is found
-        myHasDeleted = Standard_True;
     }
 
-    // Until first found, check if the shape has Generated elements
-    if (!myHasGenerated)
+    // Check if the shape has Generated elements
+    const TopTools_ListOfShape& aGenShapes = LocGenerated(aS);
+    TopTools_ListIteratorOfListOfShape aIt(aGenShapes);
+    for (; aIt.More(); aIt.Next())
     {
-      // Temporarily set the HasGenerated flag to TRUE to look for the shapes generated from aS.
-      // Otherwise, the method Generated will always be returning an empty list, assuming that the
-      // operation has no generated elements at all.
-      myHasGenerated = Standard_True;
-      myHasGenerated = (Generated(aS).Extent() > 0);
+      const TopoDS_Shape& aG = aIt.Value();
+      if (myMapShape.Contains(aG))
+        myHistory->AddGenerated(aS, aG);
     }
+
+    // Check if the shape has been deleted, i.e. it is not contained in the result
+    // and has no Modified shapes.
+    if (!isModified && !myMapShape.Contains(aS))
+      myHistory->Remove(aS);
   }
 }
index f6adf82..8b7a54b 100644 (file)
@@ -99,35 +99,29 @@ const TopoDS_Shape& BOPAlgo_CellsBuilder::GetAllParts() const
 }
 
 //=======================================================================
-//function : Prepare
-//purpose  : 
-//=======================================================================
-void BOPAlgo_CellsBuilder::Prepare()
-{
-  BOPAlgo_Builder::Prepare();
-  //
-  myFlagHistory=Standard_False;
-}
-
-//=======================================================================
 //function : PerformInternal1
 //purpose  : 
 //=======================================================================
 void BOPAlgo_CellsBuilder::PerformInternal1(const BOPAlgo_PaveFiller& theFiller)
 {
+  // Avoid filling history after GF operation as later
+  // in this method the result shape will be nullified
+  Standard_Boolean isHistory = HasHistory();
+  SetToFillHistory(Standard_False);
+  // Perform splitting of the arguments
   BOPAlgo_Builder::PerformInternal1(theFiller);
-  //
   if (HasErrors()) {
     return;
   }
-  //
+
   // index all the parts to its origins
   IndexParts();
-  //
+
   // and nullify <myShape> for building the result;
   RemoveAllFromResult();
-  //
-  myFlagHistory = Standard_True;
+
+  // Restore user's history settings
+  SetToFillHistory(isHistory);
 }
 
 //=======================================================================
index a538580..c9183fa 100644 (file)
@@ -242,10 +242,6 @@ class BOPAlgo_CellsBuilder : public BOPAlgo_Builder
   //! local modification map of unified elements - myMapModified.
   Standard_EXPORT virtual const TopTools_ListOfShape* LocModified(const TopoDS_Shape& theS) Standard_OVERRIDE;
 
-  //! Redefined method Prepare - no need to prepare history
-  //! information on the default result as it is empty compound.
-  Standard_EXPORT virtual void Prepare() Standard_OVERRIDE;
-
   //! Redefined method PerformInternal1 - makes all split parts,
   //! nullifies the result <myShape>, and index all parts.
   Standard_EXPORT virtual void PerformInternal1 (const BOPAlgo_PaveFiller& thePF) Standard_OVERRIDE;
index 7ca9aef..e1db775 100644 (file)
@@ -130,7 +130,7 @@ void BOPAlgo_RemoveFeatures::Perform()
   {
     OCC_CATCH_SIGNALS
 
-    if (myTrackHistory)
+    if (HasHistory())
       myHistory = new BRepTools_History();
 
     // Check the input data
@@ -225,7 +225,7 @@ void BOPAlgo_RemoveFeatures::CheckData()
 
       myShape = aCS;
 
-      if (myTrackHistory)
+      if (HasHistory())
       {
         // Make non solid shapes removed in the history
         MakeRemoved(anOtherShapes, *myHistory.get());
@@ -494,7 +494,7 @@ private: //! @name Private methods performing the operation
 
       anIntResult = aGFInter.Shape();
 
-      myHistory->Merge<BOPAlgo_Builder>(aGFInter.Arguments(), aGFInter);
+      myHistory->Merge(aGFInter.History());
     }
     else
       anIntResult = aGFInter.Arguments().First();
@@ -679,7 +679,7 @@ private: //! @name Private methods performing the operation
     }
 
     // Update history after intersection of the extended face with bounds
-    myHistory->Merge<BOPAlgo_Builder>(aGFTrim.Arguments(), aGFTrim);
+    myHistory->Merge(aGFTrim.History());
 
     // Update history with all removed shapes
     BRepTools_History aHistRem;
@@ -782,7 +782,7 @@ void BOPAlgo_RemoveFeatures::RemoveFeatures()
 
     // No need to fill the history for solids if the history is not
     // requested and the current feature is the last one.
-    Standard_Boolean isSolidsHistoryNeeded = myTrackHistory || (i < (aNbF - 1));
+    Standard_Boolean isSolidsHistoryNeeded = HasHistory() || (i < (aNbF - 1));
 
     // Perform removal of the single feature
     RemoveFeature(aFG.Feature(), aFG.Solids(), aFG.FeatureFacesMap(),
@@ -895,7 +895,7 @@ void BOPAlgo_RemoveFeatures::RemoveFeature
       aFacesToBeKept.Add(anAdjF);
     }
 
-    if (myTrackHistory)
+    if (HasHistory())
     {
       // Look for internal edges in the original adjacent faces
       const TopoDS_Shape& aFOr = theAdjFaces.FindKey(i);
@@ -990,9 +990,9 @@ void BOPAlgo_RemoveFeatures::RemoveFeature
   // History of adjacent faces reconstruction
   myHistory->Merge(theAdjFacesHistory);
   // History of intersection
-  myHistory->Merge<BOPAlgo_MakerVolume>(aMV.Arguments(), aMV);
+  myHistory->Merge(aMV.History());
 
-  if (myTrackHistory)
+  if (HasHistory())
   {
     // Map the result to check if the shape is removed
     TopTools_IndexedMapOfShape aMSRes;
@@ -1037,11 +1037,12 @@ void BOPAlgo_RemoveFeatures::RemoveFeature
 //=======================================================================
 void BOPAlgo_RemoveFeatures::UpdateHistory()
 {
-  if (!myTrackHistory)
+  if (!HasHistory())
     return;
 
   // Map the result
-  TopExp::MapShapes(myShape, myResultMap);
+  myMapShape.Clear();
+  TopExp::MapShapes(myShape, myMapShape);
 
   // Update the history
   BRepTools_History aHistory;
@@ -1060,14 +1061,14 @@ void BOPAlgo_RemoveFeatures::UpdateHistory()
     const TopTools_ListOfShape& aLSIm = myHistory->Modified(aS);
     if (aLSIm.IsEmpty())
     {
-      if (!myResultMap.Contains(aS))
+      if (!myMapShape.Contains(aS))
         aHistory.Remove(aS);
     }
 
     TopTools_ListIteratorOfListOfShape itLSIm(aLSIm);
     for (; itLSIm.More(); itLSIm.Next())
     {
-      if (!myResultMap.Contains(itLSIm.Value()))
+      if (!myMapShape.Contains(itLSIm.Value()))
         aHistory.Remove(itLSIm.Value());
     }
   }
@@ -1089,20 +1090,20 @@ void BOPAlgo_RemoveFeatures::SimplifyResult()
   // Do not allow producing internal edges
   aSDTool.AllowInternalEdges(Standard_False);
   // Avoid removal of the input edges and vertices
-  if (myResultMap.IsEmpty())
-    TopExp::MapShapes(myShape, myResultMap);
+  if (myMapShape.IsEmpty())
+    TopExp::MapShapes(myShape, myMapShape);
 
   const Standard_Integer aNbS = myInputsMap.Extent();
   for (Standard_Integer i = 1; i <= aNbS; ++i)
   {
-    if (myResultMap.Contains(myInputsMap(i)))
+    if (myMapShape.Contains(myInputsMap(i)))
       aSDTool.KeepShape(myInputsMap(i));
   }
 
   // Perform unification
   aSDTool.Build();
   myShape = aSDTool.Shape();
-  if (myTrackHistory)
+  if (HasHistory())
     myHistory->Merge(aSDTool.History());
 }
 
index 365488e..e855f24 100644 (file)
@@ -19,7 +19,7 @@
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Handle.hxx>
 
-#include <BOPAlgo_Options.hxx>
+#include <BOPAlgo_BuilderShape.hxx>
 #include <BRepTools_History.hxx>
 #include <TopoDS_Shape.hxx>
 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
@@ -79,7 +79,7 @@
 //! available through the methods of the history tool *BRepTools_History*,
 //! which can be accessed here through the method *History()*.
 //! By default, the history is collected, but it is possible to disable it
-//! using the method *TrackHistory(false)*;
+//! using the method *SetToFillHistory(false)*;
 //!
 //! <b>Error/Warning reporting system</b> - allows obtaining the extended overview
 //! of the Errors/Warnings occurred during the operation. As soon as any error
 //! aRF.SetShape(aSolid);                   // Set the shape
 //! aRF.AddFacesToRemove(aFaces);           // Add faces to remove
 //! aRF.SetRunParallel(bRunParallel);       // Define the processing mode (parallel or single)
-//! aRF.TrackHistory(isHistoryNeeded);      // Define whether to track the shapes modifications
+//! aRF.SetToFillHistory(isHistoryNeeded);  // Define whether to track the shapes modifications
 //! aRF.Perform();                          // Perform the operation
 //! if (aRF.HasErrors())                    // Check for the errors
 //! {
 //! When all possible features are removed, the shape is simplified by
 //! removing extra edges and vertices, created during operation, from the result shape.
 //!
-class BOPAlgo_RemoveFeatures: public BOPAlgo_Options
+class BOPAlgo_RemoveFeatures: public BOPAlgo_BuilderShape
 {
 public:
   DEFINE_STANDARD_ALLOC
@@ -154,10 +154,8 @@ public: //! @name Constructors
   //! Empty constructor
   BOPAlgo_RemoveFeatures()
   :
-    BOPAlgo_Options(),
-    myTrackHistory(Standard_True)
-  {
-  }
+    BOPAlgo_BuilderShape()
+  {}
 
 
 public: //! @name Setting input data for the algorithm
@@ -203,47 +201,21 @@ public: //! @name Setting input data for the algorithm
 public: //! @name Performing the operation
 
   //! Performs the operation
-  Standard_EXPORT void Perform();
+  Standard_EXPORT virtual void Perform() Standard_OVERRIDE;
 
 
 public: //! @name Clearing the contents of the algorithm
 
   //! Clears the contents of the algorithm from previous run,
   //! allowing reusing it for following removals.
-  void Clear()
+  virtual void Clear() Standard_OVERRIDE
   {
-    BOPAlgo_Options::Clear();
-    myHistory.Nullify();
+    BOPAlgo_BuilderShape::Clear();
     myInputShape.Nullify();
     myShape.Nullify();
     myFacesToRemove.Clear();
     myFeatures.Clear();
     myInputsMap.Clear();
-    myResultMap.Clear();
-  }
-
-
-public: //! @name History support
-
-  //! Defines whether to track the modification of the shapes or not
-  void TrackHistory(const Standard_Boolean theFlag)
-  {
-    myTrackHistory = theFlag;
-  }
-
-  //! Gets the History object
-  Handle(BRepTools_History) History()
-  {
-    return (myTrackHistory ? myHistory : NULL);
-  }
-
-
-public: //! @name Obtaining the results
-
-  //! Returns the resulting shape
-  const TopoDS_Shape& Shape() const
-  {
-    return myShape;
   }
 
 
@@ -254,7 +226,7 @@ protected: //! @name Protected methods performing the removal
   //! If the input shape is not a solid, the method looks for the solids
   //! in <myInputShape> and uses only them. All other shapes are simply removed.
   //! If no solids were found, the Error of unsupported type is returned.
-  Standard_EXPORT void CheckData();
+  Standard_EXPORT virtual void CheckData() Standard_OVERRIDE;
 
   //! Prepares the faces to remove:
   //! - Gets only faces contained in the input solids;
@@ -298,18 +270,11 @@ protected: //! @name Fields
   // Inputs
   TopoDS_Shape myInputShape;              //!< Input shape
   TopTools_ListOfShape myFacesToRemove;   //!< Faces to remove
-  Standard_Boolean myTrackHistory;        //!< Defines whether to track the history of shapes
-                                          //! modifications or not (true by default)
 
   // Intermediate
   TopTools_ListOfShape myFeatures;        //!< List of not connected features to remove
                                           //! (each feature is a compound of faces)
   TopTools_IndexedMapOfShape myInputsMap; //!< Map of all sub-shapes of the input shape
-  TopTools_MapOfShape myResultMap;        //!< Map of all sub-shapes of the result shape
-
-  // Results
-  TopoDS_Shape myShape;                   //!< Result shape
-  Handle(BRepTools_History) myHistory;    //!< History tool
 };
 
 #endif // _BOPAlgo_RemoveFeatures_HeaderFile
index deaff6e..e2a3151 100644 (file)
@@ -17,7 +17,6 @@ BOPAlgo_BuilderArea.cxx
 BOPAlgo_BuilderArea.hxx
 BOPAlgo_BuilderFace.cxx
 BOPAlgo_BuilderFace.hxx
-BOPAlgo_BuilderShape.cxx
 BOPAlgo_BuilderShape.hxx
 BOPAlgo_BuilderSolid.cxx
 BOPAlgo_BuilderSolid.hxx
index db83f7e..6a90550 100644 (file)
@@ -128,13 +128,16 @@ Standard_Integer bapibop(Draw_Interpretor& di,
   pBuilder->SetGlue(aGlue);
   pBuilder->SetCheckInverted(BOPTest_Objects::CheckInverted());
   pBuilder->SetUseOBB(BOPTest_Objects::UseOBB());
+  pBuilder->SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
   //
-  pBuilder->Build(); 
+  pBuilder->Build();
+  pBuilder->SimplifyResult(BOPTest_Objects::UnifyEdges(),
+                           BOPTest_Objects::UnifyFaces(),
+                           BOPTest_Objects::Angular());
 
-  // Store the history for the Objects (overwrites the history in the session)
-  BRepTest_Objects::SetHistory(BOPTest_Objects::Shapes(), *pBuilder);
-  // Add the history for the Tools
-  BRepTest_Objects::AddHistory(BOPTest_Objects::Tools(), *pBuilder);
+  // Store the history of operation into the session
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(pBuilder->History());
 
   if (pBuilder->HasWarnings()) {
     Standard_SStream aSStream;
@@ -192,13 +195,16 @@ Standard_Integer bapibuild(Draw_Interpretor& di,
   aBuilder.SetGlue(aGlue);
   aBuilder.SetCheckInverted(BOPTest_Objects::CheckInverted());
   aBuilder.SetUseOBB(BOPTest_Objects::UseOBB());
+  aBuilder.SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
   //
-  aBuilder.Build(); 
+  aBuilder.Build();
+  aBuilder.SimplifyResult(BOPTest_Objects::UnifyEdges(),
+                          BOPTest_Objects::UnifyFaces(),
+                          BOPTest_Objects::Angular());
 
-  // Store the history for the Objects (overwrites the history in the session)
-  BRepTest_Objects::SetHistory(BOPTest_Objects::Shapes(), aBuilder);
-  // Add the history for the Tools
-  BRepTest_Objects::AddHistory(BOPTest_Objects::Tools(), aBuilder);
+  // Store the history of operation into the session
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aBuilder.History());
 
   if (aBuilder.HasWarnings()) {
     Standard_SStream aSStream;
@@ -248,14 +254,17 @@ Standard_Integer bapisplit(Draw_Interpretor& di,
   aSplitter.SetGlue(BOPTest_Objects::Glue());
   aSplitter.SetCheckInverted(BOPTest_Objects::CheckInverted());
   aSplitter.SetUseOBB(BOPTest_Objects::UseOBB());
+  aSplitter.SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
   //
   // performing operation
   aSplitter.Build();
+  aSplitter.SimplifyResult(BOPTest_Objects::UnifyEdges(),
+                           BOPTest_Objects::UnifyFaces(),
+                           BOPTest_Objects::Angular());
 
-  // Store the history for the Objects (overwrites the history in the session)
-  BRepTest_Objects::SetHistory(BOPTest_Objects::Shapes(), aSplitter);
-  // Add the history for the Tools
-  BRepTest_Objects::AddHistory(BOPTest_Objects::Tools(), aSplitter);
+  // Store the history of operation into the session
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aSplitter.History());
 
   // check warning status
   if (aSplitter.HasWarnings()) {
index 73ee159..f0e99e4 100644 (file)
@@ -256,12 +256,14 @@ Standard_Integer bopsmt(Draw_Interpretor& di,
   aBOP.SetOperation(aOp);
   aBOP.SetRunParallel (bRunParallel);
   aBOP.SetCheckInverted(BOPTest_Objects::CheckInverted());
+  aBOP.SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
   //
   aBOP.PerformWithFiller(*pPF);
   BOPTest::ReportAlerts(aBOP.GetReport());
 
   // Store the history of Boolean operation into the session
-  BRepTest_Objects::SetHistory(pPF->Arguments(), aBOP);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aBOP.History());
 
   if (aBOP.HasErrors()) {
     return 0;
@@ -321,12 +323,14 @@ Standard_Integer bopsection(Draw_Interpretor& di,
   aBOP.AddArgument(aS2);
   aBOP.SetRunParallel (bRunParallel);
   aBOP.SetCheckInverted(BOPTest_Objects::CheckInverted());
+  aBOP.SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
   //
   aBOP.PerformWithFiller(*pPF);
   BOPTest::ReportAlerts(aBOP.GetReport());
 
   // Store the history of Section operation into the session
-  BRepTest_Objects::SetHistory(pPF->Arguments(), aBOP);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aBOP.History());
 
   if (aBOP.HasErrors()) {
     return 0;
@@ -445,7 +449,8 @@ Standard_Integer  bsection(Draw_Interpretor& di,
   aSec.Build();
 
   // Store the history of Section operation into the session
-  BRepTest_Objects::SetHistory(aSec.DSFiller()->Arguments(), aSec);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aSec.History());
 
   //
   if (aSec.HasWarnings()) {
@@ -530,12 +535,14 @@ Standard_Integer bsmt (Draw_Interpretor& di,
   aBOP.SetOperation(aOp);
   aBOP.SetRunParallel(bRunParallel);
   aBOP.SetCheckInverted(BOPTest_Objects::CheckInverted());
-  // 
+  aBOP.SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
+  //
   aBOP.PerformWithFiller(aPF);
   BOPTest::ReportAlerts(aBOP.GetReport());
 
   // Store the history of Boolean operation into the session
-  BRepTest_Objects::SetHistory(aPF.Arguments(), aBOP);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aPF.Arguments(), aBOP);
 
   if (aBOP.HasErrors()) {
     return 0;
@@ -842,12 +849,14 @@ Standard_Integer mkvolume(Draw_Interpretor& di, Standard_Integer n, const char**
   aMV.SetAvoidInternalShapes(bAvoidInternal);
   aMV.SetGlue(aGlue);
   aMV.SetUseOBB(BOPTest_Objects::UseOBB());
+  aMV.SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
   //
   aMV.Perform();
   BOPTest::ReportAlerts(aMV.GetReport());
 
   // Store the history of Volume Maker into the session
-  BRepTest_Objects::SetHistory(aLS, aMV);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aLS, aMV);
 
   if (aMV.HasErrors()) {
     return 0;
index 811938b..6ff33c6 100644 (file)
@@ -114,12 +114,14 @@ Standard_Integer bcbuild(Draw_Interpretor& di,
   aCBuilder.SetGlue(aGlue);
   aCBuilder.SetCheckInverted(BOPTest_Objects::CheckInverted());
   aCBuilder.SetUseOBB(BOPTest_Objects::UseOBB());
+  aCBuilder.SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
   //
   aCBuilder.PerformWithFiller(aPF); 
   BOPTest::ReportAlerts(aCBuilder.GetReport());
 
   // Store the history of the Cells Builder into the session
-  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
 
   if (aCBuilder.HasErrors()) {
     return 0;
@@ -172,7 +174,8 @@ Standard_Integer bcaddall(Draw_Interpretor& di,
   const TopoDS_Shape& aR = aCBuilder.Shape();
 
   // Update the history of the Cells Builder
-  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
 
   DBRep::Set(a[1], aR);
   return 0;
@@ -196,7 +199,8 @@ Standard_Integer bcremoveall(Draw_Interpretor& di,
   aCBuilder.RemoveAllFromResult();
 
   // Update the history of the Cells Builder
-  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
 
   return 0;
 }
@@ -262,7 +266,8 @@ Standard_Integer bcadd(Draw_Interpretor& di,
   const TopoDS_Shape& aR = aCBuilder.Shape();
 
   // Update the history of the Cells Builder
-  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
 
   DBRep::Set(a[1], aR);
   return 0;
@@ -311,7 +316,8 @@ Standard_Integer bcremove(Draw_Interpretor& di,
   const TopoDS_Shape& aR = aCBuilder.Shape();
 
   // Update the history of the Cells Builder
-  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
 
   DBRep::Set(a[1], aR);
   return 0;
@@ -339,7 +345,8 @@ Standard_Integer bcremoveint(Draw_Interpretor& di,
   const TopoDS_Shape& aR = aCBuilder.Shape();
 
   // Update the history of the Cells Builder
-  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
 
   DBRep::Set(a[1], aR);
   return 0;
index d0c82ec..f5eb389 100644 (file)
@@ -51,13 +51,7 @@ class BOPTest_Session {
     myBuilderDefault=new BOPAlgo_Builder(pA2);
     //
     myBuilder=myBuilderDefault;
-    myRunParallel=Standard_False;
-    myNonDestructive = Standard_False;
-    myFuzzyValue = Precision::Confusion();
-    myGlue = BOPAlgo_GlueOff;
-    myDrawWarnShapes = Standard_False;
-    myCheckInverted = Standard_True;
-    myUseOBB = Standard_False;
+    SetDefaultOptions();
   };
   //
   // Clear
@@ -104,6 +98,20 @@ class BOPTest_Session {
   TopTools_ListOfShape& Tools() {
     return myTools;
   }
+  // Resets all options to default values
+  void SetDefaultOptions()
+  {
+    myRunParallel = Standard_False;
+    myNonDestructive = Standard_False;
+    myFuzzyValue = Precision::Confusion();
+    myGlue = BOPAlgo_GlueOff;
+    myDrawWarnShapes = Standard_False;
+    myCheckInverted = Standard_True;
+    myUseOBB = Standard_False;
+    myUnifyEdges = Standard_False;
+    myUnifyFaces = Standard_False;
+    myAngTol = Precision::Angular();
+  }
   //
   void SetRunParallel(const Standard_Boolean bFlag) {
     myRunParallel=bFlag;
@@ -160,6 +168,22 @@ class BOPTest_Session {
   Standard_Boolean UseOBB() const {
     return myUseOBB;
   };
+
+  // Controls the Unification of Edges after BOP
+  void SetUnifyEdges(const Standard_Boolean bUE) { myUnifyEdges = bUE; }
+  // Returns flag of Edges unification
+  Standard_Boolean UnifyEdges() const { return myUnifyEdges; }
+
+  // Controls the Unification of Faces after BOP
+  void SetUnifyFaces(const Standard_Boolean bUF) { myUnifyFaces = bUF; }
+  // Returns flag of Faces unification
+  Standard_Boolean UnifyFaces() const { return myUnifyFaces; }
+
+  // Sets angular tolerance for Edges and Faces unification
+  void SetAngular(const Standard_Real theAngTol) { myAngTol = theAngTol; }
+  // Returns angular tolerance
+  Standard_Real Angular() const { return myAngTol; }
+
 protected:
   //
   BOPTest_Session(const BOPTest_Session&);
@@ -180,6 +204,9 @@ protected:
   Standard_Boolean myDrawWarnShapes;
   Standard_Boolean myCheckInverted;
   Standard_Boolean myUseOBB;
+  Standard_Boolean myUnifyEdges;
+  Standard_Boolean myUnifyFaces;
+  Standard_Real myAngTol;
 };
 //
 //=======================================================================
@@ -310,6 +337,14 @@ TopTools_ListOfShape& BOPTest_Objects::Tools()
   return GetSession().Tools();
 }
 //=======================================================================
+//function : SetDefaultOptions
+//purpose  : 
+//=======================================================================
+void BOPTest_Objects::SetDefaultOptions()
+{
+  GetSession().SetDefaultOptions();
+}
+//=======================================================================
 //function : SetRunParallel
 //purpose  : 
 //=======================================================================
@@ -422,6 +457,54 @@ Standard_Boolean BOPTest_Objects::UseOBB()
   return GetSession().UseOBB();
 }
 //=======================================================================
+//function : SetUnifyEdges
+//purpose  : 
+//=======================================================================
+void BOPTest_Objects::SetUnifyEdges(const Standard_Boolean bUE)
+{
+  GetSession().SetUnifyEdges(bUE);
+}
+//=======================================================================
+//function : UnifyEdges
+//purpose  : 
+//=======================================================================
+Standard_Boolean BOPTest_Objects::UnifyEdges()
+{
+  return GetSession().UnifyEdges();
+}
+//=======================================================================
+//function : SetUnifyFaces
+//purpose  : 
+//=======================================================================
+void BOPTest_Objects::SetUnifyFaces(const Standard_Boolean bUF)
+{
+  GetSession().SetUnifyFaces(bUF);
+}
+//=======================================================================
+//function : UnifyFaces
+//purpose  : 
+//=======================================================================
+Standard_Boolean BOPTest_Objects::UnifyFaces()
+{
+  return GetSession().UnifyFaces();
+}
+//=======================================================================
+//function : SetAngular
+//purpose  : 
+//=======================================================================
+void BOPTest_Objects::SetAngular(const Standard_Real theAngTol)
+{
+  GetSession().SetAngular(theAngTol);
+}
+//=======================================================================
+//function : Angular
+//purpose  : 
+//=======================================================================
+Standard_Real BOPTest_Objects::Angular()
+{
+  return GetSession().Angular();
+}
+//=======================================================================
 //function : Allocator1
 //purpose  : 
 //=======================================================================
index fbe19e8..5c3e5e0 100644 (file)
@@ -66,7 +66,9 @@ public:
   Standard_EXPORT static void SetBuilder (const BOPAlgo_PBuilder& theBuilder);
   
   Standard_EXPORT static void SetBuilderDefault();
-  
+
+  Standard_EXPORT static void SetDefaultOptions();
+
   Standard_EXPORT static void SetRunParallel (const Standard_Boolean theFlag);
   
   Standard_EXPORT static Standard_Boolean RunParallel();
@@ -95,6 +97,15 @@ public:
 
   Standard_EXPORT static Standard_Boolean UseOBB();
 
+  Standard_EXPORT static void SetUnifyEdges(const Standard_Boolean bUE);
+  Standard_EXPORT static Standard_Boolean UnifyEdges();
+
+  Standard_EXPORT static void SetUnifyFaces(const Standard_Boolean bUF);
+  Standard_EXPORT static Standard_Boolean UnifyFaces();
+
+  Standard_EXPORT static void SetAngular(const Standard_Real bAngTol);
+  Standard_EXPORT static Standard_Real Angular();
+
 protected:
 
 private:
index c7ef3ab..ffa474b 100644 (file)
@@ -29,6 +29,7 @@ static Standard_Integer bGlue(Draw_Interpretor&, Standard_Integer, const char**)
 static Standard_Integer bdrawwarnshapes(Draw_Interpretor&, Standard_Integer, const char**);
 static Standard_Integer bcheckinverted(Draw_Interpretor&, Standard_Integer, const char**);
 static Standard_Integer buseobb(Draw_Interpretor&, Standard_Integer, const char**);
+static Standard_Integer bsimplify(Draw_Interpretor&, Standard_Integer, const char**);
 
 //=======================================================================
 //function : OptionCommands
@@ -42,18 +43,45 @@ void BOPTest::OptionCommands(Draw_Interpretor& theCommands)
   // Chapter's name
   const char* g = "BOPTest commands";
   // Commands  
-  theCommands.Add("boptions", "use boptions, shows current value of BOP options" , __FILE__, boptions, g);
-  theCommands.Add("brunparallel", "use brunparallel [0/1]" , __FILE__, brunparallel, g);
-  theCommands.Add("bnondestructive", "use bnondestructive [0/1]", __FILE__, bnondestructive, g);
-  theCommands.Add("bfuzzyvalue", "use bfuzzyvalue value", __FILE__, bfuzzyvalue, g);
-  theCommands.Add("bglue", "use bglue [0 (off) / 1 (shift) / 2 (full)]", __FILE__, bGlue, g);
-  theCommands.Add("bdrawwarnshapes", "Defines whether to draw warning shapes or not\n"
-                  "Usage: bdrawwarnshapes [0 (do not draw) / 1 (draw warning shapes)",
+  theCommands.Add("boptions", "Usage: boptions [-default]\n"
+                              "\t\tw/o arguments shows current value of BOP options\n"
+                              "\t\t-default - allows setting all options to default values",
+                  __FILE__, boptions, g);
+
+  theCommands.Add("brunparallel", "Enables/Disables parallel processing mode.\n"
+                                  "\t\tUsage: brunparallel 0/1",
+                  __FILE__, brunparallel, g);
+
+  theCommands.Add("bnondestructive", "Enables/Disables the safe processing mode.\n"
+                                     "\t\tUsage: bnondestructive 0/1",
+                  __FILE__, bnondestructive, g);
+
+  theCommands.Add("bfuzzyvalue", "Sets the additional tolerance for BOP algorithms.\n"
+                                 "\t\tUsage: bfuzzyvalue value",
+                  __FILE__, bfuzzyvalue, g);
+
+  theCommands.Add("bglue", "Sets the gluing mode for the BOP algorithms.\n"
+                           "\t\tUsage: bglue [0 (off) / 1 (shift) / 2 (full)]",
+                  __FILE__, bGlue, g);
+
+  theCommands.Add("bdrawwarnshapes", "Enables/Disables drawing of waring shapes of BOP algorithms.\n"
+                                     "\t\tUsage: bdrawwarnshapes 0 (do not draw) / 1 (draw warning shapes)",
                   __FILE__, bdrawwarnshapes, g);
-  theCommands.Add("bcheckinverted", "Defines whether to check the input solids on inverted status or not\n"
-                                     "Usage: bcheckinverted [0 (off) / 1 (on)]", __FILE__, bcheckinverted, g);
-  theCommands.Add("buseobb", "Enables/disables the usage of OBB\n"
-                                     "Usage: buseobb [0 (off) / 1 (on)]", __FILE__, buseobb, g);
+
+  theCommands.Add("bcheckinverted", "Enables/Disables the check of the input solids on inverted status in BOP algorithms\n"
+                                    "\t\tUsage: bcheckinverted 0 (off) / 1 (on)",
+                  __FILE__, bcheckinverted, g);
+
+  theCommands.Add("buseobb", "Enables/disables the usage of OBB in BOP algorithms\n"
+                             "\t\tUsage: buseobb 0 (off) / 1 (on)",
+                  __FILE__, buseobb, g);
+
+  theCommands.Add("bsimplify", "Enables/Disables the result simplification after BOP\n"
+                               "\t\tUsage: bsimplify [-e 0/1] [-f 0/1] [-a tol]\n"
+                               "\t\t-e 0/1 - enables/disables edges unification\n"
+                               "\t\t-f 0/1 - enables/disables faces unification\n"
+                               "\t\t-a tol - changes default angular tolerance of unification algo (accepts value in degrees).",
+                  __FILE__, bsimplify, g);
 }
 //=======================================================================
 //function : boptions
@@ -61,40 +89,60 @@ void BOPTest::OptionCommands(Draw_Interpretor& theCommands)
 //=======================================================================
 Standard_Integer boptions(Draw_Interpretor& di,
                           Standard_Integer n, 
-                          const char** ) 
+                          const char** a) 
 { 
-  if (n!=1) {
-    di << " use boptions\n";
+  if (n > 2)
+  {
+    di.PrintHelp(a[0]);
+    return 1;
+  }
+
+  if (n == 2)
+  {
+    if (strcmp(a[1], "-default"))
+    {
+      di.PrintHelp(a[0]);
+      return 1;
+    }
+
+    // Set all options to default values
+    BOPTest_Objects::SetDefaultOptions();
     return 0;
   }
   //
   char buf[128];
-  Standard_Boolean bRunParallel, bNonDestructive;
-  Standard_Real aFuzzyValue;
-  BOPAlgo_GlueEnum aGlue;
+  BOPAlgo_GlueEnum aGlue = BOPTest_Objects::Glue();
   //
-  bRunParallel=BOPTest_Objects::RunParallel();
-  bNonDestructive = BOPTest_Objects::NonDestructive();
-  aFuzzyValue = BOPTest_Objects::FuzzyValue();
-  aGlue = BOPTest_Objects::Glue();
-  Standard_Boolean bDrawWarnShapes = BOPTest_Objects::DrawWarnShapes();
-  Standard_Boolean bCheckInverted = BOPTest_Objects::CheckInverted();
-  Standard_Boolean bUseOBB = BOPTest_Objects::UseOBB();
-  //
-  Sprintf(buf, " RunParallel: %d\n",  bRunParallel);
+  Sprintf(buf, " RunParallel: %s \t\t(%s)\n",  BOPTest_Objects::RunParallel() ? "Yes" : "No",
+               "use \"brunparallel\" command to change");
+  di << buf;
+  Sprintf(buf, " NonDestructive: %s \t\t(%s)\n", BOPTest_Objects::NonDestructive() ? "Yes" : "No",
+                "use \"bnondestructive\" command to change");
+  di << buf;
+  Sprintf(buf, " FuzzyValue: %g \t\t(%s)\n", BOPTest_Objects::FuzzyValue(),
+               "use \"bfuzzyvalue\" command to change");
   di << buf;
-  Sprintf(buf, " NonDestructive: %d\n", bNonDestructive);
+  Sprintf(buf, " GlueOption: %s \t\t(%s)\n", ((aGlue == BOPAlgo_GlueOff) ? "Off" :
+    ((aGlue == BOPAlgo_GlueFull) ? "Full" : "Shift")),
+               "use \"bglue\" command to change");
   di << buf;
-  Sprintf(buf, " FuzzyValue: %lf\n", aFuzzyValue);
+  Sprintf(buf, " Draw Warning Shapes: %s \t(%s)\n", BOPTest_Objects::DrawWarnShapes() ? "Yes" : "No",
+               "use \"bdrawwarnshapes\" command to change");
   di << buf;
-  Sprintf(buf, " GlueOption: %s\n", ((aGlue == BOPAlgo_GlueOff) ? "Off" :
-    ((aGlue == BOPAlgo_GlueFull) ? "Full" : "Shift")));
+  Sprintf(buf, " Check for invert solids: %s \t(%s)\n", BOPTest_Objects::CheckInverted() ? "Yes" : "No",
+               "use \"bcheckinverted\" command to change");
   di << buf;
-  Sprintf(buf, " Draw Warning Shapes: %s\n", bDrawWarnShapes ? "Yes" : "No");
+  Sprintf(buf, " Use OBB: %s \t\t\t(%s)\n", BOPTest_Objects::UseOBB() ? "Yes" : "No",
+               "use \"buseobb\" command to change");
   di << buf;
-  Sprintf(buf, " Check for inverted solids: %s\n", bCheckInverted ? "Yes" : "No");
+  Sprintf(buf, " Unify Edges: %s \t\t(%s)\n", BOPTest_Objects::UnifyEdges() ? "Yes" : "No",
+               "use \"bsimplify -e\" command to change");
   di << buf;
-  Sprintf(buf, " Use OBB: %s\n", bUseOBB ? "Yes" : "No");
+  Sprintf(buf, " Unify Faces: %s \t\t(%s)\n", BOPTest_Objects::UnifyFaces() ? "Yes" : "No",
+               "use \"bsimplify -f\" command to change");
+  di << buf;
+  Sprintf(buf, " Angular: %g \t\t(%s)\n", BOPTest_Objects::Angular(),
+               "use \"bsimplify -a\" command to change");
   di << buf;
   //
   return 0;
@@ -106,22 +154,15 @@ Standard_Integer boptions(Draw_Interpretor& di,
 Standard_Integer bfuzzyvalue(Draw_Interpretor& di,
                              Standard_Integer n, 
                              const char** a) 
-{ 
-  if (n!=2) {
-    di << " use bfuzzyvalue value\n";
-    return 0;
-  }
-  //
-  Standard_Real aFuzzyValue;
-  //
-  aFuzzyValue=Draw::Atof(a[1]);
-  if (aFuzzyValue<0.) {
-    di << " Wrong value.\n"; 
-    return 0;  
+{
+  if (n != 2)
+  {
+    di.PrintHelp(a[0]);
+    return 1;
   }
-  //
+
+  Standard_Real aFuzzyValue = Draw::Atof(a[1]);
   BOPTest_Objects::SetFuzzyValue(aFuzzyValue);
-  //
   return 0;
 }
 //=======================================================================
@@ -129,26 +170,17 @@ Standard_Integer bfuzzyvalue(Draw_Interpretor& di,
 //purpose  : 
 //=======================================================================
 Standard_Integer brunparallel(Draw_Interpretor& di,
-                              Standard_Integer n, 
-                              const char** a) 
-{ 
-  if (n!=2) {
-    di << " use brunparallel [0/1]\n";
-    return 0;
-  }
-  //
-  Standard_Integer iX;
-  Standard_Boolean bRunParallel;
-  //
-  iX=Draw::Atoi(a[1]);
-  if (iX<0 || iX>1) {
-    di << " Wrong value.\n"; 
-    return 0;  
+                              Standard_Integer n,
+                              const char** a)
+{
+  if (n != 2)
+  {
+    di.PrintHelp(a[0]);
+    return 1;
   }
-  //
-  bRunParallel = (iX != 0);
-  BOPTest_Objects::SetRunParallel(bRunParallel);
-  //
+
+  Standard_Integer iRunParallel = Draw::Atoi(a[1]);
+  BOPTest_Objects::SetRunParallel(iRunParallel != 0);
   return 0;
 }
 //=======================================================================
@@ -156,26 +188,17 @@ Standard_Integer brunparallel(Draw_Interpretor& di,
 //purpose  : 
 //=======================================================================
 Standard_Integer bnondestructive(Draw_Interpretor& di,
-  Standard_Integer n,
-  const char** a)
+                                 Standard_Integer n,
+                                 const char** a)
 {
-  if (n != 2) {
-    di << " use bnondestructive [0/1]\n";
-    return 0;
-  }
-  //
-  Standard_Integer iX;
-  Standard_Boolean bNonDestructive;
-  //
-  iX = Draw::Atoi(a[1]);
-  if (iX<0 || iX>1) {
-    di << " Wrong value.\n";
-    return 0;
+  if (n != 2)
+  {
+    di.PrintHelp(a[0]);
+    return 1;
   }
-  //
-  bNonDestructive = (iX != 0);
-  BOPTest_Objects::SetNonDestructive(bNonDestructive);
-  //
+
+  Standard_Integer iNonDestructive = Draw::Atoi(a[1]);
+  BOPTest_Objects::SetNonDestructive(iNonDestructive != 0);
   return 0;
 }
 
@@ -184,23 +207,25 @@ Standard_Integer bnondestructive(Draw_Interpretor& di,
 //purpose  : 
 //=======================================================================
 Standard_Integer bGlue(Draw_Interpretor& di,
-                             Standard_Integer n,
-                             const char** a)
+                       Standard_Integer n,
+                       const char** a)
 {
-  if (n != 2) {
-    di << " use bglue [0 (off) / 1 (shift) / 2 (full)]\n";
+  if (n != 2)
+  {
+    di.PrintHelp(a[0]);
     return 1;
   }
-  //
+
   Standard_Integer iGlue = Draw::Atoi(a[1]);
-  if (iGlue < 0 || iGlue > 2) {
-    di << " Wrong value. Use bglue [0 (off) / 1 (shift) / 2 (full)]\n";
+  if (iGlue < 0 || iGlue > 2)
+  {
+    di << "Wrong value.\n";
+    di.PrintHelp(a[0]);
     return 1;
   }
-  //
+
   BOPAlgo_GlueEnum aGlue = BOPAlgo_GlueEnum(iGlue);
   BOPTest_Objects::SetGlue(aGlue);
-  //
   return 0;
 }
 
@@ -209,14 +234,15 @@ Standard_Integer bGlue(Draw_Interpretor& di,
 //purpose  : 
 //=======================================================================
 Standard_Integer bdrawwarnshapes(Draw_Interpretor& di,
-                              Standard_Integer n, 
-                              const char** a) 
+                              Standard_Integer n,
+                              const char** a)
 { 
-  if (n != 2) {
-    di << " use bdrawwarnshapes [0 (do not draw) / 1 (draw warning shapes)\n";
+  if (n != 2)
+  {
+    di.PrintHelp(a[0]);
     return 1;
   }
-  //
+
   Standard_Integer iDraw = Draw::Atoi(a[1]);
   BOPTest_Objects::SetDrawWarnShapes(iDraw != 0);
   return 0;
@@ -230,11 +256,12 @@ Standard_Integer bcheckinverted(Draw_Interpretor& di,
                                 Standard_Integer n,
                                 const char** a)
 {
-  if (n != 2) {
+  if (n != 2)
+  {
     di.PrintHelp(a[0]);
     return 1;
   }
-  //
+
   Standard_Integer iCheck = Draw::Atoi(a[1]);
   BOPTest_Objects::SetCheckInverted(iCheck != 0);
   return 0;
@@ -253,8 +280,49 @@ Standard_Integer buseobb(Draw_Interpretor& di,
     di.PrintHelp(a[0]);
     return 1;
   }
-  //
+
   Standard_Integer iUse = Draw::Atoi(a[1]);
   BOPTest_Objects::SetUseOBB(iUse != 0);
   return 0;
 }
+
+//=======================================================================
+//function : bsimplify
+//purpose  : 
+//=======================================================================
+Standard_Integer bsimplify(Draw_Interpretor& di,
+                           Standard_Integer n,
+                           const char** a)
+{
+  if (n == 1 || n%2 == 0)
+  {
+    di.PrintHelp(a[0]);
+    return 1;
+  }
+
+  for (Standard_Integer i = 1; i < n - 1; ++i)
+  {
+    if (!strcmp(a[i], "-e"))
+    {
+      Standard_Integer iUnifyEdges = Draw::Atoi(a[++i]);
+      BOPTest_Objects::SetUnifyEdges(iUnifyEdges != 0);
+    }
+    else if (!strcmp(a[i], "-f"))
+    {
+      Standard_Integer iUnifyFaces = Draw::Atoi(a[++i]);
+      BOPTest_Objects::SetUnifyFaces(iUnifyFaces != 0);
+    }
+    else if (!strcmp(a[i], "-a"))
+    {
+      Standard_Real anAngTol = Draw::Atof(a[++i]) * (M_PI / 180.0);
+      BOPTest_Objects::SetAngular(anAngTol);
+    }
+    else
+    {
+      di << "Wrong key option.\n";
+      di.PrintHelp(a[0]);
+      return 1;
+    }
+  }
+  return 0;
+}
index 7be074f..23bd525 100644 (file)
@@ -191,6 +191,7 @@ Standard_Integer bbuild(Draw_Interpretor& di,
   }
   aBuilder.SetRunParallel(bRunParallel);
   aBuilder.SetCheckInverted(BOPTest_Objects::CheckInverted());
+  aBuilder.SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
   //
   //
   OSD_Timer aTimer;
@@ -200,7 +201,8 @@ Standard_Integer bbuild(Draw_Interpretor& di,
   BOPTest::ReportAlerts(aBuilder.GetReport());
 
   // Set history of GF operation into the session
-  BRepTest_Objects::SetHistory(aPF.Arguments(), aBuilder);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aPF.Arguments(), aBuilder);
 
   if (aBuilder.HasErrors()) {
     return 0;
@@ -306,6 +308,7 @@ Standard_Integer bbop(Draw_Interpretor& di,
   //
   pBuilder->SetRunParallel(bRunParallel);
   pBuilder->SetCheckInverted(BOPTest_Objects::CheckInverted());
+  pBuilder->SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
   //
   OSD_Timer aTimer;
   aTimer.Start();
@@ -314,7 +317,8 @@ Standard_Integer bbop(Draw_Interpretor& di,
   BOPTest::ReportAlerts(pBuilder->GetReport());
 
   // Set history of Boolean operation into the session
-  BRepTest_Objects::SetHistory(aPF.Arguments(), *pBuilder);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aPF.Arguments(), *pBuilder);
 
   if (pBuilder->HasErrors()) {
     return 0;
@@ -376,6 +380,7 @@ Standard_Integer bsplit(Draw_Interpretor& di,
   pSplitter->SetNonDestructive(BOPTest_Objects::NonDestructive());
   pSplitter->SetFuzzyValue(BOPTest_Objects::FuzzyValue());
   pSplitter->SetCheckInverted(BOPTest_Objects::CheckInverted());
+  pSplitter->SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
   //
   // measure the time of the operation
   OSD_Timer aTimer;
@@ -388,7 +393,8 @@ Standard_Integer bsplit(Draw_Interpretor& di,
   BOPTest::ReportAlerts(pSplitter->GetReport());
 
   // Set history of Split operation into the session
-  BRepTest_Objects::SetHistory(aPF.Arguments(), *pSplitter);
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aPF.Arguments(), *pSplitter);
 
   if (pSplitter->HasErrors()) {
     return 0;
index ad9c92d..7a85b1d 100644 (file)
@@ -43,12 +43,11 @@ void BOPTest::RemoveFeaturesCommands(Draw_Interpretor& theCommands)
   // Chapter's name
   const char* group = "BOPTest commands";
   // Commands
-  theCommands.Add("removefeatures", "removefeatures result shape f1 f2 ... [-nohist] [-parallel]\n"
+  theCommands.Add("removefeatures", "removefeatures result shape f1 f2 ... [-parallel]\n"
                   "\t\tRemoves user-defined features (faces) from the shape.\n"
                   "\t\tresult   - result of the operation;\n"
                   "\t\tshape    - the shape to remove the features from;\n"
                   "\t\tf1, f2   - features to remove from the shape;\n"
-                  "\t\tnohist   - disables the history collection;\n"
                   "\t\tparallel - enables the parallel processing mode.",
                   __FILE__, RemoveFeatures, group);
 }
@@ -84,13 +83,7 @@ Standard_Integer RemoveFeatures(Draw_Interpretor& theDI,
     TopoDS_Shape aF = DBRep::Get(theArgv[i]);
     if (aF.IsNull())
     {
-      // Check for the options
-      if (!strcmp(theArgv[i], "-nohist"))
-      {
-        // disable the history collection
-        aRF.TrackHistory(Standard_False);
-      }
-      else if (!strcmp(theArgv[i], "-parallel"))
+      if (!strcmp(theArgv[i], "-parallel"))
       {
         // enable the parallel processing mode
         aRF.SetRunParallel(Standard_True);
@@ -104,14 +97,16 @@ Standard_Integer RemoveFeatures(Draw_Interpretor& theDI,
     aRF.AddFaceToRemove(aF);
   }
 
+  aRF.SetToFillHistory(BRepTest_Objects::IsHistoryNeeded());
+
   // Perform the removal
   aRF.Build();
 
   // Check for the errors/warnings
   BOPTest::ReportAlerts(aRF.GetReport());
 
-  if (aRF.HasHistory())
-    BRepTest_Objects::SetHistory(aRF.GetHistory());
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(aRF.History());
 
   if (aRF.HasErrors())
     return 0;
index d381153..9d86a61 100644 (file)
 // commercial license or contractual agreement.
 
 
+#include <BRepAlgoAPI_BooleanOperation.hxx>
+
+#include <BOPAlgo_Alerts.hxx>
 #include <BOPAlgo_BOP.hxx>
 #include <BOPAlgo_PaveFiller.hxx>
 #include <BOPAlgo_Section.hxx>
-#include <BOPAlgo_Alerts.hxx>
-#include <BOPDS_Curve.hxx>
-#include <BOPDS_DS.hxx>
-#include <BOPDS_Interf.hxx>
-#include <BOPDS_ListOfPaveBlock.hxx>
-#include <BOPDS_PDS.hxx>
-#include <BOPDS_VectorOfCurve.hxx>
-#include <BRepAlgoAPI_BooleanOperation.hxx>
 #include <BRepAlgoAPI_Check.hxx>
-#include <BRepLib_FuseEdges.hxx>
 #include <BRepTools.hxx>
+
 #include <OSD_Environment.hxx>
 #include <OSD_File.hxx>
 #include <TCollection_AsciiString.hxx>
-#include <TopExp.hxx>
-#include <TopoDS_Shape.hxx>
-#include <TopTools_DataMapOfIntegerListOfShape.hxx>
-#include <TopTools_DataMapOfIntegerShape.hxx>
-#include <TopTools_IndexedMapOfShape.hxx>
-#include <TopTools_ListIteratorOfListOfShape.hxx>
-#include <TopTools_ListOfShape.hxx>
-#include <TopTools_MapOfShape.hxx>
 
 #include <stdio.h>
-///XXXXXXXXXX
-//XXXXXXXXXX
-//XXXX
+
 //=======================================================================
 //class : BRepAlgoAPI_DumpOper
-//purpose  : 
+//purpose : Dumps the arguments ad script to perform operation in DRAW
 //=======================================================================
 class BRepAlgoAPI_DumpOper {
  public:
@@ -96,538 +81,146 @@ class BRepAlgoAPI_DumpOper {
   Standard_Boolean myIsDumpRes;
   Standard_CString myPath;
 };
-//XXXX
+
 //=======================================================================
 //function : BRepAlgoAPI_BooleanOperation
 //purpose  : 
 //=======================================================================
 BRepAlgoAPI_BooleanOperation::BRepAlgoAPI_BooleanOperation()
 :
-  BRepAlgoAPI_BuilderAlgo(),  
-  myOperation(BOPAlgo_UNKNOWN),
-  myBuilderCanWork(Standard_False),
-  myFuseEdges(Standard_False)
-{ 
-  myEntryType=1;
+  BRepAlgoAPI_BuilderAlgo(),
+  myOperation(BOPAlgo_UNKNOWN)
+{
 }
 //=======================================================================
 //function : BRepAlgoAPI_BooleanOperation
 //purpose  : 
 //=======================================================================
 BRepAlgoAPI_BooleanOperation::BRepAlgoAPI_BooleanOperation
-  (const BOPAlgo_PaveFiller& aPF)
+  (const BOPAlgo_PaveFiller& thePF)
 :
-  BRepAlgoAPI_BuilderAlgo(aPF),  
-  myOperation(BOPAlgo_UNKNOWN),
-  myBuilderCanWork(Standard_False),
-  myFuseEdges(Standard_False)
-{ 
-  myEntryType=0;
+  BRepAlgoAPI_BuilderAlgo(thePF),
+  myOperation(BOPAlgo_UNKNOWN)
+{
 }
 //=======================================================================
 //function : BRepAlgoAPI_BooleanOperation
-//purpose  : 
+//purpose  : obsolete
 //=======================================================================
 BRepAlgoAPI_BooleanOperation::BRepAlgoAPI_BooleanOperation
-  (const TopoDS_Shape& aS1, 
-   const TopoDS_Shape& aS2,
-   const BOPAlgo_Operation anOp)
-: 
+  (const TopoDS_Shape& theS1,
+   const TopoDS_Shape& theS2,
+   const BOPAlgo_Operation theOp)
+:
   BRepAlgoAPI_BuilderAlgo(),
-  myOperation(anOp),
-  myBuilderCanWork(Standard_False),
-  myFuseEdges(Standard_False)
+  myOperation(theOp)
 {
-  myEntryType=1;
-  //
-  myArguments.Append(aS1);
-  myTools.Append(aS2);
+  myArguments.Append(theS1);
+  myTools.Append(theS2);
 }
 //=======================================================================
 //function : BRepAlgoAPI_BooleanOperation
 //purpose  : 
 //=======================================================================
 BRepAlgoAPI_BooleanOperation::BRepAlgoAPI_BooleanOperation
-  (const TopoDS_Shape& aS1, 
-   const TopoDS_Shape& aS2,
-   const BOPAlgo_PaveFiller& aPF,
-   const BOPAlgo_Operation anOp)
-: 
-  BRepAlgoAPI_BuilderAlgo(aPF),
-  myOperation(anOp),
-  myBuilderCanWork(Standard_False),
-  myFuseEdges(Standard_False)
-{ 
-  myEntryType=0;
-  //
-  myArguments.Append(aS1);
-  myTools.Append(aS2);
-  //
-  myDSFiller=(BOPAlgo_PaveFiller*)&aPF;
-}
-//=======================================================================
-//function : ~
-//purpose  : 
-//=======================================================================
-BRepAlgoAPI_BooleanOperation::~BRepAlgoAPI_BooleanOperation()
-{
-  Clear();
-}
-//=======================================================================
-//function : Clear
-//purpose  : 
-//=======================================================================
-void BRepAlgoAPI_BooleanOperation::Clear()
-{
-  BRepAlgoAPI_BuilderAlgo::Clear();
-  //
-  myModifFaces.Clear();
-  myEdgeMap.Clear();
-}
-//=======================================================================
-//function : SetTools
-//purpose  : 
-//=======================================================================
-void BRepAlgoAPI_BooleanOperation::SetTools
-  (const TopTools_ListOfShape& theLS)
-{
-  myTools=theLS;
-}
-//=======================================================================
-//function : Tools
-//purpose  : 
-//=======================================================================
-const TopTools_ListOfShape& BRepAlgoAPI_BooleanOperation::Tools()const
-{
-  return myTools;
-}
-//=======================================================================
-//function : SetOperation
-//purpose  : 
-//=======================================================================
-void BRepAlgoAPI_BooleanOperation::SetOperation 
-  (const BOPAlgo_Operation anOp)
-{
-  myOperation=anOp;
-}
-//=======================================================================
-//function : Operation
-//purpose  : 
-//=======================================================================
-BOPAlgo_Operation BRepAlgoAPI_BooleanOperation::Operation()const
-{
-  return myOperation;
-}
-//=======================================================================
-//function : Shape1
-//purpose  : 
-//=======================================================================
-const TopoDS_Shape& BRepAlgoAPI_BooleanOperation::Shape1() const 
-{
-  return myArguments.First();
-}
-//=======================================================================
-//function : Shape2
-//purpose  : 
-//=======================================================================
-const TopoDS_Shape& BRepAlgoAPI_BooleanOperation::Shape2() const 
-{
-  return myTools.First();
-}
-//=======================================================================
-//function : BuilderCanWork
-//purpose  : 
-//=======================================================================
-Standard_Boolean BRepAlgoAPI_BooleanOperation::BuilderCanWork() const
-{
-  return myBuilderCanWork;
-}
-//=======================================================================
-//function : FuseEdges
-//purpose  : 
-//=======================================================================
-Standard_Boolean BRepAlgoAPI_BooleanOperation::FuseEdges ()const
-{
-  return myFuseEdges;
-}
-//=======================================================================
-//function : SetAttributes
-//purpose  : 
-//=======================================================================
-void BRepAlgoAPI_BooleanOperation::SetAttributes()
+  (const TopoDS_Shape& theS1,
+   const TopoDS_Shape& theS2,
+   const BOPAlgo_PaveFiller& thePF,
+   const BOPAlgo_Operation theOp)
+:
+  BRepAlgoAPI_BuilderAlgo(thePF),
+  myOperation(theOp)
 {
+  myArguments.Append(theS1);
+  myTools.Append(theS2);
 }
 //=======================================================================
-//function : Build2
-//purpose  : 
+//function : Build
+//purpose  :
 //=======================================================================
 void BRepAlgoAPI_BooleanOperation::Build()
 {
-  GetReport()->Clear();
-
-  Standard_Integer aNbArgs, aNbTools;
-  BRepAlgoAPI_DumpOper aDumpOper;
-  //
-  myBuilderCanWork=Standard_False;
+  // Set Not Done status by default
   NotDone();
-  //
-  aNbArgs=myArguments.Extent();
-  aNbTools=myTools.Extent();
-  if (aNbArgs<1 && aNbTools<1) {
+  // Clear from previous runs
+  Clear();
+  // Check for availability of arguments and tools
+  // Both should be present
+  if (myArguments.IsEmpty() || myTools.IsEmpty())
+  {
     AddError (new BOPAlgo_AlertTooFewArguments);
     return;
   }
-  if (myOperation==BOPAlgo_UNKNOWN) {
-    AddError (new BOPAlgo_AlertBOPNotSet);
-    return;
-  }
-  //
-  //-----------------------------------------------
-  TopTools_ListOfShape aLS;
-  TopTools_ListIteratorOfListOfShape aIt;
-  //
-  aIt.Initialize(myArguments);
-  for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aS = aIt.Value();
-    aLS.Append(aS);
-  }
-  aIt.Initialize(myTools);
-  for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aS = aIt.Value();
-    aLS.Append(aS);
-  }
-  //-----------------------------------------------
-  //
-  if (myEntryType) {
-    if (myDSFiller) {
-      delete myDSFiller;
-    }
-    myDSFiller=new BOPAlgo_PaveFiller(myAllocator);
-    //
-    myDSFiller->SetArguments(aLS);
-    //
-    myDSFiller->SetRunParallel(myRunParallel);
-    myDSFiller->SetProgressIndicator(myProgressIndicator);
-    myDSFiller->SetFuzzyValue(myFuzzyValue);
-    myDSFiller->SetNonDestructive(myNonDestructive);
-    myDSFiller->SetGlue(myGlue);
-    myDSFiller->SetUseOBB(myUseOBB);
-    //
-    SetAttributes();
-    //
-    myDSFiller->Perform(); 
-    //
-    GetReport()->Merge (myDSFiller->GetReport());
-    if (HasErrors())
-    {
-      return;
-    }
-  }// if (myEntryType) {
-  //
-  //XXXX
-  const TopoDS_Shape& aS1 = myArguments.First();
-  const TopoDS_Shape& aS2 = myTools.First();
-  if (aDumpOper.IsDump()) {
-    BRepAlgoAPI_Check aChekArgs(aS1, aS2, myOperation);
-    aDumpOper.SetIsDumpArgs(!aChekArgs.IsValid());
-  }
-  //XXXX
-  // 
-  if (myBuilder) {
-    delete myBuilder;
-    myBuilder = NULL;
-  }
-  //
-  BOPAlgo_BOP *pBOP;
-  //
-  if(myOperation==BOPAlgo_SECTION) {
-    myBuilder=new BOPAlgo_Section(myAllocator);
-    myBuilder->SetArguments(aLS);
-  }
-  else{
-    pBOP=new BOPAlgo_BOP(myAllocator); 
-    pBOP->SetArguments(myArguments);
-    pBOP->SetTools(myTools); 
-    pBOP->SetOperation(myOperation);
-    myBuilder=pBOP;
-  }
-  //
-  myBuilder->SetRunParallel(myRunParallel);
-  myBuilder->SetProgressIndicator(myProgressIndicator);
-  myBuilder->SetCheckInverted(myCheckInverted);
-  //
-  myBuilder->PerformWithFiller(*myDSFiller);
-  //
-  GetReport()->Merge (myBuilder->GetReport());
-  if (HasErrors())
+  // Check if the operation is set
+  if (myOperation == BOPAlgo_UNKNOWN)
   {
+    AddError (new BOPAlgo_AlertBOPNotSet);
     return;
   }
-  //
-  myShape=myBuilder->Shape();
-  //
-  myBuilderCanWork=Standard_True;
-  Done(); 
-  //
-  //XXXX
-  if (aDumpOper.IsDump()) {
-    BRepAlgoAPI_Check aCheckRes(myShape);
-    aDumpOper.SetIsDumpRes(!aCheckRes.IsValid());
-    aDumpOper.Dump(aS1, aS2, myShape,myOperation);
-  }
-  //XXXX
-}
-//=======================================================================
-//function : RefineEdges
-//purpose  : 
-//=======================================================================
-void BRepAlgoAPI_BooleanOperation::RefineEdges ()
-{
-  if(myFuseEdges) { 
-    return; //Edges have been refined
-  }
-  //
-  TopTools_IndexedMapOfShape mapOldEdges;
-  TopTools_ListOfShape aLS;
-  TopTools_ListIteratorOfListOfShape aIt;
-  //
-  aIt.Initialize(myArguments);
-  for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aS = aIt.Value();
-    aLS.Append(aS);
-  }
-  aIt.Initialize(myTools);
-  for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aS = aIt.Value();
-    aLS.Append(aS);
-  }
-  //
-  aIt.Initialize(aLS);
-  for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aS = aIt.Value();
-    TopExp::MapShapes (aS, TopAbs_EDGE, mapOldEdges);
-  }
-  //----------------------------------------------
-  BRepLib_FuseEdges FE(myShape);
-  FE.SetConcatBSpl(Standard_True);
-  FE.AvoidEdges (mapOldEdges);
-  //
-  // Get List of edges that have been fused
-  myFuseEdges = Standard_False;
-  myModifFaces.Clear();
-  myEdgeMap.Clear();
-  TopTools_DataMapOfIntegerListOfShape aFusedEdges;
-
-  FE.Edges(aFusedEdges);
-  Standard_Integer nle = aFusedEdges.Extent();
-  if (nle != 0) {
-    FE.Perform();
-    myShape = FE.Shape();
 
-    TopTools_DataMapOfIntegerShape aResultEdges;
-
-    FE.ResultEdges(aResultEdges);
-    FE.Faces(myModifFaces);
-    myFuseEdges = Standard_True;
-    
-    Standard_Integer i;
-    for(i = 1; i <= nle; ++i) {
-      const TopoDS_Shape& aNewE = aResultEdges(i);
-      const TopTools_ListOfShape& aListOfOldEdges = aFusedEdges(i);
-      TopTools_ListIteratorOfListOfShape anIter(aListOfOldEdges);
-      for(; anIter.More(); anIter.Next()) {
-        myEdgeMap.Bind(anIter.Value(), aNewE);
-      }
+  // DEBUG option for dumping shapes and scripts
+  BRepAlgoAPI_DumpOper aDumpOper;
+  {
+    if (aDumpOper.IsDump()) {
+      BRepAlgoAPI_Check aChekArgs(myArguments.First(), myTools.First(), myOperation);
+      aDumpOper.SetIsDumpArgs(!aChekArgs.IsValid());
     }
   }
-}
-//=======================================================================
-//function : RefinedList
-//purpose  : 
-//=======================================================================
-const TopTools_ListOfShape& BRepAlgoAPI_BooleanOperation::RefinedList
-  (const TopTools_ListOfShape& theL) 
-{
-  myGenerated.Clear();
-  TopTools_MapOfShape aMap;
-
-  TopTools_ListIteratorOfListOfShape anIter(theL);
 
-  for(; anIter.More(); anIter.Next()) {
-    const TopoDS_Shape& anS = anIter.Value();
+  // If necessary perform intersection of the argument shapes
+  if (myIsIntersectionNeeded)
+  {
+    // Combine Objects and Tools into a single list for intersection
+    TopTools_ListOfShape aLArgs = myArguments;
+    for (TopTools_ListOfShape::Iterator it(myTools); it.More(); it.Next())
+      aLArgs.Append(it.Value());
 
-    if(anS.ShapeType() == TopAbs_EDGE) {
-      if(myEdgeMap.IsBound(anS)) {
-        const TopoDS_Shape& aNewEdge = myEdgeMap.Find(anS);
-        if(aMap.Add(aNewEdge)) {
-          myGenerated.Append(aNewEdge);
-        }
-      }
-      else {
-        myGenerated.Append(anS);
-      }
-    }
-    else if (anS.ShapeType() == TopAbs_FACE) {
-      if(myModifFaces.IsBound(anS)) {
-        myGenerated.Append(myModifFaces.Find(anS));
-      }
-      else {
-        myGenerated.Append(anS);
+    // Perform intersection
+    IntersectShapes(aLArgs);
+    if (HasErrors())
+    {
+      if (aDumpOper.IsDump())
+      {
+        aDumpOper.SetIsDumpRes(Standard_False);
+        aDumpOper.Dump(myArguments.First(), myTools.First(), TopoDS_Shape(), myOperation);
       }
-    }
-    else {
-      myGenerated.Append(anS);
+      return;
     }
   }
 
-  return myGenerated;
-
-}
-//=======================================================================
-//function : SectionEdges
-//purpose  : 
-//=======================================================================
-const TopTools_ListOfShape& BRepAlgoAPI_BooleanOperation::SectionEdges()
-{
-  if (myBuilder==NULL) {
-    myGenerated.Clear();
-    return myGenerated;
-  }
-  //
-  Standard_Integer aNb, i, j, aNbCurves, nE;
-  BOPDS_ListIteratorOfListOfPaveBlock anIt;
-  //
-  const BOPDS_PDS& pDS = myDSFiller->PDS();
-  BOPDS_VectorOfInterfFF& aFFs=pDS->InterfFF();
-  myGenerated.Clear();
-  //
-  aNb=aFFs.Length();
-  for (i = 0; i < aNb; i++) {
-    BOPDS_InterfFF& aFFi=aFFs(i);
-    const BOPDS_VectorOfCurve& aSeqOfCurve=aFFi.Curves();
-    //
-    aNbCurves=aSeqOfCurve.Length();
-    for (j=0; j<aNbCurves; j++) {
-      const BOPDS_Curve& aCurve=aSeqOfCurve(j);
-      const BOPDS_ListOfPaveBlock& aSectEdges = aCurve.PaveBlocks();
-      //
-      anIt.Initialize(aSectEdges);
-      for(; anIt.More(); anIt.Next()) {
-        const Handle(BOPDS_PaveBlock)& aPB = anIt.Value();
-        nE = aPB->Edge();
-        const TopoDS_Shape& aE = pDS->Shape(nE);
-        myGenerated.Append(aE);
-      }
-    }
-  }
-  //
-  if(myFuseEdges) {
-    TopTools_ListOfShape theLS;
-    theLS.Assign(myGenerated);
-    //
-    RefinedList(theLS);
-  }
-  //
-  return myGenerated;
-}
-//=======================================================================
-//function : Generated
-//purpose  : 
-//=======================================================================
-const TopTools_ListOfShape& BRepAlgoAPI_BooleanOperation::Generated
-  (const TopoDS_Shape& S) 
-{
-  if (myBuilder==NULL) {
-    myGenerated.Clear();
-    return myGenerated;
+  // Builder Initialization
+  if (myOperation == BOPAlgo_SECTION)
+  {
+    myBuilder = new BOPAlgo_Section(myAllocator);
+    myBuilder->SetArguments(myDSFiller->Arguments());
   }
-  //
-  if(myFuseEdges) {
-    const TopTools_ListOfShape& aL = myBuilder->Generated(S);
-    return RefinedList(aL);
+  else
+  {
+    myBuilder = new BOPAlgo_BOP(myAllocator);
+    myBuilder->SetArguments(myArguments);
+    ((BOPAlgo_BOP*)myBuilder)->SetTools(myTools);
+    ((BOPAlgo_BOP*)myBuilder)->SetOperation(myOperation);
   }
-  
-  return myBuilder->Generated(S);
-}
 
-//=======================================================================
-//function : Modified
-//purpose  : 
-//=======================================================================
-const TopTools_ListOfShape& BRepAlgoAPI_BooleanOperation::Modified
-  (const TopoDS_Shape& aS) 
-{
-  if (myBuilder==NULL) {
-    myGenerated.Clear();
-    return myGenerated;
-  }
-  else {
-    myGenerated = myBuilder->Modified(aS);
+  // Build the result
+  BuildResult();
 
-    if(myFuseEdges) {
-      TopTools_ListOfShape theLS;
-      theLS.Assign(myGenerated);
-      //
-      RefinedList(theLS);
-    }
-    return myGenerated;
-  }
-}
-//=======================================================================
-//function : IsDeleted
-//purpose  : 
-//=======================================================================
-Standard_Boolean BRepAlgoAPI_BooleanOperation::IsDeleted
-  (const TopoDS_Shape& aS) 
-{
-  Standard_Boolean bDeleted = Standard_True; 
-  if (myBuilder != NULL) {
-    bDeleted=myBuilder->IsDeleted(aS);
-  }
-  return bDeleted; 
-}
-//=======================================================================
-//function : HasModified
-//purpose  : 
-//=======================================================================
-Standard_Boolean BRepAlgoAPI_BooleanOperation::HasModified() const
-{
-  if (myBuilder==NULL) {
-    return Standard_False;
-  }
-  return myBuilder->HasModified();
-}
-//=======================================================================
-//function : HasGenerated
-//purpose  : 
-//=======================================================================
-Standard_Boolean BRepAlgoAPI_BooleanOperation::HasGenerated() const
-{
-  if (myBuilder==NULL) {
-    return Standard_False;
-  }
-  return myBuilder->HasGenerated();
-}
-//=======================================================================
-//function : HasDeleted
-//purpose  : 
-//=======================================================================
-Standard_Boolean BRepAlgoAPI_BooleanOperation::HasDeleted() const
-{
-  if (myBuilder==NULL) {
-    return Standard_False;
+  if (aDumpOper.IsDump()) {
+    Standard_Boolean isDumpRes = myShape.IsNull() ||
+                                 !BRepAlgoAPI_Check(myShape).IsValid();
+    aDumpOper.SetIsDumpRes(isDumpRes);
+    aDumpOper.Dump(myArguments.First(), myTools.First(), myShape, myOperation);
   }
-  return myBuilder->HasDeleted();
 }
-//XXXX
+
 //=======================================================================
 //function : Dump
-//purpose  : 
+//purpose  : DEBUG: Dumping the shapes and script of the operation
 //=======================================================================
-void BRepAlgoAPI_DumpOper::Dump (const TopoDS_Shape& theShape1,
-                                 const TopoDS_Shape& theShape2,
-                                 const TopoDS_Shape& theResult,
-                                 BOPAlgo_Operation theOperation)
+void BRepAlgoAPI_DumpOper::Dump(const TopoDS_Shape& theShape1,
+                                const TopoDS_Shape& theShape2,
+                                const TopoDS_Shape& theResult,
+                                BOPAlgo_Operation theOperation)
 {
   if (!(myIsDumpArgs && myIsDumpRes)) {
     return;
index 566805b..b298efa 100644 (file)
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Handle.hxx>
 
-#include <TopTools_ListOfShape.hxx>
 #include <BOPAlgo_Operation.hxx>
-#include <Standard_Boolean.hxx>
-#include <TopTools_DataMapOfShapeShape.hxx>
 #include <BRepAlgoAPI_BuilderAlgo.hxx>
 class BOPAlgo_PaveFiller;
 class TopoDS_Shape;
 
-
-
-//! The abstract class BooleanOperation is the root
-//! class of Boolean Operations (see Overview).
-//! Boolean Operations algorithm is divided onto two parts:<br>
-//! - The first one is computing interference between arguments;<br>
-//! - The second one is building the result of operation;<br>
-//! The class BooleanOperation provides API level of both parts.<br>
+//! The root API class for performing Boolean Operations on arbitrary shapes.
 //!
-//! Additionally to the errors of the parent class the algorithm
-//! returns the following Error statuses:<br>
-//! - 0 - in case of success;<br>
-//! - *BOPAlgo_AlertBOPNotSet* - in case the type of Boolean Operation is not set.<br>
+//! The arguments of the operation are divided in two groups - *Objects* and *Tools*.
+//! Each group can contain any number of shapes, but each shape should be valid
+//! in terms of *BRepCheck_Analyzer* and *BOPAlgo_ArgumentAnalyzer*.
+//! The algorithm builds the splits of the given arguments using the intersection
+//! results and combines the result of Boolean Operation of given type:
+//! - *FUSE* - union of two groups of objects;
+//! - *COMMON* - intersection of two groups of objects;
+//! - *CUT* - subtraction of one group from the other;
+//! - *SECTION* - section edges and vertices of all arguments;
+//!
+//! The rules for the arguments and type of the operation are the following:
+//! - For Boolean operation *FUSE* all arguments should have equal dimensions;
+//! - For Boolean operation *CUT* the minimal dimension of *Tools* should not be
+//!   less than the maximal dimension of *Objects*;
+//! - For Boolean operation *COMMON* the arguments can have any dimension.
+//! - For Boolean operation *SECTION* the arguments can be of any type.
 //!
+//! Additionally to the errors of the base class the algorithm returns
+//! the following Errors:<br>
+//! - *BOPAlgo_AlertBOPNotSet* - in case the type of Boolean Operation is not set.<br>
 class BRepAlgoAPI_BooleanOperation  : public BRepAlgoAPI_BuilderAlgo
 {
 public:
 
   DEFINE_STANDARD_ALLOC
 
-  
-  //! Returns the first argument involved in this Boolean operation.
-  //! Obsolete
-  Standard_EXPORT const TopoDS_Shape& Shape1() const;
-  
-  //! Returns the second argument involved in this Boolean operation.
-  //! Obsolete
-  Standard_EXPORT const TopoDS_Shape& Shape2() const;
-  
-  //! Sets the tools
-  Standard_EXPORT void SetTools (const TopTools_ListOfShape& theLS);
-  
-  //! Gets the tools
-  Standard_EXPORT const TopTools_ListOfShape& Tools() const;
-  
-  //! Sets the type of Boolean operation
-  Standard_EXPORT void SetOperation (const BOPAlgo_Operation anOp);
-  
-  //! Returns the type of Boolean Operation
-  Standard_EXPORT BOPAlgo_Operation Operation() const;
-Standard_EXPORT virtual ~BRepAlgoAPI_BooleanOperation();
-  
-  //! Performs the algorithm
-  //! Filling interference Data Structure (if it is necessary)
-  //! Building the result of the operation.
-  Standard_EXPORT virtual void Build() Standard_OVERRIDE;
-  
-  //! Returns True if there was no errors occured
-  //! obsolete
-  Standard_EXPORT Standard_Boolean BuilderCanWork() const;
-  
-  //! Returns the flag of edge refining
-  Standard_EXPORT Standard_Boolean FuseEdges() const;
-  
-  //! Fuse C1 edges
-  Standard_EXPORT void RefineEdges();
-  
-  //! Returns a list of section edges.
-  //! The edges represent the result of intersection between arguments of
-  //! Boolean Operation. They are computed during operation execution.
-  Standard_EXPORT const TopTools_ListOfShape& SectionEdges();
-  
-  //! Returns the list  of shapes modified from the shape <S>.
-  Standard_EXPORT virtual const TopTools_ListOfShape& Modified (const TopoDS_Shape& aS) Standard_OVERRIDE;
-  
-  //! Returns true if the shape S has been deleted. The
-  //! result shape of the operation does not contain the shape S.
-  Standard_EXPORT virtual Standard_Boolean IsDeleted (const TopoDS_Shape& aS) Standard_OVERRIDE;
-  
-  //! Returns the list  of shapes generated from the shape <S>.
-  //! For use in BRepNaming.
-  Standard_EXPORT virtual const TopTools_ListOfShape& Generated (const TopoDS_Shape& S) Standard_OVERRIDE;
-  
-  //! Returns true if there is at least one modified shape.
-  //! For use in BRepNaming.
-  Standard_EXPORT virtual Standard_Boolean HasModified() const Standard_OVERRIDE;
-  
-  //! Returns true if there is at least one generated shape.
-  //! For use in BRepNaming.
-  Standard_EXPORT virtual Standard_Boolean HasGenerated() const Standard_OVERRIDE;
-  
-  //! Returns true if there is at least one deleted shape.
-  //! For use in BRepNaming.
-  Standard_EXPORT virtual Standard_Boolean HasDeleted() const Standard_OVERRIDE;
-
-protected:
-  
+public: //! @name Constructors
+
   //! Empty constructor
   Standard_EXPORT BRepAlgoAPI_BooleanOperation();
-  
-  //! Empty constructor
-  //! <PF> - PaveFiller object that is carried out
-  Standard_EXPORT BRepAlgoAPI_BooleanOperation(const BOPAlgo_PaveFiller& PF);
-  
-  //! Constructor with two arguments
-  //! <S1>, <S2>  -arguments
-  //! <anOperation> - the type of the operation
+
+  //! Constructor with precomputed intersections of arguments.
+  Standard_EXPORT BRepAlgoAPI_BooleanOperation(const BOPAlgo_PaveFiller& thePF);
+
+
+public: //! @name Setting/getting arguments
+
+  //! Returns the first argument involved in this Boolean operation.
   //! Obsolete
-  Standard_EXPORT BRepAlgoAPI_BooleanOperation(const TopoDS_Shape& S1, const TopoDS_Shape& S2, const BOPAlgo_Operation anOperation);
-  
-  //! Constructor with two arguments
-  //! <S1>, <S2>  -arguments
-  //! <anOperation> - the type of the operation
-  //! <PF> - PaveFiller object that is carried out
+  const TopoDS_Shape& Shape1() const
+  {
+    return myArguments.First();
+  }
+
+  //! Returns the second argument involved in this Boolean operation.
   //! Obsolete
-  Standard_EXPORT BRepAlgoAPI_BooleanOperation(const TopoDS_Shape& S1, const TopoDS_Shape& S2, const BOPAlgo_PaveFiller& PF, const BOPAlgo_Operation anOperation);
-  
-  Standard_EXPORT virtual void Clear() Standard_OVERRIDE;
-  
-  Standard_EXPORT virtual void SetAttributes();
-  
-  //! Returns the list  of shapes generated from the shape <S>.
-  //! For use in BRepNaming.
-  Standard_EXPORT const TopTools_ListOfShape& RefinedList (const TopTools_ListOfShape& theL);
+  const TopoDS_Shape& Shape2() const
+  {
+    return myTools.First();
+  }
 
+  //! Sets the Tool arguments
+  void SetTools(const TopTools_ListOfShape& theLS)
+  {
+    myTools = theLS;
+  }
 
-  TopTools_ListOfShape myTools;
-  BOPAlgo_Operation myOperation;
-  Standard_Boolean myBuilderCanWork;
+  //! Returns the Tools arguments
+  const TopTools_ListOfShape& Tools() const
+  {
+    return myTools;
+  }
 
 
-private:
+public: //! @name Setting/Getting the type of Boolean operation
 
+  //! Sets the type of Boolean operation
+  void SetOperation(const BOPAlgo_Operation theBOP)
+  {
+    myOperation = theBOP;
+  }
 
+  //! Returns the type of Boolean Operation
+  BOPAlgo_Operation Operation() const
+  {
+    return myOperation;
+  }
 
-  Standard_Boolean myFuseEdges;
-  TopTools_DataMapOfShapeShape myModifFaces;
-  TopTools_DataMapOfShapeShape myEdgeMap;
 
+public: //! @name Performing the operation
 
-};
+  //! Performs the Boolean operation.
+  Standard_EXPORT virtual void Build() Standard_OVERRIDE;
 
 
+protected: //! @name Constructors
 
+  //! Constructor to perform Boolean operation on only two arguments.
+  //! Obsolete
+  Standard_EXPORT BRepAlgoAPI_BooleanOperation(const TopoDS_Shape& theS1,
+                                               const TopoDS_Shape& theS2,
+                                               const BOPAlgo_Operation theOperation);
 
+  //! Constructor to perform Boolean operation on only two arguments
+  //! with precomputed intersection results.
+  //! Obsolete
+  Standard_EXPORT BRepAlgoAPI_BooleanOperation(const TopoDS_Shape& theS1,
+                                               const TopoDS_Shape& theS2,
+                                               const BOPAlgo_PaveFiller& thePF,
+                                               const BOPAlgo_Operation theOperation);
 
 
+protected: //! @name Fields
+
+  TopTools_ListOfShape myTools;  //!< Tool arguments of operation
+  BOPAlgo_Operation myOperation; //!< Type of Boolean Operation
+
+};
 
 #endif // _BRepAlgoAPI_BooleanOperation_HeaderFile
index f7e77e7..96ce7fd 100644 (file)
 // commercial license or contractual agreement.
 
 
+#include <BRepAlgoAPI_BuilderAlgo.hxx>
+
 #include <BOPAlgo_Builder.hxx>
 #include <BOPAlgo_PaveFiller.hxx>
-#include <BRepAlgoAPI_BuilderAlgo.hxx>
+#include <BOPDS_DS.hxx>
+#include <ShapeUpgrade_UnifySameDomain.hxx>
 #include <TopoDS_Shape.hxx>
 
 //=======================================================================
-// function: 
+// function: BRepAlgoAPI_BuilderAlgo
 // purpose: 
 //=======================================================================
 BRepAlgoAPI_BuilderAlgo::BRepAlgoAPI_BuilderAlgo()
 :
   BRepAlgoAPI_Algo(),
-  myEntryType(1),
-  myDSFiller(NULL),
-  myBuilder(NULL),
   myNonDestructive(Standard_False),
   myGlue(BOPAlgo_GlueOff),
-  myCheckInverted(Standard_True)
+  myCheckInverted(Standard_True),
+  myFillHistory(Standard_True),
+  myIsIntersectionNeeded(Standard_True),
+  myDSFiller(NULL),
+  myBuilder(NULL)
 {}
 //=======================================================================
-// function: 
+// function: BRepAlgoAPI_BuilderAlgo
 // purpose: 
 //=======================================================================
-BRepAlgoAPI_BuilderAlgo::BRepAlgoAPI_BuilderAlgo
-  (const BOPAlgo_PaveFiller& aPF)
+BRepAlgoAPI_BuilderAlgo::BRepAlgoAPI_BuilderAlgo(const BOPAlgo_PaveFiller& aPF)
 :
   BRepAlgoAPI_Algo(),
-  myEntryType(0),
-  myBuilder(NULL),
   myNonDestructive(Standard_False),
   myGlue(BOPAlgo_GlueOff),
-  myCheckInverted(Standard_True)
+  myCheckInverted(Standard_True),
+  myFillHistory(Standard_True),
+  myIsIntersectionNeeded(Standard_False),
+  myBuilder(NULL)
 {
-  BOPAlgo_PaveFiller* pPF=(BOPAlgo_PaveFiller*)&aPF;
-  myDSFiller=pPF;
+  myDSFiller = (BOPAlgo_PaveFiller*)&aPF;
 }
 //=======================================================================
 // function: ~
@@ -58,163 +61,171 @@ BRepAlgoAPI_BuilderAlgo::~BRepAlgoAPI_BuilderAlgo()
   Clear();
 }
 //=======================================================================
-//function : SetNonDestructive
-//purpose  : 
-//=======================================================================
-void BRepAlgoAPI_BuilderAlgo::SetNonDestructive(const Standard_Boolean theFlag)
-{
-  myNonDestructive = theFlag;
-}
-//=======================================================================
-//function : NonDestructive
-//purpose  : 
-//=======================================================================
-Standard_Boolean BRepAlgoAPI_BuilderAlgo::NonDestructive() const
-{
-  return myNonDestructive;
-}
-//=======================================================================
-//function : SetGlue
-//purpose  : 
-//=======================================================================
-void BRepAlgoAPI_BuilderAlgo::SetGlue(const BOPAlgo_GlueEnum theGlue)
-{
-  myGlue=theGlue;
-}
-//=======================================================================
-//function : Glue
-//purpose  : 
-//=======================================================================
-BOPAlgo_GlueEnum BRepAlgoAPI_BuilderAlgo::Glue() const 
-{
-  return myGlue;
-}
-//=======================================================================
 //function : Clear
 //purpose  : 
 //=======================================================================
 void BRepAlgoAPI_BuilderAlgo::Clear()
 {
   BRepAlgoAPI_Algo::Clear();
-  if (myDSFiller && myEntryType) {
+  if (myDSFiller && myIsIntersectionNeeded)
+  {
     delete myDSFiller;
-    myDSFiller=NULL;
+    myDSFiller = NULL;
   }
-  if (myBuilder) {
+  if (myBuilder)
+  {
     delete myBuilder;
     myBuilder=NULL;
   }
+  if (myHistory)
+    myHistory.Nullify();
+
+  if (mySimplifierHistory)
+    mySimplifierHistory.Nullify();
 }
 //=======================================================================
-//function : SetArguments
+//function : Build
 //purpose  : 
 //=======================================================================
-void BRepAlgoAPI_BuilderAlgo::SetArguments
-  (const TopTools_ListOfShape& theLS)
+void BRepAlgoAPI_BuilderAlgo::Build()
 {
-  myArguments=theLS;
+  // Setting not done status
+  NotDone();
+  // Destroy the tools if necessary
+  Clear();
+  // If necessary perform intersection of the argument shapes
+  IntersectShapes(myArguments);
+  if (HasErrors())
+    return;
+
+  // Initialization of the Building tool
+  myBuilder = new BOPAlgo_Builder(myAllocator);
+  // Set arguments to builder
+  myBuilder->SetArguments(myArguments);
+
+  // Build the result basing on intersection results
+  BuildResult();
 }
+
 //=======================================================================
-//function : Arguments
-//purpose  : 
+//function : IntersectShapes
+//purpose  : Intersects the given shapes with the intersection tool
 //=======================================================================
-const TopTools_ListOfShape& BRepAlgoAPI_BuilderAlgo::Arguments()const
+void BRepAlgoAPI_BuilderAlgo::IntersectShapes(const TopTools_ListOfShape& theArgs)
 {
-  return myArguments;
+  if (!myIsIntersectionNeeded)
+    return;
+
+  if (myDSFiller)
+    delete myDSFiller;
+
+  // Create new Filler
+  myDSFiller = new BOPAlgo_PaveFiller(myAllocator);
+  // Set arguments for intersection
+  myDSFiller->SetArguments(theArgs);
+  // Set options for intersection
+  myDSFiller->SetRunParallel(myRunParallel);
+  myDSFiller->SetProgressIndicator(myProgressIndicator);
+  myDSFiller->SetFuzzyValue(myFuzzyValue);
+  myDSFiller->SetNonDestructive(myNonDestructive);
+  myDSFiller->SetGlue(myGlue);
+  myDSFiller->SetUseOBB(myUseOBB);
+  // Set Face/Face intersection options to the intersection algorithm
+  SetAttributes();
+  // Perform intersection
+  myDSFiller->Perform();
+  // Check for the errors during intersection
+  GetReport()->Merge(myDSFiller->GetReport());
 }
 //=======================================================================
-//function : Build
-//purpose  : 
+//function : BuildResult
+//purpose  : Builds the result shape
 //=======================================================================
-void BRepAlgoAPI_BuilderAlgo::Build()
+void BRepAlgoAPI_BuilderAlgo::BuildResult()
 {
-  NotDone();
-  //
-  Clear();
-  //
-  if (myEntryType) {
-    if (myDSFiller) {
-      delete myDSFiller;
-    }
-    myDSFiller=new BOPAlgo_PaveFiller(myAllocator);
-    //
-    myDSFiller->SetArguments(myArguments);
-    //
-    myDSFiller->SetRunParallel(myRunParallel);
-    myDSFiller->SetProgressIndicator(myProgressIndicator);
-    myDSFiller->SetFuzzyValue(myFuzzyValue);
-    myDSFiller->SetNonDestructive(myNonDestructive);
-    myDSFiller->SetGlue(myGlue);
-    myDSFiller->SetUseOBB(myUseOBB);
-    //
-    myDSFiller->Perform();
-    //
-    GetReport()->Merge (myDSFiller->GetReport());
-    if (HasErrors())
-    {
-      return;
-    }
-  }// if (myEntryType) {
-  // 
-  if (myBuilder) {
-    delete myBuilder;
-    myBuilder = NULL;
-  }
-  myBuilder=new BOPAlgo_Builder(myAllocator);
-  //
-  myBuilder->SetArguments(myArguments);
-  //
+  // Set options to the builder
   myBuilder->SetRunParallel(myRunParallel);
   myBuilder->SetProgressIndicator(myProgressIndicator);
   myBuilder->SetCheckInverted(myCheckInverted);
-  //
+  myBuilder->SetToFillHistory(myFillHistory);
+  // Perform building of the result with pre-calculated intersections
   myBuilder->PerformWithFiller(*myDSFiller);
-  //
-  GetReport()->Merge (myBuilder->GetReport());
-  //
+  // Merge the warnings of the Building part
+  GetReport()->Merge(myBuilder->GetReport());
+  // Check for the errors
+  if (myBuilder->HasErrors())
+    return;
+  // Set done status
   Done();
-  myShape=myBuilder->Shape();
+  // Get the result shape
+  myShape = myBuilder->Shape();
+  // Fill history
+  if (myFillHistory)
+  {
+    myHistory = new BRepTools_History;
+    myHistory->Merge(myBuilder->History());
+  }
 }
 //=======================================================================
-//function : Generated
+//function : SimplifyResult
 //purpose  : 
 //=======================================================================
-const TopTools_ListOfShape& BRepAlgoAPI_BuilderAlgo::Generated
-  (const TopoDS_Shape& aS) 
+void BRepAlgoAPI_BuilderAlgo::SimplifyResult(const Standard_Boolean theUnifyEdges,
+                                             const Standard_Boolean theUnifyFaces,
+                                             const Standard_Real    theAngularTol)
 {
-  if (myBuilder==NULL) {
-    myGenerated.Clear();
-    return myGenerated;
-  }
-  myGenerated = myBuilder->Generated(aS);
-  return myGenerated;
+  if (HasErrors())
+    return;
+
+  if (!theUnifyEdges && !theUnifyFaces)
+    return;
+
+  // Simplification tool
+  ShapeUpgrade_UnifySameDomain anUnifier(myShape, theUnifyEdges, theUnifyFaces, Standard_True);
+  // Pass options
+  anUnifier.SetLinearTolerance(myFuzzyValue);
+  anUnifier.SetAngularTolerance(theAngularTol);
+  anUnifier.SetSafeInputMode(myNonDestructive);
+  anUnifier.AllowInternalEdges(Standard_False);
+  // Perform simplification
+  anUnifier.Build();
+  // Overwrite result with simplified shape
+  myShape = anUnifier.Shape();
+  // Keep simplification history
+  mySimplifierHistory = anUnifier.History();
+  if (myFillHistory)
+    // Merge simplification history into result history
+    myHistory->Merge(mySimplifierHistory);
 }
 //=======================================================================
 //function : Modified
 //purpose  : 
 //=======================================================================
-const TopTools_ListOfShape& BRepAlgoAPI_BuilderAlgo::Modified
-  (const TopoDS_Shape& aS) 
+const TopTools_ListOfShape& BRepAlgoAPI_BuilderAlgo::Modified(const TopoDS_Shape& theS)
 {
-  if (myBuilder==NULL) {
-    myGenerated.Clear();
-    return myGenerated;
-  }
-  myGenerated = myBuilder->Modified(aS);
+  if (myFillHistory && myHistory)
+    return myHistory->Modified(theS);
+  myGenerated.Clear();
+  return myGenerated;
+}
+//=======================================================================
+//function : Generated
+//purpose  : 
+//=======================================================================
+const TopTools_ListOfShape& BRepAlgoAPI_BuilderAlgo::Generated(const TopoDS_Shape& theS)
+{
+  if (myFillHistory && myHistory)
+    return myHistory->Generated(theS);
+  myGenerated.Clear();
   return myGenerated;
 }
 //=======================================================================
 //function : IsDeleted
 //purpose  : 
 //=======================================================================
-Standard_Boolean BRepAlgoAPI_BuilderAlgo::IsDeleted
-  (const TopoDS_Shape& aS) 
+Standard_Boolean BRepAlgoAPI_BuilderAlgo::IsDeleted(const TopoDS_Shape& theS)
 {
-  Standard_Boolean bDeleted = Standard_True; 
-  if (myBuilder != NULL) {
-    bDeleted=myBuilder->IsDeleted(aS);
-  }
-  return bDeleted; 
+  return (myFillHistory && myHistory ? myHistory->IsRemoved(theS) : Standard_False);
 }
 //=======================================================================
 //function : HasModified
@@ -222,10 +233,7 @@ Standard_Boolean BRepAlgoAPI_BuilderAlgo::IsDeleted
 //=======================================================================
 Standard_Boolean BRepAlgoAPI_BuilderAlgo::HasModified() const
 {
-  if (myBuilder==NULL) {
-    return Standard_False;
-  }
-  return myBuilder->HasModified();
+  return (myFillHistory && myHistory ? myHistory->HasModified() : Standard_False);
 }
 //=======================================================================
 //function : HasGenerated
@@ -233,10 +241,7 @@ Standard_Boolean BRepAlgoAPI_BuilderAlgo::HasModified() const
 //=======================================================================
 Standard_Boolean BRepAlgoAPI_BuilderAlgo::HasGenerated() const
 {
-  if (myBuilder==NULL) {
-    return Standard_False;
-  }
-  return myBuilder->HasGenerated();
+  return (myFillHistory && myHistory ? myHistory->HasGenerated() : Standard_False);
 }
 //=======================================================================
 //function : HasDeleted
@@ -244,8 +249,66 @@ Standard_Boolean BRepAlgoAPI_BuilderAlgo::HasGenerated() const
 //=======================================================================
 Standard_Boolean BRepAlgoAPI_BuilderAlgo::HasDeleted() const
 {
-  if (myBuilder==NULL) {
-    return Standard_False;
+  return (myFillHistory && myHistory ? myHistory->HasRemoved() : Standard_False);
+}
+//=======================================================================
+//function : SectionEdges
+//purpose  : 
+//=======================================================================
+const TopTools_ListOfShape& BRepAlgoAPI_BuilderAlgo::SectionEdges()
+{
+  myGenerated.Clear();
+  if (myBuilder == NULL)
+    return myGenerated;
+
+  // Fence map to avoid duplicated section edges in the result list
+  TopTools_MapOfShape aMFence;
+  // Intersection results
+  const BOPDS_PDS& pDS = myDSFiller->PDS();
+  // Iterate on all Face/Face interferences and take section edges
+  BOPDS_VectorOfInterfFF& aFFs = pDS->InterfFF();
+  const Standard_Integer aNbFF = aFFs.Length();
+  for (Standard_Integer i = 0; i < aNbFF; ++i)
+  {
+    BOPDS_InterfFF& aFFi = aFFs(i);
+    // Section curves between pair of faces
+    const BOPDS_VectorOfCurve& aSectionCurves = aFFi.Curves();
+    const Standard_Integer aNbC = aSectionCurves.Length();
+    for (Standard_Integer j = 0; j < aNbC; ++j)
+    {
+      const BOPDS_Curve& aCurve = aSectionCurves(j);
+      // Section edges created from the curve
+      const BOPDS_ListOfPaveBlock& aSectionEdges = aCurve.PaveBlocks();
+      BOPDS_ListIteratorOfListOfPaveBlock aItPB(aSectionEdges);
+      for (; aItPB.More(); aItPB.Next())
+      {
+        const Handle(BOPDS_PaveBlock)& aPB = aItPB.Value();
+        const TopoDS_Shape& aSE = pDS->Shape(aPB->Edge());
+        if (!aMFence.Add(aSE))
+          continue;
+        // Take into account simplification of the result shape
+        if (mySimplifierHistory)
+        {
+          if (mySimplifierHistory->IsRemoved(aSE))
+            continue;
+
+          const TopTools_ListOfShape& aLSEIm = mySimplifierHistory->Modified(aSE);
+          if (!aLSEIm.IsEmpty())
+          {
+            TopTools_ListIteratorOfListOfShape aItLEIm(aLSEIm);
+            for (; aItLEIm.More(); aItLEIm.Next())
+            {
+              if (aMFence.Add(aItLEIm.Value()))
+                myGenerated.Append(aItLEIm.Value());
+            }
+          }
+          else
+            myGenerated.Append(aSE);
+        }
+        else
+          myGenerated.Append(aSE);
+      }
+    }
   }
-  return myBuilder->HasDeleted();
+  return myGenerated;
 }
index 312dc13..d8cc474 100644 (file)
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Handle.hxx>
 
-#include <Standard_Integer.hxx>
+#include <BOPAlgo_GlueEnum.hxx>
 #include <BOPAlgo_PPaveFiller.hxx>
 #include <BOPAlgo_PBuilder.hxx>
-#include <BOPAlgo_GlueEnum.hxx>
-#include <Standard_Real.hxx>
-#include <TopTools_ListOfShape.hxx>
 #include <BRepAlgoAPI_Algo.hxx>
+#include <BRepTools_History.hxx>
+#include <Precision.hxx>
 #include <Standard_Boolean.hxx>
-class BOPAlgo_PaveFiller;
-class TopoDS_Shape;
-
+#include <Standard_Real.hxx>
+#include <TopTools_ListOfShape.hxx>
 
 //! The class contains API level of the General Fuse algorithm.<br>
 //!
@@ -43,6 +41,8 @@ class TopoDS_Shape;
 //!                          for inverted status (holes in the space). The default value is TRUE,
 //!                          i.e. the check is performed. Setting this flag to FALSE for inverted solids,
 //!                          most likely will lead to incorrect results.
+//! - *Disabling history collection* - allows disabling the collection of the history
+//!                                    of shapes modifications during the operation.
 //!
 //! It returns the following Error statuses:<br>
 //! - 0 - in case of success;<br>
@@ -52,35 +52,74 @@ class TopoDS_Shape;
 //!
 //! Warnings statuses from underlying DS Filler and Builder algorithms
 //! are collected in the report.
+//!
+//! The class provides possibility to simplify the resulting shape by unification
+//! of the tangential edges and faces. It is performed by the method *SimplifyResult*.
+//! See description of this method for more details.
+//!
 class BRepAlgoAPI_BuilderAlgo  : public BRepAlgoAPI_Algo
 {
 public:
 
   DEFINE_STANDARD_ALLOC
 
-  
+
+public: //! @name Constructors
+
   //! Empty constructor
   Standard_EXPORT BRepAlgoAPI_BuilderAlgo();
-Standard_EXPORT virtual ~BRepAlgoAPI_BuilderAlgo();
-  
-  //! Empty constructor
+  Standard_EXPORT virtual ~BRepAlgoAPI_BuilderAlgo();
+
+  //! Constructor with prepared Filler object
   Standard_EXPORT BRepAlgoAPI_BuilderAlgo(const BOPAlgo_PaveFiller& thePF);
-  
+
+
+public: //! @name Setting/Getting data for the algorithm
+
+  //! Sets the arguments
+  void SetArguments (const TopTools_ListOfShape& theLS)
+  {
+    myArguments = theLS;
+  }
+
+  //! Gets the arguments
+  const TopTools_ListOfShape& Arguments() const
+  {
+    return myArguments;
+  }
+
+
+public: //! @name Setting options
+
   //! Sets the flag that defines the mode of treatment.
   //! In non-destructive mode the argument shapes are not modified. Instead
   //! a copy of a sub-shape is created in the result if it is needed to be updated.
-  Standard_EXPORT void SetNonDestructive(const Standard_Boolean theFlag);
+  void SetNonDestructive(const Standard_Boolean theFlag)
+  {
+    myNonDestructive = theFlag;
+  }
 
   //! Returns the flag that defines the mode of treatment.
   //! In non-destructive mode the argument shapes are not modified. Instead
   //! a copy of a sub-shape is created in the result if it is needed to be updated.
-  Standard_EXPORT Standard_Boolean NonDestructive() const;
+  Standard_Boolean NonDestructive() const
+  {
+    return myNonDestructive;
+  }
+
+  //! Sets the glue option for the algorithm,
+  //! which allows increasing performance of the intersection
+  //! of the input shapes.
+  void SetGlue(const BOPAlgo_GlueEnum theGlue)
+  {
+    myGlue = theGlue;
+  }
 
-  //! Sets the glue option for the algorithm
-  Standard_EXPORT void SetGlue(const BOPAlgo_GlueEnum theGlue);
-  
   //! Returns the glue option of the algorithm
-  Standard_EXPORT BOPAlgo_GlueEnum Glue() const;
+  BOPAlgo_GlueEnum Glue() const
+  {
+    return myGlue;
+  }
 
   //! Enables/Disables the check of the input solids for inverted status
   void SetCheckInverted(const Standard_Boolean theCheck)
@@ -95,42 +134,93 @@ Standard_EXPORT virtual ~BRepAlgoAPI_BuilderAlgo();
     return myCheckInverted;
   }
 
-  //! Sets the arguments
-  Standard_EXPORT void SetArguments (const TopTools_ListOfShape& theLS);
-  
-  //! Gets the arguments
-  Standard_EXPORT const TopTools_ListOfShape& Arguments() const;
-  
+
+public: //! @name Performing the operation
+
   //! Performs the algorithm
-  //!
-  //! H  I  S  T  O  R  Y
   Standard_EXPORT virtual void Build() Standard_OVERRIDE;
-  
-  //! Returns the list  of shapes modified from the shape <S>.
-  Standard_EXPORT virtual const TopTools_ListOfShape& Modified (const TopoDS_Shape& aS) Standard_OVERRIDE;
-  
-  //! Returns true if the shape S has been deleted. The
-  //! result shape of the operation does not contain the shape S.
-  Standard_EXPORT virtual Standard_Boolean IsDeleted (const TopoDS_Shape& aS) Standard_OVERRIDE;
-  
-  //! Returns the list  of shapes generated from the shape <S>.
-  //! For use in BRepNaming.
-  Standard_EXPORT virtual const TopTools_ListOfShape& Generated (const TopoDS_Shape& S) Standard_OVERRIDE;
-  
-  //! Returns true if there is at least one modified shape.
-  //! For use in BRepNaming.
+
+
+public: //! @name Result simplification
+
+  //! Simplification of the result shape is performed by the means of
+  //! *ShapeUpgrade_UnifySameDomain* algorithm. The result of the operation will
+  //! be overwritten with the simplified result.
+  //!
+  //! The simplification is performed without creation of the Internal shapes,
+  //! i.e. shapes connections will never be broken.
+  //!
+  //! Simplification is performed on the whole result shape. Thus, if the input
+  //! shapes contained connected tangent edges or faces unmodified during the operation
+  //! they will also be unified.
+  //!
+  //! After simplification, the History of result simplification is merged into the main
+  //! history of operation. So, it is taken into account when asking for Modified,
+  //! Generated and Deleted shapes.
+  //!
+  //! Some options of the main operation are passed into the Unifier:
+  //! - Fuzzy tolerance of the operation is given to the Unifier as the linear tolerance.
+  //! - Non destructive mode here controls the safe input mode in Unifier.
+  //!
+  //! @param theUnifyEdges Controls the edges unification. TRUE by default.
+  //! @param theUnifyFaces Controls the faces unification. TRUE by default.
+  //! @param theAngularTol Angular criteria for tangency of edges and faces.
+  //!                      Precision::Angular() by default.
+  Standard_EXPORT void SimplifyResult(const Standard_Boolean theUnifyEdges = Standard_True,
+                                      const Standard_Boolean theUnifyFaces = Standard_True,
+                                      const Standard_Real    theAngularTol = Precision::Angular());
+
+
+public: //! @name History support
+
+  //! Returns the shapes modified from the shape <theS>.
+  //! If any, the list will contain only those splits of the
+  //! given shape, contained in the result.
+  Standard_EXPORT virtual const TopTools_ListOfShape& Modified(const TopoDS_Shape& theS) Standard_OVERRIDE;
+
+  //! Returns the list  of shapes generated from the shape <theS>.
+  //! In frames of Boolean Operations algorithms only Edges and Faces
+  //! could have Generated elements, as only they produce new elements
+  //! during intersection:
+  //! - Edges can generate new vertices;
+  //! - Faces can generate new edges and vertices.
+  Standard_EXPORT virtual const TopTools_ListOfShape& Generated(const TopoDS_Shape& theS) Standard_OVERRIDE;
+
+  //! Checks if the shape <theS> has been completely removed from the result,
+  //! i.e. the result does not contain the shape itself and any of its splits.
+  //! Returns TRUE if the shape has been deleted.
+  Standard_EXPORT virtual Standard_Boolean IsDeleted(const TopoDS_Shape& aS) Standard_OVERRIDE;
+
+  //! Returns true if any of the input shapes has been modified during operation.
   Standard_EXPORT virtual Standard_Boolean HasModified() const;
-  
-  //! Returns true if there is at least one generated shape.
-  //! For use in BRepNaming.
+
+  //! Returns true if any of the input shapes has generated shapes during operation.
   Standard_EXPORT virtual Standard_Boolean HasGenerated() const;
-  
-  //! Returns true if there is at least one deleted shape.
-  //! For use in BRepNaming.
-  //!
-  //! protected methods
+
+  //! Returns true if any of the input shapes has been deleted during operation.
+  //! Normally, General Fuse operation should not have Deleted elements,
+  //! but all derived operation can have.
   Standard_EXPORT virtual Standard_Boolean HasDeleted() const;
 
+
+public: //! @name Enabling/Disabling the history collection.
+
+  //! Allows disabling the history collection
+  void SetToFillHistory(const Standard_Boolean theHistFlag) { myFillHistory = theHistFlag; }
+
+  //! Returns flag of history availability
+  Standard_Boolean HasHistory() const { return myFillHistory; }
+
+
+public: //! @name Getting the section edges
+
+  //! Returns a list of section edges.
+  //! The edges represent the result of intersection between arguments of operation.
+  Standard_EXPORT const TopTools_ListOfShape& SectionEdges();
+
+
+public: //! @name Getting tools performing the job
+
   //! Returns the Intersection tool
   const BOPAlgo_PPaveFiller& DSFiller() const
   {
@@ -143,20 +233,57 @@ Standard_EXPORT virtual ~BRepAlgoAPI_BuilderAlgo();
     return myBuilder;
   }
 
-protected:
+  //! History tool
+  Handle(BRepTools_History) History() const
+  {
+    return myFillHistory ? myHistory : NULL;
+  }
+
+
+protected: //! @name Setting options to the Intersection tool
 
+  //! Sets options (available in child classes) for the intersection tool.
+  //! Here it does nothing.
+  virtual void SetAttributes() {}
+
+
+protected: //! @name Protected methods for shapes intersection and building result
+
+  //! Intersects the given shapes with the intersection tool
+  Standard_EXPORT void IntersectShapes(const TopTools_ListOfShape& theArgs);
+
+  //! Builds the resulting shape
+  Standard_EXPORT void BuildResult();
+
+
+protected: //! @name Clearing the contents of the algorithm
+
+  //! Clears the algorithm from previous runs
   Standard_EXPORT virtual void Clear() Standard_OVERRIDE;
 
-  Standard_Integer myEntryType;
-  BOPAlgo_PPaveFiller myDSFiller;
-  BOPAlgo_PBuilder myBuilder;
-  Standard_Boolean myNonDestructive;
-  TopTools_ListOfShape myArguments;
-  BOPAlgo_GlueEnum myGlue;
-  Standard_Boolean myCheckInverted;
 
-private:
+protected: //! @name Fields
+
+  // Inputs
+  TopTools_ListOfShape myArguments; //!< Arguments of the operation
+
+  // Options
+  Standard_Boolean myNonDestructive; //!< Non-destructive mode management
+  BOPAlgo_GlueEnum myGlue;           //!< Gluing mode management
+  Standard_Boolean myCheckInverted;  //!< Check for inverted solids management
+  Standard_Boolean myFillHistory;    //!< Controls the history collection
 
+  // Tools
+  Standard_Boolean myIsIntersectionNeeded; //!< Flag to control whether the intersection
+                                           //! of arguments should be performed or not
+  BOPAlgo_PPaveFiller myDSFiller;          //!< Intersection tool performs intersection of the
+                                           //! argument shapes.
+  BOPAlgo_PBuilder  myBuilder;             //!< Building tool performs construction of the result
+                                           //! basing on the results of intersection
+  Handle(BRepTools_History) myHistory;     //!< General History tool, containing all History of
+                                           //! shapes modifications during the operation
+                                           //! (including result simplification)
+  Handle(BRepTools_History) mySimplifierHistory; //!< History of result shape simplification
 };
 
 #endif // _BRepAlgoAPI_BuilderAlgo_HeaderFile
index e3fc8fa..272a876 100644 (file)
@@ -32,7 +32,7 @@ void BRepAlgoAPI_Defeaturing::Build()
   // Set the inputs to BOPAlgo_RemoveFeatures algorithm
   myFeatureRemovalTool.SetShape(myInputShape);
   myFeatureRemovalTool.AddFacesToRemove(myFacesToRemove);
-  myFeatureRemovalTool.TrackHistory(myTrackHistory);
+  myFeatureRemovalTool.SetToFillHistory(myFillHistory);
   myFeatureRemovalTool.SetRunParallel(myRunParallel);
 
   // Perform the features removal
@@ -57,10 +57,7 @@ void BRepAlgoAPI_Defeaturing::Build()
 //=======================================================================
 const TopTools_ListOfShape& BRepAlgoAPI_Defeaturing::Modified(const TopoDS_Shape& theS)
 {
-  myGenerated.Clear();
-  if (!myFeatureRemovalTool.History().IsNull())
-    myGenerated = myFeatureRemovalTool.History()->Modified(theS);
-  return myGenerated;
+  return myFeatureRemovalTool.Modified(theS);
 }
 
 //=======================================================================
@@ -69,10 +66,7 @@ const TopTools_ListOfShape& BRepAlgoAPI_Defeaturing::Modified(const TopoDS_Shape
 //=======================================================================
 const TopTools_ListOfShape& BRepAlgoAPI_Defeaturing::Generated(const TopoDS_Shape& theS)
 {
-  myGenerated.Clear();
-  if (!myFeatureRemovalTool.History().IsNull())
-    myGenerated = myFeatureRemovalTool.History()->Generated(theS);
-  return myGenerated;
+  return myFeatureRemovalTool.Generated(theS);
 }
 
 //=======================================================================
@@ -81,6 +75,32 @@ const TopTools_ListOfShape& BRepAlgoAPI_Defeaturing::Generated(const TopoDS_Shap
 //=======================================================================
 Standard_Boolean BRepAlgoAPI_Defeaturing::IsDeleted(const TopoDS_Shape& theS)
 {
-  return (!myFeatureRemovalTool.History().IsNull() ?
-    myFeatureRemovalTool.History()->IsRemoved(theS) : Standard_False);
+  return myFeatureRemovalTool.IsDeleted(theS);
+}
+
+//=======================================================================
+//function : HasModified
+//purpose  : 
+//=======================================================================
+Standard_Boolean BRepAlgoAPI_Defeaturing::HasModified() const
+{
+  return myFeatureRemovalTool.HasModified();
+}
+
+//=======================================================================
+//function : HasGenerated
+//purpose  : 
+//=======================================================================
+Standard_Boolean BRepAlgoAPI_Defeaturing::HasGenerated() const
+{
+  return myFeatureRemovalTool.HasGenerated();
+}
+
+//=======================================================================
+//function : HasDeleted
+//purpose  : 
+//=======================================================================
+Standard_Boolean BRepAlgoAPI_Defeaturing::HasDeleted() const
+{
+  return myFeatureRemovalTool.HasDeleted();
 }
index a62f30d..43258f9 100644 (file)
@@ -77,7 +77,7 @@
 //! aDF.SetShape(aSolid);                    // Set the shape
 //! aDF.AddFacesToRemove(aFaces);            // Add faces to remove
 //! aDF.SetRunParallel(bRunParallel);        // Define the processing mode (parallel or single)
-//! aDF.TrackHistory(isHistoryNeeded);       // Define whether to track the shapes modifications
+//! aDF.SetToFillHistory(isHistoryNeeded);   // Define whether to track the shapes modifications
 //! aDF.Build();                             // Perform the operation
 //! if (!aDF.IsDone())                       // Check for the errors
 //! {
@@ -110,7 +110,7 @@ public: //! @name Constructors
   BRepAlgoAPI_Defeaturing()
   :
     BRepAlgoAPI_Algo(),
-    myTrackHistory(Standard_True)
+    myFillHistory(Standard_True)
   {}
 
 
@@ -163,13 +163,13 @@ public: //! @name Performing the operation
 public: //! @name History Methods
 
   //! Defines whether to track the modification of the shapes or not.
-  void TrackHistory(const Standard_Boolean theFlag)
+  void SetToFillHistory(const Standard_Boolean theFlag)
   {
-    myTrackHistory = theFlag;
+    myFillHistory = theFlag;
   }
 
   //! Returns whether the history was requested or not.
-  Standard_Boolean HasHistory() const { return myTrackHistory; }
+  Standard_Boolean HasHistory() const { return myFillHistory; }
 
   //! Returns the list of shapes modified from the shape <theS> during the operation.
   Standard_EXPORT virtual const TopTools_ListOfShape& Modified(const TopoDS_Shape& theS) Standard_OVERRIDE;
@@ -182,8 +182,17 @@ public: //! @name History Methods
   //! Otherwise it returns false.
   Standard_EXPORT virtual Standard_Boolean IsDeleted(const TopoDS_Shape& theS) Standard_OVERRIDE;
 
+  //! Returns true if any of the input shapes has been modified during operation.
+  Standard_EXPORT virtual Standard_Boolean HasModified() const;
+
+  //! Returns true if any of the input shapes has generated shapes during operation.
+  Standard_EXPORT virtual Standard_Boolean HasGenerated() const;
+
+  //! Returns true if any of the input shapes has been deleted during operation.
+  Standard_EXPORT virtual Standard_Boolean HasDeleted() const;
+
   //! Returns the History of shapes modifications
-  Handle(BRepTools_History) GetHistory()
+  Handle(BRepTools_History) History()
   {
     return myFeatureRemovalTool.History();
   }
@@ -202,7 +211,7 @@ protected: //! @name Fields
 
   TopoDS_Shape myInputShape;                   //!< Input shape to remove the features from
   TopTools_ListOfShape myFacesToRemove;        //!< Features to remove from the shape
-  Standard_Boolean myTrackHistory;             //!< Defines whether to track the history of
+  Standard_Boolean myFillHistory;              //!< Defines whether to track the history of
                                                //! shapes modifications or not (true by default)
   BOPAlgo_RemoveFeatures myFeatureRemovalTool; //!< Tool for the features removal
 
index 97b75ff..4a0fd00 100644 (file)
@@ -14,9 +14,8 @@
 
 #include <BRepAlgoAPI_Splitter.hxx>
 
-#include <BOPAlgo_PaveFiller.hxx>
-#include <BOPAlgo_Splitter.hxx>
 #include <BOPAlgo_Alerts.hxx>
+#include <BOPAlgo_Splitter.hxx>
 
 //=======================================================================
 // function: Empty constructor
@@ -26,108 +25,49 @@ BRepAlgoAPI_Splitter::BRepAlgoAPI_Splitter()
   : BRepAlgoAPI_BuilderAlgo() {}
 
 //=======================================================================
-// function: Constructor with already filled PaveFiller
+// function: Constructor with already prepared 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()
 {
+  // Set Not Done status by default
   NotDone();
-  //
+  // Clear the contents
   Clear();
-  //
+  // Check for availability of arguments and tools
   if (myArguments.IsEmpty() ||
-    (myArguments.Extent() + myTools.Extent()) < 2) {
+     (myArguments.Extent() + myTools.Extent()) < 2)
+  {
     AddError (new BOPAlgo_AlertTooFewArguments);
     return;
   }
-  //
-  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->SetUseOBB(myUseOBB);
-    //
-    myDSFiller->Perform();
-    //
-    GetReport()->Merge (myDSFiller->GetReport());
-    if (HasErrors()) 
-    {
-      return;
-    }
-  }
-  //
-  if (myBuilder) {
-    delete myBuilder;
-  }
-  //
+
+  // If necessary perform intersection of the argument shapes
+  if (myIsIntersectionNeeded)
   {
-    BOPAlgo_Splitter *pSplitter = new BOPAlgo_Splitter(myAllocator);
-    pSplitter->SetArguments(myArguments);
-    pSplitter->SetTools(myTools);
-    myBuilder = pSplitter;
+    // Combine Arguments and Tools for intersection into a single list
+    TopTools_ListOfShape aLArgs = myArguments;
+    for (TopTools_ListOfShape::Iterator it(myTools); it.More(); it.Next())
+      aLArgs.Append(it.Value());
+
+    // Perform intersection
+    IntersectShapes(aLArgs);
+    if (HasErrors())
+      return;
   }
-  //
-  myBuilder->SetRunParallel(myRunParallel);
-  myBuilder->SetProgressIndicator(myProgressIndicator);
-  myBuilder->SetCheckInverted(myCheckInverted);
-  //
-  myBuilder->PerformWithFiller(*myDSFiller);
-  //
-  GetReport()->Merge (myBuilder->GetReport());
-  //
-  Done();
-  myShape = myBuilder->Shape();
+
+  // Initialization of the building tool
+  myBuilder = new BOPAlgo_Splitter(myAllocator);
+  myBuilder->SetArguments(myArguments);
+  ((BOPAlgo_Splitter*)myBuilder)->SetTools(myTools);
+
+  // Build result shape basing on the intersection results
+  BuildResult();
 }
index 1da8a50..9728844 100644 (file)
@@ -53,30 +53,42 @@ public:
 
   DEFINE_STANDARD_ALLOC
 
+public: //! @name Constructors
+
   //! Empty constructor
   Standard_EXPORT BRepAlgoAPI_Splitter();
-  Standard_EXPORT virtual ~BRepAlgoAPI_Splitter();
 
-  //! Constructor with already filled PaveFiller
+  //! Constructor with already prepared intersection tool - 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;
+public: //! @name Setters/Getters for the Tools
+
+  //! Sets the Tool arguments
+  void SetTools (const TopTools_ListOfShape& theLS)
+  {
+    myTools = theLS;
+  }
+
+  //! Returns the Tool arguments
+  const TopTools_ListOfShape& Tools() const
+  {
+    return myTools;
+  }
+
+
+public: //! @name Performing the operation
+
+  //! Performs the Split operation.
+  //! Performs the intersection of the argument shapes (both objects and tools)
+  //! and splits objects by the tools.
+  Standard_EXPORT virtual void Build() Standard_OVERRIDE;
 
-protected:
 
-  //! Tools arguments of the operation
-  TopTools_ListOfShape myTools;
+protected: //! @name Fields
 
-private:
+  TopTools_ListOfShape myTools; //!< Tool arguments of the operation
 
 };
 
-#endif // _BRepAlgoAPI_BuilderAlgo_HeaderFile
+#endif // _BRepAlgoAPI_Splitter_HeaderFile
index 480d233..f234831 100644 (file)
   aBB.MakeCompound(aC);
   myShape=aC;
   //
-  myFlagHistory=Standard_True;
-  //
   FillRemoved();
 }
 
index 3e9c439..bb8068e 100644 (file)
@@ -2238,9 +2238,12 @@ static Standard_Integer BOSS(Draw_Interpretor& theCommands,
     dout.Flush();
 
     // Save history for fillet
-    TopTools_ListOfShape anArg;
-    anArg.Append(V);
-    BRepTest_Objects::SetHistory(anArg, *Rakk);
+    if (BRepTest_Objects::IsHistoryNeeded())
+    {
+      TopTools_ListOfShape anArg;
+      anArg.Append(V);
+      BRepTest_Objects::SetHistory(anArg, *Rakk);
+    }
 
     return 0;
   }
index 498406c..70dafa6 100644 (file)
@@ -179,9 +179,12 @@ static Standard_Integer BLEND(Draw_Interpretor& di, Standard_Integer narg, const
   if(!Rakk->IsDone()) return 1;
 
   // Save history for fillet
-  TopTools_ListOfShape anArg;
-  anArg.Append(V);
-  BRepTest_Objects::SetHistory(anArg, *Rakk);
+  if (BRepTest_Objects::IsHistoryNeeded())
+  {
+    TopTools_ListOfShape anArg;
+    anArg.Append(V);
+    BRepTest_Objects::SetHistory(anArg, *Rakk);
+  }
 
   TopoDS_Shape res = Rakk->Shape();
   DBRep::Set(a[1],res);
index a0f3616..ab1e401 100644 (file)
 #include <TopoDS.hxx>
 #include <TopoDS_Compound.hxx>
 
-static Standard_Integer SaveHistory(Draw_Interpretor&, Standard_Integer, const char**);
-static Standard_Integer Modified   (Draw_Interpretor&, Standard_Integer, const char**);
-static Standard_Integer Generated  (Draw_Interpretor&, Standard_Integer, const char**);
-static Standard_Integer IsDeleted  (Draw_Interpretor&, Standard_Integer, const char**);
+static Standard_Integer SetFillHistory(Draw_Interpretor&, Standard_Integer, const char**);
+static Standard_Integer SaveHistory   (Draw_Interpretor&, Standard_Integer, const char**);
+static Standard_Integer Modified      (Draw_Interpretor&, Standard_Integer, const char**);
+static Standard_Integer Generated     (Draw_Interpretor&, Standard_Integer, const char**);
+static Standard_Integer IsDeleted     (Draw_Interpretor&, Standard_Integer, const char**);
 
 //=======================================================================
 //function : HistoryCommands
@@ -44,6 +45,13 @@ void BRepTest::HistoryCommands(Draw_Interpretor& theCommands)
   const char* group = "History commands";
 
   // Commands
+  theCommands.Add("setfillhistory" , "Controls the history collection by the algorithms and its saving into the session after algorithm is done.\n"
+                  "\t\tUsage: setfillhistory [flag]\n"
+                  "\t\tw/o arguments prints the current state of the option;\n"
+                  "\t\tflag == 0 - history will not be collected and saved;\n"
+                  "\t\tflag != 0 - history will be collected and saved into the session (default).",
+                  __FILE__, SetFillHistory , group);
+
   theCommands.Add("savehistory" , "savehistory name\n"
                   "\t\tSaves the history from the session into a drawable object with the name <name>.",
                   __FILE__, SaveHistory , group);
@@ -62,6 +70,33 @@ void BRepTest::HistoryCommands(Draw_Interpretor& theCommands)
 }
 
 //=======================================================================
+//function : SetFillHistory
+//purpose  : 
+//=======================================================================
+Standard_Integer SetFillHistory(Draw_Interpretor& theDI,
+                                Standard_Integer theArgc,
+                                const char** theArgv)
+{
+  if (theArgc > 2)
+  {
+    theDI.PrintHelp(theArgv[0]);
+    return 1;
+  }
+
+  if (theArgc == 1)
+  {
+    theDI << "Filling of the history is " <<
+      (BRepTest_Objects::IsHistoryNeeded() ? "enabled." : "disabled.");
+  }
+  else
+  {
+    Standard_Integer iHist = Draw::Atoi(theArgv[1]);
+    BRepTest_Objects::SetToFillHistory(iHist != 0);
+  }
+  return 0;
+}
+
+//=======================================================================
 //function : SaveHistory
 //purpose  : 
 //=======================================================================
index 2bcbc95..5db43af 100644 (file)
@@ -24,7 +24,16 @@ class BRepTest_Session
 public:
 
   //! Empty constructor
-  BRepTest_Session() {}
+  BRepTest_Session()
+  {
+    SetDefaultValues();
+  }
+
+  //! Sets the default values for the options
+  void SetDefaultValues()
+  {
+    myFillHistory = Standard_True;
+  }
 
   //! Sets the History in the session
   void SetHistory(const Handle(BRepTools_History)& theHistory)
@@ -46,9 +55,19 @@ public:
     return myHistory;
   }
 
+  //! Enables/Disables the history saving
+  void SetToFillHistory(const Standard_Boolean theFillHist)
+  {
+    myFillHistory = theFillHist;
+  }
+
+  //! Returns the flag controlling the history saving
+  Standard_Boolean IsHistoryNeeded() const { return myFillHistory; }
+
 private:
 
   Handle(BRepTools_History) myHistory;
+  Standard_Boolean myFillHistory;
 };
 
 //=======================================================================
@@ -87,3 +106,21 @@ Handle(BRepTools_History) BRepTest_Objects::History()
 {
   return GetSession().History();
 }
+
+//=======================================================================
+//function : SetToFillHistory
+//purpose  : 
+//=======================================================================
+void BRepTest_Objects::SetToFillHistory(const Standard_Boolean theFillHist)
+{
+  return GetSession().SetToFillHistory(theFillHist);
+}
+
+//=======================================================================
+//function : IsHistoryNeeded
+//purpose  : 
+//=======================================================================
+Standard_Boolean BRepTest_Objects::IsHistoryNeeded()
+{
+  return GetSession().IsHistoryNeeded();
+}
index 95a24f3..4a49d2b 100644 (file)
@@ -47,6 +47,13 @@ public:
 
   //! Returns the history from the session.
   Standard_EXPORT static Handle(BRepTools_History) History();
+
+  //! Enables/Disables the history saving
+  Standard_EXPORT static void SetToFillHistory(const Standard_Boolean theFillHist);
+
+  //! Returns the flag controlling the history collection
+  Standard_EXPORT static Standard_Boolean IsHistoryNeeded();
+
 };
 
 #endif
index 9dda669..0b2da73 100644 (file)
@@ -431,7 +431,8 @@ Standard_Integer thrusections(Draw_Interpretor&, Standard_Integer n, const char*
     TopoDS_Shape Shell = Generator->Shape();
     DBRep::Set(a[index-1], Shell);
     // Save history of the lofting
-    BRepTest_Objects::SetHistory(Generator->Wires(), *Generator);
+    if (BRepTest_Objects::IsHistoryNeeded())
+      BRepTest_Objects::SetHistory(Generator->Wires(), *Generator);
   }
   else {
     cout << "Algorithm is not done" << endl;
@@ -776,9 +777,12 @@ static Standard_Integer buildsweep(Draw_Interpretor& di,
     result = Sweep->Shape();
     DBRep::Set(a[1],result);
     // Save history of sweep
-    TopTools_ListOfShape aProfiles;
-    Sweep->Profiles(aProfiles);
-    BRepTest_Objects::SetHistory(aProfiles, *Sweep);
+    if (BRepTest_Objects::IsHistoryNeeded())
+    {
+      TopTools_ListOfShape aProfiles;
+      Sweep->Profiles(aProfiles);
+      BRepTest_Objects::SetHistory(aProfiles, *Sweep);
+    }
   }
 
   return 0;
index 23867a6..0fee0a1 100644 (file)
@@ -112,17 +112,11 @@ void BRepTools_History::Remove(const TopoDS_Shape& theRemoved)
   // Apply the limitations.
   Standard_ASSERT_RETURN(IsSupportedType(theRemoved), myMsgUnsupportedType,);
 
-  if (myShapeToGenerated.UnBind(theRemoved))
-  {
-    Standard_ASSERT_INVOKE_(, myMsgGeneratedAndRemoved);
-  }
-
   if (myShapeToModified.UnBind(theRemoved))
   {
     Standard_ASSERT_INVOKE_(, myMsgModifiedAndRemoved);
   }
 
-  //
   myRemoved.Add(theRemoved);
 }
 
@@ -349,11 +343,6 @@ Standard_Boolean BRepTools_History::prepareGenerated(
   Standard_ASSERT_RETURN(theInitial.IsNull() ||
     IsSupportedType(theInitial), myMsgUnsupportedType, Standard_False);
 
-  if (myRemoved.Remove(theInitial))
-  {
-    Standard_ASSERT_INVOKE_(, myMsgGeneratedAndRemoved);
-  }
-
   if (myShapeToModified.IsBound(theInitial) &&
     myShapeToModified(theInitial).Remove(theGenerated))
   {
index 7290c80..b5edd8d 100644 (file)
@@ -35,8 +35,13 @@ DEFINE_STANDARD_HANDLE(BRepTools_History, Standard_Transient)
 //!
 //! The last relation means that:
 //! 1) shape Si is not an output shape and
-//! 2) no any shape is generated or modified (produced) from shape Si:
-//! R(Si) == 1 ==> Si != Tj, G(Si) == 0, M(Si) == 0.
+//! 2) no any shape is modified (produced) from shape Si:
+//! R(Si) == 1 ==> Si != Tj, M(Si) == 0.
+//!
+//! It means that the input shape cannot be removed and modified
+//! simultaneously. However, the shapes may be generated from the
+//! removed shape. For instance, in Fillet operation the edges
+//! generate faces and then are removed.
 //!
 //! No any shape could be generated and modified from the same shape
 //! simultaneously: sets G(Si) and M(Si) are not intersected
@@ -56,7 +61,7 @@ DEFINE_STANDARD_HANDLE(BRepTools_History, Standard_Transient)
 //! 3) a shape is generated from input shapes of the same dimension if it is
 //!   produced by joining shapes generated from these shapes;
 //! 4) a shape is modified from an input shape if it replaces the input shape by
-//!   changes of the location, the tolerance, the bounds of the parametrical
+//!   changes of the location, the tolerance, the bounds of the parametric
 //!   space (the faces for a solid), the parametrization and/or by applying of
 //!   an approximation;
 //! 5) a shape is modified from input shapes of the same dimension if it is
@@ -111,10 +116,7 @@ public: //! @name Constructors for History creation
         continue;
 
       if (theAlgo.IsDeleted(aS))
-      {
         Remove(aS);
-        continue;
-      }
 
       // Check Modified
       const TopTools_ListOfShape& aModified = theAlgo.Modified(aS);
@@ -191,6 +193,15 @@ public: //! Methods to read the history.
   Standard_EXPORT
   Standard_Boolean IsRemoved(const TopoDS_Shape& theInitial) const;
 
+  //! Returns 'true' if there any shapes with Generated elements present
+  Standard_Boolean HasGenerated() const { return !myShapeToGenerated.IsEmpty(); }
+
+  //! Returns 'true' if there any Modified shapes present
+  Standard_Boolean HasModified() const { return !myShapeToModified.IsEmpty(); }
+
+  //! Returns 'true' if there any removed shapes present
+  Standard_Boolean HasRemoved() const { return !myRemoved.IsEmpty(); }
+
 public: //! A method to merge a next history to this history.
 
   //! Merges the next history to this history.
index 1c969b4..215f882 100644 (file)
@@ -1299,7 +1299,7 @@ static Standard_Integer unifysamedom(Draw_Interpretor& di, Standard_Integer n, c
     di << "+b to switch on 'concat bspline' mode\n";
     di << "+i to switch on 'allow internal edges' mode\n";
     di << "-t val to set linear tolerance\n";
-    di << "-a val to set angular tolerance\n";
+    di << "-a val to set angular tolerance (in degrees)\n";
     di << "'unify-faces' and 'unify-edges' modes are switched on by default";
     return 1;
   }
@@ -1341,7 +1341,10 @@ static Standard_Integer unifysamedom(Draw_Interpretor& di, Standard_Integer n, c
         {
           if (++i < n)
           {
-            (a[i-1][1] == 't' ? aLinTol : aAngTol) = Draw::Atof(a[i]);
+            if (a[i-1][1] == 't')
+              aLinTol = Draw::Atof(a[i]);
+            else
+              aAngTol = Draw::Atof(a[i]) * (M_PI / 180.0);
           }
           else
           {
@@ -1361,7 +1364,8 @@ static Standard_Integer unifysamedom(Draw_Interpretor& di, Standard_Integer n, c
   Unifier().Build();
   TopoDS_Shape Result = Unifier().Shape();
 
-  BRepTest_Objects::SetHistory(Unifier().History());
+  if (BRepTest_Objects::IsHistoryNeeded())
+    BRepTest_Objects::SetHistory(Unifier().History());
 
   DBRep::Set(a[1], Result);
   return 0;
index 5511fa8..5162cb0 100644 (file)
@@ -122,7 +122,7 @@ public:
   //! this value they will not be merged. Default value is Precision::Angular().
   void SetAngularTolerance(const Standard_Real theValue)
   {
-    myAngTol = theValue;
+    myAngTol = (theValue < Precision::Angular() ? Precision::Angular() : theValue);
   }
 
   //! Performs unification and builds the resulting shape.
index 7b689c6..c114c1d 100644 (file)
@@ -28,4 +28,5 @@
 028 cells_test
 029 splitter
 030 history
-031 removefeatures
\ No newline at end of file
+031 removefeatures
+032 simplify
\ No newline at end of file
diff --git a/tests/boolean/history/A9 b/tests/boolean/history/A9
new file mode 100644 (file)
index 0000000..95afd2f
--- /dev/null
@@ -0,0 +1,41 @@
+# History of section operation
+
+# extract faces of the box, enlarge them and intersect
+box b 10 10 10
+
+compound faces
+
+foreach f [explode b f] {
+  mksurface s $f
+  mkface fn s -100 100 -100 100
+  add fn faces
+}
+
+# perform intersection
+bclearobjects
+bcleartools
+baddcompound faces
+bfillds
+# enable history collection
+setfillhistory 1
+bbop result 4
+
+savehistory history
+
+# check that all faces have been deleted, have not been modified
+# and each face has generated edges
+
+foreach f [explode faces] {
+  if {![regexp "Deleted" [isdeleted history $f]]} {
+    puts "Error: Incorrect information about deleted shapes"
+  }
+  
+  if {![regexp "The shape has not been modified" [modified modif history $f]]} {
+    puts "Error: Incorrect information about modified shapes"
+  }
+
+  if {[regexp "No shapes were generated from the shape" [generated gen history $f]]} {
+    puts "Error: Incorrect information about generated shapes"
+  }
+  checknbshapes gen -edge 12
+}
diff --git a/tests/boolean/simplify/A1 b/tests/boolean/simplify/A1
new file mode 100644 (file)
index 0000000..c8cac62
--- /dev/null
@@ -0,0 +1,24 @@
+# Fuse of two boxes
+
+boptions -default
+
+box b1 10 10 15
+box b2 3 7 0 10 10 15
+bclearobjects
+bcleartools
+baddobjects b1
+baddtools b2
+bfillds
+
+# build not simplified result
+bapibop res 1
+checkshape res
+checknbshapes res -vertex 20 -edge 32 -wire 14 -face 14
+
+# set option to simplify result
+bsimplify -f 1
+bapibop res_simple 1
+checkshape res_simple
+checknbshapes res_simple -vertex 16 -edge 24 -wire 10 -face 10
+
+boptions -default
diff --git a/tests/boolean/simplify/A2 b/tests/boolean/simplify/A2
new file mode 100644 (file)
index 0000000..26cad6f
--- /dev/null
@@ -0,0 +1,33 @@
+# Section between shell and a plane
+
+boptions -default
+
+plane p 0 0 0 0 0 1
+mkface f1 p -10 10 -10 10
+mkface f2 p 10 30 -10 10
+mkface f3 p 30 50 -10 10
+sewing shell f1 f2 f3
+
+plane p 0 5 0 0 1 0
+mkface f p -100 100 -100 100
+
+bclearobjects
+bcleartools
+baddobjects shell
+baddtools f
+bfillds
+
+# build not simplified result
+bapibop sec 4
+checkshape sec
+checknbshapes sec -vertex 4 -edge 3
+checkprops sec -l 60
+
+# set option to simplify result
+bsimplify -e 1
+bapibop sec_simple 4
+checkshape sec_simple
+checknbshapes sec_simple -vertex 2 -edge 1
+checkprops sec_simple -l 60
+
+boptions -default
diff --git a/tests/boolean/simplify/A3 b/tests/boolean/simplify/A3
new file mode 100644 (file)
index 0000000..323ad0c
--- /dev/null
@@ -0,0 +1,43 @@
+# Multiple cut of the cylindrical plate by the cylindrical tool
+
+boptions -default
+bsimplify -e 1 -f 1
+
+pcylinder plate 50 10
+
+explode plate e
+copy plate_1 e
+mkcurve curve e
+
+set radius 10
+
+set nbp 100
+bounds curve t1 t2
+set delta [dval ($t2-$t1)/$nbp]
+
+for {set i 0} {$i < $nbp} {incr i} {
+  set t [dval $t1+[dval $delta*$i]]
+  cvalue curve $t x y z
+  # create cylinder at 0 0 0
+  pcylinder tool $radius 10
+  # move cylinder on top of plate
+  ttranslate tool x y z
+  # move it inside
+  ttranslate tool 0 0 -5
+
+  bclearobjects
+  bcleartools
+  baddobjects plate
+  baddtools tool
+  bfillds
+  bapibop plate 2
+}
+
+# restore default values
+boptions -default
+
+checkshape plate
+checknbshapes plate -vertex 212 -edge 318 -wire 110 -face 109 -shell 1 -solid 1
+checkprops plate -s 18541.7 -v 64444.2
+
+checkview -display plate -2d -path ${imagedir}/${test_image}_2.png
diff --git a/tests/boolean/simplify/A4 b/tests/boolean/simplify/A4
new file mode 100644 (file)
index 0000000..1038357
--- /dev/null
@@ -0,0 +1,41 @@
+# Multiple cut of the plate by the rectangular tool
+
+boptions -default
+bsimplify -e 1 -f 1
+
+box plate 100 20 20
+
+explode plate e
+mkcurve curve plate_10
+
+set nbp 100
+bounds curve t1 t2
+set delta [dval ($t2-10-$t1)/$nbp]
+
+for {set i 0} {$i < $nbp} {incr i} {
+  set t [dval $t1+[dval $delta*$i]]
+  cvalue curve $t x y z
+  # create tool 
+  box tool x y z 10 10 10
+  # move it inside
+  ttranslate tool 0 0 -5
+
+  bclearobjects
+  bcleartools
+  baddobjects plate
+  baddtools tool
+  bfillds
+  bapibop plate 2
+
+  checkshape plate
+  # number of faces should be the same from operation to operation
+  checknbshapes plate -vertex 14 -edge 21 -wire 9 -face 9 -shell 1 -solid 1
+}
+
+# restore default values
+boptions -default
+
+checkshape plate
+checkprops plate -s 8800 -v 35045
+
+checkview -display plate -2d -path ${imagedir}/${test_image}_2.png
diff --git a/tests/boolean/simplify/A5 b/tests/boolean/simplify/A5
new file mode 100644 (file)
index 0000000..8eb6022
--- /dev/null
@@ -0,0 +1,24 @@
+puts "========"
+puts "OCC28747: Incorrect result of the section operation after edge refinement"
+puts "========"
+puts ""
+
+restore [locate_data_file bug28747_shell.brep] s1
+restore [locate_data_file bug28747_contour.brep] s2
+bclearobjects
+bcleartools
+baddobjects s1
+baddtools s2
+bfillds
+
+# try to unify edges of the result
+bsimplify -e 1
+
+bapibop result 4
+
+# restore default settings
+bsimplify -e 0
+
+checkshape result
+checknbshapes result -vertex 7 -edge 6
+checkprops result -l 73320.3
index ea65fa6..4cf8d22 100644 (file)
@@ -8,7 +8,7 @@ puts ""
 
 restore [locate_data_file bug27729_a_1275.brep] a
 
-unifysamedom r a -t 0.1 -a 0.08
+unifysamedom r a -t 0.1 -a 5
 
 regexp {FACE *: *(\d*)} [nbshapes r] full nbfaces
 if {$nbfaces > 1000} {
index 4947b73..34f1e6c 100644 (file)
@@ -14,27 +14,27 @@ checknbshapes result1 -face 1 -wire 1 -edge 984
 checkprops result1 -l 10402.1
 
 #safeInputMode is true for USD
-unifysamedom result2 s1 -a 0.001
+unifysamedom result2 s1 -a 0.06
 checkshape result2
 checknbshapes result2 -face 1 -wire 1 -edge 983
 checkprops result2 -l 10402.1
 
-unifysamedom result3 s1 -a 1.0
+unifysamedom result3 s1 -a 57
 checkshape result3
 checknbshapes result3 -face 1 -wire 1 -edge 983
 checkprops result3 -l 10402.1
 
-unifysamedom result4 s1 -t 0.01 -a 0.1
+unifysamedom result4 s1 -t 0.01 -a 5.7
 checkshape result4
 checknbshapes result4 -face 1 -wire 1 -edge 510
 checkprops result4 -l 10402.1
 
-unifysamedom result5 s1 -t 0.1 -a 0.1
+unifysamedom result5 s1 -t 0.1 -a 5.7
 checkshape result5
 checknbshapes result5 -face 1 -wire 1 -edge 198
 checkprops result5 -l 10402.1
 
-unifysamedom result6 s1 -t 1.0 -a 0.1
+unifysamedom result6 s1 -t 1.0 -a 5.7
 checkshape result6
 checknbshapes result6 -face 1 -wire 1 -edge 65
 checkprops result6 -l 10401.9
index b9191b4..8f0a816 100644 (file)
@@ -8,7 +8,7 @@ puts ""
 
 restore [locate_data_file bug28343_shape1.brep] s
 
-unifysamedom result s -a 1.e-4
+unifysamedom result s -a 0.005
 checkshape result
 bopargcheck result
 
index f1798e0..43a5238 100644 (file)
@@ -8,7 +8,7 @@ puts ""
 
 restore [locate_data_file bug28343_shape2.brep] s
 
-unifysamedom result s -a 1.e-4
+unifysamedom result s -a 0.005
 checkshape result
 bopargcheck result
 
index c2f2bfb..1c0f350 100644 (file)
@@ -12,7 +12,7 @@ smallview
 
 restore [locate_data_file bug26513-offset_input.brep] a
 
-unifysamedom s a -a 1.e-8
+unifysamedom s a -a 5.7e-7
 offsetparameter 1.e-7 c i
 offsetload s 5
 offsetperform result
index 548e87b..d275881 100644 (file)
@@ -11,6 +11,7 @@ brestore [locate_data_file bug29237_tc_43.1_rhs.brep] b
 
 bglue 1
 bcheckinverted 0
+setfillhistory 0
 
 bclearobjects
 bcleartools
@@ -34,6 +35,9 @@ bcadd rcommon a 1 b 1
 # stop chronometer
 dchrono cpu stop counter OCC29237
 
+# restore default options
+boptions -default
+setfillhistory 1
 
 # check the result of CUT
 checkshape rcut
index 7f75538..1f6017d 100644 (file)
@@ -12,6 +12,7 @@ brestore [locate_data_file bug29237_dom8364_s32_c2.rhs.brep] b
 bglue 1
 bcheckinverted 0
 buseobb 1
+setfillhistory 0
 
 bclearobjects
 bcleartools
@@ -35,6 +36,9 @@ bcadd rcommon a 1 b 1
 # stop chronometer
 dchrono cpu stop counter OCC29237
 
+# restore default options
+boptions -default
+setfillhistory 1
 
 # check the result of CUT
 checkshape rcut
index 0255485..3506220 100644 (file)
@@ -12,6 +12,7 @@ brestore [locate_data_file bug29237_no_overlap.rhs.brep] b
 bglue 1
 bcheckinverted 0
 buseobb 1
+setfillhistory 0
 
 bclearobjects
 bcleartools
@@ -35,6 +36,9 @@ bcadd rcommon a 1 b 1
 # stop chronometer
 dchrono cpu stop counter OCC29237
 
+# restore default options
+boptions -default
+setfillhistory 1
 
 # check the result of CUT
 checkshape rcut