//======================================================================= // function:EFNewVertices // purpose: //======================================================================= void NMTTools_PaveFiller::EFNewVertices (const TopoDS_Vertex& aNewVertex, const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI) { Standard_Integer i, aNewShape, nE, nF; Standard_Real aT; BOPTools_Pave aPave; BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; // BOPTools_CArray1OfESInterference& aEFs=myIP->ESInterferences(); // // Insert New Vertex in DS; myDS->InsertShapeAndAncestorsSuccessors(aNewVertex, anASSeq); aNewShape=myDS->NumberOfInsertedShapes(); myDS->SetState (aNewShape, BooleanOperations_ON); // // Insert New Vertex in EFInterference i=aMapVI.FindFromKey(aNewVertex); BOPTools_ESInterference& aEFInterf= aEFs(i); aEFInterf.SetNewShape(aNewShape); // Extract interference info aEFInterf.Indices(nE, nF); if (myDS->GetShapeType(nF)==TopAbs_EDGE) { nE=nF; } const IntTools_CommonPrt& aCPart=aEFInterf.CommonPrt(); VertexParameter(aCPart, aT); // // Pave for edge nE aPave.SetInterference(i); aPave.SetType (BooleanOperations_EdgeSurface); aPave.SetIndex(aNewShape); aPave.SetParam(aT); // Append the Pave to the myPavePoolNew BOPTools_PaveSet& aPaveSet=myPavePoolNew(myDS->RefEdge(nE)); aPaveSet.Append(aPave); // }
//======================================================================= // function:EFNewVertices // purpose: //======================================================================= void NMTTools_PaveFiller::EFNewVertices (const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI) { Standard_Integer i, j, aNb, aNewShape, aFlag, iX, aNbVV, aNbSimple; Standard_Integer aWhat, aWith, nE, nF, nV, aNbIEF, aNbEdges, iTmp; Standard_Real aT; TopoDS_Compound aCompound; TopoDS_Vertex aNewVertex; BRep_Builder aBB; BOPTools_Pave aPave; NMTTools_IndexedDataMapOfIndexedMapOfInteger aMNVE, aMNVIEF; BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; TopTools_IndexedMapOfShape aMNVComplex, aMNVSimple; // aNb=aMapVI.Extent(); if (!aNb) { // no new vertices, no new problems return; } // BOPTools_CArray1OfESInterference& aEFs=myIP->ESInterferences(); // // 0. if (aNb==1) { aNewVertex=TopoDS::Vertex(aMapVI.FindKey(1)); EFNewVertices(aNewVertex, aMapVI); return; } // // 1. Make compound from new vertices aBB.MakeCompound(aCompound); for (i=1; i<=aNb; ++i) { const TopoDS_Shape& aV=aMapVI.FindKey(i); aBB.Add(aCompound, aV); } // // 2. VV intersection between these vertices // using the auxiliary Filler NMTTools_PaveFiller tPF; // tPF.SetCompositeShape(aCompound); // tPF.Init(); tPF.PerformVV(); // NMTDS_ShapesDataStructure& tDS=*(tPF.DS()); NMTDS_InterfPool& tInterfPool=*(tPF.IP()); BOPTools_CArray1OfVVInterference& aVVInterfs=tInterfPool.VVInterferences(); // // 3. Separate Comlex and Simple new vertices aNbVV=aVVInterfs.Extent(); for (i=1; i<=aNbVV; ++i) { const BOPTools_VVInterference& aVV=aVVInterfs(i); aVV.Indices(aWhat, aWith); const TopoDS_Shape& aV1=tDS.Shape(aWhat); const TopoDS_Shape& aV2=tDS.Shape(aWith); aMNVComplex.Add(aV1); aMNVComplex.Add(aV2); } // for (i=1; i<=aNb; ++i) { const TopoDS_Shape& aV=aMapVI.FindKey(i); if (!aMNVComplex.Contains(aV)) { aMNVSimple.Add(aV); } } // // 4. Treat Simple new Vertices aNbSimple=aMNVSimple.Extent(); for (i=1; i<=aNbSimple; ++i) { const TopoDS_Vertex& aV=TopoDS::Vertex(aMNVSimple(i)); EFNewVertices(aV, aMapVI); } // // 3. Fill Maps : NewVertex-edges (aMNVE) // NewVertex-interferences (aMNVIEE) aNb=aVVInterfs.Extent(); for (i=1; i<=aNb; ++i) { const BOPTools_VVInterference& aVV=aVVInterfs(i); aNewShape=aVV.NewShape(); if (!aNewShape) { continue; } // if (!aMNVE.Contains(aNewShape)) { TColStd_IndexedMapOfInteger aMx; aMNVE.Add(aNewShape, aMx); } if (!aMNVIEF.Contains(aNewShape)) { TColStd_IndexedMapOfInteger aMx; aMNVIEF.Add(aNewShape, aMx); } // TColStd_IndexedMapOfInteger& aME=aMNVE.ChangeFromKey(aNewShape); TColStd_IndexedMapOfInteger& aMIEF=aMNVIEF.ChangeFromKey(aNewShape); // aVV.Indices(aWhat, aWith); //aWhat const TopoDS_Shape& aV1=tDS.Shape(aWhat); iX=aMapVI.FindFromKey(aV1); const BOPTools_ESInterference& aEF1=aEFs(iX); aEF1.Indices(nE, nF); // if (myDS->GetShapeType(nF)==TopAbs_EDGE) { iTmp=nE; nE=nF; nF=iTmp; } aME.Add(nE); aMIEF.Add(iX); //aWith const TopoDS_Shape& aV2=tDS.Shape(aWith); iX=aMapVI.FindFromKey(aV2); const BOPTools_ESInterference& aEF2=aEFs(iX); aEF2.Indices(nE, nF); // if (myDS->GetShapeType(nF)==TopAbs_EDGE) { iTmp=nE; nE=nF; nF=iTmp; } aME.Add(nE); aMIEF.Add(iX); }// for (i=1; i<=aNb; ++i) { // // 4. Process new vertices aNb=aMNVE.Extent(); for (i=1; i<=aNb; ++i) { // xx // // new Vertex nV=aMNVE.FindKey(i); aNewVertex=TopoDS::Vertex(tDS.Shape(nV)); // // Insert New Vertex in DS; myDS->InsertShapeAndAncestorsSuccessors(aNewVertex, anASSeq); aNewShape=myDS->NumberOfInsertedShapes(); myDS->SetState (aNewShape, BooleanOperations_ON); // // Update index of NewShape in EF interferences const TColStd_IndexedMapOfInteger& aMIEF=aMNVIEF.FindFromKey(nV); aNbIEF=aMIEF.Extent(); for (j=1; j<=aNbIEF; ++j) { iX=aMIEF(j); BOPTools_ESInterference& aEF=aEFs(iX); aEF.SetNewShape(aNewShape); } // // Update Paves on all edges const TColStd_IndexedMapOfInteger& aME=aMNVE(i); aNbEdges=aME.Extent(); for (j=1; j<=aNbEdges; ++j) { nE=aME(j); const TopoDS_Edge aE=TopoDS::Edge(myDS->Shape(nE));//mpv // aFlag=myContext.ComputeVE (aNewVertex, aE, aT); // if (!aFlag) { aPave.SetInterference(-1); aPave.SetType (BooleanOperations_EdgeSurface); aPave.SetIndex(aNewShape); aPave.SetParam(aT); // BOPTools_PaveSet& aPaveSet=myPavePoolNew(myDS->RefEdge(nE)); aPaveSet.Append(aPave); } } } }
//======================================================================= // function: MakeBlocks // purpose: //======================================================================= void NMTTools_PaveFiller::MakeBlocks() { myIsDone=Standard_False; // Standard_Boolean bIsExistingPaveBlock, bIsValidIn2D, bIsCoincided; Standard_Boolean bIsMicroEdge, bHasES; Standard_Integer i, aNbFFs, nF1, nF2; Standard_Integer nV1, nV2, j, aNbCurves; Standard_Real aTolR3D, aTol2D, aT1, aT2, aTolPPC=Precision::PConfusion(); TopoDS_Face aF1, aF2; NMTTools_IndexedDataMapOfShapePaveBlock aMEPB; BooleanOperations_IndexedDataMapOfShapeInteger aMapEI; BOPTools_ListIteratorOfListOfPaveBlock anIt; // BOPTools_CArray1OfSSInterference& aFFs=myIP->SSInterferences(); // // // 1. Make Section Edges from intersection curves // between each pair of faces aNbFFs=aFFs.Extent(); if (!aNbFFs) { return; } // FillFaceInfo(); // for (i=1; i<=aNbFFs; ++i) { BOPTools_ListOfPaveBlock aLPB; TColStd_MapOfInteger aMVStick; TopTools_ListOfShape aLSE; TColStd_ListOfInteger aLNE; BOPTools_PaveSet aPSF; NMTTools_MapOfPaveBlock aMPBX; TColStd_MapIteratorOfMapOfInteger aItMI; NMTTools_MapIteratorOfMapOfPaveBlock aItMPB; // BOPTools_SSInterference& aFFi=aFFs(i); // // Faces aFFi.Indices(nF1, nF2); aF1=*((TopoDS_Face*)(&myDS->Shape(nF1))); aF2=*((TopoDS_Face*)(&myDS->Shape(nF2))); // SharedEdges(nF1, nF2, aLNE, aLSE); aFFi.SetSharedEdges(aLNE); // // aMVStick const NMTTools_FaceInfo& aFI1=myFaceInfo.Find(nF1); const NMTTools_FaceInfo& aFI2=myFaceInfo.Find(nF2); // const TColStd_MapOfInteger& aMVOn1=aFI1.VerticesOn(); const TColStd_MapOfInteger& aMVIn1=aFI1.VerticesIn(); const TColStd_MapOfInteger& aMVOn2=aFI2.VerticesOn(); const TColStd_MapOfInteger& aMVIn2=aFI2.VerticesIn(); // for (j=0; j<2; ++j) { const TColStd_MapOfInteger& aMV1=(!j) ? aMVOn1 :aMVIn1; aItMI.Initialize(aMV1); for (; aItMI.More(); aItMI.Next()) { nV1=aItMI.Key(); if (aMVOn2.Contains(nV1) || aMVIn2.Contains(nV1)) { aMVStick.Add(nV1); } } } // // aLPB const NMTTools_MapOfPaveBlock& aMPBIn1=aFI1.PaveBlocksIn(); const NMTTools_MapOfPaveBlock& aMPBOn1=aFI1.PaveBlocksOn(); const NMTTools_MapOfPaveBlock& aMPBIn2=aFI2.PaveBlocksIn(); const NMTTools_MapOfPaveBlock& aMPBOn2=aFI2.PaveBlocksOn(); // aMPBX.Clear(); for (j=0; j<4; ++j) { NMTTools_MapOfPaveBlock *pMPB; // if (!j) { pMPB=((NMTTools_MapOfPaveBlock*)&aMPBIn1); } else if (j==1) { pMPB=((NMTTools_MapOfPaveBlock*)&aMPBOn1); } else if (j==2) { pMPB=((NMTTools_MapOfPaveBlock*)&aMPBIn2); } else if (j==3) { pMPB=((NMTTools_MapOfPaveBlock*)&aMPBOn2); } // const NMTTools_MapOfPaveBlock& aMPB=*pMPB; aItMPB.Initialize(aMPB); for (; aItMPB.More(); aItMPB.Next()) { const BOPTools_PaveBlock& aPB=aItMPB.Key(); if (aMPBX.Add(aPB)) { aLPB.Append(aPB); } // else { if (j>1) { aFFi.AppendBlock(aPB); } } // } } // BOPTools_SequenceOfCurves& aSCvs=aFFi.Curves(); aNbCurves=aSCvs.Length(); if (!aNbCurves) { continue; } // aTolR3D=aFFi.TolR3D(); aTol2D=(aTolR3D < 1.e-3) ? 1.e-3 : aTolR3D; // CorrectTolR3D(aFFi, aMVStick, aTolR3D); // PrepareSetForFace (nF1, nF2, aLPB, aPSF); // // Put Paves On Curves for (j=1; j<=aNbCurves; ++j) { BOPTools_Curve& aBC=aSCvs(j); const IntTools_Curve& aC=aBC.Curve(); // DEBUG f Handle(Geom_Curve) aC3D = aC.Curve(); // DEBUG t PutPaveOnCurve (aPSF, aTolR3D, aBC); } // // Put bounding paves on curves for (j=1; j<=aNbCurves; ++j) { BOPTools_Curve& aBC=aSCvs(j); PutBoundPaveOnCurve (aBC, aFFi); } //modified by NIZNHY-PKV Wed Sep 14 13:12:14 2011f #if OCC_VERSION_LARGE > 0x06050100 // For OCCT6.5.2 and higher // // Put closing pave if needded for (j=1; j<=aNbCurves; ++j) { BOPTools_Curve& aBC=aSCvs(j); PutClosingPaveOnCurve (aBC, aFFi); } #endif // OCC_VERSION_LARGE > 0x06050100 // For OCCT6.5.2 and higher //modified by NIZNHY-PKV Wed Sep 14 13:12:17 2011t // // Pave Blocks on Curves bHasES=Standard_False; for (j=1; j<=aNbCurves; ++j) { BOPTools_Curve& aBC=aSCvs(j); const IntTools_Curve& aIC= aBC.Curve(); BOPTools_PaveSet& aPaveSet=aBC.Set(); // BOPTools_PaveBlockIterator aPBIter(0, aPaveSet); for (; aPBIter.More(); aPBIter.Next()) { BOPTools_PaveBlock& aPBNew=aPBIter.Value(); aPBNew.SetCurve(aIC); aPBNew.SetFace1(nF1); aPBNew.SetFace2(nF2); // nV1=aPBNew.Pave1().Index(); nV2=aPBNew.Pave2().Index(); aT1=aPBNew.Pave1().Param(); aT2=aPBNew.Pave2().Param(); // if((nV1==nV2) && (Abs(aT2 - aT1) < aTolPPC)) { continue;// mkk ft ??? } // // 1 bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aLPB, aTolR3D); if (bIsExistingPaveBlock) { continue; } // bIsCoincided=CheckCoincidence(aPBNew, aLPB); if(bIsCoincided) { continue; } // // 2 bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aLSE, aTolR3D); if (bIsExistingPaveBlock) { continue; } // // Checking of validity in 2D // bIsValidIn2D=myContext->IsValidBlockForFaces(aT1, aT2, aIC, aF1, aF2, aTol2D); if (!bIsValidIn2D) { continue; } // // // Make Section Edge TopoDS_Edge aES; // const TopoDS_Vertex aV1=TopoDS::Vertex(myDS->Shape(nV1)); const TopoDS_Vertex aV2=TopoDS::Vertex(myDS->Shape(nV2)); // { Standard_Real aT; // myContext->IsVertexOnLine(aV1, aIC, aTolR3D, aT); BOPTools_Tools::UpdateVertex (aIC, aT, aV1); // myContext->IsVertexOnLine(aV2, aIC, aTolR3D, aT); BOPTools_Tools::UpdateVertex (aIC, aT, aV2); } // BOPTools_Tools::MakeSectEdge (aIC, aV1, aT1, aV2, aT2, aES); // NMTTools_Tools::UpdateEdge (aES, aTolR3D); bIsMicroEdge=IsMicroEdge(aES, myContext); if (bIsMicroEdge) { continue; } // { Handle(Geom2d_Curve) aC2D1, aC2D2; // aC2D1=aIC.FirstCurve2d(); aC2D2=aIC.SecondCurve2d(); // NMTTools_Tools::MakePCurve(aES, aF1, aC2D1); NMTTools_Tools::MakePCurve(aES, aF2, aC2D2); } // aMEPB.Add(aES, aPBNew); aMapEI.Add(aES, i); // bHasES=Standard_True; }// for (; aPBIter.More(); aPBIter.Next()) } // end of for (j=1; j<=aNbCurves; ++j) // qqf if (bHasES) { myIP->Add(nF1, nF2, Standard_True, NMTDS_TI_FF); } // qqt }// for (i=1; i<=aNbFFs; ++i) //============================================================= // // II. Post treatment // // Input data: aMEPB, aMapEI // Result : section edges in myDS // Standard_Integer aNbSE; // aNbSE=aMEPB.Extent(); if (!aNbSE) { // there is nothing to do here return; } // BRep_Builder aBB; TopoDS_Compound aCompound; // // 1. Make compound from SE aBB.MakeCompound(aCompound); for (i=1; i<=aNbSE; ++i) { const TopoDS_Shape& aSE=aMEPB.FindKey(i); aBB.Add(aCompound, aSE); } // // // 2. Intersect SE using auxiliary Filler NMTTools_PaveFiller tPF; // tPF.SetCompositeShape(aCompound); // // 2.1.VV tPF.Init(); tPF.PerformVV(); // // 2.2.VE tPF.myPavePool.Resize (tPF.myNbEdges); tPF.PrepareEdges(); tPF.PerformVE(); // // 2.3.VF tPF.PerformVF(); // // 2.4.EE tPF.myCommonBlockPool.Resize (tPF.myNbEdges); tPF.mySplitShapesPool.Resize (tPF.myNbEdges); tPF.myPavePoolNew .Resize (tPF.myNbEdges); tPF.PreparePaveBlocks(TopAbs_VERTEX, TopAbs_EDGE); tPF.PreparePaveBlocks(TopAbs_EDGE, TopAbs_EDGE); // tPF.PerformEE(); // tPF.RefinePavePool (); // tPF.myPavePoolNew.Destroy(); // tPF.MakeSplitEdges(); tPF.UpdateCommonBlocks(); // // 3. Treatment of the result of intersection // Standard_Integer aNbOld, aNbLines, aNbPB, mV1, mV2, nE, mE, iFF; TopAbs_ShapeEnum aType; BOPTools_ListIteratorOfListOfPaveBlock aIt; BOPTColStd_IndexedDataMapOfIntegerInteger aMNewOld; // const NMTDS_ShapesDataStructure& tDS=*(tPF.DS()); const BOPTools_SplitShapesPool& aSSP=tPF.mySplitShapesPool; const NMTTools_CommonBlockPool& aCBP=tPF.myCommonBlockPool; // aNbLines=tDS.NumberOfInsertedShapes(); aNbOld=tDS.NumberOfShapesOfTheObject(); // // 3.1 Links between indices in tDS and DS (kept in aMNewOld) // // 3.1.1.Old vertices [ links ] for (i=1; i<=aNbOld; ++i) { const TopoDS_Shape& aV=tDS.Shape(i); aType=aV.ShapeType(); if (aType!=TopAbs_VERTEX) { continue; } // for (j=1; j<=aNbSE; ++j) { const BOPTools_PaveBlock& aPBSE=aMEPB(j); nV1=aPBSE.Pave1().Index(); const TopoDS_Shape aV1=myDS->Shape(nV1);//mpv if (aV1.IsSame(aV)) { aMNewOld.Add(i, nV1); break; } nV2=aPBSE.Pave2().Index(); const TopoDS_Shape aV2=myDS->Shape(nV2);//mpv if (aV2.IsSame(aV)) { aMNewOld.Add(i, nV2); break; } } } // // 3.1.2. New vertices [ links ] i=tDS.NumberOfSourceShapes()+1; for (; i<=aNbLines; ++i) { const TopoDS_Shape& aV=tDS.Shape(i); aType=aV.ShapeType(); if (aType!=TopAbs_VERTEX) { continue; } // // Insert new vertex in myDS BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; myDS->InsertShapeAndAncestorsSuccessors(aV, anASSeq); nV1=myDS->NumberOfInsertedShapes(); // link aMNewOld.Add(i, nV1); } // // 3.2. Treatment of section edges (SE) for (i=1; i<=aNbOld; ++i) { const TopoDS_Shape& aE=tDS.Shape(i); aType=aE.ShapeType(); if (aType!=TopAbs_EDGE) { continue; } // // block of section edge that we already have for this SE BOPTools_PaveBlock& aPBSE=aMEPB.ChangeFromKey(aE); // // Corresponding FF-interference iFF=aMapEI.FindFromKey(aE); BOPTools_SSInterference& aFFi=aFFs(iFF); BOPTools_SequenceOfCurves& aSCvs=aFFi.Curves(); // BOPTools_Curve& aBC=aSCvs(1); // const BOPTools_ListOfPaveBlock& aLPB=aSSP(tDS.RefEdge(i)); aNbPB=aLPB.Extent(); // if (!aNbPB) { // no pave blocks -> use aPBSE and whole edge aE BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; // nV1=aPBSE.Pave1().Index(); const TopoDS_Shape aV1=myDS->Shape(nV1);//mpv nV2=aPBSE.Pave2().Index(); const TopoDS_Shape aV2=myDS->Shape(nV2);//mpv // anASSeq.SetNewSuccessor(nV1); anASSeq.SetNewOrientation(aV1.Orientation()); anASSeq.SetNewSuccessor(nV2); anASSeq.SetNewOrientation(aV2.Orientation()); // myDS->InsertShapeAndAncestorsSuccessors(aE, anASSeq); nE=myDS->NumberOfInsertedShapes(); // aPBSE.SetEdge(nE); aBC.AppendNewBlock(aPBSE); // continue; } // nF1=aPBSE.Face1(); nF2=aPBSE.Face2(); // const NMTTools_ListOfCommonBlock& aLCB=aCBP(tDS.RefEdge(i)); NMTTools_CommonBlockAPI aCBAPI(aLCB); // aIt.Initialize(aLPB); for (; aIt.More(); aIt.Next()) { BOPTools_PaveBlock aPB=aIt.Value(); // const TopoDS_Face aF1=TopoDS::Face(myDS->Shape(nF1)); const TopoDS_Face aF2=TopoDS::Face(myDS->Shape(nF2)); // if (aCBAPI.IsCommonBlock(aPB)) { // it can be Common Block Standard_Real aTolEx; Handle(Geom2d_Curve) aC2D1, aC2D2; TopoDS_Face aF1FWD, aF2FWD; // NMTTools_CommonBlock& aCB=aCBAPI.CommonBlock(aPB); //const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks(); // aPB=aCB.PaveBlock1(); mE=aPB.Edge(); // index of edge in tDS const TopoDS_Edge& aEx=TopoDS::Edge(tDS.Shape(mE)); aTolEx=BRep_Tool::Tolerance(aEx); // aF1FWD=aF1; aF1FWD.Orientation(TopAbs_FORWARD); aF2FWD=aF2; aF2FWD.Orientation(TopAbs_FORWARD); // NMTTools_Tools::MakePCurve(aEx, aF1FWD, aC2D1); NMTTools_Tools::MakePCurve(aEx, aF2FWD, aC2D2); NMTTools_Tools::UpdateEdge (aEx, aTolEx); } //if (aCBAPI.IsCommonBlock(aPB)) // // new SE mE=aPB.Edge(); // index of edge in tDS const TopoDS_Shape& aSp=tDS.Shape(mE); // const BOPTools_Pave& aPave1=aPB.Pave1(); aT1=aPave1.Param(); mV1=aPave1.Index(); // index in tDS nV1=aMNewOld.FindFromKey(mV1); // index in myDS const TopoDS_Shape aV1=myDS->Shape(nV1);//mpv // const BOPTools_Pave& aPave2=aPB.Pave2(); aT2=aPave2.Param(); mV2=aPave2.Index(); nV2=aMNewOld.FindFromKey(mV2); const TopoDS_Shape aV2=myDS->Shape(nV2);//mpv // if (!aMNewOld.Contains(mE)) { // add new SE to the myDS BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; // anASSeq.SetNewSuccessor(nV1); anASSeq.SetNewOrientation(aV1.Orientation()); anASSeq.SetNewSuccessor(nV2); anASSeq.SetNewOrientation(aV2.Orientation()); myDS->InsertShapeAndAncestorsSuccessors(aSp, anASSeq); nE=myDS->NumberOfInsertedShapes(); // aMNewOld.Add(mE, nE); } else { nE=aMNewOld.FindFromKey(mE); } // Form PaveBlock; BOPTools_PaveBlock aPBx; BOPTools_Pave aP1, aP2; // aPBx.SetFace1(nF1); aPBx.SetFace1(nF2); // aP1.SetIndex(nV1); aP1.SetParam(aT1); // aP2.SetIndex(nV2); aP2.SetParam(aT2); // aPBx.SetPave1(aP1); aPBx.SetPave2(aP2); // aPBx.SetEdge(nE); // aBC.AppendNewBlock(aPBx); }// for (; aIt.More(); aIt.Next()) }// for (i=1; i<=aNbOld; ++i) // myIsDone=Standard_True; }