bool SolidTrimSolid(const TopoDS_Solid& solidPos, const TopoDS_Solid& desSolid, std::vector& resultShapes) { TopoDS_Shape resultShape; bool bPosEmpty = true, bNegEmpty = true; TopTools_IndexedMapOfShape M; int i; resultShapes.clear(); try { BOPTools_DSFiller aDF; aDF.SetShapes (desSolid, solidPos); if (!aDF.IsDone()) return false; aDF.Perform(); if(!aDF.IsDone()) return false; BRepAlgoAPI_Common aBCm(desSolid, solidPos, aDF); if (!aBCm.IsDone()) return false; resultShape=aBCm.Shape(); if(resultShape.ShapeType()==TopAbs_COMPOUND) { for(TopoDS_Iterator iter(resultShape); iter.More(); iter.Next()) { resultShapes.push_back(iter.Value()); bPosEmpty = false; } } else { resultShapes.push_back(resultShape); bPosEmpty = false; } BRepAlgoAPI_Cut aBCt(desSolid, solidPos, aDF); if (!aBCt.IsDone()) return false; resultShape=aBCt.Shape(); if(resultShape.ShapeType()==TopAbs_COMPOUND) { for(TopoDS_Iterator iter(resultShape); iter.More(); iter.Next()) { resultShapes.push_back(iter.Value()); bNegEmpty = false; } } else { resultShapes.push_back(resultShape); bNegEmpty = false; } } catch (...) { resultShapes.clear(); return false; } return !resultShapes.empty(); }