X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FNMTTools%2FNMTTools_PaveFiller_6.cxx;h=8c4852a4b076d57f130d07bf9aecc0b2b5554371;hb=f04efe4ef1789801c70616f0e4a98cdb5a11d49e;hp=d308457f91ce00873b9d8999a1f15698ac560de0;hpb=d3dd282390888d7dc091ba2c2ffe7923bd7458e6;p=modules%2Fgeom.git diff --git a/src/NMTTools/NMTTools_PaveFiller_6.cxx b/src/NMTTools/NMTTools_PaveFiller_6.cxx index d308457f9..8c4852a4b 100644 --- a/src/NMTTools/NMTTools_PaveFiller_6.cxx +++ b/src/NMTTools/NMTTools_PaveFiller_6.cxx @@ -1,3 +1,22 @@ +// Copyright (C) 2005 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 +// 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 +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// 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 @@ -11,6 +30,7 @@ #include #include +#include #include #include @@ -25,6 +45,7 @@ #include #include #include +#include #include @@ -60,10 +81,7 @@ #include #include #include -#include #include -#include -#include static Standard_Boolean IsPairFound(const Standard_Integer nF1, @@ -84,6 +102,7 @@ static Standard_Boolean IsFound(const TColStd_IndexedMapOfInteger& aMapWhat, const TColStd_IndexedMapOfInteger& aMapWith); + //======================================================================= // function: PerformFF // purpose: @@ -220,9 +239,9 @@ static Standard_Integer i, aNbFFs, nF1, nF2, aBid=0; Standard_Integer nV1, nV2, j, aNbCurves; Standard_Real aTolR3D, aTol2D, aT1, aT2, aTolPPC=Precision::PConfusion(); - TColStd_MapOfInteger aMap; NMTTools_IndexedDataMapOfShapePaveBlock aMEPB; BooleanOperations_IndexedDataMapOfShapeInteger aMapEI; + BOPTools_ListIteratorOfListOfPaveBlock anIt; // BOPTools_CArray1OfSSInterference& aFFs=myIntrPool->SSInterferences(); // @@ -238,21 +257,48 @@ static const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); // - // Add blocks that are existing ones for this FF-interference - BOPTools_ListOfPaveBlock aLPB; + BOPTools_ListOfPaveBlock aLPB, aLPBC; + // + { + 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); + } + } + // + anIt.Initialize(aLPBCx); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPBCx=anIt.Value(); + // + nE=aPBCx.Edge(); + if (!aMFence.Contains(nE)) { + aMFence.Add(nE); + aLPBC.Append(aPBCx); + } + } + } + // + // RealSplitsInFace (aBid, nF1, nF2, aLPB); RealSplitsInFace (aBid, nF2, nF1, aLPB); RealSplitsOnFace (aBid, nF1, nF2, aLPB); // - aMap.Clear(); - BOPTools_ListIteratorOfListOfPaveBlock anIt(aLPB); + anIt.Initialize(aLPB); for (; anIt.More(); anIt.Next()) { const BOPTools_PaveBlock& aPB=anIt.Value(); aFFi.AppendBlock(aPB); - nV1=aPB.Pave1().Index(); - nV2=aPB.Pave2().Index(); - aMap.Add(nV1); - aMap.Add(nV2); } // BOPTools_SequenceOfCurves& aSCvs=aFFi.Curves(); @@ -266,7 +312,8 @@ static // BOPTools_PaveSet aPSF; // - PrepareSetForFace (nF1, nF2, aPSF); + PrepareSetForFace (nF1, nF2, aLPBC, aPSF); + //PrepareSetForFace (nF1, nF2, aPSF); // // Put Paves On Curves for (j=1; j<=aNbCurves; ++j) { @@ -306,9 +353,16 @@ static continue;// mkk ft } // - bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aFFi); + // 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) { - // aPBNew was (or just lays) boundary PB continue; } // Checking of validity in 2D @@ -512,8 +566,11 @@ 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)); + // + //modified by NIZNHY-PKV Thu Jan 26 10:17:04 2006f + //const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); + //const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); + //modified by NIZNHY-PKV Thu Jan 26 10:17:08 2006t // const NMTTools_ListOfCommonBlock& aLCB=aCBP(tDS.RefEdge(i)); NMTTools_CommonBlockAPI aCBAPI(aLCB); @@ -522,12 +579,16 @@ static for (; aIt.More(); aIt.Next()) { BOPTools_PaveBlock aPB=aIt.Value(); // + ////modified by NIZNHY-PKV Thu Jan 26 10:16:36 2006f + const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); + const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); + ////modified by NIZNHY-PKV Thu Jan 26 10:16:39 2006t + // if (aCBAPI.IsCommonBlock(aPB)) { // it can be Common Block - Standard_Boolean bHasPCOnF, bFound; - Standard_Integer nF, k, nEOrx, nF1x, nF2x; - Standard_Real aTolEx, aT1x, aT2x; - BOPTools_ListIteratorOfListOfPaveBlock aItPBx; + Standard_Real aTolEx; + Handle(Geom2d_Curve) aC2D1, aC2D2; + TopoDS_Face aF1FWD, aF2FWD; // NMTTools_CommonBlock& aCB=aCBAPI.CommonBlock(aPB); const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks(); @@ -536,50 +597,16 @@ static mE=aPB.Edge(); // index of edge in tDS const TopoDS_Edge& aEx=TopoDS::Edge(tDS.Shape(mE)); aTolEx=BRep_Tool::Tolerance(aEx); + // + // <- Block A was here // - 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); - } - } + 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); } //if (aCBAPI.IsCommonBlock(aPB)) // // new SE @@ -677,106 +704,24 @@ static BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD); BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD); } - // - // Section Edges processing - /* - Standard_Integer aNbCurves, k, aNbV; - Standard_Real aTolEdge, aTolR2D, aTolFact, aTolV, aTolVmax; - BRep_Builder aBB; - // - BOPTools_SequenceOfCurves& aSC=aFF.Curves(); - aNbCurves=aSC.Length(); - if (!aNbCurves) { - continue; - } - // - const BOPTools_Curve& aBC=aSC(1); - const BOPTools_ListOfPaveBlock& aLPB=aBC.NewPaveBlocks(); - anIt.Initialize(aLPB); - for (; anIt.More(); anIt.Next()) { - const BOPTools_PaveBlock& aPB=anIt.Value(); - nE=aPB.Edge(); - const TopoDS_Edge& aE=TopoDS::Edge(myDS->Shape(nE)); - // - aTolEdge=BRep_Tool::Tolerance(aE); - aTolR2D=aFF.TolR2D(); - aTolFact=Max(aTolEdge, aTolR2D); - // - // Check vertices tolerances and correct them if necessary - // to prevent situation when TolE > TolV - // - TopTools_IndexedMapOfShape aVMap; - TopExp::MapShapes(aE, TopAbs_VERTEX, aVMap); - - aTolVmax=-1.; - aNbV=aVMap.Extent(); - for (k=1; k<=aNbV; ++k) { - const TopoDS_Vertex& aV=TopoDS::Vertex(aVMap(k)); - aTolV=BRep_Tool::Tolerance(aV); - if (aTolV>aTolVmax) { - aTolVmax=aTolV; - } - } - // - if (aTolFact>aTolVmax) { - aTolFact=aTolVmax; - } - // - Standard_Real aTFirst, aTLast, aOutFirst, aOutLast, aOutTol; - Handle(Geom2d_Curve) aC2D1, aC2D1A, aC2D2, aC2D2A; - Handle(Geom_TrimmedCurve)aC3DETrim; - // - const Handle(Geom_Curve)& aC3DE=BRep_Tool::Curve(aE, aTFirst, aTLast); - aC3DETrim=new Geom_TrimmedCurve(aC3DE, aTFirst, aTLast); - // - // first P-Curve - BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD); - BOPTools_Tools2D::CurveOnSurface(aE, aF1FWD, aC2D1, aOutFirst, aOutLast, aOutTol, Standard_True); - // - if (aC3DE->IsPeriodic()) { - BOPTools_Tools2D::AdjustPCurveOnFace(aF1FWD, aTFirst, aTLast, aC2D1, aC2D1A); - } - else { - BOPTools_Tools2D::AdjustPCurveOnFace(aF1FWD, aC3DETrim, aC2D1, aC2D1A); - } - // - aBB.UpdateEdge(aE, aC2D1A, aF1FWD, aTolFact); - // - // second P-Curve - BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD); - BOPTools_Tools2D::CurveOnSurface(aE, aF2FWD, aC2D2, aOutFirst, aOutLast, aOutTol, Standard_True); - // - if (aC3DE->IsPeriodic()) { - BOPTools_Tools2D::AdjustPCurveOnFace(aF2FWD, aTFirst, aTLast, aC2D2, aC2D2A); - } - else { - BOPTools_Tools2D::AdjustPCurveOnFace(aF2FWD, aC3DETrim, aC2D2, aC2D2A); - } - // - aBB.UpdateEdge(aE, aC2D2A, aF2FWD, aTolFact); - } - */ } - } //======================================================================= // function: IsExistingPaveBlock // purpose: //======================================================================= Standard_Boolean NMTTools_PaveFiller::IsExistingPaveBlock(const BOPTools_PaveBlock& aPBNew, - const BOPTools_SSInterference& aFFi) + const BOPTools_ListOfPaveBlock& aLPBR, + const Standard_Real aTolR3D) { - Standard_Boolean bFlag=Standard_False; + Standard_Boolean bFlag; Standard_Integer nVNew1, nVNew2, nV1, nV2, iC; - Standard_Real aTolR3D; BOPTools_ListIteratorOfListOfPaveBlock anIt; // - aTolR3D=aFFi.TolR3D(); - // + bFlag=Standard_False; nVNew1=aPBNew.Pave1().Index(); nVNew2=aPBNew.Pave2().Index(); // - const BOPTools_ListOfPaveBlock& aLPBR=aFFi.PaveBlocks(); anIt.Initialize(aLPBR); for (; anIt.More(); anIt.Next()) { const BOPTools_PaveBlock& aPBR=anIt.Value(); @@ -958,19 +903,35 @@ static //======================================================================= void NMTTools_PaveFiller::PrepareSetForFace(const Standard_Integer nF1, const Standard_Integer nF2, - BOPTools_PaveSet& aPSF) + const BOPTools_ListOfPaveBlock& aLPBC, + BOPTools_PaveSet& aPSF) { Standard_Integer nV1, nV2; TColStd_MapOfInteger aMap; - BOPTools_ListOfPaveBlock aLPB1, aLPB2; + 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); + } // - aLPB1.Append(aLPB2); + anIt.Initialize(aLPBC); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + aLPBS.Append(aPB); + } // - anIt.Initialize(aLPB1); + anIt.Initialize(aLPBS); for (; anIt.More(); anIt.Next()) { const BOPTools_PaveBlock& aPB=anIt.Value(); const BOPTools_Pave& aPave1=aPB.Pave1(); @@ -1149,3 +1110,60 @@ Standard_Boolean IsFound(const TColStd_IndexedMapOfInteger& aMapWhat, } return bFlag; } +// +// Block A +// + // + // Commented out by EAP in the frame of PAL9151 + // +// 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); +// } +// } + // + // The code till the if block end is restored from V2_2_2 revision +