{
SMDS_Mesh* _mesh;
SMDS_ElemIteratorPtr _meshPartIt;
- ElementBndBoxTree* _ebbTree;
- int _ebbTreeHeight;
+ ElementBndBoxTree* _ebbTree [SMDSAbs_NbElementTypes];
+ int _ebbTreeHeight[SMDSAbs_NbElementTypes];
SMESH_NodeSearcherImpl* _nodeSearcher;
SMDSAbs_ElementType _elementType;
double _tolerance;
SMESH_ElementSearcherImpl( SMDS_Mesh& mesh,
double tol=-1,
SMDS_ElemIteratorPtr elemIt=SMDS_ElemIteratorPtr())
- : _mesh(&mesh),_meshPartIt(elemIt),_ebbTree(0),_ebbTreeHeight(-1),_nodeSearcher(0),_tolerance(tol),_outerFacesFound(false) {}
+ : _mesh(&mesh),_meshPartIt(elemIt),_nodeSearcher(0),_tolerance(tol),_outerFacesFound(false)
+ {
+ for ( int i = 0; i < SMDSAbs_NbElementTypes; ++i )
+ {
+ _ebbTree[i] = NULL;
+ _ebbTreeHeight[i] = -1;
+ }
+ }
virtual ~SMESH_ElementSearcherImpl()
{
- if ( _ebbTree ) delete _ebbTree; _ebbTree = 0;
+ for ( int i = 0; i < SMDSAbs_NbElementTypes; ++i )
+ {
+ delete _ebbTree[i]; _ebbTree[i] = NULL;
+ }
if ( _nodeSearcher ) delete _nodeSearcher; _nodeSearcher = 0;
}
virtual int FindElementsByPoint(const gp_Pnt& point,
}
int getTreeHeight()
{
- if ( _ebbTreeHeight < 0 )
- _ebbTreeHeight = _ebbTree->getHeight();
- return _ebbTreeHeight;
+ if ( _ebbTreeHeight[ _elementType ] < 0 )
+ _ebbTreeHeight[ _elementType ] = _ebbTree[ _elementType ]->getHeight();
+ return _ebbTreeHeight[ _elementType ];
}
struct TInters //!< data of intersection of the line and the mesh face (used in GetPointState())
double boxSize = _nodeSearcher->getTree()->maxSize();
_tolerance = 1e-8 * boxSize/* / meshInfo.NbNodes()*/;
}
- else if ( _ebbTree && meshInfo.NbElements() > 0 )
+ else if ( _ebbTree[_elementType] && meshInfo.NbElements() > 0 )
{
- double boxSize = _ebbTree->maxSize();
+ double boxSize = _ebbTree[_elementType]->maxSize();
_tolerance = 1e-8 * boxSize/* / meshInfo.NbElements()*/;
}
if ( _tolerance == 0 )
}
else
{
- SMDS_ElemIteratorPtr elemIt =
- _mesh->elementsIterator( SMDSAbs_ElementType( complexType ));
+ SMDS_ElemIteratorPtr elemIt = _mesh->elementsIterator( SMDSAbs_ElementType( complexType ));
const SMDS_MeshElement* elem = elemIt->next();
- SMDS_ElemIteratorPtr nodeIt = elem->nodesIterator();
+ SMDS_ElemIteratorPtr nodeIt = elem->nodesIterator();
SMESH_TNodeXYZ n1( nodeIt->next() );
elemSize = 0;
while ( nodeIt->more() )
vector< const SMDS_MeshElement* >& foundElements)
{
foundElements.clear();
+ _elementType = type;
double tolerance = getTolerance();
// =================================================================================
else // elements more complex than 0D
{
- if ( !_ebbTree || _elementType != type )
+ if ( !_ebbTree[type] )
{
- if ( _ebbTree ) delete _ebbTree;
- _ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt, tolerance );
+ _ebbTree[_elementType] = new ElementBndBoxTree( *_mesh, type, _meshPartIt, tolerance );
}
TIDSortedElemSet suspectElems;
- _ebbTree->getElementsNearPoint( point, suspectElems );
+ _ebbTree[ type ]->getElementsNearPoint( point, suspectElems );
TIDSortedElemSet::iterator elem = suspectElems.begin();
for ( ; elem != suspectElems.end(); ++elem )
if ( !SMESH_MeshAlgos::IsOut( *elem, point, tolerance ))
SMDSAbs_ElementType type )
{
const SMDS_MeshElement* closestElem = 0;
+ _elementType = type;
if ( type == SMDSAbs_Face || type == SMDSAbs_Volume )
{
- if ( !_ebbTree || _elementType != type )
- {
- if ( _ebbTree ) delete _ebbTree;
- _ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt );
- }
+ ElementBndBoxTree*& ebbTree = _ebbTree[ type ];
+ if ( !ebbTree )
+ ebbTree = new ElementBndBoxTree( *_mesh, type, _meshPartIt );
+
TIDSortedElemSet suspectElems;
- _ebbTree->getElementsNearPoint( point, suspectElems );
+ ebbTree->getElementsNearPoint( point, suspectElems );
- if ( suspectElems.empty() && _ebbTree->maxSize() > 0 )
+ if ( suspectElems.empty() && ebbTree->maxSize() > 0 )
{
- gp_Pnt boxCenter = 0.5 * ( _ebbTree->getBox()->CornerMin() +
- _ebbTree->getBox()->CornerMax() );
+ gp_Pnt boxCenter = 0.5 * ( ebbTree->getBox()->CornerMin() +
+ ebbTree->getBox()->CornerMax() );
double radius = -1;
- if ( _ebbTree->getBox()->IsOut( point.XYZ() ))
- radius = point.Distance( boxCenter ) - 0.5 * _ebbTree->maxSize();
+ if ( ebbTree->getBox()->IsOut( point.XYZ() ))
+ radius = point.Distance( boxCenter ) - 0.5 * ebbTree->maxSize();
if ( radius < 0 )
- radius = _ebbTree->maxSize() / pow( 2., getTreeHeight()) / 2;
+ radius = ebbTree->maxSize() / pow( 2., getTreeHeight()) / 2;
while ( suspectElems.empty() )
{
- _ebbTree->getElementsInSphere( point.XYZ(), radius, suspectElems );
+ ebbTree->getElementsInSphere( point.XYZ(), radius, suspectElems );
radius *= 1.1;
}
}
TopAbs_State SMESH_ElementSearcherImpl::GetPointState(const gp_Pnt& point)
{
double tolerance = getTolerance();
- if ( !_ebbTree || _elementType != SMDSAbs_Face )
- {
- if ( _ebbTree ) delete _ebbTree;
- _ebbTree = new ElementBndBoxTree( *_mesh, _elementType = SMDSAbs_Face, _meshPartIt );
- }
+
+ _elementType = SMDSAbs_Face;
+
+ ElementBndBoxTree*& ebbTree = _ebbTree[ SMDSAbs_Face ];
+ if ( !ebbTree )
+ ebbTree = new ElementBndBoxTree( *_mesh, _elementType, _meshPartIt );
+
// Algo: analyse transition of a line starting at the point through mesh boundary;
// try three lines parallel to axis of the coordinate system and perform rough
// analysis. If solution is not clear perform thorough analysis.
gp_Lin line ( lineAxis );
TIDSortedElemSet suspectFaces; // faces possibly intersecting the line
- _ebbTree->getElementsNearLine( lineAxis, suspectFaces );
+ ebbTree->getElementsNearLine( lineAxis, suspectFaces );
// Intersect faces with the line
SMDSAbs_ElementType type,
vector< const SMDS_MeshElement* >& foundElems)
{
- if ( !_ebbTree || _elementType != type )
- {
- if ( _ebbTree ) delete _ebbTree;
- _ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt );
- }
+ _elementType = type;
+ ElementBndBoxTree*& ebbTree = _ebbTree[ type ];
+ if ( !ebbTree )
+ ebbTree = new ElementBndBoxTree( *_mesh, _elementType, _meshPartIt );
+
TIDSortedElemSet suspectFaces; // elements possibly intersecting the line
- _ebbTree->getElementsNearLine( line, suspectFaces );
+ ebbTree->getElementsNearLine( line, suspectFaces );
foundElems.assign( suspectFaces.begin(), suspectFaces.end());
}
SMDSAbs_ElementType type,
vector< const SMDS_MeshElement* >& foundElems)
{
- if ( !_ebbTree || _elementType != type )
- {
- if ( _ebbTree ) delete _ebbTree;
- _ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt );
- }
+ _elementType = type;
+ ElementBndBoxTree*& ebbTree = _ebbTree[ type ];
+ if ( !ebbTree )
+ ebbTree = new ElementBndBoxTree( *_mesh, _elementType, _meshPartIt );
+
TIDSortedElemSet suspectFaces; // elements possibly intersecting the line
- _ebbTree->getElementsInSphere( center, radius, suspectFaces );
+ ebbTree->getElementsInSphere( center, radius, suspectFaces );
foundElems.assign( suspectFaces.begin(), suspectFaces.end() );
}