From f858df7b56cb29f8fbf5f3261bcd94c788162eb3 Mon Sep 17 00:00:00 2001 From: emv Date: Thu, 15 Apr 2021 16:30:03 +0300 Subject: [PATCH] 0027049: Make non-destructive mode be defined by default in Boolean operations Set non-destructive mode enabled by default in Boolean operation algorithms. It means that shapes will not be modified during any Boolean, Split, GeneralFuse, MakerVolume, CellsBuilder operations. Since now, in this default mode, the user should not expect any shape from the input arguments being present in the result shape of the operations mentioned above. Some of the input shapes may be passed to the result, in case they are not affected by the operation, but in general, it is better to work through the History mechanism. The shapes replaced by the copies should be obtained through Modified method. Incomplete: documentation of the algorithms has to be updated accordingly. --- src/BOPAlgo/BOPAlgo_Builder.cxx | 4 ++-- src/BOPAlgo/BOPAlgo_Builder.hxx | 3 ++- src/BOPAlgo/BOPAlgo_PaveFiller.cxx | 4 ++-- src/BOPAlgo/BOPAlgo_PaveFiller.hxx | 3 ++- src/BOPTest/BOPTest_Objects.cxx | 2 +- src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.cxx | 4 ++-- src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.hxx | 3 ++- src/BRepOffset/BRepOffset_MakeOffset.cxx | 3 +++ src/BRepOffset/BRepOffset_MakeOffset_1.cxx | 11 +++++++++-- tests/bugs/modalg_5/bug24302 | 2 -- tests/bugs/modalg_6/bug26619 | 5 ----- tests/bugs/modalg_6/bug26738 | 1 - tests/bugs/modalg_6/bug28775 | 2 -- tests/bugs/modalg_7/bug27049 | 5 ----- tests/bugs/modalg_7/bug28211_2 | 2 -- tests/bugs/modalg_7/bug28274 | 2 -- tests/bugs/modalg_7/bug28485 | 1 - tests/bugs/modalg_7/bug28485_1 | 1 - tests/bugs/modalg_7/bug30396_1 | 1 - tests/bugs/modalg_7/bug31835_1 | 2 ++ tests/bugs/modalg_7/bug31835_2 | 1 - tests/bugs/modalg_7/bug31836 | 1 - tests/bugs/modalg_7/bug31850_1 | 2 ++ tests/bugs/modalg_7/bug31850_2 | 1 - tests/bugs/modalg_7/bug31858_1 | 2 ++ tests/bugs/modalg_7/bug31858_2 | 1 - tests/perf/modalg/bug29329 | 2 -- 27 files changed, 31 insertions(+), 40 deletions(-) diff --git a/src/BOPAlgo/BOPAlgo_Builder.cxx b/src/BOPAlgo/BOPAlgo_Builder.cxx index 7ef864a1b6..7db2fa8726 100644 --- a/src/BOPAlgo/BOPAlgo_Builder.cxx +++ b/src/BOPAlgo/BOPAlgo_Builder.cxx @@ -53,7 +53,7 @@ BOPAlgo_Builder::BOPAlgo_Builder() myShapesSD(100, myAllocator), myOrigins(100, myAllocator), myInParts(100, myAllocator), - myNonDestructive(Standard_False), + myNonDestructive(Standard_True), myGlue(BOPAlgo_GlueOff), myCheckInverted(Standard_True) { @@ -75,7 +75,7 @@ BOPAlgo_Builder::BOPAlgo_Builder myShapesSD(100, myAllocator), myOrigins(100, myAllocator), myInParts(100, myAllocator), - myNonDestructive(Standard_False), + myNonDestructive(Standard_True), myGlue(BOPAlgo_GlueOff), myCheckInverted(Standard_True) { diff --git a/src/BOPAlgo/BOPAlgo_Builder.hxx b/src/BOPAlgo/BOPAlgo_Builder.hxx index 2d8d1e97c9..8c19f8e76d 100644 --- a/src/BOPAlgo/BOPAlgo_Builder.hxx +++ b/src/BOPAlgo/BOPAlgo_Builder.hxx @@ -52,7 +52,7 @@ class TopoDS_Solid; //! Additionally to the options of the base classes, the algorithm has //! the following options:
//! - *Safe processing mode* - allows to avoid modification of the input -//! shapes during the operation (by default it is off);
+//! shapes during the operation (enabled by default);
//! - *Gluing options* - allows to speed up the calculation of the intersections //! on the special cases, in which some sub-shapes are coinciding.
//! - *Disabling the check for inverted solids* - Disables/Enables the check of the input solids @@ -126,6 +126,7 @@ public: //! @name Options //! This flag is taken into account if internal PaveFiller is used only. //! In the case of calling PerformWithFiller the corresponding flag of that PaveFiller //! is in force. + //! Enabled by default. void SetNonDestructive(const Standard_Boolean theFlag) { myNonDestructive = theFlag; diff --git a/src/BOPAlgo/BOPAlgo_PaveFiller.cxx b/src/BOPAlgo/BOPAlgo_PaveFiller.cxx index faf4ce3ee9..134fa26eae 100644 --- a/src/BOPAlgo/BOPAlgo_PaveFiller.cxx +++ b/src/BOPAlgo/BOPAlgo_PaveFiller.cxx @@ -42,7 +42,7 @@ BOPAlgo_PaveFiller::BOPAlgo_PaveFiller() { myDS = NULL; myIterator = NULL; - myNonDestructive = Standard_False; + myNonDestructive = Standard_True; myIsPrimary = Standard_True; myAvoidBuildPCurve = Standard_False; myGlue = BOPAlgo_GlueOff; @@ -62,7 +62,7 @@ BOPAlgo_PaveFiller::BOPAlgo_PaveFiller { myDS = NULL; myIterator = NULL; - myNonDestructive = Standard_False; + myNonDestructive = Standard_True; myIsPrimary = Standard_True; myAvoidBuildPCurve = Standard_False; myGlue = BOPAlgo_GlueOff; diff --git a/src/BOPAlgo/BOPAlgo_PaveFiller.hxx b/src/BOPAlgo/BOPAlgo_PaveFiller.hxx index 307f2e5031..4e63696dd0 100644 --- a/src/BOPAlgo/BOPAlgo_PaveFiller.hxx +++ b/src/BOPAlgo/BOPAlgo_PaveFiller.hxx @@ -83,7 +83,7 @@ class TopoDS_Face; //! - *Section attributes* - allows to customize the intersection of the faces //! (avoid approximation or building 2d curves);
//! - *Safe processing mode* - allows to avoid modification of the input -//! shapes during the operation (by default it is off);
+//! shapes during the operation (enabled by default);
//! - *Gluing options* - allows to speed up the calculation on the special //! cases, in which some sub-shapes are coincide.
//! @@ -151,6 +151,7 @@ public: //! Sets the flag that defines the mode of treatment. //! In non-destructive mode the argument shapes are not modified. Instead //! a copy of a sub-shape is created in the result if it is needed to be updated. + //! Enabled by default. Standard_EXPORT void SetNonDestructive(const Standard_Boolean theFlag); //! Returns the flag that defines the mode of treatment. diff --git a/src/BOPTest/BOPTest_Objects.cxx b/src/BOPTest/BOPTest_Objects.cxx index f5eb38983c..503b41c4bd 100644 --- a/src/BOPTest/BOPTest_Objects.cxx +++ b/src/BOPTest/BOPTest_Objects.cxx @@ -102,7 +102,7 @@ class BOPTest_Session { void SetDefaultOptions() { myRunParallel = Standard_False; - myNonDestructive = Standard_False; + myNonDestructive = Standard_True; myFuzzyValue = Precision::Confusion(); myGlue = BOPAlgo_GlueOff; myDrawWarnShapes = Standard_False; diff --git a/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.cxx b/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.cxx index 4e310b2f6d..373f932cd2 100644 --- a/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.cxx +++ b/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.cxx @@ -28,7 +28,7 @@ BRepAlgoAPI_BuilderAlgo::BRepAlgoAPI_BuilderAlgo() : BRepAlgoAPI_Algo(), - myNonDestructive(Standard_False), + myNonDestructive(Standard_True), myGlue(BOPAlgo_GlueOff), myCheckInverted(Standard_True), myFillHistory(Standard_True), @@ -43,7 +43,7 @@ BRepAlgoAPI_BuilderAlgo::BRepAlgoAPI_BuilderAlgo() BRepAlgoAPI_BuilderAlgo::BRepAlgoAPI_BuilderAlgo(const BOPAlgo_PaveFiller& aPF) : BRepAlgoAPI_Algo(), - myNonDestructive(Standard_False), + myNonDestructive(Standard_True), myGlue(BOPAlgo_GlueOff), myCheckInverted(Standard_True), myFillHistory(Standard_True), diff --git a/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.hxx b/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.hxx index d8cc474de3..d6d341c600 100644 --- a/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.hxx +++ b/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.hxx @@ -34,7 +34,7 @@ //! Additionally to the options defined in the base class, the algorithm has //! the following options:
//! - *Safe processing mode* - allows to avoid modification of the input -//! shapes during the operation (by default it is off); +//! shapes during the operation (enabled by default); //! - *Gluing options* - allows to speed up the calculation of the intersections //! on the special cases, in which some sub-shapes are coinciding. //! - *Disabling the check for inverted solids* - Disables/Enables the check of the input solids @@ -94,6 +94,7 @@ public: //! @name Setting options //! Sets the flag that defines the mode of treatment. //! In non-destructive mode the argument shapes are not modified. Instead //! a copy of a sub-shape is created in the result if it is needed to be updated. + //! Enabled by default. void SetNonDestructive(const Standard_Boolean theFlag) { myNonDestructive = theFlag; diff --git a/src/BRepOffset/BRepOffset_MakeOffset.cxx b/src/BRepOffset/BRepOffset_MakeOffset.cxx index 2c5fe795f3..c1ffbb649e 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset.cxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.cxx @@ -4302,6 +4302,7 @@ Standard_Boolean BuildShellsCompleteInter(const TopTools_ListOfShape& theLF, // we need to intersect the faces to process the tangential faces aMV1.SetIntersect(Standard_True); aMV1.SetAvoidInternalShapes(Standard_True); + aMV1.SetNonDestructive(Standard_False); aMV1.Perform(); // Standard_Boolean bDone = ! aMV1.HasErrors(); @@ -4382,6 +4383,7 @@ Standard_Boolean BuildShellsCompleteInter(const TopTools_ListOfShape& theLF, // no need to intersect this time aMV2.SetIntersect(Standard_False); aMV2.SetAvoidInternalShapes(Standard_True); + aMV2.SetNonDestructive(Standard_False); aMV2.Perform(); bDone = ! aMV2.HasErrors(); if (!bDone) { @@ -4433,6 +4435,7 @@ Standard_Boolean BuildShellsCompleteInter(const TopTools_ListOfShape& theLF, aMV3.SetArguments(aLF); aMV3.SetIntersect(Standard_False); aMV3.SetAvoidInternalShapes(Standard_True); + aMV3.SetNonDestructive(Standard_False); aMV3.Perform(); bDone = ! aMV3.HasErrors(); if (!bDone) { diff --git a/src/BRepOffset/BRepOffset_MakeOffset_1.cxx b/src/BRepOffset/BRepOffset_MakeOffset_1.cxx index ac615955e4..b75f449ad2 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset_1.cxx +++ b/src/BRepOffset/BRepOffset_MakeOffset_1.cxx @@ -46,7 +46,6 @@ #include -#include #include #include #include @@ -1304,6 +1303,7 @@ void IntersectTrimmedEdges(const TopTools_ListOfShape& theLF, // perform intersection of the edges BOPAlgo_Builder aGFE; aGFE.SetArguments(aLS); + aGFE.SetNonDestructive(Standard_False); aGFE.Perform(); if (aGFE.HasErrors()) { return; @@ -1496,9 +1496,9 @@ void BuildSplitsOfTrimmedFace(const TopoDS_Face& theFace, TopTools_ListOfShape& theLFImages) { BOPAlgo_Builder aGF; - // aGF.AddArgument(theFace); aGF.AddArgument(theEdges); + aGF.SetNonDestructive(Standard_False); aGF.Perform(); if (aGF.HasErrors()) { return; @@ -3502,6 +3502,7 @@ void RemoveInsideFaces(TopTools_IndexedDataMapOfShapeListOfShape& theFImages, BOPAlgo_MakerVolume aMV; aMV.SetArguments(aLS); aMV.SetIntersect(Standard_True); + aMV.SetNonDestructive(Standard_False); aMV.Perform(); if (aMV.HasErrors()) return; @@ -5882,6 +5883,7 @@ void IntersectAndTrimEdges(const TopTools_IndexedDataMapOfShapeListOfShape& theF // Intersect Edges BOPAlgo_Builder aGF; aGF.SetArguments(aLArgs); + aGF.SetNonDestructive(Standard_False); aGF.Perform(); if (aGF.HasErrors()) { return; @@ -5950,6 +5952,7 @@ void IntersectAndTrimEdges(const TopTools_IndexedDataMapOfShapeListOfShape& theF BOPAlgo_Builder aGFCE; aGFCE.SetArguments(aLCE); aGFCE.AddArgument(aCEIm); + aGFCE.SetNonDestructive(Standard_False); aGFCE.Perform(); // if (aGFCE.HasErrors()) { @@ -6398,6 +6401,7 @@ void UpdateValidEdges(const TopTools_IndexedDataMapOfShapeListOfShape& theFImage BOPAlgo_Builder aGF; aGF.AddArgument(aBounds); aGF.AddArgument(aSplits); + aGF.SetNonDestructive(Standard_False); aGF.Perform(); // // update splits @@ -6545,6 +6549,7 @@ void TrimNewIntersectionEdges(const TopTools_ListOfShape& theLE, aMV.Add(aV1); aMV.Add(aV2); // + aGFE.SetNonDestructive(Standard_False); aGFE.Perform(); if (!aGFE.HasErrors()) { // get images of bounding vertices to remove splits containing them @@ -6634,6 +6639,7 @@ void IntersectEdges(const TopTools_ListOfShape& theLA, { BOPAlgo_Builder aGFA; aGFA.SetArguments(theLA); + aGFA.SetNonDestructive(Standard_False); aGFA.Perform(); if (aGFA.HasErrors()) { // just copy input to the result @@ -6874,6 +6880,7 @@ void GetInvalidEdgesByBounds(const TopoDS_Shape& theSplits, BOPAlgo_Section aSec; aSec.AddArgument(theSplits); aSec.AddArgument(theBounds); + aSec.SetNonDestructive(Standard_False); // aSec.Perform(); // diff --git a/tests/bugs/modalg_5/bug24302 b/tests/bugs/modalg_5/bug24302 index a1e64956ba..f6d05bbdf5 100644 --- a/tests/bugs/modalg_5/bug24302 +++ b/tests/bugs/modalg_5/bug24302 @@ -11,8 +11,6 @@ restore [locate_data_file bug24302_SolidBefore.brep] b regexp {Tolerance +MAX=([-0-9.+eE]+)} [tolerance b] full MaxTol_b_1 -bnondestructive 1 - bop p b regexp {Tolerance +MAX=([-0-9.+eE]+)} [tolerance b] full MaxTol_b_2 diff --git a/tests/bugs/modalg_6/bug26619 b/tests/bugs/modalg_6/bug26619 index 8306232009..fe0675a73e 100644 --- a/tests/bugs/modalg_6/bug26619 +++ b/tests/bugs/modalg_6/bug26619 @@ -13,11 +13,6 @@ regexp {Tolerance +MAX=([-0-9.+eE]+)} [tolerance h0] full MaxTolerance1 tolerance f0 -#turn on non-destructive mode of BOP -#setflags h0 locked -#setflags f0 locked -bnondestructive 1 - bop h0 f0 bopsection result checkprops result -l 150.232 diff --git a/tests/bugs/modalg_6/bug26738 b/tests/bugs/modalg_6/bug26738 index c032911af0..af9481b1ea 100644 --- a/tests/bugs/modalg_6/bug26738 +++ b/tests/bugs/modalg_6/bug26738 @@ -15,7 +15,6 @@ regexp {Tolerance +MAX=([-0-9.+eE]+)} [tolerance f0] full ExpectedMaxTol_f0 #turn on non-destructive mode of BOP and fuzzy value; #with this combination the test is fail before the fix 26738, #as tolerance of input shape is changed -bnondestructive 1 bfuzzyvalue 0.1 bclearobjects diff --git a/tests/bugs/modalg_6/bug28775 b/tests/bugs/modalg_6/bug28775 index a056ea2a0d..ba7181b92b 100644 --- a/tests/bugs/modalg_6/bug28775 +++ b/tests/bugs/modalg_6/bug28775 @@ -10,8 +10,6 @@ vertex v1 1 0 0 polyline p1 0 0 0 2 0 0 polyline p2 1 0 -1 1 0 1 -bnondestructive 1 - bclearobjects bcleartools baddobjects v1 p1 p2 diff --git a/tests/bugs/modalg_7/bug27049 b/tests/bugs/modalg_7/bug27049 index ef2dc59966..5178794424 100644 --- a/tests/bugs/modalg_7/bug27049 +++ b/tests/bugs/modalg_7/bug27049 @@ -13,11 +13,6 @@ regexp {Tolerance +MAX=([-0-9.+eE]+)} [tolerance h0] full MaxTolerance1 tolerance f0 -#turn on non-destructive mode of BOP -#setflags h0 locked -#setflags f0 locked -#bnondestructive 1 - bop h0 f0 bopsection result checkprops result -l 150.23 diff --git a/tests/bugs/modalg_7/bug28211_2 b/tests/bugs/modalg_7/bug28211_2 index 4fd6012c81..a099d0e3a2 100644 --- a/tests/bugs/modalg_7/bug28211_2 +++ b/tests/bugs/modalg_7/bug28211_2 @@ -12,8 +12,6 @@ restore [locate_data_file bug28211_MHX_VKT_WS_Pos3_tool.brep] t explode s f explode t f -bnondestructive 1 - # Before the fix, exception in bsection algo was thrown. bsection r s_91 t_4 diff --git a/tests/bugs/modalg_7/bug28274 b/tests/bugs/modalg_7/bug28274 index 5581707de2..10fa3df309 100755 --- a/tests/bugs/modalg_7/bug28274 +++ b/tests/bugs/modalg_7/bug28274 @@ -8,8 +8,6 @@ puts "" restore [locate_data_file bug28274_tmp.brep] a -bnondestructive 1 - set Log [eval mkvolume result [explode a f] ] checkshape result diff --git a/tests/bugs/modalg_7/bug28485 b/tests/bugs/modalg_7/bug28485 index 2cb8553e68..c843f43ea1 100644 --- a/tests/bugs/modalg_7/bug28485 +++ b/tests/bugs/modalg_7/bug28485 @@ -9,7 +9,6 @@ puts "" restore [locate_data_file bug28485_parts.brep] a explode a -bnondestructive 1 brunparallel 1 bfuzzyvalue 0 bglue 1 diff --git a/tests/bugs/modalg_7/bug28485_1 b/tests/bugs/modalg_7/bug28485_1 index ea05d792a1..7331a6cea9 100644 --- a/tests/bugs/modalg_7/bug28485_1 +++ b/tests/bugs/modalg_7/bug28485_1 @@ -11,7 +11,6 @@ box b2 10 2 2 6 6 6 nurbsconvert b1 b1 nurbsconvert b2 b2 -bnondestructive 1 brunparallel 1 bfuzzyvalue 0 bglue 1 diff --git a/tests/bugs/modalg_7/bug30396_1 b/tests/bugs/modalg_7/bug30396_1 index 6ddbd2416a..6ed259f91e 100644 --- a/tests/bugs/modalg_7/bug30396_1 +++ b/tests/bugs/modalg_7/bug30396_1 @@ -17,7 +17,6 @@ set area {25.9962 58.8635 53.1541 empty} set nameop {common fuse cut cut21} bfuzzyvalue 1e-2 -bnondestructive 1 for {set i 1} { $i <= 2} {incr i} { diff --git a/tests/bugs/modalg_7/bug31835_1 b/tests/bugs/modalg_7/bug31835_1 index da0216b9e3..74fa3ae804 100644 --- a/tests/bugs/modalg_7/bug31835_1 +++ b/tests/bugs/modalg_7/bug31835_1 @@ -10,6 +10,8 @@ pcylinder c2 p2 100 400 plane p3 0 200 12.6935294289015 0 -1 1.11022302462516e-16 pcylinder c3 p3 100 400 +bnondestructive 0 + bcommon r c1 c2 checkshape r if {![regexp "OK" [bopcheck r]]} { diff --git a/tests/bugs/modalg_7/bug31835_2 b/tests/bugs/modalg_7/bug31835_2 index ba8a0e87a2..be3fcefbf0 100644 --- a/tests/bugs/modalg_7/bug31835_2 +++ b/tests/bugs/modalg_7/bug31835_2 @@ -11,7 +11,6 @@ plane p3 0 200 12.6935294289015 0 -1 1.11022302462516e-16 pcylinder c3 p3 100 400 bfuzzyvalue 1.e-6 -bnondestructive 1 brunparallel 1 setfillhistory 0 diff --git a/tests/bugs/modalg_7/bug31836 b/tests/bugs/modalg_7/bug31836 index bc2a75ae0e..242a9c71d1 100644 --- a/tests/bugs/modalg_7/bug31836 +++ b/tests/bugs/modalg_7/bug31836 @@ -10,7 +10,6 @@ ttranslate t 100 0 300 bfuzzyvalue 1.e-6 brunparallel 1 -bnondestructive 1 setfillhistory 0 explode s diff --git a/tests/bugs/modalg_7/bug31850_1 b/tests/bugs/modalg_7/bug31850_1 index 906267109f..014c484908 100644 --- a/tests/bugs/modalg_7/bug31850_1 +++ b/tests/bugs/modalg_7/bug31850_1 @@ -6,6 +6,8 @@ puts "" restore [locate_data_file bug31850.brep] s explode s +bnondestructive 0 + bclearobjects bcleartools baddobjects s_1 diff --git a/tests/bugs/modalg_7/bug31850_2 b/tests/bugs/modalg_7/bug31850_2 index 07312180d6..e8944876db 100644 --- a/tests/bugs/modalg_7/bug31850_2 +++ b/tests/bugs/modalg_7/bug31850_2 @@ -7,7 +7,6 @@ restore [locate_data_file bug31850.brep] s explode s bfuzzyvalue 1.e-6 -bnondestructive 1 brunparallel 1 setfillhistory 0 diff --git a/tests/bugs/modalg_7/bug31858_1 b/tests/bugs/modalg_7/bug31858_1 index 3c491c93ba..48399b9efb 100644 --- a/tests/bugs/modalg_7/bug31858_1 +++ b/tests/bugs/modalg_7/bug31858_1 @@ -7,6 +7,8 @@ pcylinder c 500 200 plane p -2.31895142368858e-15 -4.49296838339662e-15 200 0 0 1 ptorus t p 449.367136080235 50.6328639197654 +bnondestructive 0 + bclearobjects bcleartools baddobjects c diff --git a/tests/bugs/modalg_7/bug31858_2 b/tests/bugs/modalg_7/bug31858_2 index a869e7ce79..e32a514984 100644 --- a/tests/bugs/modalg_7/bug31858_2 +++ b/tests/bugs/modalg_7/bug31858_2 @@ -8,7 +8,6 @@ plane p -2.31895142368858e-15 -4.49296838339662e-15 200 0 0 1 ptorus t p 449.367136080235 50.6328639197654 bfuzzyvalue 1.e-6 -bnondestructive 1 brunparallel 1 setfillhistory 0 diff --git a/tests/perf/modalg/bug29329 b/tests/perf/modalg/bug29329 index 680a82304d..83797258d9 100644 --- a/tests/perf/modalg/bug29329 +++ b/tests/perf/modalg/bug29329 @@ -8,8 +8,6 @@ puts "TODO CR29596 ALL: Warning: Intersection of pair of shapes has failed" restore [locate_data_file bug29329_objects.brep] a restore [locate_data_file bug29329_tools.brep] b -bnondestructive 1 - dchrono timer restart bfuse result a b -- 2.39.5