X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMAlgo%2FGEOMAlgo_ShellSolid.cxx;h=942538773cdfc2b0386b5e4a6251862889f82fb4;hb=47e260a9746423b69d6f29e941c845d851da64c7;hp=b40fef88766484c891389e5874ccc1c0c13949dc;hpb=5b3622aa2363853841fd5b4205c78a715bfee4a4;p=modules%2Fgeom.git diff --git a/src/GEOMAlgo/GEOMAlgo_ShellSolid.cxx b/src/GEOMAlgo/GEOMAlgo_ShellSolid.cxx index b40fef887..942538773 100644 --- a/src/GEOMAlgo/GEOMAlgo_ShellSolid.cxx +++ b/src/GEOMAlgo/GEOMAlgo_ShellSolid.cxx @@ -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 @@ -46,33 +46,117 @@ #include #include -#include +#include +#include +#include #include -#include -#include +#include +#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +///////////////////////////////////////////////////////////////////////// +//======================================================================= +//class : GEOMAlgo_ShellSolidBuilder +//purpose : +//======================================================================= +class GEOMAlgo_ShellSolidBuilder : public BOPAlgo_Builder { + public: + Standard_EXPORT + GEOMAlgo_ShellSolidBuilder(); -#include -#include -#include + 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; + } }