X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMAlgo%2FGEOMAlgo_WireSolid.cxx;h=0f65ecc5012892d3c2cb690427505e23c0c970b5;hb=8370b4a1c488f6ef18d8944869d6a8cd3a2d18d2;hp=306fe56be35ec528ac638dab167ce233f59a40d7;hpb=a62a321c849518376e3aa4d24a0b902a24167c64;p=modules%2Fgeom.git diff --git a/src/GEOMAlgo/GEOMAlgo_WireSolid.cxx b/src/GEOMAlgo/GEOMAlgo_WireSolid.cxx index 306fe56be..0f65ecc50 100644 --- a/src/GEOMAlgo/GEOMAlgo_WireSolid.cxx +++ b/src/GEOMAlgo/GEOMAlgo_WireSolid.cxx @@ -1,29 +1,33 @@ -// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// 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 -// +// // 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. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// License as published by the Free Software Foundation; either +// 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 +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File: GEOMAlgo_WireSolid.cxx -// Created: Wed Jan 12 10:19:31 2005 -// Author: Peter KURNEV -// +// File: GEOMAlgo_WireSolid.cxx +// Created: Wed Jan 12 10:19:31 2005 +// Author: Peter KURNEV +// +// +#include -#include +#include #include @@ -31,37 +35,41 @@ #include -#include - -#include -#include +#include +#include +#include +#include +#include +#if OCC_VERSION_LARGE > 0x06070100 +#include +#else +#include +#endif +#include +#include +#include -#include -#include -#include -#include -#include -#include +#include //======================================================================= //function : GEOMAlgo_WireSolid -//purpose : +//purpose : //======================================================================= GEOMAlgo_WireSolid::GEOMAlgo_WireSolid() -: +: GEOMAlgo_ShapeSolid() { } //======================================================================= //function : ~ -//purpose : +//purpose : //======================================================================= GEOMAlgo_WireSolid::~GEOMAlgo_WireSolid() { } //======================================================================= // function: Perform -// purpose: +// purpose: //======================================================================= void GEOMAlgo_WireSolid::Perform() { @@ -72,99 +80,129 @@ void GEOMAlgo_WireSolid::Perform() myErrorStatus=10; return; } - if(!myDSFiller->IsDone()) { + if(myDSFiller->ErrorStatus()) { myErrorStatus=11; return; } // - Standard_Boolean bIsNewFiller; + Standard_Integer aNbArgs; // - bIsNewFiller=myDSFiller->IsNewFiller(); - - if (bIsNewFiller) { - Prepare(); - myDSFiller->SetNewFiller(!bIsNewFiller); + const BOPDS_DS& aDS=myDSFiller->DS(); + const BOPCol_ListOfShape& aLS=aDS.Arguments(); + aNbArgs=aLS.Extent(); + if (!aNbArgs) { + myErrorStatus=13; + return; } + // BuildResult(); } // catch (Standard_Failure) { myErrorStatus= 12; } -} -//======================================================================= -// function: Prepare -// purpose: -//======================================================================= -void GEOMAlgo_WireSolid::Prepare() -{ - const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller(); - // - BOPTools_WireStateFiller aStateFiller(aPaveFiller); - aStateFiller.Do(); - // } //======================================================================= // function: BuildResult -// purpose: +// purpose: //======================================================================= void GEOMAlgo_WireSolid::BuildResult() { - const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); - const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller(); - const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool(); - // - Standard_Integer i, aNbPB, nSp, iBeg, iEnd; + Standard_Boolean bHasPaveBlocks; + Standard_Integer i, iRank, aNbPB, iBeg, iEnd, aNbArgs, nE;// nSp + Standard_Real aTol; TopAbs_ShapeEnum aType; - BooleanOperations_StateOfShape aState; + TopAbs_State aState; + TopoDS_Edge aE; // + myErrorStatus=0; myLSIN.Clear(); myLSOUT.Clear(); myLSON.Clear(); // - iBeg=1; - iEnd=aDS.NumberOfShapesOfTheObject(); - if (aDS.Tool().ShapeType()==TopAbs_WIRE) { - iBeg=iEnd+1; - iEnd=aDS.NumberOfSourceShapes(); + const BOPDS_DS& aDS=myDSFiller->DS(); + BOPDS_DS* pDS=(BOPDS_DS*)&aDS; + // + const BOPCol_ListOfShape& aLS=pDS->Arguments(); + aNbArgs=aLS.Extent(); + if (aNbArgs!=2) { + myErrorStatus=14; + return; + } + // + iRank=-1; + const TopoDS_Shape& aObj=aLS.First(); + if (aObj.ShapeType()==TopAbs_WIRE) { + iRank=0; + } + const TopoDS_Shape& aTool=aLS.Last(); + if (aTool.ShapeType()==TopAbs_WIRE) { + iRank=1; } // + if (iRank==-1) { + myErrorStatus=15; + return; + } + // + aTol=1.e-7; + // + const TopoDS_Solid& aSolid=(iRank==0) ? *((TopoDS_Solid*)&aTool) : + *((TopoDS_Solid*)&aObj); + // +#if OCC_VERSION_LARGE > 0x06070100 + Handle(IntTools_Context) aCtx=myDSFiller->Context(); +#else + Handle(BOPInt_Context) aCtx=myDSFiller->Context(); +#endif + //BRepClass3d_SolidClassifier& aSC=aCtx->SolidClassifier(aSolid); + // + const BOPDS_IndexRange& aRange=pDS->Range(iRank); + aRange.Indices(iBeg, iEnd); + // for (i=iBeg; i<=iEnd; ++i) { - aType=aDS.GetShapeType(i); - if (aType==TopAbs_EDGE) { - const TopoDS_Shape& aE=aDS.Shape(i); - const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(i)); - aNbPB=aLPB.Extent(); - // - if (!aNbPB) { - aState=aDS.GetState(i); - // - if (aState==BooleanOperations_IN) { - myLSIN.Append(aE); - } - else if (aState==BooleanOperations_OUT) { - myLSOUT.Append(aE); - } - else if (aState==BooleanOperations_ON) { - myLSON.Append(aE); - } + const TopoDS_Shape& aS=pDS->Shape(i); + aType=aS.ShapeType(); + if (aType!=TopAbs_EDGE) { + continue; + } + // + aE=*((TopoDS_Edge*)&pDS->Shape(i)); + if (BRep_Tool::Degenerated(aE)) { + continue; + } + // + bHasPaveBlocks=pDS->HasPaveBlocks(i); + if (!bHasPaveBlocks) { + continue; + } + // + aState=TopAbs_UNKNOWN; + // + const BOPDS_ListOfPaveBlock& aLPB=pDS->PaveBlocks(i); + aNbPB=aLPB.Extent(); + if (!aNbPB) { + aState=BOPTools_AlgoTools::ComputeStateByOnePoint(aE, aSolid, aTol, aCtx); + } + else if (aNbPB==1) { + const Handle(BOPDS_PaveBlock)& aPB=aLPB.First(); + if (pDS->IsCommonBlock(aPB)) { + aState=TopAbs_ON; + } + else{ + nE=aPB->Edge(); + aE=*((TopoDS_Edge*)&pDS->Shape(nE)); + aState=BOPTools_AlgoTools::ComputeStateByOnePoint(aE, aSolid, aTol, aCtx); + } + //---------- + if (aState==TopAbs_ON) { + myLSON.Append(aE); + } + else if (aState==TopAbs_OUT) { + myLSOUT.Append(aE); } - // - else if (aNbPB==1) { - 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(aE); - } - else if (aState==BooleanOperations_OUT) { - myLSOUT.Append(aE); - } - else if (aState==BooleanOperations_ON) { - myLSON.Append(aE); - } + else if (aState==TopAbs_IN) { + myLSIN.Append(aE); } } }