-//function : BuildBndBox
-//purpose :
-//=======================================================================
-void BOPAlgo_Builder::BuildBndBox(const Standard_Integer theIndex,
- Bnd_Box& aBoxS)
-{
- Standard_Boolean bIsOpenBox;
- Standard_Integer nSh, nFc;
- Standard_Real aTolS, aTolFc;
- TopAbs_State aState;
- BOPCol_ListIteratorOfListOfInteger aItLI, aItLI1;
- //
- const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(theIndex);
- const TopoDS_Shape& aS=aSI.Shape();
- const TopoDS_Solid& aSolid=(*(TopoDS_Solid*)(&aS));
- //
- bIsOpenBox=Standard_False;
- //
- aTolS=0.;
- const BOPCol_ListOfInteger& aLISh=aSI.SubShapes();
- aItLI.Initialize(aLISh);
- for (; aItLI.More(); aItLI.Next()) {
- nSh=aItLI.Value();
- const BOPDS_ShapeInfo& aSISh=myDS->ShapeInfo(nSh);
- if (aSISh.ShapeType()!=TopAbs_SHELL) {
- continue;
- }
- //
- const BOPCol_ListOfInteger& aLIFc=aSISh.SubShapes();
- aItLI1.Initialize(aLIFc);
- for (; aItLI1.More(); aItLI1.Next()) {
- nFc=aItLI1.Value();
- const BOPDS_ShapeInfo& aSIFc=myDS->ShapeInfo(nFc);
- if (aSIFc.ShapeType()!=TopAbs_FACE) {
- continue;
- }
- //
- const Bnd_Box& aBFc=aSIFc.Box();
- aBoxS.Add(aBFc);
- //
- if (!bIsOpenBox) {
- bIsOpenBox=(aBFc.IsOpenXmin() || aBFc.IsOpenXmax() ||
- aBFc.IsOpenYmin() || aBFc.IsOpenYmax() ||
- aBFc.IsOpenZmin() || aBFc.IsOpenZmax());
- if (bIsOpenBox) {
- break;
- }
- }
- //
- const TopoDS_Face& aFc=*((TopoDS_Face*)&aSIFc.Shape());
- aTolFc=BRep_Tool::Tolerance(aFc);
- if (aTolFc>aTolS) {
- aTolS=aTolFc;
- }
- }//for (; aItLI1.More(); aItLI1.Next()) {
- if (bIsOpenBox) {
- break;
- }
- //
- const TopoDS_Shell& aSh=*((TopoDS_Shell*)&aSISh.Shape());
- bIsOpenBox=IsClosedShell(aSh);
- if (bIsOpenBox) {
- break;
- }
- }//for (; aItLI.More(); aItLI.Next()) {
- //
- if (bIsOpenBox) {
- aBoxS.SetWhole();
- }
- else {
- BRepClass3d_SolidClassifier& aSC=myContext->SolidClassifier(aSolid);
- aSC.PerformInfinitePoint(aTolS);
- aState=aSC.State();
- if (aState==TopAbs_IN) {
- aBoxS.SetWhole();
- }
- }
-}
-//=======================================================================