From: jfa Date: Sat, 5 Mar 2011 09:55:49 +0000 (+0000) Subject: Mantis issue 0021200: Problem of performance when doing a partition. A fix by PKV. X-Git-Tag: Start_BR_19998_21191~36 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=fae650357c2256670c6c928993133d7f4478fc38;p=modules%2Fgeom.git Mantis issue 0021200: Problem of performance when doing a partition. A fix by PKV. --- diff --git a/src/GEOMAlgo/GEOMAlgo_Builder_2.cxx b/src/GEOMAlgo/GEOMAlgo_Builder_2.cxx index 2aa155bb5..489947dea 100755 --- a/src/GEOMAlgo/GEOMAlgo_Builder_2.cxx +++ b/src/GEOMAlgo/GEOMAlgo_Builder_2.cxx @@ -21,9 +21,8 @@ // // File: GEOMAlgo_Builder_2.cxx -// Created: -// Author: Peter KURNEV -// +// Author: Peter KURNEV + #include #include @@ -88,6 +87,14 @@ #include #include +// +#include +#include +#include +#include +#include +#include +#include static void UpdateCandidates(const Standard_Integer , @@ -96,7 +103,7 @@ static //======================================================================= //function : FillImagesFaces -//purpose : +//purpose : //======================================================================= void GEOMAlgo_Builder::FillImagesFaces() { @@ -108,9 +115,10 @@ static FillImagesFaces1(); FillInternalVertices(); } + //======================================================================= // function: FillIn2DParts -// purpose: +// purpose: //======================================================================= void GEOMAlgo_Builder::FillIn2DParts() { @@ -192,9 +200,10 @@ static } }//for (nF=1; nF<=aNbS; ++nF) { } + //======================================================================= // function: BuildSplitFaces -// purpose: +// purpose: //======================================================================= void GEOMAlgo_Builder::BuildSplitFaces() { @@ -257,9 +266,7 @@ static aNbSE=aLSE.Extent(); if (aNbSE) { aMFP.Add(i); - //modified by NIZNHY-PKV Wed Oct 27 11:40:57 2010f - break; - //modified by NIZNHY-PKV Wed Oct 27 11:41:07 2010t + break; } } } @@ -278,7 +285,7 @@ static // aMFence.Clear(); // - // 2.1. Fill WES + // 2.1. Fill WES GEOMAlgo_WireEdgeSet aWES; aWES.SetFace(aFF); // @@ -368,13 +375,11 @@ static GEOMAlgo_ShapeSet aS1, aS2; // const TopTools_ListOfShape& aSE=aWES.StartElements(); - //modified by NIZNHY-PKV Thu Oct 28 08:30:41 2010f aS1.Add(aSE); aS2.Add(aFF, TopAbs_EDGE); if (aS1.IsEqual(aS2)) { aLFR.Append(aF); } - //modified by NIZNHY-PKV Thu Oct 28 08:30:42 2010t else { GEOMAlgo_BuilderFace aBF; // @@ -387,11 +392,11 @@ static const TopTools_ListOfShape& aLF=aBF.Areas(); aIt.Initialize(aLF); for (; aIt.More(); aIt.Next()) { - TopoDS_Shape& aFR=aIt.Value(); - if (anOriF==TopAbs_REVERSED) { - aFR.Orientation(TopAbs_REVERSED); - } - aLFR.Append(aFR); + TopoDS_Shape& aFR=aIt.Value(); + if (anOriF==TopAbs_REVERSED) { + aFR.Orientation(TopAbs_REVERSED); + } + aLFR.Append(aFR); } } // @@ -399,23 +404,27 @@ static mySplitFaces.Bind(aF, aLFR); }//for (i=1; i<=aNbF; ++i) } + //======================================================================= // function: FillSameDomainFaces -// purpose: +// purpose: //======================================================================= void GEOMAlgo_Builder::FillSameDomainFaces() { + Standard_Boolean bIsSDF, bHasImage1, bHasImage2; + Standard_Integer i, j, aNbFF, nF1, nF2, aNbPBInOn, aNbC, aNbSE; + Standard_Integer aNbF1, aNbF2, i2s, aNbSD; + TopTools_MapOfShape aMFence; + TopTools_ListOfShape aLSempty; + TopTools_ListIteratorOfListOfShape aItF1, aItF2; + NMTTools_ListOfCoupleOfShape aLCS; + // const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS(); NMTTools_PaveFiller* pPF=myPaveFiller; NMTDS_InterfPool* pIP=pPF->IP(); BOPTools_CArray1OfSSInterference& aFFs=pIP->SSInterferences(); IntTools_Context& aCtx= pPF->ChangeContext(); // - Standard_Boolean bIsSDF; - Standard_Integer i, j, aNbFF, nF1, nF2, aNbPBInOn, aNbC, aNbSE; - TopTools_MapOfShape aMFence; - TopTools_ListIteratorOfListOfShape aItF1, aItF2; - NMTTools_ListOfCoupleOfShape aLCS; // //mySameDomainShapes.Clear(); // @@ -453,16 +462,62 @@ static // the faces are suspected to be SDF. // Try to find SDF among images of nF1, nF2 aMFence.Clear(); - const TopTools_ListOfShape& aLF1=mySplitFaces.Image(aF1); - const TopTools_ListOfShape& aLF2=mySplitFaces.Image(aF2); // + //XXXXXXXXXXXXXf + bHasImage1=mySplitFaces.HasImage(aF1); + bHasImage2=mySplitFaces.HasImage(aF2); + // + const TopTools_ListOfShape& aLF1r=(bHasImage1)? mySplitFaces.Image(aF1) : aLSempty; + const TopTools_ListOfShape& aLF2r=(bHasImage2)? mySplitFaces.Image(aF2) : aLSempty; + // + TopTools_DataMapOfIntegerShape aMIS; + TColStd_ListIteratorOfListOfInteger aItLI; + NMTDS_BoxBndTreeSelector aSelector; + NMTDS_BoxBndTree aBBTree; + NCollection_UBTreeFiller aTreeFiller(aBBTree); + // + aNbF1=aLF1r.Extent(); + aNbF2=aLF2r.Extent(); + const TopTools_ListOfShape& aLF1=(aNbF1ESInterferences(); const NMTTools_IndexedDataMapOfIndexedMapOfInteger& aMAV=pPF->AloneVertices(); // - Standard_Boolean bHasImage; - Standard_Integer i, j, nF, aNbS, nV, nVSD, n1, n2, iFlag; + Standard_Boolean bHasImage; + Standard_Integer i, j, nF, aNbS, nV, nVSD, n1, n2, iFlag; Standard_Integer aNbVFs, aNbAVF, aNbEFs, aNbVC, aNbE, aNbV; Standard_Real aU1, aU2, aTol; NMTTools_IndexedDataMapOfIndexedMapOfInteger aMFMV; @@ -664,7 +718,7 @@ static const TColStd_IndexedMapOfInteger& aMAVF=aMAV.FindFromKey(nF); aNbAVF=aMAVF.Extent(); for (j=1; j<=aNbAVF; ++j) { - nV=aMAVF(j); + nV=aMAVF(j); nVSD=pPF->FindSDVertex(nV); if (nVSD) { nV=nVSD; @@ -714,7 +768,7 @@ static TopExp::MapShapesAndAncestors(aFx, TopAbs_VERTEX, TopAbs_EDGE, aMVE); } } - else { + else { Standard_Boolean bFaceToProcess; // TopExp::MapShapesAndAncestors(aF, TopAbs_VERTEX, TopAbs_EDGE, aMVE); @@ -770,7 +824,7 @@ static } } } - else { + else { const TopoDS_Face& aFx=TopoDS::Face(aF); // update classifier IntTools_FClass2d& aClsf=aCtx.FClass2d(aFx); @@ -780,7 +834,7 @@ static if (!iFlag) { TopoDS_Face aFz; // - GEOMAlgo_Tools3D::CopyFace(aFx, aFz); + GEOMAlgo_Tools3D::CopyFace(aFx, aFz); aBB.Add(aFz, aV); myImages.Bind(aF, aFz); } @@ -789,9 +843,10 @@ static }// if (aNbV) { }// for (nF=1; nF<=aNb; ++nF) { } + //======================================================================= // function: UpdateCandidates -// purpose: +// purpose: //======================================================================= void UpdateCandidates(const Standard_Integer theNF, const Standard_Integer theNV,