mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-15 05:50:32 +05:00
IPAL53716: Body Fitting - cavities in mesh mismatch cavities in geometry
This commit is contained in:
parent
dca6c871d2
commit
2ba55546bd
@ -441,8 +441,8 @@ struct SMESH_ElementSearcherImpl: public SMESH_ElementSearcher
|
|||||||
{
|
{
|
||||||
SMDS_Mesh* _mesh;
|
SMDS_Mesh* _mesh;
|
||||||
SMDS_ElemIteratorPtr _meshPartIt;
|
SMDS_ElemIteratorPtr _meshPartIt;
|
||||||
ElementBndBoxTree* _ebbTree;
|
ElementBndBoxTree* _ebbTree [SMDSAbs_NbElementTypes];
|
||||||
int _ebbTreeHeight;
|
int _ebbTreeHeight[SMDSAbs_NbElementTypes];
|
||||||
SMESH_NodeSearcherImpl* _nodeSearcher;
|
SMESH_NodeSearcherImpl* _nodeSearcher;
|
||||||
SMDSAbs_ElementType _elementType;
|
SMDSAbs_ElementType _elementType;
|
||||||
double _tolerance;
|
double _tolerance;
|
||||||
@ -452,10 +452,20 @@ struct SMESH_ElementSearcherImpl: public SMESH_ElementSearcher
|
|||||||
SMESH_ElementSearcherImpl( SMDS_Mesh& mesh,
|
SMESH_ElementSearcherImpl( SMDS_Mesh& mesh,
|
||||||
double tol=-1,
|
double tol=-1,
|
||||||
SMDS_ElemIteratorPtr elemIt=SMDS_ElemIteratorPtr())
|
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()
|
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;
|
if ( _nodeSearcher ) delete _nodeSearcher; _nodeSearcher = 0;
|
||||||
}
|
}
|
||||||
virtual int FindElementsByPoint(const gp_Pnt& point,
|
virtual int FindElementsByPoint(const gp_Pnt& point,
|
||||||
@ -482,9 +492,9 @@ struct SMESH_ElementSearcherImpl: public SMESH_ElementSearcher
|
|||||||
}
|
}
|
||||||
int getTreeHeight()
|
int getTreeHeight()
|
||||||
{
|
{
|
||||||
if ( _ebbTreeHeight < 0 )
|
if ( _ebbTreeHeight[ _elementType ] < 0 )
|
||||||
_ebbTreeHeight = _ebbTree->getHeight();
|
_ebbTreeHeight[ _elementType ] = _ebbTree[ _elementType ]->getHeight();
|
||||||
return _ebbTreeHeight;
|
return _ebbTreeHeight[ _elementType ];
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TInters //!< data of intersection of the line and the mesh face (used in GetPointState())
|
struct TInters //!< data of intersection of the line and the mesh face (used in GetPointState())
|
||||||
@ -528,9 +538,9 @@ double SMESH_ElementSearcherImpl::getTolerance()
|
|||||||
double boxSize = _nodeSearcher->getTree()->maxSize();
|
double boxSize = _nodeSearcher->getTree()->maxSize();
|
||||||
_tolerance = 1e-8 * boxSize/* / meshInfo.NbNodes()*/;
|
_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()*/;
|
_tolerance = 1e-8 * boxSize/* / meshInfo.NbElements()*/;
|
||||||
}
|
}
|
||||||
if ( _tolerance == 0 )
|
if ( _tolerance == 0 )
|
||||||
@ -551,8 +561,7 @@ double SMESH_ElementSearcherImpl::getTolerance()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SMDS_ElemIteratorPtr elemIt =
|
SMDS_ElemIteratorPtr elemIt = _mesh->elementsIterator( SMDSAbs_ElementType( complexType ));
|
||||||
_mesh->elementsIterator( SMDSAbs_ElementType( complexType ));
|
|
||||||
const SMDS_MeshElement* elem = elemIt->next();
|
const SMDS_MeshElement* elem = elemIt->next();
|
||||||
SMDS_ElemIteratorPtr nodeIt = elem->nodesIterator();
|
SMDS_ElemIteratorPtr nodeIt = elem->nodesIterator();
|
||||||
SMESH_TNodeXYZ n1( nodeIt->next() );
|
SMESH_TNodeXYZ n1( nodeIt->next() );
|
||||||
@ -723,6 +732,7 @@ FindElementsByPoint(const gp_Pnt& point,
|
|||||||
vector< const SMDS_MeshElement* >& foundElements)
|
vector< const SMDS_MeshElement* >& foundElements)
|
||||||
{
|
{
|
||||||
foundElements.clear();
|
foundElements.clear();
|
||||||
|
_elementType = type;
|
||||||
|
|
||||||
double tolerance = getTolerance();
|
double tolerance = getTolerance();
|
||||||
|
|
||||||
@ -756,13 +766,12 @@ FindElementsByPoint(const gp_Pnt& point,
|
|||||||
// =================================================================================
|
// =================================================================================
|
||||||
else // elements more complex than 0D
|
else // elements more complex than 0D
|
||||||
{
|
{
|
||||||
if ( !_ebbTree || _elementType != type )
|
if ( !_ebbTree[type] )
|
||||||
{
|
{
|
||||||
if ( _ebbTree ) delete _ebbTree;
|
_ebbTree[_elementType] = new ElementBndBoxTree( *_mesh, type, _meshPartIt, tolerance );
|
||||||
_ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt, tolerance );
|
|
||||||
}
|
}
|
||||||
TIDSortedElemSet suspectElems;
|
TIDSortedElemSet suspectElems;
|
||||||
_ebbTree->getElementsNearPoint( point, suspectElems );
|
_ebbTree[ type ]->getElementsNearPoint( point, suspectElems );
|
||||||
TIDSortedElemSet::iterator elem = suspectElems.begin();
|
TIDSortedElemSet::iterator elem = suspectElems.begin();
|
||||||
for ( ; elem != suspectElems.end(); ++elem )
|
for ( ; elem != suspectElems.end(); ++elem )
|
||||||
if ( !SMESH_MeshAlgos::IsOut( *elem, point, tolerance ))
|
if ( !SMESH_MeshAlgos::IsOut( *elem, point, tolerance ))
|
||||||
@ -784,29 +793,29 @@ SMESH_ElementSearcherImpl::FindClosestTo( const gp_Pnt& point,
|
|||||||
SMDSAbs_ElementType type )
|
SMDSAbs_ElementType type )
|
||||||
{
|
{
|
||||||
const SMDS_MeshElement* closestElem = 0;
|
const SMDS_MeshElement* closestElem = 0;
|
||||||
|
_elementType = type;
|
||||||
|
|
||||||
if ( type == SMDSAbs_Face || type == SMDSAbs_Volume )
|
if ( type == SMDSAbs_Face || type == SMDSAbs_Volume )
|
||||||
{
|
{
|
||||||
if ( !_ebbTree || _elementType != type )
|
ElementBndBoxTree*& ebbTree = _ebbTree[ type ];
|
||||||
{
|
if ( !ebbTree )
|
||||||
if ( _ebbTree ) delete _ebbTree;
|
ebbTree = new ElementBndBoxTree( *_mesh, type, _meshPartIt );
|
||||||
_ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt );
|
|
||||||
}
|
|
||||||
TIDSortedElemSet suspectElems;
|
|
||||||
_ebbTree->getElementsNearPoint( point, suspectElems );
|
|
||||||
|
|
||||||
if ( suspectElems.empty() && _ebbTree->maxSize() > 0 )
|
TIDSortedElemSet suspectElems;
|
||||||
|
ebbTree->getElementsNearPoint( point, suspectElems );
|
||||||
|
|
||||||
|
if ( suspectElems.empty() && ebbTree->maxSize() > 0 )
|
||||||
{
|
{
|
||||||
gp_Pnt boxCenter = 0.5 * ( _ebbTree->getBox()->CornerMin() +
|
gp_Pnt boxCenter = 0.5 * ( ebbTree->getBox()->CornerMin() +
|
||||||
_ebbTree->getBox()->CornerMax() );
|
ebbTree->getBox()->CornerMax() );
|
||||||
double radius = -1;
|
double radius = -1;
|
||||||
if ( _ebbTree->getBox()->IsOut( point.XYZ() ))
|
if ( ebbTree->getBox()->IsOut( point.XYZ() ))
|
||||||
radius = point.Distance( boxCenter ) - 0.5 * _ebbTree->maxSize();
|
radius = point.Distance( boxCenter ) - 0.5 * ebbTree->maxSize();
|
||||||
if ( radius < 0 )
|
if ( radius < 0 )
|
||||||
radius = _ebbTree->maxSize() / pow( 2., getTreeHeight()) / 2;
|
radius = ebbTree->maxSize() / pow( 2., getTreeHeight()) / 2;
|
||||||
while ( suspectElems.empty() )
|
while ( suspectElems.empty() )
|
||||||
{
|
{
|
||||||
_ebbTree->getElementsInSphere( point.XYZ(), radius, suspectElems );
|
ebbTree->getElementsInSphere( point.XYZ(), radius, suspectElems );
|
||||||
radius *= 1.1;
|
radius *= 1.1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -870,11 +879,13 @@ SMESH_ElementSearcherImpl::FindClosestTo( const gp_Pnt& point,
|
|||||||
TopAbs_State SMESH_ElementSearcherImpl::GetPointState(const gp_Pnt& point)
|
TopAbs_State SMESH_ElementSearcherImpl::GetPointState(const gp_Pnt& point)
|
||||||
{
|
{
|
||||||
double tolerance = getTolerance();
|
double tolerance = getTolerance();
|
||||||
if ( !_ebbTree || _elementType != SMDSAbs_Face )
|
|
||||||
{
|
_elementType = SMDSAbs_Face;
|
||||||
if ( _ebbTree ) delete _ebbTree;
|
|
||||||
_ebbTree = new ElementBndBoxTree( *_mesh, _elementType = SMDSAbs_Face, _meshPartIt );
|
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;
|
// 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
|
// try three lines parallel to axis of the coordinate system and perform rough
|
||||||
// analysis. If solution is not clear perform thorough analysis.
|
// analysis. If solution is not clear perform thorough analysis.
|
||||||
@ -890,7 +901,7 @@ TopAbs_State SMESH_ElementSearcherImpl::GetPointState(const gp_Pnt& point)
|
|||||||
gp_Lin line ( lineAxis );
|
gp_Lin line ( lineAxis );
|
||||||
|
|
||||||
TIDSortedElemSet suspectFaces; // faces possibly intersecting the line
|
TIDSortedElemSet suspectFaces; // faces possibly intersecting the line
|
||||||
_ebbTree->getElementsNearLine( lineAxis, suspectFaces );
|
ebbTree->getElementsNearLine( lineAxis, suspectFaces );
|
||||||
|
|
||||||
// Intersect faces with the line
|
// Intersect faces with the line
|
||||||
|
|
||||||
@ -1098,13 +1109,13 @@ void SMESH_ElementSearcherImpl::GetElementsNearLine( const gp_Ax1&
|
|||||||
SMDSAbs_ElementType type,
|
SMDSAbs_ElementType type,
|
||||||
vector< const SMDS_MeshElement* >& foundElems)
|
vector< const SMDS_MeshElement* >& foundElems)
|
||||||
{
|
{
|
||||||
if ( !_ebbTree || _elementType != type )
|
_elementType = type;
|
||||||
{
|
ElementBndBoxTree*& ebbTree = _ebbTree[ type ];
|
||||||
if ( _ebbTree ) delete _ebbTree;
|
if ( !ebbTree )
|
||||||
_ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt );
|
ebbTree = new ElementBndBoxTree( *_mesh, _elementType, _meshPartIt );
|
||||||
}
|
|
||||||
TIDSortedElemSet suspectFaces; // elements possibly intersecting the line
|
TIDSortedElemSet suspectFaces; // elements possibly intersecting the line
|
||||||
_ebbTree->getElementsNearLine( line, suspectFaces );
|
ebbTree->getElementsNearLine( line, suspectFaces );
|
||||||
foundElems.assign( suspectFaces.begin(), suspectFaces.end());
|
foundElems.assign( suspectFaces.begin(), suspectFaces.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1119,13 +1130,13 @@ void SMESH_ElementSearcherImpl::GetElementsInSphere( const gp_XYZ&
|
|||||||
SMDSAbs_ElementType type,
|
SMDSAbs_ElementType type,
|
||||||
vector< const SMDS_MeshElement* >& foundElems)
|
vector< const SMDS_MeshElement* >& foundElems)
|
||||||
{
|
{
|
||||||
if ( !_ebbTree || _elementType != type )
|
_elementType = type;
|
||||||
{
|
ElementBndBoxTree*& ebbTree = _ebbTree[ type ];
|
||||||
if ( _ebbTree ) delete _ebbTree;
|
if ( !ebbTree )
|
||||||
_ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt );
|
ebbTree = new ElementBndBoxTree( *_mesh, _elementType, _meshPartIt );
|
||||||
}
|
|
||||||
TIDSortedElemSet suspectFaces; // elements possibly intersecting the line
|
TIDSortedElemSet suspectFaces; // elements possibly intersecting the line
|
||||||
_ebbTree->getElementsInSphere( center, radius, suspectFaces );
|
ebbTree->getElementsInSphere( center, radius, suspectFaces );
|
||||||
foundElems.assign( suspectFaces.begin(), suspectFaces.end() );
|
foundElems.assign( suspectFaces.begin(), suspectFaces.end() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3167,7 +3167,7 @@ namespace
|
|||||||
const F_IntersectPoint* firstIntPnt = 0;
|
const F_IntersectPoint* firstIntPnt = 0;
|
||||||
if ( link._nodes[0]->Node() ) // 1st node is a hexa corner
|
if ( link._nodes[0]->Node() ) // 1st node is a hexa corner
|
||||||
{
|
{
|
||||||
curIntPnt._paramOnLine = coords[ ijk[ iDir ]] - coords[0];
|
curIntPnt._paramOnLine = coords[ ijk[ iDir ]] - coords[0] + _grid->_tol;
|
||||||
const GridLine& line = _grid->_lines[ iDir ][ lineIndex[ iL ]];
|
const GridLine& line = _grid->_lines[ iDir ][ lineIndex[ iL ]];
|
||||||
multiset< F_IntersectPoint >::const_iterator ip =
|
multiset< F_IntersectPoint >::const_iterator ip =
|
||||||
line._intPoints.upper_bound( curIntPnt );
|
line._intPoints.upper_bound( curIntPnt );
|
||||||
|
Loading…
Reference in New Issue
Block a user