+// 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
#include <TColStd_MapOfInteger.hxx>
#include <Geom2d_Curve.hxx>
+#include <Geom2d_TrimmedCurve.hxx>
#include <Geom_TrimmedCurve.hxx>
#include <GeomAdaptor_Curve.hxx>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <BRepBndLib.hxx>
+#include <BRepLib.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <NMTDS_ShapesDataStructure.hxx>
#include <NMTTools_IndexedDataMapOfShapePaveBlock.hxx>
#include <NMTTools_CommonBlockAPI.hxx>
-#include <Geom2d_Curve.hxx>
#include <NMTTools_Tools.hxx>
-#include <BRepLib.hxx>
-#include <Geom2d_TrimmedCurve.hxx>
static
Standard_Boolean IsPairFound(const Standard_Integer nF1,
Standard_Boolean IsFound(const TColStd_IndexedMapOfInteger& aMapWhat,
const TColStd_IndexedMapOfInteger& aMapWith);
+
//=======================================================================
// function: PerformFF
// purpose:
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();
//
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();
//
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) {
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
//
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);
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();
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
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();
//=======================================================================
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();
}
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
+