0029604: Uniform mechanism providing History of shape's modifications for OCCT algori...
authoremv <emv@opencascade.com>
Wed, 21 Mar 2018 13:59:29 +0000 (16:59 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 12 Apr 2018 10:30:56 +0000 (13:30 +0300)
Implementation of the mechanism for unification of the history commands for all OCCT algorithms.
The following Draw commands should be used to track the history of shapes modifications of any operation:
- modified - to find the shapes modified from the given shape in the given history.
- generated - to find the shapes generated from the given shape in the given history.
- isdeleted - to check if the given shape has been deleted during operation.

The mechanism allows fast & easy enabling of the DRAW history support for the algorithms supporting the history on the API level (i.e. the algorithm should have the methods Modified(), Generated() and IsDeleted()).
To enable the draw history support it is necessary to store the history of the algorithm into the session. For instance:

TopTools_ListOfShape Objects = ...; // Objects
TopTools_ListOfShape Tools = ...; // Tools

BRepAlgoAPI_Cut aCut(Objects, Tools); // Boolean cut operation

BRepTest_Objects::SetHistory(Objects, aCut); // Store the history for the Objects (overwrites the history in the session)
BRepTest_Objects::AddHistory(Tools, aCut);   // Add the history for the Tools

To get the stored history in draw the command "savehistory" should be used. It saves the history kept in session into a Drawable object with the given name:

# perform cut
bcut r s1 s2

# save history of cut
savehistory cut_history

explode s1 f
modified m cut_history s1_1

The Draw History commands of the following algorithms have been removed:
- Boolean Operations;
- Defeaturing;
- Unify same domain;
- Sweep;
- Thrusections;

All these algorithms have been switched to support the new Draw history mechanism.

The Fillet and Blend algorithms have been also enabled to support history commands.

94 files changed:
dox/user_guides/boolean_operations/boolean_operations.md
dox/user_guides/draw_test_harness/draw_test_harness.md
dox/user_guides/modeling_algos/modeling_algos.md
src/BOPAlgo/BOPAlgo_Builder_4.cxx
src/BOPAlgo/BOPAlgo_CellsBuilder.cxx
src/BOPTest/BOPTest.cxx
src/BOPTest/BOPTest.hxx
src/BOPTest/BOPTest_APICommands.cxx
src/BOPTest/BOPTest_BOPCommands.cxx
src/BOPTest/BOPTest_CellsCommands.cxx
src/BOPTest/BOPTest_HistoryCommands.cxx [deleted file]
src/BOPTest/BOPTest_PartitionCommands.cxx
src/BOPTest/BOPTest_RemoveFeaturesCommands.cxx
src/BOPTest/FILES
src/BRepAlgoAPI/BRepAlgoAPI_Defeaturing.hxx
src/BRepFill/BRepFill_PipeShell.hxx
src/BRepOffsetAPI/BRepOffsetAPI_MakePipeShell.hxx
src/BRepOffsetAPI/BRepOffsetAPI_ThruSections.cxx
src/BRepOffsetAPI/BRepOffsetAPI_ThruSections.hxx
src/BRepTest/BRepTest.cxx
src/BRepTest/BRepTest.hxx
src/BRepTest/BRepTest_DrawableHistory.cxx [new file with mode: 0644]
src/BRepTest/BRepTest_DrawableHistory.hxx [new file with mode: 0644]
src/BRepTest/BRepTest_FeatureCommands.cxx
src/BRepTest/BRepTest_FilletCommands.cxx
src/BRepTest/BRepTest_HistoryCommands.cxx [new file with mode: 0644]
src/BRepTest/BRepTest_Objects.cxx [new file with mode: 0644]
src/BRepTest/BRepTest_Objects.hxx [new file with mode: 0644]
src/BRepTest/BRepTest_SweepCommands.cxx
src/BRepTest/FILES
src/BRepTools/BRepTools_History.cxx
src/BRepTools/BRepTools_History.hxx
src/SWDRAW/SWDRAW_ShapeUpgrade.cxx
tests/boolean/history/A1
tests/boolean/history/A2
tests/boolean/history/A3
tests/boolean/history/A4
tests/boolean/history/A5
tests/boolean/history/A6
tests/boolean/history/A7 [new file with mode: 0644]
tests/boolean/history/A8 [new file with mode: 0644]
tests/boolean/removefeatures/A6
tests/boolean/removefeatures/A7
tests/boolean/removefeatures/B1
tests/boolean/removefeatures/B2
tests/boolean/removefeatures/B3
tests/boolean/removefeatures/B4
tests/boolean/removefeatures/B5
tests/boolean/removefeatures/B7
tests/boolean/removefeatures/B8
tests/boolean/removefeatures/B9
tests/boolean/removefeatures/C1
tests/boolean/removefeatures/C3
tests/boolean/removefeatures/C4
tests/boolean/removefeatures/C5
tests/boolean/removefeatures/E1
tests/boolean/removefeatures/G1
tests/boolean/removefeatures/begin
tests/bugs/heal/bug26489_4
tests/bugs/modalg_4/bug22646
tests/bugs/modalg_6/bug26150_1
tests/bugs/modalg_6/bug26150_10
tests/bugs/modalg_6/bug26150_11
tests/bugs/modalg_6/bug26150_12
tests/bugs/modalg_6/bug26150_13
tests/bugs/modalg_6/bug26150_14
tests/bugs/modalg_6/bug26150_15
tests/bugs/modalg_6/bug26150_16
tests/bugs/modalg_6/bug26150_17
tests/bugs/modalg_6/bug26150_18
tests/bugs/modalg_6/bug26150_2
tests/bugs/modalg_6/bug26150_3
tests/bugs/modalg_6/bug26150_4
tests/bugs/modalg_6/bug26150_5
tests/bugs/modalg_6/bug26150_6
tests/bugs/modalg_6/bug26150_7
tests/bugs/modalg_6/bug26150_8
tests/bugs/modalg_6/bug26150_9
tests/bugs/modalg_6/bug26393
tests/bugs/modalg_6/bug27283
tests/bugs/modalg_6/bug27386_1
tests/bugs/modalg_6/bug27386_2
tests/bugs/modalg_6/bug27386_3
tests/bugs/modalg_6/bug27386_4
tests/bugs/modalg_6/bug27386_5
tests/bugs/modalg_6/bug27386_6
tests/bugs/modalg_6/bug27386_7
tests/bugs/modalg_6/bug27386_8
tests/bugs/modalg_6/bug27822
tests/bugs/step/bug27316
tests/heal/unify_same_domain/A4
tests/heal/unify_same_domain/A6
tests/heal/unify_same_domain/end
tests/pipe/bugs/bug24909_3

index 27bf539..f981db4 100644 (file)
@@ -2931,27 +2931,29 @@ Warning: The positioning of the shapes leads to creation of small edges without
 
 @section occt_algorithms_history History Information
 
-The chapter describes the rules for filling the History Information (or just History) for the arguments of the operations in Boolean Component.
-The History is available only for the VERTICES, EDGES, FACES and SOLIDS from the input arguments.
+All operations in Boolean Component support @ref occt_modalg_hist "History information". This chapter describes how the History is filled for these operations.
 
-The History allows tracking the modification of the input shapes during the operation. It consists of the following information:
-* Information about Deleted shapes;
-* Information about Modified shapes;
-* Information about Generated shapes;
+Additionally to Vertices, Edges and Faces the history is also available for the Solids.
 
-All History information is filled basing on the result of current operation. History cannot return any shapes not contained in the result.
-Thus if the result of the operation is empty shape, all input shapes will be considered as Deleted and none will have Modified and Generated shapes.
+The rules for filling the History information about Deleted and Modified shapes are the same as for the API algorithms.
 
-@subsection occt_algorithms_history_del Deleted shapes
+Only the rules for Generated shapes require clarification.
+In terms of the algorithms in Boolean Component the shape from the arguments can have Generated shapes only if these new shapes 
+have been obtained as a result of pure intersection (not overlapping) of this shape with any other shapes from arguments. Thus, the Generated shapes are always:
+* VERTICES created from the intersection points and may be Generated from edges and faces only;
+* EDGES created from the intersection edges and may be Generated from faces only.
 
-The shape is considered as Deleted if the result shape do not contain the shape itself and none of its splits.
-For example, the result of CUT operation of two overlapping planar faces (see the example below) does not contain any parts from the tool face. Thus, the tool faces is considered as Deleted.
-If the faces are not fully coinciding, the result must contain some parts of the object face. In this case object face will be considered as not deleted.
-But if the faces are fully coinciding, the result must be empty, and both faces will be considered as Deleted.
+So, only EDGES and FACES could have information about Generated shapes. For all other types of shapes the list of Generated shapes will be empty.
+
+@subsection occt_algorithms_history_ex Examples
 
-To get the information about Deleted shapes it is necessary to use the method *Standard_Boolean IsDeleted(const TopoDS_Shape& theS)*.
+Here are some examples illustrating the History information.
 
-To get the information about Deleted shapes in DRAW it is necessary to use the command *bisdeleted shape*.
+@subsubsection occt_algorithms_history_ex_del Deleted shapes
+
+The result of CUT operation of two overlapping planar faces (see the example below) does not contain any parts from the tool face. Thus, the tool face is considered as Deleted.
+If the faces are not fully coinciding, the result must contain some parts of the object face. In this case object face will be considered as not deleted.
+But if the faces are fully coinciding, the result must be empty, and both faces will be considered as Deleted.
 
 Example of the overlapping faces:
 
@@ -2967,29 +2969,21 @@ baddtools f2
 bfillds
 bbop r 2
 
-bisdeleted f1
+savehistory cut_hist
+isdeleted cut_hist f1
 # Not deleted
 
-bisdeleted f2
+isdeleted cut_hist f2
 # Deleted
 ~~~~
 
-@subsection occt_algorithms_history_modif Modified shapes
-
-The shape is considered as Modified if the result shape contains any of the splits of the shape, not the shape itself. The shape can be modified only into the shapes with same dimension.
-The splits of the shape contained in the result shape are Modified from the shape.
+@subsubsection occt_algorithms_history_ex_modif Modified shapes
 
-For example, in the FUSE operation of two edges intersecting in one point (see the example below), both edges will be split by the intersection point. All these splits will be contained in the result.
+In the FUSE operation of two edges intersecting in one point (see the example below), both edges will be split by the intersection point. All these splits will be contained in the result.
 Thus, each of the input edges will be Modified into its two splits.
 But in the CUT operation on the same edges, the tool edge will be Deleted from the result and, thus, will not have any Modified shapes.
 
-To get the information about Modified shapes it is necessary to use the method *const TopTools_ListOfShape& Modified(const TopoDS_Shape& theS)*.
-The list of Modified elements will contain only those which are contained in the result of the operation. If the list is empty the shape has not been modified and it is necessary to check if it has been Deleted.
-
-To get the information about Modified shapes in DRAW it is necessary to use the command *bmodified modif shape*.
-
 Example of the intersecting edges:
-
 ~~~~
 line l1 0 0 0 1 0 0
 mkedge e1 l1 -10 10
@@ -3006,44 +3000,35 @@ bfillds
 # fuse operation
 bbop r 1
 
-bmodified m1 e1
+savehistory fuse_hist
+
+modified m1 fuse_hist e1
 nbshapes m1
 # EDGES: 2
 
-bmodified m2 e2
+modified m2 fuse_hist e2
 nbshapes m2
 # EDGES: 2
 
 # cut operation
 bbop r 2
 
-bmodified m1 e1
+savehistory cut_hist
+
+modified m1 cut_hist e1
 nbshapes m1
 # EDGES: 2
 
-bmodified m2 e2
+modified m2 cut_hist e2
 # The shape has not been modified
-
 ~~~~
 
 
-@subsection occt_algorithms_history_gen Generated shapes
-
-In terms of the algorithms in Boolean Component the shape from the arguments can have Generated shapes only if these new shapes have been obtained as a result of pure intersection (not overlapping)
-of this shape with any other shapes from arguments. Thus, the Generated shapes are always:
-* VERTICES created from the intersection points and may be Generated from edges and faces only;
-* EDGES created from the intersection edges and may be Generated from faces only.
-
-So, only EDGES and FACES could have information about Generated shapes. For all other types of shapes the list of Generated shapes will be empty.
-
-For example, the two intersecting edges will both have the intersection vertices Generated from them.
-
-To get the information about Generated shapes it is necessary to use the method *const TopTools_ListOfShape& Generated(const TopoDS_Shape& theS)*.
-The list of Generated elements will contain only those which are contained in the result of the operation. If the list is empty no new shapes have been Generated from the shape.
+@subsubsection occt_algorithms_history_gen Generated shapes
 
-To get the information about Generated shapes in DRAW it is necessary to use the command *bgenerated gen shape*.
+The two intersecting edges will both have the intersection vertices Generated from them.
 
-Example of interfering faces
+As for the operation with intersecting faces, consider the following example:
 
 ~~~~
 plane p1 0 0 0 0 0 1
@@ -3061,11 +3046,13 @@ bfillds
 # fuse operation
 bbop r 1
 
-bgenerated gf1 f1
+savehistory fuse_hist
+
+generated gf1 fuse_hist f1
 nbshapes gf1
 # EDGES: 1
 
-bgenerated gf2 f2
+generated gf2 fuse_hist f2
 nbshapes gf2
 # EDGES: 1
 
@@ -3073,10 +3060,12 @@ nbshapes gf2
 # common operation - result is empty
 bbop r 0
 
-bgenerated gf1 f1
+savehistory com_hist
+
+generated gf1 com_hist f1
 # No shapes were generated from the shape
 
-bgenerated gf2 f2
+generated gf2 com_hist f2
 # No shapes were generated from the shape
 
 ~~~~
index c6dd982..32b7e30 100644 (file)
@@ -7325,11 +7325,7 @@ buildevol
 
 @subsection occt_draw_defeaturing Defeaturing
 
-Draw module for @ref occt_modalg_defeaturing "3D Model Defeaturing" includes the command to perform the operation and the commands to access the history of shapes modifications.
-
-@subsubsection occt_draw_defeaturing_op removefeatures
-
-*removefeatures* command performs the removal of the requested features from the shape.
+Draw command **removefeatures** is intended for performing @ref occt_modalg_defeaturing "3D Model Defeaturing", i.e. it performs the removal of the requested features from the shape.
 
 Syntax:
 ~~~~
@@ -7345,20 +7341,6 @@ nohist   - disables the history collection;
 parallel - enables the parallel processing mode.
 ~~~~
 
-@subsubsection occt_draw_defeaturing_hist rfmodified, rfgenerated, rfisdeleted
-
-To track the history of a shape modification during Defeaturing the following commands can be used:
-* <b>rfmodified</b> Shows the shapes modified from the input shape during Defeaturing.
-* <b>rfgenerated</b> Shows the shapes generated from the input shape during Defeaturing.
-* <b>rfisdeleted</b> Checks if the shape has been deleted during Defeaturing (i.e. has no trace in the result shape).
-
-Syntax:
-~~~~
-rfmodified      : rfmodified c_modified shape
-rfgenerated     : rfgenerated c_generated shape
-rfisdeleted     : rfisdeleted shape
-~~~~
-
 
 @subsection occt_draw_7_9  Analysis of topology and geometry
 
@@ -8050,6 +8032,163 @@ Options:
  * -a AngTol - angular tolerance used for distinguishing the planar faces;
  * -s Shared(0/1) - boolean flag which defines whether the input edges are already shared or have to be intersected.
 
+@subsection occt_draw_hist History commands
+
+Draw module for @ref occt_modalg_hist "History Information support" includes the command to save history into a drawable object and the actual history commands:
+
+* *savehistory*;
+* *isdeleted*;
+* *modified*;
+* *generated*.
+
+@subsubsection occt_draw_hist_save savehistory
+
+*savehistory* command saves the history from the session into a drawable object with the given name.
+
+Syntax:
+~~~~
+savehistory     : savehistory name
+~~~~
+
+If the history of some operation is needed the *savehistory* command should be called after the command performing the operation.
+If some other operation supporting history will be performed before the history of first operation is saved it will be overwritten with the new history.
+
+Example:
+~~~~
+box b1 10 10 10
+box b2 5 0 0 10 10 15
+bfuse r b1 b2
+savehistory fuse_hist
+
+dump fuse_hist
+#*********** Dump of fuse_hist *************
+# History contains:
+# - 4 Deleted shapes;
+# - 20 Modified shapes;
+# - 6 Generated shapes.
+
+unifysamedom ru r
+savehistory usd_hist
+dump usd_hist
+#*********** Dump of usd_hist *************
+#History contains:
+# - 14 Deleted shapes;
+# - 28 Modified shapes;
+# - 0 Generated shapes.
+~~~~
+
+@subsubsection occt_draw_hist_isdel isdeleted
+
+*isdeleted* command checks if the given shape has been deleted in the given history.
+
+Syntax:
+~~~~
+isdeleted       : isdeleted history shape
+~~~~
+
+Example:
+~~~~
+box b1 4 4 4 2 2 2
+box b2 10 10 10
+bcommon r b1 b2
+
+savehistory com_hist
+# all vertices, edges and faces of the b2 are deleted
+foreach s [join [list [explode b2 v] [explode b2 e] [explode b2 f] ] ] {
+  isdeleted com_hist $s
+  # Deleted
+}
+~~~~
+
+@subsubsection occt_draw_hist_mod modified
+
+*modified* command returns the shapes Modified from the given shape in the given history. All modified shapes are put into compound. If the shape has not been modified the resulting compound will be empty. Note that if the shape has been modified into a single shape only, it will be returned without enclosure into compound.
+
+Syntax:
+~~~~
+modified        : modified modified_shapes history shape
+~~~~
+
+Example:
+~~~~
+box b 10 10 10
+explode b e
+fillet r b 2 b_1
+
+savehistory fillet_hist
+
+explode b f
+
+modified m3 fillet_hist b_3
+modified m5 fillet_hist b_5
+~~~~
+
+@subsubsection occt_draw_hist_gen generated
+
+*generated* command returns the shapes Generated from the given shape in the given history. All generated shapes are put into compound. If no shapes have been generated from the shape the resulting compound will be empty. Note that if the shape has generated a single shape only, it will be returned without enclosure into compound.
+
+Syntax:
+~~~~
+generated       : generated generated_shapes history shape
+~~~~
+
+Example:
+~~~~
+polyline w1 0 0 0 10 0 0 10 10 0
+polyline w2 5 1 10 9 1 10 9 5 10
+
+thrusections r 0 0 w1 w2
+
+savehistory loft_hist
+
+explode w1 e
+explode w2 e
+
+generated g11 loft_hist w1_1
+generated g12 loft_hist w1_2
+generated g21 loft_hist w2_1
+generated g22 loft_hist w2_2
+
+compare g11 g21
+# equal shapes
+
+compare g12 g22
+# equal shapes
+~~~~
+
+@subsubsection occt_draw_hist_extension Enabling Draw history support for the algorithms
+
+Draw History mechanism allows fast and easy enabling of the Draw history support for the OCCT algorithms supporting standard history methods.
+To enable History commands for the algorithm it is necessary to save the history of the algorithm into the session.
+For that, it is necessary to put the following code into the command implementation just after the command is done:
+~~~~
+BRepTest_Objects::SetHistory(ListOfArguments, Algorithm);
+~~~~
+
+Here is the example of how it is done in the command performing Split operation (see implementation of the *bapisplit* command):
+~~~~
+BRepAlgoAPI_Splitter aSplitter;
+// setting arguments
+aSplitter.SetArguments(BOPTest_Objects::Shapes());
+// setting tools
+aSplitter.SetTools(BOPTest_Objects::Tools());
+
+// setting options
+aSplitter.SetRunParallel(BOPTest_Objects::RunParallel());
+aSplitter.SetFuzzyValue(BOPTest_Objects::FuzzyValue());
+aSplitter.SetNonDestructive(BOPTest_Objects::NonDestructive());
+aSplitter.SetGlue(BOPTest_Objects::Glue());
+aSplitter.SetCheckInverted(BOPTest_Objects::CheckInverted());
+aSplitter.SetUseOBB(BOPTest_Objects::UseOBB());
+
+// 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);
+~~~~
 
 @subsection occt_draw_7_12  Texture Mapping to a Shape
 
index 5ed722b..a0c8675 100644 (file)
@@ -1283,6 +1283,109 @@ Standard_DomainError::Raise
 TopoDS_Edge E = ME; 
 ~~~~~
 
+
+@subsection occt_modalg_hist History support
+
+All topological API algorithms support the history of shapes modifications (or just History) for their arguments.
+Generally, the history is available for the following types of sub-shapes of input shapes:
+* Vertex
+* Edge
+* Face
+
+Some algorithms also support the history for Solids.
+
+The history information consists of the following information:
+* Information about Deleted shapes;
+* Information about Modified shapes;
+* Information about Generated shapes.
+
+The History is filled basing on the result of the operation. History cannot return any shapes not contained in the result.
+Thus, if the result of the operation is empty shape, all input shapes will be considered as Deleted and none will have Modified and Generated shapes.
+
+The history information can be accessed by the API methods:
+* *Standard_Boolean IsDeleted(const TopoDS_Shape& theS)* - to check if the shape has been Deleted during the operation;
+* *const TopTools_ListOfShape& Modified(const TopoDS_Shape& theS)* - to get the shapes Modified from the given shape;
+* *const TopTools_ListOfShape& Generated(const TopoDS_Shape& theS)* - to get the shapes Generated from the given shape.
+
+@subsubsection occt_modalg_hist_del Deleted shapes
+
+The shape is considered as Deleted during the operation if all of the following conditions are met:
+* The shape is the part of the argument shapes of the operation;
+* The result shape does not contain the shape itself;
+* The result shape does not contain any of the splits of the shape.
+
+For example, in the CUT operation between two intersecting solids all vertices/edges/faces located completely inside the Tool solid will be Deleted during the operation.
+
+@subsubsection occt_modalg_hist_mod Modified shapes
+
+The shape is considered as Modified during the operation if the result shape contains the splits of the shape, not the shape itself. The shape can be modified only into the shapes with same dimension.
+The splits of the shape contained in the result shape are Modified from the shape.
+The Modified shapes are created from the sub-shapes of the input shapes and, generally, repeat their geometry.
+
+The list of Modified elements will contain only those which are contained in the result of the operation. If the list is empty the shape has not been modified and it is necessary to check if it has been Deleted.
+
+For example, after translation of the shape in any direction all its sub-shapes will be modified into their translated copies.
+
+@subsubsection occt_modalg_hist_gen Generated shapes
+
+The shapes contained in the result shape are considered as Generated from the input shape if they were produced during the operation and have different dimension with the shapes from which they were created.
+
+The list of Generated elements will contain only those which are contained in the result of the operation. If the list is empty no new shapes have been Generated from the shape.
+
+For example, extrusion of the edge in some direction will create a face. This face will be generated from the edge.
+
+@subsubsection occt_modalg_hist_tool BRepTools_History
+
+*BRepTools_History* is the general History tool intended for unification of the histories of different algorithms.
+
+BRepTools_History can be created from any algorithm supporting the standard history methods (IsDeleted(), Modified() and Generated()):
+~~~~
+// The arguments of the operation
+TopoDS_Shape aS = ...;
+
+// Perform transformation on the shape
+gp_Trsf aTrsf;
+aTrsf.SetTranslationPart(gp_Vec(0, 0, 1));
+BRepBuilderAPI_Transform aTransformer(aS, aTrsf); // Transformation API algorithm
+const TopoDS_Shape& aRes = aTransformer.Shape();
+
+// Create the translation history object
+TopTools_ListOfShape anArguments;
+anArguments.Append(aS);
+BRepTools_History aHistory(anArguments, aTransformer);
+~~~~
+
+BRepTools_History also allows merging of the histories. Thus, if you have two or more subsequent operations you can get one final history combined from histories of these operations:
+
+~~~~
+Handle(BRepTools_History) aHist1 = ...; // History of first operation
+Handle(BRepTools_History) aHist2 = ...; // History of second operation
+~~~~
+
+It is possible to merge the second history into the first one:
+~~~~
+aHist1->Merge(aHist2);
+~~~~
+
+Or create the new history keeping the two histories unmodified:
+~~~~
+Handle(BRepTools_History) aResHistory = new BRepTools_History;
+aResHistory->Merge(aHist1);
+aResHistory->Merge(aHist2);
+~~~~
+
+The possibility of Merging of the histories and its creation from the API algorithms allows providing easy History support for the new algorithms.
+
+@subsubsection occt_modalg_hist_draw DRAW history support
+
+DRAW History support for the algorithms supporting history is provided by three basic commands:
+* *isdeleted*; 
+* *modified*;
+* *generated*.
+
+For more information on the Draw History mechanism please refer the corresponding chapter in the Draw users guide - @ref occt_draw_hist "History commands".
+
+
 @section occt_modalg_3 Standard  Topological Objects
 
 The following  standard topological objects can be created:
@@ -3145,10 +3248,7 @@ Standard_Boolean BRepAlgoAPI_Defeaturing::IsDeleted(const TopoDS_Shape& theS);
 
 For the usage of the Defeaturing algorithm on the Draw level the command <b>removefeatures</b> has been implemented.
 
-To track the history of a shape modification during Defeaturing the following commands can be used:
-* <b>rfmodified</b> Shows the shapes modified from the input shape during Defeaturing.
-* <b>rfgenerated</b> Shows the shapes generated from the input shape during Defeaturing.
-* <b>rfisdeleted</b> Checks if the shape has been deleted during Defeaturing.
+To track the history of a shape modification during Defeaturing the @ref occt_draw_hist "standard history commands" can be used.
 
 For more details on commands above please refer the @ref occt_draw_defeaturing "Defeaturing commands" of the Draw test harness user guide.
 
index 91b3dab..a67801f 100644 (file)
@@ -154,7 +154,7 @@ const TopTools_ListOfShape& BOPAlgo_Builder::Modified
     return myHistShapes;
 
   const TopTools_ListOfShape* pLSp = myImagesResult.Seek(theS);
-  if (!pLSp)
+  if (!pLSp || pLSp->IsEmpty())
     // No track in the result -> no modified
     return myHistShapes;
 
@@ -189,9 +189,22 @@ const TopTools_ListOfShape& BOPAlgo_Builder::Modified
 //=======================================================================
 Standard_Boolean BOPAlgo_Builder::IsDeleted(const TopoDS_Shape& theS)
 {
-  // The shape is considered as Deleted if the result shape
-  // does not contain the shape itself and none of its splits
-  return myHasDeleted && !myImagesResult.Contains(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
@@ -218,23 +231,15 @@ void BOPAlgo_Builder::PrepareHistory()
   BOPAlgo_BuilderShape::PrepareHistory();
   myFlagHistory = Standard_True;
 
-  if (myShape.IsNull() ||
-      BOPTools_AlgoTools3D::IsEmptyShape(myShape))
-  {
-    // The result shape is a null shape or empty shape,
-    // thus, no modified, no generated, all deleted
-    myHasModified = Standard_False;
-    myHasGenerated = Standard_False;
-    myHasDeleted = Standard_True;
-    return;
-  }
-
   // Map the result shape
   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.
+  // 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;
@@ -253,6 +258,9 @@ void BOPAlgo_Builder::PrepareHistory()
           aType == TopAbs_SOLID))
       continue;
 
+    // Track the modification of the shape
+    TopTools_ListOfShape* pImages = &myImagesResult(myImagesResult.Add(aS, TopTools_ListOfShape()));
+
     // Check if the shape has any splits
     const TopTools_ListOfShape* pLSp = LocModified(aS);
     if (!pLSp)
@@ -260,7 +268,7 @@ void BOPAlgo_Builder::PrepareHistory()
       // 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
-        myImagesResult(myImagesResult.Add(aS, TopTools_ListOfShape())).Append(aS);
+        pImages->Append(aS);
       else
         // No trace of the shape in the result -> Deleted element is found
         myHasDeleted = Standard_True;
@@ -268,7 +276,6 @@ void BOPAlgo_Builder::PrepareHistory()
     else
     {
       // Find all splits of the shape which are kept in the result
-      TopTools_ListOfShape *pLSpKept = NULL;
       TopTools_ListIteratorOfListOfShape aIt(*pLSp);
       for (; aIt.More(); aIt.Next())
       {
@@ -277,15 +284,12 @@ void BOPAlgo_Builder::PrepareHistory()
         // Check if the result shape contains the split
         if (myMapShape.Contains(aSp))
         {
-          if (!pLSpKept)
-            pLSpKept = &myImagesResult(myImagesResult.Add(aS, TopTools_ListOfShape()));
-
           // Link the shape to the split
-          pLSpKept->Append(aSp);
+          pImages->Append(aSp);
         }
       }
 
-      if (pLSpKept)
+      if (!pImages->IsEmpty())
         // Modified element is found
         myHasModified = Standard_True;
       else
index 7b1c928..f6adf82 100644 (file)
@@ -973,6 +973,7 @@ const TopTools_ListOfShape* BOPAlgo_CellsBuilder::LocModified(const TopoDS_Shape
   }
   else
   {
+    TopTools_MapOfShape aMFence;
     // Process all GF splits and check them for local unification with other shapes
     TopTools_ListIteratorOfListOfShape aIt(*pLSp);
     for (; aIt.More(); aIt.Next())
@@ -980,7 +981,8 @@ const TopTools_ListOfShape* BOPAlgo_CellsBuilder::LocModified(const TopoDS_Shape
       const TopoDS_Shape* pSp = &aIt.Value();
       const TopoDS_Shape* pSU = myMapModified.Seek(*pSp);
       if (pSU) pSp = pSU;
-      myHistShapes.Append(*pSp);
+      if (aMFence.Add(*pSp))
+        myHistShapes.Append(*pSp);
     }
   }
   return &myHistShapes;
index d4736b5..d4803b6 100644 (file)
@@ -53,7 +53,6 @@ void  BOPTest::AllCommands(Draw_Interpretor& theCommands)
   BOPTest::PartitionCommands (theCommands);
   BOPTest::APICommands       (theCommands);
   BOPTest::OptionCommands    (theCommands);
-  BOPTest::HistoryCommands   (theCommands);
   BOPTest::DebugCommands     (theCommands);
   BOPTest::CellsCommands     (theCommands);
   BOPTest::UtilityCommands   (theCommands);
index 2787703..20fbd91 100644 (file)
@@ -52,8 +52,6 @@ public:
   
   Standard_EXPORT static void Factory (Draw_Interpretor& aDI);
 
-  Standard_EXPORT static void HistoryCommands  (Draw_Interpretor& aDI);
-
   Standard_EXPORT static void DebugCommands  (Draw_Interpretor& aDI);
 
   Standard_EXPORT static void CellsCommands  (Draw_Interpretor& aDI);
index ac7a5b6..db83f7e 100644 (file)
@@ -23,6 +23,7 @@
 #include <BRepAlgoAPI_Fuse.hxx>
 #include <BRepAlgoAPI_Section.hxx>
 #include <BRepAlgoAPI_Splitter.hxx>
+#include <BRepTest_Objects.hxx>
 #include <DBRep.hxx>
 #include <Draw.hxx>
 #include <TopoDS_Shape.hxx>
@@ -129,7 +130,12 @@ Standard_Integer bapibop(Draw_Interpretor& di,
   pBuilder->SetUseOBB(BOPTest_Objects::UseOBB());
   //
   pBuilder->Build(); 
-  //
+
+  // 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);
+
   if (pBuilder->HasWarnings()) {
     Standard_SStream aSStream;
     pBuilder->DumpWarnings(aSStream);
@@ -188,7 +194,12 @@ Standard_Integer bapibuild(Draw_Interpretor& di,
   aBuilder.SetUseOBB(BOPTest_Objects::UseOBB());
   //
   aBuilder.Build(); 
-  //
+
+  // 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);
+
   if (aBuilder.HasWarnings()) {
     Standard_SStream aSStream;
     aBuilder.DumpWarnings(aSStream);
@@ -240,6 +251,12 @@ Standard_Integer bapisplit(Draw_Interpretor& di,
   //
   // 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);
+
   // check warning status
   if (aSplitter.HasWarnings()) {
     Standard_SStream aSStream;
index 7d333de..73ee159 100644 (file)
@@ -28,6 +28,7 @@
 #include <BRepAlgoAPI_Cut.hxx>
 #include <BRepAlgoAPI_Fuse.hxx>
 #include <BRepAlgoAPI_Section.hxx>
+#include <BRepTest_Objects.hxx>
 #include <DBRep.hxx>
 #include <Draw.hxx>
 #include <DrawTrSurf.hxx>
@@ -258,6 +259,10 @@ Standard_Integer bopsmt(Draw_Interpretor& di,
   //
   aBOP.PerformWithFiller(*pPF);
   BOPTest::ReportAlerts(aBOP.GetReport());
+
+  // Store the history of Boolean operation into the session
+  BRepTest_Objects::SetHistory(pPF->Arguments(), aBOP);
+
   if (aBOP.HasErrors()) {
     return 0;
   }
@@ -319,6 +324,10 @@ Standard_Integer bopsection(Draw_Interpretor& di,
   //
   aBOP.PerformWithFiller(*pPF);
   BOPTest::ReportAlerts(aBOP.GetReport());
+
+  // Store the history of Section operation into the session
+  BRepTest_Objects::SetHistory(pPF->Arguments(), aBOP);
+
   if (aBOP.HasErrors()) {
     return 0;
   }
@@ -434,6 +443,10 @@ Standard_Integer  bsection(Draw_Interpretor& di,
   aSec.SetUseOBB(BOPTest_Objects::UseOBB());
   //
   aSec.Build();
+
+  // Store the history of Section operation into the session
+  BRepTest_Objects::SetHistory(aSec.DSFiller()->Arguments(), aSec);
+
   //
   if (aSec.HasWarnings()) {
     Standard_SStream aSStream;
@@ -520,6 +533,10 @@ Standard_Integer bsmt (Draw_Interpretor& di,
   // 
   aBOP.PerformWithFiller(aPF);
   BOPTest::ReportAlerts(aBOP.GetReport());
+
+  // Store the history of Boolean operation into the session
+  BRepTest_Objects::SetHistory(aPF.Arguments(), aBOP);
+
   if (aBOP.HasErrors()) {
     return 0;
   }
@@ -828,6 +845,10 @@ Standard_Integer mkvolume(Draw_Interpretor& di, Standard_Integer n, const char**
   //
   aMV.Perform();
   BOPTest::ReportAlerts(aMV.GetReport());
+
+  // Store the history of Volume Maker into the session
+  BRepTest_Objects::SetHistory(aLS, aMV);
+
   if (aMV.HasErrors()) {
     return 0;
   }
index 5c8814c..811938b 100644 (file)
@@ -23,6 +23,7 @@
 #include <BOPAlgo_PaveFiller.hxx>
 #include <BOPAlgo_CellsBuilder.hxx>
 
+#include <BRepTest_Objects.hxx>
 
 static Standard_Integer bcbuild (Draw_Interpretor&, Standard_Integer, const char**);
 static Standard_Integer bcaddall (Draw_Interpretor&, Standard_Integer, const char**);
@@ -116,6 +117,10 @@ Standard_Integer bcbuild(Draw_Interpretor& di,
   //
   aCBuilder.PerformWithFiller(aPF); 
   BOPTest::ReportAlerts(aCBuilder.GetReport());
+
+  // Store the history of the Cells Builder into the session
+  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+
   if (aCBuilder.HasErrors()) {
     return 0;
   }
@@ -165,7 +170,10 @@ Standard_Integer bcaddall(Draw_Interpretor& di,
   BOPTest::ReportAlerts(aCBuilder.GetReport());
   //
   const TopoDS_Shape& aR = aCBuilder.Shape();
-  //
+
+  // Update the history of the Cells Builder
+  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+
   DBRep::Set(a[1], aR);
   return 0;
 }
@@ -186,7 +194,10 @@ Standard_Integer bcremoveall(Draw_Interpretor& di,
   BOPAlgo_CellsBuilder& aCBuilder = BOPTest_Objects::CellsBuilder();
   //
   aCBuilder.RemoveAllFromResult();
-  //
+
+  // Update the history of the Cells Builder
+  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+
   return 0;
 }
 
@@ -249,7 +260,10 @@ Standard_Integer bcadd(Draw_Interpretor& di,
   BOPTest::ReportAlerts(aCBuilder.GetReport());
   //
   const TopoDS_Shape& aR = aCBuilder.Shape();
-  //
+
+  // Update the history of the Cells Builder
+  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+
   DBRep::Set(a[1], aR);
   return 0;
 }
@@ -295,7 +309,10 @@ Standard_Integer bcremove(Draw_Interpretor& di,
   aCBuilder.RemoveFromResult(aLSToTake, aLSToAvoid);
   //
   const TopoDS_Shape& aR = aCBuilder.Shape();
-  //
+
+  // Update the history of the Cells Builder
+  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+
   DBRep::Set(a[1], aR);
   return 0;
 }
@@ -320,7 +337,10 @@ Standard_Integer bcremoveint(Draw_Interpretor& di,
   BOPTest::ReportAlerts(aCBuilder.GetReport());
   //
   const TopoDS_Shape& aR = aCBuilder.Shape();
-  //
+
+  // Update the history of the Cells Builder
+  BRepTest_Objects::SetHistory(aCBuilder.Arguments(), aCBuilder);
+
   DBRep::Set(a[1], aR);
   return 0;
 }
diff --git a/src/BOPTest/BOPTest_HistoryCommands.cxx b/src/BOPTest/BOPTest_HistoryCommands.cxx
deleted file mode 100644 (file)
index 1eac5bf..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-// Created by: Eugeny MALTCHIKOV
-// Copyright (c) 2015 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#include <BOPTest.hxx>
-//
-#include <Draw.hxx>
-#include <DBRep.hxx>
-//
-#include <BRep_Builder.hxx>
-//
-#include <TopoDS_Compound.hxx>
-//
-#include <BOPAlgo_Builder.hxx>
-//
-#include <TopTools_ListOfShape.hxx>
-#include <TopTools_ListIteratorOfListOfShape.hxx>
-//
-#include <BOPTest_DrawableShape.hxx>
-#include <BOPTest_Objects.hxx>
-
-//
-static Standard_Integer bmodified  (Draw_Interpretor&, Standard_Integer, const char**); 
-static Standard_Integer bgenerated (Draw_Interpretor&, Standard_Integer, const char**);
-static Standard_Integer bisdeleted (Draw_Interpretor&, Standard_Integer, const char**);
-
-//=======================================================================
-//function : HistoryCommands
-//purpose  : 
-//=======================================================================
-void BOPTest::HistoryCommands(Draw_Interpretor& theCommands)
-{
-  static Standard_Boolean done = Standard_False;
-  if (done) return;
-  done = Standard_True;
-  // Chapter's name
-  const char* g = "BOPTest commands";
-  // Commands  
-  theCommands.Add("bmodified" , "Use: bmodified  rc shape", __FILE__, bmodified , g);
-  theCommands.Add("bgenerated", "Use: bgenerated rc shape", __FILE__, bgenerated, g);
-  theCommands.Add("bisdeleted", "Use: bisdeleted shape"   , __FILE__, bisdeleted, g);
-}
-
-//=======================================================================
-//function : bmodified
-//purpose  : 
-//=======================================================================
-Standard_Integer bmodified(Draw_Interpretor& di, 
-                           Standard_Integer n, 
-                           const char** a) 
-{ 
-  if (n < 3) {
-    di << "Use: bmodified rc shape\n";
-    return 1;
-  }
-  //
-  TopoDS_Shape aS = DBRep::Get(a[2]);
-  if (aS.IsNull()) {
-    di << "Null shape\n";
-    return 1;
-  }
-  //
-  TopAbs_ShapeEnum aType = aS.ShapeType();
-  if (!(aType==TopAbs_VERTEX || aType==TopAbs_EDGE || 
-        aType==TopAbs_FACE   || aType==TopAbs_SOLID)) {
-    di << "The shape must be one of the following types: VERTEX, EDGE, FACE or SOLID\n";
-    return 1;
-  } 
-  //
-  BOPAlgo_Builder& aBuilder = BOPTest_Objects::Builder();
-  const TopTools_ListOfShape& aLS = aBuilder.Modified(aS);
-  //
-  if (aLS.IsEmpty()) {
-    di << "The shape has not been modified\n";
-    return 0;
-  }
-  //
-  BRep_Builder aBB;
-  TopoDS_Compound aRes;
-  //
-  aBB.MakeCompound(aRes);
-  TopTools_ListIteratorOfListOfShape aIt(aLS);
-  for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aShape = aIt.Value();
-    aBB.Add(aRes, aShape);
-  }
-  //
-  DBRep::Set(a[1], aRes);
-  //
-  return 0;
-}
-
-//=======================================================================
-//function : bgenerated
-//purpose  : 
-//=======================================================================
-Standard_Integer bgenerated(Draw_Interpretor& di, 
-                            Standard_Integer n, 
-                            const char** a) 
-{ 
-  if (n < 3) {
-    di << "Use: bgenerated rc shape\n";
-    return 1;
-  }
-  //
-  TopoDS_Shape aS = DBRep::Get(a[2]);
-  if (aS.IsNull()) {
-    di << "Null shape\n";
-    return 1;
-  }
-  //
-  TopAbs_ShapeEnum aType = aS.ShapeType();
-  if (!(aType==TopAbs_VERTEX || aType==TopAbs_EDGE || 
-        aType==TopAbs_FACE   || aType==TopAbs_SOLID)) {
-    di << "The shape must be one of the following types: VERTEX, EDGE, FACE or SOLID\n";
-    return 1;
-  } 
-  //
-  BOPAlgo_Builder& aBuilder = BOPTest_Objects::Builder();
-  const TopTools_ListOfShape& aLS = aBuilder.Generated(aS);
-  //
-  if (aLS.IsEmpty()) {
-    di << "No shapes were generated from the shape\n";
-    return 0;
-  }
-  //
-  BRep_Builder aBB;
-  TopoDS_Compound aRes;
-  //
-  aBB.MakeCompound(aRes);
-  TopTools_ListIteratorOfListOfShape aIt(aLS);
-  for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aShape = aIt.Value();
-    aBB.Add(aRes, aShape);
-  }
-  //
-  DBRep::Set(a[1], aRes);
-  //
-  return 0;
-}
-
-//=======================================================================
-//function : bisdeleted
-//purpose  : 
-//=======================================================================
-Standard_Integer bisdeleted(Draw_Interpretor& di, 
-                            Standard_Integer n, 
-                            const char** a) 
-{ 
-  if (n < 2) {
-    di << "Use: bisdeleted shape\n";
-    return 1;
-  }
-  //
-  TopoDS_Shape aS = DBRep::Get(a[1]);
-  if (aS.IsNull()) {
-    di << "Null shape\n";
-    return 1;
-  }
-  //
-  TopAbs_ShapeEnum aType = aS.ShapeType();
-  if (!(aType==TopAbs_VERTEX || aType==TopAbs_EDGE || 
-        aType==TopAbs_FACE   || aType==TopAbs_SOLID)) {
-    di << "The shape must be one of the following types: VERTEX, EDGE, FACE or SOLID\n";
-    return 1;
-  } 
-  //
-  BOPAlgo_Builder& aBuilder = BOPTest_Objects::Builder();
-  Standard_Boolean isDeleted = aBuilder.IsDeleted(aS);
-  //
-  di << (isDeleted ? "Deleted" : "Not deleted") << "\n";
-  //
-  return 0;
-}
index 960ab2d..7be074f 100644 (file)
@@ -22,6 +22,7 @@
 #include <BOPTest.hxx>
 #include <BOPTest_DrawableShape.hxx>
 #include <BOPTest_Objects.hxx>
+#include <BRepTest_Objects.hxx>
 #include <DBRep.hxx>
 #include <Draw.hxx>
 #include <Draw_Color.hxx>
@@ -197,6 +198,10 @@ Standard_Integer bbuild(Draw_Interpretor& di,
   //
   aBuilder.PerformWithFiller(aPF); 
   BOPTest::ReportAlerts(aBuilder.GetReport());
+
+  // Set history of GF operation into the session
+  BRepTest_Objects::SetHistory(aPF.Arguments(), aBuilder);
+
   if (aBuilder.HasErrors()) {
     return 0;
   }
@@ -307,6 +312,10 @@ Standard_Integer bbop(Draw_Interpretor& di,
   //
   pBuilder->PerformWithFiller(aPF);
   BOPTest::ReportAlerts(pBuilder->GetReport());
+
+  // Set history of Boolean operation into the session
+  BRepTest_Objects::SetHistory(aPF.Arguments(), *pBuilder);
+
   if (pBuilder->HasErrors()) {
     return 0;
   }
@@ -377,6 +386,10 @@ Standard_Integer bsplit(Draw_Interpretor& di,
   //
   aTimer.Stop();
   BOPTest::ReportAlerts(pSplitter->GetReport());
+
+  // Set history of Split operation into the session
+  BRepTest_Objects::SetHistory(aPF.Arguments(), *pSplitter);
+
   if (pSplitter->HasErrors()) {
     return 0;
   }
@@ -388,7 +401,7 @@ Standard_Integer bsplit(Draw_Interpretor& di,
     di << buf;
   }
   //
-  // DRAW history support
+  // Debug commands support
   BOPTest_Objects::SetBuilder(pSplitter);
   //
   const TopoDS_Shape& aR = pSplitter->Shape();
index 80c95fb..ad9c92d 100644 (file)
@@ -21,6 +21,8 @@
 
 #include <BRepAlgoAPI_Defeaturing.hxx>
 
+#include <BRepTest_Objects.hxx>
+
 #include <DBRep.hxx>
 #include <Draw.hxx>
 
 #include <TopoDS_Compound.hxx>
 
 static Standard_Integer RemoveFeatures (Draw_Interpretor&, Standard_Integer, const char**);
-// History commands
-static Standard_Integer rfModified  (Draw_Interpretor&, Standard_Integer, const char**);
-static Standard_Integer rfGenerated (Draw_Interpretor&, Standard_Integer, const char**);
-static Standard_Integer rfIsDeleted (Draw_Interpretor&, Standard_Integer, const char**);
-
-namespace
-{
-  static BRepAlgoAPI_Defeaturing TheDefeaturingTool;
-}
 
 //=======================================================================
 //function : RemoveFeaturesCommands
@@ -58,16 +51,6 @@ void BOPTest::RemoveFeaturesCommands(Draw_Interpretor& theCommands)
                   "\t\tnohist   - disables the history collection;\n"
                   "\t\tparallel - enables the parallel processing mode.",
                   __FILE__, RemoveFeatures, group);
-
-  theCommands.Add("rfmodified", "rfmodified c_modified shape\n"
-                  "\t\tShows the shapes <c_modified> modified from the shape <shape> during Defeaturing.",
-                  __FILE__, rfModified, group);
-  theCommands.Add("rfgenerated", "rfgenerated c_generated shape\n"
-                  "\t\tShows the shapes <c_generated> generated from the shape <shape> during Defeaturing.",
-                  __FILE__, rfGenerated, group);
-  theCommands.Add("rfisdeleted", "rfisdeleted shape\n"
-                  "\t\tChecks if the shape has been deleted during Defeaturing.",
-                  __FILE__, rfIsDeleted, group);
 }
 
 //=======================================================================
@@ -127,143 +110,14 @@ Standard_Integer RemoveFeatures(Draw_Interpretor& theDI,
   // Check for the errors/warnings
   BOPTest::ReportAlerts(aRF.GetReport());
 
+  if (aRF.HasHistory())
+    BRepTest_Objects::SetHistory(aRF.GetHistory());
+
   if (aRF.HasErrors())
     return 0;
 
   const TopoDS_Shape& aResult = aRF.Shape();
   DBRep::Set(theArgv[1], aResult);
 
-  TheDefeaturingTool = aRF;
-
-  return 0;
-}
-
-//=======================================================================
-//function : CheckHistory
-//purpose  : Checks if the history available for the shape
-//=======================================================================
-Standard_Boolean IsHistoryAvailable(const TopoDS_Shape& theS,
-                                    Draw_Interpretor& theDI)
-{
-  if (theS.IsNull())
-  {
-    theDI << "Null shape.\n";
-    return Standard_False;
-  }
-
-  if (!BRepTools_History::IsSupportedType(theS))
-  {
-    theDI << "The history is not supported for this kind of shape.\n";
-    return Standard_False;
-  }
-
-  if (!TheDefeaturingTool.HasHistory())
-  {
-    theDI << "The history has not been prepared.\n";
-    return Standard_False;
-  }
-  return Standard_True;
-}
-
-//=======================================================================
-//function : rfModified
-//purpose  : 
-//=======================================================================
-Standard_Integer rfModified(Draw_Interpretor& theDI,
-                            Standard_Integer  theArgc,
-                            const char ** theArgv)
-{
-  if (theArgc != 3)
-  {
-    theDI.PrintHelp(theArgv[0]);
-    return 1;
-  }
-
-  const TopoDS_Shape& aS = DBRep::Get(theArgv[2]);
-  if (!IsHistoryAvailable(aS, theDI))
-    return 0;
-
-  const TopTools_ListOfShape& aLSIm = TheDefeaturingTool.Modified(aS);
-  if (aLSIm.IsEmpty())
-  {
-    theDI << "The shape has not been modified.\n";
-    return 0;
-  }
-
-  TopoDS_Shape aCModified;
-  if (aLSIm.Extent() == 1)
-    aCModified = aLSIm.First();
-  else
-  {
-    BRep_Builder().MakeCompound(TopoDS::Compound(aCModified));
-    TopTools_ListIteratorOfListOfShape itLS(aLSIm);
-    for (; itLS.More(); itLS.Next())
-      BRep_Builder().Add(aCModified, itLS.Value());
-  }
-
-  DBRep::Set(theArgv[1], aCModified);
-
-  return 0;
-}
-//=======================================================================
-//function : rfGenerated
-//purpose  : 
-//=======================================================================
-Standard_Integer rfGenerated(Draw_Interpretor& theDI,
-                             Standard_Integer  theArgc,
-                             const char ** theArgv)
-{
-  if (theArgc != 3)
-  {
-    theDI.PrintHelp(theArgv[0]);
-    return 1;
-  }
-
-  const TopoDS_Shape& aS = DBRep::Get(theArgv[2]);
-  if (!IsHistoryAvailable(aS, theDI))
-    return 0;
-
-  const TopTools_ListOfShape& aLSGen = TheDefeaturingTool.Generated(aS);
-  if (aLSGen.IsEmpty())
-  {
-    theDI << "No shapes were generated from the shape.\n";
-    return 0;
-  }
-
-  TopoDS_Shape aCGenerated;
-  if (aLSGen.Extent() == 1)
-    aCGenerated = aLSGen.First();
-  else
-  {
-    BRep_Builder().MakeCompound(TopoDS::Compound(aCGenerated));
-    TopTools_ListIteratorOfListOfShape itLS(aLSGen);
-    for (; itLS.More(); itLS.Next())
-      BRep_Builder().Add(aCGenerated, itLS.Value());
-  }
-
-  DBRep::Set(theArgv[1], aCGenerated);
-
-  return 0;
-}
-//=======================================================================
-//function : rfIsDeleted
-//purpose  : 
-//=======================================================================
-Standard_Integer rfIsDeleted(Draw_Interpretor& theDI,
-                             Standard_Integer  theArgc,
-                             const char ** theArgv)
-{
-  if (theArgc != 2)
-  {
-    theDI.PrintHelp(theArgv[0]);
-    return 1;
-  }
-
-  const TopoDS_Shape& aS = DBRep::Get(theArgv[1]);
-  if (!IsHistoryAvailable(aS, theDI))
-    return 0;
-
-  theDI << (TheDefeaturingTool.IsDeleted(aS) ? "Deleted" : "Not deleted") << "\n";
-
   return 0;
 }
index bfc64ed..2c97830 100755 (executable)
@@ -12,7 +12,6 @@ BOPTest_Objects.hxx
 BOPTest_OptionCommands.cxx
 BOPTest_PartitionCommands.cxx
 BOPTest_TolerCommands.cxx
-BOPTest_HistoryCommands.cxx
 BOPTest_DebugCommands.cxx
 BOPTest_CellsCommands.cxx
 BOPTest_RemoveFeaturesCommands.cxx
index 8165092..a62f30d 100644 (file)
@@ -182,6 +182,12 @@ public: //! @name History Methods
   //! Otherwise it returns false.
   Standard_EXPORT virtual Standard_Boolean IsDeleted(const TopoDS_Shape& theS) Standard_OVERRIDE;
 
+  //! Returns the History of shapes modifications
+  Handle(BRepTools_History) GetHistory()
+  {
+    return myFeatureRemovalTool.History();
+  }
+
 
 protected: //! @name Setting the algorithm into default state
 
index c99ab7e..33195cf 100644 (file)
@@ -185,6 +185,13 @@ public:
   //! Returns the TopoDS Shape of the top of the sweep.
   Standard_EXPORT const TopoDS_Shape& LastShape() const;
   
+  //! Returns the list of original profiles
+  void Profiles(TopTools_ListOfShape& theProfiles)
+  {
+    for (Standard_Integer i = 1; i <= mySeq.Length(); ++i)
+      theProfiles.Append(mySeq(i).OriginalShape());
+  }
+
   //! Returns the  list   of shapes generated   from the
   //! shape <S>.
   Standard_EXPORT void Generated (const TopoDS_Shape& S, TopTools_ListOfShape& L);
index 513acae..4c01e25 100644 (file)
 
 #include <BRepPrimAPI_MakeSweep.hxx>
 #include <Standard_Boolean.hxx>
+#include <BRepFill_PipeShell.hxx>
 #include <BRepFill_TypeOfContact.hxx>
 #include <BRepBuilderAPI_PipeError.hxx>
 #include <Standard_Real.hxx>
 #include <Standard_Integer.hxx>
 #include <BRepBuilderAPI_TransitionMode.hxx>
 #include <TopTools_ListOfShape.hxx>
-class BRepFill_PipeShell;
 class Standard_DomainError;
 class StdFail_NotDone;
 class TopoDS_Wire;
@@ -261,6 +261,11 @@ public:
   
   Standard_EXPORT Standard_Real ErrorOnSurface() const;
 
+  //! Returns the list of original profiles
+  void Profiles(TopTools_ListOfShape& theProfiles)
+  {
+    myPipe->Profiles(theProfiles);
+  }
 
 
 
index ddacd55..d03d87a 100644 (file)
@@ -296,6 +296,7 @@ void BRepOffsetAPI_ThruSections::Init(const Standard_Boolean isSolid, const Stan
 void BRepOffsetAPI_ThruSections::AddWire(const TopoDS_Wire& wire)
 {
   myWires.Append(wire);
+  myInputWires.Append(wire);
 }
 
 //=======================================================================
@@ -319,6 +320,7 @@ void BRepOffsetAPI_ThruSections::AddVertex(const TopoDS_Vertex& aVertex)
   DegWire.Closed( Standard_True );
 
   myWires.Append( DegWire );
+  myInputWires.Append(DegWire);
 }
 
 //=======================================================================
index 6de1f09..79c8839 100644 (file)
@@ -151,6 +151,11 @@ public:
   //! S can be an edge or a vertex of a given Profile (see methods AddWire and AddVertex).
   Standard_EXPORT virtual const TopTools_ListOfShape& Generated (const TopoDS_Shape& S) Standard_OVERRIDE;
 
+  //! Returns the list of original wires
+  const TopTools_ListOfShape& Wires() const
+  {
+    return myInputWires;
+  }
 
 
 protected:
@@ -174,7 +179,8 @@ private:
                                                          const Standard_Boolean vClosed) const;
 
 
-  TopTools_SequenceOfShape myWires;
+  TopTools_ListOfShape myInputWires; //!< List of input wires
+  TopTools_SequenceOfShape myWires;  //!< Working wires
   TopTools_DataMapOfShapeListOfInteger myEdgeNewIndices;
   TopTools_DataMapOfShapeInteger myVertexIndex;
   Standard_Integer myNbEdgesInSection;
index f608b9a..2e9a7df 100644 (file)
@@ -48,6 +48,7 @@ void  BRepTest::AllCommands(Draw_Interpretor& theCommands)
   BRepTest::CheckCommands(theCommands);
 //  BRepTest::PlacementCommands(theCommands) ;
   BRepTest::ProjectionCommands(theCommands) ;
+  BRepTest::HistoryCommands(theCommands);
 
   // define the TCL variable Draw_TOPOLOGY
   const char* com = "set Draw_TOPOLOGY 1";
index be218d3..1d5ca01 100644 (file)
@@ -98,6 +98,8 @@ public:
   //! Defines the commands to project a wire on a shape.
   Standard_EXPORT static void ProjectionCommands (Draw_Interpretor& DI);
 
+  //! Defines the History commands for the algorithms.
+  Standard_EXPORT static void HistoryCommands (Draw_Interpretor& DI);
 
 
 
diff --git a/src/BRepTest/BRepTest_DrawableHistory.cxx b/src/BRepTest/BRepTest_DrawableHistory.cxx
new file mode 100644 (file)
index 0000000..1a6bbd2
--- /dev/null
@@ -0,0 +1,44 @@
+// Created on: 2018/03/21
+// Created by: Eugeny MALTCHIKOV
+// Copyright (c) 2018 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <BRepTest_DrawableHistory.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(BRepTest_DrawableHistory, Draw_Drawable3D)
+
+//=======================================================================
+//function : DrawOn
+//purpose  : 
+//=======================================================================
+void BRepTest_DrawableHistory::DrawOn(Draw_Display&) const
+{
+}
+
+//=======================================================================
+//function : Dump
+//purpose  : 
+//=======================================================================
+void BRepTest_DrawableHistory:: Dump(Standard_OStream& theS) const
+{
+  myHistory->Dump(theS);
+}
+
+//=======================================================================
+//function : Whatis
+//purpose  : 
+//=======================================================================
+void BRepTest_DrawableHistory::Whatis(Draw_Interpretor& theDI) const
+{
+  theDI << "history";
+}
diff --git a/src/BRepTest/BRepTest_DrawableHistory.hxx b/src/BRepTest/BRepTest_DrawableHistory.hxx
new file mode 100644 (file)
index 0000000..e5d0ebe
--- /dev/null
@@ -0,0 +1,65 @@
+// Created on: 2018/03/21
+// Created by: Eugeny MALTCHIKOV
+// Copyright (c) 2018 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _BRepTest_DrawableHistory_HeaderFile
+#define _BRepTest_DrawableHistory_HeaderFile
+
+#include <Standard.hxx>
+#include <Standard_Type.hxx>
+
+#include <BRepTools_History.hxx>
+
+#include <Draw_Drawable3D.hxx>
+#include <Draw_Interpretor.hxx>
+
+#include <Standard_OStream.hxx>
+
+//! Drawable History object.
+//! Allows keeping histories of the algorithms in Draw.
+class BRepTest_DrawableHistory : public Draw_Drawable3D
+{
+  DEFINE_STANDARD_RTTIEXT(BRepTest_DrawableHistory, Draw_Drawable3D)
+
+public:
+
+  //! Creation of the Drawable history.
+  BRepTest_DrawableHistory(const Handle(BRepTools_History)& theHistory)
+  {
+    myHistory = theHistory;
+  }
+
+  //! Returns the history.
+  const Handle(BRepTools_History)& History() const
+  {
+    return myHistory;
+  }
+
+  //! Drawing is not available.
+  Standard_EXPORT virtual void DrawOn(Draw_Display&)const Standard_OVERRIDE;
+
+  //! Dumps the history.
+  Standard_EXPORT virtual void Dump(Standard_OStream& theS) const Standard_OVERRIDE;
+
+  //! Prints the type of the history object.
+  Standard_EXPORT virtual void Whatis(Draw_Interpretor& theDI) const Standard_OVERRIDE;
+
+private:
+
+  Handle(BRepTools_History) myHistory; //!< Tool for tracking History of shape's modification
+};
+
+DEFINE_STANDARD_HANDLE(BRepTest_DrawableHistory, Draw_Drawable3D)
+
+#endif
index 4dfa14a..3e9c439 100644 (file)
@@ -61,6 +61,7 @@
 #include <DBRep.hxx>
 #include <DBRep_DrawableShape.hxx>
 #include <BRepTest.hxx>
+#include <BRepTest_Objects.hxx>
 
 #include <BRepFilletAPI_MakeFillet.hxx>
 #include <ChFi3d_FilletShape.hxx>
@@ -2093,9 +2094,9 @@ static Standard_Integer BOSS(Draw_Interpretor& theCommands,
   }
 
   if ((!strcasecmp(a[0],"ENDEDGES") && narg !=5) ||
-      (!strcasecmp(a[0],"FILLET") && narg <5 &&  narg%2 != 1) ||
+      (!strcasecmp(a[0],"FILLET") && (narg < 5 || narg%2 != 1)) ||
       (!strcasecmp(a[0],"BOSSAGE") && narg != 6)) {
-    theCommands << "invalid number of arguments";
+    theCommands.PrintHelp(a[0]);
     return 1;
   }
 
@@ -2171,6 +2172,8 @@ static Standard_Integer BOSS(Draw_Interpretor& theCommands,
 
     if(V.IsNull()) return 1;
     ChFi3d_FilletShape FSh = ChFi3d_Rational;
+    if (Rakk)
+      delete Rakk;
     Rakk = new BRepFilletAPI_MakeFillet(V,FSh);
     Rakk->SetParams(ta,t3d,t2d,t3d,t2d,fl);
     Rakk->SetContinuity(blend_cont, tapp_angle);
@@ -2233,6 +2236,12 @@ static Standard_Integer BOSS(Draw_Interpretor& theCommands,
       DBRep::Set(a[2],res);
     }
     dout.Flush();
+
+    // Save history for fillet
+    TopTools_ListOfShape anArg;
+    anArg.Append(V);
+    BRepTest_Objects::SetHistory(anArg, *Rakk);
+
     return 0;
   }
 
index 30befd0..498406c 100644 (file)
@@ -15,6 +15,7 @@
 // commercial license or contractual agreement.
 
 #include <BRepTest.hxx>
+#include <BRepTest_Objects.hxx>
 #include <TColgp_Array1OfPnt2d.hxx>
 #include <DBRep.hxx>
 #include <Draw_Interpretor.hxx>
@@ -176,6 +177,12 @@ static Standard_Integer BLEND(Draw_Interpretor& di, Standard_Integer narg, const
   if(!nbedge) return 1;
   Rakk->Build();
   if(!Rakk->IsDone()) return 1;
+
+  // Save history for fillet
+  TopTools_ListOfShape anArg;
+  anArg.Append(V);
+  BRepTest_Objects::SetHistory(anArg, *Rakk);
+
   TopoDS_Shape res = Rakk->Shape();
   DBRep::Set(a[1],res);
   return 0;
diff --git a/src/BRepTest/BRepTest_HistoryCommands.cxx b/src/BRepTest/BRepTest_HistoryCommands.cxx
new file mode 100644 (file)
index 0000000..a0f3616
--- /dev/null
@@ -0,0 +1,249 @@
+// Created on: 2018/03/21
+// Created by: Eugeny MALTCHIKOV
+// Copyright (c) 2018 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <BRepTest.hxx>
+
+#include <BRep_Builder.hxx>
+
+#include <BRepTest_DrawableHistory.hxx>
+#include <BRepTest_Objects.hxx>
+
+#include <Draw.hxx>
+#include <DBRep.hxx>
+
+#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**);
+
+//=======================================================================
+//function : HistoryCommands
+//purpose  : 
+//=======================================================================
+void BRepTest::HistoryCommands(Draw_Interpretor& theCommands)
+{
+  static Standard_Boolean isDone = Standard_False;
+  if (isDone) return;
+  isDone = Standard_True;
+  // Chapter's name
+  const char* group = "History commands";
+
+  // Commands
+  theCommands.Add("savehistory" , "savehistory name\n"
+                  "\t\tSaves the history from the session into a drawable object with the name <name>.",
+                  __FILE__, SaveHistory , group);
+
+  theCommands.Add("modified" , "modified modified_shapes history shape\n"
+                  "\t\tReturns the shapes Modified from the given shape in the given history",
+                  __FILE__, Modified , group);
+
+  theCommands.Add("generated", "generated generated_shapes history shape\n"
+                  "\t\tReturns the shapes Generated from the given shape in the given history",
+                  __FILE__, Generated, group);
+
+  theCommands.Add("isdeleted", "isdeleted history shape\n"
+                  "\t\tChecks if the given shape has been deleted in the given history",
+                  __FILE__, IsDeleted, group);
+}
+
+//=======================================================================
+//function : SaveHistory
+//purpose  : 
+//=======================================================================
+Standard_Integer SaveHistory(Draw_Interpretor& theDI,
+                             Standard_Integer theArgc,
+                             const char** theArgv)
+{
+  if (theArgc != 2)
+  {
+    theDI.PrintHelp(theArgv[0]);
+    return 1;
+  }
+
+  // Get the history from the session
+  Handle(BRepTools_History) aHistory = BRepTest_Objects::History();
+  if (aHistory.IsNull())
+  {
+    theDI << "No history has been prepared yet.";
+    return 1;
+  }
+
+  Handle(BRepTest_DrawableHistory) aDrawHist = new BRepTest_DrawableHistory(aHistory);
+
+  Draw::Set(theArgv[1], aDrawHist);
+
+  return 0;
+}
+
+//=======================================================================
+//function : GetHistory
+//purpose  : 
+//=======================================================================
+static Handle(BRepTools_History) GetHistory(Draw_Interpretor& theDI,
+                                            Standard_CString theName)
+{
+  Handle(BRepTest_DrawableHistory) aHistory =
+    Handle(BRepTest_DrawableHistory)::DownCast(Draw::Get(theName));
+
+  if (aHistory.IsNull() || aHistory->History().IsNull())
+  {
+    theDI << "History with the name " << theName << " does not exist.";
+    return NULL;
+  }
+
+  return aHistory->History();
+}
+
+//=======================================================================
+//function : GetShape
+//purpose  : 
+//=======================================================================
+static TopoDS_Shape GetShape(Draw_Interpretor& theDI,
+                             Standard_CString theName)
+{
+  TopoDS_Shape aS = DBRep::Get(theName);
+
+  if (aS.IsNull())
+  {
+    theDI << theName << " is a null shape.";
+    return TopoDS_Shape();
+  }
+
+  if (!BRepTools_History::IsSupportedType(aS))
+  {
+    theDI << "History is not supported for this kind of shape.";
+    return TopoDS_Shape();
+  }
+  return aS;
+}
+
+//=======================================================================
+//function : MakeCompound
+//purpose  : 
+//=======================================================================
+static TopoDS_Shape MakeCompound(const TopTools_ListOfShape& theLS)
+{
+  TopoDS_Shape aC;
+  if (theLS.Extent() == 1)
+    aC = theLS.First();
+  else
+  {
+    BRep_Builder().MakeCompound(TopoDS::Compound(aC));
+    TopTools_ListIteratorOfListOfShape it(theLS);
+    for (; it.More(); it.Next())
+      BRep_Builder().Add(aC, it.Value());
+  }
+  return aC;
+}
+
+//=======================================================================
+//function : Modified
+//purpose  : 
+//=======================================================================
+Standard_Integer Modified(Draw_Interpretor& theDI,
+                          Standard_Integer theArgc,
+                          const char** theArgv)
+{
+  if (theArgc != 4)
+  {
+    theDI.PrintHelp(theArgv[0]);
+    return 1;
+  }
+
+  Handle(BRepTools_History) aHistory = GetHistory(theDI, theArgv[2]);
+  if (aHistory.IsNull())
+    return 1;
+
+  TopoDS_Shape aS = GetShape(theDI, theArgv[3]);
+  if (aS.IsNull())
+    return 1;
+
+  const TopTools_ListOfShape& aModified = aHistory->Modified(aS);
+
+  if (aModified.IsEmpty())
+  {
+    theDI << "The shape has not been modified.";
+    return 0;
+  }
+
+  DBRep::Set(theArgv[1], MakeCompound(aModified));
+
+  return 0;
+}
+
+//=======================================================================
+//function : Generated
+//purpose  : 
+//=======================================================================
+Standard_Integer Generated(Draw_Interpretor& theDI,
+                           Standard_Integer theArgc,
+                           const char** theArgv)
+{
+  if (theArgc != 4)
+  {
+    theDI.PrintHelp(theArgv[0]);
+    return 1;
+  }
+
+  Handle(BRepTools_History) aHistory = GetHistory(theDI, theArgv[2]);
+  if (aHistory.IsNull())
+    return 1;
+
+  TopoDS_Shape aS = GetShape(theDI, theArgv[3]);
+  if (aS.IsNull())
+    return 1;
+
+  const TopTools_ListOfShape& aGenerated = aHistory->Generated(aS);
+
+  if (aGenerated.IsEmpty())
+  {
+    theDI << "No shapes were generated from the shape.";
+    return 0;
+  }
+
+  DBRep::Set(theArgv[1], MakeCompound(aGenerated));
+
+  return 0;
+}
+
+//=======================================================================
+//function : IsDeleted
+//purpose  : 
+//=======================================================================
+Standard_Integer IsDeleted(Draw_Interpretor& theDI,
+                           Standard_Integer theArgc,
+                           const char** theArgv)
+{
+  if (theArgc != 3)
+  {
+    theDI.PrintHelp(theArgv[0]);
+    return 1;
+  }
+
+  Handle(BRepTools_History) aHistory = GetHistory(theDI, theArgv[1]);
+  if (aHistory.IsNull())
+    return 1;
+
+  TopoDS_Shape aS = GetShape(theDI, theArgv[2]);
+  if (aS.IsNull())
+    return 1;
+
+  theDI << (aHistory->IsRemoved(aS) ? "Deleted." : "Not deleted.");
+
+  return 0;
+}
diff --git a/src/BRepTest/BRepTest_Objects.cxx b/src/BRepTest/BRepTest_Objects.cxx
new file mode 100644 (file)
index 0000000..2bcbc95
--- /dev/null
@@ -0,0 +1,89 @@
+// Created on: 2018/03/21
+// Created by: Eugeny MALTCHIKOV
+// Copyright (c) 2018 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <BRepTest_Objects.hxx>
+
+//=======================================================================
+//function : BRepTest_Session
+//purpose  : Class for the objects in the session
+//=======================================================================
+class BRepTest_Session
+{
+public:
+
+  //! Empty constructor
+  BRepTest_Session() {}
+
+  //! Sets the History in the session
+  void SetHistory(const Handle(BRepTools_History)& theHistory)
+  {
+    myHistory = theHistory;
+  }
+
+  //! Add the History to the history in the session
+  void AddHistory(const Handle(BRepTools_History)& theHistory)
+  {
+    if (myHistory.IsNull())
+      myHistory = new BRepTools_History;
+    myHistory->Merge(theHistory);
+  }
+
+  //! Returns the history from the session
+  const Handle(BRepTools_History)& History() const
+  {
+    return myHistory;
+  }
+
+private:
+
+  Handle(BRepTools_History) myHistory;
+};
+
+//=======================================================================
+//function : GetSession
+//purpose  : 
+//=======================================================================
+static BRepTest_Session& GetSession()
+{
+  static BRepTest_Session* pSession = new BRepTest_Session();
+  return *pSession;
+}
+
+//=======================================================================
+//function : SetHistory
+//purpose  : 
+//=======================================================================
+void BRepTest_Objects::SetHistory(const Handle(BRepTools_History)& theHistory)
+{
+  GetSession().SetHistory(theHistory);
+}
+
+//=======================================================================
+//function : AddHistory
+//purpose  : 
+//=======================================================================
+void BRepTest_Objects::AddHistory(const Handle(BRepTools_History)& theHistory)
+{
+  GetSession().AddHistory(theHistory);
+}
+
+//=======================================================================
+//function : History
+//purpose  : 
+//=======================================================================
+Handle(BRepTools_History) BRepTest_Objects::History()
+{
+  return GetSession().History();
+}
diff --git a/src/BRepTest/BRepTest_Objects.hxx b/src/BRepTest/BRepTest_Objects.hxx
new file mode 100644 (file)
index 0000000..95a24f3
--- /dev/null
@@ -0,0 +1,52 @@
+// Created on: 2018/03/21
+// Created by: Eugeny MALTCHIKOV
+// Copyright (c) 2018 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _BRepTest_Objects_HeaderFile
+#define _BRepTest_Objects_HeaderFile
+
+#include <BRepTools_History.hxx>
+
+//! Provides the access to the useful tools common for the algorithms.
+class BRepTest_Objects
+{
+public:
+
+  //! Sets the given history into the session.
+  Standard_EXPORT static void SetHistory(const Handle(BRepTools_History)& theHistory);
+
+  //! Adds the given history to the history in the session.
+  Standard_EXPORT static void AddHistory(const Handle(BRepTools_History)& theHistory);
+
+  //! Sets the history of the given algorithm into the session.
+  template <class TheAlgo>
+  static void SetHistory(const TopTools_ListOfShape& theArguments,
+                         TheAlgo& theAlgo)
+  {
+    SetHistory(new BRepTools_History(theArguments, theAlgo));
+  }
+
+  //! Adds the history of the given algorithm into the session.
+  template <class TheAlgo>
+  static void AddHistory(const TopTools_ListOfShape& theArguments,
+                         TheAlgo& theAlgo)
+  {
+    AddHistory(new BRepTools_History(theArguments, theAlgo));
+  }
+
+  //! Returns the history from the session.
+  Standard_EXPORT static Handle(BRepTools_History) History();
+};
+
+#endif
index 8f3b51f..87b347a 100644 (file)
@@ -15,6 +15,9 @@
 // commercial license or contractual agreement.
 
 #include <BRepTest.hxx>
+
+#include <BRepTest_Objects.hxx>
+
 #include <DBRep.hxx>
 #include <Draw_Interpretor.hxx>
 #include <Draw_Appli.hxx>
@@ -420,59 +423,13 @@ Standard_Integer thrusections(Draw_Interpretor&, Standard_Integer n, const char*
   if (Generator->IsDone()) {
     TopoDS_Shape Shell = Generator->Shape();
     DBRep::Set(a[index-1], Shell);
+    // Save history of the lofting
+    BRepTest_Objects::SetHistory(Generator->Wires(), *Generator);
   }
   else {
     cout << "Algorithm is not done" << endl;
   }
-  return 0;
-}
-
-//============================================================================
-//function : genthrus
-//purpose  : returns generated shape for subshape of a section of thrusections
-//           Thrusections must be done previously
-//============================================================================
-static Standard_Integer genthrus(Draw_Interpretor& di,
-                                 Standard_Integer n, const char** a)
-{
-  if (n != 3)
-  {
-    di << "genthrus: it is called after thrusections command\n";
-    di << "returns:\n";
-    di << "- chain of generated faces for sub-edge of a profile;\n";
-    di << "- chain of generated edges for sub-vertex of a profile;\n";
-    di << "- bunch of chains of generated edges for start or end vertex if it is degenerated section.\n";
-    di << "Usage: genthrus res subshape_of_profile, thrusections must be done\n";
-    return 1;
-  }
-  if (Generator == 0)
-  {
-    di << "You have forgotten the <<thrusections>> command !\n";
-    return 1;
-  }
-  if (!Generator->IsDone())
-  {
-    di << "Thrusections is not done\n";
-    return 1;
-  }
-  TopoDS_Shape aShape = DBRep::Get(a[2]);
-  if (aShape.IsNull())
-  {
-    cout<<"Null subshape"<<endl;
-    return 1;
-  }
-  const TopTools_ListOfShape& Edges = Generator->Generated(aShape);
-  TopoDS_Compound aCompound;
-  BRep_Builder BB;
-  BB.MakeCompound(aCompound);
-  TopTools_ListIteratorOfListOfShape iter(Edges);
-  for (; iter.More(); iter.Next())
-  {
-    const TopoDS_Shape& anEdge = iter.Value();
-    BB.Add(aCompound, anEdge);
-  }
 
-  DBRep::Set(a[1], aCompound);
   return 0;
 }
 
@@ -801,7 +758,6 @@ static Standard_Integer buildsweep(Draw_Interpretor& di,
       //cout << "BuildSweep : One section can not be in contact with the guide" << endl;
       di << "BuildSweep : One section can not be in contact with the guide\n";
     }
-    return 1;
   }
   else {
     if (mksolid) {
@@ -812,51 +768,16 @@ 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);
   }
 
   return 0;
 }
 
 //=======================================================================
-//function : gensweep
-//purpose  : returns generated shape for subshape of a section of sweep
-//           Sweep must be done previously
-//=======================================================================
-static Standard_Integer gensweep(Draw_Interpretor&,
-                                 Standard_Integer n, const char** a)
-{
-  if (n != 3)
-  {
-    cout<<"Usage: gensweep res subshape_of_profile, sweep must be done"<<endl;
-    return 1;
-  }
-  if (!Sweep->IsDone())
-  {
-    cout<<"Sweep is not done"<<endl;
-    return 1;
-  }
-  TopoDS_Shape aShape = DBRep::Get(a[2]);
-  if (aShape.IsNull())
-  {
-    cout<<"Null subshape"<<endl;
-    return 1;
-  }
-  TopTools_ListOfShape Shells = Sweep->Generated(aShape);
-  TopoDS_Compound aCompound;
-  BRep_Builder BB;
-  BB.MakeCompound(aCompound);
-  TopTools_ListIteratorOfListOfShape itsh(Shells);
-  for (; itsh.More(); itsh.Next())
-  {
-    const TopoDS_Shape& aShell = itsh.Value();
-    BB.Add(aCompound, aShell);
-  }
-
-  DBRep::Set(a[1], aCompound);
-  return 0;
-}
-
-//=======================================================================
 //function : errorsweep
 //purpose  : returns the summary error on resulting surfaces
 //           reached by Sweep
@@ -992,9 +913,6 @@ void  BRepTest::SweepCommands(Draw_Interpretor& theCommands)
 
   theCommands.Add("thrusections", "thrusections [-N] result issolid isruled shape1 shape2 [..shape..], the option -N means no check on wires, shapes must be wires or vertices (only first or last)",
                  __FILE__,thrusections,g);
-
-  theCommands.Add("genthrus", "genthrus res subshape_of_profile",
-                 __FILE__,genthrus,g);
   
   theCommands.Add("mksweep", "mksweep wire",
                  __FILE__,mksweep,g);
@@ -1013,9 +931,6 @@ void  BRepTest::SweepCommands(Draw_Interpretor& theCommands)
  theCommands.Add("buildsweep", "builsweep [r] [option] [Tol] , no args to get help",
                  __FILE__,buildsweep,g);
 
- theCommands.Add("gensweep", "gensweep res subshape_of_profile",
-                 __FILE__,gensweep,g);
-
  theCommands.Add("errorsweep", "errorsweep: returns the summary error on resulting surfaces reached by Sweep",
                  __FILE__,errorsweep,g);
 
index bb6a53b..2a82d4c 100755 (executable)
@@ -5,13 +5,18 @@ BRepTest_ChamferCommands.cxx
 BRepTest_CheckCommands.cxx
 BRepTest_CurveCommands.cxx
 BRepTest_DraftAngleCommands.cxx
+BRepTest_DrawableHistory.cxx
+BRepTest_DrawableHistory.hxx
 BRepTest_ExtremaCommands.cxx
 BRepTest_FeatureCommands.cxx
 BRepTest_Fillet2DCommands.cxx
 BRepTest_FilletCommands.cxx
 BRepTest_FillingCommands.cxx
 BRepTest_GPropCommands.cxx
+BRepTest_HistoryCommands.cxx
 BRepTest_MatCommands.cxx
+BRepTest_Objects.cxx
+BRepTest_Objects.hxx
 BRepTest_OtherCommands.cxx
 BRepTest_PrimitiveCommands.cxx
 BRepTest_ProjectionCommands.cxx
index 8ad7a59..23867a6 100644 (file)
@@ -302,6 +302,7 @@ void BRepTools_History::Merge(const BRepTools_History& theHistory23)
 
           TopTools_ListOfShape aM2 = aMIt2.Value();
           ((*aS1ToGAndM[aI])(aS2)).Append(aM2);
+          myRemoved.Remove(aS2);
         }
       }
     }
index 4a17091..7290c80 100644 (file)
@@ -212,6 +212,17 @@ public: //! A method to merge a next history to this history.
     Merge(BRepTools_History(theArguments, theAlgo));
   }
 
+public: //! A method to dump a history
+
+  //! Prints the brief description of the history into a stream
+  void Dump(Standard_OStream& theS)
+  {
+    theS << "History contains:\n";
+    theS << " - " << myRemoved.Extent() << " Deleted shapes;\n";
+    theS << " - " << myShapeToModified.Extent() << " Modified shapes;\n";
+    theS << " - " << myShapeToGenerated.Extent() << " Generated shapes.\n";
+  }
+
 public:
 
   //! Define the OCCT RTTI for the type.
index 523c617..1c969b4 100644 (file)
@@ -22,6 +22,7 @@
 #include <BRep_Builder.hxx>
 #include <BRepBuilderAPI.hxx>
 #include <BRepBuilderAPI_Transform.hxx>
+#include <BRepTest_Objects.hxx>
 #include <BRepTools.hxx>
 #include <BRepTools_ReShape.hxx>
 #include <DBRep.hxx>
@@ -1360,62 +1361,9 @@ static Standard_Integer unifysamedom(Draw_Interpretor& di, Standard_Integer n, c
   Unifier().Build();
   TopoDS_Shape Result = Unifier().Shape();
 
-  DBRep::Set(a[1], Result);
-  return 0;
-}
-
-Standard_Integer unifysamedommod(Draw_Interpretor& di,
-                                 Standard_Integer n,
-                                 const char** a)
-{
-  if (n != 3) {
-    di << "use unifysamedommod newshape oldshape\n";
-    return 0;
-  }
-  TopoDS_Shape aShape;
-  aShape = DBRep::Get(a[2]);
-  if (aShape.IsNull()) {
-    di << "Null shape is not allowed here\n";
-    return 1;
-  }
-
-  const TopTools_ListOfShape& aLS = Unifier().History()->Modified(aShape);
-
-  if (aLS.Extent() > 1) {
-    BRep_Builder aBB;
-    TopoDS_Compound aRes;
-    aBB.MakeCompound(aRes);
-    TopTools_ListIteratorOfListOfShape aIt(aLS);
-    for (; aIt.More(); aIt.Next()) {
-      const TopoDS_Shape& aCurrentShape = aIt.Value();
-      aBB.Add(aRes, aCurrentShape);
-    }
-    DBRep::Set(a[1], aRes);
-  }
-  else if (aLS.Extent() == 1) {
-    DBRep::Set(a[1], aLS.First());
-  }
-  else {
-    di << "The shape has not been modified\n";
-  }
-  return 0;
-}
+  BRepTest_Objects::SetHistory(Unifier().History());
 
-Standard_Integer unifysamedomisdel(Draw_Interpretor& di,
-                                   Standard_Integer n,
-                                   const char** a)
-{
-  if (n < 2) {
-    di << "Use: unifysamedomisdel shape\n";
-    return 1;
-  }
-  TopoDS_Shape aShape = DBRep::Get(a[1]);
-  if (aShape.IsNull()) {
-    di << "Null shape is not allowed here\n";
-    return 1;
-  }
-  Standard_Boolean IsDeleted = Unifier().History()->IsRemoved(aShape);
-  di << "The shape has" << (IsDeleted ? " " : " not ") << "been deleted" << "\n";
+  DBRep::Set(a[1], Result);
   return 0;
 }
 
@@ -1634,15 +1582,6 @@ static Standard_Integer reshape(Draw_Interpretor& /*theDI*/,
                    "unifysamedom result shape [s1 s2 ...] [-f] [-e] [-nosafe] [+b] [+i] [-t val] [-a val]",
                     __FILE__,unifysamedom,g);
 
-  theCommands.Add("unifysamedommod",
-                  "unifysamedommod newshape oldshape : get new shape modified "
-                  "by unifysamedom command from the old one",
-                  __FILE__, unifysamedommod, g);
-
-  theCommands.Add("unifysamedomisdel",
-                  "unifysamedomisdel shape : shape is deleted ",
-                  __FILE__, unifysamedomisdel, g);
-  
   theCommands.Add ("copytranslate","result shape dx dy dz",__FILE__,copytranslate,g);
 
   theCommands.Add ("reshape",
index 55600bd..2bc5eb2 100644 (file)
@@ -17,30 +17,33 @@ bfillds
 puts "Common operation"
 bbop rcom 0
 
+# get history of the operation
+savehistory com_hist
+
 # check that both e1 and e2 have been deleted
-if {[string trim [bisdeleted e1]] != "Deleted"} {
+if {[string trim [isdeleted com_hist e1]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
-if {[string trim [bisdeleted e2]] != "Deleted"} {
+if {[string trim [isdeleted com_hist e2]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that none of the e1 and e2 have been Modified
-if {[string trim [bmodified rm e1]] != "The shape has not been modified"} {
+if {[string trim [modified rm com_hist e1]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
-if {[string trim [bmodified rm e2]] != "The shape has not been modified"} {
+if {[string trim [modified rm com_hist e2]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
 # check that none of the e1 and e2 have Generated shapes
-if {[string trim [bgenerated rg e1]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg com_hist e1]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
-if {[string trim [bgenerated rg e2]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg com_hist e2]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
@@ -48,88 +51,97 @@ if {[string trim [bgenerated rg e2]] != "No shapes were generated from the shape
 puts "Fuse operation"
 bbop rfuse 1
 
+# get history of the operation
+savehistory fuse_hist
+
 # check that both e1 and e2 have not been deleted
-if {[string trim [bisdeleted e1]] != "Not deleted"} {
+if {[string trim [isdeleted fuse_hist e1]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
-if {[string trim [bisdeleted e2]] != "Not deleted"} {
+if {[string trim [isdeleted fuse_hist e2]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that both e1 and e2 have been Modified
-bmodified rm e1
+modified rm fuse_hist e1
 checknbshapes rm -edge 3 -m "Information about modification of e1"
 
-bmodified rm e2
+modified rm fuse_hist e2
 checknbshapes rm -edge 3 -m "Information about modification of e2"
 
 # check that both e1 and e2 have Generated vertices
-bgenerated rg e1
+generated rg fuse_hist e1
 checknbshapes rg -vertex 2 -m "Information about shapes Generated from e1"
 
-bgenerated rg e2
+generated rg fuse_hist e2
 checknbshapes rg -vertex 2 -m "Information about shapes Generated from e2"
 
 
 puts "CUT operation"
 bbop rcut 2
 
+# get history of the operation
+savehistory cut_hist
+
 # check that e1 has not been deleted
-if {[string trim [bisdeleted e1]] != "Not deleted"} {
+if {[string trim [isdeleted cut_hist e1]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that e2 has been deleted
-if {[string trim [bisdeleted e2]] != "Deleted"} {
+if {[string trim [isdeleted cut_hist e2]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that e1 has been modified
-bmodified rm e1
+modified rm cut_hist e1
 checknbshapes rm -edge 3 -m "Information about modification of e1"
 
 # check that e2 has not been modified
-if {[string trim [bmodified rm e2]] != "The shape has not been modified"} {
+if {[string trim [modified rm cut_hist e2]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
 # check that both e1 and e2 have Generated vertices
-bgenerated rg e1
+generated rg cut_hist e1
 checknbshapes rg -vertex 2 -m "Information about shapes Generated from e1"
 
-bgenerated rg e2
+generated rg cut_hist e2
 checknbshapes rg -vertex 2 -m "Information about shapes Generated from e2"
 
 
 puts "TUC operation"
 bbop rtuc 3
 
+# get history of the operation
+savehistory tuc_hist
+
 # check that e1 has been deleted
-if {[string trim [bisdeleted e1]] != "Deleted"} {
+if {[string trim [isdeleted tuc_hist e1]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that e2 has not been deleted
-if {[string trim [bisdeleted e2]] != "Not deleted"} {
+if {[string trim [isdeleted tuc_hist e2]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that e1 has not been modified
-if {[string trim [bmodified rm e1]] != "The shape has not been modified"} {
+if {[string trim [modified rm tuc_hist e1]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
 # check that e2 has been modified
-bmodified rm e2
+modified rm tuc_hist e2
 checknbshapes rm -edge 3 -m "Information about modification of e1"
 
 
 # check that both e1 and e2 have Generated vertices
-bgenerated rg e1
+generated rg tuc_hist e1
 checknbshapes rg -vertex 2 -m "Information about shapes Generated from e1"
 
-bgenerated rg e2
+generated rg tuc_hist e2
 checknbshapes rg -vertex 2 -m "Information about shapes Generated from e2"
 
 
@@ -137,27 +149,30 @@ checknbshapes rg -vertex 2 -m "Information about shapes Generated from e2"
 puts "SECTION operation"
 bbop rsec 4
 
+# get history of the operation
+savehistory sec_hist
+
 # check that both e1 and e2 have been deleted
-if {[string trim [bisdeleted e1]] != "Deleted"} {
+if {[string trim [isdeleted sec_hist e1]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
-if {[string trim [bisdeleted e2]] != "Deleted"} {
+if {[string trim [isdeleted sec_hist e2]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that none of the e1 and e2 have been Modified 
-if {[string trim [bmodified rm e1]] != "The shape has not been modified"} {
+if {[string trim [modified rm sec_hist e1]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
-if {[string trim [bmodified rm e2]] != "The shape has not been modified"} {
+if {[string trim [modified rm sec_hist e2]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
 # check that both e1 and e2 have Generated vertices
-bgenerated rg e1
+generated rg sec_hist e1
 checknbshapes rg -vertex 2 -m "Information about shapes Generated from e1"
 
-bgenerated rg e2
+generated rg sec_hist e2
 checknbshapes rg -vertex 2 -m "Information about shapes Generated from e2"
index 844d71e..97880bb 100644 (file)
@@ -17,30 +17,33 @@ bfillds
 puts "Common operation"
 bbop rcom 0
 
+# get history of the operation
+savehistory com_hist
+
 # check that both f1 and f2 have been deleted
-if {[string trim [bisdeleted f1]] != "Deleted"} {
+if {[string trim [isdeleted com_hist f1]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
-if {[string trim [bisdeleted f2]] != "Deleted"} {
+if {[string trim [isdeleted com_hist f2]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that none of the f1 and f2 have been Modified
-if {[string trim [bmodified rm f1]] != "The shape has not been modified"} {
+if {[string trim [modified rm com_hist f1]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
-if {[string trim [bmodified rm f2]] != "The shape has not been modified"} {
+if {[string trim [modified rm com_hist f2]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
 # check that none of the f1 and f2 have Generated shapes
-if {[string trim [bgenerated rg f1]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg com_hist f1]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
-if {[string trim [bgenerated rg f2]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg com_hist f2]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
@@ -48,88 +51,97 @@ if {[string trim [bgenerated rg f2]] != "No shapes were generated from the shape
 puts "Fuse operation"
 bbop rfuse 1
 
+# get history of the operation
+savehistory fuse_hist
+
 # check that both f1 and f2 have not been deleted
-if {[string trim [bisdeleted f1]] != "Not deleted"} {
+if {[string trim [isdeleted fuse_hist f1]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
-if {[string trim [bisdeleted f2]] != "Not deleted"} {
+if {[string trim [isdeleted fuse_hist f2]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that both f1 and f2 have been Modified
-bmodified rm f1
+modified rm fuse_hist f1
 checknbshapes rm -face 1 -m "Information about modification of f1"
 
-bmodified rm f2
+modified rm fuse_hist f2
 checknbshapes rm -face 3 -m "Information about modification of f2"
 
 # check that both f1 and f2 have Generated edges
-bgenerated rg f1
+generated rg fuse_hist f1
 checknbshapes rg -edge 2 -m "Information about shapes Generated from f1"
 
-bgenerated rg f1
+generated rg fuse_hist f1
 checknbshapes rg -edge 2 -m "Information about shapes Generated from f2"
 
 
 puts "CUT operation"
 bbop rcut 2
 
+# get history of the operation
+savehistory cut_hist
+
 # check that f1 has not been deleted
-if {[string trim [bisdeleted f1]] != "Not deleted"} {
+if {[string trim [isdeleted cut_hist f1]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that f2 has been deleted
-if {[string trim [bisdeleted f2]] != "Deleted"} {
+if {[string trim [isdeleted cut_hist f2]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that f1 has been modified
-bmodified rm f1
+modified rm cut_hist f1
 checknbshapes rm -face 1 -m "Information about modification of f1"
 
 # check that f2 has not been modified
-if {[string trim [bmodified rm f2]] != "The shape has not been modified"} {
+if {[string trim [modified rm cut_hist f2]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
 # check that both f1 and f2 have Generated edges
-bgenerated rg f1
+generated rg cut_hist f1
 checknbshapes rg -edge 2 -m "Information about shapes Generated from f1"
 
-bgenerated rg f2
+generated rg cut_hist f2
 checknbshapes rg -edge 2 -m "Information about shapes Generated from f2"
 
 
 puts "TUC operation"
 bbop rtuc 3
 
+# get history of the operation
+savehistory tuc_hist
+
 # check that f1 has been deleted
-if {[string trim [bisdeleted f1]] != "Deleted"} {
+if {[string trim [isdeleted tuc_hist f1]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that f2 has not been deleted
-if {[string trim [bisdeleted f2]] != "Not deleted"} {
+if {[string trim [isdeleted tuc_hist f2]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that f1 has not been modified
-if {[string trim [bmodified rm f1]] != "The shape has not been modified"} {
+if {[string trim [modified rm tuc_hist f1]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
 # check that f2 has been modified
-bmodified rm f2
+modified rm tuc_hist f2
 checknbshapes rm -face 3 -m "Information about modification of f1"
 
 
 # check that both f1 and f2 have Generated vertices
-bgenerated rg f1
+generated rg tuc_hist f1
 checknbshapes rg -edge 2 -m "Information about shapes Generated from f1"
 
-bgenerated rg f2
+generated rg tuc_hist f2
 checknbshapes rg -edge 2 -m "Information about shapes Generated from f2"
 
 
@@ -137,27 +149,30 @@ checknbshapes rg -edge 2 -m "Information about shapes Generated from f2"
 puts "SECTION operation"
 bbop rsec 4
 
+# get history of the operation
+savehistory sec_hist
+
 # check that both f1 and f2 have been deleted
-if {[string trim [bisdeleted f1]] != "Deleted"} {
+if {[string trim [isdeleted sec_hist f1]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
-if {[string trim [bisdeleted f2]] != "Deleted"} {
+if {[string trim [isdeleted sec_hist f2]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that none of the f1 and f2 have been Modified 
-if {[string trim [bmodified rm f1]] != "The shape has not been modified"} {
+if {[string trim [modified rm sec_hist f1]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
-if {[string trim [bmodified rm f2]] != "The shape has not been modified"} {
+if {[string trim [modified rm sec_hist f2]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
 # check that both f1 and f2 have Generated vertices
-bgenerated rg f1
+generated rg sec_hist f1
 checknbshapes rg -edge 2 -m "Information about shapes Generated from f1"
 
-bgenerated rg f2
+generated rg sec_hist f2
 checknbshapes rg -edge 2 -m "Information about shapes Generated from f2"
index 418c7b2..94c1f85 100644 (file)
@@ -15,21 +15,23 @@ bfillds
 puts "Common operation"
 bbop rcom 0
 
+# get history of the operation
+savehistory com_hist
 
 # check that both f1 and f2 have not been deleted
-if {[string trim [bisdeleted f1]] != "Not deleted"} {
+if {[string trim [isdeleted com_hist f1]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
-if {[string trim [bisdeleted f2]] != "Not deleted"} {
+if {[string trim [isdeleted com_hist f2]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that both f1 and f2 have been Modified into the same face
-bmodified rm1 f1
+modified rm1 com_hist f1
 checknbshapes rm1 -face 1 -m "Information about modification of f1"
 
-bmodified rm2 f2
+modified rm2 com_hist f2
 checknbshapes rm2 -face 1 -m "Information about modification of f2"
 
 compound rm1 rm2 cm
@@ -37,11 +39,11 @@ checknbshapes cm -face 1 -m "Information about modification of f1 and f2"
 
 
 # check that none of the f1 and f2 have Generated shapes
-if {[string trim [bgenerated rg f1]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg com_hist f1]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
-if {[string trim [bgenerated rg f2]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg com_hist f2]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
@@ -49,28 +51,31 @@ if {[string trim [bgenerated rg f2]] != "No shapes were generated from the shape
 puts "Fuse operation"
 bbop rfuse 1
 
+# get history of the operation
+savehistory fuse_hist
+
 # check that both f1 and f2 have not been deleted
-if {[string trim [bisdeleted f1]] != "Not deleted"} {
+if {[string trim [isdeleted fuse_hist f1]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
-if {[string trim [bisdeleted f2]] != "Not deleted"} {
+if {[string trim [isdeleted fuse_hist f2]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that both f1 and f2 have been Modified
-bmodified rm f1
+modified rm fuse_hist f1
 checknbshapes rm -face 2 -m "Information about modification of f1"
 
-bmodified rm f2
+modified rm fuse_hist f2
 checknbshapes rm -face 2 -m "Information about modification of f2"
 
 # check that none of the f1 and f2 have Generated shapes
-if {[string trim [bgenerated rg f1]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg fuse_hist f1]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
-if {[string trim [bgenerated rg f2]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg fuse_hist f2]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
@@ -78,31 +83,34 @@ if {[string trim [bgenerated rg f2]] != "No shapes were generated from the shape
 puts "CUT operation"
 bbop rcut 2
 
+# get history of the operation
+savehistory cut_hist
+
 # check that f1 has not been deleted
-if {[string trim [bisdeleted f1]] != "Not deleted"} {
+if {[string trim [isdeleted cut_hist f1]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that f2 has been deleted
-if {[string trim [bisdeleted f2]] != "Deleted"} {
+if {[string trim [isdeleted cut_hist f2]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that f1 has been modified
-bmodified rm f1
+modified rm cut_hist f1
 checknbshapes rm -face 1 -m "Information about modification of f1"
 
 # check that f2 has not been modified
-if {[string trim [bmodified rm f2]] != "The shape has not been modified"} {
+if {[string trim [modified rm cut_hist f2]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
 # check that none of the f1 and f2 have Generated shapes
-if {[string trim [bgenerated rg f1]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg cut_hist f1]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
-if {[string trim [bgenerated rg f2]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg cut_hist f2]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
@@ -110,31 +118,34 @@ if {[string trim [bgenerated rg f2]] != "No shapes were generated from the shape
 puts "TUC operation"
 bbop rtuc 3
 
+# get history of the operation
+savehistory tuc_hist
+
 # check that f1 has been deleted
-if {[string trim [bisdeleted f1]] != "Deleted"} {
+if {[string trim [isdeleted tuc_hist f1]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that f2 has not been deleted
-if {[string trim [bisdeleted f2]] != "Not deleted"} {
+if {[string trim [isdeleted tuc_hist f2]] != "Not deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that f1 has not been modified
-if {[string trim [bmodified rm f1]] != "The shape has not been modified"} {
+if {[string trim [modified rm tuc_hist f1]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
 # check that f2 has been modified
-bmodified rm f2
+modified rm tuc_hist f2
 checknbshapes rm -face 1 -m "Information about modification of f1"
 
 # check that none of the f1 and f2 have Generated shapes
-if {[string trim [bgenerated rg f1]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg tuc_hist f1]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
-if {[string trim [bgenerated rg f2]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg tuc_hist f2]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
@@ -143,29 +154,32 @@ if {[string trim [bgenerated rg f2]] != "No shapes were generated from the shape
 puts "SECTION operation"
 bbop rsec 4
 
+# get history of the operation
+savehistory sec_hist
+
 # check that both f1 and f2 have been deleted
-if {[string trim [bisdeleted f1]] != "Deleted"} {
+if {[string trim [isdeleted sec_hist f1]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
-if {[string trim [bisdeleted f2]] != "Deleted"} {
+if {[string trim [isdeleted sec_hist f2]] != "Deleted."} {
   puts "Error: Incorrect information about Deleted shapes"
 }
 
 # check that none of the f1 and f2 have been Modified 
-if {[string trim [bmodified rm f1]] != "The shape has not been modified"} {
+if {[string trim [modified rm sec_hist f1]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
-if {[string trim [bmodified rm f2]] != "The shape has not been modified"} {
+if {[string trim [modified rm sec_hist f2]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modified shapes"
 }
 
 # check that none of the f1 and f2 have Generated shapes
-if {[string trim [bgenerated rg f1]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg sec_hist f1]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
 
-if {[string trim [bgenerated rg f2]] != "No shapes were generated from the shape"} {
+if {[string trim [generated rg sec_hist f2]] != "No shapes were generated from the shape."} {
   puts "Error: Incorrect information about Generated shapes"
 }
index da71089..81d9504 100644 (file)
@@ -16,22 +16,25 @@ baddtools es
 bfillds
 bbuild r
 
-bmodified fs_m fs
+# get history of the operation
+savehistory gf_hist
+
+modified fs_m gf_hist fs
 checknbshapes fs_m -face 1 -m "Information about Modification of fs"
 
-bmodified es_m es
+modified es_m gf_hist es
 checknbshapes es_m -edge 2 -m "Information about Modification of es"
 
-bgenerated fs_g fs
+generated fs_g gf_hist fs
 checknbshapes fs_g -vertex 1 -m "Information about shapes Generated from fs"
 
-bgenerated es_g es
+generated es_g gf_hist es
 checknbshapes es_g -vertex 1 -m "Information about shapes Generated from es"
 
 
 # In General Fuse operation there should be no Deleted elements
 foreach s [join [list es fs [explode es v] [explode fs e] [explode fs v]]] {
-  if {[string trim [bisdeleted $s]] != "Not deleted"} {
+  if {[string trim [isdeleted gf_hist $s]] != "Not deleted."} {
     puts "Error: Incorrect information about Deleted shapes"
   }
 }
index 5a3f637..d92fc0e 100644 (file)
@@ -32,31 +32,37 @@ bcremoveall
 # add to result all parts of f1 with material 1
 bcadd result f1 1 -m 1
 
+# get history of the operation
+savehistory cells_hist
+
 # check modification of f1
-bmodified rm1 f1
+modified rm1 cells_hist f1
 checknbshapes rm1 -face 4 -m "Information about modification of f1"
 
 # check modification of f2
-bmodified rm2 f2
+modified rm2 cells_hist f2
 checknbshapes rm2 -face 2 -m "Information about modification of f2"
 
 # check modification of f3
-bmodified rm3 f3
+modified rm3 cells_hist f3
 checknbshapes rm3 -face 2 -m "Information about modification of f3"
 
 # make one face from result
 bcremoveint result
 
+# update cells history
+savehistory cells_hist
+
 # check modification of f1
-bmodified rm1u f1
+modified rm1u cells_hist f1
 checknbshapes rm1u -face 1 -m "Information about modification of f1"
 
 # check modification of f2
-bmodified rm2u f2
+modified rm2u cells_hist f2
 checknbshapes rm2u -face 1 -m "Information about modification of f2"
 
 # check modification of f3
-bmodified rm3u f3
+modified rm3u cells_hist f3
 checknbshapes rm3u -face 1 -m "Information about modification of f3"
 
 compound rm1u rm2u rm3u cfu
@@ -70,62 +76,68 @@ bcremoveall
 bcadd result f1 1 f3 0 -m 1
 bcadd result f2 1 f3 0 -m 1
 
+# update cells history
+savehistory cells_hist
+
 # check modification of f1
-bmodified rm1 f1
+modified rm1 cells_hist f1
 checknbshapes rm1 -face 2 -m "Information about modification of f1"
 
 # check modification of f2
-bmodified rm2 f2
+modified rm2 cells_hist f2
 checknbshapes rm2 -face 2 -m "Information about modification of f2"
 
 # check modification of f3
-if {[string trim [bmodified rm3 f3]] != "The shape has not been modified"} {
+if {[string trim [modified rm3 cells_hist f3]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modification of f3"
 }
 
 # check deletion of f1
-if {[string trim [bisdeleted f1]] != "Not deleted"} {
+if {[string trim [isdeleted cells_hist f1]] != "Not deleted."} {
   puts "Error: Incorrect information about Deletion of f1"
 }
 
 # check deletion of f2
-if {[string trim [bisdeleted f2]] != "Not deleted"} {
+if {[string trim [isdeleted cells_hist f2]] != "Not deleted."} {
   puts "Error: Incorrect information about Deletion of f2"
 }
 
 # check deletion of f3
-if {[string trim [bisdeleted f3]] != "Deleted"} {
+if {[string trim [isdeleted cells_hist f3]] != "Deleted."} {
   puts "Error: Incorrect information about Deletion of f3"
 }
 
 # make one face from result
 bcremoveint result
 
+# update cells history
+savehistory cells_hist
+
 # check modification of f1
-bmodified rm1 f1
+modified rm1 cells_hist f1
 checknbshapes rm1 -face 1 -m "Information about modification of f1"
 
 # check modification of f2
-bmodified rm2 f2
+modified rm2 cells_hist f2
 checknbshapes rm2 -face 1 -m "Information about modification of f2"
 
 # check modification of f3
-if {[string trim [bmodified rm3 f3]] != "The shape has not been modified"} {
+if {[string trim [modified rm3 cells_hist f3]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modification of f3"
 }
 
 # check deletion of f1
-if {[string trim [bisdeleted f1]] != "Not deleted"} {
+if {[string trim [isdeleted cells_hist f1]] != "Not deleted."} {
   puts "Error: Incorrect information about Deletion of f1"
 }
 
 # check deletion of f2
-if {[string trim [bisdeleted f2]] != "Not deleted"} {
+if {[string trim [isdeleted cells_hist f2]] != "Not deleted."} {
   puts "Error: Incorrect information about Deletion of f2"
 }
 
 # check deletion of f3
-if {[string trim [bisdeleted f3]] != "Deleted"} {
+if {[string trim [isdeleted cells_hist f3]] != "Deleted."} {
   puts "Error: Incorrect information about Deletion of f3"
 }
 
@@ -137,31 +149,37 @@ bcadd result f1 1 -m 1
 bcadd result f2 1 f1 0 -m 2
 bcadd result f3 1 f1 0 -m 2
 
+# update cells history
+savehistory cells_hist
+
 # at this point all splits of faces are contained in the result
 # check modification of f1
-bmodified rm1 f1
+modified rm1 cells_hist f1
 checknbshapes rm1 -face 4 -m "Information about modification of f1"
 
 # check modification of f2
-bmodified rm2 f2
+modified rm2 cells_hist f2
 checknbshapes rm2 -face 4 -m "Information about modification of f2"
 
 # check modification of f3
-bmodified rm3 f3
+modified rm3 cells_hist f3
 checknbshapes rm3 -face 4 -m "Information about modification of f3"
 
 # unify faces with same material
 bcremoveint result
 
+# update cells history
+savehistory cells_hist
+
 # check modification of f1
-bmodified rm1u f1
+modified rm1u cells_hist f1
 checknbshapes rm1u -face 1 -m "Information about modification of f1"
 
 # check modification of f2
-bmodified rm2u f2
+modified rm2u cells_hist f2
 checknbshapes rm2u -face 2 -m "Information about modification of f2"
 
 # check modification of f3
-bmodified rm3u f3
+modified rm3u cells_hist f3
 checknbshapes rm3u -face 2 -m "Information about modification of f3"
 
index cbe9106..2d46c50 100644 (file)
@@ -19,11 +19,14 @@ bcremoveall
 # add all parts into result
 bcaddall result
 
+# get history
+savehistory cells_hist
+
 # find all section edges using Generated history information
 compound ge
 foreach s {b1 b2 b3} {
   foreach f [explode $s f] {
-    if {[string trim [bgenerated g $f]] == ""} {
+    if {[string trim [generated g cells_hist $f]] == ""} {
       add g ge
     }
   }
@@ -38,31 +41,37 @@ bcremoveall
 # add to result all parts of b1 with material 1
 bcadd result b1 1 -m 1
 
+# update history
+savehistory cells_hist
+
 # check modification of b1
-bmodified rm1 b1
+modified rm1 cells_hist b1
 checknbshapes rm1 -solid 4 -m "Information about modification of b1"
 
 # check modification of b2
-bmodified rm2 b2
+modified rm2 cells_hist b2
 checknbshapes rm2 -solid 2 -m "Information about modification of b2"
 
 # check modification of b3
-bmodified rm3 b3
+modified rm3 cells_hist b3
 checknbshapes rm3 -solid 2 -m "Information about modification of b3"
 
 # make one face from result
 bcremoveint result
 
+# update history
+savehistory cells_hist
+
 # check modification of b1
-bmodified rm1u b1
+modified rm1u cells_hist b1
 checknbshapes rm1u -solid 1 -m "Information about modification of b1"
 
 # check modification of b2
-bmodified rm2u b2
+modified rm2u cells_hist b2
 checknbshapes rm2u -solid 1 -m "Information about modification of b2"
 
 # check modification of b3
-bmodified rm3u b3
+modified rm3u cells_hist b3
 checknbshapes rm3u -solid 1 -m "Information about modification of b3"
 
 compound rm1u rm2u rm3u cfu
@@ -76,62 +85,68 @@ bcremoveall
 bcadd result b1 1 b3 0 -m 1
 bcadd result b2 1 b3 0 -m 1
 
+# update history
+savehistory cells_hist
+
 # check modification of b1
-bmodified rm1 b1
+modified rm1 cells_hist b1
 checknbshapes rm1 -solid 2 -m "Information about modification of b1"
 
 # check modification of b2
-bmodified rm2 b2
+modified rm2 cells_hist b2
 checknbshapes rm2 -solid 2 -m "Information about modification of b2"
 
 # check modification of b3
-if {[string trim [bmodified rm3 b3]] != "The shape has not been modified"} {
+if {[string trim [modified rm3 cells_hist b3]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modification of b3"
 }
 
 # check deletion of b1
-if {[string trim [bisdeleted b1]] != "Not deleted"} {
+if {[string trim [isdeleted cells_hist b1]] != "Not deleted."} {
   puts "Error: Incorrect information about Deletion of b1"
 }
 
 # check deletion of b2
-if {[string trim [bisdeleted b2]] != "Not deleted"} {
+if {[string trim [isdeleted cells_hist b2]] != "Not deleted."} {
   puts "Error: Incorrect information about Deletion of b2"
 }
 
 # check deletion of b3
-if {[string trim [bisdeleted b3]] != "Deleted"} {
+if {[string trim [isdeleted cells_hist b3]] != "Deleted."} {
   puts "Error: Incorrect information about Deletion of b3"
 }
 
 # make one face from result
 bcremoveint result
 
+# update history
+savehistory cells_hist
+
 # check modification of b1
-bmodified rm1 b1
+modified rm1 cells_hist b1
 checknbshapes rm1 -solid 1 -m "Information about modification of b1"
 
 # check modification of b2
-bmodified rm2 b2
+modified rm2 cells_hist b2
 checknbshapes rm2 -solid 1 -m "Information about modification of b2"
 
 # check modification of b3
-if {[string trim [bmodified rm3 b3]] != "The shape has not been modified"} {
+if {[string trim [modified rm3 cells_hist b3]] != "The shape has not been modified."} {
   puts "Error: Incorrect information about Modification of b3"
 }
 
 # check deletion of b1
-if {[string trim [bisdeleted b1]] != "Not deleted"} {
+if {[string trim [isdeleted cells_hist b1]] != "Not deleted."} {
   puts "Error: Incorrect information about Deletion of b1"
 }
 
 # check deletion of b2
-if {[string trim [bisdeleted b2]] != "Not deleted"} {
+if {[string trim [isdeleted cells_hist b2]] != "Not deleted."} {
   puts "Error: Incorrect information about Deletion of b2"
 }
 
 # check deletion of b3
-if {[string trim [bisdeleted b3]] != "Deleted"} {
+if {[string trim [isdeleted cells_hist b3]] != "Deleted."} {
   puts "Error: Incorrect information about Deletion of b3"
 }
 
@@ -143,31 +158,37 @@ bcadd result b1 1 -m 1
 bcadd result b2 1 b1 0 -m 2
 bcadd result b3 1 b1 0 -m 2
 
+# update history
+savehistory cells_hist
+
 # at this point all splits of faces are contained in the result
 # check modification of b1
-bmodified rm1 b1
+modified rm1 cells_hist b1
 checknbshapes rm1 -solid 4 -m "Information about modification of b1"
 
 # check modification of b2
-bmodified rm2 b2
+modified rm2 cells_hist b2
 checknbshapes rm2 -solid 4 -m "Information about modification of b2"
 
 # check modification of b3
-bmodified rm3 b3
+modified rm3 cells_hist b3
 checknbshapes rm3 -solid 4 -m "Information about modification of b3"
 
 # unify faces with same material
 bcremoveint result
 
+# update history
+savehistory cells_hist
+
 # check modification of b1
-bmodified rm1u b1
+modified rm1u cells_hist b1
 checknbshapes rm1u -solid 1 -m "Information about modification of b1"
 
 # check modification of b2
-bmodified rm2u b2
+modified rm2u cells_hist b2
 checknbshapes rm2u -solid 2 -m "Information about modification of b2"
 
 # check modification of b3
-bmodified rm3u b3
+modified rm3u cells_hist b3
 checknbshapes rm3u -solid 2 -m "Information about modification of b3"
 
diff --git a/tests/boolean/history/A7 b/tests/boolean/history/A7
new file mode 100644 (file)
index 0000000..6df93dc
--- /dev/null
@@ -0,0 +1,35 @@
+puts "Check History of Boolean operations"
+
+puts "Case with two interfering boxes"
+
+box b1 10 10 10
+box b2 5 5 5 10 10 10
+
+bfuse r b1 b2
+
+savehistory fuse_hist
+
+compound edges
+
+foreach f [explode b1 f] {
+  if {![regexp "No shapes were generated from the shape" [generated g fuse_hist $f]]} {
+    foreach e [explode g e] { add $e edges }
+  }
+}
+
+set list {}
+
+foreach e [explode edges e] {
+  lappend list 2;
+  lappend list $e;
+}
+
+
+blend result r {*}$list
+
+
+checkshape result
+checkprops result -s 1027.65 -v 1905.35
+checknbshapes result -vertex 26 -edge 42 -wire 18 -face 18 -shell 1 -solid 1
+
+checkview -display result -2d -path ${imagedir}/${test_image}.png
diff --git a/tests/boolean/history/A8 b/tests/boolean/history/A8
new file mode 100644 (file)
index 0000000..f8d6b36
--- /dev/null
@@ -0,0 +1,51 @@
+box b1 10 10 10
+box b2 5 0 0 10 10 10
+
+# fuse boxes
+bfuse r b1 b2
+
+# save Fuse history
+savehistory fuse_hist
+
+# simplify result
+unifysamedom ru r
+
+# save USD history
+savehistory usd_hist
+
+
+# check modifications of the faces of the boxes in two histories
+explode b1 f
+explode b2 f
+
+foreach i {3 4 5 6} {
+  if {[regexp "The shape has not been modified." [modified m1 fuse_hist b1_$i]]} {
+    puts "Error: Incorrect history of Fuse";
+    continue;
+  }
+  checknbshapes m1 -face 2
+
+  if {[regexp "The shape has not been modified." [modified m2 fuse_hist b2_$i]]} {
+    puts "Error: Incorrect history of Fuse";
+    continue;
+  }
+  checknbshapes m2 -face 2
+
+  # each face of the m1 and m2 should have been modified into the same face during USD
+
+  compound usd_face
+
+  foreach f [join [list [explode m1 f] [explode m2 f] ] ] {
+    if {[regexp "The shape has not been modified." [modified u usd_hist $f]]} {
+      puts "Error: Incorrect history of USD";
+      continue;
+    }
+    checknbshapes u -vertex 4 -edge 4 -wire 1 -face 1
+    checkprops u -s 150
+    add u usd_face
+  }
+
+  checknbshapes usd_face -face 1
+  checkprops u -s 150 -skip
+  
+}
index a9ef3b2..d828b68 100644 (file)
@@ -13,14 +13,17 @@ checkprops res -s 2323.49 -v 1037.57 -deps 1.e-7
 checknbshapes res -vertex 64 -edge 96 -wire 34 -face 34 -shell 1 -solid 1
 CheckIsFeatureRemoved spike {v e f}
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the top face
-rfmodified m5 s_5
+modified m5 rf_hist s_5
 checkprops m5 -s 1089.87
 checknbshapes m5 -vertex 31 -edge 31 -wire 1 -face 1
 
 # check modification of the side faces where the spike was located
-rfmodified m10 s_10
-rfmodified m14 s_14
+modified m10 rf_hist s_10
+modified m14 rf_hist s_14
 
 if {![regexp "same shapes" [compare m10 m14]]} {
   puts "Error: incorrect spike removal"
index e41d7bd..e70e6e9 100644 (file)
@@ -15,19 +15,22 @@ checkprops result -s 2333.55 -v 1047.62 -deps 1.e-7
 checknbshapes result -vertex 8 -edge 12 -wire 6 -face 6 -shell 1 -solid 1
 CheckIsFeatureRemoved features {v e f}
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the top face
-rfmodified m5 s_5
+modified m5 rf_hist s_5
 checkprops m5 -s 1102.76
 checknbshapes m5 -vertex 4 -edge 4 -wire 1 -face 1
 
 # check modification of the bottom face
-rfmodified m3 s_3
+modified m3 rf_hist s_3
 checkprops m3 -equal m5
 checknbshapes m5 -vertex 4 -edge 4 -wire 1 -face 1
 
 # check modification of the side faces
-rfmodified m10 s_10
-rfmodified m14 s_14
+modified m10 rf_hist s_10
+modified m14 rf_hist s_14
 
 if {![regexp "same shapes" [compare m10 m14]]} {
   puts "Error: incorrect feature removal"
@@ -37,12 +40,12 @@ checkprops m10 -s 37.43
 checknbshapes m10 -vertex 4 -edge 4 -wire 1 -face 1
 
 
-rfmodified m22 s_22
+modified m22 rf_hist s_22
 checkprops m22 -equal s_22
 
 
-rfmodified m9 s_9
-rfmodified m23 s_23
+modified m9 rf_hist s_9
+modified m23 rf_hist s_23
 
 if {![regexp "same shapes" [compare m9 m23]]} {
   puts "Error: incorrect feature removal"
@@ -52,8 +55,8 @@ checkprops m9 -s 26.5893
 checknbshapes m9 -vertex 4 -edge 4 -wire 1 -face 1
 
 
-rfmodified m15 s_15
-rfmodified m21 s_21
+modified m15 rf_hist s_15
+modified m21 rf_hist s_21
 
 if {![regexp "same shapes" [compare m15 m21]]} {
   puts "Error: incorrect feature removal"
index 073307b..cec8a06 100644 (file)
@@ -8,30 +8,33 @@ checkprops result -s 463.068 -v 194.214 -deps 1.e-7
 checknbshapes result -vertex 32 -edge 53 -wire 24 -face 21 -shell 1 -solid 1
 CheckIsFeatureRemoved s_13 {v e f}
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the side faces
-rfmodified m2 s_2
+modified m2 rf_hist s_2
 checkprops m2 -s 20
 checknbshapes m2 -vertex 4 -edge 4 -wire 1 -face 1
 
-rfmodified m12 s_12
+modified m12 rf_hist s_12
 checkprops m12 -s 8
 checknbshapes m12 -vertex 4 -edge 4 -wire 1 -face 1
 
-rfmodified m17 s_17
+modified m17 rf_hist s_17
 checkprops m17 -s 10
 checknbshapes m17 -vertex 4 -edge 4 -wire 1 -face 1
 
-rfgenerated g17 s_17
+generated g17 rf_hist s_17
 checkprops g17 -l 12
 
 explode s_17 e
-rfmodified m17_1 s_17_1
+modified m17_1 rf_hist s_17_1
 checkprops m17_1 -l 1
-rfmodified m17_3 s_17_3
+modified m17_3 rf_hist s_17_3
 checkprops m17_3 -l 1
 
 # check modification of the top face
-rfmodified m1 s_1
+modified m1 rf_hist s_1
 checkprops m1 -s 172.551
 
 checkview -display result -2d -path ${imagedir}/${test_image}.png
index 42604ea..9ce20f5 100644 (file)
@@ -8,21 +8,24 @@ checkprops result -s 462.33 -v 194.594 -deps 1.e-7
 checknbshapes result -vertex 34 -edge 54 -wire 24 -face 21 -shell 1 -solid 1 -t
 CheckIsFeatureRemoved s_14 {e f}
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the top face
-rfmodified m1 s_1
+modified m1 rf_hist s_1
 checkprops m1 -s 171.478
 checknbshapes m1 -vertex 14 -edge 14 -wire 3 -face 1
 
-rfgenerated g1 s_1
+generated g1 rf_hist s_1
 checknbshapes g1 -vertex 1 -edge 1
 checkprops g1 -l 6.28319
 
 # check modification of the cylindrical face
-rfmodified m20 s_20
+modified m20 rf_hist s_20
 checkprops m20 -s 6.28319
 checknbshapes m20 -vertex 2 -edge 3 -wire 1 -face 1
 
-rfgenerated g20 s_20
+generated g20 rf_hist s_20
 checknbshapes g20 -vertex 1 -edge 1
 checkprops g20 -equal g1
 
index acb40c4..77e6659 100644 (file)
@@ -8,21 +8,24 @@ checkprops result -s 462.273 -v 193.127 -deps 1.e-7
 checknbshapes result -vertex 34 -edge 54 -wire 24 -face 21 -shell 1 -solid 1 -t
 CheckIsFeatureRemoved s_15 {e f}
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the top face
-rfmodified m1 s_1
+modified m1 rf_hist s_1
 checkprops m1 -s 172.452
 checknbshapes m1 -vertex 14 -edge 14 -wire 3 -face 1
 
-rfgenerated g1 s_1
+generated g1 rf_hist s_1
 checknbshapes g1 -vertex 1 -edge 1
 checkprops g1 -l 6.28319
 
 # check modification of the cylindrical face
-rfmodified m21 s_21
+modified m21 rf_hist s_21
 checkprops m21 -s 12.5664
 checknbshapes m21 -vertex 2 -edge 3 -wire 1 -face 1
 
-rfgenerated g21 s_21
+generated g21 rf_hist s_21
 checknbshapes g21 -vertex 1 -edge 1
 checkprops g21 -equal g1
 
index bf79f42..3e81d77 100644 (file)
@@ -7,14 +7,17 @@ checkprops result -s 462.815 -v 195.248 -deps 1.e-7
 checknbshapes result -vertex 31 -edge 50 -wire 23 -face 20 -shell 1 -solid 1
 CheckIsFeatureRemoved s_4 {v e f}
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the top face
-rfmodified m1 s_1
+modified m1 rf_hist s_1
 checkprops m1 -s 169.122
 checknbshapes m1 -vertex 12 -edge 12 -wire 3 -face 1
 
 # check modification of the side faces
-rfmodified m3 s_3
-rfmodified m5 s_5
+modified m3 rf_hist s_3
+modified m5 rf_hist s_5
 
 if {![regexp "same shapes" [compare m3 m5]]} {
   puts "Error: incorrect feature removal"
@@ -25,8 +28,8 @@ checknbshapes m3 -vertex 6 -edge 6 -wire 1 -face 1
 
 explode s_3 e
 explode s_5 e
-rfmodified m3_4 s_3_4
-rfmodified m5_2 s_5_2
+modified m3_4 rf_hist s_3_4
+modified m5_2 rf_hist s_5_2
 
 if {![regexp "same shapes" [compare m3_4 m5_2]]} {
   puts "Error: incorrect feature removal"
index 0d18a48..8ebc714 100644 (file)
@@ -9,13 +9,16 @@ checknbshapes result -vertex 30 -edge 50 -wire 23 -face 20 -shell 1 -solid 1
 CheckIsFeatureRemoved s_6 {v e f}
 CheckIsFeatureRemoved s_18 {v e f}
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the top face
-rfmodified m1 s_1
+modified m1 rf_hist s_1
 checkprops m1 -s 172.551
 checknbshapes m1 -vertex 14 -edge 14 -wire 3 -face 1
 
 # check modification of the side face
-rfmodified m19 s_19
+modified m19 rf_hist s_19
 checkprops m19 -s 10
 checknbshapes m19 -vertex 4 -edge 4 -wire 1 -face 1
 
index d4ffb57..005d20b 100644 (file)
@@ -10,9 +10,12 @@ checknbshapes result -vertex 28 -edge 43 -wire 22 -face 18 -shell 1 -solid 1 -t
 CheckIsFeatureRemoved s_7 {e f}
 CheckIsFeatureRemoved s_10 {e f}
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the side faces
-rfmodified m12 s_12
-rfmodified m19 s_19
+modified m12 rf_hist s_12
+modified m19 rf_hist s_19
 
 if {![regexp "same shapes" [compare m12 m19]]} {
   puts "Error: incorrect feature removal"
index 053b6fa..c4c90d8 100644 (file)
@@ -10,21 +10,24 @@ checknbshapes result -vertex 32 -edge 51 -wire 21 -face 20 -shell 1 -solid 1
 CheckIsFeatureRemoved s_14 {v e f}
 CheckIsFeatureRemoved s_20 {v e f}
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the top and bottom faces
-rfmodified m1 s_1
+modified m1 rf_hist s_1
 checkprops m1 -s 174.62
 checknbshapes m1 -vertex 13 -edge 13 -wire 2 -face 1
 
-rfmodified m16 s_16
+modified m16 rf_hist s_16
 checkprops m16 -s 194.429
 checknbshapes m16 -vertex 10 -edge 10 -wire 1 -face 1
 
 # check that no new intersections have been created
-if {![regexp "No shapes were generated" [rfgenerated g1 s_1]]} {
+if {![regexp "No shapes were generated" [generated g1 rf_hist s_1]]} {
   puts "Error: incorrect feature removal"
 }
 
-if {![regexp "No shapes were generated" [rfgenerated g16 s_16]]} {
+if {![regexp "No shapes were generated" [generated g16 rf_hist s_16]]} {
   puts "Error: incorrect feature removal"
 }
 
index 80ff23d..1f64c8b 100644 (file)
@@ -11,13 +11,16 @@ CheckIsFeatureRemoved s_15 {v e f}
 CheckIsFeatureRemoved s_21 {v e f}
 CheckIsFeatureRemoved s_22 {v e f}
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the top face
-rfmodified m1 s_1
+modified m1 rf_hist s_1
 checkprops m1 -s 175.593
 checknbshapes m1 -vertex 13 -edge 13 -wire 2 -face 1
 
 # check that no new intersections have been created
-if {![regexp "No shapes were generated" [rfgenerated g1 s_1]]} {
+if {![regexp "No shapes were generated" [generated g1 rf_hist s_1]]} {
   puts "Error: incorrect feature removal"
 }
 
index 00e49ea..ef5f568 100644 (file)
@@ -10,10 +10,13 @@ removefeatures res s step
 
 compound s_4 s_15 s_21 s_22 s_7 s_11 s_8 s_9 s_10 s_14 s_20 s_13 features
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the features
 compound mf
 foreach f [explode features f] {
-  if { [regexp "The shape has not been modified" [rfmodified m $f]]} {
+  if { [regexp "The shape has not been modified" [modified m rf_hist $f]]} {
     add $f mf
   } else {
     add m mf
index a9e8229..3393a7d 100644 (file)
@@ -9,13 +9,16 @@ checkprops result -s 1200 -v 2000
 checknbshapes result -vertex 12 -edge 20 -wire 11 -face 11 -shell 2 -solid 2
 CheckIsFeatureRemoved gap {v e f}
 
+# get history of the operation
+savehistory rf_hist
+
 # check that the common face is still shared
 if {![regexp "OK" [bopcheck result]]} {
   puts "Error: sharing is lost after removal"
 }
 
 # check modification of the common face
-rfmodified m6 s_6
+modified m6 rf_hist s_6
 checkprops m6 -s 100
 checknbshapes m6 -vertex 4 -edge 4 -wire 1 -face 1
 
index 6555c0b..4cdac33 100644 (file)
@@ -20,9 +20,12 @@ if {![regexp "OK" [bopcheck result]]} {
   puts "Error: sharing is lost after feature removal"
 }
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the solids
 foreach solid [explode s so] {
-  rfmodified msol $solid
+  modified msol rf_hist $solid
   checkprops msol -s 600 -v 1000
   checknbshapes msol -vertex 8 -edge 12 -wire 6 -face 6 -shell 1 -solid 1 -t
 
index 0f185db..fe32e78 100644 (file)
@@ -16,13 +16,16 @@ if {![regexp "OK" [bopcheck res1]]} {
   puts "Error: sharing is lost after removal"
 }
 
+# get history of the operation
+savehistory rf_hist
+
 # check modification of the common face
-rfmodified m6 s_6
+modified m6 rf_hist s_6
 checkprops m6 -s 100
 
 # check modification of the solid 1
 explode s
-rfmodified m1 s_1
+modified m1 rf_hist s_1
 checkprops m1 -s 600 -v 1000
 
 
@@ -32,16 +35,19 @@ checkprops res2 -s 1200 -v 1875
 checknbshapes res2 -vertex 21 -edge 35 -wire 17 -face 17 -shell 2 -solid 2
 CheckIsFeatureRemoved gap2 {e f}
 
+# get history of the operation
+savehistory rf_hist2
+
 # check that the common face is still shared
 if {![regexp "OK" [bopcheck res2]]} {
   puts "Error: sharing is lost after removal"
 }
 
 # check modification of the common face
-rfmodified m6 s_6
+modified m6 rf_hist2 s_6
 checkprops m6 -s 100
 
 # check modification of the solid 1
 explode s
-rfmodified m2 s_2
+modified m2 rf_hist2 s_2
 checkprops m2 -s 600 -v 1000
index e9eacf7..e12dd82 100644 (file)
@@ -12,11 +12,13 @@ checkprops res1 -s 19165.2 -v 142408 -deps 1.e-7
 checknbshapes res1 -vertex 31 -edge 53 -wire 25 -face 24 -shell 1 -solid 1 -t
 CheckIsFeatureRemoved feature1 {v e f}
 
+# get history of the operation
+savehistory rf_hist
 
 # prepare for removal of the second feature
 compound mfeature2
 foreach f [explode feature2 f] {
-  if {[regexp "has not been modified" [rfmodified fm $f]]} {
+  if {[regexp "has not been modified" [modified fm rf_hist $f]]} {
     add $f mfeature2
   } else {
     add fm mfeature2
@@ -30,10 +32,13 @@ checkprops res2 -s 19396.1 -v 141748 -deps 1.e-7
 checknbshapes res2 -vertex 24 -edge 39 -wire 18 -face 17 -shell 1 -solid 1 -t
 CheckIsFeatureRemoved mfeature2 {v e f}
 
+# get history of the operation
+savehistory rf_hist2
+
 # prepare for removal of the third feature
 compound mfeature3
 foreach f [explode feature3 f] {
-  if {[regexp "has not been modified" [rfmodified fm $f]]} {
+  if {[regexp "has not been modified" [modified fm rf_hist2 $f]]} {
     add $f mfeature3
   } else {
     add fm mfeature3
index 4c8b3da..e2aa798 100644 (file)
@@ -12,9 +12,10 @@ baddtools c
 bfillds
 bbop model 2
 
+savehistory bop_hist
 # find face to remove - top face of the model
 explode s f
-bmodified feature s_3
+modified feature bop_hist s_3
 
 # remove features
 removefeatures result model feature
index aaf3edf..ccbee77 100644 (file)
@@ -1,10 +1,11 @@
 proc CheckIsFeatureRemoved {theFeature types} {
+  savehistory rf_hist
   upvar $theFeature TheFeature
   compound TheFeature TheFeatureC
   foreach t $types {
     foreach s [explode TheFeatureC $t] {
-      set log [rfisdeleted $s]
-      if {$log != "Deleted\n"} {
+      set log [isdeleted rf_hist $s]
+      if {$log != "Deleted."} {
         puts "Error: Feature is not removed"
       }
     }
index 874b9ec..04cbdc1 100755 (executable)
@@ -10,24 +10,26 @@ restore [locate_data_file bug26489_r002.brep] b1
 
 unifysamedom result b1
 
+savehistory usd_hist
+
 explode b1 f
 
 vinit
 vsetdispmode 1
 
-unifysamedommod x1 b1_1
+modified x1 usd_hist b1_1
 vclear
 vdisplay x1
 vfit
 vdump ${imagedir}/${casename}_1.png
 
-unifysamedommod x2 b1_2
+modified x2 usd_hist b1_2
 vclear
 vdisplay x2
 vfit
 vdump ${imagedir}/${casename}_2.png
 
-unifysamedommod x3 b1_3
+modified x3 usd_hist b1_3
 vclear
 vdisplay x3
 vfit
index fb990a9..fde97b6 100755 (executable)
@@ -1,3 +1,7 @@
+puts "TODO OCC29653 All:exception"
+puts "TODO OCC29653 All:\\*\\* Exception \\*\\*"
+puts "TODO OCC29653 All:TEST INCOMPLETE"
+
 puts "============"
 puts "OCC22646"
 puts "============"
index 499ecd9..edb895c 100644 (file)
@@ -18,14 +18,16 @@ explode w3
 
 thrusections r 1 1 w1 w2 w3
 
-genthrus r1 w1_1
-genthrus r2 w1_2
-genthrus r3 w1_3
-genthrus r4 w1_4
-genthrus r5 w2_1
-genthrus r6 w2_2
-genthrus r7 w2_3
-genthrus r8 w3_1
+savehistory hist
+
+generated r1 hist w1_1
+generated r2 hist w1_2
+generated r3 hist w1_3
+generated r4 hist w1_4
+generated r5 hist w2_1
+generated r6 hist w2_2
+generated r7 hist w2_3
+generated r8 hist w3_1
 
 checknbshapes r1 -face 4
 checkprops r1 -s 668.19
@@ -48,14 +50,14 @@ explode w1 v
 explode w2 v
 explode w3 v
 
-genthrus r9 w1_1
-genthrus r10 w1_2
-genthrus r11 w1_3
-genthrus r12 w1_4
-genthrus r13 w2_1
-genthrus r14 w2_2
-genthrus r15 w2_3
-genthrus r16 w3_1
+generated r9 hist w1_1
+generated r10 hist w1_2
+generated r11 hist w1_3
+generated r12 hist w1_4
+generated r13 hist w2_1
+generated r14 hist w2_2
+generated r15 hist w2_3
+generated r16 hist w3_1
 
 checknbshapes r9 -edge 2
 checkprops r9 -l 42.6998
index 1c71ce6..3fbc7af 100644 (file)
@@ -24,16 +24,18 @@ explode pr4
 
 thrusections r 1 0 pr1 pr2 pr3 pr4 pr1
 
-genthrus r1 pr1_1
-genthrus r2 pr1_2
-genthrus r3 pr1_3
-genthrus r4 pr1_4
-genthrus r5 pr2_1
-genthrus r6 pr2_2
-genthrus r7 pr2_3
-genthrus r8 pr3_1
-genthrus r9 pr4_1
-genthrus r10 pr4_2
+savehistory hist
+
+generated r1 hist pr1_1
+generated r2 hist pr1_2
+generated r3 hist pr1_3
+generated r4 hist pr1_4
+generated r5 hist pr2_1
+generated r6 hist pr2_2
+generated r7 hist pr2_3
+generated r8 hist pr3_1
+generated r9 hist pr4_1
+generated r10 hist pr4_2
 
 checknbshapes r1 -face 2
 checkprops r1 -s 2254.99
@@ -61,16 +63,16 @@ explode pr2 v
 explode pr3 v
 explode pr4 v
 
-genthrus r11 pr1_1
-genthrus r12 pr1_2
-genthrus r13 pr1_3
-genthrus r14 pr1_4
-genthrus r15 pr2_1
-genthrus r16 pr2_2
-genthrus r17 pr2_3
-genthrus r18 pr3_1
-genthrus r19 pr4_1
-genthrus r20 pr4_2
+generated r11 hist pr1_1
+generated r12 hist pr1_2
+generated r13 hist pr1_3
+generated r14 hist pr1_4
+generated r15 hist pr2_1
+generated r16 hist pr2_2
+generated r17 hist pr2_3
+generated r18 hist pr3_1
+generated r19 hist pr4_1
+generated r20 hist pr4_2
 
 checkprops r11 -l 305.61
 checkprops r12 -l 305.61
index 6a2d47c..56a3e4d 100644 (file)
@@ -23,12 +23,14 @@ explode pr4
 
 thrusections r 1 1 vv pr2 pr3 pr4 vv
 
-genthrus r1 pr2_1
-genthrus r2 pr2_2
-genthrus r3 pr2_3
-genthrus r4 pr3_1
-genthrus r5 pr4_1
-genthrus r6 pr4_2
+savehistory hist
+
+generated r1 hist pr2_1
+generated r2 hist pr2_2
+generated r3 hist pr2_3
+generated r4 hist pr3_1
+generated r5 hist pr4_1
+generated r6 hist pr4_2
 
 checknbshapes r1 -face 8
 checkprops r1 -s 1659.7
@@ -47,13 +49,13 @@ explode pr2 v
 explode pr3 v
 explode pr4 v
 
-genthrus r7 vv
-genthrus r8 pr2_1
-genthrus r9 pr2_2
-genthrus r10 pr2_3
-genthrus r11 pr3_1
-genthrus r12 pr4_1
-genthrus r13 pr4_2
+generated r7 hist vv
+generated r8 hist pr2_1
+generated r9 hist pr2_2
+generated r10 hist pr2_3
+generated r11 hist pr3_1
+generated r12 hist pr4_1
+generated r13 hist pr4_2
 
 checknbshapes r7 -edge 20
 checkprops r7 -l 1386.75
index ff255b9..0631b13 100644 (file)
@@ -23,12 +23,14 @@ explode pr4
 
 thrusections r 1 0 vv pr2 pr3 pr4 vv
 
-genthrus r1 pr2_1
-genthrus r2 pr2_2
-genthrus r3 pr2_3
-genthrus r4 pr3_1
-genthrus r5 pr4_1
-genthrus r6 pr4_2
+savehistory hist
+
+generated r1 hist pr2_1
+generated r2 hist pr2_2
+generated r3 hist pr2_3
+generated r4 hist pr3_1
+generated r5 hist pr4_1
+generated r6 hist pr4_2
 
 checknbshapes r1 -face 2
 checkprops r1 -s 2756.24
@@ -47,13 +49,13 @@ explode pr2 v
 explode pr3 v
 explode pr4 v
 
-genthrus r7 vv
-genthrus r8 pr2_1
-genthrus r9 pr2_2
-genthrus r10 pr2_3
-genthrus r11 pr3_1
-genthrus r12 pr4_1
-genthrus r13 pr4_2
+generated r7 hist vv
+generated r8 hist pr2_1
+generated r9 hist pr2_2
+generated r10 hist pr2_3
+generated r11 hist pr3_1
+generated r12 hist pr4_1
+generated r13 hist pr4_2
 
 checknbshapes r7 -edge 5
 checkprops r7 -l 1618.63
index c560df2..34e1bef 100644 (file)
@@ -19,12 +19,14 @@ explode w3
 
 thrusections r 0 1 w1 w2 w3
 
-genthrus r1 w1_1
-genthrus r2 w1_2
-genthrus r3 w1_3
-genthrus r4 w2_1
-genthrus r5 w2_2
-genthrus r6 w3_1
+savehistory hist
+
+generated r1 hist w1_1
+generated r2 hist w1_2
+generated r3 hist w1_3
+generated r4 hist w2_1
+generated r5 hist w2_2
+generated r6 hist w3_1
 
 checknbshapes r1 -face 2
 checkprops r1 -s 577.142
@@ -43,15 +45,15 @@ explode w1 v
 explode w2 v
 explode w3 v
 
-genthrus r7 w1_1
-genthrus r8 w1_2
-genthrus r9 w1_3
-genthrus r10 w1_4
-genthrus r11 w2_1
-genthrus r12 w2_2
-genthrus r13 w2_3
-genthrus r14 w3_1
-genthrus r15 w3_2
+generated r7 hist w1_1
+generated r8 hist w1_2
+generated r9 hist w1_3
+generated r10 hist w1_4
+generated r11 hist w2_1
+generated r12 hist w2_2
+generated r13 hist w2_3
+generated r14 hist w3_1
+generated r15 hist w3_2
 
 checknbshapes r7 -edge 2
 checkprops r7 -l 41.4134
index 8ad9ca7..099e783 100644 (file)
@@ -19,12 +19,14 @@ explode w3
 
 thrusections r 0 0 w1 w2 w3
 
-genthrus r1 w1_1
-genthrus r2 w1_2
-genthrus r3 w1_3
-genthrus r4 w2_1
-genthrus r5 w2_2
-genthrus r6 w3_1
+savehistory hist
+
+generated r1 hist w1_1
+generated r2 hist w1_2
+generated r3 hist w1_3
+generated r4 hist w2_1
+generated r5 hist w2_2
+generated r6 hist w3_1
 
 checknbshapes r1 -face 1
 checkprops r1 -s 574.919
@@ -43,15 +45,15 @@ explode w1 v
 explode w2 v
 explode w3 v
 
-genthrus r7 w1_1
-genthrus r8 w1_2
-genthrus r9 w1_3
-genthrus r10 w1_4
-genthrus r11 w2_1
-genthrus r12 w2_2
-genthrus r13 w2_3
-genthrus r14 w3_1
-genthrus r15 w3_2
+generated r7 hist w1_1
+generated r8 hist w1_2
+generated r9 hist w1_3
+generated r10 hist w1_4
+generated r11 hist w2_1
+generated r12 hist w2_2
+generated r13 hist w2_3
+generated r14 hist w3_1
+generated r15 hist w3_2
 
 checkprops r7 -l 41.4735
 checkprops r8 -l 42.8862
index 977a25d..be1248b 100644 (file)
@@ -31,14 +31,16 @@ explode pr4
 
 thrusections r 1 1 pr1 pr2 pr3 pr4 pr1
 
-genthrus r1 pr1_1
-genthrus r2 pr1_2
-genthrus r3 pr1_3
-genthrus r4 pr2_1
-genthrus r5 pr2_2
-genthrus r6 pr3_1
-genthrus r7 pr4_1
-genthrus r8 pr4_2
+savehistory hist
+
+generated r1 hist pr1_1
+generated r2 hist pr1_2
+generated r3 hist pr1_3
+generated r4 hist pr2_1
+generated r5 hist pr2_2
+generated r6 hist pr3_1
+generated r7 hist pr4_1
+generated r8 hist pr4_2
 
 checknbshapes r1 -face 4
 checkprops r1 -s 902.335
@@ -62,18 +64,18 @@ explode pr2 v
 explode pr3 v
 explode pr4 v
 
-genthrus r9 pr1_1
-genthrus r10 pr1_2
-genthrus r11 pr1_3
-genthrus r12 pr1_4
-genthrus r13 pr2_1
-genthrus r14 pr2_2
-genthrus r15 pr2_3
-genthrus r16 pr3_1
-genthrus r17 pr3_2
-genthrus r18 pr4_1
-genthrus r19 pr4_2
-genthrus r20 pr4_3
+generated r9 hist pr1_1
+generated r10 hist pr1_2
+generated r11 hist pr1_3
+generated r12 hist pr1_4
+generated r13 hist pr2_1
+generated r14 hist pr2_2
+generated r15 hist pr2_3
+generated r16 hist pr3_1
+generated r17 hist pr3_2
+generated r18 hist pr4_1
+generated r19 hist pr4_2
+generated r20 hist pr4_3
 
 checkprops r9 -l 276.046
 checkprops r10 -l 298.732
index 53c8a66..201df29 100644 (file)
@@ -31,14 +31,16 @@ explode pr4
 
 thrusections r 1 0 pr1 pr2 pr3 pr4 pr1
 
-genthrus r1 pr1_1
-genthrus r2 pr1_2
-genthrus r3 pr1_3
-genthrus r4 pr2_1
-genthrus r5 pr2_2
-genthrus r6 pr3_1
-genthrus r7 pr4_1
-genthrus r8 pr4_2
+savehistory hist
+
+generated r1 hist pr1_1
+generated r2 hist pr1_2
+generated r3 hist pr1_3
+generated r4 hist pr2_1
+generated r5 hist pr2_2
+generated r6 hist pr3_1
+generated r7 hist pr4_1
+generated r8 hist pr4_2
 
 checknbshapes r1 -face 1
 checkprops r1 -s 1427.73
@@ -62,18 +64,18 @@ explode pr2 v
 explode pr3 v
 explode pr4 v
 
-genthrus r9 pr1_1
-genthrus r10 pr1_2
-genthrus r11 pr1_3
-genthrus r12 pr1_4
-genthrus r13 pr2_1
-genthrus r14 pr2_2
-genthrus r15 pr2_3
-genthrus r16 pr3_1
-genthrus r17 pr3_2
-genthrus r18 pr4_1
-genthrus r19 pr4_2
-genthrus r20 pr4_3
+generated r9 hist pr1_1
+generated r10 hist pr1_2
+generated r11 hist pr1_3
+generated r12 hist pr1_4
+generated r13 hist pr2_1
+generated r14 hist pr2_2
+generated r15 hist pr2_3
+generated r16 hist pr3_1
+generated r17 hist pr3_2
+generated r18 hist pr4_1
+generated r19 hist pr4_2
+generated r20 hist pr4_3
 
 checkprops r9 -l 322.713
 checkprops r10 -l 347.889
index f027813..3eb7bf5 100644 (file)
@@ -21,12 +21,14 @@ explode w3
 
 thrusections r 0 1 v1 w1 w2 w3 v2
 
-genthrus r1 w1_1
-genthrus r2 w1_2
-genthrus r3 w1_3
-genthrus r4 w2_1
-genthrus r5 w2_2
-genthrus r6 w3_1
+savehistory hist
+
+generated r1 hist w1_1
+generated r2 hist w1_2
+generated r3 hist w1_3
+generated r4 hist w2_1
+generated r5 hist w2_2
+generated r6 hist w3_1
 
 checknbshapes r1 -face 4
 checkprops r1 -s 1058.95
@@ -45,17 +47,17 @@ explode w1 v
 explode w2 v
 explode w3 v
 
-genthrus r7 w1_1
-genthrus r8 w1_2
-genthrus r9 w1_3
-genthrus r10 w1_4
-genthrus r11 w2_1
-genthrus r12 w2_2
-genthrus r13 w2_3
-genthrus r14 w3_1
-genthrus r15 w3_2
-genthrus r16 v1
-genthrus r17 v2
+generated r7 hist w1_1
+generated r8 hist w1_2
+generated r9 hist w1_3
+generated r10 hist w1_4
+generated r11 hist w2_1
+generated r12 hist w2_2
+generated r13 hist w2_3
+generated r14 hist w3_1
+generated r15 hist w3_2
+generated r16 hist v1
+generated r17 hist v2
 
 checknbshapes r7 -edge 4
 checkprops r7 -l 106.202
index 82f361d..b6e3775 100644 (file)
@@ -21,12 +21,14 @@ explode w3
 
 thrusections r 0 0 v1 w1 w2 w3 v2
 
-genthrus r1 w1_1
-genthrus r2 w1_2
-genthrus r3 w1_3
-genthrus r4 w2_1
-genthrus r5 w2_2
-genthrus r6 w3_1
+savehistory hist
+
+generated r1 hist w1_1
+generated r2 hist w1_2
+generated r3 hist w1_3
+generated r4 hist w2_1
+generated r5 hist w2_2
+generated r6 hist w3_1
 
 checknbshapes r1 -face 1
 checkprops r1 -s 1409.51
@@ -45,17 +47,17 @@ explode w1 v
 explode w2 v
 explode w3 v
 
-genthrus r7 w1_1
-genthrus r8 w1_2
-genthrus r9 w1_3
-genthrus r10 w1_4
-genthrus r11 w2_1
-genthrus r12 w2_2
-genthrus r13 w2_3
-genthrus r14 w3_1
-genthrus r15 w3_2
-genthrus r16 v1
-genthrus r17 v2
+generated r7 hist w1_1
+generated r8 hist w1_2
+generated r9 hist w1_3
+generated r10 hist w1_4
+generated r11 hist w2_1
+generated r12 hist w2_2
+generated r13 hist w2_3
+generated r14 hist w3_1
+generated r15 hist w3_2
+generated r16 hist v1
+generated r17 hist v2
 
 checkprops r7 -l 109.077
 checkprops r8 -l 122.394
index c2ea2a3..b38f88e 100644 (file)
@@ -25,9 +25,11 @@ explode w2
 
 thrusections r 1 1 w1 w2 w3
 
-genthrus r5 w2_1
-genthrus r6 w2_2
-genthrus r7 w2_3
+savehistory hist
+
+generated r5 hist w2_1
+generated r6 hist w2_2
+generated r7 hist w2_3
 
 checknbshapes r5 -face 6
 checkprops r5 -s 872.216
@@ -38,9 +40,9 @@ checkprops r7 -s 835.461
 
 explode w2 v
 
-genthrus r13 w2_1
-genthrus r14 w2_2
-genthrus r15 w2_3
+generated r13 hist w2_1
+generated r14 hist w2_2
+generated r15 hist w2_3
 
 checknbshapes r13 -edge 2
 checkprops r13 -l 40.0002
index ad8182a..14f0916 100644 (file)
@@ -18,14 +18,16 @@ explode w3
 
 thrusections r 1 0 w1 w2 w3
 
-genthrus r1 w1_1
-genthrus r2 w1_2
-genthrus r3 w1_3
-genthrus r4 w1_4
-genthrus r5 w2_1
-genthrus r6 w2_2
-genthrus r7 w2_3
-genthrus r8 w3_1
+savehistory hist
+
+generated r1 hist w1_1
+generated r2 hist w1_2
+generated r3 hist w1_3
+generated r4 hist w1_4
+generated r5 hist w2_1
+generated r6 hist w2_2
+generated r7 hist w2_3
+generated r8 hist w3_1
 
 checknbshapes r1 -face 2
 checkprops r1 -s 679.305
@@ -48,14 +50,14 @@ explode w1 v
 explode w2 v
 explode w3 v
 
-genthrus r9 w1_1
-genthrus r10 w1_2
-genthrus r11 w1_3
-genthrus r12 w1_4
-genthrus r13 w2_1
-genthrus r14 w2_2
-genthrus r15 w2_3
-genthrus r16 w3_1
+generated r9 hist w1_1
+generated r10 hist w1_2
+generated r11 hist w1_3
+generated r12 hist w1_4
+generated r13 hist w2_1
+generated r14 hist w2_2
+generated r15 hist w2_3
+generated r16 hist w3_1
 
 checknbshapes r9 -edge 1
 checkprops r9 -l 43.4094
index a232eeb..4b0889c 100644 (file)
@@ -25,9 +25,11 @@ explode w2
 
 thrusections r 1 0 w1 w2 w3
 
-genthrus r5 w2_1
-genthrus r6 w2_2
-genthrus r7 w2_3
+savehistory hist
+
+generated r5 hist w2_1
+generated r6 hist w2_2
+generated r7 hist w2_3
 
 checknbshapes r5 -face 3
 checkprops r5 -s 866.128
@@ -38,9 +40,9 @@ checkprops r7 -s 828.494
 
 explode w2 v
 
-genthrus r13 w2_1
-genthrus r14 w2_2
-genthrus r15 w2_3
+generated r13 hist w2_1
+generated r14 hist w2_2
+generated r15 hist w2_3
 
 checknbshapes r13 -edge 1
 checkprops r13 -l 40.0003
index 392d03c..b075032 100644 (file)
@@ -18,10 +18,12 @@ explode w1
 
 thrusections r 1 1 v1 w1 w2 w3 v2
 
-genthrus r1 w1_1
-genthrus r2 w1_2
-genthrus r3 w1_3
-genthrus r4 w1_4
+savehistory hist
+
+generated r1 hist w1_1
+generated r2 hist w1_2
+generated r3 hist w1_3
+generated r4 hist w1_4
 
 checknbshapes r1 -face 8
 checkprops r1 -s 1232.78
@@ -32,8 +34,8 @@ checkprops r3 -s 1155.34
 checknbshapes r4 -face 8
 checkprops r4 -s 1214.91
 
-genthrus r5 v1
-genthrus r6 v2
+generated r5 hist v1
+generated r6 hist v2
 
 checknbshapes r5 -edge 32
 checkprops r5 -l 841.334
index 6316a44..d44fce3 100644 (file)
@@ -18,10 +18,12 @@ explode w1
 
 thrusections r 1 0 v1 w1 w2 w3 v2
 
-genthrus r1 w1_1
-genthrus r2 w1_2
-genthrus r3 w1_3
-genthrus r4 w1_4
+savehistory hist
+
+generated r1 hist w1_1
+generated r2 hist w1_2
+generated r3 hist w1_3
+generated r4 hist w1_4
 
 checknbshapes r1 -face 2
 checkprops r1 -s 1970.62
@@ -32,8 +34,8 @@ checkprops r3 -s 1690.2
 checknbshapes r4 -face 2
 checkprops r4 -s 1859.72
 
-genthrus r5 v1
-genthrus r6 v2
+generated r5 hist v1
+generated r6 hist v2
 
 checknbshapes r5 -edge 8
 checkprops r5 -l 902.911
index e6d9422..0adea1b 100644 (file)
@@ -18,10 +18,12 @@ explode w1
 
 thrusections -N r 1 1 v1 w1 w2 w3 v2
 
-genthrus r1 w1_1
-genthrus r2 w1_2
-genthrus r3 w1_3
-genthrus r4 w1_4
+savehistory hist
+
+generated r1 hist w1_1
+generated r2 hist w1_2
+generated r3 hist w1_3
+generated r4 hist w1_4
 
 checknbshapes r1 -face 4
 checkprops r1 -s 1412.16
@@ -32,8 +34,8 @@ checkprops r3 -s 1412.16
 checknbshapes r4 -face 4
 checkprops r4 -s 1412.16
 
-genthrus r5 v1
-genthrus r6 v2
+generated r5 hist v1
+generated r6 hist v2
 
 checknbshapes r5 -edge 16
 checkprops r5 -l 447.259
index e8a8748..2cf5d7c 100644 (file)
@@ -18,18 +18,20 @@ explode w1
 
 thrusections -N r 1 0 v1 w1 w2 w3 v2
 
-genthrus r1 w1_1
-genthrus r2 w1_2
-genthrus r3 w1_3
-genthrus r4 w1_4
+savehistory hist
+
+generated r1 hist w1_1
+generated r2 hist w1_2
+generated r3 hist w1_3
+generated r4 hist w1_4
 
 checkprops r1 -s 1694.42
 checkprops r2 -s 1694.42
 checkprops r3 -s 1694.42
 checkprops r4 -s 1694.42
 
-genthrus r5 v1
-genthrus r6 v2
+generated r5 hist v1
+generated r6 hist v2
 
 checknbshapes r5 -edge 4
 checkprops r5 -l 466.764
index 38fc6d4..f419d8d 100644 (file)
@@ -24,16 +24,18 @@ explode pr4
 
 thrusections r 1 1 pr1 pr2 pr3 pr4 pr1
 
-genthrus r1 pr1_1
-genthrus r2 pr1_2
-genthrus r3 pr1_3
-genthrus r4 pr1_4
-genthrus r5 pr2_1
-genthrus r6 pr2_2
-genthrus r7 pr2_3
-genthrus r8 pr3_1
-genthrus r9 pr4_1
-genthrus r10 pr4_2
+savehistory hist
+
+generated r1 hist pr1_1
+generated r2 hist pr1_2
+generated r3 hist pr1_3
+generated r4 hist pr1_4
+generated r5 hist pr2_1
+generated r6 hist pr2_2
+generated r7 hist pr2_3
+generated r8 hist pr3_1
+generated r9 hist pr4_1
+generated r10 hist pr4_2
 
 checknbshapes r1 -face 8
 checkprops r1 -s 1909.23
@@ -61,16 +63,16 @@ explode pr2 v
 explode pr3 v
 explode pr4 v
 
-genthrus r11 pr1_1
-genthrus r12 pr1_2
-genthrus r13 pr1_3
-genthrus r14 pr1_4
-genthrus r15 pr2_1
-genthrus r16 pr2_2
-genthrus r17 pr2_3
-genthrus r18 pr3_1
-genthrus r19 pr4_1
-genthrus r20 pr4_2
+generated r11 hist pr1_1
+generated r12 hist pr1_2
+generated r13 hist pr1_3
+generated r14 hist pr1_4
+generated r15 hist pr2_1
+generated r16 hist pr2_2
+generated r17 hist pr2_3
+generated r18 hist pr3_1
+generated r19 hist pr4_1
+generated r20 hist pr4_2
 
 checknbshapes r11 -edge 4
 checkprops r11 -l 260.921
index 9c731be..d364a79 100644 (file)
@@ -17,86 +17,76 @@ baddtools v0 v1
 bfillds
 bbuild r
 
-set bug_info [bmodified v0m v0]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been modified"} {
-  puts "ERROR: OCC26393 is reproduced. Command bmodified does not work."
+savehistory gf_hist
+
+set bug_info [modified v0m gf_hist v0]
+if {$bug_info != "The shape has not been modified."} {
+  puts "ERROR: OCC26393 is reproduced. Command modified does not work."
 }
 
-set bug_info [bmodified v1m v1]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been modified"} {
-  puts "ERROR: OCC26393 is reproduced. Command bmodified does not work."
+set bug_info [modified v1m gf_hist v1]
+if {$bug_info != "The shape has not been modified."} {
+  puts "ERROR: OCC26393 is reproduced. Command modified does not work."
 }
 
-set bug_info [bisdeleted v0]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "Not deleted"} {
-  puts "ERROR: OCC26393 is reproduced. Command bisdeleted does not work."
+set bug_info [isdeleted gf_hist v0]
+if {$bug_info != "Not deleted."} {
+  puts "ERROR: OCC26393 is reproduced. Command isdeleted does not work."
 }
 
-set bug_info [bisdeleted v1]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "Not deleted"} {
-  puts "ERROR: OCC26393 is reproduced. Command bisdeleted does not work."
+set bug_info [isdeleted gf_hist v1]
+if {$bug_info != "Not deleted."} {
+  puts "ERROR: OCC26393 is reproduced. Command isdeleted does not work."
 }
 
 explode w e
 
-set bug_info [bmodified w1m w_1]
+set bug_info [modified w1m gf_hist w_1]
 if {$bug_info != ""} {
-  puts "ERROR: OCC26393 is reproduced. Command bmodified does not work correctly."
+  puts "ERROR: OCC26393 is reproduced. Command modified does not work correctly."
 }
 
-set bug_info [bisdeleted w_1]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "Not deleted"} {
-  puts "ERROR: OCC26393 is reproduced. Command bisdeleted does not work."
+set bug_info [isdeleted gf_hist w_1]
+if {$bug_info != "Not deleted."} {
+  puts "ERROR: OCC26393 is reproduced. Command isdeleted does not work."
 }
 
-set bug_info [bmodified w2m w_2]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been modified"} {
-  puts "ERROR: OCC26393 is reproduced. Command bmodified does not work."
+set bug_info [modified w2m gf_hist w_2]
+if {$bug_info != "The shape has not been modified."} {
+  puts "ERROR: OCC26393 is reproduced. Command modified does not work."
 }
 
-set bug_info [bisdeleted w_2]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "Not deleted"} {
-  puts "ERROR: OCC26393 is reproduced. Command bisdeleted does not work."
+set bug_info [isdeleted gf_hist w_2]
+if {$bug_info != "Not deleted."} {
+  puts "ERROR: OCC26393 is reproduced. Command isdeleted does not work."
 }
 
-set bug_info [bmodified w3m w_3]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been modified"} {
-  puts "ERROR: OCC26393 is reproduced. Command bmodified does not work."
+set bug_info [modified w3m gf_hist w_3]
+if {$bug_info != "The shape has not been modified."} {
+  puts "ERROR: OCC26393 is reproduced. Command modified does not work."
 }
 
-set bug_info [bisdeleted w_3]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "Not deleted"} {
-  puts "ERROR: OCC26393 is reproduced. Command bisdeleted does not work."
+set bug_info [isdeleted gf_hist w_3]
+if {$bug_info != "Not deleted."} {
+  puts "ERROR: OCC26393 is reproduced. Command isdeleted does not work."
 }
 
-set bug_info [bmodified w4m w_4]
+set bug_info [modified w4m gf_hist w_4]
 if {$bug_info != ""} {
-  puts "ERROR: OCC26393 is reproduced. Command bmodified does not work correctly."
+  puts "ERROR: OCC26393 is reproduced. Command modified does not work correctly."
 }
 
-set bug_info [bisdeleted w_4]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "Not deleted"} {
-  puts "ERROR: OCC26393 is reproduced. Command bisdeleted does not work."
+set bug_info [isdeleted gf_hist w_4]
+if {$bug_info != "Not deleted."} {
+  puts "ERROR: OCC26393 is reproduced. Command isdeleted does not work."
 }
 
-set bug_info [bmodified w5m w_5]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been modified"} {
-  puts "ERROR: OCC26393 is reproduced. Command bmodified does not work."
+set bug_info [modified w5m gf_hist w_5]
+if {$bug_info != "The shape has not been modified."} {
+  puts "ERROR: OCC26393 is reproduced. Command modified does not work."
 }
 
-set bug_info [bisdeleted w_5]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "Not deleted"} {
-  puts "ERROR: OCC26393 is reproduced. Command bisdeleted does not work."
+set bug_info [isdeleted gf_hist w_5]
+if {$bug_info != "Not deleted."} {
+  puts "ERROR: OCC26393 is reproduced. Command isdeleted does not work."
 }
index aed5d7d..a793dc0 100644 (file)
@@ -18,10 +18,12 @@ bbuild result0
 
 checkshape result0
 
+savehistory gf_hist
+
 # extract the parts of result corresponding to object
 shape result C
 foreach s [explode a_1 So] {
-  bmodified r_$s $s
+  modified r_$s gf_hist $s
   add r_$s result
 }
 
index 6a9df80..2be1977 100644 (file)
@@ -17,16 +17,18 @@ setsweep -CN -0.0101004948353626 0 0.999948988700964
 addsweep pr_1
 buildsweep q
 
+savehistory sweep_hist
+
 explode pr_1
 
-gensweep r1 pr_1_1
-gensweep r2 pr_1_2
-gensweep r3 pr_1_3
-gensweep r4 pr_1_4
+generated r1 sweep_hist pr_1_1
+generated r2 sweep_hist pr_1_2
+generated r3 sweep_hist pr_1_3
+generated r4 sweep_hist pr_1_4
 
 explode pr_1 v
 
-gensweep r1 pr_1_1
-gensweep r2 pr_1_2
-gensweep r3 pr_1_3
-gensweep r4 pr_1_4
+generated r1 sweep_hist pr_1_1
+generated r2 sweep_hist pr_1_2
+generated r3 sweep_hist pr_1_3
+generated r4 sweep_hist pr_1_4
index d3fd93f..59c4ba0 100644 (file)
@@ -22,16 +22,18 @@ explode pr1
 explode pr2
 explode pr3
 
-gensweep r1_1 pr1_1
-gensweep r1_2 pr1_2
-gensweep r1_3 pr1_3
-gensweep r1_4 pr1_4
+savehistory sweep_hist
 
-gensweep r2_1 pr2_1
-gensweep r2_2 pr2_2
-gensweep r2_3 pr2_3
+generated r1_1 sweep_hist pr1_1
+generated r1_2 sweep_hist pr1_2
+generated r1_3 sweep_hist pr1_3
+generated r1_4 sweep_hist pr1_4
 
-gensweep r3_1 pr3_1
+generated r2_1 sweep_hist pr2_1
+generated r2_2 sweep_hist pr2_2
+generated r2_3 sweep_hist pr2_3
+
+generated r3_1 sweep_hist pr3_1
 
 checknbshapes r1_1 -face 1
 checkprops r1_1 -s 1070.74
@@ -54,13 +56,13 @@ explode pr1 v
 explode pr2 v
 explode pr3 v
 
-gensweep r1_1 pr1_1
-gensweep r1_2 pr1_2
-gensweep r1_3 pr1_3
-gensweep r1_4 pr1_4
+generated r1_1 sweep_hist pr1_1
+generated r1_2 sweep_hist pr1_2
+generated r1_3 sweep_hist pr1_3
+generated r1_4 sweep_hist pr1_4
 
-gensweep r2_1 pr2_1
-gensweep r2_2 pr2_2
-gensweep r2_3 pr2_3
+generated r2_1 sweep_hist pr2_1
+generated r2_2 sweep_hist pr2_2
+generated r2_3 sweep_hist pr2_3
 
-gensweep r3_1 pr3_1
+generated r3_1 sweep_hist pr3_1
index 20319f8..b3b172e 100644 (file)
@@ -29,27 +29,29 @@ explode pr1
 explode pr2
 explode pr3
 
-gensweep r1_1 pr1_1
-gensweep r1_2 pr1_2
-gensweep r1_3 pr1_3
+savehistory sweep_hist
 
-gensweep r2_1 pr2_1
-gensweep r2_2 pr2_2
+generated r1_1 sweep_hist pr1_1
+generated r1_2 sweep_hist pr1_2
+generated r1_3 sweep_hist pr1_3
 
-gensweep r3_1 pr3_1
+generated r2_1 sweep_hist pr2_1
+generated r2_2 sweep_hist pr2_2
+
+generated r3_1 sweep_hist pr3_1
 
 explode pr1 v
 explode pr2 v
 explode pr3 v
 
-gensweep r1_1 pr1_1
-gensweep r1_2 pr1_2
-gensweep r1_3 pr1_3
-gensweep r1_4 pr1_4
+generated r1_1 sweep_hist pr1_1
+generated r1_2 sweep_hist pr1_2
+generated r1_3 sweep_hist pr1_3
+generated r1_4 sweep_hist pr1_4
 
-gensweep r2_1 pr2_1
-gensweep r2_2 pr2_2
-gensweep r2_3 pr2_3
+generated r2_1 sweep_hist pr2_1
+generated r2_2 sweep_hist pr2_2
+generated r2_3 sweep_hist pr2_3
 
-gensweep r3_1 pr3_1
-gensweep r3_2 pr3_2
+generated r3_1 sweep_hist pr3_1
+generated r3_2 sweep_hist pr3_2
index 56a6343..84b88c9 100644 (file)
@@ -20,15 +20,17 @@ buildsweep q
 
 explode pr2
 
-gensweep r1 pr2_1
-gensweep r2 pr2_2
-gensweep r3 pr2_3
+savehistory sweep_hist
+
+generated r1 sweep_hist pr2_1
+generated r2 sweep_hist pr2_2
+generated r3 sweep_hist pr2_3
 
 explode pr2 v
 
-gensweep r1 pr2_1
-gensweep r2 pr2_2
-gensweep r3 pr2_3
+generated r1 sweep_hist pr2_1
+generated r2 sweep_hist pr2_2
+generated r3 sweep_hist pr2_3
 
-gensweep r4 sp_1
-gensweep r5 sp_2
+generated r4 sweep_hist sp_1
+generated r5 sweep_hist sp_2
index c581984..8751722 100644 (file)
@@ -24,19 +24,21 @@ buildsweep q
 explode pr1
 explode pr2
 
-gensweep r1_1 pr1_1
+savehistory sweep_hist
 
-gensweep r2_1 pr2_1
-gensweep r2_2 pr2_2
-gensweep r2_3 pr2_3
-gensweep r2_4 pr2_4
+generated r1_1 sweep_hist pr1_1
+
+generated r2_1 sweep_hist pr2_1
+generated r2_2 sweep_hist pr2_2
+generated r2_3 sweep_hist pr2_3
+generated r2_4 sweep_hist pr2_4
 
 explode pr1 v
 explode pr2 v
 
-gensweep r1_1 pr1_1
+generated r1_1 sweep_hist pr1_1
 
-gensweep r2_1 pr2_1
-gensweep r2_2 pr2_2
-gensweep r2_3 pr2_3
-gensweep r2_4 pr2_4
+generated r2_1 sweep_hist pr2_1
+generated r2_2 sweep_hist pr2_2
+generated r2_3 sweep_hist pr2_3
+generated r2_4 sweep_hist pr2_4
index 308f070..da9b3cc 100644 (file)
@@ -26,21 +26,23 @@ buildsweep q
 explode pr1
 explode pr2
 
-gensweep r1_1 pr1_1
+savehistory sweep_hist
 
-gensweep r2_1 pr2_1
-gensweep r2_2 pr2_2
-gensweep r2_3 pr2_3
-gensweep r2_4 pr2_4
+generated r1_1 sweep_hist pr1_1
+
+generated r2_1 sweep_hist pr2_1
+generated r2_2 sweep_hist pr2_2
+generated r2_3 sweep_hist pr2_3
+generated r2_4 sweep_hist pr2_4
 
 explode pr1 v
 explode pr2 v
 
-gensweep r1_1 pr1_1
+generated r1_1 sweep_hist pr1_1
 
-gensweep r2_1 pr2_1
-gensweep r2_2 pr2_2
-gensweep r2_3 pr2_3
-gensweep r2_4 pr2_4
+generated r2_1 sweep_hist pr2_1
+generated r2_2 sweep_hist pr2_2
+generated r2_3 sweep_hist pr2_3
+generated r2_4 sweep_hist pr2_4
 
-gensweep r3 sp_1
+generated r3 sweep_hist sp_1
index 1cc7c38..cb65a27 100644 (file)
@@ -16,14 +16,16 @@ buildsweep q -R
 
 explode pr
 
-gensweep r1 pr_1
-gensweep r2 pr_2
-gensweep r3 pr_3
-gensweep r4 pr_4
+savehistory sweep_hist
+
+generated r1 sweep_hist pr_1
+generated r2 sweep_hist pr_2
+generated r3 sweep_hist pr_3
+generated r4 sweep_hist pr_4
 
 explode pr v
 
-gensweep r1 pr_1
-gensweep r2 pr_2
-gensweep r3 pr_3
-gensweep r4 pr_4
+generated r1 sweep_hist pr_1
+generated r2 sweep_hist pr_2
+generated r3 sweep_hist pr_3
+generated r4 sweep_hist pr_4
index 6f326f7..b6fa27a 100644 (file)
@@ -16,14 +16,16 @@ buildsweep q -R
 
 explode pr
 
-gensweep r1 pr_1
-gensweep r2 pr_2
-gensweep r3 pr_3
-gensweep r4 pr_4
+savehistory sweep_hist
+
+generated r1 sweep_hist pr_1
+generated r2 sweep_hist pr_2
+generated r3 sweep_hist pr_3
+generated r4 sweep_hist pr_4
 
 explode pr v
 
-gensweep r1 pr_1
-gensweep r2 pr_2
-gensweep r3 pr_3
-gensweep r4 pr_4
+generated r1 sweep_hist pr_1
+generated r2 sweep_hist pr_2
+generated r3 sweep_hist pr_3
+generated r4 sweep_hist pr_4
index bf9ac5e..8db8d46 100644 (file)
@@ -20,7 +20,7 @@ mksweep w3
 addsweep w1
 addsweep w2
 
-if {[catch {buildsweep result}]} {
+if {[regexp "Buildsweep : Not Done" [buildsweep result]]} {
   puts "OCC27822 is fixed."
 } else {
   puts "ERROR: OCC27822 does not fixed correctly."
index cd0176d..0449df0 100644 (file)
@@ -167,10 +167,10 @@ copy rgf_1 v_upper
 set edges [explode edges_fillet e];
 set nbe [llength $edges]
 
+savehistory gf_hist
 for {set i 1} {$i <= $nbe} {incr i} {
-  bmodified em edges_fillet_$i;
-  explode em e;
-  blend v_upper v_upper 1.5 em_1;
+  modified em gf_hist edges_fillet_$i;
+  blend v_upper v_upper 1.5 em;
 }
 
 #vdisplay v_upper;
index e338a1e..414e1ab 100644 (file)
@@ -14,60 +14,54 @@ explode a e
 
 unifysamedom result a a_3 a_1_3 a_1_4
 
-set bug_info [unifysamedommod res a_9]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been modified"} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedommod does not work correctly."
+savehistory usd_hist
+
+set bug_info [modified res usd_hist a_9]
+if {$bug_info != "The shape has not been modified."} {
+  puts "ERROR: OCC28226 is reproduced. Command modified does not work correctly."
 }
 
-set bug_info [unifysamedommod res a_10]
+set bug_info [modified res usd_hist a_10]
 if {$bug_info != ""} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedommod does not work correctly."
+  puts "ERROR: OCC28226 is reproduced. Command modified does not work correctly."
 }
 
-set bug_info [unifysamedommod res a_11]
+set bug_info [modified res usd_hist a_11]
 if {$bug_info != ""} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedommod does not work correctly."
+  puts "ERROR: OCC28226 is reproduced. Command modified does not work correctly."
 }
 
-set bug_info [unifysamedommod res a_3]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been modified"} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedommod does not work correctly."
+set bug_info [modified res usd_hist a_3]
+if {$bug_info != "The shape has not been modified."} {
+  puts "ERROR: OCC28226 is reproduced. Command modified does not work correctly."
 }
 
-set bug_info [unifysamedomisdel a_3]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been deleted"} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedomisdel does not work correctly."
+set bug_info [isdeleted usd_hist a_3]
+if {$bug_info != "Not deleted."} {
+  puts "ERROR: OCC28226 is reproduced. Command isdeleted does not work correctly."
 }
 
-set bug_info [unifysamedomisdel a_9]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has been deleted"} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedomisdel does not work correctly."
+set bug_info [isdeleted usd_hist a_9]
+if {$bug_info != "Deleted."} {
+  puts "ERROR: OCC28226 is reproduced. Command isdeleted does not work correctly."
 }
 
-set bug_info [unifysamedomisdel a_1_8]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has been deleted"} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedomisdel does not work correctly."
+set bug_info [isdeleted usd_hist a_1_8]
+if {$bug_info != "Deleted."} {
+  puts "ERROR: OCC28226 is reproduced. Command isdeleted does not work correctly."
 }
 
-set bug_info [unifysamedomisdel a_1_9]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has been deleted"} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedomisdel does not work correctly."
+set bug_info [isdeleted usd_hist a_1_9]
+if {$bug_info != "Deleted."} {
+  puts "ERROR: OCC28226 is reproduced. Command isdeleted does not work correctly."
 }
 
-set bug_info [unifysamedomisdel a_10]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been deleted"} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedomisdel does not work correctly."
+set bug_info [isdeleted usd_hist a_10]
+if {$bug_info != "Not deleted."} {
+  puts "ERROR: OCC28226 is reproduced. Command isdeleted does not work correctly."
 }
 
-set bug_info [unifysamedomisdel a_11]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been deleted"} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedomisdel does not work correctly."
+set bug_info [isdeleted usd_hist a_11]
+if {$bug_info != "Not deleted."} {
+  puts "ERROR: OCC28226 is reproduced. Command isdeleted does not work correctly."
 }
index be67174..67acd99 100644 (file)
@@ -14,14 +14,14 @@ explode a e
 
 unifysamedom result a a_3 a_1_3 a_1_4 -e
 
-set bug_info [unifysamedomisdel a_1_8]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been deleted"} {
+savehistory usd_hist
+
+set bug_info [isdeleted usd_hist a_1_8]
+if {$bug_info != "Not deleted."} {
   puts "ERROR: OCC28226 is reproduced. Command unifysamedomisdel does not work correctly."
 }
 
-set bug_info [unifysamedomisdel a_1_9]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has been deleted"} {
+set bug_info [isdeleted usd_hist a_1_9]
+if {$bug_info != "Deleted."} {
   puts "ERROR: OCC28226 is reproduced. Command unifysamedomisdel does not work correctly."
 }
\ No newline at end of file
index 15d9957..44d12e2 100644 (file)
@@ -9,12 +9,15 @@ if {[isdraw result]} {
   eval compound [explode a v] input_verts
   eval compound [explode a e] input_edges
 
+  # get usd history
+  savehistory usd_hist
+
   # check deleted
 
   # get removed vertices through the history
   compound rem_verts
   foreach v [explode input_verts] {
-    if {[regexp "The shape has been deleted" [unifysamedomisdel $v]]} {
+    if {[regexp "Deleted." [isdeleted usd_hist $v]]} {
       add $v rem_verts;
     }
   }
@@ -22,7 +25,7 @@ if {[isdraw result]} {
   # get removed edges through the history
   compound rem_edges
   foreach e [explode input_edges] {
-    if {[regexp "The shape has been deleted" [unifysamedomisdel $e]]} {
+    if {[regexp "Deleted." [isdeleted usd_hist $e]]} {
       add $e rem_edges;
     }
   }
@@ -40,7 +43,7 @@ if {[isdraw result]} {
 
   # faces should not be removed at all
   foreach f [explode a f] {
-    if {[regexp "The shape has been deleted" [unifysamedomisdel $f]]} {
+    if {[regexp "Deleted." [isdeleted usd_hist $f]]} {
       puts "Error: the faces should not be removed during unification."
       break;
     }
@@ -56,10 +59,10 @@ if {[isdraw result]} {
   compound all_hist_shapes
   foreach comp {input_verts input_edges input_faces} {
     foreach s [explode $comp] {
-      if {[regexp "The shape has been deleted" [unifysamedomisdel $s]]} {
+      if {[regexp "Deleted." [isdeleted usd_hist $s]]} {
         continue;
       }
-      if {[regexp "The shape has not been modified" [unifysamedommod s_mod $s]]} {
+      if {[regexp "The shape has not been modified." [modified s_mod usd_hist $s]]} {
         add $s all_hist_shapes;
         continue;
       }
index 13a024d..3a118e6 100755 (executable)
@@ -1,4 +1,3 @@
-puts "TODO OCC24909 ALL: Tcl Exception: Buildsweep : Not Done"
 puts "TODO OCC24909 ALL: TEST INCOMPLETE"
 
 puts "========"