X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FNMTTools%2FNMTTools_PaveFiller_6.cxx;h=3f897dedd64dbd544f1acccd5f85bb69e0c7980a;hb=08a90cb03f6d2befe6f0b923bd690182ded48378;hp=e9bae0c1ae9a3a47317f2e1a82eebe6de96c8775;hpb=a62a321c849518376e3aa4d24a0b902a24167c64;p=modules%2Fgeom.git diff --git a/src/NMTTools/NMTTools_PaveFiller_6.cxx b/src/NMTTools/NMTTools_PaveFiller_6.cxx index e9bae0c1a..3f897dedd 100644 --- a/src/NMTTools/NMTTools_PaveFiller_6.cxx +++ b/src/NMTTools/NMTTools_PaveFiller_6.cxx @@ -1,51 +1,69 @@ -// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// Copyright (C) 2007-2012 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 +// 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 +// +// 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: NMTTools_PaveFiller_6.cxx -// Created: Fri Dec 19 10:27:31 2003 -// Author: Peter KURNEV -// +// File: NMTTools_PaveFiller_6.cxx +// Created: Fri Dec 19 10:27:31 2003 +// Author: Peter KURNEV -#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 #include #include #include +#include +#include +#include #include #include @@ -59,14 +77,12 @@ #include #include #include +#include +#include #include -#include -#include -#include -#include -#include -#include +#include +#include #include #include #include @@ -75,72 +91,66 @@ #include #include #include +#include +#include +#include #include +#include + +#include #include +#include #include -#include -#include -#include -#include - -static - Standard_Boolean IsPairFound(const Standard_Integer nF1, - const Standard_Integer nF2, - BOPTools_InterferencePool* myIntrPool, - BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapWhat, - BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapWith); +#include +#include +#include +#include +#include +#include +#include +#include +#include static - void FMapWhat(const Standard_Integer nF, - BOPTools_InterferencePool* myIntrPool, - TColStd_IndexedMapOfInteger& aMapWhat); -static - void FMapWith(const Standard_Integer nF, - BOPTools_InterferencePool* myIntrPool, - TColStd_IndexedMapOfInteger& aMapWith); -static - Standard_Boolean IsFound(const TColStd_IndexedMapOfInteger& aMapWhat, - const TColStd_IndexedMapOfInteger& aMapWith); - + Standard_Boolean IsMicroEdge(const TopoDS_Edge& aE, + const Handle(IntTools_Context)& aCtx); //======================================================================= // function: PerformFF -// purpose: +// purpose: //======================================================================= - void NMTTools_PaveFiller::PerformFF() + void NMTTools_PaveFiller::PerformFF() { myIsDone=Standard_False; // - Standard_Boolean bIsFound, bJustAdd, bIsComputed; - Standard_Integer n1, n2, anIndexIn, nF1, nF2, aBlockLength, aNbFFs; Standard_Boolean bToApproxC3d, bToApproxC2dOnS1, bToApproxC2dOnS2, bIsDone; + Standard_Boolean bJustAdd, bToSplit; + Standard_Integer n1, n2, anIndexIn, nF1, nF2, aBlockLength, aNbFFs; Standard_Integer aNbCurves, aNbPoints; Standard_Real anApproxTol, aTolR3D, aTolR2D; BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger aMapWhat, aMapWith; IntTools_SequenceOfPntOn2Faces aPnts; IntTools_SequenceOfCurves aCvs; - BooleanOperations_KindOfInterference aTypeFF=BooleanOperations_SurfaceSurface; // - BOPTools_CArray1OfSSInterference& aFFs=myIntrPool->SSInterferences(); + BOPTools_CArray1OfSSInterference& aFFs=myIP->SSInterferences(); // // F/F Interferences [BooleanOperations_SurfaceSurface] - myDSIt.Initialize(TopAbs_FACE, TopAbs_FACE); + myDSIt->Initialize(TopAbs_FACE, TopAbs_FACE); // // BlockLength correction - aNbFFs=ExpectedPoolLength(); + aNbFFs=myDSIt->BlockLength(); aBlockLength=aFFs.BlockLength(); if (aNbFFs > aBlockLength) { aFFs.SetBlockLength(aNbFFs); } // - for (; myDSIt.More(); myDSIt.Next()) { - myDSIt.Current(n1, n2, bJustAdd); - // - bIsComputed=myIntrPool->IsComputed(n1, n2); - if (bIsComputed) { - continue; - } + //modified by NIZNHY-PKV Thu Sep 15 08:02:52 2011f + bToSplit=Standard_False; + //modified by NIZNHY-PKV Thu Sep 15 08:02:55 2011t + // + for (; myDSIt->More(); myDSIt->Next()) { + myDSIt->Current(n1, n2, bJustAdd); // nF1 = n2; nF2 = n1; @@ -152,22 +162,8 @@ static aPnts.Clear(); aCvs.Clear(); // - bIsFound=IsPairFound(nF1, nF2, myIntrPool, aMapWhat, aMapWith); - // - if (bJustAdd) { - if (!bIsFound) { - myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); - } - else{ - BOPTools_SSInterference anInterf (nF1, nF2, 1.e-07, 1.e-07, aCvs, aPnts); - anIndexIn=aFFs.Append(anInterf); - myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); - } - continue; - } - // - const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); - const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); + const TopoDS_Face aF1=TopoDS::Face(myDS->Shape(nF1));//mpv + const TopoDS_Face aF2=TopoDS::Face(myDS->Shape(nF2));//mpv // // FF bToApproxC3d = mySectionAttribute.Approximation(); @@ -178,22 +174,16 @@ static // IntTools_FaceFace aFF; // - aFF.SetParameters (bToApproxC3d, bToApproxC2dOnS1, - bToApproxC2dOnS2, anApproxTol); + aFF.SetParameters (bToApproxC3d, bToApproxC2dOnS1, + bToApproxC2dOnS2, anApproxTol); // aFF.Perform(aF1, aF2); // bIsDone=aFF.IsDone(); // if (!bIsDone) { - if (!bIsFound) { - myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); - } - else { - BOPTools_SSInterference anInterf (nF1, nF2, 1.e-07, 1.e-07, aCvs, aPnts); - anIndexIn=aFFs.Append(anInterf); - myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); - } + BOPTools_SSInterference anInterf (nF1, nF2, 1.e-07, 1.e-07, aCvs, aPnts); + anIndexIn=aFFs.Append(anInterf); continue; } // @@ -201,9 +191,15 @@ static aTolR2D=aFF.TolReached2d(); if (aTolR3D < 1.e-7){ aTolR3D=1.e-7; - } + } // + //modified by NIZNHY-PKV Thu Sep 15 08:03:02 2011f +#if OCC_VERSION_LARGE > 0x06050100 // For OCCT6.5.2 and higher + aFF.PrepareLines3D(bToSplit); +#else aFF.PrepareLines3D(); +#endif // OCC_VERSION_LARGE > 0x06050100 // For OCCT6.5.2 and higher + //modified by NIZNHY-PKV Thu Sep 15 08:03:04 2011t // const IntTools_SequenceOfCurves& aCvsX=aFF.Lines(); const IntTools_SequenceOfPntOn2Faces& aPntsX=aFF.Points(); @@ -214,96 +210,130 @@ static if (!aNbCurves && !aNbPoints) { BOPTools_SSInterference anInterf (nF1, nF2, 1.e-07, 1.e-07, aCvs, aPnts); anIndexIn=aFFs.Append(anInterf); - myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); continue; } // { BOPTools_SSInterference anInterf (nF1, nF2, aTolR3D, aTolR2D, aCvsX, aPntsX); anIndexIn=aFFs.Append(anInterf); - myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); } // - }// for (; myDSIt.More(); myDSIt.Next()) + }// for (; myDSIt.More(); myDSIt.Next()) // myIsDone=Standard_True; } + //======================================================================= // function: MakeBlocks -// purpose: +// purpose: //======================================================================= - void NMTTools_PaveFiller::MakeBlocks() +void NMTTools_PaveFiller::MakeBlocks() { myIsDone=Standard_False; // - Standard_Boolean bIsExistingPaveBlock, bIsValidIn2D; - Standard_Integer i, aNbFFs, nF1, nF2, aBid=0; + Standard_Boolean bIsExistingPaveBlock, bIsValidIn2D, bIsCoincided; + Standard_Boolean bIsMicroEdge, bHasES; + Standard_Integer i, aNbFFs, nF1, nF2; Standard_Integer nV1, nV2, j, aNbCurves; Standard_Real aTolR3D, aTol2D, aT1, aT2, aTolPPC=Precision::PConfusion(); + TopoDS_Face aF1, aF2; NMTTools_IndexedDataMapOfShapePaveBlock aMEPB; BooleanOperations_IndexedDataMapOfShapeInteger aMapEI; - BOPTools_ListIteratorOfListOfPaveBlock anIt; + BOPTools_ListIteratorOfListOfPaveBlock anIt; // - BOPTools_CArray1OfSSInterference& aFFs=myIntrPool->SSInterferences(); + BOPTools_CArray1OfSSInterference& aFFs=myIP->SSInterferences(); // - // 1. Produce Section Edges from intersection curves - // between each pair of faces + // + // 1. Make Section Edges from intersection curves + // between each pair of faces aNbFFs=aFFs.Extent(); + if (!aNbFFs) { + return; + } + // + FillFaceInfo(); + // for (i=1; i<=aNbFFs; ++i) { + BOPTools_ListOfPaveBlock aLPB; + TColStd_MapOfInteger aMVStick; + TopTools_ListOfShape aLSE; + TColStd_ListOfInteger aLNE; + BOPTools_PaveSet aPSF; + NMTTools_MapOfPaveBlock aMPBX; + TColStd_MapIteratorOfMapOfInteger aItMI; + NMTTools_MapIteratorOfMapOfPaveBlock aItMPB; + // BOPTools_SSInterference& aFFi=aFFs(i); - // + // // Faces aFFi.Indices(nF1, nF2); - const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); - const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); + aF1=*((TopoDS_Face*)(&myDS->Shape(nF1))); + aF2=*((TopoDS_Face*)(&myDS->Shape(nF2))); // - BOPTools_ListOfPaveBlock aLPB, aLPBC; + SharedEdges(nF1, nF2, aLNE, aLSE); + aFFi.SetSharedEdges(aLNE); // - //modified by NIZNHY-PKV Fri Mar 11 15:43:02 2005 f - { - Standard_Integer nFj1, nFj2, nE; - TColStd_IndexedMapOfInteger aMFence; - BOPTools_ListOfPaveBlock aLPBCx; - // - for (j=1; j<=aNbFFs; ++j) { - BOPTools_SSInterference& aFFj=aFFs(j); - aFFj.Indices(nFj1, nFj2); - // - if ((nF1==nFj1 && nFj2!=nF2) || - (nF1==nFj2 && nFj1!=nF2) || - (nF2==nFj1 && nFj2!=nF1) || - (nF2==nFj2 && nFj1!=nF1)) { - RealSplitsInFace (aBid, nFj1, nFj2, aLPBCx); - RealSplitsInFace (aBid, nFj2, nFj1, aLPBCx); - RealSplitsOnFace (aBid, nFj1, nFj2, aLPBCx); + // aMVStick + const NMTTools_FaceInfo& aFI1=myFaceInfo.Find(nF1); + const NMTTools_FaceInfo& aFI2=myFaceInfo.Find(nF2); + // + const TColStd_MapOfInteger& aMVOn1=aFI1.VerticesOn(); + const TColStd_MapOfInteger& aMVIn1=aFI1.VerticesIn(); + const TColStd_MapOfInteger& aMVOn2=aFI2.VerticesOn(); + const TColStd_MapOfInteger& aMVIn2=aFI2.VerticesIn(); + // + for (j=0; j<2; ++j) { + const TColStd_MapOfInteger& aMV1=(!j) ? aMVOn1 :aMVIn1; + aItMI.Initialize(aMV1); + for (; aItMI.More(); aItMI.Next()) { + nV1=aItMI.Key(); + if (aMVOn2.Contains(nV1) || aMVIn2.Contains(nV1)) { + aMVStick.Add(nV1); } } + } + // + // aLPB + const NMTTools_MapOfPaveBlock& aMPBIn1=aFI1.PaveBlocksIn(); + const NMTTools_MapOfPaveBlock& aMPBOn1=aFI1.PaveBlocksOn(); + const NMTTools_MapOfPaveBlock& aMPBIn2=aFI2.PaveBlocksIn(); + const NMTTools_MapOfPaveBlock& aMPBOn2=aFI2.PaveBlocksOn(); + // + aMPBX.Clear(); + for (j=0; j<4; ++j) { + NMTTools_MapOfPaveBlock *pMPB; + // + if (!j) { + pMPB=((NMTTools_MapOfPaveBlock*)&aMPBIn1); + } + else if (j==1) { + pMPB=((NMTTools_MapOfPaveBlock*)&aMPBOn1); + } + else if (j==2) { + pMPB=((NMTTools_MapOfPaveBlock*)&aMPBIn2); + } + else if (j==3) { + pMPB=((NMTTools_MapOfPaveBlock*)&aMPBOn2); + } // - anIt.Initialize(aLPBCx); - for (; anIt.More(); anIt.Next()) { - const BOPTools_PaveBlock& aPBCx=anIt.Value(); + const NMTTools_MapOfPaveBlock& aMPB=*pMPB; + aItMPB.Initialize(aMPB); + for (; aItMPB.More(); aItMPB.Next()) { + const BOPTools_PaveBlock& aPB=aItMPB.Key(); + if (aMPBX.Add(aPB)) { + aLPB.Append(aPB); + } // - nE=aPBCx.Edge(); - if (!aMFence.Contains(nE)) { - aMFence.Add(nE); - aLPBC.Append(aPBCx); + else { + if (j>1) { + aFFi.AppendBlock(aPB); + } } + // } } // - //modified by NIZNHY-PKV Fri Apr 1 09:49:57 2005t - // - RealSplitsInFace (aBid, nF1, nF2, aLPB); - RealSplitsInFace (aBid, nF2, nF1, aLPB); - RealSplitsOnFace (aBid, nF1, nF2, aLPB); - // - anIt.Initialize(aLPB); - for (; anIt.More(); anIt.Next()) { - const BOPTools_PaveBlock& aPB=anIt.Value(); - aFFi.AppendBlock(aPB); - } - // BOPTools_SequenceOfCurves& aSCvs=aFFi.Curves(); aNbCurves=aSCvs.Length(); if (!aNbCurves) { @@ -313,20 +343,17 @@ static aTolR3D=aFFi.TolR3D(); aTol2D=(aTolR3D < 1.e-3) ? 1.e-3 : aTolR3D; // - BOPTools_PaveSet aPSF; + CorrectTolR3D(aFFi, aMVStick, aTolR3D); // - //modified by NIZNHY-PKV Fri Apr 1 10:53:09 2005f - PrepareSetForFace (nF1, nF2, aLPBC, aPSF); - //PrepareSetForFace (nF1, nF2, aPSF); - //modified by NIZNHY-PKV Thu Mar 31 16:16:47 2005t + PrepareSetForFace (nF1, nF2, aLPB, aPSF); // // Put Paves On Curves for (j=1; j<=aNbCurves; ++j) { BOPTools_Curve& aBC=aSCvs(j); - // DEBUG const IntTools_Curve& aC=aBC.Curve(); - Handle (Geom_Curve) aC3D= aC.Curve(); - // + // DEBUG f + Handle(Geom_Curve) aC3D = aC.Curve(); + // DEBUG t PutPaveOnCurve (aPSF, aTolR3D, aBC); } // @@ -335,8 +362,19 @@ static BOPTools_Curve& aBC=aSCvs(j); PutBoundPaveOnCurve (aBC, aFFi); } + //modified by NIZNHY-PKV Wed Sep 14 13:12:14 2011f +#if OCC_VERSION_LARGE > 0x06050100 // For OCCT6.5.2 and higher + // + // Put closing pave if needded + for (j=1; j<=aNbCurves; ++j) { + BOPTools_Curve& aBC=aSCvs(j); + PutClosingPaveOnCurve (aBC, aFFi); + } +#endif // OCC_VERSION_LARGE > 0x06050100 // For OCCT6.5.2 and higher + //modified by NIZNHY-PKV Wed Sep 14 13:12:17 2011t // // Pave Blocks on Curves + bHasES=Standard_False; for (j=1; j<=aNbCurves; ++j) { BOPTools_Curve& aBC=aSCvs(j); const IntTools_Curve& aIC= aBC.Curve(); @@ -344,70 +382,94 @@ static // BOPTools_PaveBlockIterator aPBIter(0, aPaveSet); for (; aPBIter.More(); aPBIter.Next()) { - BOPTools_PaveBlock& aPBNew=aPBIter.Value(); - aPBNew.SetCurve(aIC); - aPBNew.SetFace1(nF1); - aPBNew.SetFace2(nF2); - // - nV1=aPBNew.Pave1().Index(); - nV2=aPBNew.Pave2().Index(); - aT1=aPBNew.Pave1().Param(); - aT2=aPBNew.Pave2().Param(); - // ??? - if((nV1==nV2) && (Abs(aT2 - aT1) < aTolPPC)) { - continue;// mkk ft - } - // - //modified by NIZNHY-PKV Fri Apr 1 09:56:11 2005f - // 1 - const BOPTools_ListOfPaveBlock& aLPBFF=aFFi.PaveBlocks(); - bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aLPBFF, aTolR3D); - //bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aFFi); - if (bIsExistingPaveBlock) { - continue; - } - // 2 - bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aLPBC, aTolR3D); - if (bIsExistingPaveBlock) { - continue; - } - //modified by NIZNHY-PKV Fri Apr 1 09:56:14 2005t - // Checking of validity in 2D - // - bIsValidIn2D=myContext.IsValidBlockForFaces(aT1, aT2, aIC, aF1, aF2, aTol2D); - if (!bIsValidIn2D) { - continue; - } - // - //aBC.AppendNewBlock(aPBNew); - // - // Make Section Edge - TopoDS_Edge aES; - // - const TopoDS_Vertex& aV1=TopoDS::Vertex(myDS->Shape(nV1)); - const TopoDS_Vertex& aV2=TopoDS::Vertex(myDS->Shape(nV2)); - // - BOPTools_Tools::MakeSectEdge (aIC, aV1, aT1, aV2, aT2, aES); - // - { - Standard_Real aTolR2D; - // - aTolR2D=aFFi.TolR2D(); - Handle(Geom2d_Curve) aC2D1=aIC.FirstCurve2d(); - Handle(Geom2d_Curve) aC2D2=aIC.SecondCurve2d(); - // - NMTTools_Tools::MakePCurve(aES, aF1, aC2D1, aTolR2D); - NMTTools_Tools::MakePCurve(aES, aF2, aC2D2, aTolR2D); - } + BOPTools_PaveBlock& aPBNew=aPBIter.Value(); + aPBNew.SetCurve(aIC); + aPBNew.SetFace1(nF1); + aPBNew.SetFace2(nF2); + // + nV1=aPBNew.Pave1().Index(); + nV2=aPBNew.Pave2().Index(); + aT1=aPBNew.Pave1().Param(); + aT2=aPBNew.Pave2().Param(); + // + if((nV1==nV2) && (Abs(aT2 - aT1) < aTolPPC)) { + continue;// mkk ft ??? + } + // + // 1 + bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aLPB, aTolR3D); + if (bIsExistingPaveBlock) { + continue; + } + // + bIsCoincided=CheckCoincidence(aPBNew, aLPB); + if(bIsCoincided) { + continue; + } + // + // 2 + bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aLSE, aTolR3D); + if (bIsExistingPaveBlock) { + continue; + } // - aMEPB.Add(aES, aPBNew); - aMapEI.Add(aES, i); - } + // Checking of validity in 2D + // + bIsValidIn2D=myContext->IsValidBlockForFaces(aT1, aT2, aIC, aF1, aF2, aTol2D); + if (!bIsValidIn2D) { + continue; + } + // + // + // Make Section Edge + TopoDS_Edge aES; + // + const TopoDS_Vertex aV1=TopoDS::Vertex(myDS->Shape(nV1)); + const TopoDS_Vertex aV2=TopoDS::Vertex(myDS->Shape(nV2)); + // + { + Standard_Real aT; + // + myContext->IsVertexOnLine(aV1, aIC, aTolR3D, aT); + BOPTools_Tools::UpdateVertex (aIC, aT, aV1); + // + myContext->IsVertexOnLine(aV2, aIC, aTolR3D, aT); + BOPTools_Tools::UpdateVertex (aIC, aT, aV2); + } + // + BOPTools_Tools::MakeSectEdge (aIC, aV1, aT1, aV2, aT2, aES); + // + NMTTools_Tools::UpdateEdge (aES, aTolR3D); + bIsMicroEdge=IsMicroEdge(aES, myContext); + if (bIsMicroEdge) { + continue; + } + // + { + Handle(Geom2d_Curve) aC2D1, aC2D2; + // + aC2D1=aIC.FirstCurve2d(); + aC2D2=aIC.SecondCurve2d(); + // + NMTTools_Tools::MakePCurve(aES, aF1, aC2D1); + NMTTools_Tools::MakePCurve(aES, aF2, aC2D2); + } + // + aMEPB.Add(aES, aPBNew); + aMapEI.Add(aES, i); + // + bHasES=Standard_True; + }// for (; aPBIter.More(); aPBIter.Next()) } // end of for (j=1; j<=aNbCurves; ++j) + // qqf + if (bHasES) { + myIP->Add(nF1, nF2, Standard_True, NMTDS_TI_FF); + } + // qqt }// for (i=1; i<=aNbFFs; ++i) //============================================================= // - // II. Post treatment + // II. Post treatment // // Input data: aMEPB, aMapEI // Result : section edges in myDS @@ -418,7 +480,7 @@ static if (!aNbSE) { // there is nothing to do here return; - } + } // BRep_Builder aBB; TopoDS_Compound aCompound; @@ -432,18 +494,13 @@ static // // // 2. Intersect SE using auxiliary Filler - NMTDS_ShapesDataStructure tDS; - // - tDS.SetCompositeShape(aCompound); - tDS.Init(); + NMTTools_PaveFiller tPF; // - BOPTools_InterferencePool tIP(tDS); - NMTTools_PaveFiller tPF(tIP); + tPF.SetCompositeShape(aCompound); // // 2.1.VV tPF.Init(); tPF.PerformVV(); - tPF.PerformNewVertices(); // // 2.2.VE tPF.myPavePool.Resize (tPF.myNbEdges); @@ -457,7 +514,7 @@ static tPF.myCommonBlockPool.Resize (tPF.myNbEdges); tPF.mySplitShapesPool.Resize (tPF.myNbEdges); tPF.myPavePoolNew .Resize (tPF.myNbEdges); - + tPF.PreparePaveBlocks(TopAbs_VERTEX, TopAbs_EDGE); tPF.PreparePaveBlocks(TopAbs_EDGE, TopAbs_EDGE); // @@ -477,12 +534,13 @@ static BOPTools_ListIteratorOfListOfPaveBlock aIt; BOPTColStd_IndexedDataMapOfIntegerInteger aMNewOld; // + const NMTDS_ShapesDataStructure& tDS=*(tPF.DS()); const BOPTools_SplitShapesPool& aSSP=tPF.mySplitShapesPool; const NMTTools_CommonBlockPool& aCBP=tPF.myCommonBlockPool; // aNbLines=tDS.NumberOfInsertedShapes(); aNbOld=tDS.NumberOfShapesOfTheObject(); - // + // // 3.1 Links between indices in tDS and DS (kept in aMNewOld) // // 3.1.1.Old vertices [ links ] @@ -496,16 +554,16 @@ static for (j=1; j<=aNbSE; ++j) { const BOPTools_PaveBlock& aPBSE=aMEPB(j); nV1=aPBSE.Pave1().Index(); - const TopoDS_Shape& aV1=myDS->Shape(nV1); + const TopoDS_Shape aV1=myDS->Shape(nV1);//mpv if (aV1.IsSame(aV)) { - aMNewOld.Add(i, nV1); - break; + aMNewOld.Add(i, nV1); + break; } nV2=aPBSE.Pave2().Index(); - const TopoDS_Shape& aV2=myDS->Shape(nV2); + const TopoDS_Shape aV2=myDS->Shape(nV2);//mpv if (aV2.IsSame(aV)) { - aMNewOld.Add(i, nV2); - break; + aMNewOld.Add(i, nV2); + break; } } } @@ -543,7 +601,7 @@ static BOPTools_SSInterference& aFFi=aFFs(iFF); BOPTools_SequenceOfCurves& aSCvs=aFFi.Curves(); // - BOPTools_Curve& aBC=aSCvs(1); + BOPTools_Curve& aBC=aSCvs(1); // const BOPTools_ListOfPaveBlock& aLPB=aSSP(tDS.RefEdge(i)); aNbPB=aLPB.Extent(); @@ -553,9 +611,9 @@ static BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; // nV1=aPBSE.Pave1().Index(); - const TopoDS_Shape& aV1=myDS->Shape(nV1); + const TopoDS_Shape aV1=myDS->Shape(nV1);//mpv nV2=aPBSE.Pave2().Index(); - const TopoDS_Shape& aV2=myDS->Shape(nV2); + const TopoDS_Shape aV2=myDS->Shape(nV2);//mpv // anASSeq.SetNewSuccessor(nV1); anASSeq.SetNewOrientation(aV1.Orientation()); @@ -573,8 +631,6 @@ static // nF1=aPBSE.Face1(); nF2=aPBSE.Face2(); - const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); - const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); // const NMTTools_ListOfCommonBlock& aLCB=aCBP(tDS.RefEdge(i)); NMTTools_CommonBlockAPI aCBAPI(aLCB); @@ -583,80 +639,31 @@ static for (; aIt.More(); aIt.Next()) { BOPTools_PaveBlock aPB=aIt.Value(); // + const TopoDS_Face aF1=TopoDS::Face(myDS->Shape(nF1)); + const TopoDS_Face aF2=TopoDS::Face(myDS->Shape(nF2)); + // if (aCBAPI.IsCommonBlock(aPB)) { - // it can be Common Block - Standard_Real aTolEx; - Handle(Geom2d_Curve) aC2D1, aC2D2; - TopoDS_Face aF1FWD, aF2FWD; - // - NMTTools_CommonBlock& aCB=aCBAPI.CommonBlock(aPB); - const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks(); - // - aPB=aCB.PaveBlock1(); - mE=aPB.Edge(); // index of edge in tDS - const TopoDS_Edge& aEx=TopoDS::Edge(tDS.Shape(mE)); - aTolEx=BRep_Tool::Tolerance(aEx); + // it can be Common Block + Standard_Real aTolEx; + Handle(Geom2d_Curve) aC2D1, aC2D2; + TopoDS_Face aF1FWD, aF2FWD; // - // Commented out by EAP in the frame of PAL9151 + NMTTools_CommonBlock& aCB=aCBAPI.CommonBlock(aPB); + //const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks(); // -// Standard_Boolean bHasPCOnF, bFound; -// Standard_Integer nF, k, nEOrx, nF1x, nF2x; -// Standard_Real aTolEx, aT1x, aT2x; -// BOPTools_ListIteratorOfListOfPaveBlock aItPBx; - // -// for (k=0; k<2; ++k) { -// nF=(!k) ? nF1 : nF2; -// const TopoDS_Face& aF=TopoDS::Face(myDS->Shape(nF)); -// // -// bHasPCOnF=BOPTools_Tools2D::HasCurveOnSurface(aEx, aF); -// if (bHasPCOnF) { -// continue; -// } -// // -// bFound=Standard_False; -// aItPBx.Initialize(aLPBx); -// for (; aItPBx.More(); aItPBx.Next()) { -// BOPTools_PaveBlock& aPBx=aIt.Value(); -// nEOrx=aPBx.OriginalEdge(); -// const TopoDS_Shape& aEOrx=tDS.Shape(nEOrx); -// BOPTools_PaveBlock& aPBSEx=aMEPB.ChangeFromKey(aEOrx); -// aT1x=aPBSEx.Pave1().Param(); -// aT2x=aPBSEx.Pave2().Param(); -// const IntTools_Curve& aICx=aPBSEx.Curve(); -// // -// nF1x=aPBSEx.Face1(); -// nF2x=aPBSEx.Face2(); -// // -// if (nF1x==nF) { -// Handle(Geom2d_Curve) aC2D1x=aICx.FirstCurve2d(); -// Handle(Geom2d_TrimmedCurve)aC2D1xT =new Geom2d_TrimmedCurve(aC2D1x, aT1x, aT2x); -// aBB.UpdateEdge(aEx, aC2D1xT, aF, aTolEx); -// bFound=!bFound; -// break; -// } -// // -// if (nF2x==nF) { -// Handle(Geom2d_Curve) aC2D2x=aICx.SecondCurve2d(); -// Handle(Geom2d_TrimmedCurve)aC2D2xT =new Geom2d_TrimmedCurve(aC2D2x, aT1x, aT2x); -// aBB.UpdateEdge(aEx, aC2D2xT, aF, aTolEx); -// bFound=!bFound; -// break; -// } -// } -// if (bFound){ -// BRepLib::SameParameter(aEx, aTolEx, Standard_True); -// } -// } + aPB=aCB.PaveBlock1(); + mE=aPB.Edge(); // index of edge in tDS + const TopoDS_Edge& aEx=TopoDS::Edge(tDS.Shape(mE)); + aTolEx=BRep_Tool::Tolerance(aEx); // - // The code till the if block end is restored from V2_2_2 revision + aF1FWD=aF1; + aF1FWD.Orientation(TopAbs_FORWARD); + aF2FWD=aF2; + aF2FWD.Orientation(TopAbs_FORWARD); // - aF1FWD=aF1; - aF1FWD.Orientation(TopAbs_FORWARD); - NMTTools_Tools::MakePCurve(aEx, aF1FWD, aC2D1, aTolEx); - // - aF2FWD=aF2; - aF2FWD.Orientation(TopAbs_FORWARD); - NMTTools_Tools::MakePCurve(aEx, aF2FWD, aC2D2, aTolEx); + NMTTools_Tools::MakePCurve(aEx, aF1FWD, aC2D1); + NMTTools_Tools::MakePCurve(aEx, aF2FWD, aC2D2); + NMTTools_Tools::UpdateEdge (aEx, aTolEx); } //if (aCBAPI.IsCommonBlock(aPB)) // // new SE @@ -667,31 +674,31 @@ static aT1=aPave1.Param(); mV1=aPave1.Index(); // index in tDS nV1=aMNewOld.FindFromKey(mV1); // index in myDS - const TopoDS_Shape& aV1=myDS->Shape(nV1); + const TopoDS_Shape aV1=myDS->Shape(nV1);//mpv // const BOPTools_Pave& aPave2=aPB.Pave2(); aT2=aPave2.Param(); mV2=aPave2.Index(); nV2=aMNewOld.FindFromKey(mV2); - const TopoDS_Shape& aV2=myDS->Shape(nV2); + const TopoDS_Shape aV2=myDS->Shape(nV2);//mpv // if (!aMNewOld.Contains(mE)) { - // add new SE to the myDS - BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; - // - anASSeq.SetNewSuccessor(nV1); - anASSeq.SetNewOrientation(aV1.Orientation()); + // add new SE to the myDS + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + // + anASSeq.SetNewSuccessor(nV1); + anASSeq.SetNewOrientation(aV1.Orientation()); - anASSeq.SetNewSuccessor(nV2); - anASSeq.SetNewOrientation(aV2.Orientation()); - - myDS->InsertShapeAndAncestorsSuccessors(aSp, anASSeq); - nE=myDS->NumberOfInsertedShapes(); - // - aMNewOld.Add(mE, nE); + anASSeq.SetNewSuccessor(nV2); + anASSeq.SetNewOrientation(aV2.Orientation()); + + myDS->InsertShapeAndAncestorsSuccessors(aSp, anASSeq); + nE=myDS->NumberOfInsertedShapes(); + // + aMNewOld.Add(mE, nE); } else { - nE=aMNewOld.FindFromKey(mE); + nE=aMNewOld.FindFromKey(mE); } // Form PaveBlock; BOPTools_PaveBlock aPBx; @@ -712,30 +719,35 @@ static aPBx.SetEdge(nE); // aBC.AppendNewBlock(aPBx); - }// for (; aIt.More(); aIt.Next()) - }// for (i=1; i<=aNbOld; ++i) + }// for (; aIt.More(); aIt.Next()) + }// for (i=1; i<=aNbOld; ++i) // myIsDone=Standard_True; } + //======================================================================= // function: MakePCurves -// purpose: +// purpose: //======================================================================= - void NMTTools_PaveFiller::MakePCurves() +void NMTTools_PaveFiller::MakePCurves() { Standard_Integer i, aNb, nF1, nF2, nE; + Standard_Integer aNbCB, aNbF, nSp, nF; + TopAbs_ShapeEnum aType; TopoDS_Face aF1FWD, aF2FWD; + TColStd_ListIteratorOfListOfInteger aItF; BOPTools_ListIteratorOfListOfPaveBlock anIt; + NMTTools_ListIteratorOfListOfCommonBlock aItCB; // - BOPTools_CArray1OfSSInterference& aFFs=myIntrPool->SSInterferences(); + BOPTools_CArray1OfSSInterference& aFFs=myIP->SSInterferences(); // aNb=aFFs.Extent(); for (i=1; i<=aNb; i++) { BOPTools_SSInterference& aFF=aFFs(i); aFF.Indices(nF1, nF2); // - const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); - const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); + const TopoDS_Face aF1=TopoDS::Face(myDS->Shape(nF1));//mpv + const TopoDS_Face aF2=TopoDS::Face(myDS->Shape(nF2));//mpv // aF1FWD=aF1; aF1FWD.Orientation(TopAbs_FORWARD); @@ -749,21 +761,70 @@ static for (; anIt.More(); anIt.Next()) { const BOPTools_PaveBlock& aPB=anIt.Value(); nE=aPB.Edge(); - const TopoDS_Edge& aE=TopoDS::Edge(myDS->Shape(nE)); - + const TopoDS_Edge aE=TopoDS::Edge(myDS->Shape(nE));//mpv + BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD); BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD); } - } + } + // Check common blocks between edges and faces + // Build P-Curves if they were not built in previos block. + // The main case is :arguments for e.g aEdge, aFace -> no FFs, + // but p-curves are needed. + // + aNb=myDS->NumberOfShapesOfTheObject(); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=myDS->Shape(i); + aType=aS.ShapeType(); + // + if (aType!=TopAbs_EDGE) { + continue; + } + const TopoDS_Edge& aE=TopoDS::Edge(aS); + // + if (BRep_Tool::Degenerated(aE)) { + continue; + } + // + const NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(i)); + aNbCB=aLCB.Extent(); + if (!aNbCB) { + continue; + } + // + aItCB.Initialize(aLCB); + for (; aItCB.More(); aItCB.Next()) { + const NMTTools_CommonBlock& aCB=aItCB.Value(); + const BOPTools_PaveBlock &aPB1=aCB.PaveBlock1(); + // + const TColStd_ListOfInteger& aLF=aCB.Faces(); + aNbF=aLF.Extent(); + if (!aNbF) { + continue; + } + // + nSp=aPB1.Edge(); + const TopoDS_Edge aSp=TopoDS::Edge(myDS->Shape(nSp));//mpv + // + aItF.Initialize(aLF); + for (; aItF.More(); aItF.Next()) { + nF=aItF.Value(); + aF1FWD=TopoDS::Face(myDS->Shape(nF)); + aF1FWD.Orientation(TopAbs_FORWARD); + // + BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aSp, aF1FWD); + } // for (; aItCB.More(); aItCB.Next()) { + }//if (aS.ShapeType()==TopAbs_EDGE) { + } } -//modified by NIZNHY-PKV Fri Apr 1 09:36:06 2005f + //======================================================================= // function: IsExistingPaveBlock -// purpose: +// purpose: //======================================================================= - Standard_Boolean NMTTools_PaveFiller::IsExistingPaveBlock(const BOPTools_PaveBlock& aPBNew, - const BOPTools_ListOfPaveBlock& aLPBR, - const Standard_Real aTolR3D) +Standard_Boolean NMTTools_PaveFiller::IsExistingPaveBlock(const BOPTools_PaveBlock& aPBNew, + const BOPTools_ListOfPaveBlock& aLPBR, + const Standard_Real aTolR3D) { Standard_Boolean bFlag; Standard_Integer nVNew1, nVNew2, nV1, nV2, iC; @@ -782,32 +843,84 @@ static // iC=CheckIntermediatePoint(aPBNew, aPBR, aTolR3D); if (!iC) { - return !bFlag; + return !bFlag; } } } return bFlag; } -//modified by NIZNHY-PKV Fri Apr 1 09:36:06 2005t + +//======================================================================= +// function: IsExistingPaveBlock +// purpose: +//======================================================================= +Standard_Boolean NMTTools_PaveFiller::IsExistingPaveBlock(const BOPTools_PaveBlock& aPBNew, + const TopTools_ListOfShape& aLSE, + const Standard_Real aTolR3D) +{ + Standard_Boolean bFlag; + Standard_Integer aNbSE, iC; + Standard_Real aTolE, aTol; + TopTools_ListIteratorOfListOfShape anIt; + // + bFlag=Standard_False; + // + aNbSE=aLSE.Extent(); + if (!aNbSE) { + return bFlag; + } + // + anIt.Initialize(aLSE); + for (; anIt.More(); anIt.Next()) { + const TopoDS_Edge& aE=TopoDS::Edge(anIt.Value()); + aTolE=BRep_Tool::Tolerance(aE); + aTol=aTolR3D; + if (aTolE>aTol) { + aTol=aTolE; + } + iC=CheckIntermediatePoint(aPBNew, aE, aTol); + if (!iC) { + return !bFlag; + } + } + return bFlag; +} + //======================================================================= // function: CheckIntermediatePoint -// purpose: +// purpose: //======================================================================= - Standard_Integer NMTTools_PaveFiller::CheckIntermediatePoint(const BOPTools_PaveBlock& aPB, - const BOPTools_PaveBlock& aPBR, - const Standard_Real aTolC) - +Standard_Integer NMTTools_PaveFiller::CheckIntermediatePoint(const BOPTools_PaveBlock& aPB, + const BOPTools_PaveBlock& aPBR, + const Standard_Real aTolC) { - Standard_Real aT11, aT12, aTM, aTmp; Standard_Integer iVM, nE2; + // + nE2=aPBR.Edge(); + const TopoDS_Edge aE2=TopoDS::Edge(myDS->Shape(nE2));//mpv + iVM=CheckIntermediatePoint(aPB, aE2, aTolC); + // + return iVM; +} + +//======================================================================= +// function: CheckIntermediatePoint +// purpose: +//======================================================================= +Standard_Integer NMTTools_PaveFiller::CheckIntermediatePoint(const BOPTools_PaveBlock& aPB, + const TopoDS_Edge& aE2, + const Standard_Real aTolC) +{ + Standard_Real aT11, aT12, aTM, aTmp; + Standard_Integer iVM; gp_Pnt aPM; BRep_Builder aBB; TopoDS_Vertex aVM; - // + // // Vertex const BOPTools_Pave& aPave11=aPB.Pave1(); aT11=aPave11.Param(); - // + // const BOPTools_Pave& aPave12=aPB.Pave2(); aT12=aPave12.Param(); // @@ -818,21 +931,18 @@ static // aBB.MakeVertex (aVM, aPM, aTolC); // - //Edge - nE2=aPBR.Edge(); - const TopoDS_Edge& aE2=TopoDS::Edge(myDS->GetShape(nE2)); - // VE - iVM=myContext.ComputeVE(aVM, aE2, aTmp); + iVM=myContext->ComputeVE(aVM, aE2, aTmp); // return iVM; } + //======================================================================= // function: PutBoundPaveOnCurve -// purpose: +// purpose: //======================================================================= - void NMTTools_PaveFiller::PutBoundPaveOnCurve(BOPTools_Curve& aBC, - BOPTools_SSInterference& aFFi) -{ +void NMTTools_PaveFiller::PutBoundPaveOnCurve(BOPTools_Curve& aBC, + BOPTools_SSInterference& aFFi) +{ Standard_Boolean bHasBounds, bVF; Standard_Integer nF1, nF2; Standard_Real aT1, aT2, aTolR3D; @@ -851,28 +961,29 @@ static aFFi.Indices(nF1, nF2); aTolR3D=aFFi.TolR3D(); // - const TopoDS_Face& aF1=TopoDS::Face(myDS->GetShape(nF1)); - const TopoDS_Face& aF2=TopoDS::Face(myDS->GetShape(nF2)); + const TopoDS_Face aF1=TopoDS::Face(myDS->GetShape(nF1));//mpv + const TopoDS_Face aF2=TopoDS::Face(myDS->GetShape(nF2));//mpv // - bVF=myContext.IsValidPointForFaces (aP1, aF1, aF2, aTolR3D); + bVF=myContext->IsValidPointForFaces (aP1, aF1, aF2, aTolR3D); if (bVF) { PutBoundPaveOnCurve (aP1, aT1, aBC, aFFi); } // - bVF=myContext.IsValidPointForFaces (aP2, aF1, aF2, aTolR3D); + bVF=myContext->IsValidPointForFaces (aP2, aF1, aF2, aTolR3D); if (bVF) { PutBoundPaveOnCurve (aP2, aT2, aBC, aFFi); } } + //======================================================================= // function: PutBoundPaveOnCurve -// purpose: +// purpose: //======================================================================= - void NMTTools_PaveFiller::PutBoundPaveOnCurve(const gp_Pnt& aP, - const Standard_Real aT, - BOPTools_Curve& aBC, - BOPTools_SSInterference& aFFi) -{ +void NMTTools_PaveFiller::PutBoundPaveOnCurve(const gp_Pnt& aP, + const Standard_Real aT, + BOPTools_Curve& aBC, + BOPTools_SSInterference& aFFi) +{ Standard_Boolean bFound1, bFound2; Standard_Integer nV; Standard_Real aTolV=aFFi.TolR3D(); @@ -902,45 +1013,45 @@ static TColStd_ListOfInteger& aTVs=aBC.TechnoVertices(); aTVs.Append(nV); } - if (bFound1 && !bFound2) { nV=aPave1.Index(); aPave.SetIndex(nV); aPave.SetParam(aT); aFFiPS.Append(aPave); // - const TopoDS_Vertex& aV=TopoDS::Vertex(myDS->Shape(nV)); + const TopoDS_Vertex aV=TopoDS::Vertex(myDS->Shape(nV));//mpv BOPTools_Tools::UpdateVertex (aIC, aT, aV); } - + if (!bFound1 && bFound2) { nV=aPave2.Index(); aPave.SetIndex(nV); aPave.SetParam(aT); aCPS.Append(aPave); // - const TopoDS_Vertex& aV=TopoDS::Vertex(myDS->Shape(nV)); + const TopoDS_Vertex aV=TopoDS::Vertex(myDS->Shape(nV));//mpv BOPTools_Tools::UpdateVertex (aIC, aT, aV); } } + //======================================================================= // function: FindPave -// purpose: +// purpose: //======================================================================= - Standard_Boolean NMTTools_PaveFiller::FindPave(const gp_Pnt& aP, - const Standard_Real aTolPV, - const BOPTools_PaveSet& aPS, - BOPTools_Pave& aPave) +Standard_Boolean NMTTools_PaveFiller::FindPave(const gp_Pnt& aP, + const Standard_Real aTolPV, + const BOPTools_PaveSet& aPS, + BOPTools_Pave& aPave) { Standard_Integer nV; Standard_Boolean bIsVertex=Standard_False; - + const BOPTools_ListOfPave& aLP=aPS.Set(); BOPTools_ListIteratorOfListOfPave anIt(aLP); for (; anIt.More(); anIt.Next()) { const BOPTools_Pave& aPC=anIt.Value(); nV=aPC.Index(); - const TopoDS_Vertex& aV=TopoDS::Vertex(myDS->Shape(nV)); + const TopoDS_Vertex aV=TopoDS::Vertex(myDS->Shape(nV));//mpv bIsVertex=IntTools_Tools::IsVertex (aP, aTolPV, aV); if (bIsVertex) { aPave=aPC; @@ -949,41 +1060,21 @@ static } return bIsVertex; } + //======================================================================= // function: PrepareSetForFace -// purpose: +// purpose: //======================================================================= - void NMTTools_PaveFiller::PrepareSetForFace(const Standard_Integer nF1, - const Standard_Integer nF2, - const BOPTools_ListOfPaveBlock& aLPBC, - BOPTools_PaveSet& aPSF) +void NMTTools_PaveFiller::PrepareSetForFace(const Standard_Integer ,//nF1, + const Standard_Integer ,//nF2, + const BOPTools_ListOfPaveBlock& aLPBC, + BOPTools_PaveSet& aPSF) { - Standard_Integer nV1, nV2; + Standard_Integer nV1, nV2; TColStd_MapOfInteger aMap; - BOPTools_ListOfPaveBlock aLPB1, aLPB2, aLPBS; BOPTools_ListIteratorOfListOfPaveBlock anIt; // - RealSplitsFace(nF1, aLPB1); - anIt.Initialize(aLPB1); - for (; anIt.More(); anIt.Next()) { - const BOPTools_PaveBlock& aPB=anIt.Value(); - aLPBS.Append(aPB); - } - // - RealSplitsFace(nF2, aLPB2); - anIt.Initialize(aLPB2); - for (; anIt.More(); anIt.Next()) { - const BOPTools_PaveBlock& aPB=anIt.Value(); - aLPBS.Append(aPB); - } - // anIt.Initialize(aLPBC); - for (; anIt.More(); anIt.Next()) { - const BOPTools_PaveBlock& aPB=anIt.Value(); - aLPBS.Append(aPB); - } - // - anIt.Initialize(aLPBS); for (; anIt.More(); anIt.Next()) { const BOPTools_PaveBlock& aPB=anIt.Value(); const BOPTools_Pave& aPave1=aPB.Pave1(); @@ -1000,14 +1091,164 @@ static } } } + +//======================================================================= +// function: CheckCoincidence +// purpose: +//======================================================================= +Standard_Boolean NMTTools_PaveFiller::CheckCoincidence(const BOPTools_PaveBlock& aPBNew, + const BOPTools_ListOfPaveBlock& aLPBFF) +{ + Standard_Boolean bRet; + Standard_Real aTE; + Standard_Integer nV11, nV12, nV21, nV22, iVV, iVE, nE2; + Standard_Integer iV, iCount, iCountExt; + BOPTools_ListIteratorOfListOfPaveBlock anIt; + // V11 + const BOPTools_Pave& aPave11=aPBNew.Pave1(); + nV11=aPave11.Index(); + const TopoDS_Vertex& aV11=TopoDS::Vertex(myDS->Shape(nV11)); + + // V12 + const BOPTools_Pave& aPave12=aPBNew.Pave2(); + nV12=aPave12.Index(); + const TopoDS_Vertex& aV12=TopoDS::Vertex(myDS->Shape(nV12)); + // + iCountExt=1; + iCount=0; + anIt.Initialize(aLPBFF); + for (; anIt.More(); anIt.Next()) { + iCount=0; + // + const BOPTools_PaveBlock& aPBR=anIt.Value(); + // V21 + const BOPTools_Pave& aPave21=aPBR.Pave1(); + nV21=aPave21.Index(); + + // V22 + const BOPTools_Pave& aPave22=aPBR.Pave2(); + nV22=aPave22.Index(); + // + if (nV11==nV21 || nV11==nV22 || nV12==nV21 || nV12==nV22) { + continue; + } + // + // E2 + nE2=aPBR.Edge(); + // + const TopoDS_Vertex& aV21=TopoDS::Vertex(myDS->Shape(nV21)); + const TopoDS_Vertex& aV22=TopoDS::Vertex(myDS->Shape(nV22)); + const TopoDS_Edge& aE2=TopoDS::Edge(myDS->Shape(nE2)); + // + // VV + iV=0; + iVV=IntTools_Tools::ComputeVV (aV11, aV21); + if (!iVV) { + iCount++; + iV++; + if (iCount>iCountExt) { + break; + } + } + // + iVV=IntTools_Tools::ComputeVV (aV11, aV22); + if (!iVV) { + iCount++; + iV++; + if (iCount>iCountExt) { + break; + } + } + // VE + if (!iV) { + iVE=myContext->ComputeVE (aV11, aE2, aTE); + if (!iVE) { + iCount++; + if (iCount>iCountExt) { + break; + } + } + } + // VV + iV=0; + iVV=IntTools_Tools::ComputeVV (aV12, aV21); + if (!iVV) { + iCount++; + iV++; + if (iCount>iCountExt) { + break; + } + } + // + iVV=IntTools_Tools::ComputeVV (aV12, aV22); + if (!iVV) { + iCount++; + iV++; + if (iCount>iCountExt) { + break; + } + } + // VE + if (!iV) { + iVE=myContext->ComputeVE (aV12, aE2, aTE); + if (!iVE) { + iCount++; + if (iCount>iCountExt) { + break; + } + } + } + } // next aPBR + bRet=(Standard_Boolean)(iCount>iCountExt); + return bRet; +} + +//======================================================================= +//function : IsMicroEdge +//purpose : +//======================================================================= +Standard_Boolean IsMicroEdge(const TopoDS_Edge& aE, + const Handle(IntTools_Context)& aCtx) +{ + Standard_Boolean bRet; + Standard_Integer iErr; + Standard_Real aT1, aT2, aTmp; + Handle(Geom_Curve) aC3D; + TopoDS_Vertex aV1, aV2; + IntTools_Range aR; + // + bRet=(BRep_Tool::Degenerated(aE) || + !BRep_Tool::IsGeometric(aE)); + if (bRet) { + return bRet; + } + // + aC3D=BRep_Tool::Curve(aE, aT1, aT2); + TopExp::Vertices(aE, aV1, aV2); + aT1=BRep_Tool::Parameter(aV1, aE); + aT2=BRep_Tool::Parameter(aV2, aE); + if (aT2Shape(nV)); + const TopoDS_Vertex aV=TopoDS::Vertex(myDS->Shape(nV)); // Bnd_Box aBBV; BRepBndLib::Add(aV, aBBV); if (aBBC.IsOut(aBBV)){ - continue; + continue; } // - bIsVertexOnLine=myContext.IsVertexOnLine(aV, aC, aTolR3D, aT); + bIsVertexOnLine=myContext->IsVertexOnLine(aV, aC, aTolR3D, aT); + // // if (bIsVertexOnLine) { BOPTools_Pave aPaveNew(nV, aT, BooleanOperations_SurfaceSurface); BOPTools_PaveSet& aPS=aBC.Set(); aPS.Append(aPaveNew); //<-B - BOPTools_Tools::UpdateVertex (aC, aT, aV); } } } -///////////// +// //======================================================================= -// function: IsPairFound -// purpose: +//function : FillFaceInfo +//purpose : //======================================================================= -Standard_Boolean IsPairFound(const Standard_Integer nF1, - const Standard_Integer nF2, - BOPTools_InterferencePool* myIntrPool, - BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapWhat, - BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapWith) +void NMTTools_PaveFiller::FillFaceInfo() { - Standard_Boolean bIsFound; + Standard_Integer i, aNbS, aNbFFs, nF, aNbVFs, aNbEFs, j, n1, n2, nX, aNbF; + TopAbs_ShapeEnum aType; + TopoDS_Shape aS; + TColStd_ListIteratorOfListOfInteger aItF; + BOPTools_ListIteratorOfListOfPaveBlock anItPB; + NMTTools_DataMapIteratorOfDataMapOfIntegerFaceInfo aItMFI; + NMTTools_ListIteratorOfListOfCommonBlock aItCB; // - if (!aMapWhat.Contains(nF1)) { - TColStd_IndexedMapOfInteger aMWhat; - FMapWhat(nF1, myIntrPool, aMWhat); - aMapWhat.Add(nF1, aMWhat); - } + myFaceInfo.Clear(); // - if (!aMapWith.Contains(nF2)) { - TColStd_IndexedMapOfInteger aMWith; - FMapWith(nF2, myIntrPool, aMWith); - aMapWith.Add(nF2, aMWith); - } + BOPTools_CArray1OfSSInterference& aFFs=myIP->SSInterferences(); + BOPTools_CArray1OfVSInterference& aVFs=myIP->VSInterferences(); + BOPTools_CArray1OfESInterference& aEFs=myIP->ESInterferences(); // - const TColStd_IndexedMapOfInteger& aMWht=aMapWhat.FindFromKey(nF1); - const TColStd_IndexedMapOfInteger& aMWit=aMapWith.FindFromKey(nF2); + aNbFFs=aFFs.Extent(); + if (!aNbFFs) { + return; + } // - bIsFound=IsFound(aMWht, aMWit); + // 0. + for (i=1; i<=aNbFFs; ++i) { + NMTTools_FaceInfo aFI; + // + BOPTools_SSInterference& aFFi=aFFs(i); + aFFi.Indices(n1, n2); + myFaceInfo.Bind(n1, aFI); + myFaceInfo.Bind(n2, aFI); + } // - return bIsFound; + // 1. + aNbS=myDS->NumberOfShapesOfTheObject(); + for (i=1; i<=aNbS; ++i) { + aS=myDS->Shape(i); + aType=aS.ShapeType(); + if (aType==TopAbs_EDGE) { + const NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(i)); + aItCB.Initialize(aLCB); + for (; aItCB.More(); aItCB.Next()) { + const NMTTools_CommonBlock& aCB=aItCB.Value(); + const BOPTools_PaveBlock &aPB1=aCB.PaveBlock1(); + const TColStd_ListOfInteger& aLF=aCB.Faces(); + aNbF=aLF.Extent(); + if (!aNbF) { + continue; + } + // + aItF.Initialize(aLF); + for (; aItF.More(); aItF.Next()) { + nF=aItF.Value(); + if (!myFaceInfo.IsBound(nF)) { + continue; + } + // + NMTTools_FaceInfo& aFI=myFaceInfo.ChangeFind(nF); + aFI.ChangePaveBlocksIn().Add(aPB1); + // + n1=aPB1.Pave1().Index(); + n2=aPB1.Pave2().Index(); + aFI.ChangeVerticesIn().Add(n1); + aFI.ChangeVerticesIn().Add(n2); + } + } + }// if (aType==TopAbs_EDGE) { + else if (aType==TopAbs_FACE) { + if (!myFaceInfo.IsBound(i)) { + continue; + } + // + BOPTools_ListOfPaveBlock aLPBOn; + // + nF=i; + NMTTools_FaceInfo& aFI=myFaceInfo.ChangeFind(nF); + // + RealSplitsFace(nF, aLPBOn); + // + anItPB.Initialize(aLPBOn); + for (; anItPB.More(); anItPB.Next()) { + const BOPTools_PaveBlock &aPB=anItPB.Value(); + aFI.ChangePaveBlocksOn().Add(aPB); + // + n1=aPB.Pave1().Index(); + n2=aPB.Pave2().Index(); + aFI.ChangeVerticesOn().Add(n1); + aFI.ChangeVerticesOn().Add(n2); + } + // + }// else if (aType==TopAbs_FACE) { + }// for (i=1; i<=aNbS; ++i) { + // + // 2. + aItMFI.Initialize(myFaceInfo); + for (; aItMFI.More(); aItMFI.Next()) { + nF=aItMFI.Key(); + NMTTools_FaceInfo& aFI=*((NMTTools_FaceInfo*)&aItMFI.Value()); + // + aFI.SetIndex(nF); + // + // + // 2.1 aVFs + aNbVFs=aVFs.Extent(); + for (j=1; j<=aNbVFs; ++j) { + BOPTools_VSInterference& aVFj=aVFs(j); + aVFj.Indices(n1, n2); + if (nF==n1) { + aFI.ChangeVerticesIn().Add(n2); + } + else if (nF==n2){ + aFI.ChangeVerticesIn().Add(n1); + } + }// for (j=1; j<=aNbVFs; ++j) { + // + // 2.2 aEFs + aNbEFs=aEFs.Extent(); + for (j=1; j<=aNbEFs; ++j) { + BOPTools_ESInterference& aEFj=aEFs(j); + aEFj.Indices(n1, n2); + if (!(nF==n1 || nF==n2)) { + continue; + } + // + nX=aEFj.NewShape(); + if (nX<1) { + continue; + } + // + aS=myDS->Shape(nX); + aType=aS.ShapeType(); + if (aType!=TopAbs_VERTEX) { + continue; + } + // + aFI.ChangeVerticesIn().Add(nX); + }// for (j=1; j<=aNbEFs; ++j) { + }// for (; aItMFI.More(); aItMFI.Next()) { } + + +#include +#include +#include +#include //======================================================================= -// function: FMapWhat -// purpose: +//function : CorrectTolR3D +//purpose : Attempt to correct the value of tolerance aTolR3D for +// the intersection curve in order to +// compel it to pass through the sticks. +// Prerequisites: +// 2. The are based on B-Spline surfaces; +// 1. There is at least the one intersection curve; +// 2. The faces have stick vertices to catch the curve; +// 3. The intersection angle is rather small (0.7-7 deg) +// //======================================================================= -void FMapWhat(const Standard_Integer nF, - BOPTools_InterferencePool* myIntrPool, - TColStd_IndexedMapOfInteger& aMapWhat) - -{ - Standard_Integer nE, nV; - - +void NMTTools_PaveFiller::CorrectTolR3D(const BOPTools_SSInterference& aFF, + const TColStd_MapOfInteger& aMVStick, + Standard_Real& aTolR3D) - BooleanOperations_ShapesDataStructure* myDS=myIntrPool->DS(); - BooleanOperations_OnceExplorer aExp(*myDS); - // - // What - aMapWhat.Add(nF); - aExp.Init(nF, TopAbs_VERTEX); - for (; aExp.More(); aExp.Next()) { - nV=aExp.Current(); - aMapWhat.Add(nV); +{ + Standard_Boolean bHasBounds; + Standard_Integer i, nF[2], nV, aNbCurves; + Standard_Real aT1, aT2, aU, aV, aT, aA, aTolV, aTolVmax; + Standard_Real aTolR, aTolTresh, aAmin, aAmax; + TColStd_MapIteratorOfMapOfInteger aIt; + gp_Pnt aP, aP1, aP2; + gp_Dir aDN[2]; + gp_Vec aVT; + Handle(Geom_Surface) aS[2]; + Handle(Geom_Curve) aC3D; + GeomAdaptor_Surface aGAS; + GeomAbs_SurfaceType aType; + TopoDS_Face aF[2]; + // + aTolTresh=0.0005; + aAmin=0.012;// 0.7-7 deg + aAmax=0.12; + // + if (!aMVStick.Extent()) { + return; } // - aExp.Init(nF, TopAbs_EDGE); - for (; aExp.More(); aExp.Next()) { - nE=aExp.Current(); - aMapWhat.Add(nE); + BOPTools_SSInterference& aFFi=*((BOPTools_SSInterference*)&aFF); + BOPTools_SequenceOfCurves& aSCvs=aFFi.Curves(); + aNbCurves=aSCvs.Length(); + if (aNbCurves!=1){ + return; } -} -//======================================================================= -// function: FMapWith -// purpose: -//======================================================================= -void FMapWith(const Standard_Integer nF, - BOPTools_InterferencePool* myIntrPool, - TColStd_IndexedMapOfInteger& aMapWith) -{ - TColStd_IndexedMapOfInteger aMapWhat; - - FMapWhat(nF, myIntrPool, aMapWhat); - // - // With - Standard_Integer i, aNb, anIndex, aWhat, aWith; - BOPTools_ListIteratorOfListOfInterference anIt; - - const BOPTools_CArray1OfInterferenceLine& anArrIL= myIntrPool->InterferenceTable(); - - aNb=aMapWhat.Extent(); - for (i=1; i<=aNb; i++) { - aWhat=aMapWhat(i); - - const BOPTools_InterferenceLine& aWithLine=anArrIL(aWhat); - - const BOPTools_ListOfInterference& aLI=aWithLine.List(); - anIt.Initialize(aLI); - for (; anIt.More(); anIt.Next()) { - const BOPTools_Interference& anIntf=anIt.Value(); - anIndex=anIntf.Index(); - if (anIndex) { - aWith=anIntf.With(); - aMapWith.Add(aWith); - } + // + aFFi.Indices(nF[0], nF[1]); + for (i=0; i<2; ++i) { + aF[i]=*((TopoDS_Face*)(&myDS->Shape(nF[i]))); + aS[i]=BRep_Tool::Surface(aF[i]); + aGAS.Load(aS[i]); + aType=aGAS.GetType(); + if (aType!=GeomAbs_BSplineSurface) { + return; } } -} -//======================================================================= -// function: IsFound -// purpose: -//======================================================================= -Standard_Boolean IsFound(const TColStd_IndexedMapOfInteger& aMapWhat, - const TColStd_IndexedMapOfInteger& aMapWith) -{ - Standard_Boolean bFlag=Standard_False; - Standard_Integer i, aNb, aWhat; - - aNb=aMapWhat.Extent(); - for (i=1; i<=aNb; i++) { - aWhat=aMapWhat(i); - if (aMapWith.Contains(aWhat)) { - return !bFlag; - } + // + BOPTools_Curve& aBC=aSCvs(1); + const IntTools_Curve& aIC=aBC.Curve(); + bHasBounds=aIC.HasBounds(); + if (!bHasBounds){ + return; } - return bFlag; -} -/* -//======================================================================= -// function: PrepareSetForFace -// purpose: -//======================================================================= - void NMTTools_PaveFiller::PrepareSetForFace(const Standard_Integer nF1, - const Standard_Integer nF2, - BOPTools_PaveSet& aPSF) -{ - Standard_Integer nV1, nV2; - TColStd_MapOfInteger aMap; - BOPTools_ListOfPaveBlock aLPB1, aLPB2; - BOPTools_ListIteratorOfListOfPaveBlock anIt; // - RealSplitsFace(nF1, aLPB1); - RealSplitsFace(nF2, aLPB2); + aIC.Bounds (aT1, aT2, aP1, aP2); + aT=IntTools_Tools::IntermediatePoint(aT1, aT2); + aC3D=aIC.Curve(); + aC3D->D0(aT, aP); + // + for (i=0; i<2; ++i) { + GeomAPI_ProjectPointOnSurf& aPPS=myContext->ProjPS(aF[i]); + aPPS.Perform(aP); + aPPS.LowerDistanceParameters(aU, aV); + BOPTools_Tools3D::GetNormalToSurface(aS[i], aU, aV, aDN[i]); + } // - aLPB1.Append(aLPB2); + aA=aDN[0].Angle(aDN[1]); + aA=fabs(aA); + if (aA > 0.5*M_PI) { + aA = M_PI - aA; + } // - anIt.Initialize(aLPB1); - for (; anIt.More(); anIt.Next()) { - const BOPTools_PaveBlock& aPB=anIt.Value(); - const BOPTools_Pave& aPave1=aPB.Pave1(); - nV1=aPave1.Index(); - if (!aMap.Contains(nV1)) { - aMap.Add(nV1); - aPSF.Append(aPave1); - } - const BOPTools_Pave& aPave2=aPB.Pave2(); - nV2=aPave2.Index(); - if (!aMap.Contains(nV2)) { - aMap.Add(nV2); - aPSF.Append(aPave2); + if (aAaAmax) { + return; + } + // + aTolVmax=-1.; + aIt.Initialize(aMVStick); + for (; aIt.More(); aIt.Next()) { + nV=aIt.Key(); + const TopoDS_Vertex& aV=*((TopoDS_Vertex*)(&myDS->Shape(nV))); + aTolV=BRep_Tool::Tolerance(aV); + if (aTolV>aTolVmax) { + aTolVmax=aTolV; } } + // + + aTolR=aTolVmax/aA; + if (aTolR 0x06050100 // For OCCT6.5.2 and higher //======================================================================= -// function: IsExistingPaveBlock -// purpose: +// function: PutClosingPaveOnCurve +// purpose: //======================================================================= - Standard_Boolean NMTTools_PaveFiller::IsExistingPaveBlock(const BOPTools_PaveBlock& aPBNew, - const BOPTools_SSInterference& aFFi) +void NMTTools_PaveFiller::PutClosingPaveOnCurve(BOPTools_Curve& aBC, + BOPTools_SSInterference& aFFi) { - Standard_Boolean bFlag; - Standard_Real aTolR3D; + Standard_Boolean bIsClosed, bHasBounds, bAdded; + Standard_Integer nVC, j; + Standard_Real aT[2], aTolR3D, aTC, dT, aTx; + gp_Pnt aP[2] ; + BOPTools_Pave aPVx; + BOPTools_ListIteratorOfListOfPave aItLP; + // + const IntTools_Curve& aIC=aBC.Curve(); + const Handle (Geom_Curve)& aC3D=aIC.Curve(); + if(aC3D.IsNull()) { + return; + } + // + bIsClosed=IntTools_Tools::IsClosed(aC3D); + if (!bIsClosed) { + return; + } // + bHasBounds=aIC.HasBounds (); + if (!bHasBounds){ + return; + } + // + bAdded=Standard_False; + dT=Precision::PConfusion(); aTolR3D=aFFi.TolR3D(); - const BOPTools_ListOfPaveBlock& aLPBR=aFFi.PaveBlocks(); + aIC.Bounds (aT[0], aT[1], aP[0], aP[1]); // - bFlag=IsExistingPaveBlock(aPBNew, aLPBR, aTolR3D); + BOPTools_PaveSet& aFFiPS=aFFi.NewPaveSet(); + BOPTools_PaveSet& aCPS=aBC.Set(); // - return bFlag; + const BOPTools_ListOfPave& aLP=aCPS.Set(); + aItLP.Initialize(aLP); + for (; aItLP.More() && !bAdded; aItLP.Next()) { + const BOPTools_Pave& aPC=aItLP.Value(); + nVC=aPC.Index(); + const TopoDS_Vertex aVC=TopoDS::Vertex(myDS->Shape(nVC)); + aTC=aPC.Param(); + // + for (j=0; j<2; ++j) { + if (fabs(aTC-aT[j]) < dT) { + aTx=(!j) ? aT[1] : aT[0]; + aPVx.SetIndex(nVC); + aPVx.SetParam(aTx); + // + aCPS.Append(aPVx); + aFFiPS.Append(aPVx); + // + bAdded=Standard_True; + break; + } + } + } } -*/ +#endif // OCC_VERSION_LARGE > 0x06050100 // For OCCT6.5.2 and higher +//modified by NIZNHY-PKV Wed Sep 14 13:21:17 2011t