mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2024-11-15 10:08:35 +05:00
Mantis issue 0021200: Problem of performance when doing a partition. A fix by PKV.
This commit is contained in:
parent
8f50d474d5
commit
fae650357c
@ -21,9 +21,8 @@
|
||||
//
|
||||
|
||||
// File: GEOMAlgo_Builder_2.cxx
|
||||
// Created:
|
||||
// Author: Peter KURNEV
|
||||
//
|
||||
|
||||
#include <GEOMAlgo_Builder.hxx>
|
||||
|
||||
#include <TColStd_IndexedMapOfInteger.hxx>
|
||||
@ -88,6 +87,14 @@
|
||||
#include <GEOMAlgo_BuilderFace.hxx>
|
||||
|
||||
#include <GEOMAlgo_ShapeSet.hxx>
|
||||
//
|
||||
#include <NMTDS_BoxBndTree.hxx>
|
||||
#include <NCollection_UBTreeFiller.hxx>
|
||||
#include <Bnd_Box.hxx>
|
||||
#include <BRepBndLib.hxx>
|
||||
#include <TopTools_DataMapOfIntegerShape.hxx>
|
||||
#include <TColStd_ListOfInteger.hxx>
|
||||
#include <TColStd_ListIteratorOfListOfInteger.hxx>
|
||||
|
||||
static
|
||||
void UpdateCandidates(const Standard_Integer ,
|
||||
@ -108,6 +115,7 @@ static
|
||||
FillImagesFaces1();
|
||||
FillInternalVertices();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: FillIn2DParts
|
||||
// purpose:
|
||||
@ -192,6 +200,7 @@ static
|
||||
}
|
||||
}//for (nF=1; nF<=aNbS; ++nF) {
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: BuildSplitFaces
|
||||
// purpose:
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
//
|
||||
@ -399,23 +404,27 @@ static
|
||||
mySplitFaces.Bind(aF, aLFR);
|
||||
}//for (i=1; i<=aNbF; ++i)
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: FillSameDomainFaces
|
||||
// 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);
|
||||
//
|
||||
aItF1.Initialize(aLF1);
|
||||
for (; aItF1.More(); aItF1.Next()) {
|
||||
const TopoDS_Face& aF1x=TopoDS::Face(aItF1.Value());
|
||||
//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 <Standard_Integer, Bnd_Box> aTreeFiller(aBBTree);
|
||||
//
|
||||
aNbF1=aLF1r.Extent();
|
||||
aNbF2=aLF2r.Extent();
|
||||
const TopTools_ListOfShape& aLF1=(aNbF1<aNbF2)? aLF1r : aLF2r;
|
||||
const TopTools_ListOfShape& aLF2=(aNbF1<aNbF2)? aLF2r : aLF1r;
|
||||
//
|
||||
// 1. aTreeFiller
|
||||
aItF2.Initialize(aLF2);
|
||||
for (; aItF2.More(); aItF2.Next()) {
|
||||
const TopoDS_Face& aF2y=TopoDS::Face(aItF2.Value());
|
||||
for (i2s=1; aItF2.More(); aItF2.Next(), ++i2s) {
|
||||
Bnd_Box aBoxF2s;
|
||||
//
|
||||
const TopoDS_Face& aF2s=*((TopoDS_Face*)(&aItF2.Value()));
|
||||
//
|
||||
BRepBndLib::Add(aF2s, aBoxF2s);
|
||||
//
|
||||
aMIS.Bind(i2s, aF2s);
|
||||
//
|
||||
aTreeFiller.Add(i2s, aBoxF2s);
|
||||
}//for (i2s=1; aItF2.More(); aItF2.Next(), ++i2s) {
|
||||
//
|
||||
aTreeFiller.Fill();
|
||||
//
|
||||
// 2.
|
||||
aItF1.Initialize(aLF1);
|
||||
for (j=1; aItF1.More(); aItF1.Next(), ++j) {
|
||||
Bnd_Box aBoxF1x;
|
||||
//
|
||||
const TopoDS_Face& aF1x=*((TopoDS_Face*)(&aItF1.Value()));
|
||||
//
|
||||
BRepBndLib::Add(aF1x, aBoxF1x);
|
||||
//
|
||||
aSelector.Clear();
|
||||
aSelector.SetBox(aBoxF1x);
|
||||
aNbSD=aBBTree.Select(aSelector);
|
||||
if (!aNbSD) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
const TColStd_ListOfInteger& aLI=aSelector.Indices();
|
||||
aItLI.Initialize(aLI);
|
||||
for (; aItLI.More(); aItLI.Next()) {
|
||||
i2s=aItLI.Value();
|
||||
const TopoDS_Face& aF2y=*((TopoDS_Face*)(&aMIS.Find(i2s)));
|
||||
bIsSDF=NMTTools_Tools::AreFacesSameDomain(aF1x, aF2y, aCtx);
|
||||
if (bIsSDF) {
|
||||
if (aMFence.Contains(aF1x) ||
|
||||
@ -488,13 +543,12 @@ static
|
||||
mySplitFaces.Bind(aF2, aF2);
|
||||
}
|
||||
}
|
||||
//
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}//if (bIsSDF) {
|
||||
}//for (; aItLI.More(); aItLI.Next()) {
|
||||
}//for (; aItF1.More(); aItF1.Next()) {
|
||||
}//for (i=1; i<=aNbFF; ++i)
|
||||
//
|
||||
//XXXXXXXXXXXXXt
|
||||
aNbC=aLCS.Extent();
|
||||
if (!aNbC) {
|
||||
return;
|
||||
@ -519,6 +573,7 @@ static
|
||||
}
|
||||
//
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: FillImagesFaces1
|
||||
// purpose:
|
||||
@ -564,7 +619,6 @@ static
|
||||
}
|
||||
}
|
||||
if (!myImages.HasImage(aF)) {
|
||||
//modified by NIZNHY-PKV Wed Oct 27 14:41:34 2010f
|
||||
aNbLFx=aLFx.Extent();
|
||||
if (aNbLFx==1) {
|
||||
const TopoDS_Shape& aFx=aLFx.First();
|
||||
@ -572,11 +626,11 @@ static
|
||||
continue;
|
||||
}
|
||||
}
|
||||
//modified by NIZNHY-PKV Wed Oct 27 14:41:36 2010t
|
||||
myImages.Bind(aF, aLFx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: FillInternalVertices
|
||||
// purpose:
|
||||
@ -789,6 +843,7 @@ static
|
||||
}// if (aNbV) {
|
||||
}// for (nF=1; nF<=aNb; ++nF) {
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: UpdateCandidates
|
||||
// purpose:
|
||||
|
Loading…
Reference in New Issue
Block a user