// Created on: 2001-03-13 // Created by: Peter KURNEV // Copyright (c) 2001-2012 OPEN CASCADE SAS // // The content of this file is subject to the Open CASCADE Technology Public // License Version 6.5 (the "License"). You may not use the content of this file // except in compliance with the License. Please obtain a copy of the License // at http://www.opencascade.org and read it completely before using this file. // // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France. // // The Original Code and all software distributed under the License is // distributed on an "AS IS" basis, without warranty of any kind, and the // Initial Developer hereby disclaims all such warranties, including without // limitation, any warranties of merchantability, fitness for a particular // purpose or non-infringement. Please see the License for the specific terms // and conditions governing the rights and limitations under the License. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //modified by NIZNHY-PKV Tue Aug 28 09:45:19 2012ft //======================================================================= //function : TreatTechnoVertices //purpose : //======================================================================= void BOPTools_PaveFiller::TreatTechnoVertices(BOPTools_SSInterference& aFFi) { Standard_Boolean bFlag, bSplitted; Standard_Integer nF1, nF2, aBid, j, aNbCurves, aNbVT, aNbLPB, nE, nVT, iFlag; Standard_Integer nF, nE1, nE2, k; Standard_Real aT; TColStd_IndexedMapOfInteger aMVT; TColStd_ListIteratorOfListOfInteger aItLI; BOPTools_Pave aPave; BOPTools_ListOfPaveBlock aLPB, aLPBS; BOPTools_ListIteratorOfListOfPaveBlock aItLPB, aItLPB1; // nF1=aFFi.Index1(); nF2=aFFi.Index2(); BOPTools_SequenceOfCurves& aBCs=aFFi.Curves(); // aNbCurves=aBCs.Length(); for (j=1; j<=aNbCurves; j++) { BOPTools_Curve& aBC=aBCs(j); //Handle(Geom_Curve) aC3D= aBC.Curve().Curve(); //DEB TColStd_ListOfInteger& aLVT=aBC.TechnoVertices(); aItLI.Initialize(aLVT); for (; aItLI.More(); aItLI.Next()) { nVT=aItLI.Value(); aMVT.Add(nVT); } } // aNbVT=aMVT.Extent(); if (!aNbVT) {// nothing to do return; } //------------------------------ // aBid=0; SplitsInFace (aBid, nF1, nF2, aLPB); SplitsInFace (aBid, nF2, nF1, aLPB); SplitsOnFace (aBid, nF1, nF2, aLPB); // aNbLPB=aLPB.Extent(); if (!aNbLPB) {// nothing to do return; } // for (k=1; k<=aNbVT; ++k) { nVT=aMVT(k); const TopoDS_Vertex& aV=*((TopoDS_Vertex*)&(myDS->Shape(nVT))); // // 1.Collect Pave Blocks (pretenders) to split by nVT => aLPBS aLPBS.Clear(); aItLPB.Initialize(aLPB); for (; aItLPB.More(); aItLPB.Next()) { const BOPTools_PaveBlock& aPB=aItLPB.Value(); nE=aPB.OriginalEdge(); const TopoDS_Edge& aE=*((TopoDS_Edge*)&(myDS->Shape(nE))); // iFlag=myContext->ComputeVE(aV, aE, aT); if (iFlag) { continue; } // aPave.SetIndex(nVT); aPave.SetParam(aT); // BOPTools_ListOfPaveBlock& aLPBE=mySplitShapesPool(myDS->RefEdge(nE)); aItLPB1.Initialize(aLPBE); for (; aItLPB1.More(); aItLPB1.Next()) { const BOPTools_PaveBlock& aPBE=aItLPB1.Value(); if (aPBE.IsInBlock(aPave)) { aLPBS.Append(aPBE); } } }//for (; aItLPB.More(); aItLPB.Next()) { // // 2.Split Pave Blocks [aLPBS] by the vertex [nVT] BOPTools_ListIteratorOfListOfCommonBlock aItCB1, aItCB2; BOPTools_PaveBlock aPB11, aPB12, aPB21, aPB22, aPB1, aPB2; // aItLPB.Initialize(aLPBS); for (; aItLPB.More(); aItLPB.Next()) { const BOPTools_PaveBlock& aPBS=aItLPB.Value(); nE=aPBS.OriginalEdge(); // BOPTools_ListOfCommonBlock& aLCB1=myCommonBlockPool(myDS->RefEdge(nE)); aItCB1.Initialize(aLCB1); for (; aItCB1.More(); aItCB1.Next()) { BOPTools_CommonBlock& aCB1=aItCB1.Value(); aPB1=aCB1.PaveBlock1(nE); nE1=aPB1.OriginalEdge(); // if (aPB1.IsEqual(aPBS)) { // SplitPaveBlock(aPB1, nVT, aPB11, aPB12); // nF=aCB1.Face(); if (nF) { BOPTools_CommonBlock aCBa, aCBb; // aLCB1.Remove(aItCB1); // aCBa.SetPaveBlock1(aPB11); aCBa.SetFace(nF); aCBb.SetPaveBlock2(aPB12); aCBb.SetFace(nF); // aLCB1.Append(aCBa); aLCB1.Append(aCBb); // break; }// if (nF) { else { // 1 BOPTools_CommonBlock aCBa, aCBb; // aPB2=aCB1.PaveBlock2(nE); nE2=aPB2.OriginalEdge(); // SplitPaveBlock(aPB2, nVT, aPB21, aPB22); // //aLCB1.Remove(aItCB1); // iFlag=0; BOPTools_ListOfCommonBlock& aLCB2=myCommonBlockPool(myDS->RefEdge(nE2)); aItCB2.Initialize(aLCB2); for (; aItCB2.More(); aItCB2.Next()) { BOPTools_CommonBlock& aCB2=aItCB2.Value(); BOPTools_PaveBlock& aPBx=aCB2.PaveBlock1(nE2); if (aPBx.IsEqual(aPB2)) { aLCB2.Remove(aItCB2); aLCB1.Remove(aItCB1); // bFlag=CheckCoincidence(aPB11, aPB21); if (bFlag) { aCBa.SetPaveBlock1(aPB11); aCBa.SetPaveBlock2(aPB21); aCBb.SetPaveBlock1(aPB12); aCBb.SetPaveBlock2(aPB22); } else { aCBa.SetPaveBlock1(aPB11); aCBa.SetPaveBlock2(aPB22); aCBb.SetPaveBlock1(aPB12); aCBb.SetPaveBlock2(aPB21); } // aLCB1.Append(aCBa); aLCB1.Append(aCBb); aLCB2.Append(aCBa); aLCB2.Append(aCBb); // iFlag=1; break; }//if (aPB1.IsEqual(aPB2)) { }//for (; aItCB2.More(); aItCB2.Next()) { }//else { // 1 }//if (aPB1.IsEqual(aPBS)) { if (iFlag) { break; } }//for (; aItCB.More(); aItCB.Next()) { }//for (; aItLPB.More(); aItLPB.Next()) { }//for (k=1; k<=aNbVT; ++k) { } //======================================================================= //function : SplitPaveBlock //purpose : //======================================================================= void BOPTools_PaveFiller::SplitPaveBlock(const BOPTools_PaveBlock& aPBE, const Standard_Integer nVT, BOPTools_PaveBlock& aPB1, BOPTools_PaveBlock& aPB2) { Standard_Integer nE, iFlag; Standard_Real aT; BOPTools_Pave aPave; BOPTools_ListIteratorOfListOfPaveBlock aItLPB; // const TopoDS_Vertex& aVT=*((TopoDS_Vertex*)&(myDS->Shape(nVT))); // nE=aPBE.OriginalEdge(); const TopoDS_Edge& aE=*((TopoDS_Edge*)&(myDS->Shape(nE))); // BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(nE)); // aItLPB.Initialize(aLPB); for (; aItLPB.More(); aItLPB.Next()) { const BOPTools_PaveBlock& aPB=aItLPB.Value(); if (aPB.IsEqual(aPBE)) { aLPB.Remove(aItLPB); break; } } // iFlag=myContext->ComputeVE(aVT, aE, aT); // aPave.SetIndex(nVT); aPave.SetParam(aT); // aPB1.SetOriginalEdge(nE); aPB1.SetPave1(aPBE.Pave1()); aPB1.SetPave2(aPave); // aPB2.SetOriginalEdge(nE); aPB2.SetPave1(aPave); aPB2.SetPave2(aPBE.Pave2()); // aLPB.Append(aPB1); aLPB.Append(aPB2); } //======================================================================= //function : CheckCoincidence //purpose : //======================================================================= Standard_Boolean BOPTools_PaveFiller::CheckCoincidence(const BOPTools_PaveBlock& aPB1, const BOPTools_PaveBlock& aPB2) { Standard_Boolean bRet; Standard_Integer nV11, nV12, nV21, nV22, nE1, nE2, iFlag; Standard_Real aT11, aT12, aT21, aT22, aTM, aTN, aTolE1; gp_Pnt aPM; TopoDS_Vertex aVM; BRep_Builder aBB; // const BOPTools_Pave& aPave11=aPB1.Pave1(); nV11=aPave11.Index(); aT11=aPave11.Param(); // const BOPTools_Pave& aPave12=aPB1.Pave2(); aT12=aPave12.Param(); nV12=aPave12.Index(); // const BOPTools_Pave& aPave21=aPB2.Pave1(); nV21=aPave21.Index(); aT21=aPave21.Param(); // const BOPTools_Pave& aPave22=aPB2.Pave2(); nV22=aPave22.Index(); aT22=aPave22.Param(); // bRet=((nV11==nV21 && nV12==nV22) || (nV11==nV22 && nV12==nV21)); if (!bRet) { return bRet; } // nE1=aPB1.OriginalEdge(); const TopoDS_Edge& aE1=*((TopoDS_Edge*)&(myDS->Shape(nE1))); aTolE1=BRep_Tool::Tolerance(aE1); // nE2=aPB2.OriginalEdge(); const TopoDS_Edge& aE2=*((TopoDS_Edge*)&(myDS->Shape(nE2))); // aTM=IntTools_Tools::IntermediatePoint (aT11, aT12); BOPTools_Tools::PointOnEdge(aE1, aTM, aPM); // aBB.MakeVertex (aVM, aPM, aTolE1); // iFlag=myContext->ComputeVE(aVM, aE2, aTN); if (iFlag) { bRet=!bRet; //False } // if (aT21 aT21 && aTNaT22 && aTN