| 1 | // Created by: Peter KURNEV |
| 2 | // Copyright (c) 2010-2014 OPEN CASCADE SAS |
| 3 | // Copyright (c) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE |
| 4 | // Copyright (c) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, |
| 5 | // EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS |
| 6 | // |
| 7 | // This file is part of Open CASCADE Technology software library. |
| 8 | // |
| 9 | // This library is free software; you can redistribute it and / or modify it |
| 10 | // under the terms of the GNU Lesser General Public version 2.1 as published |
| 11 | // by the Free Software Foundation, with special exception defined in the file |
| 12 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT |
| 13 | // distribution for complete text of the license and disclaimer of any warranty. |
| 14 | // |
| 15 | // Alternatively, this file may be used under the terms of Open CASCADE |
| 16 | // commercial license or contractual agreement. |
| 17 | |
| 18 | #include <BOPAlgo_PaveFiller.ixx> |
| 19 | |
| 20 | #include <Precision.hxx> |
| 21 | #include <NCollection_IncAllocator.hxx> |
| 22 | #include <Bnd_Box.hxx> |
| 23 | |
| 24 | #include <Geom_Curve.hxx> |
| 25 | #include <Geom2d_Curve.hxx> |
| 26 | |
| 27 | #include <GeomAPI_ProjectPointOnCurve.hxx> |
| 28 | #include <GeomAPI_ProjectPointOnSurf.hxx> |
| 29 | |
| 30 | #include <TopoDS_Edge.hxx> |
| 31 | #include <TopoDS_Face.hxx> |
| 32 | #include <TopoDS_Vertex.hxx> |
| 33 | #include <TopoDS_Compound.hxx> |
| 34 | |
| 35 | #include <TopExp_Explorer.hxx> |
| 36 | |
| 37 | #include <BRep_Builder.hxx> |
| 38 | #include <BRep_Tool.hxx> |
| 39 | |
| 40 | #include <BRepBndLib.hxx> |
| 41 | #include <BRepTools.hxx> |
| 42 | |
| 43 | #include <BRepAdaptor_Curve.hxx> |
| 44 | #include <BRepAdaptor_Surface.hxx> |
| 45 | |
| 46 | #include <IntTools_FaceFace.hxx> |
| 47 | #include <IntTools_SequenceOfCurves.hxx> |
| 48 | #include <IntTools_SequenceOfPntOn2Faces.hxx> |
| 49 | #include <IntTools_Curve.hxx> |
| 50 | #include <IntTools_PntOn2Faces.hxx> |
| 51 | #include <IntTools_Tools.hxx> |
| 52 | |
| 53 | #include <IntSurf_ListOfPntOn2S.hxx> |
| 54 | #include <IntSurf_PntOn2S.hxx> |
| 55 | |
| 56 | #include <BOPTools_AlgoTools.hxx> |
| 57 | #include <BOPTools_AlgoTools3D.hxx> |
| 58 | |
| 59 | #include <BOPCol_MapOfInteger.hxx> |
| 60 | #include <BOPCol_ListOfShape.hxx> |
| 61 | #include <BOPCol_DataMapOfShapeInteger.hxx> |
| 62 | #include <BOPCol_ListOfInteger.hxx> |
| 63 | #include <BOPCol_IndexedMapOfInteger.hxx> |
| 64 | #include <BOPCol_DataMapOfIntegerReal.hxx> |
| 65 | |
| 66 | #include <BOPInt_Context.hxx> |
| 67 | #include <BOPInt_Tools.hxx> |
| 68 | |
| 69 | #include <BOPDS_Interf.hxx> |
| 70 | #include <BOPDS_Iterator.hxx> |
| 71 | #include <BOPDS_Curve.hxx> |
| 72 | #include <BOPDS_Point.hxx> |
| 73 | #include <BOPDS_FaceInfo.hxx> |
| 74 | #include <BOPDS_Curve.hxx> |
| 75 | #include <BOPDS_MapOfPaveBlock.hxx> |
| 76 | #include <BOPDS_PaveBlock.hxx> |
| 77 | #include <BOPDS_VectorOfCurve.hxx> |
| 78 | #include <BOPDS_VectorOfPoint.hxx> |
| 79 | #include <BOPDS_ShapeInfo.hxx> |
| 80 | #include <BOPDS_PaveBlock.hxx> |
| 81 | #include <BOPDS_ListOfPave.hxx> |
| 82 | #include <BOPDS_ListOfPaveBlock.hxx> |
| 83 | #include <BOPDS_CoupleOfPaveBlocks.hxx> |
| 84 | #include <BOPDS_FaceInfo.hxx> |
| 85 | #include <BOPDS_CommonBlock.hxx> |
| 86 | |
| 87 | #include <BOPAlgo_Tools.hxx> |
| 88 | #include <BRepBuilderAPI_MakeVertex.hxx> |
| 89 | #include <TopExp.hxx> |
| 90 | #include <BOPInt_ShrunkRange.hxx> |
| 91 | #include <BOPDS_DataMapOfPaveBlockListOfPaveBlock.hxx> |
| 92 | |
| 93 | static void ToleranceFF(const BRepAdaptor_Surface& aBAS1, |
| 94 | const BRepAdaptor_Surface& aBAS2, |
| 95 | Standard_Real& aTolFF); |
| 96 | |
| 97 | //======================================================================= |
| 98 | //function : PerformFF |
| 99 | //purpose : |
| 100 | //======================================================================= |
| 101 | void BOPAlgo_PaveFiller::PerformFF() |
| 102 | { |
| 103 | Standard_Integer iSize; |
| 104 | Standard_Boolean bValid; |
| 105 | // |
| 106 | myErrorStatus=0; |
| 107 | // |
| 108 | myIterator->Initialize(TopAbs_FACE, TopAbs_FACE); |
| 109 | iSize=myIterator->ExpectedLength(); |
| 110 | if (!iSize) { |
| 111 | return; |
| 112 | } |
| 113 | // |
| 114 | Standard_Boolean bJustAdd, bApp, bCompC2D1, bCompC2D2, bIsDone; |
| 115 | Standard_Boolean bToSplit, bTangentFaces; |
| 116 | Standard_Integer nF1, nF2, aNbCurves, aNbPoints, iX, i, iP, iC, aNbLP; |
| 117 | Standard_Real aApproxTol, aTolR3D, aTolR2D, aTolFF; |
| 118 | BRepAdaptor_Surface aBAS1, aBAS2; |
| 119 | BOPCol_MapOfInteger aMI; |
| 120 | // |
| 121 | BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF(); |
| 122 | aFFs.SetStartSize(iSize); |
| 123 | aFFs.SetIncrement(iSize); |
| 124 | aFFs.Init(); |
| 125 | // |
| 126 | bApp=mySectionAttribute.Approximation(); |
| 127 | bCompC2D1=mySectionAttribute.PCurveOnS1(); |
| 128 | bCompC2D2=mySectionAttribute.PCurveOnS2(); |
| 129 | aApproxTol=1.e-7; |
| 130 | bToSplit = Standard_False; |
| 131 | // |
| 132 | for (; myIterator->More(); myIterator->Next()) { |
| 133 | myIterator->Value(nF1, nF2, bJustAdd); |
| 134 | if(bJustAdd) { |
| 135 | continue; |
| 136 | } |
| 137 | // |
| 138 | const TopoDS_Face& aF1=(*(TopoDS_Face *)(&myDS->Shape(nF1))); |
| 139 | const TopoDS_Face& aF2=(*(TopoDS_Face *)(&myDS->Shape(nF2))); |
| 140 | // |
| 141 | aBAS1.Initialize(aF1, Standard_False); |
| 142 | aBAS2.Initialize(aF2, Standard_False); |
| 143 | // |
| 144 | if (aBAS1.GetType() == GeomAbs_Plane && |
| 145 | aBAS2.GetType() == GeomAbs_Plane) { |
| 146 | Standard_Boolean bToIntersect; |
| 147 | // |
| 148 | if (aMI.Add(nF1)) { |
| 149 | myDS->UpdateFaceInfoOn(nF1); |
| 150 | myDS->UpdateFaceInfoIn(nF1); |
| 151 | } |
| 152 | if (aMI.Add(nF2)) { |
| 153 | myDS->UpdateFaceInfoOn(nF2); |
| 154 | myDS->UpdateFaceInfoIn(nF2); |
| 155 | } |
| 156 | // |
| 157 | bToIntersect = CheckPlanes(nF1, nF2); |
| 158 | if (!bToIntersect) { |
| 159 | myDS->AddInterf(nF1, nF2); |
| 160 | iX=aFFs.Append()-1; |
| 161 | BOPDS_InterfFF& aFF=aFFs(iX); |
| 162 | aFF.SetIndices(nF1, nF2); |
| 163 | aFF.Init(0, 0); |
| 164 | continue; |
| 165 | } |
| 166 | } |
| 167 | // |
| 168 | IntTools_FaceFace aFaceFace; |
| 169 | // |
| 170 | IntSurf_ListOfPntOn2S aListOfPnts; |
| 171 | GetEFPnts(nF1, nF2, aListOfPnts); |
| 172 | aNbLP = aListOfPnts.Extent(); |
| 173 | if (aNbLP) { |
| 174 | aFaceFace.SetList(aListOfPnts); |
| 175 | } |
| 176 | |
| 177 | aFaceFace.SetParameters(bApp, bCompC2D1, bCompC2D2, aApproxTol); |
| 178 | // |
| 179 | aFaceFace.Perform(aF1, aF2); |
| 180 | // |
| 181 | bIsDone=aFaceFace.IsDone(); |
| 182 | if (bIsDone) { |
| 183 | aTolR3D=aFaceFace.TolReached3d(); |
| 184 | aTolR2D=aFaceFace.TolReached2d(); |
| 185 | bTangentFaces=aFaceFace.TangentFaces(); |
| 186 | // |
| 187 | ToleranceFF(aBAS1, aBAS2, aTolFF); |
| 188 | // |
| 189 | if (aTolR3D < aTolFF){ |
| 190 | aTolR3D=aTolFF; |
| 191 | } |
| 192 | if (aTolR2D < 1.e-7){ |
| 193 | aTolR2D=1.e-7; |
| 194 | } |
| 195 | // |
| 196 | aFaceFace.PrepareLines3D(bToSplit); |
| 197 | // |
| 198 | const IntTools_SequenceOfCurves& aCvsX=aFaceFace.Lines(); |
| 199 | const IntTools_SequenceOfPntOn2Faces& aPntsX=aFaceFace.Points(); |
| 200 | // |
| 201 | aNbCurves=aCvsX.Length(); |
| 202 | aNbPoints=aPntsX.Length(); |
| 203 | // |
| 204 | myDS->AddInterf(nF1, nF2); |
| 205 | // |
| 206 | iX=aFFs.Append()-1; |
| 207 | BOPDS_InterfFF& aFF=aFFs(iX); |
| 208 | aFF.SetIndices(nF1, nF2); |
| 209 | // |
| 210 | aFF.SetTolR3D(aTolR3D); |
| 211 | aFF.SetTolR2D(aTolR2D); |
| 212 | aFF.SetTangentFaces(bTangentFaces); |
| 213 | // |
| 214 | // Curves, Points |
| 215 | aFF.Init(aNbCurves, aNbPoints); |
| 216 | // |
| 217 | // Curves |
| 218 | BOPDS_VectorOfCurve& aVNC=aFF.ChangeCurves(); |
| 219 | for (i=1; i<=aNbCurves; ++i) { |
| 220 | Bnd_Box aBox; |
| 221 | // |
| 222 | const IntTools_Curve& aIC=aCvsX(i); |
| 223 | const Handle(Geom_Curve)& aC3D= aIC.Curve(); |
| 224 | bValid=BOPInt_Tools::CheckCurve(aC3D, aTolR3D, aBox); |
| 225 | if (bValid) { |
| 226 | iC=aVNC.Append()-1; |
| 227 | BOPDS_Curve& aNC=aVNC(iC); |
| 228 | aNC.SetCurve(aIC); |
| 229 | aNC.SetBox(aBox); |
| 230 | } |
| 231 | } |
| 232 | // |
| 233 | // Points |
| 234 | BOPDS_VectorOfPoint& aVNP=aFF.ChangePoints(); |
| 235 | for (i=1; i<=aNbPoints; ++i) { |
| 236 | const IntTools_PntOn2Faces& aPi=aPntsX(i); |
| 237 | const gp_Pnt& aP=aPi.P1().Pnt(); |
| 238 | // |
| 239 | iP=aVNP.Append()-1; |
| 240 | BOPDS_Point& aNP=aVNP(iP); |
| 241 | aNP.SetPnt(aP); |
| 242 | } |
| 243 | //}// if (aNbCs || aNbPs) |
| 244 | }// if (bIsDone) { |
| 245 | else {// 904/L1 |
| 246 | iX=aFFs.Append()-1; |
| 247 | BOPDS_InterfFF& aFF=aFFs(iX); |
| 248 | aFF.SetIndices(nF1, nF2); |
| 249 | aNbCurves=0; |
| 250 | aNbPoints=0; |
| 251 | aFF.Init(aNbCurves, aNbPoints); |
| 252 | } |
| 253 | }// for (; myIterator->More(); myIterator->Next()) { |
| 254 | } |
| 255 | //======================================================================= |
| 256 | //function : MakeBlocks |
| 257 | //purpose : |
| 258 | //======================================================================= |
| 259 | void BOPAlgo_PaveFiller::MakeBlocks() |
| 260 | { |
| 261 | Standard_Integer aNbFF; |
| 262 | // |
| 263 | myErrorStatus=0; |
| 264 | // |
| 265 | BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF(); |
| 266 | aNbFF=aFFs.Extent(); |
| 267 | if (!aNbFF) { |
| 268 | return; |
| 269 | } |
| 270 | // |
| 271 | Standard_Boolean bExist, bValid2D; |
| 272 | Standard_Integer i, nF1, nF2, aNbC, aNbP, j; |
| 273 | Standard_Integer nV1, nV2; |
| 274 | Standard_Real aTolR3D, aT1, aT2, aTol; |
| 275 | Handle(NCollection_IncAllocator) aAllocator; |
| 276 | BOPDS_ListIteratorOfListOfPaveBlock aItLPB; |
| 277 | TopoDS_Edge aES; |
| 278 | Handle(BOPDS_PaveBlock) aPBOut; |
| 279 | // |
| 280 | //-----------------------------------------------------scope f |
| 281 | aAllocator=new NCollection_IncAllocator(); |
| 282 | // |
| 283 | BOPCol_ListOfInteger aLSE(aAllocator); |
| 284 | BOPCol_MapOfInteger aMVOnIn(100, aAllocator), aMF(100, aAllocator), |
| 285 | aMVStick(100,aAllocator), aMVEF(100, aAllocator), |
| 286 | aMVB(100, aAllocator), aMI(100, aAllocator); |
| 287 | BOPDS_MapOfPaveBlock aMPBOnIn(100, aAllocator), |
| 288 | aMPBAdd(100, aAllocator); |
| 289 | BOPDS_ListOfPaveBlock aLPB(aAllocator); |
| 290 | BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks aMSCPB(100, aAllocator); |
| 291 | BOPCol_DataMapOfShapeInteger aMVI(100, aAllocator); |
| 292 | BOPDS_DataMapOfPaveBlockListOfPaveBlock aDMExEdges(100, aAllocator); |
| 293 | BOPCol_DataMapOfIntegerReal aMVTol(100, aAllocator); |
| 294 | BOPCol_DataMapIteratorOfDataMapOfIntegerReal aItMV; |
| 295 | BOPCol_DataMapOfIntegerInteger aDMI(100, aAllocator); |
| 296 | // |
| 297 | for (i=0; i<aNbFF; ++i) { |
| 298 | BOPDS_InterfFF& aFF=aFFs(i); |
| 299 | aFF.Indices(nF1, nF2); |
| 300 | // |
| 301 | BOPDS_VectorOfPoint& aVP=aFF.ChangePoints(); |
| 302 | aNbP=aVP.Extent(); |
| 303 | BOPDS_VectorOfCurve& aVC=aFF.ChangeCurves(); |
| 304 | aNbC=aVC.Extent(); |
| 305 | if (!aNbP && !aNbC) { |
| 306 | continue; |
| 307 | } |
| 308 | // |
| 309 | const TopoDS_Face& aF1=(*(TopoDS_Face *)(&myDS->Shape(nF1))); |
| 310 | const TopoDS_Face& aF2=(*(TopoDS_Face *)(&myDS->Shape(nF2))); |
| 311 | // |
| 312 | aTolR3D=aFF.TolR3D(); |
| 313 | // |
| 314 | // Update face info |
| 315 | if (aMF.Add(nF1)) { |
| 316 | myDS->UpdateFaceInfoOn(nF1); |
| 317 | } |
| 318 | if (aMF.Add(nF2)) { |
| 319 | myDS->UpdateFaceInfoOn(nF2); |
| 320 | } |
| 321 | |
| 322 | BOPDS_FaceInfo& aFI1=myDS->ChangeFaceInfo(nF1); |
| 323 | BOPDS_FaceInfo& aFI2=myDS->ChangeFaceInfo(nF2); |
| 324 | // |
| 325 | aMVOnIn.Clear(); |
| 326 | aMPBOnIn.Clear(); |
| 327 | aMVB.Clear(); |
| 328 | aMVTol.Clear(); |
| 329 | // |
| 330 | myDS->VerticesOnIn(nF1, nF2, aMVOnIn, aMPBOnIn); |
| 331 | myDS->SharedEdges(nF1, nF2, aLSE, aAllocator); |
| 332 | |
| 333 | // 1. Treat Points |
| 334 | for (j=0; j<aNbP; ++j) { |
| 335 | TopoDS_Vertex aV; |
| 336 | BOPDS_CoupleOfPaveBlocks aCPB; |
| 337 | // |
| 338 | BOPDS_Point& aNP=aVP.ChangeValue(j); |
| 339 | const gp_Pnt& aP=aNP.Pnt(); |
| 340 | // |
| 341 | bExist=IsExistingVertex(aP, aTolR3D, aMVOnIn); |
| 342 | if (!bExist) { |
| 343 | BOPTools_AlgoTools::MakeNewVertex(aP, aTolR3D, aV); |
| 344 | // |
| 345 | aCPB.SetIndexInterf(i); |
| 346 | aCPB.SetIndex(j); |
| 347 | aMSCPB.Add(aV, aCPB); |
| 348 | } |
| 349 | } |
| 350 | // |
| 351 | // 2. Treat Curves |
| 352 | aMVStick.Clear(); |
| 353 | aMVEF.Clear(); |
| 354 | GetStickVertices(nF1, nF2, aMVStick, aMVEF, aMI); |
| 355 | // |
| 356 | for (j=0; j<aNbC; ++j) { |
| 357 | BOPDS_Curve& aNC=aVC.ChangeValue(j); |
| 358 | const IntTools_Curve& aIC=aNC.Curve(); |
| 359 | // DEBt |
| 360 | aNC.InitPaveBlock1(); |
| 361 | // |
| 362 | PutPavesOnCurve(aMVOnIn, aTolR3D, aNC, nF1, nF2, aMI, aMVEF, aMVTol); |
| 363 | // |
| 364 | PutStickPavesOnCurve(aF1, aF2, aMI, aNC, aMVStick, aMVTol); |
| 365 | //904/F7 |
| 366 | if (aNbC == 1) { |
| 367 | PutEFPavesOnCurve(aNC, aMI, aMVEF, aMVTol); |
| 368 | } |
| 369 | // |
| 370 | if (aIC.HasBounds()) { |
| 371 | PutBoundPaveOnCurve(aF1, aF2, aTolR3D, aNC, aMVOnIn, aMVB); |
| 372 | } |
| 373 | }//for (j=0; j<aNbC; ++j) { |
| 374 | // |
| 375 | // Put closing pave if needed |
| 376 | for (j=0; j<aNbC; ++j) { |
| 377 | BOPDS_Curve& aNC=aVC.ChangeValue(j); |
| 378 | PutClosingPaveOnCurve (aNC); |
| 379 | } |
| 380 | // |
| 381 | // 3. Make section edges |
| 382 | for (j=0; j<aNbC; ++j) { |
| 383 | BOPDS_Curve& aNC=aVC.ChangeValue(j); |
| 384 | const IntTools_Curve& aIC=aNC.Curve(); |
| 385 | // |
| 386 | BOPDS_ListOfPaveBlock& aLPBC=aNC.ChangePaveBlocks(); |
| 387 | Handle(BOPDS_PaveBlock)& aPB1=aNC.ChangePaveBlock1(); |
| 388 | // |
| 389 | aLPB.Clear(); |
| 390 | aPB1->Update(aLPB, Standard_False); |
| 391 | // |
| 392 | aItLPB.Initialize(aLPB); |
| 393 | for (; aItLPB.More(); aItLPB.Next()) { |
| 394 | Handle(BOPDS_PaveBlock)& aPB=aItLPB.ChangeValue(); |
| 395 | aPB->Indices(nV1, nV2); |
| 396 | aPB->Range (aT1, aT2); |
| 397 | // |
| 398 | if (fabs(aT1 - aT2) < Precision::PConfusion()) { |
| 399 | continue; |
| 400 | } |
| 401 | // |
| 402 | bValid2D=myContext->IsValidBlockForFaces(aT1, aT2, aIC, aF1, aF2, aTolR3D); |
| 403 | if (!bValid2D) { |
| 404 | continue; |
| 405 | } |
| 406 | // |
| 407 | bExist=IsExistingPaveBlock(aPB, aNC, aTolR3D, aLSE); |
| 408 | if (bExist) { |
| 409 | continue; |
| 410 | } |
| 411 | // |
| 412 | bExist=IsExistingPaveBlock(aPB, aNC, aTolR3D, aMPBOnIn, aPBOut); |
| 413 | if (bExist) { |
| 414 | if (aMPBAdd.Add(aPBOut)) { |
| 415 | Standard_Boolean bInBothFaces = Standard_True; |
| 416 | if (!myDS->IsCommonBlock(aPBOut)) { |
| 417 | Standard_Integer nE; |
| 418 | Standard_Real aTolE; |
| 419 | // |
| 420 | nE = aPBOut->Edge(); |
| 421 | const TopoDS_Edge& aE = *(TopoDS_Edge*)&myDS->Shape(nE); |
| 422 | aTolE = BRep_Tool::Tolerance(aE); |
| 423 | if (aTolR3D > aTolE) { |
| 424 | myDS->UpdateEdgeTolerance(nE, aTolR3D); |
| 425 | } |
| 426 | bInBothFaces = Standard_False; |
| 427 | } else { |
| 428 | bInBothFaces = (aFI1.PaveBlocksOn().Contains(aPBOut) || |
| 429 | aFI1.PaveBlocksIn().Contains(aPBOut))&& |
| 430 | (aFI2.PaveBlocksOn().Contains(aPBOut) || |
| 431 | aFI2.PaveBlocksIn().Contains(aPBOut)); |
| 432 | } |
| 433 | if (!bInBothFaces) { |
| 434 | PreparePostTreatFF(i, aPBOut, aMSCPB, aMVI, aVC); |
| 435 | } |
| 436 | } |
| 437 | continue; |
| 438 | } |
| 439 | // |
| 440 | // Make Edge |
| 441 | const TopoDS_Vertex& aV1=(*(TopoDS_Vertex *)(&myDS->Shape(nV1))); |
| 442 | const TopoDS_Vertex& aV2=(*(TopoDS_Vertex *)(&myDS->Shape(nV2))); |
| 443 | // |
| 444 | BOPTools_AlgoTools::MakeEdge (aIC, aV1, aT1, aV2, aT2, aTolR3D, aES); |
| 445 | BOPTools_AlgoTools::MakePCurve(aES, aF1, aF2, aIC, |
| 446 | mySectionAttribute.PCurveOnS1(), |
| 447 | mySectionAttribute.PCurveOnS2()); |
| 448 | // |
| 449 | if (BOPTools_AlgoTools::IsMicroEdge(aES, myContext)) { |
| 450 | continue; |
| 451 | } |
| 452 | // |
| 453 | // Append the Pave Block to the Curve j |
| 454 | aLPBC.Append(aPB); |
| 455 | // |
| 456 | // Keep info for post treatment |
| 457 | BOPDS_CoupleOfPaveBlocks aCPB; |
| 458 | aCPB.SetIndexInterf(i); |
| 459 | aCPB.SetIndex(j); |
| 460 | aCPB.SetPaveBlock1(aPB); |
| 461 | // |
| 462 | aMSCPB.Add(aES, aCPB); |
| 463 | aMVI.Bind(aV1, nV1); |
| 464 | aMVI.Bind(aV2, nV2); |
| 465 | // |
| 466 | aMVTol.UnBind(nV1); |
| 467 | aMVTol.UnBind(nV2); |
| 468 | } |
| 469 | // |
| 470 | aLPBC.RemoveFirst(); |
| 471 | }//for (j=0; j<aNbC; ++j) { |
| 472 | //back to previous tolerance values for unused vertices |
| 473 | aItMV.Initialize(aMVTol); |
| 474 | for (; aItMV.More(); aItMV.Next()) { |
| 475 | nV1 = aItMV.Key(); |
| 476 | aTol = aItMV.Value(); |
| 477 | // |
| 478 | const TopoDS_Vertex& aV = *(TopoDS_Vertex*)&myDS->Shape(nV1); |
| 479 | const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*)&aV.TShape()); |
| 480 | TV->Tolerance(aTol); |
| 481 | } |
| 482 | // |
| 483 | ProcessExistingPaveBlocks(i, aMPBOnIn, aMSCPB, aMVI, aMVB, aMPBAdd); |
| 484 | }//for (i=0; i<aNbFF; ++i) { |
| 485 | // |
| 486 | // post treatment |
| 487 | myErrorStatus=PostTreatFF(aMSCPB, aMVI, aDMExEdges, aDMI, aAllocator); |
| 488 | if (myErrorStatus) { |
| 489 | return; |
| 490 | } |
| 491 | // |
| 492 | // update face info |
| 493 | UpdateFaceInfo(aDMExEdges); |
| 494 | //Update all pave blocks |
| 495 | UpdatePaveBlocks(aDMI); |
| 496 | //-----------------------------------------------------scope t |
| 497 | aMF.Clear(); |
| 498 | aMVStick.Clear(); |
| 499 | aMPBOnIn.Clear(); |
| 500 | aMVOnIn.Clear(); |
| 501 | aDMExEdges.Clear(); |
| 502 | aMI.Clear(); |
| 503 | aDMI.Clear(); |
| 504 | aAllocator.Nullify(); |
| 505 | } |
| 506 | |
| 507 | //======================================================================= |
| 508 | //function : PostTreatFF |
| 509 | //purpose : |
| 510 | //======================================================================= |
| 511 | Standard_Integer BOPAlgo_PaveFiller::PostTreatFF |
| 512 | (BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB, |
| 513 | BOPCol_DataMapOfShapeInteger& aMVI, |
| 514 | BOPDS_DataMapOfPaveBlockListOfPaveBlock& aDMExEdges, |
| 515 | BOPCol_DataMapOfIntegerInteger& aDMI, |
| 516 | Handle(NCollection_BaseAllocator)& theAllocator) |
| 517 | { |
| 518 | Standard_Integer iRet, aNbS; |
| 519 | // |
| 520 | iRet=0; |
| 521 | aNbS=theMSCPB.Extent(); |
| 522 | if (!aNbS) { |
| 523 | return iRet; |
| 524 | } |
| 525 | // |
| 526 | Standard_Boolean bHasPaveBlocks, bOld; |
| 527 | Standard_Integer iErr, nSx, nVSD, iX, iP, iC, j, nV, iV = 0, iE, k; |
| 528 | Standard_Integer jx, aNbLPBx; |
| 529 | Standard_Real aT; |
| 530 | TopAbs_ShapeEnum aType; |
| 531 | TopoDS_Shape aV, aE; |
| 532 | BOPCol_ListIteratorOfListOfShape aItLS; |
| 533 | BOPDS_ListIteratorOfListOfPaveBlock aItLPB; |
| 534 | BOPDS_PDS aPDS; |
| 535 | Handle(BOPDS_PaveBlock) aPB1; |
| 536 | BOPDS_Pave aPave[2], aPave1[2]; |
| 537 | BOPDS_ShapeInfo aSI; |
| 538 | // |
| 539 | BOPCol_ListOfShape aLS(theAllocator); |
| 540 | BOPAlgo_PaveFiller aPF(theAllocator); |
| 541 | // |
| 542 | BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF(); |
| 543 | // |
| 544 | // <-DEB f |
| 545 | // |
| 546 | // 0 |
| 547 | if (aNbS==1) { |
| 548 | const TopoDS_Shape& aS=theMSCPB.FindKey(1); |
| 549 | const BOPDS_CoupleOfPaveBlocks &aCPB=theMSCPB.FindFromIndex(1); |
| 550 | |
| 551 | // |
| 552 | aType=aS.ShapeType(); |
| 553 | if (aType==TopAbs_VERTEX) { |
| 554 | aSI.SetShapeType(aType); |
| 555 | aSI.SetShape(aS); |
| 556 | iV=myDS->Append(aSI); |
| 557 | // |
| 558 | iX=aCPB.IndexInterf(); |
| 559 | iP=aCPB.Index(); |
| 560 | BOPDS_InterfFF& aFF=aFFs(iX); |
| 561 | BOPDS_VectorOfPoint& aVNP=aFF.ChangePoints(); |
| 562 | BOPDS_Point& aNP=aVNP(iP); |
| 563 | aNP.SetIndex(iV); |
| 564 | } |
| 565 | else if (aType==TopAbs_EDGE) { |
| 566 | aPB1=aCPB.PaveBlock1(); |
| 567 | // |
| 568 | if (aPB1->HasEdge()) { |
| 569 | BOPDS_ListOfPaveBlock aLPBx; |
| 570 | aLPBx.Append(aPB1); |
| 571 | aDMExEdges.Bind(aPB1, aLPBx); |
| 572 | } else { |
| 573 | aSI.SetShapeType(aType); |
| 574 | aSI.SetShape(aS); |
| 575 | iE=myDS->Append(aSI); |
| 576 | // |
| 577 | aPB1->SetEdge(iE); |
| 578 | } |
| 579 | } |
| 580 | return iRet; |
| 581 | } |
| 582 | // |
| 583 | // 1 prepare arguments |
| 584 | for (k=1; k<=aNbS; ++k) { |
| 585 | const TopoDS_Shape& aS=theMSCPB.FindKey(k); |
| 586 | aLS.Append(aS); |
| 587 | } |
| 588 | // |
| 589 | // 2 Fuse shapes |
| 590 | aPF.SetArguments(aLS); |
| 591 | aPF.Perform(); |
| 592 | iErr=aPF.ErrorStatus(); |
| 593 | if (iErr) { |
| 594 | iRet=1; |
| 595 | return iRet; |
| 596 | } |
| 597 | aPDS=aPF.PDS(); |
| 598 | // |
| 599 | aItLS.Initialize(aLS); |
| 600 | for (; aItLS.More(); aItLS.Next()) { |
| 601 | const TopoDS_Shape& aSx=aItLS.Value(); |
| 602 | nSx=aPDS->Index(aSx); |
| 603 | const BOPDS_ShapeInfo& aSIx=aPDS->ShapeInfo(nSx); |
| 604 | // |
| 605 | aType=aSIx.ShapeType(); |
| 606 | // |
| 607 | if (aType==TopAbs_VERTEX) { |
| 608 | if (aPDS->HasShapeSD(nSx, nVSD)) { |
| 609 | aV=aPDS->Shape(nVSD); |
| 610 | } |
| 611 | else { |
| 612 | aV=aSx; |
| 613 | } |
| 614 | // index of new vertex in theDS -> iV |
| 615 | if (!aMVI.IsBound(aV)) { |
| 616 | aSI.SetShapeType(aType); |
| 617 | aSI.SetShape(aV); |
| 618 | iV=myDS->Append(aSI); |
| 619 | // |
| 620 | aMVI.Bind(aV, iV); |
| 621 | } |
| 622 | else { |
| 623 | iV=aMVI.Find(aV); |
| 624 | } |
| 625 | // update FF interference |
| 626 | const BOPDS_CoupleOfPaveBlocks &aCPB=theMSCPB.FindFromKey(aSx); |
| 627 | iX=aCPB.IndexInterf(); |
| 628 | iP=aCPB.Index(); |
| 629 | BOPDS_InterfFF& aFF=aFFs(iX); |
| 630 | BOPDS_VectorOfPoint& aVNP=aFF.ChangePoints(); |
| 631 | BOPDS_Point& aNP=aVNP(iP); |
| 632 | aNP.SetIndex(iV); |
| 633 | }//if (aType==TopAbs_VERTEX) { |
| 634 | // |
| 635 | else if (aType==TopAbs_EDGE) { |
| 636 | bHasPaveBlocks=aPDS->HasPaveBlocks(nSx); |
| 637 | const BOPDS_CoupleOfPaveBlocks &aCPB=theMSCPB.FindFromKey(aSx); |
| 638 | iX=aCPB.IndexInterf(); |
| 639 | iC=aCPB.Index(); |
| 640 | aPB1=aCPB.PaveBlock1(); |
| 641 | // |
| 642 | bOld = aPB1->HasEdge(); |
| 643 | if (bOld) { |
| 644 | BOPDS_ListOfPaveBlock aLPBx; |
| 645 | aDMExEdges.Bind(aPB1, aLPBx); |
| 646 | } |
| 647 | // |
| 648 | if (!bHasPaveBlocks) { |
| 649 | if (bOld) { |
| 650 | aDMExEdges.ChangeFind(aPB1).Append(aPB1); |
| 651 | } else { |
| 652 | aSI.SetShapeType(aType); |
| 653 | aSI.SetShape(aSx); |
| 654 | iE=myDS->Append(aSI); |
| 655 | // |
| 656 | aPB1->SetEdge(iE); |
| 657 | } |
| 658 | } |
| 659 | else { |
| 660 | BOPDS_InterfFF& aFF=aFFs(iX); |
| 661 | BOPDS_VectorOfCurve& aVNC=aFF.ChangeCurves(); |
| 662 | BOPDS_Curve& aNC=aVNC(iC); |
| 663 | BOPDS_ListOfPaveBlock& aLPBC=aNC.ChangePaveBlocks(); |
| 664 | // |
| 665 | const BOPDS_ListOfPaveBlock& aLPBx=aPDS->PaveBlocks(nSx); |
| 666 | aNbLPBx=aLPBx.Extent(); |
| 667 | // |
| 668 | if (bOld && !aNbLPBx) { |
| 669 | aDMExEdges.ChangeFind(aPB1).Append(aPB1); |
| 670 | continue; |
| 671 | } |
| 672 | // |
| 673 | if (!bOld) { |
| 674 | aItLPB.Initialize(aLPBC); |
| 675 | for (; aItLPB.More(); aItLPB.Next()) { |
| 676 | const Handle(BOPDS_PaveBlock)& aPBC=aItLPB.Value(); |
| 677 | if (aPBC==aPB1) { |
| 678 | aLPBC.Remove(aItLPB); |
| 679 | break; |
| 680 | } |
| 681 | } |
| 682 | } |
| 683 | // |
| 684 | if (!aNbLPBx) { |
| 685 | aE=aSx; |
| 686 | // |
| 687 | if (!aMVI.IsBound(aE)) { |
| 688 | aSI.SetShapeType(aType); |
| 689 | aSI.SetShape(aE); |
| 690 | iE=myDS->Append(aSI); |
| 691 | aMVI.Bind(aE, iE); |
| 692 | } |
| 693 | else { |
| 694 | iE=aMVI.Find(aE); |
| 695 | } |
| 696 | // append new PaveBlock to aLPBC |
| 697 | aPB1->SetEdge(iE); |
| 698 | aLPBC.Append(aPB1); |
| 699 | } // if (!aNbLPBx) { |
| 700 | // |
| 701 | else { |
| 702 | aItLPB.Initialize(aLPBx); |
| 703 | if (bOld) { |
| 704 | aPave1[0] = aPB1->Pave1(); |
| 705 | aPave1[1] = aPB1->Pave2(); |
| 706 | } |
| 707 | for (; aItLPB.More(); aItLPB.Next()) { |
| 708 | const Handle(BOPDS_PaveBlock)& aPBx=aItLPB.Value(); |
| 709 | const Handle(BOPDS_PaveBlock) aPBRx=aPDS->RealPaveBlock(aPBx); |
| 710 | // |
| 711 | // update vertices of paves |
| 712 | aPave[0]=aPBx->Pave1(); |
| 713 | aPave[1]=aPBx->Pave2(); |
| 714 | for (j=0; j<2; ++j) { |
| 715 | jx = 0; |
| 716 | if (bOld) { |
| 717 | aT = aPave[j].Parameter(); |
| 718 | if (aT == aPave1[0].Parameter()) { |
| 719 | jx = 1; |
| 720 | } else if (aT == aPave1[1].Parameter()) { |
| 721 | jx = 2; |
| 722 | } |
| 723 | // |
| 724 | if (jx) { |
| 725 | iV = aPave1[jx-1].Index(); |
| 726 | } |
| 727 | } |
| 728 | if (!jx) { |
| 729 | nV=aPave[j].Index(); |
| 730 | aV=aPDS->Shape(nV); |
| 731 | // |
| 732 | if (!aMVI.IsBound(aV)) {// index of new vertex in theDS -> iV |
| 733 | aSI.SetShapeType(TopAbs_VERTEX); |
| 734 | aSI.SetShape(aV); |
| 735 | iV=myDS->Append(aSI); |
| 736 | aMVI.Bind(aV, iV); |
| 737 | } |
| 738 | else { |
| 739 | iV=aMVI.Find(aV); |
| 740 | } |
| 741 | } |
| 742 | const BOPDS_Pave& aP1 = !j ? aPB1->Pave1() : aPB1->Pave2(); |
| 743 | if (aP1.Parameter() == aPave[j].Parameter() && aP1.Index() != iV) { |
| 744 | aDMI.Bind(aP1.Index(), iV); |
| 745 | } |
| 746 | // |
| 747 | aPave[j].SetIndex(iV); |
| 748 | } |
| 749 | // |
| 750 | // add edge |
| 751 | aE=aPDS->Shape(aPBRx->Edge()); |
| 752 | // |
| 753 | if (!aMVI.IsBound(aE)) { |
| 754 | aSI.SetShapeType(aType); |
| 755 | aSI.SetShape(aE); |
| 756 | iE=myDS->Append(aSI); |
| 757 | aMVI.Bind(aE, iE); |
| 758 | } |
| 759 | else { |
| 760 | iE=aMVI.Find(aE); |
| 761 | } |
| 762 | // append new PaveBlock to aLPBC |
| 763 | Handle(BOPDS_PaveBlock) aPBC=new BOPDS_PaveBlock(); |
| 764 | // |
| 765 | aPBC->SetPave1(aPave[0]); |
| 766 | aPBC->SetPave2(aPave[1]); |
| 767 | aPBC->SetEdge(iE); |
| 768 | if (bOld) { |
| 769 | aPBC->SetOriginalEdge(aPB1->OriginalEdge()); |
| 770 | aDMExEdges.ChangeFind(aPB1).Append(aPBC); |
| 771 | } |
| 772 | else { |
| 773 | aLPBC.Append(aPBC); |
| 774 | } |
| 775 | } |
| 776 | } |
| 777 | } |
| 778 | }//else if (aType==TopAbs_EDGE) |
| 779 | }//for (; aItLS.More(); aItLS.Next()) { |
| 780 | return iRet; |
| 781 | } |
| 782 | |
| 783 | //======================================================================= |
| 784 | //function : UpdateFaceInfo |
| 785 | //purpose : |
| 786 | //======================================================================= |
| 787 | void BOPAlgo_PaveFiller::UpdateFaceInfo(BOPDS_DataMapOfPaveBlockListOfPaveBlock& theDME) |
| 788 | { |
| 789 | Standard_Integer i, j, nV1, nF1, nF2, |
| 790 | aNbFF, aNbC, aNbP, aNbS, aNbPBIn; |
| 791 | BOPDS_IndexedMapOfPaveBlock aMPBCopy; |
| 792 | BOPDS_ListIteratorOfListOfPaveBlock aItLPB; |
| 793 | // |
| 794 | BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF(); |
| 795 | aNbFF=aFFs.Extent(); |
| 796 | // |
| 797 | //1. Sections (curves, points); |
| 798 | for (i=0; i<aNbFF; ++i) { |
| 799 | BOPDS_InterfFF& aFF=aFFs(i); |
| 800 | aFF.Indices(nF1, nF2); |
| 801 | // |
| 802 | BOPDS_FaceInfo& aFI1=myDS->ChangeFaceInfo(nF1); |
| 803 | BOPDS_FaceInfo& aFI2=myDS->ChangeFaceInfo(nF2); |
| 804 | // |
| 805 | BOPDS_VectorOfCurve& aVNC=aFF.ChangeCurves(); |
| 806 | aNbC=aVNC.Extent(); |
| 807 | for (j=0; j<aNbC; ++j) { |
| 808 | BOPDS_Curve& aNC=aVNC(j); |
| 809 | BOPDS_ListOfPaveBlock& aLPBC=aNC.ChangePaveBlocks(); |
| 810 | aItLPB.Initialize(aLPBC); |
| 811 | // |
| 812 | if (aItLPB.More() && theDME.IsBound(aLPBC.First())) { |
| 813 | const Handle(BOPDS_PaveBlock)& aPB=aLPBC.First(); |
| 814 | BOPDS_ListOfPaveBlock& aLPB = theDME.ChangeFind(aPB); |
| 815 | UpdateExistingPaveBlocks(aPB, aLPB, nF1, nF2); |
| 816 | aLPBC.Clear(); |
| 817 | continue; |
| 818 | } |
| 819 | // |
| 820 | for(; aItLPB.More(); aItLPB.Next()) { |
| 821 | const Handle(BOPDS_PaveBlock)& aPB=aItLPB.Value(); |
| 822 | aFI1.ChangePaveBlocksSc().Add(aPB); |
| 823 | aFI2.ChangePaveBlocksSc().Add(aPB); |
| 824 | } |
| 825 | } |
| 826 | // VerticesSc |
| 827 | const BOPDS_VectorOfPoint& aVNP=aFF.Points(); |
| 828 | aNbP=aVNP.Extent(); |
| 829 | for (j=0; j<aNbP; ++j) { |
| 830 | const BOPDS_Point& aNP=aVNP(j); |
| 831 | nV1=aNP.Index(); |
| 832 | aFI1.ChangeVerticesSc().Add(nV1); |
| 833 | aFI2.ChangeVerticesSc().Add(nV1); |
| 834 | } |
| 835 | } |
| 836 | // |
| 837 | //2. PaveBlocksIn |
| 838 | if (theDME.IsEmpty()) { |
| 839 | return; |
| 840 | } |
| 841 | // |
| 842 | aNbS=myDS->NbSourceShapes(); |
| 843 | for (i=0; i<aNbS; ++i) { |
| 844 | const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i); |
| 845 | if (aSI.ShapeType()!=TopAbs_FACE) { |
| 846 | continue; |
| 847 | } |
| 848 | if(!myDS->HasFaceInfo(i)) { |
| 849 | continue; |
| 850 | } |
| 851 | BOPDS_FaceInfo& aFI=myDS->ChangeFaceInfo(i); |
| 852 | // |
| 853 | BOPDS_IndexedMapOfPaveBlock& aMPBIn=aFI.ChangePaveBlocksIn(); |
| 854 | aMPBCopy.Assign(aMPBIn); |
| 855 | aMPBIn.Clear(); |
| 856 | // |
| 857 | aNbPBIn=aMPBCopy.Extent(); |
| 858 | for (j=1; j<=aNbPBIn; ++j) { |
| 859 | const Handle(BOPDS_PaveBlock)& aPB = aMPBCopy(j); |
| 860 | if (theDME.IsBound(aPB)) { |
| 861 | const BOPDS_ListOfPaveBlock& aLPB = theDME.Find(aPB); |
| 862 | aItLPB.Initialize(aLPB); |
| 863 | for (; aItLPB.More(); aItLPB.Next()) { |
| 864 | const Handle(BOPDS_PaveBlock)& aPB1 = aItLPB.Value(); |
| 865 | aMPBIn.Add(aPB1); |
| 866 | } |
| 867 | } else { |
| 868 | aMPBIn.Add(aPB); |
| 869 | } |
| 870 | }//for (j=1; j<=aNbPBIn; ++j) { |
| 871 | }//for (i=0; i<aNbS; ++i) { |
| 872 | } |
| 873 | //======================================================================= |
| 874 | //function : IsExistingVertex |
| 875 | //purpose : |
| 876 | //======================================================================= |
| 877 | Standard_Boolean BOPAlgo_PaveFiller::IsExistingVertex |
| 878 | (const gp_Pnt& aP, |
| 879 | const Standard_Real theTolR3D, |
| 880 | const BOPCol_MapOfInteger& aMVOnIn)const |
| 881 | { |
| 882 | Standard_Boolean bRet; |
| 883 | Standard_Integer nV, iFlag; |
| 884 | Standard_Real aTolV; |
| 885 | gp_Pnt aPV; |
| 886 | Bnd_Box aBoxP; |
| 887 | BOPCol_MapIteratorOfMapOfInteger aIt; |
| 888 | // |
| 889 | bRet=Standard_True; |
| 890 | // |
| 891 | aBoxP.Add(aP); |
| 892 | aBoxP.Enlarge(theTolR3D); |
| 893 | // |
| 894 | aIt.Initialize(aMVOnIn); |
| 895 | for (; aIt.More(); aIt.Next()) { |
| 896 | Bnd_Box aBoxV; |
| 897 | // |
| 898 | nV=aIt.Value(); |
| 899 | const TopoDS_Vertex& aV=(*(TopoDS_Vertex *)(&myDS->Shape(nV))); |
| 900 | aPV=BRep_Tool::Pnt(aV); |
| 901 | aTolV=BRep_Tool::Tolerance(aV); |
| 902 | aBoxV.Add(aP); |
| 903 | aBoxV.Enlarge(aTolV); |
| 904 | // |
| 905 | if (!aBoxP.IsOut(aBoxV)) { |
| 906 | iFlag=BOPTools_AlgoTools::ComputeVV(aV, aP, theTolR3D); |
| 907 | if (!iFlag) { |
| 908 | return bRet; |
| 909 | } |
| 910 | } |
| 911 | } |
| 912 | return !bRet; |
| 913 | } |
| 914 | //======================================================================= |
| 915 | //function : IsExistingPaveBlock |
| 916 | //purpose : |
| 917 | //======================================================================= |
| 918 | Standard_Boolean BOPAlgo_PaveFiller::IsExistingPaveBlock |
| 919 | (const Handle(BOPDS_PaveBlock)& thePB, |
| 920 | const BOPDS_Curve& theNC, |
| 921 | const Standard_Real theTolR3D, |
| 922 | const BOPCol_ListOfInteger& theLSE) |
| 923 | { |
| 924 | Standard_Boolean bRet=Standard_True; |
| 925 | // |
| 926 | if (theLSE.IsEmpty()) { |
| 927 | return !bRet; |
| 928 | } |
| 929 | // |
| 930 | Standard_Real aT1, aT2, aTm, aTx, aTol; |
| 931 | Standard_Integer nE, iFlag; |
| 932 | gp_Pnt aPm; |
| 933 | Bnd_Box aBoxPm; |
| 934 | BOPCol_ListIteratorOfListOfInteger aItLI; |
| 935 | // |
| 936 | thePB->Range(aT1, aT2); |
| 937 | aTm=IntTools_Tools::IntermediatePoint (aT1, aT2); |
| 938 | theNC.Curve().D0(aTm, aPm); |
| 939 | aBoxPm.Add(aPm); |
| 940 | aBoxPm.Enlarge(theTolR3D); |
| 941 | // |
| 942 | aItLI.Initialize(theLSE); |
| 943 | for (; aItLI.More(); aItLI.Next()) { |
| 944 | nE=aItLI.Value(); |
| 945 | const BOPDS_ShapeInfo& aSIE=myDS->ChangeShapeInfo(nE); |
| 946 | const Bnd_Box& aBoxE=aSIE.Box(); |
| 947 | if (!aBoxE.IsOut(aBoxPm)) { |
| 948 | const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&aSIE.Shape())); |
| 949 | aTol = BRep_Tool::Tolerance(aE); |
| 950 | aTol = aTol > theTolR3D ? aTol : theTolR3D; |
| 951 | iFlag=myContext->ComputePE(aPm, aTol, aE, aTx); |
| 952 | if (!iFlag) { |
| 953 | return bRet; |
| 954 | } |
| 955 | } |
| 956 | } |
| 957 | return !bRet; |
| 958 | } |
| 959 | |
| 960 | //======================================================================= |
| 961 | //function : IsExistingPaveBlock |
| 962 | //purpose : |
| 963 | //======================================================================= |
| 964 | Standard_Boolean BOPAlgo_PaveFiller::IsExistingPaveBlock |
| 965 | (const Handle(BOPDS_PaveBlock)& thePB, |
| 966 | const BOPDS_Curve& theNC, |
| 967 | const Standard_Real theTolR3D, |
| 968 | const BOPDS_MapOfPaveBlock& theMPBOnIn, |
| 969 | Handle(BOPDS_PaveBlock&) aPBOut) |
| 970 | { |
| 971 | Standard_Boolean bRet; |
| 972 | Standard_Real aT1, aT2, aTm, aTx; |
| 973 | Standard_Integer nSp, iFlag1, iFlag2, nV11, nV12, nV21, nV22; |
| 974 | gp_Pnt aP1, aPm, aP2; |
| 975 | Bnd_Box aBoxP1, aBoxPm, aBoxP2; |
| 976 | BOPDS_MapIteratorOfMapOfPaveBlock aIt; |
| 977 | // |
| 978 | bRet=Standard_False; |
| 979 | const IntTools_Curve& aIC=theNC.Curve(); |
| 980 | // |
| 981 | thePB->Range(aT1, aT2); |
| 982 | thePB->Indices(nV11, nV12); |
| 983 | //first point |
| 984 | aIC.D0(aT1, aP1); |
| 985 | aBoxP1.Add(aP1); |
| 986 | aBoxP1.Enlarge(theTolR3D); |
| 987 | //intermediate point |
| 988 | aTm=IntTools_Tools::IntermediatePoint (aT1, aT2); |
| 989 | aIC.D0(aTm, aPm); |
| 990 | aBoxPm.Add(aPm); |
| 991 | aBoxPm.Enlarge(theTolR3D); |
| 992 | //last point |
| 993 | aIC.D0(aT2, aP2); |
| 994 | aBoxP2.Add(aP2); |
| 995 | aBoxP2.Enlarge(theTolR3D); |
| 996 | // |
| 997 | aIt.Initialize(theMPBOnIn); |
| 998 | for (; aIt.More(); aIt.Next()) { |
| 999 | const Handle(BOPDS_PaveBlock)& aPB=aIt.Value(); |
| 1000 | aPB->Indices(nV21, nV22); |
| 1001 | nSp=aPB->Edge(); |
| 1002 | const BOPDS_ShapeInfo& aSISp=myDS->ChangeShapeInfo(nSp); |
| 1003 | const TopoDS_Edge& aSp=(*(TopoDS_Edge *)(&aSISp.Shape())); |
| 1004 | const Bnd_Box& aBoxSp=aSISp.Box(); |
| 1005 | // |
| 1006 | iFlag1 = (nV11 == nV21 || nV11 == nV22) ? 2 : (!aBoxSp.IsOut(aBoxP1) ? 1 : 0); |
| 1007 | iFlag2 = (nV12 == nV21 || nV12 == nV22) ? 2 : (!aBoxSp.IsOut(aBoxP2) ? 1 : 0); |
| 1008 | if (iFlag1 && iFlag2) { |
| 1009 | if (aBoxSp.IsOut(aBoxPm) || myContext->ComputePE(aPm, theTolR3D, aSp, aTx)) { |
| 1010 | continue; |
| 1011 | } |
| 1012 | // |
| 1013 | if (iFlag1 == 1) { |
| 1014 | iFlag1 = !myContext->ComputePE(aP1, theTolR3D, aSp, aTx); |
| 1015 | } |
| 1016 | // |
| 1017 | if (iFlag2 == 1) { |
| 1018 | iFlag2 = !myContext->ComputePE(aP2, theTolR3D, aSp, aTx); |
| 1019 | } |
| 1020 | // |
| 1021 | if (iFlag1 && iFlag2) { |
| 1022 | aPBOut = aPB; |
| 1023 | bRet=Standard_True; |
| 1024 | break; |
| 1025 | } |
| 1026 | } |
| 1027 | } |
| 1028 | return bRet; |
| 1029 | } |
| 1030 | |
| 1031 | //======================================================================= |
| 1032 | //function : PutBoundPaveOnCurve |
| 1033 | //purpose : |
| 1034 | //======================================================================= |
| 1035 | void BOPAlgo_PaveFiller::PutBoundPaveOnCurve(const TopoDS_Face& aF1, |
| 1036 | const TopoDS_Face& aF2, |
| 1037 | const Standard_Real aTolR3D, |
| 1038 | BOPDS_Curve& aNC, |
| 1039 | BOPCol_MapOfInteger& aMVOnIn, |
| 1040 | BOPCol_MapOfInteger& aMVB) |
| 1041 | { |
| 1042 | Standard_Boolean bVF; |
| 1043 | Standard_Integer nV, iFlag, nVn, j, aNbEP; |
| 1044 | Standard_Real aT[2], aTmin, aTmax, aTV, aTol, aTolVnew; |
| 1045 | gp_Pnt aP[2]; |
| 1046 | TopoDS_Vertex aVn; |
| 1047 | BOPDS_ListIteratorOfListOfPave aItLP; |
| 1048 | BOPDS_Pave aPn, aPMM[2]; |
| 1049 | // |
| 1050 | aTolVnew = Precision::Confusion(); |
| 1051 | // |
| 1052 | const IntTools_Curve& aIC=aNC.Curve(); |
| 1053 | aIC.Bounds(aT[0], aT[1], aP[0], aP[1]); |
| 1054 | // |
| 1055 | Handle(BOPDS_PaveBlock)& aPB=aNC.ChangePaveBlock1(); |
| 1056 | const BOPDS_ListOfPave& aLP=aPB->ExtPaves(); |
| 1057 | // |
| 1058 | aNbEP=aLP.Extent(); |
| 1059 | if (aNbEP) { |
| 1060 | aTmin=1.e10; |
| 1061 | aTmax=-aTmin; |
| 1062 | // |
| 1063 | aItLP.Initialize(aLP); |
| 1064 | for (; aItLP.More(); aItLP.Next()) { |
| 1065 | const BOPDS_Pave& aPv=aItLP.Value(); |
| 1066 | aPv.Contents(nV, aTV); |
| 1067 | if (aTV<aTmin) { |
| 1068 | aPMM[0]=aPv; |
| 1069 | aTmin=aTV; |
| 1070 | } |
| 1071 | if (aTV>aTmax) { |
| 1072 | aPMM[1]=aPv; |
| 1073 | aTmax=aTV; |
| 1074 | } |
| 1075 | } |
| 1076 | } |
| 1077 | // |
| 1078 | for (j=0; j<2; ++j) { |
| 1079 | //if curve is closed, process only one bound |
| 1080 | if (j && aP[1].IsEqual(aP[0], aTolVnew)) { |
| 1081 | continue; |
| 1082 | } |
| 1083 | // |
| 1084 | iFlag=1; |
| 1085 | // |
| 1086 | if (aNbEP) { |
| 1087 | Bnd_Box aBoxP; |
| 1088 | // |
| 1089 | aBoxP.Set(aP[j]); |
| 1090 | aTol = aTolR3D+Precision::Confusion(); |
| 1091 | aBoxP.Enlarge(aTol); |
| 1092 | const BOPDS_Pave& aPV=aPMM[j]; |
| 1093 | nV=aPV.Index(); |
| 1094 | const BOPDS_ShapeInfo& aSIV=myDS->ShapeInfo(nV); |
| 1095 | const TopoDS_Vertex& aV=(*(TopoDS_Vertex *)(&aSIV.Shape())); |
| 1096 | const Bnd_Box& aBoxV=aSIV.Box(); |
| 1097 | if (!aBoxP.IsOut(aBoxV)){ |
| 1098 | iFlag=BOPTools_AlgoTools::ComputeVV(aV, aP[j], aTol); |
| 1099 | } |
| 1100 | } |
| 1101 | if (iFlag) { |
| 1102 | // 900/L5 |
| 1103 | bVF=myContext->IsValidPointForFaces (aP[j], aF1, aF2, aTolR3D); |
| 1104 | if (!bVF) { |
| 1105 | continue; |
| 1106 | } |
| 1107 | // |
| 1108 | BOPDS_ShapeInfo aSIVn; |
| 1109 | // |
| 1110 | BOPTools_AlgoTools::MakeNewVertex(aP[j], aTolR3D, aVn); |
| 1111 | aSIVn.SetShapeType(TopAbs_VERTEX); |
| 1112 | aSIVn.SetShape(aVn); |
| 1113 | // |
| 1114 | nVn=myDS->Append(aSIVn); |
| 1115 | // |
| 1116 | aPn.SetIndex(nVn); |
| 1117 | aPn.SetParameter(aT[j]); |
| 1118 | aPB->AppendExtPave(aPn); |
| 1119 | // |
| 1120 | aVn=(*(TopoDS_Vertex *)(&myDS->Shape(nVn))); |
| 1121 | BOPTools_AlgoTools::UpdateVertex (aIC, aT[j], aVn); |
| 1122 | // |
| 1123 | aTolVnew = BRep_Tool::Tolerance(aVn); |
| 1124 | // |
| 1125 | BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nVn); |
| 1126 | Bnd_Box& aBoxDS=aSIDS.ChangeBox(); |
| 1127 | BRepBndLib::Add(aVn, aBoxDS); |
| 1128 | aMVOnIn.Add(nVn); |
| 1129 | aMVB.Add(nVn); |
| 1130 | } |
| 1131 | } |
| 1132 | } |
| 1133 | |
| 1134 | //======================================================================= |
| 1135 | //function : PutPavesOnCurve |
| 1136 | //purpose : |
| 1137 | //======================================================================= |
| 1138 | void BOPAlgo_PaveFiller::PutPavesOnCurve(const BOPCol_MapOfInteger& aMVOnIn, |
| 1139 | const Standard_Real aTolR3D, |
| 1140 | BOPDS_Curve& aNC, |
| 1141 | const Standard_Integer nF1, |
| 1142 | const Standard_Integer nF2, |
| 1143 | const BOPCol_MapOfInteger& aMI, |
| 1144 | const BOPCol_MapOfInteger& aMVEF, |
| 1145 | BOPCol_DataMapOfIntegerReal& aMVTol) |
| 1146 | { |
| 1147 | Standard_Boolean bInBothFaces; |
| 1148 | Standard_Integer nV; |
| 1149 | BOPCol_MapIteratorOfMapOfInteger aIt; |
| 1150 | // |
| 1151 | const Bnd_Box& aBoxC=aNC.Box(); |
| 1152 | // |
| 1153 | //Put EF vertices first |
| 1154 | aIt.Initialize(aMVEF); |
| 1155 | for (; aIt.More(); aIt.Next()) { |
| 1156 | nV=aIt.Value(); |
| 1157 | PutPaveOnCurve(nV, aTolR3D, aNC, aMI, aMVTol, 2); |
| 1158 | } |
| 1159 | //Put all other vertices |
| 1160 | aIt.Initialize(aMVOnIn); |
| 1161 | for (; aIt.More(); aIt.Next()) { |
| 1162 | nV=aIt.Value(); |
| 1163 | if (aMVEF.Contains(nV)) { |
| 1164 | continue; |
| 1165 | } |
| 1166 | // |
| 1167 | const BOPDS_ShapeInfo& aSIV=myDS->ShapeInfo(nV); |
| 1168 | const Bnd_Box& aBoxV=aSIV.Box(); |
| 1169 | // |
| 1170 | if (aBoxC.IsOut(aBoxV)){ |
| 1171 | continue; |
| 1172 | } |
| 1173 | if (!myDS->IsNewShape(nV)) { |
| 1174 | const BOPDS_FaceInfo& aFI1 = myDS->FaceInfo(nF1); |
| 1175 | const BOPDS_FaceInfo& aFI2 = myDS->FaceInfo(nF2); |
| 1176 | // |
| 1177 | bInBothFaces = (aFI1.VerticesOn().Contains(nV) || |
| 1178 | aFI1.VerticesIn().Contains(nV))&& |
| 1179 | (aFI2.VerticesOn().Contains(nV) || |
| 1180 | aFI2.VerticesIn().Contains(nV)); |
| 1181 | if (!bInBothFaces) { |
| 1182 | continue; |
| 1183 | } |
| 1184 | } |
| 1185 | // |
| 1186 | PutPaveOnCurve(nV, aTolR3D, aNC, aMI, aMVTol, 1); |
| 1187 | } |
| 1188 | } |
| 1189 | |
| 1190 | //======================================================================= |
| 1191 | //function : ExtendedTolerance |
| 1192 | //purpose : |
| 1193 | //======================================================================= |
| 1194 | Standard_Boolean BOPAlgo_PaveFiller::ExtendedTolerance(const Standard_Integer nV, |
| 1195 | const BOPCol_MapOfInteger& aMI, |
| 1196 | Standard_Real& aTolVExt, |
| 1197 | const Standard_Integer aType) |
| 1198 | { |
| 1199 | Standard_Boolean bFound = Standard_False; |
| 1200 | if (!(myDS->IsNewShape(nV))) { |
| 1201 | return bFound; |
| 1202 | } |
| 1203 | // |
| 1204 | Standard_Integer i, k, aNbLines, aNbInt; |
| 1205 | Standard_Real aT11, aT12, aD1, aD2, aD; |
| 1206 | TopoDS_Vertex aV; |
| 1207 | gp_Pnt aPV, aP11, aP12; |
| 1208 | // |
| 1209 | k = 0; |
| 1210 | aNbInt = 2; |
| 1211 | if (aType == 1) { |
| 1212 | aNbInt = 1; |
| 1213 | } else if (aType == 2) { |
| 1214 | k = 1; |
| 1215 | } |
| 1216 | // |
| 1217 | aV = (*(TopoDS_Vertex *)(&myDS->Shape(nV))); |
| 1218 | aPV=BRep_Tool::Pnt(aV); |
| 1219 | // |
| 1220 | BOPDS_VectorOfInterfEE& aEEs=myDS->InterfEE(); |
| 1221 | BOPDS_VectorOfInterfEF& aEFs=myDS->InterfEF(); |
| 1222 | // |
| 1223 | for (; k<aNbInt; ++k) { |
| 1224 | aNbLines = !k ? aEEs.Extent() : aEFs.Extent(); |
| 1225 | for (i = 0; i < aNbLines; ++i) { |
| 1226 | BOPDS_Interf *aInt = !k ? (BOPDS_Interf*) (&aEEs(i)) : |
| 1227 | (BOPDS_Interf*) (&aEFs(i)); |
| 1228 | if (aInt->IndexNew() == nV) { |
| 1229 | if (aMI.Contains(aInt->Index1()) && aMI.Contains(aInt->Index2())) { |
| 1230 | const IntTools_CommonPrt& aComPrt = !k ? aEEs(i).CommonPart() : |
| 1231 | aEFs(i).CommonPart(); |
| 1232 | // |
| 1233 | const TopoDS_Edge& aE1=aComPrt.Edge1(); |
| 1234 | aComPrt.Range1(aT11, aT12); |
| 1235 | BOPTools_AlgoTools::PointOnEdge(aE1, aT11, aP11); |
| 1236 | BOPTools_AlgoTools::PointOnEdge(aE1, aT12, aP12); |
| 1237 | aD1=aPV.Distance(aP11); |
| 1238 | aD2=aPV.Distance(aP12); |
| 1239 | aD=(aD1>aD2)? aD1 : aD2; |
| 1240 | if (aD>aTolVExt) { |
| 1241 | aTolVExt=aD; |
| 1242 | } |
| 1243 | return !bFound; |
| 1244 | }//if (aMI.Contains(aEF.Index1()) && aMI.Contains(aEF.Index2())) { |
| 1245 | }//if (aInt->IndexNew() == nV) { |
| 1246 | }//for (i = 0; i < aNbLines; ++i) { |
| 1247 | }//for (k=0; k<2; ++k) { |
| 1248 | return bFound; |
| 1249 | } |
| 1250 | |
| 1251 | //======================================================================= |
| 1252 | //function : GetEFPnts |
| 1253 | //purpose : |
| 1254 | //======================================================================= |
| 1255 | void BOPAlgo_PaveFiller::GetEFPnts(const Standard_Integer nF1, |
| 1256 | const Standard_Integer nF2, |
| 1257 | IntSurf_ListOfPntOn2S& aListOfPnts) |
| 1258 | { |
| 1259 | Standard_Integer nE, nF, nFOpposite, aNbEFs, i; |
| 1260 | Standard_Real U1, U2, V1, V2, f, l; |
| 1261 | BOPCol_MapOfInteger aMI; |
| 1262 | // |
| 1263 | //collect indexes of all shapes from nF1 and nF2. |
| 1264 | GetFullShapeMap(nF1, aMI); |
| 1265 | GetFullShapeMap(nF2, aMI); |
| 1266 | // |
| 1267 | BOPDS_VectorOfInterfEF& aEFs=myDS->InterfEF(); |
| 1268 | aNbEFs = aEFs.Extent(); |
| 1269 | // |
| 1270 | for(i = 0; i < aNbEFs; ++i) { |
| 1271 | const BOPDS_InterfEF& aEF = aEFs(i); |
| 1272 | if (aEF.HasIndexNew()) { |
| 1273 | aEF.Indices(nE, nFOpposite); |
| 1274 | if(aMI.Contains(nE) && aMI.Contains(nFOpposite)) { |
| 1275 | const IntTools_CommonPrt& aCP = aEF.CommonPart(); |
| 1276 | Standard_Real aPar = aCP.VertexParameter1(); |
| 1277 | const TopoDS_Edge& aE = (*(TopoDS_Edge*)(&myDS->Shape(nE))); |
| 1278 | const TopoDS_Face& aFOpposite = (*(TopoDS_Face*)(&myDS->Shape(nFOpposite))); |
| 1279 | // |
| 1280 | const Handle(Geom_Curve)& aCurve = BRep_Tool::Curve(aE, f, l); |
| 1281 | // |
| 1282 | nF = (nFOpposite == nF1) ? nF2 : nF1; |
| 1283 | const TopoDS_Face& aF = (*(TopoDS_Face*)(&myDS->Shape(nF))); |
| 1284 | Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface(aE, aF, f, l); |
| 1285 | // |
| 1286 | GeomAPI_ProjectPointOnSurf& aProj = myContext->ProjPS(aFOpposite); |
| 1287 | // |
| 1288 | gp_Pnt aPoint; |
| 1289 | aCurve->D0(aPar, aPoint); |
| 1290 | IntSurf_PntOn2S aPnt; |
| 1291 | if(!aPCurve.IsNull()) { |
| 1292 | gp_Pnt2d aP2d = aPCurve->Value(aPar); |
| 1293 | aProj.Perform(aPoint); |
| 1294 | if(aProj.IsDone()) { |
| 1295 | aProj.LowerDistanceParameters(U1,V1); |
| 1296 | if (nF == nF1) { |
| 1297 | aPnt.SetValue(aP2d.X(),aP2d.Y(),U1,V1); |
| 1298 | } else { |
| 1299 | aPnt.SetValue(U1,V1,aP2d.X(),aP2d.Y()); |
| 1300 | } |
| 1301 | aListOfPnts.Append(aPnt); |
| 1302 | } |
| 1303 | } |
| 1304 | else { |
| 1305 | GeomAPI_ProjectPointOnSurf& aProj1 = myContext->ProjPS(aF); |
| 1306 | aProj1.Perform(aPoint); |
| 1307 | aProj.Perform(aPoint); |
| 1308 | if(aProj1.IsDone() && aProj.IsDone()){ |
| 1309 | aProj1.LowerDistanceParameters(U1,V1); |
| 1310 | aProj.LowerDistanceParameters(U2,V2); |
| 1311 | if (nF == nF1) { |
| 1312 | aPnt.SetValue(U1,V1,U2,V2); |
| 1313 | } else { |
| 1314 | aPnt.SetValue(U2,V2,U1,V1); |
| 1315 | } |
| 1316 | aListOfPnts.Append(aPnt); |
| 1317 | } |
| 1318 | } |
| 1319 | } |
| 1320 | } |
| 1321 | } |
| 1322 | } |
| 1323 | |
| 1324 | //======================================================================= |
| 1325 | //function : ProcessUnUsedVertices |
| 1326 | //purpose : |
| 1327 | //======================================================================= |
| 1328 | void BOPAlgo_PaveFiller::PutEFPavesOnCurve(BOPDS_Curve& aNC, |
| 1329 | const BOPCol_MapOfInteger& aMI, |
| 1330 | const BOPCol_MapOfInteger& aMVEF, |
| 1331 | BOPCol_DataMapOfIntegerReal& aMVTol) |
| 1332 | { |
| 1333 | if (!aMVEF.Extent()) { |
| 1334 | return; |
| 1335 | } |
| 1336 | // |
| 1337 | const IntTools_Curve& aIC=aNC.Curve(); |
| 1338 | GeomAbs_CurveType aTypeC; |
| 1339 | aTypeC=aIC.Type(); |
| 1340 | if (!(aTypeC==GeomAbs_BezierCurve || aTypeC==GeomAbs_BSplineCurve)) { |
| 1341 | return; |
| 1342 | } |
| 1343 | // |
| 1344 | Standard_Integer nV; |
| 1345 | BOPCol_MapOfInteger aMV; |
| 1346 | // |
| 1347 | aMV.Assign(aMVEF); |
| 1348 | RemoveUsedVertices(aNC, aMV); |
| 1349 | if (!aMV.Extent()) { |
| 1350 | return; |
| 1351 | } |
| 1352 | // |
| 1353 | Standard_Real aDist; |
| 1354 | BOPDS_Pave aPave; |
| 1355 | // |
| 1356 | const Handle(Geom_Curve)& aC3D=aIC.Curve(); |
| 1357 | GeomAPI_ProjectPointOnCurve& aProjPT = myContext->ProjPT(aC3D); |
| 1358 | // |
| 1359 | BOPCol_MapIteratorOfMapOfInteger aItMI; |
| 1360 | aItMI.Initialize(aMV); |
| 1361 | for (; aItMI.More(); aItMI.Next()) { |
| 1362 | nV = aItMI.Value(); |
| 1363 | const TopoDS_Vertex& aV = (*(TopoDS_Vertex *)(&myDS->Shape(nV))); |
| 1364 | gp_Pnt aPV = BRep_Tool::Pnt(aV); |
| 1365 | aProjPT.Perform(aPV); |
| 1366 | Standard_Integer aNbPoints = aProjPT.NbPoints(); |
| 1367 | if (aNbPoints) { |
| 1368 | aDist = aProjPT.LowerDistance(); |
| 1369 | PutPaveOnCurve(nV, aDist, aNC, aMI, aMVTol); |
| 1370 | } |
| 1371 | } |
| 1372 | } |
| 1373 | |
| 1374 | //======================================================================= |
| 1375 | //function : ProcessUnUsedVertices |
| 1376 | //purpose : |
| 1377 | //======================================================================= |
| 1378 | void BOPAlgo_PaveFiller::PutStickPavesOnCurve(const TopoDS_Face& aF1, |
| 1379 | const TopoDS_Face& aF2, |
| 1380 | const BOPCol_MapOfInteger& aMI, |
| 1381 | BOPDS_Curve& aNC, |
| 1382 | const BOPCol_MapOfInteger& aMVStick, |
| 1383 | BOPCol_DataMapOfIntegerReal& aMVTol) |
| 1384 | { |
| 1385 | BOPCol_MapOfInteger aMV; |
| 1386 | aMV.Assign(aMVStick); |
| 1387 | RemoveUsedVertices(aNC, aMV); |
| 1388 | // |
| 1389 | if (!aMV.Extent()) { |
| 1390 | return; |
| 1391 | } |
| 1392 | // |
| 1393 | GeomAbs_SurfaceType aType1, aType2; |
| 1394 | Handle(Geom_Surface) aS1=BRep_Tool::Surface(aF1); |
| 1395 | Handle(Geom_Surface) aS2=BRep_Tool::Surface(aF2); |
| 1396 | GeomAdaptor_Surface aGAS1(aS1); |
| 1397 | GeomAdaptor_Surface aGAS2(aS2); |
| 1398 | // |
| 1399 | aType1=aGAS1.GetType(); |
| 1400 | aType2=aGAS2.GetType(); |
| 1401 | // |
| 1402 | if (aType1==GeomAbs_Torus || aType2==GeomAbs_Torus) { |
| 1403 | GeomAbs_CurveType aTypeC; |
| 1404 | // |
| 1405 | const IntTools_Curve& aIC=aNC.Curve(); |
| 1406 | aTypeC=aIC.Type(); |
| 1407 | if (aTypeC==GeomAbs_BezierCurve || aTypeC==GeomAbs_BSplineCurve) { |
| 1408 | Handle(Geom2d_Curve) aC2D[2]; |
| 1409 | // |
| 1410 | aC2D[0]=aIC.FirstCurve2d(); |
| 1411 | aC2D[1]=aIC.SecondCurve2d(); |
| 1412 | if (!aC2D[0].IsNull() && !aC2D[1].IsNull()) { |
| 1413 | Standard_Integer nV, m, n; |
| 1414 | Standard_Real aTC[2], aD, aD2, u, v, aDT2, aScPr, aDScPr; |
| 1415 | gp_Pnt aPC[2], aPV; |
| 1416 | gp_Dir aDN[2]; |
| 1417 | gp_Pnt2d aP2D; |
| 1418 | BOPCol_MapIteratorOfMapOfInteger aItMI, aItMI1; |
| 1419 | // |
| 1420 | aDT2=2e-7; // the rich criteria |
| 1421 | aDScPr=5.e-9; // the creasing criteria |
| 1422 | aIC.Bounds(aTC[0], aTC[1], aPC[0], aPC[1]); |
| 1423 | // |
| 1424 | aItMI.Initialize(aMV); |
| 1425 | for (; aItMI.More(); aItMI.Next()) { |
| 1426 | nV = aItMI.Value(); |
| 1427 | const TopoDS_Vertex& aV=*((TopoDS_Vertex*)&myDS->Shape(nV)); |
| 1428 | aPV=BRep_Tool::Pnt(aV); |
| 1429 | // |
| 1430 | for (m=0; m<2; ++m) { |
| 1431 | aD2=aPC[m].SquareDistance(aPV); |
| 1432 | if (aD2>aDT2) {// no rich |
| 1433 | continue; |
| 1434 | } |
| 1435 | // |
| 1436 | for (n=0; n<2; ++n) { |
| 1437 | Handle(Geom_Surface)& aS=(!n)? aS1 : aS2; |
| 1438 | aC2D[n]->D0(aTC[m], aP2D); |
| 1439 | aP2D.Coord(u, v); |
| 1440 | BOPTools_AlgoTools3D::GetNormalToSurface(aS, u, v, aDN[n]); |
| 1441 | } |
| 1442 | // |
| 1443 | aScPr=aDN[0]*aDN[1]; |
| 1444 | if (aScPr<0.) { |
| 1445 | aScPr=-aScPr; |
| 1446 | } |
| 1447 | aScPr=1.-aScPr; |
| 1448 | // |
| 1449 | if (aScPr>aDScPr) { |
| 1450 | continue; |
| 1451 | } |
| 1452 | // |
| 1453 | // The intersection curve aIC is vanishing curve (the crease) |
| 1454 | aD=sqrt(aD2); |
| 1455 | // |
| 1456 | PutPaveOnCurve(nV, aD, aNC, aMI, aMVTol); |
| 1457 | } |
| 1458 | }//for (jVU=1; jVU=aNbVU; ++jVU) { |
| 1459 | } |
| 1460 | }//if (aTypeC==GeomAbs_BezierCurve || aTypeC==GeomAbs_BSplineCurve) { |
| 1461 | }//if(aType1==GeomAbs_Torus || aType2==GeomAbs_Torus) { |
| 1462 | } |
| 1463 | |
| 1464 | //======================================================================= |
| 1465 | //function : GetStickVertices |
| 1466 | //purpose : |
| 1467 | //======================================================================= |
| 1468 | void BOPAlgo_PaveFiller::GetStickVertices(const Standard_Integer nF1, |
| 1469 | const Standard_Integer nF2, |
| 1470 | BOPCol_MapOfInteger& aMVStick, |
| 1471 | BOPCol_MapOfInteger& aMVEF, |
| 1472 | BOPCol_MapOfInteger& aMI) |
| 1473 | { |
| 1474 | Standard_Integer nS1, nS2, nVNew, aTypeInt, i; |
| 1475 | // |
| 1476 | BOPDS_VectorOfInterfVV& aVVs=myDS->InterfVV(); |
| 1477 | BOPDS_VectorOfInterfVE& aVEs=myDS->InterfVE(); |
| 1478 | BOPDS_VectorOfInterfEE& aEEs=myDS->InterfEE(); |
| 1479 | BOPDS_VectorOfInterfVF& aVFs=myDS->InterfVF(); |
| 1480 | BOPDS_VectorOfInterfEF& aEFs=myDS->InterfEF(); |
| 1481 | // |
| 1482 | Standard_Integer aNbLines[5] = {aVVs.Extent(), aVEs.Extent(), aEEs.Extent(), |
| 1483 | aVFs.Extent(), aEFs.Extent()}; |
| 1484 | //collect indices of all shapes from nF1 and nF2. |
| 1485 | aMI.Clear(); |
| 1486 | GetFullShapeMap(nF1, aMI); |
| 1487 | GetFullShapeMap(nF2, aMI); |
| 1488 | // |
| 1489 | //collect VV, VE, EE, VF interferences |
| 1490 | for (aTypeInt = 0; aTypeInt < 4; ++aTypeInt) { |
| 1491 | for (i = 0; i < aNbLines[aTypeInt]; ++i) { |
| 1492 | BOPDS_Interf* aInt = (aTypeInt==0) ? (BOPDS_Interf*)(&aVVs(i)) : |
| 1493 | ((aTypeInt==1) ? (BOPDS_Interf*)(&aVEs(i)) : |
| 1494 | ((aTypeInt==2) ? (BOPDS_Interf*)(&aEEs(i)) : (BOPDS_Interf*)(&aVFs(i)))); |
| 1495 | if (aInt->HasIndexNew()) { |
| 1496 | aInt->Indices(nS1, nS2); |
| 1497 | if(aMI.Contains(nS1) && aMI.Contains(nS2)) { |
| 1498 | nVNew = aInt->IndexNew(); |
| 1499 | aMVStick.Add(nVNew); |
| 1500 | } |
| 1501 | } |
| 1502 | } |
| 1503 | } |
| 1504 | //collect EF interferences |
| 1505 | for (i = 0; i < aNbLines[4]; ++i) { |
| 1506 | const BOPDS_InterfEF& aInt = aEFs(i); |
| 1507 | if (aInt.HasIndexNew()) { |
| 1508 | aInt.Indices(nS1, nS2); |
| 1509 | if(aMI.Contains(nS1) && aMI.Contains(nS2)) { |
| 1510 | nVNew = aInt.IndexNew(); |
| 1511 | aMVStick.Add(nVNew); |
| 1512 | aMVEF.Add(nVNew); |
| 1513 | } |
| 1514 | } |
| 1515 | } |
| 1516 | } |
| 1517 | |
| 1518 | //======================================================================= |
| 1519 | // function: GetFullShapeMap |
| 1520 | // purpose: |
| 1521 | //======================================================================= |
| 1522 | void BOPAlgo_PaveFiller::GetFullShapeMap(const Standard_Integer nF, |
| 1523 | BOPCol_MapOfInteger& aMI) |
| 1524 | { |
| 1525 | BOPCol_ListIteratorOfListOfInteger aIt; |
| 1526 | Standard_Integer nS; |
| 1527 | // |
| 1528 | const BOPDS_ShapeInfo& aSI = myDS->ShapeInfo(nF); |
| 1529 | const BOPCol_ListOfInteger& aLI = aSI.SubShapes(); |
| 1530 | // |
| 1531 | aMI.Add(nF); |
| 1532 | aIt.Initialize(aLI); |
| 1533 | for (; aIt.More(); aIt.Next()) { |
| 1534 | nS = aIt.Value(); |
| 1535 | aMI.Add(nS); |
| 1536 | } |
| 1537 | } |
| 1538 | |
| 1539 | //======================================================================= |
| 1540 | // function: RemoveUsedVertices |
| 1541 | // purpose: |
| 1542 | //======================================================================= |
| 1543 | void BOPAlgo_PaveFiller::RemoveUsedVertices(BOPDS_Curve& aNC, |
| 1544 | BOPCol_MapOfInteger& aMV) |
| 1545 | { |
| 1546 | if (!aMV.Extent()) { |
| 1547 | return; |
| 1548 | } |
| 1549 | Standard_Integer nV; |
| 1550 | BOPDS_Pave aPave; |
| 1551 | BOPDS_ListIteratorOfListOfPave aItLP; |
| 1552 | // |
| 1553 | Handle(BOPDS_PaveBlock)& aPB=aNC.ChangePaveBlock1(); |
| 1554 | const BOPDS_ListOfPave& aLP = aPB->ExtPaves(); |
| 1555 | aItLP.Initialize(aLP); |
| 1556 | for (;aItLP.More();aItLP.Next()) { |
| 1557 | aPave = aItLP.Value(); |
| 1558 | nV = aPave.Index(); |
| 1559 | aMV.Remove(nV); |
| 1560 | } |
| 1561 | } |
| 1562 | |
| 1563 | //======================================================================= |
| 1564 | //function : PutPaveOnCurve |
| 1565 | //purpose : |
| 1566 | //======================================================================= |
| 1567 | void BOPAlgo_PaveFiller::PutPaveOnCurve(const Standard_Integer nV, |
| 1568 | const Standard_Real aTolR3D, |
| 1569 | BOPDS_Curve& aNC, |
| 1570 | const BOPCol_MapOfInteger& aMI, |
| 1571 | BOPCol_DataMapOfIntegerReal& aMVTol, |
| 1572 | const Standard_Integer iCheckExtend) |
| 1573 | { |
| 1574 | Standard_Boolean bIsVertexOnLine; |
| 1575 | Standard_Real aT, aTol, aTolNew; |
| 1576 | BOPDS_Pave aPave; |
| 1577 | // |
| 1578 | const TopoDS_Vertex aV = (*(TopoDS_Vertex *)(&myDS->Shape(nV))); |
| 1579 | Handle(BOPDS_PaveBlock)& aPB=aNC.ChangePaveBlock1(); |
| 1580 | const IntTools_Curve& aIC = aNC.Curve(); |
| 1581 | // |
| 1582 | bIsVertexOnLine=myContext->IsVertexOnLine(aV, aIC, aTolR3D, aT); |
| 1583 | if (!bIsVertexOnLine && iCheckExtend) { |
| 1584 | aTol = BRep_Tool::Tolerance(aV); |
| 1585 | // |
| 1586 | ExtendedTolerance(nV, aMI, aTol, iCheckExtend); |
| 1587 | bIsVertexOnLine=myContext->IsVertexOnLine(aV, aTol, aIC, aTolR3D, aT); |
| 1588 | } |
| 1589 | // |
| 1590 | if (bIsVertexOnLine) { |
| 1591 | aPave.SetIndex(nV); |
| 1592 | aPave.SetParameter(aT); |
| 1593 | // |
| 1594 | aPB->AppendExtPave(aPave); |
| 1595 | // |
| 1596 | aTol = BRep_Tool::Tolerance(aV); |
| 1597 | // |
| 1598 | BOPTools_AlgoTools::UpdateVertex (aIC, aT, aV); |
| 1599 | // |
| 1600 | if (!aMVTol.IsBound(nV)) { |
| 1601 | aTolNew = BRep_Tool::Tolerance(aV); |
| 1602 | if (aTolNew > aTol) { |
| 1603 | aMVTol.Bind(nV, aTol); |
| 1604 | } |
| 1605 | } |
| 1606 | // |
| 1607 | BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nV); |
| 1608 | Bnd_Box& aBoxDS=aSIDS.ChangeBox(); |
| 1609 | BRepBndLib::Add(aV, aBoxDS); |
| 1610 | } |
| 1611 | } |
| 1612 | |
| 1613 | //======================================================================= |
| 1614 | //function : ProcessOldPaveBlocks |
| 1615 | //purpose : |
| 1616 | //======================================================================= |
| 1617 | void BOPAlgo_PaveFiller::ProcessExistingPaveBlocks |
| 1618 | (const Standard_Integer theInt, |
| 1619 | const BOPDS_MapOfPaveBlock& aMPBOnIn, |
| 1620 | BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& aMSCPB, |
| 1621 | BOPCol_DataMapOfShapeInteger& aMVI, |
| 1622 | const BOPCol_MapOfInteger& aMVB, |
| 1623 | BOPDS_MapOfPaveBlock& aMPB) |
| 1624 | { |
| 1625 | Standard_Integer nV, nE, iFlag; |
| 1626 | Standard_Real aT; |
| 1627 | BOPCol_MapIteratorOfMapOfInteger aItB; |
| 1628 | BOPDS_MapIteratorOfMapOfPaveBlock aItPB; |
| 1629 | // |
| 1630 | BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF(); |
| 1631 | BOPDS_InterfFF& aFF = aFFs(theInt); |
| 1632 | BOPDS_VectorOfCurve& aVC=aFF.ChangeCurves(); |
| 1633 | // |
| 1634 | aItB.Initialize(aMVB); |
| 1635 | for (; aItB.More(); aItB.Next()) { |
| 1636 | nV = aItB.Value(); |
| 1637 | const BOPDS_ShapeInfo& aSIV=myDS->ShapeInfo(nV); |
| 1638 | const Bnd_Box& aBoxV=aSIV.Box(); |
| 1639 | const TopoDS_Vertex& aV = *(TopoDS_Vertex*)&aSIV.Shape(); |
| 1640 | if (!aMVI.IsBound(aV)) { |
| 1641 | continue; |
| 1642 | } |
| 1643 | // |
| 1644 | aItPB.Initialize(aMPBOnIn); |
| 1645 | for (; aItPB.More(); aItPB.Next()) { |
| 1646 | const Handle(BOPDS_PaveBlock)& aPB = aItPB.Value(); |
| 1647 | if (aPB->Pave1().Index() == nV || aPB->Pave2().Index() == nV) { |
| 1648 | continue; |
| 1649 | } |
| 1650 | // |
| 1651 | if (aMPB.Contains(aPB)) { |
| 1652 | continue; |
| 1653 | } |
| 1654 | nE=aPB->Edge(); |
| 1655 | const BOPDS_ShapeInfo& aSIE=myDS->ShapeInfo(nE); |
| 1656 | const Bnd_Box& aBoxE=aSIE.Box(); |
| 1657 | // |
| 1658 | if (!aBoxV.IsOut(aBoxE)) { |
| 1659 | const TopoDS_Edge& aE = *(TopoDS_Edge*)&aSIE.Shape(); |
| 1660 | // |
| 1661 | iFlag=myContext->ComputeVE (aV, aE, aT); |
| 1662 | if (!iFlag) { |
| 1663 | aMPB.Add(aPB); |
| 1664 | // |
| 1665 | PreparePostTreatFF(theInt, aPB, aMSCPB, aMVI, aVC); |
| 1666 | } |
| 1667 | } |
| 1668 | } |
| 1669 | } |
| 1670 | } |
| 1671 | |
| 1672 | //======================================================================= |
| 1673 | //function : UpdateExistingPaveBlocks |
| 1674 | //purpose : |
| 1675 | //======================================================================= |
| 1676 | void BOPAlgo_PaveFiller::UpdateExistingPaveBlocks |
| 1677 | (const Handle(BOPDS_PaveBlock)& aPBf, |
| 1678 | BOPDS_ListOfPaveBlock& aLPB, |
| 1679 | const Standard_Integer nF1, |
| 1680 | const Standard_Integer nF2) |
| 1681 | { |
| 1682 | Standard_Integer nE; |
| 1683 | Standard_Boolean bCB; |
| 1684 | Handle(BOPDS_PaveBlock) aPB, aPB1, aPB2, aPB2n; |
| 1685 | Handle(BOPDS_CommonBlock) aCB; |
| 1686 | BOPDS_ListIteratorOfListOfPaveBlock aIt, aIt1, aIt2; |
| 1687 | BOPDS_IndexedMapOfPaveBlock aMPB; |
| 1688 | // |
| 1689 | //remove micro edges from aLPB |
| 1690 | aIt.Initialize(aLPB); |
| 1691 | for (; aIt.More();) { |
| 1692 | aPB = aIt.Value(); |
| 1693 | const TopoDS_Edge& aE = *(TopoDS_Edge*)&myDS->Shape(aPB->Edge()); |
| 1694 | if (BOPTools_AlgoTools::IsMicroEdge(aE, myContext)) { |
| 1695 | aLPB.Remove(aIt); |
| 1696 | continue; |
| 1697 | } |
| 1698 | aIt.Next(); |
| 1699 | } |
| 1700 | // |
| 1701 | if (!aLPB.Extent()) { |
| 1702 | return; |
| 1703 | } |
| 1704 | //update face info |
| 1705 | myDS->UpdateFaceInfoOn(nF1); |
| 1706 | // |
| 1707 | myDS->UpdateFaceInfoOn(nF2); |
| 1708 | // |
| 1709 | BOPDS_FaceInfo& aFI1 = myDS->ChangeFaceInfo(nF1); |
| 1710 | BOPDS_FaceInfo& aFI2 = myDS->ChangeFaceInfo(nF2); |
| 1711 | // |
| 1712 | BOPDS_IndexedMapOfPaveBlock& aMPBOn1 = aFI1.ChangePaveBlocksOn(); |
| 1713 | BOPDS_IndexedMapOfPaveBlock& aMPBIn1 = aFI1.ChangePaveBlocksIn(); |
| 1714 | BOPDS_IndexedMapOfPaveBlock& aMPBOn2 = aFI2.ChangePaveBlocksOn(); |
| 1715 | BOPDS_IndexedMapOfPaveBlock& aMPBIn2 = aFI2.ChangePaveBlocksIn(); |
| 1716 | // |
| 1717 | // remove old pave blocks |
| 1718 | const Handle(BOPDS_CommonBlock)& aCB1 = myDS->CommonBlock(aPBf); |
| 1719 | bCB = !aCB1.IsNull(); |
| 1720 | BOPDS_ListOfPaveBlock aLPB1; |
| 1721 | // |
| 1722 | if (bCB) { |
| 1723 | aLPB1.Assign(aCB1->PaveBlocks()); |
| 1724 | } else { |
| 1725 | aLPB1.Append(aPBf); |
| 1726 | } |
| 1727 | aIt1.Initialize(aLPB1); |
| 1728 | for (; aIt1.More(); aIt1.Next()) { |
| 1729 | aPB1 = aIt1.Value(); |
| 1730 | nE = aPB1->OriginalEdge(); |
| 1731 | // |
| 1732 | BOPDS_ListOfPaveBlock& aLPB2 = myDS->ChangePaveBlocks(nE); |
| 1733 | aIt2.Initialize(aLPB2); |
| 1734 | for (; aIt2.More(); aIt2.Next()) { |
| 1735 | aPB2 = aIt2.Value(); |
| 1736 | if (aPB1 == aPB2) { |
| 1737 | aLPB2.Remove(aIt2); |
| 1738 | break; |
| 1739 | } |
| 1740 | } |
| 1741 | } |
| 1742 | // |
| 1743 | if (bCB) { |
| 1744 | //create new pave blocks |
| 1745 | const BOPCol_ListOfInteger& aFaces = aCB1->Faces(); |
| 1746 | aIt.Initialize(aLPB); |
| 1747 | for (; aIt.More(); aIt.Next()) { |
| 1748 | Handle(BOPDS_PaveBlock)& aPB = aIt.ChangeValue(); |
| 1749 | // |
| 1750 | aCB = new BOPDS_CommonBlock; |
| 1751 | aIt1.Initialize(aLPB1); |
| 1752 | for (; aIt1.More(); aIt1.Next()) { |
| 1753 | aPB2 = aIt1.Value(); |
| 1754 | nE = aPB2->OriginalEdge(); |
| 1755 | // |
| 1756 | aPB2n = new BOPDS_PaveBlock; |
| 1757 | aPB2n->SetPave1(aPB->Pave1()); |
| 1758 | aPB2n->SetPave2(aPB->Pave2()); |
| 1759 | aPB2n->SetEdge(aPB->Edge()); |
| 1760 | aPB2n->SetOriginalEdge(nE); |
| 1761 | aCB->AddPaveBlock(aPB2n); |
| 1762 | myDS->SetCommonBlock(aPB2n, aCB); |
| 1763 | myDS->ChangePaveBlocks(nE).Append(aPB2n); |
| 1764 | } |
| 1765 | aCB->AddFaces(aFaces); |
| 1766 | myDS->SortPaveBlocks(aCB); |
| 1767 | // |
| 1768 | aPB=aCB->PaveBlocks().First(); |
| 1769 | } |
| 1770 | } |
| 1771 | // |
| 1772 | aIt.Initialize(aLPB); |
| 1773 | for (; aIt.More(); aIt.Next()) { |
| 1774 | Handle(BOPDS_PaveBlock)& aPB = aIt.ChangeValue(); |
| 1775 | nE = aPB->OriginalEdge(); |
| 1776 | // |
| 1777 | Standard_Integer nF = (aMPBOn1.Contains(aPBf) || |
| 1778 | aMPBIn1.Contains(aPBf)) ? nF2 : nF1; |
| 1779 | const TopoDS_Face& aF = *(TopoDS_Face*)&myDS->Shape(nF); |
| 1780 | IntTools_Range aShrR(aPB->Pave1().Parameter(), aPB->Pave2().Parameter()); |
| 1781 | const TopoDS_Edge& aE = *(TopoDS_Edge*)&myDS->Shape(aPB->Edge()); |
| 1782 | // |
| 1783 | Standard_Boolean bCom = BOPTools_AlgoTools::IsBlockInOnFace(aShrR, aF, aE, myContext); |
| 1784 | if (bCom) { |
| 1785 | if (bCB) { |
| 1786 | aCB = myDS->CommonBlock(aPB); |
| 1787 | aCB->AddFace(nF); |
| 1788 | } else { |
| 1789 | aCB = new BOPDS_CommonBlock; |
| 1790 | aCB->AddPaveBlock(aPB); |
| 1791 | aCB->AddFace(nF1); |
| 1792 | aCB->AddFace(nF2); |
| 1793 | // |
| 1794 | myDS->SetCommonBlock(aPB, aCB); |
| 1795 | } |
| 1796 | aMPB.Add(aPB); |
| 1797 | } |
| 1798 | if (!bCB) { |
| 1799 | myDS->ChangePaveBlocks(nE).Append(aPB); |
| 1800 | } |
| 1801 | } |
| 1802 | // |
| 1803 | Standard_Integer i, aNbPB; |
| 1804 | Standard_Boolean bIn1, bIn2; |
| 1805 | // |
| 1806 | bIn1 = aMPBOn1.Contains(aPBf) || aMPBIn1.Contains(aPBf); |
| 1807 | bIn2 = aMPBOn2.Contains(aPBf) || aMPBIn2.Contains(aPBf); |
| 1808 | // |
| 1809 | aNbPB=aMPB.Extent(); |
| 1810 | for (i=1; i<=aNbPB; ++i) { |
| 1811 | aPB = aMPB(i); |
| 1812 | if (!bIn1) { |
| 1813 | aMPBIn1.Add(aPB); |
| 1814 | } |
| 1815 | // |
| 1816 | if (!bIn2) { |
| 1817 | aMPBIn2.Add(aPB); |
| 1818 | } |
| 1819 | } |
| 1820 | } |
| 1821 | |
| 1822 | //======================================================================= |
| 1823 | // function: PutClosingPaveOnCurve |
| 1824 | // purpose: |
| 1825 | //======================================================================= |
| 1826 | void BOPAlgo_PaveFiller::PutClosingPaveOnCurve(BOPDS_Curve& aNC) |
| 1827 | { |
| 1828 | Standard_Boolean bIsClosed, bHasBounds, bAdded; |
| 1829 | Standard_Integer nVC, j; |
| 1830 | Standard_Real aT[2], aTC, dT, aTx; |
| 1831 | gp_Pnt aP[2] ; |
| 1832 | BOPDS_Pave aPVx; |
| 1833 | BOPDS_ListIteratorOfListOfPave aItLP; |
| 1834 | // |
| 1835 | const IntTools_Curve& aIC=aNC.Curve(); |
| 1836 | const Handle(Geom_Curve)& aC3D=aIC.Curve(); |
| 1837 | if(aC3D.IsNull()) { |
| 1838 | return; |
| 1839 | } |
| 1840 | // |
| 1841 | bIsClosed=IntTools_Tools::IsClosed(aC3D); |
| 1842 | if (!bIsClosed) { |
| 1843 | return; |
| 1844 | } |
| 1845 | // |
| 1846 | bHasBounds=aIC.HasBounds (); |
| 1847 | if (!bHasBounds){ |
| 1848 | return; |
| 1849 | } |
| 1850 | // |
| 1851 | bAdded=Standard_False; |
| 1852 | dT=Precision::PConfusion(); |
| 1853 | aIC.Bounds (aT[0], aT[1], aP[0], aP[1]); |
| 1854 | // |
| 1855 | Handle(BOPDS_PaveBlock)& aPB=aNC.ChangePaveBlock1(); |
| 1856 | BOPDS_ListOfPave& aLP=aPB->ChangeExtPaves(); |
| 1857 | // |
| 1858 | aItLP.Initialize(aLP); |
| 1859 | for (; aItLP.More() && !bAdded; aItLP.Next()) { |
| 1860 | const BOPDS_Pave& aPC=aItLP.Value(); |
| 1861 | nVC=aPC.Index(); |
| 1862 | aTC=aPC.Parameter(); |
| 1863 | // |
| 1864 | for (j=0; j<2; ++j) { |
| 1865 | if (fabs(aTC-aT[j]) < dT) { |
| 1866 | aTx=(!j) ? aT[1] : aT[0]; |
| 1867 | aPVx.SetIndex(nVC); |
| 1868 | aPVx.SetParameter(aTx); |
| 1869 | aLP.Append(aPVx); |
| 1870 | // |
| 1871 | bAdded=Standard_True; |
| 1872 | break; |
| 1873 | } |
| 1874 | } |
| 1875 | } |
| 1876 | } |
| 1877 | |
| 1878 | //======================================================================= |
| 1879 | //function : PreparePostTreatFF |
| 1880 | //purpose : |
| 1881 | //======================================================================= |
| 1882 | void BOPAlgo_PaveFiller::PreparePostTreatFF |
| 1883 | (const Standard_Integer aInt, |
| 1884 | const Handle(BOPDS_PaveBlock)& aPB, |
| 1885 | BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& aMSCPB, |
| 1886 | BOPCol_DataMapOfShapeInteger& aMVI, |
| 1887 | BOPDS_VectorOfCurve& aVC) |
| 1888 | { |
| 1889 | Standard_Integer nV1, nV2; |
| 1890 | // |
| 1891 | Standard_Integer iC=aVC.Append()-1; |
| 1892 | BOPDS_ListOfPaveBlock& aLPBC = aVC(iC).ChangePaveBlocks(); |
| 1893 | aLPBC.Append(aPB); |
| 1894 | // |
| 1895 | aPB->Indices(nV1, nV2); |
| 1896 | const TopoDS_Vertex& aV1=(*(TopoDS_Vertex *)(&myDS->Shape(nV1))); |
| 1897 | const TopoDS_Vertex& aV2=(*(TopoDS_Vertex *)(&myDS->Shape(nV2))); |
| 1898 | const TopoDS_Edge& aE = *(TopoDS_Edge*)&myDS->Shape(aPB->Edge()); |
| 1899 | // Keep info for post treatment |
| 1900 | BOPDS_CoupleOfPaveBlocks aCPB; |
| 1901 | aCPB.SetIndexInterf(aInt); |
| 1902 | aCPB.SetIndex(iC); |
| 1903 | aCPB.SetPaveBlock1(aPB); |
| 1904 | // |
| 1905 | aMSCPB.Add(aE, aCPB); |
| 1906 | aMVI.Bind(aV1, nV1); |
| 1907 | aMVI.Bind(aV2, nV2); |
| 1908 | } |
| 1909 | |
| 1910 | //======================================================================= |
| 1911 | //function : CheckPlanes |
| 1912 | //purpose : |
| 1913 | //======================================================================= |
| 1914 | Standard_Boolean |
| 1915 | BOPAlgo_PaveFiller::CheckPlanes(const Standard_Integer nF1, |
| 1916 | const Standard_Integer nF2)const |
| 1917 | { |
| 1918 | Standard_Boolean bToIntersect; |
| 1919 | Standard_Integer i, nV2, iCnt; |
| 1920 | BOPCol_MapIteratorOfMapOfInteger aIt; |
| 1921 | // |
| 1922 | bToIntersect=Standard_False; |
| 1923 | // |
| 1924 | const BOPDS_FaceInfo& aFI1=myDS->ChangeFaceInfo(nF1); |
| 1925 | const BOPDS_FaceInfo& aFI2=myDS->ChangeFaceInfo(nF2); |
| 1926 | // |
| 1927 | const BOPCol_MapOfInteger& aMVIn1=aFI1.VerticesIn(); |
| 1928 | const BOPCol_MapOfInteger& aMVOn1=aFI1.VerticesOn(); |
| 1929 | // |
| 1930 | iCnt=0; |
| 1931 | for (i=0; (i<2 && !bToIntersect); ++i) { |
| 1932 | const BOPCol_MapOfInteger& aMV2=(!i) ? aFI2.VerticesIn() |
| 1933 | : aFI2.VerticesOn(); |
| 1934 | // |
| 1935 | aIt.Initialize(aMV2); |
| 1936 | for (; aIt.More(); aIt.Next()) { |
| 1937 | nV2=aIt.Value(); |
| 1938 | if (aMVIn1.Contains(nV2) || aMVOn1.Contains(nV2)) { |
| 1939 | ++iCnt; |
| 1940 | if (iCnt>1) { |
| 1941 | bToIntersect=!bToIntersect; |
| 1942 | break; |
| 1943 | } |
| 1944 | } |
| 1945 | } |
| 1946 | } |
| 1947 | // |
| 1948 | return bToIntersect; |
| 1949 | } |
| 1950 | //======================================================================= |
| 1951 | //function : UpdatePaveBlocks |
| 1952 | //purpose : |
| 1953 | //======================================================================= |
| 1954 | void BOPAlgo_PaveFiller::UpdatePaveBlocks(const BOPCol_DataMapOfIntegerInteger& aDMI) |
| 1955 | { |
| 1956 | if (aDMI.IsEmpty()) { |
| 1957 | return; |
| 1958 | } |
| 1959 | // |
| 1960 | Standard_Integer nSp, aNbPBP, nV[2], i, j; |
| 1961 | Standard_Real aT[2]; |
| 1962 | Standard_Boolean bCB, bRebuild; |
| 1963 | BOPDS_ListIteratorOfListOfPaveBlock aItPB; |
| 1964 | BOPDS_MapOfPaveBlock aMPB; |
| 1965 | // |
| 1966 | BOPDS_VectorOfListOfPaveBlock& aPBP=myDS->ChangePaveBlocksPool(); |
| 1967 | aNbPBP = aPBP.Extent(); |
| 1968 | for (i=0; i<aNbPBP; ++i) { |
| 1969 | BOPDS_ListOfPaveBlock& aLPB=aPBP(i); |
| 1970 | // |
| 1971 | aItPB.Initialize(aLPB); |
| 1972 | for (; aItPB.More(); aItPB.Next()) { |
| 1973 | Handle(BOPDS_PaveBlock) aPB=aItPB.Value(); |
| 1974 | const Handle(BOPDS_CommonBlock)& aCB=myDS->CommonBlock(aPB); |
| 1975 | bCB = !aCB.IsNull(); |
| 1976 | if (bCB) { |
| 1977 | aPB=aCB->PaveBlock1(); |
| 1978 | } |
| 1979 | // |
| 1980 | if (aMPB.Add(aPB)) { |
| 1981 | bRebuild = Standard_False; |
| 1982 | aPB->Indices(nV[0], nV[1]); |
| 1983 | aPB->Range(aT[0], aT[1]); |
| 1984 | // |
| 1985 | for (j = 0; j < 2; ++j) { |
| 1986 | if (aDMI.IsBound(nV[j])) { |
| 1987 | BOPDS_Pave aPave; |
| 1988 | // |
| 1989 | nV[j] = aDMI.Find(nV[j]); |
| 1990 | aPave.SetIndex(nV[j]); |
| 1991 | aPave.SetParameter(aT[j]); |
| 1992 | // |
| 1993 | bRebuild = Standard_True; |
| 1994 | if (!j) { |
| 1995 | aPB->SetPave1(aPave); |
| 1996 | } else { |
| 1997 | aPB->SetPave2(aPave); |
| 1998 | } |
| 1999 | } |
| 2000 | } |
| 2001 | // |
| 2002 | if (bRebuild) { |
| 2003 | nSp = SplitEdge(aPB->Edge(), nV[0], aT[0], nV[1], aT[1]); |
| 2004 | if (bCB) { |
| 2005 | aCB->SetEdge(nSp); |
| 2006 | } |
| 2007 | else { |
| 2008 | aPB->SetEdge(nSp); |
| 2009 | } |
| 2010 | }// if (bRebuild) { |
| 2011 | }// if (aMPB.Add(aPB)) { |
| 2012 | }// for (; aItPB.More(); aItPB.Next()) { |
| 2013 | }// for (i=0; i<aNbPBP; ++i) { |
| 2014 | aMPB.Clear(); |
| 2015 | } |
| 2016 | //======================================================================= |
| 2017 | //function : ToleranceFF |
| 2018 | //purpose : Computes the TolFF according to the tolerance value and |
| 2019 | // types of the faces. |
| 2020 | //======================================================================= |
| 2021 | void ToleranceFF(const BRepAdaptor_Surface& aBAS1, |
| 2022 | const BRepAdaptor_Surface& aBAS2, |
| 2023 | Standard_Real& aTolFF) |
| 2024 | { |
| 2025 | Standard_Real aTol1, aTol2; |
| 2026 | Standard_Boolean isAna1, isAna2; |
| 2027 | // |
| 2028 | aTol1 = aBAS1.Tolerance(); |
| 2029 | aTol2 = aBAS2.Tolerance(); |
| 2030 | aTolFF = Max(aTol1, aTol2); |
| 2031 | // |
| 2032 | isAna1 = (aBAS1.GetType() == GeomAbs_Plane || |
| 2033 | aBAS1.GetType() == GeomAbs_Cylinder || |
| 2034 | aBAS1.GetType() == GeomAbs_Cone || |
| 2035 | aBAS1.GetType() == GeomAbs_Sphere || |
| 2036 | aBAS1.GetType() == GeomAbs_Torus); |
| 2037 | // |
| 2038 | isAna2 = (aBAS2.GetType() == GeomAbs_Plane || |
| 2039 | aBAS2.GetType() == GeomAbs_Cylinder || |
| 2040 | aBAS2.GetType() == GeomAbs_Cone || |
| 2041 | aBAS2.GetType() == GeomAbs_Sphere || |
| 2042 | aBAS2.GetType() == GeomAbs_Torus); |
| 2043 | // |
| 2044 | if (!isAna1 || !isAna2) { |
| 2045 | aTolFF = Max(aTolFF, 5.e-6); |
| 2046 | } |
| 2047 | } |