- if (aNbPB<2) {
- nSp=nE;
- if (aNbPB) {
- const BOPTools_PaveBlock& aPB=aLPB.First();
- nSp=aPB.Edge();
- }
- const TopoDS_Shape& aSp=aDS.Shape(nSp);
- //
- aState=aDS.GetState(nSp);
- if (aState==BooleanOperations_IN) {
- myLSIN.Append(aF1);
- }
- else if (aState==BooleanOperations_OUT) {
- myLSOUT.Append(aF1);
- }
- else if (aState==BooleanOperations_ON) {
- Standard_Real aTol;
- TopAbs_State aSt;
- //
- //const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape((iRank1==myRank)? nF2 : nF1));
- //aTol=BRep_Tool::Tolerance(aF2);
- aTol=1.e-7;
- //
- BOPTools_Tools3D::PointNearEdge(aE, aF1, aP2D, aP3D);
- const TopoDS_Solid& aRefSolid=(myRank==1) ?
- TopoDS::Solid(aDS.Tool()) : TopoDS::Solid(aDS.Object());
- //
- BOPTools_PaveFiller* pPF=(BOPTools_PaveFiller*)& aPaveFiller;
- IntTools_Context& aCtx=pPF->ChangeContext();
- //
- BRepClass3d_SolidClassifier& aSC=aCtx.SolidClassifier(aRefSolid);
- aSC.Perform(aP3D, aTol);
- aSt=aSC.State();
- if (aSt==TopAbs_IN) {
- myLSIN.Append(aF1);
- }
- else if (aSt==TopAbs_OUT) {
- myLSOUT.Append(aF1);
- }
- }
- break;
- } // if (aNbPB<2) {
- } //for (; anExp.More(); anExp.Next())
- }
-}
-//=======================================================================
-// function: DetectSDFaces
-// purpose:
-//=======================================================================
-void GEOMAlgo_ShellSolid::DetectSDFaces()
-{
- const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
- BOPTools_InterferencePool* pIntrPool=(BOPTools_InterferencePool*)&myDSFiller->InterfPool();
- BOPTools_CArray1OfSSInterference& aFFs=pIntrPool->SSInterferences();
- //
- Standard_Boolean bFlag;
- Standard_Integer i, aNb, nF1, nF2, iZone, aNbSps, iSenseFlag;
- gp_Dir aDNF1, aDNF2;
-
- aNb=aFFs.Extent();
- for (i=1; i<=aNb; i++) {
- bFlag=Standard_False;
-
- BOPTools_SSInterference& aFF=aFFs(i);
-
- nF1=aFF.Index1();
- nF2=aFF.Index2();
- const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1));
- const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape(nF2));
- //
- // iSenseFlag;
- const BOPTools_ListOfPaveBlock& aLPB=aFF.PaveBlocks();
- aNbSps=aLPB.Extent();
-
- if (!aNbSps) {
- continue;
- }
-
- const BOPTools_PaveBlock& aPB=aLPB.First();
- const TopoDS_Edge& aSpE=TopoDS::Edge(aDS.Shape(aPB.Edge()));
-
- BOPTools_Tools3D::GetNormalToFaceOnEdge (aSpE, aF1, aDNF1);
- BOPTools_Tools3D::GetNormalToFaceOnEdge (aSpE, aF2, aDNF2);
- iSenseFlag=BOPTools_Tools3D::SenseFlag (aDNF1, aDNF2);
- //
- if (iSenseFlag==1 || iSenseFlag==-1) {
- //
- //
- TopoDS_Face aF1FWD=aF1;
- aF1FWD.Orientation (TopAbs_FORWARD);
-
- BOP_WireEdgeSet aWES (aF1FWD);
- BOP_SDFWESFiller aWESFiller(nF1, nF2, *myDSFiller);
- aWESFiller.SetSenseFlag(iSenseFlag);
- aWESFiller.SetOperation(BOP_COMMON);
- aWESFiller.Do(aWES);
-
- BOP_FaceBuilder aFB;
- aFB.Do(aWES);
- const TopTools_ListOfShape& aLF=aFB.NewFaces();
-
- iZone=0;
- TopTools_ListIteratorOfListOfShape anIt(aLF);
- for (; anIt.More(); anIt.Next()) {
- const TopoDS_Shape& aFR=anIt.Value();
-
- if (aFR.ShapeType()==TopAbs_FACE) {
- const TopoDS_Face& aFaceResult=TopoDS::Face(aFR);
- //
- Standard_Boolean bIsValidIn2D, bNegativeFlag;
- bIsValidIn2D=BOPTools_Tools3D::IsValidArea (aFaceResult, bNegativeFlag);
- if (bIsValidIn2D) {
- //if(CheckSameDomainFaceInside(aFaceResult, aF2)) {
- iZone=1;
- break;
- //}
- }
- //
- }