Unused solids of the first compsolid are kept untoushed now.
}
}
-bool cutUnusedSubs(CompsolidSubs& theObjects, CompsolidSubs& theNotUsed,
- std::shared_ptr<GeomAlgoAPI_MakeShapeList>& theMakeShapeList,
- std::string& theError)
+static bool cutSubs(const GeomShapePtr& theFirstArgument,
+ CompsolidSubs& theSubsToCut,
+ const ListOfShape& theTools,
+ std::shared_ptr<GeomAlgoAPI_MakeShapeList>& theMakeShapeList,
+ std::string& theError)
{
+ if (theTools.empty())
+ return true;
+
std::shared_ptr<GeomAlgoAPI_MakeShape> 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<GeomAlgoAPI_MakeShapeList>& 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<GeomAlgoAPI_MakeShape>& theAlgo, std::string& theError)
{
if (!theAlgo->isDone()) {
# 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
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])
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
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
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
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
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
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
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
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
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
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
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
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