+//
+//=======================================================================
+//function : FillFaceInfo
+//purpose :
+//=======================================================================
+void NMTTools_PaveFiller::FillFaceInfo()
+{
+ 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;
+ //
+ myFaceInfo.Clear();
+ //
+ BOPTools_CArray1OfSSInterference& aFFs=myIP->SSInterferences();
+ BOPTools_CArray1OfVSInterference& aVFs=myIP->VSInterferences();
+ BOPTools_CArray1OfESInterference& aEFs=myIP->ESInterferences();
+ //
+ aNbFFs=aFFs.Extent();
+ if (!aNbFFs) {
+ return;
+ }
+ //
+ // 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);
+ }
+ //
+ // 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 <gp_Pnt.hxx>
+#include <gp_Dir.hxx>
+#include <gp_Vec.hxx>
+#include <GeomAPI_ProjectPointOnSurf.hxx>
+//=======================================================================
+//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 NMTTools_PaveFiller::CorrectTolR3D(const BOPTools_SSInterference& aFF,
+ const TColStd_MapOfInteger& aMVStick,
+ Standard_Real& aTolR3D)
+
+{
+ 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;
+ }
+ //
+ BOPTools_SSInterference& aFFi=*((BOPTools_SSInterference*)&aFF);
+ BOPTools_SequenceOfCurves& aSCvs=aFFi.Curves();
+ aNbCurves=aSCvs.Length();
+ if (aNbCurves!=1){
+ return;
+ }
+ //
+ 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;
+ }
+ }
+ //
+ BOPTools_Curve& aBC=aSCvs(1);
+ const IntTools_Curve& aIC=aBC.Curve();
+ bHasBounds=aIC.HasBounds();
+ if (!bHasBounds){
+ return;
+ }
+ //
+ 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]);
+ }
+ //
+ aA=aDN[0].Angle(aDN[1]);
+ aA=fabs(aA);
+ if (aA > 0.5*M_PI) {
+ aA = M_PI - aA;
+ }
+ //
+ if (aA<aAmin || aA>aAmax) {
+ 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<aTolTresh) {
+ aTolR3D=aTolR;
+ }
+}
+
+//modified by NIZNHY-PKV Wed Sep 14 13:21:13 2011f
+#if OCC_VERSION_LARGE > 0x06050100 // For OCCT6.5.2 and higher
+//=======================================================================
+// function: PutClosingPaveOnCurve
+// purpose:
+//=======================================================================
+void NMTTools_PaveFiller::PutClosingPaveOnCurve(BOPTools_Curve& aBC,
+ BOPTools_SSInterference& aFFi)
+{
+ 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();
+ aIC.Bounds (aT[0], aT[1], aP[0], aP[1]);
+ //
+ BOPTools_PaveSet& aFFiPS=aFFi.NewPaveSet();
+ BOPTools_PaveSet& aCPS=aBC.Set();
+ //
+ 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