From 92b1fcbad992aa3d1f54c89e0ede660b610b07b5 Mon Sep 17 00:00:00 2001 From: azv Date: Sat, 29 Sep 2018 12:25:41 +0300 Subject: [PATCH] Issue #2611: Partition of a solid belonging to a Compsolid Unused solids of the first compsolid are kept untoushed now. --- .../FeaturesPlugin_Partition.cpp | 58 +++++++++++++------ ...TestPartitionSubCompsolidWithCompSolid1.py | 22 +++---- ...TestPartitionSubCompsolidWithCompSolid2.py | 8 +-- ...TestPartitionSubCompsolidWithCompSolid3.py | 8 +-- .../TestPartitionSubCompsolidWithSolid5.py | 4 +- 5 files changed, 60 insertions(+), 40 deletions(-) diff --git a/src/FeaturesPlugin/FeaturesPlugin_Partition.cpp b/src/FeaturesPlugin/FeaturesPlugin_Partition.cpp index 3ef472216..cd4f34cd3 100755 --- a/src/FeaturesPlugin/FeaturesPlugin_Partition.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Partition.cpp @@ -366,40 +366,60 @@ void unusedSubsOfComposolid(const CompsolidSubs& theObjects, CompsolidSubs& theN } } -bool cutUnusedSubs(CompsolidSubs& theObjects, CompsolidSubs& theNotUsed, - std::shared_ptr& theMakeShapeList, - std::string& theError) +static bool cutSubs(const GeomShapePtr& theFirstArgument, + CompsolidSubs& theSubsToCut, + const ListOfShape& theTools, + std::shared_ptr& theMakeShapeList, + std::string& theError) { + if (theTools.empty()) + return true; + std::shared_ptr aCutAlgo; - for (CompsolidSubs::iterator anObjIt = theObjects.begin(); - anObjIt != theObjects.end(); ++anObjIt) { - // get list of unused subs of composolids except the current - ListOfShape aTools; - for (CompsolidSubs::const_iterator aUIt = theNotUsed.begin(); - aUIt != theNotUsed.end(); ++aUIt) { - if (aUIt->first != anObjIt->first) - aTools.insert(aTools.end(), aUIt->second.begin(), aUIt->second.end()); - } - if (aTools.empty()) - continue; + for (CompsolidSubs::iterator aUIt= theSubsToCut.begin(); aUIt != theSubsToCut.end(); ++aUIt) { + if (aUIt->first == theFirstArgument) + continue; // no need to split unused subs of the first compsolid // cut from current list of solids aCutAlgo.reset( - new GeomAlgoAPI_Boolean(anObjIt->second, aTools, GeomAlgoAPI_Boolean::BOOL_CUT)); + new GeomAlgoAPI_Boolean(aUIt->second, theTools, GeomAlgoAPI_Boolean::BOOL_CUT)); if (isAlgoFailed(aCutAlgo, theError)) return false; theMakeShapeList->appendAlgo(aCutAlgo); - // update list of objects of the partition - GeomAPI_Shape::ShapeType aType = anObjIt->second.front()->shapeType(); - anObjIt->second.clear(); + // update list of un-selected objects of the partition + GeomAPI_Shape::ShapeType aType = aUIt->second.front()->shapeType(); + aUIt->second.clear(); for (GeomAPI_ShapeExplorer anExp(aCutAlgo->shape(), aType); anExp.more(); anExp.next()) - anObjIt->second.push_back(anExp.current()); + aUIt->second.push_back(anExp.current()); } return true; } +bool cutUnusedSubs(CompsolidSubs& theObjects, CompsolidSubs& theNotUsed, + std::shared_ptr& theMakeShapeList, + std::string& theError) +{ + GeomShapePtr aFirstArgument = theObjects.front().first; + + // compose a set of tools for the CUT operation: + // find the list of unused subs of the first argument or use itself + ListOfShape aToolsForUsed; + CompsolidSubs::iterator aUIt = theNotUsed.begin(); + for (; aUIt != theNotUsed.end(); ++aUIt) + if (aUIt->first == aFirstArgument) { + aToolsForUsed.insert(aToolsForUsed.end(), aUIt->second.begin(), aUIt->second.end()); + break; + } + ListOfShape aToolsForUnused; + aToolsForUnused.push_back(aFirstArgument); + + // cut subs + return cutSubs(aFirstArgument, theObjects, aToolsForUsed, theMakeShapeList, theError) + && cutSubs(aFirstArgument, theNotUsed, aToolsForUnused, theMakeShapeList, theError); +} + bool isAlgoFailed(const std::shared_ptr& theAlgo, std::string& theError) { if (!theAlgo->isDone()) { diff --git a/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid1.py b/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid1.py index 9b428d6b5..689fdb07e 100644 --- a/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid1.py +++ b/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid1.py @@ -45,9 +45,9 @@ model.do() # check partition model.testNbResults(Partition_2, 1) -model.testNbSubResults(Partition_2, [9]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [9]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [61]) +model.testNbSubResults(Partition_2, [7]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [7]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [53]) model.testResultsVolumes(Partition_2, [82157.197962046673637814819812775]) # change box height and check partition @@ -55,8 +55,8 @@ Param_BoxH.setValue(20) model.do() model.testNbResults(Partition_2, 1) -model.testNbSubResults(Partition_2, [10]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [10]) +model.testNbSubResults(Partition_2, [8]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [8]) model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [73]) model.testResultsVolumes(Partition_2, [146157.197962002450367435812950134]) @@ -66,9 +66,9 @@ Param_ExtrusionMax.setValue(15) model.do() model.testNbResults(Partition_2, 1) -model.testNbSubResults(Partition_2, [11]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [11]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [85]) +model.testNbSubResults(Partition_2, [9]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [9]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [93]) model.testResultsVolumes(Partition_2, [146157.197961971396580338478088379]) # change radius of a circle and check partition @@ -76,9 +76,9 @@ Param_Radius.setValue(50) model.do() model.testNbResults(Partition_2, 1) -model.testNbSubResults(Partition_2, [11]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [11]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [82]) +model.testNbSubResults(Partition_2, [9]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [9]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [92]) model.testResultsVolumes(Partition_2, [156418.581829168775584548711776733]) # check naming diff --git a/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid2.py b/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid2.py index 38b4094d2..48e09d554 100644 --- a/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid2.py +++ b/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid2.py @@ -47,7 +47,7 @@ model.do() model.testNbResults(Partition_2, 1) model.testNbSubResults(Partition_2, [8]) model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [8]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [55]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [57]) model.testResultsVolumes(Partition_2, [82157.197962275837198831140995026]) # change box height and check partition @@ -57,7 +57,7 @@ model.do() model.testNbResults(Partition_2, 1) model.testNbSubResults(Partition_2, [9]) model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [9]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [70]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [76]) model.testResultsVolumes(Partition_2, [146157.197962169535458087921142578]) # update extrusion and check partition @@ -68,7 +68,7 @@ model.do() model.testNbResults(Partition_2, 1) model.testNbSubResults(Partition_2, [10]) model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [10]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [85]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [95]) model.testResultsVolumes(Partition_2, [146157.197962103120516985654830933]) # change radius of a circle and check partition @@ -78,7 +78,7 @@ model.do() model.testNbResults(Partition_2, 1) model.testNbSubResults(Partition_2, [11]) model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [11]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [86]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [98]) model.testResultsVolumes(Partition_2, [156418.58182917608064599335193634]) # check naming diff --git a/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid3.py b/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid3.py index a466e5e96..c6673117d 100644 --- a/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid3.py +++ b/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithCompSolid3.py @@ -47,7 +47,7 @@ model.do() model.testNbResults(Partition_2, 1) model.testNbSubResults(Partition_2, [9]) model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [9]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [61]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [63]) model.testResultsVolumes(Partition_2, [82157.197962205173098482191562653]) # change box height and check partition @@ -57,7 +57,7 @@ model.do() model.testNbResults(Partition_2, 1) model.testNbSubResults(Partition_2, [10]) model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [10]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [75]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [81]) model.testResultsVolumes(Partition_2, [146157.197962133242981508374214172]) # update extrusion and check partition @@ -68,7 +68,7 @@ model.do() model.testNbResults(Partition_2, 1) model.testNbSubResults(Partition_2, [11]) model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [11]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [89]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [99]) model.testResultsVolumes(Partition_2, [146157.197962085192557424306869507]) # change radius of a circle and check partition @@ -78,7 +78,7 @@ model.do() model.testNbResults(Partition_2, 1) model.testNbSubResults(Partition_2, [11]) model.testNbSubShapes(Partition_2, GeomAPI_Shape.SOLID, [11]) -model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [86]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.FACE, [98]) model.testResultsVolumes(Partition_2, [156418.581829176022438332438468933]) # check naming diff --git a/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithSolid5.py b/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithSolid5.py index 9ecd4ed69..df68837af 100644 --- a/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithSolid5.py +++ b/src/FeaturesPlugin/Test/TestPartitionSubCompsolidWithSolid5.py @@ -53,7 +53,7 @@ model.do() model.testNbResults(Partition_1, 1) model.testNbSubResults(Partition_1, [6]) model.testNbSubShapes(Partition_1, GeomAPI_Shape.SOLID, [6]) -model.testNbSubShapes(Partition_1, GeomAPI_Shape.FACE, [43]) +model.testNbSubShapes(Partition_1, GeomAPI_Shape.FACE, [41]) model.testResultsVolumes(Partition_1, [138456.153365848527755588293075562]) # update extrusion and check partition @@ -64,7 +64,7 @@ model.do() model.testNbResults(Partition_1, 1) model.testNbSubResults(Partition_1, [6]) model.testNbSubShapes(Partition_1, GeomAPI_Shape.SOLID, [6]) -model.testNbSubShapes(Partition_1, GeomAPI_Shape.FACE, [47]) +model.testNbSubShapes(Partition_1, GeomAPI_Shape.FACE, [43]) model.testResultsVolumes(Partition_1, [138456.153365848527755588293075562]) # change radius of a circle and check partition -- 2.39.2