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
7 // This file is part of Open CASCADE Technology software library.
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.
15 // Alternatively, this file may be used under the terms of Open CASCADE
16 // commercial license or contractual agreement.
18 #include <BOPAlgo_PaveFiller.ixx>
20 #include <Precision.hxx>
21 #include <NCollection_IncAllocator.hxx>
22 #include <NCollection_UBTreeFiller.hxx>
24 #include <Bnd_Box.hxx>
26 #include <GeomAPI_ProjectPointOnCurve.hxx>
28 #include <TopoDS_Edge.hxx>
29 #include <TopoDS_Vertex.hxx>
30 #include <TopoDS_Compound.hxx>
31 #include <BRep_Tool.hxx>
32 #include <BRep_Builder.hxx>
33 #include <BRepTools.hxx>
34 #include <BRepBndLib.hxx>
36 #include <IntTools_EdgeEdge.hxx>
37 #include <IntTools_Range.hxx>
38 #include <IntTools_SequenceOfCommonPrts.hxx>
39 #include <IntTools_CommonPrt.hxx>
40 #include <IntTools_SequenceOfRanges.hxx>
42 #include <BOPTools_AlgoTools.hxx>
44 #include <BOPCol_DataMapOfShapeInteger.hxx>
45 #include <BOPCol_DataMapOfIntegerShape.hxx>
46 #include <BOPCol_IndexedDataMapOfShapeBox.hxx>
47 #include <BOPCol_BoxBndTree.hxx>
49 #include <BOPInt_Context.hxx>
50 #include <BOPInt_ShrunkRange.hxx>
51 #include <BOPInt_Tools.hxx>
53 #include <BOPDS_DataMapOfPaveBlockListOfPaveBlock.hxx>
54 #include <BOPDS_MapOfPaveBlock.hxx>
55 #include <BOPDS_CommonBlock.hxx>
56 #include <BOPDS_CoupleOfPaveBlocks.hxx>
57 #include <BOPDS_DataMapOfPaveBlockListOfInteger.hxx>
58 #include <BOPDS_Iterator.hxx>
59 #include <BOPDS_VectorOfInterfEE.hxx>
60 #include <BOPDS_Interf.hxx>
61 #include <BOPDS_Pave.hxx>
63 #include <BOPAlgo_Tools.hxx>
66 //=======================================================================
67 // function: PerformEE
69 //=======================================================================
70 void BOPAlgo_PaveFiller::PerformEE()
72 Standard_Boolean bJustAdd, bOrder;
73 Standard_Integer i, iX, iSize, nE1, nE2, aDiscretize;
74 Standard_Integer aNbCPrts, nWhat, nWith;
75 Standard_Real aTS11, aTS12, aTS21, aTS22,
76 aT11, aT12, aT21, aT22;
77 Standard_Real aTolE1, aTolE2, aDeflection;
78 TopAbs_ShapeEnum aType;
79 TopoDS_Edge aEWhat, aEWith;
80 BOPDS_ListIteratorOfListOfPaveBlock aIt1, aIt2;
81 Handle(NCollection_IncAllocator) aAllocator;
82 Handle(BOPDS_PaveBlock) aPBn1, aPBn2;
83 BOPDS_MapOfPaveBlock aMPBToUpdate;
84 BOPDS_MapIteratorOfMapOfPaveBlock aItPB;
88 myIterator->Initialize(TopAbs_EDGE, TopAbs_EDGE);
89 iSize=myIterator->ExpectedLength();
94 //-----------------------------------------------------scope f
95 aAllocator=new NCollection_IncAllocator();
96 BOPDS_IndexedDataMapOfPaveBlockListOfPaveBlock aMPBLPB(100, aAllocator);
97 BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks aMVCPB(100, aAllocator);
102 BOPDS_VectorOfInterfEE& aEEs=myDS->InterfEE();
103 aEEs.SetStartSize(iSize);
104 aEEs.SetIncrement(iSize);
107 for (; myIterator->More(); myIterator->Next()) {
108 myIterator->Value(nE1, nE2, bJustAdd);
113 const BOPDS_ShapeInfo& aSIE1=myDS->ShapeInfo(nE1);
114 if (aSIE1.HasFlag()){
117 const BOPDS_ShapeInfo& aSIE2=myDS->ShapeInfo(nE2);
118 if (aSIE2.HasFlag()){
122 const TopoDS_Edge& aE1=(*(TopoDS_Edge *)(&aSIE1.Shape()));
123 const TopoDS_Edge& aE2=(*(TopoDS_Edge *)(&aSIE2.Shape()));
125 aTolE1=BRep_Tool::Tolerance(aE1);
126 aTolE2=BRep_Tool::Tolerance(aE2);
128 BOPDS_ListOfPaveBlock& aLPB1=myDS->ChangePaveBlocks(nE1);
129 BOPDS_ListOfPaveBlock& aLPB2=myDS->ChangePaveBlocks(nE2);
131 aIt1.Initialize(aLPB1);
132 for (; aIt1.More(); aIt1.Next()) {
135 Handle(BOPDS_PaveBlock)& aPB1=aIt1.ChangeValue();
136 if (!aPB1->HasShrunkData()) {
137 FillShrunkData(aPB1);
138 if (myWarningStatus) {
142 aPB1->ShrunkData(aTS11, aTS12, aBB1);
144 aIt2.Initialize(aLPB2);
145 for (; aIt2.More(); aIt2.Next()) {
148 Handle(BOPDS_PaveBlock)& aPB2=aIt2.ChangeValue();
149 if (!aPB2->HasShrunkData()) {
150 FillShrunkData(aPB2);
151 if (myWarningStatus) {
155 aPB2->ShrunkData(aTS21, aTS22, aBB2);
157 if (aBB1.IsOut(aBB2)) {
163 //printf(" nE1=%d nE2=%d\n", nE1, nE2);
165 IntTools_EdgeEdge aEdgeEdge;
167 aEdgeEdge.SetEdge1 (aE1);
168 aEdgeEdge.SetEdge2 (aE2);
169 aEdgeEdge.SetTolerance1 (aTolE1);
170 aEdgeEdge.SetTolerance2 (aTolE2);
171 aEdgeEdge.SetDiscretize (aDiscretize);
172 aEdgeEdge.SetDeflection (aDeflection);
174 IntTools_Range aSR1(aTS11, aTS12);
175 IntTools_Range aSR2(aTS21, aTS22);
176 IntTools_Range anewSR1 = aSR1;
177 IntTools_Range anewSR2 = aSR2;
179 BOPTools_AlgoTools::CorrectRange (aE1, aE2, aSR1, anewSR1);
180 BOPTools_AlgoTools::CorrectRange (aE2, aE1, aSR2, anewSR2);
182 aPB1->Range(aT11, aT12);
183 aPB2->Range(aT21, aT22);
184 IntTools_Range aPBRange1(aT11, aT12), aPBRange2(aT21, aT22);
186 IntTools_Range aPBR1 = aPBRange1;
187 IntTools_Range aPBR2 = aPBRange2;
188 BOPTools_AlgoTools::CorrectRange (aE1, aE2, aPBR1, aPBRange1);
189 BOPTools_AlgoTools::CorrectRange (aE2, aE1, aPBR2, aPBRange2);
191 aEdgeEdge.SetRange1(aPBRange1);
192 aEdgeEdge.SetRange2(aPBRange2);
195 if (!aEdgeEdge.IsDone()) {
199 bOrder=aEdgeEdge.Order();
225 IntTools_Range aR11(aPBR1.First(), aSR1.First()), aR12(aSR1.Last(), aPBR1.Last()),
226 aR21(aPBR2.First(), aSR2.First()), aR22(aSR2.Last(), aPBR2.Last());
228 const IntTools_SequenceOfCommonPrts& aCPrts=aEdgeEdge.CommonParts();
230 aNbCPrts=aCPrts.Length();
231 for (i=1; i<=aNbCPrts; ++i) {
232 const IntTools_CommonPrt& aCPart=aCPrts(i);
235 case TopAbs_VERTEX: {
236 Standard_Boolean bIsOnPave[4], bFlag;
237 Standard_Integer nV[4], j;
238 Standard_Real aT1, aT2, aTol;
241 BOPInt_Tools::VertexParameters(aCPart, aT1, aT2);
242 aTol=Precision::Confusion();
244 //decide to keep the pave or not
245 bIsOnPave[0] = BOPInt_Tools::IsOnPave1(aT1, aR11, aTol);
246 bIsOnPave[1] = BOPInt_Tools::IsOnPave1(aT1, aR12, aTol);
247 bIsOnPave[2] = BOPInt_Tools::IsOnPave1(aT2, aR21, aTol);
248 bIsOnPave[3] = BOPInt_Tools::IsOnPave1(aT2, aR22, aTol);
250 aPBn1->Indices(nV[0], nV[1]);
251 aPBn2->Indices(nV[2], nV[3]);
253 if((bIsOnPave[0] && bIsOnPave[2]) || (bIsOnPave[0] && bIsOnPave[3]) ||
254 (bIsOnPave[1] && bIsOnPave[2]) || (bIsOnPave[1] && bIsOnPave[3])) {
258 bFlag = Standard_False;
259 for (j = 0; j < 4; ++j) {
261 //add interf VE(nV[j], nE)
262 Handle(BOPDS_PaveBlock)& aPB = (j < 2) ? aPBn2 : aPBn1;
263 ForceInterfVE(nV[j], aPB, aMPBToUpdate);
264 bFlag = Standard_True;
272 BOPTools_AlgoTools::MakeNewVertex(aEWhat, aT1, aEWith, aT2, aVnew);
275 Standard_Integer nVS[2], iFound, k;
276 Standard_Real aTolVx, aTolVnew, aD2, aDT2;
277 BOPCol_MapOfInteger aMV;
285 if (aMV.Contains(nV[2])) {
289 if (aMV.Contains(nV[3])) {
294 aTolVnew=BRep_Tool::Tolerance(aVnew);
295 aPnew=BRep_Tool::Pnt(aVnew);
297 for (k=0; k<=j; ++k) {
298 const TopoDS_Vertex& aVx= *(TopoDS_Vertex*)&(myDS->Shape(nVS[k]));
299 aTolVx=BRep_Tool::Tolerance(aVx);
300 aPx=BRep_Tool::Pnt(aVx);
301 aD2=aPnew.SquareDistance(aPx);
303 aDT2=100.*(aTolVnew+aTolVx)*(aTolVnew+aTolVx);
318 BOPDS_InterfEE& aEE=aEEs(iX);
319 aEE.SetIndices(nWhat, nWith);
320 aEE.SetCommonPart(aCPart);
322 myDS->AddInterf(nWhat, nWith);
324 BOPDS_CoupleOfPaveBlocks aCPB;
326 aCPB.SetPaveBlocks(aPB1, aPB2);
327 aCPB.SetIndexInterf(iX);
328 aMVCPB.Add(aVnew, aCPB);
329 }//case TopAbs_VERTEX:
337 Standard_Boolean bHasSameBounds;
338 bHasSameBounds=aPB1->HasSameBounds(aPB2);
339 if (!bHasSameBounds) {
344 BOPDS_InterfEE& aEE=aEEs(iX);
345 aEE.SetIndices(nWhat, nWith);
346 aEE.SetCommonPart(aCPart);
348 myDS->AddInterf(nWhat, nWith);
350 BOPAlgo_Tools::FillMap(aPB1, aPB2, aMPBLPB, aAllocator);
356 }//for (i=1; i<=aNbCPrts; i++) {
359 }// for (; aIt2.More(); aIt2.Next()) {
360 }// for (; aIt1.More(); aIt1.Next()) {
363 //=========================================
365 //=========================================
366 aItPB.Initialize(aMPBToUpdate);
367 for (; aItPB.More(); aItPB.Next()) {
368 Handle(BOPDS_PaveBlock) aPB=aItPB.Value();
369 if (!myDS->IsCommonBlock(aPB)) {
370 myDS->UpdatePaveBlock(aPB);
373 const Handle(BOPDS_CommonBlock)& aCB=myDS->CommonBlock(aPB);
374 myDS->UpdateCommonBlock(aCB);
378 BOPAlgo_Tools::PerformCommonBlocks(aMPBLPB, aAllocator, myDS);
379 PerformVerticesEE(aMVCPB, aAllocator);
380 //-----------------------------------------------------scope t
383 aMPBToUpdate.Clear();
384 aAllocator.Nullify();
386 //=======================================================================
387 //function : PerformVertices
389 //=======================================================================
390 Standard_Integer BOPAlgo_PaveFiller::PerformVerticesEE
391 (BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMVCPB,
392 Handle(NCollection_BaseAllocator)& theAllocator)
394 Standard_Integer aNbV, iRet;
397 aNbV=theMVCPB.Extent();
402 Standard_Integer nVx, iV, j, nE, iFlag, iX, i, aNb;
405 BOPCol_ListIteratorOfListOfShape aItLS;
406 BOPCol_ListIteratorOfListOfInteger aItLI;
407 BOPDS_ListIteratorOfListOfPaveBlock aItLPB;
411 BOPDS_IndexedDataMapOfPaveBlockListOfInteger aMPBLI(100, theAllocator);
412 BOPCol_ListOfShape aLS(theAllocator);
413 BOPCol_IndexedDataMapOfShapeInteger aMVI(100, theAllocator);
414 BOPCol_IndexedDataMapOfShapeListOfShape aImages;
416 aSI.SetShapeType(TopAbs_VERTEX);
417 BOPDS_VectorOfInterfEE& aEEs=myDS->InterfEE();
419 // 1 prepare arguments
422 for (i=1; i<=aNbV; ++i) {
423 const TopoDS_Shape& aS=theMVCPB.FindKey(i);
424 const BOPDS_CoupleOfPaveBlocks& aCPB=theMVCPB.FindFromIndex(i);
425 iV=aCPB.IndexInterf();
430 TreatNewVertices(aMVI, aImages);
432 // 3 Add new vertices to myDS;
433 // connect indices to CPB structure
434 aNb = aImages.Extent();
435 for (i=1; i<=aNb; ++i) {
436 const TopoDS_Vertex& aV=(*(TopoDS_Vertex*)(&aImages.FindKey(i)));
437 const BOPCol_ListOfShape& aLVSD=aImages.FindFromIndex(i);
440 iV=myDS->Append(aSI);
442 BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(iV);
443 Bnd_Box& aBox=aSIDS.ChangeBox();
444 BRepBndLib::Add(aV, aBox);
446 aItLS.Initialize(aLVSD);
447 for (; aItLS.More(); aItLS.Next()) {
448 const TopoDS_Shape& aVx = aItLS.Value();
449 BOPDS_CoupleOfPaveBlocks &aCPB=theMVCPB.ChangeFromKey(aVx);
451 // update EE interference
452 iX=aCPB.IndexInterf();
453 BOPDS_InterfEE& aEE=aEEs(iX);
458 // 4 Map PaveBlock/ListOfVertices to add to this PaveBlock ->aMPBLI
460 Handle(BOPDS_PaveBlock) aPB[2];
462 for (i=1; i<=aNbV; ++i) {
463 const BOPDS_CoupleOfPaveBlocks& aCPB=theMVCPB.FindFromIndex(i);
465 aCPB.PaveBlocks(aPB[0], aPB[1]);
466 for (j=0; j<2; ++j) {
467 if (aMPBLI.Contains(aPB[j])) {
468 BOPCol_ListOfInteger& aLI=aMPBLI.ChangeFromKey(aPB[j]);
472 BOPCol_ListOfInteger aLI(theAllocator);
474 aMPBLI.Add(aPB[j], aLI);
481 // 5.1 Compute Extra Paves and
482 // 5.2. Add Extra Paves to the PaveBlocks
484 for(i=1; i<=aNb; ++i) {
485 Handle(BOPDS_PaveBlock) aPB=aMPBLI.FindKey(i);
486 nE=aPB->OriginalEdge();
487 const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&myDS->Shape(nE)));
489 const BOPCol_ListOfInteger& aLI=aMPBLI.FindFromIndex(i);
490 aItLI.Initialize(aLI);
491 for (; aItLI.More(); aItLI.Next()) {
493 const TopoDS_Vertex& aVx=(*(TopoDS_Vertex *)(&myDS->Shape(nVx)));
495 iFlag=myContext->ComputeVE (aVx, aE, aT);
498 aPave.SetParameter(aT);
499 aPB->AppendExtPave(aPave);
503 // 6 Split PaveBlocksa
505 for(i=1; i<=aNb; ++i) {
506 Handle(BOPDS_PaveBlock) aPB=aMPBLI.FindKey(i);
507 nE=aPB->OriginalEdge();
509 if (!myDS->IsCommonBlock(aPB)) {
510 myDS->UpdatePaveBlock(aPB);
513 const Handle(BOPDS_CommonBlock)& aCB=myDS->CommonBlock(aPB);
514 myDS->UpdateCommonBlock(aCB);
516 }//for (; aItMPBLI.More(); aItMPBLI.Next()) {
521 //=======================================================================
522 //function : TreatNewVertices
524 //=======================================================================
525 void BOPAlgo_PaveFiller::TreatNewVertices
526 (const BOPCol_IndexedDataMapOfShapeInteger& aMapVI,
527 BOPCol_IndexedDataMapOfShapeListOfShape& myImages)
529 Standard_Integer j, i, aNbV, aNbVSD;
533 BOPCol_IndexedMapOfShape aMVProcessed;
535 BOPCol_ListIteratorOfListOfInteger aIt;
536 BOPCol_IndexedDataMapOfShapeListOfShape aMVLV;
537 BOPCol_DataMapOfIntegerShape aMIS;
538 BOPCol_IndexedDataMapOfShapeBox aMSB;
540 BOPCol_BoxBndTreeSelector aSelector;
541 BOPCol_BoxBndTree aBBTree;
542 NCollection_UBTreeFiller <Standard_Integer, Bnd_Box> aTreeFiller(aBBTree);
544 aNbV = aMapVI.Extent();
545 for (i=1; i<=aNbV; ++i) {
546 const TopoDS_Shape& aV=aMapVI.FindKey(i);
549 aTol=BRep_Tool::Tolerance(*(TopoDS_Vertex*)(&aV));
551 BRepBndLib::Add(aV, aBox);
553 aTreeFiller.Add(i, aBox);
562 for (i=1; i<=aNbV; ++i) {
563 const TopoDS_Shape& aV=aMapVI.FindKey(i);
565 if (aMVProcessed.Contains(aV)) {
569 Standard_Integer aNbIP, aIP, aNbIP1, aIP1;
570 BOPCol_ListOfShape aLVSD;
571 BOPCol_MapOfInteger aMIP, aMIP1, aMIPC;
572 BOPCol_MapIteratorOfMapOfInteger aIt1;
577 aIt1.Initialize(aMIP);
578 for(; aIt1.More(); aIt1.Next()) {
580 if (aMIPC.Contains(aIP)) {
584 const TopoDS_Shape& aVP=aMIS.Find(aIP);
585 const Bnd_Box& aBoxVP=aMSB.FindFromKey(aVP);
588 aSelector.SetBox(aBoxVP);
590 aNbVSD=aBBTree.Select(aSelector);
592 continue; // it must not be
595 const BOPCol_ListOfInteger& aLI=aSelector.Indices();
597 for (; aIt.More(); aIt.Next()) {
599 if (aMIP.Contains(aIP1)) {
603 } //for (; aIt.More(); aIt.Next()) {
604 }//for(; aIt1.More(); aIt1.Next()) {
606 aNbIP1=aMIP1.Extent();
608 break; // from while(1)
611 aIt1.Initialize(aMIP);
612 for(; aIt1.More(); aIt1.Next()) {
618 aIt1.Initialize(aMIP1);
619 for(; aIt1.More(); aIt1.Next()) {
626 aNbIP=aMIPC.Extent();
631 aIt1.Initialize(aMIPC);
632 for(j=0; aIt1.More(); aIt1.Next(), ++j) {
634 const TopoDS_Shape& aVP=aMIS.Find(aIP);
639 aMVProcessed.Add(aVP);
641 aMVLV.Add(aVF, aLVSD);
642 }// for (i=1; i<=aNbV; ++i) {
646 for (i=1; i<=aNbV; ++i) {
647 const TopoDS_Shape& aV=aMVLV.FindKey(i);
648 BOPCol_ListOfShape& aLVSD=aMVLV.ChangeFromIndex(i);
649 aNbVSD=aLVSD.Extent();
651 BOPTools_AlgoTools::MakeVertex(aLVSD, aVnew);
652 myImages.Add(aVnew, aLVSD);
654 myImages.Add(aV, aLVSD);
659 //=======================================================================
660 //function : FillShrunkData
662 //=======================================================================
663 void BOPAlgo_PaveFiller::FillShrunkData(Handle(BOPDS_PaveBlock)& thePB)
665 Standard_Integer nE, nV1, nV2, iErr;
666 Standard_Real aT1, aT2, aTS1, aTS2;
667 BOPInt_ShrunkRange aSR;
672 const BOPDS_Pave& aPave1=thePB->Pave1();
674 aT1=aPave1.Parameter();
675 const TopoDS_Vertex& aV1=(*(TopoDS_Vertex *)(&myDS->Shape(nV1)));
677 const BOPDS_Pave& aPave2=thePB->Pave2();
679 aT2=aPave2.Parameter();
680 const TopoDS_Vertex& aV2=(*(TopoDS_Vertex *)(&myDS->Shape(nV2)));
682 nE=thePB->OriginalEdge();
683 const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&myDS->Shape(nE)));
685 aSR.SetData(aE, aT1, aT2, aV1, aV2, myContext);
688 iErr=aSR.ErrorStatus();
695 aSR.ShrunkRange(aTS1, aTS2);
696 const Bnd_Box& aBox=aSR.BndBox();
698 thePB->SetShrunkData(aTS1, aTS2, aBox);
700 //=======================================================================
701 //function : ForceInterfVE
703 //=======================================================================
704 void BOPAlgo_PaveFiller::ForceInterfVE(const Standard_Integer nV,
705 Handle(BOPDS_PaveBlock)& aPB,
706 BOPDS_MapOfPaveBlock& aMPBToUpdate)
708 Standard_Integer aNbPnt, nE;
711 nE = aPB->OriginalEdge();
713 const BOPDS_ShapeInfo& aSIE=myDS->ShapeInfo(nE);
714 if (aSIE.HasSubShape(nV)) {
718 if (myDS->HasInterf(nV, nE)) {
722 if (myDS->HasInterfShapeSubShapes(nV, nE)) {
726 if (aPB->Pave1().Index() == nV || aPB->Pave2().Index() == nV) {
730 const TopoDS_Vertex& aV = *(TopoDS_Vertex*)&myDS->Shape(nV);
731 const TopoDS_Edge& aE = *(TopoDS_Edge*) &myDS->Shape(nE);
732 aP=BRep_Tool::Pnt(aV);
734 GeomAPI_ProjectPointOnCurve& aProjector=myContext->ProjPC(aE);
735 aProjector.Perform(aP);
737 aNbPnt = aProjector.NbPoints();
739 Standard_Real aT, aDist;
744 aDist=aProjector.LowerDistance();
745 aT=aProjector.LowerDistanceParameter();
747 BOPDS_VectorOfInterfVE& aVEs=myDS->InterfVE();
749 BOPDS_InterfVE& aVE=aVEs(i);
750 aVE.SetIndices(nV, nE);
751 aVE.SetParameter(aT);
753 myDS->AddInterf(nV, nE);
755 aBB.UpdateVertex(aV, aDist);
756 BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nV);
757 Bnd_Box& aBox=aSIDS.ChangeBox();
758 BRepBndLib::Add(aV, aBox);
761 aPave.SetParameter(aT);
762 aPB->AppendExtPave(aPave);
764 aMPBToUpdate.Add(aPB);
773 aBBx.MakeCompound(aCx);
774 aItMVCPB.Initialize(theMVCPB);
775 for (; aItMVCPB.More(); aItMVCPB.Next()) {
776 const TopoDS_Shape& aS=aItMVCPB.Key();
779 BRepTools::Write(aCx, "cx");