Salome HOME
0023450: Fields are not displayed in GEOM
[modules/geom.git] / src / GEOMAlgo / GEOMAlgo_ShellSolid.cxx
index b40fef88766484c891389e5874ccc1c0c13949dc..942538773cdfc2b0386b5e4a6251862889f82fb4 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 #include <TopTools_ListIteratorOfListOfShape.hxx>
 #include <TopExp_Explorer.hxx>
 
-#include <BRepClass3d_SolidClassifier.hxx>
+#include <BOPTools_AlgoTools.hxx>
 
+#include <BOPCol_DataMapOfShapeListOfShape.hxx>
+#include <BOPCol_ListOfShape.hxx>
 #include <IntTools_Context.hxx>
-#include <BOPTColStd_Dump.hxx>
-#include <BooleanOperations_ShapesDataStructure.hxx>
+#include <BOPDS_DS.hxx>
+#include <BOPAlgo_Builder.hxx>
 
-#include <BOPTools_PaveFiller.hxx>
-#include <BOPTools_SolidStateFiller.hxx>
-#include <BOPTools_PCurveMaker.hxx>
-#include <BOPTools_DEProcessor.hxx>
-#include <BOPTools_InterferencePool.hxx>
-#include <BOPTools_CArray1OfSSInterference.hxx>
-#include <BOPTools_ListOfPaveBlock.hxx>
-#include <BOPTools_ListIteratorOfListOfPaveBlock.hxx>
-#include <BOPTools_PaveBlock.hxx>
-#include <BOPTools_SSInterference.hxx>
-#include <BOPTools_SequenceOfCurves.hxx>
-#include <BOPTools_Curve.hxx>
-#include <BOPTools_PaveFiller.hxx>
-#include <BOPTools_SplitShapesPool.hxx>
-#include <BOPTools_Tools3D.hxx>
-#include <BOPTools_DSFiller.hxx>
+#include <GEOMAlgo_AlgoTools.hxx>
+/////////////////////////////////////////////////////////////////////////
+//=======================================================================
+//class : GEOMAlgo_ShellSolidBuilder
+//purpose  : 
+//=======================================================================
+class GEOMAlgo_ShellSolidBuilder : public BOPAlgo_Builder {
+ public:
+  Standard_EXPORT
+    GEOMAlgo_ShellSolidBuilder();
 
-#include <BOP_WireEdgeSet.hxx>
-#include <BOP_SDFWESFiller.hxx>
-#include <BOP_FaceBuilder.hxx>
+  Standard_EXPORT
+    virtual ~GEOMAlgo_ShellSolidBuilder();
 
+ protected:
+  Standard_EXPORT
+    virtual void PerformInternal(const BOPAlgo_PaveFiller& theFiller);
+};
+
+//=======================================================================
+//function : GEOMAlgo_ShellSolidBuilder
+//purpose  : 
+//=======================================================================
+GEOMAlgo_ShellSolidBuilder::GEOMAlgo_ShellSolidBuilder()
+:
+  BOPAlgo_Builder()
+{
+}
+//=======================================================================
+//function : ~GEOMAlgo_ShellSolidBuilder
+//purpose  : 
+//=======================================================================
+GEOMAlgo_ShellSolidBuilder::~GEOMAlgo_ShellSolidBuilder()
+{
+}
+//=======================================================================
+//function : PerformInternal
+//purpose  : 
+//=======================================================================
+void GEOMAlgo_ShellSolidBuilder::PerformInternal(const BOPAlgo_PaveFiller& theFiller)
+{
+   //
+  myPaveFiller=(BOPAlgo_PaveFiller*)&theFiller;
+  myDS=myPaveFiller->PDS();
+  myContext=myPaveFiller->Context();
+  //
+  // 1. CheckData
+  CheckData();
+  if (HasErrors()) {
+    return;
+  }
+  //
+  // 2. Prepare
+  Prepare();
+  if (HasErrors()) {
+    return;
+  }
+  //
+  // 3. Fill Images
+  // 3.1 Vertice
+  FillImagesVertices();
+  if (HasErrors()) {
+    return;
+  }
+  //
+  BuildResult(TopAbs_VERTEX);
+  if (HasErrors()) {
+    return;
+  }
+  // 3.2 Edges
+  FillImagesEdges();
+  if (HasErrors()) {
+    return;
+  }
+  //
+  BuildResult(TopAbs_EDGE);
+  if (HasErrors()) {
+    return;
+  } 
+  //
+  // 3.3 Wires
+  FillImagesContainers(TopAbs_WIRE);
+  if (HasErrors()) {
+    return;
+  }
+  //
+  BuildResult(TopAbs_WIRE);
+  if (HasErrors()) {
+    return;
+  }
+  
+  // 3.4 Faces
+  FillImagesFaces();
+  if (HasErrors()) {
+    return;
+  }
+  //
+  BuildResult(TopAbs_FACE);
+  if (HasErrors()) {
+    return;
+  }
+}
+/////////////////////////////////////////////////////////////////////////
 //=======================================================================
 //function : GEOMAlgo_ShellSolid
 //purpose  :
@@ -95,277 +179,128 @@ GEOMAlgo_ShellSolid::~GEOMAlgo_ShellSolid()
 //=======================================================================
 void GEOMAlgo_ShellSolid::Perform()
 {
-  myErrorStatus=0;
   //
   try {
+    Standard_Integer aNbArgs, iRank, iErr, iBeg, iEnd, i, aNbSp;
+    Standard_Real aTol;
+    TopAbs_ShapeEnum aType;
+    TopAbs_State aState;
+    gp_Pnt aP;
+    gp_Pnt2d aP2D;
+    TopoDS_Face aF;
+    //
+    myLSIN.Clear();
+    myLSOUT.Clear();
+    myLSON.Clear();
+    //
+    aTol=1.e-7;
+    //
     if (myDSFiller==NULL) {
       myErrorStatus=10;
       return;
     }
-    if(!myDSFiller->IsDone()) {
+    if(myDSFiller->HasErrors()) {
       myErrorStatus=11;
       return;
     }
     //
-    Standard_Boolean bIsNewFiller;
+    const BOPDS_DS& aDS=myDSFiller->DS();
+    BOPDS_DS* pDS=(BOPDS_DS*)&aDS;
+    const BOPCol_ListOfShape& aLS=pDS->Arguments();
     //
-    bIsNewFiller=myDSFiller->IsNewFiller();
-    if (bIsNewFiller) {
-      Prepare();
-      myDSFiller->SetNewFiller(!bIsNewFiller);
-    }
-    //
-    myRank=(myDSFiller->DS().Object().ShapeType()==TopAbs_SHELL) ? 1 : 2;
-    BuildResult();
-  }
-  catch (Standard_Failure) {
-    myErrorStatus=12;
-  }
-}
-//=======================================================================
-// function: Prepare
-// purpose:
-//=======================================================================
-void GEOMAlgo_ShellSolid::Prepare()
-{
-  const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
-  //
-  // 1 States
-  BOPTools_SolidStateFiller aStateFiller(aPaveFiller);
-  aStateFiller.Do();
-  //
-  // 2 Project section edges on corresp. faces -> P-Curves on edges.
-  BOPTools_PCurveMaker aPCurveMaker(aPaveFiller);
-  aPCurveMaker.Do();
-  //
-  // 3. Degenerated Edges Processing
-  BOPTools_DEProcessor aDEProcessor(aPaveFiller);
-  aDEProcessor.Do();
-  //
-  // 4. Detect Same Domain Faces
-  DetectSDFaces();
-}
-//=================================================================================
-// function: BuildResult
-// purpose:
-//=================================================================================
-void GEOMAlgo_ShellSolid::BuildResult()
-{
-  Standard_Boolean bIsTouchCase;
-  Standard_Integer i, j, nF1, nF2, aNbFFs, aNbS, aNbCurves, nSp, iRank1;
-  Standard_Integer nE, nF, aNbPB, iBeg, iEnd;
-  BooleanOperations_StateOfShape aState;
-  TopExp_Explorer anExp;
-  TopAbs_ShapeEnum aType;
-  gp_Pnt2d aP2D;
-  gp_Pnt aP3D;
-  //
-  const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS();
-  const BOPTools_InterferencePool& anInterfPool=myDSFiller->InterfPool();
-  BOPTools_InterferencePool* pInterfPool=(BOPTools_InterferencePool*) &anInterfPool;
-  BOPTools_CArray1OfSSInterference& aFFs=pInterfPool->SSInterferences();
-  const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller();
-  const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool();
-  //
-  // 1. process pf non-interferring faces
-  iBeg=1;
-  iEnd=aDS.NumberOfShapesOfTheObject();
-  if (myRank==2) {
-    iBeg=iEnd+1;
-    iEnd=aDS.NumberOfSourceShapes();
-  }
-  //
-  for (i=iBeg; i<=iEnd; ++i) {
-    aType=aDS.GetShapeType(i);
-    if (aType!=TopAbs_FACE) {
-      continue;
+    aNbArgs=aLS.Extent();
+    if (aNbArgs!=2) {
+      myErrorStatus=13;
+      return;
     }
     //
-    const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(i));
-    aState=aDS.GetState(i);
-    if (aState==BooleanOperations_IN) {
-      myLSIN.Append(aF1);
+    iRank=-1;
+    const TopoDS_Shape& aObj=aLS.First();
+    if (aObj.ShapeType()==TopAbs_SHELL) {
+      iRank=0;
     }
-    else if (aState==BooleanOperations_OUT) {
-      myLSOUT.Append(aF1);
+    const TopoDS_Shape& aTool=aLS.Last();
+    if (aTool.ShapeType()==TopAbs_SHELL) {
+      iRank=1;
     }
-  }
-  //
-  // 2. process pf interferred faces
-  aNbFFs=aFFs.Extent();
-  for (i=1; i<=aNbFFs; ++i) {
-    BOPTools_SSInterference& aFFi=aFFs(i);
     //
-    nF1=aFFi.Index1();
-    nF2=aFFi.Index2();
-    iRank1=aDS.Rank(nF1);
-    nF=(iRank1==myRank) ? nF1 : nF2;
-    const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF));
+    if (iRank==-1) {
+      myErrorStatus=14;
+      return;
+    }
     //
-    bIsTouchCase=aFFi.IsTangentFaces();
+    Handle(IntTools_Context) aCtx=myDSFiller->Context();
+    const BOPDS_IndexRange& aRange=pDS->Range(iRank);
+    aRange.Indices(iBeg, iEnd);
+    const TopoDS_Solid& aSolid=(!iRank) ? *((TopoDS_Solid*)&aTool) : *((TopoDS_Solid*)&aObj);
+    //BRepClass3d_SolidClassifier& aSC=aCtx->SolidClassifier(aSolid);
     //
-    if (bIsTouchCase) {
-      myLSON.Append(aF1);
-      continue;
-    }
+    //------------------------------ShellSolidBuilder
+    GEOMAlgo_ShellSolidBuilder aSSB;
     //
-    // Has section edges ?
-    aNbS=0;
-    BOPTools_SequenceOfCurves& aBCurves=aFFi.Curves();
-    aNbCurves=aBCurves.Length();
-    for (j=1; j<=aNbCurves; j++) {
-      BOPTools_Curve& aBC=aBCurves(j);
-      const BOPTools_ListOfPaveBlock& aSectEdges=aBC.NewPaveBlocks();
-      aNbS=aSectEdges.Extent();
-      if (aNbS) {
-        break;
-      }
+    aSSB.PerformWithFiller(*myDSFiller);
+    iErr=aSSB.HasErrors();
+    if (iErr) {
+      myErrorStatus=15;
+      return;
     }
     //
-    if (aNbS) { // it has
-      continue;
-    }
+    const BOPCol_DataMapOfShapeListOfShape& aImages=aSSB.Images();
     //
-    anExp.Init(aF1, TopAbs_EDGE);
-    for (; anExp.More(); anExp.Next()) {
-      const TopoDS_Edge& aE=TopoDS::Edge(anExp.Current());
-      if (BRep_Tool::Degenerated(aE)) {
+    //-------------------------------
+    for (i=iBeg; i<=iEnd; ++i) {
+      const TopoDS_Shape& aS=pDS->Shape(i);
+      aType=aS.ShapeType();
+      if (aType!=TopAbs_FACE) {
         continue;
       }
       //
-      nE=aDS.ShapeIndex(aE, myRank);
-      const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(nE));
-      aNbPB=aLPB.Extent();
+      aState=TopAbs_UNKNOWN;
+      aF=*((TopoDS_Face*)&aS);
       //
-      if (aNbPB<2) {
-        nSp=nE;
-        if (aNbPB) {
-          const BOPTools_PaveBlock& aPB=aLPB.First();
-          nSp=aPB.Edge();
+      if (!aImages.IsBound(aS)) {
+        iErr=GEOMAlgo_AlgoTools::PntInFace(aF, aP, aP2D);
+        if (iErr) {
+          myErrorStatus=16;
+          return;
         }
-        /*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);
+        aState=BOPTools_AlgoTools::ComputeState(aP, aSolid, aTol, aCtx);
+      }
+      else {
+        const BOPCol_ListOfShape& aLSp=aImages.Find(aS);
+        aNbSp=aLSp.Extent();
+        if (aNbSp>0) {
+          continue;
         }
-        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;
-          const Handle(IntTools_Context)& aCtx=pPF->Context();
-          //
-          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);
-          }
+        //
+        if (aNbSp==1) {
+          aF=*((TopoDS_Face*)&aLSp.First());
         }
-        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;
-            //}
-          }
-          //
+        //
+        iErr=GEOMAlgo_AlgoTools::PntInFace(aF, aP, aP2D);
+        if (iErr) {
+          myErrorStatus=16;
+          return;
         }
+        //
+        aState=BOPTools_AlgoTools::ComputeState(aP, aSolid, aTol, aCtx);
       }
-
-      if (iZone) {
-        bFlag=Standard_True;
-        aFF.SetStatesMap(aWESFiller.StatesMap());
+      //----------
+      if (aState==TopAbs_ON) {
+        myLSON.Append(aF);
       }
-
-    }// if (iSenseFlag)
-
-  aFF.SetTangentFacesFlag(bFlag);
-  aFF.SetSenseFlag (iSenseFlag);
-  }// end of for (i=1; i<=aNb; i++)
+      else if (aState==TopAbs_OUT) {
+        myLSOUT.Append(aF);
+      }
+      else if (aState==TopAbs_IN) {
+        myLSIN.Append(aF);
+      } 
+      //----------
+    }//for (i=iBeg; i<=iEnd; ++i) {
+    
+  }// try
+  catch (Standard_Failure) {
+    myErrorStatus=12;
+  }
 }