X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMAlgo%2FGEOMAlgo_WireSolid.cxx;h=958d4270f954a94d5dbfd347d9c200caed2e77e3;hb=50dba628d88fa6cf56d507247f289db5ed4fc07e;hp=3acfda53cc1bf9b38396a5b1153db79c6501365c;hpb=73555c78ebf12a1fdb85157b8e7934ad566ae90a;p=modules%2Fgeom.git diff --git a/src/GEOMAlgo/GEOMAlgo_WireSolid.cxx b/src/GEOMAlgo/GEOMAlgo_WireSolid.cxx index 3acfda53c..958d4270f 100644 --- a/src/GEOMAlgo/GEOMAlgo_WireSolid.cxx +++ b/src/GEOMAlgo/GEOMAlgo_WireSolid.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 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 @@ -27,23 +27,29 @@ // #include +#include + #include #include #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 @@ -74,19 +80,21 @@ 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(); } // @@ -95,78 +103,110 @@ void GEOMAlgo_WireSolid::Perform() } } //======================================================================= -// function: Prepare -// purpose: -//======================================================================= -void GEOMAlgo_WireSolid::Prepare() -{ - const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller(); - // - BOPTools_WireStateFiller aStateFiller(aPaveFiller); - aStateFiller.Do(); - // -} -//======================================================================= // function: BuildResult // 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 OCC_VERSION_LARGE > 0x06060000 // Porting to OCCT higher 6.6.0 version + if (pDS->IsCommonBlock(aPB)) { +#else + if (aPB->IsCommonBlock()) { +#endif + 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); } } }