mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-15 18:18:34 +05:00
0020918: EDF 1447 SMESH: Mesh common borders (stepbystep.py)
use tolerance computed basing on min linear size of elements to import
This commit is contained in:
parent
1064303dd1
commit
7133933036
@ -57,6 +57,30 @@
|
|||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
double getMinElemSize2( const SMESHDS_GroupBase* srcGroup )
|
||||||
|
{
|
||||||
|
double minSize2 = 1e100;
|
||||||
|
SMDS_ElemIteratorPtr srcElems = srcGroup->GetElements();
|
||||||
|
while ( srcElems->more() ) // loop on group contents
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* face = srcElems->next();
|
||||||
|
int nbN = face->NbCornerNodes();
|
||||||
|
|
||||||
|
SMESH_TNodeXYZ prevN( face->GetNode( nbN-1 ));
|
||||||
|
for ( int i = 0; i < nbN; ++i )
|
||||||
|
{
|
||||||
|
SMESH_TNodeXYZ n( face->GetNode( i ) );
|
||||||
|
double size2 = ( n - prevN ).SquareModulus();
|
||||||
|
minSize2 = std::min( minSize2, size2 );
|
||||||
|
prevN = n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return minSize2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
/*!
|
/*!
|
||||||
* Creates StdMeshers_Import_1D2D
|
* Creates StdMeshers_Import_1D2D
|
||||||
@ -189,7 +213,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape &
|
|||||||
// to count now many times a link between nodes encounters
|
// to count now many times a link between nodes encounters
|
||||||
map<TLink, int> linkCount;
|
map<TLink, int> linkCount;
|
||||||
map<TLink, int>::iterator link2Nb;
|
map<TLink, int>::iterator link2Nb;
|
||||||
double minLinkLen2 = Precision::Infinite();
|
double minGroupTol = Precision::Infinite();
|
||||||
|
|
||||||
// =========================
|
// =========================
|
||||||
// Import faces from groups
|
// Import faces from groups
|
||||||
@ -207,6 +231,9 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape &
|
|||||||
if ( !srcMesh ) continue;
|
if ( !srcMesh ) continue;
|
||||||
StdMeshers_Import_1D::getMaps( srcMesh, &theMesh, n2n, e2e );
|
StdMeshers_Import_1D::getMaps( srcMesh, &theMesh, n2n, e2e );
|
||||||
|
|
||||||
|
const double groupTol = 0.5 * sqrt( getMinElemSize2( srcGroup ));
|
||||||
|
minGroupTol = std::min( groupTol, minGroupTol );
|
||||||
|
|
||||||
SMDS_ElemIteratorPtr srcElems = srcGroup->GetElements();
|
SMDS_ElemIteratorPtr srcElems = srcGroup->GetElements();
|
||||||
SMDS_MeshNode *tmpNode = helper.AddNode(0,0,0);
|
SMDS_MeshNode *tmpNode = helper.AddNode(0,0,0);
|
||||||
gp_XY uv( Precision::Infinite(), Precision::Infinite() );
|
gp_XY uv( Precision::Infinite(), Precision::Infinite() );
|
||||||
@ -230,7 +257,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape &
|
|||||||
{
|
{
|
||||||
// find an existing vertex node
|
// find an existing vertex node
|
||||||
for ( vNIt = vertexNodes.begin(); vNIt != vertexNodes.end(); ++vNIt)
|
for ( vNIt = vertexNodes.begin(); vNIt != vertexNodes.end(); ++vNIt)
|
||||||
if ( vNIt->SquareDistance( *node ) < 10 * faceTol * faceTol)
|
if ( vNIt->SquareDistance( *node ) < groupTol * groupTol)
|
||||||
{
|
{
|
||||||
(*n2nIt).second = vNIt->_node;
|
(*n2nIt).second = vNIt->_node;
|
||||||
vertexNodes.erase( vNIt );
|
vertexNodes.erase( vNIt );
|
||||||
@ -241,7 +268,8 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape &
|
|||||||
{
|
{
|
||||||
// find out if node lies on theShape
|
// find out if node lies on theShape
|
||||||
tmpNode->setXYZ( (*node)->X(), (*node)->Y(), (*node)->Z());
|
tmpNode->setXYZ( (*node)->X(), (*node)->Y(), (*node)->Z());
|
||||||
if ( helper.CheckNodeUV( geomFace, tmpNode, uv, 10 * faceTol, /*force=*/true ))
|
uv.SetCoord( Precision::Infinite(), Precision::Infinite() );
|
||||||
|
if ( helper.CheckNodeUV( geomFace, tmpNode, uv, groupTol, /*force=*/true ))
|
||||||
{
|
{
|
||||||
SMDS_MeshNode* newNode = tgtMesh->AddNode( (*node)->X(), (*node)->Y(), (*node)->Z());
|
SMDS_MeshNode* newNode = tgtMesh->AddNode( (*node)->X(), (*node)->Y(), (*node)->Z());
|
||||||
n2nIt->second = newNode;
|
n2nIt->second = newNode;
|
||||||
@ -321,13 +349,13 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape &
|
|||||||
medium = newNodes[i+nbNodes];
|
medium = newNodes[i+nbNodes];
|
||||||
link2Nb = linkCount.insert( make_pair( TLink( n1, n2, medium ), 0)).first;
|
link2Nb = linkCount.insert( make_pair( TLink( n1, n2, medium ), 0)).first;
|
||||||
++link2Nb->second;
|
++link2Nb->second;
|
||||||
if ( link2Nb->second == 1 )
|
// if ( link2Nb->second == 1 )
|
||||||
{
|
// {
|
||||||
// measure link length
|
// // measure link length
|
||||||
double len2 = SMESH_TNodeXYZ( n1 ).SquareDistance( n2 );
|
// double len2 = SMESH_TNodeXYZ( n1 ).SquareDistance( n2 );
|
||||||
if ( len2 < minLinkLen2 )
|
// if ( len2 < minGroupTol )
|
||||||
minLinkLen2 = len2;
|
// minGroupTol = len2;
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
helper.GetMeshDS()->RemoveNode(tmpNode);
|
helper.GetMeshDS()->RemoveNode(tmpNode);
|
||||||
@ -345,7 +373,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape &
|
|||||||
|
|
||||||
// use large tolerance for projection of nodes to edges because of
|
// use large tolerance for projection of nodes to edges because of
|
||||||
// BLSURF mesher specifics (issue 0020918, Study2.hdf)
|
// BLSURF mesher specifics (issue 0020918, Study2.hdf)
|
||||||
const double projTol = 1e-3 * sqrt( minLinkLen2 );
|
const double projTol = minGroupTol;
|
||||||
|
|
||||||
bool isFaceMeshed = false;
|
bool isFaceMeshed = false;
|
||||||
SMESHDS_SubMesh* tgtFaceSM = tgtMesh->MeshElements( theShape );
|
SMESHDS_SubMesh* tgtFaceSM = tgtMesh->MeshElements( theShape );
|
||||||
@ -427,7 +455,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape &
|
|||||||
edge = tgtMesh->AddEdge( newNodes[0], newNodes[1], newNodes[2] );
|
edge = tgtMesh->AddEdge( newNodes[0], newNodes[1], newNodes[2] );
|
||||||
|
|
||||||
TopoDS_Edge geomEdge = TopoDS::Edge(bndShapes.back());
|
TopoDS_Edge geomEdge = TopoDS::Edge(bndShapes.back());
|
||||||
helper.CheckNodeU( geomEdge, link._medium, u, 10*faceTol, /*force=*/true );
|
helper.CheckNodeU( geomEdge, link._medium, u, projTol, /*force=*/true );
|
||||||
tgtFaceSM->RemoveNode( link._medium, /*isNodeDeleted=*/false );
|
tgtFaceSM->RemoveNode( link._medium, /*isNodeDeleted=*/false );
|
||||||
tgtMesh->SetNodeOnEdge( (SMDS_MeshNode*)link._medium, geomEdge, u );
|
tgtMesh->SetNodeOnEdge( (SMDS_MeshNode*)link._medium, geomEdge, u );
|
||||||
}
|
}
|
||||||
@ -636,7 +664,6 @@ bool StdMeshers_Import_1D2D::Evaluate(SMESH_Mesh & theMesh,
|
|||||||
helper.SetSubShape(theShape);
|
helper.SetSubShape(theShape);
|
||||||
|
|
||||||
const TopoDS_Face& geomFace = TopoDS::Face( theShape );
|
const TopoDS_Face& geomFace = TopoDS::Face( theShape );
|
||||||
const double faceTol = helper.MaxTolerance( geomFace );
|
|
||||||
|
|
||||||
// take into account nodes on vertices
|
// take into account nodes on vertices
|
||||||
TopExp_Explorer exp( theShape, TopAbs_VERTEX );
|
TopExp_Explorer exp( theShape, TopAbs_VERTEX );
|
||||||
@ -651,9 +678,12 @@ bool StdMeshers_Import_1D2D::Evaluate(SMESH_Mesh & theMesh,
|
|||||||
// count faces and nodes imported from groups
|
// count faces and nodes imported from groups
|
||||||
set<const SMDS_MeshNode* > allNodes;
|
set<const SMDS_MeshNode* > allNodes;
|
||||||
gp_XY uv;
|
gp_XY uv;
|
||||||
|
double minGroupTol = 1e100;
|
||||||
for ( int iG = 0; iG < srcGroups.size(); ++iG )
|
for ( int iG = 0; iG < srcGroups.size(); ++iG )
|
||||||
{
|
{
|
||||||
const SMESHDS_GroupBase* srcGroup = srcGroups[iG]->GetGroupDS();
|
const SMESHDS_GroupBase* srcGroup = srcGroups[iG]->GetGroupDS();
|
||||||
|
const double groupTol = 0.5 * sqrt( getMinElemSize2( srcGroup ));
|
||||||
|
minGroupTol = std::min( groupTol, minGroupTol );
|
||||||
SMDS_ElemIteratorPtr srcElems = srcGroup->GetElements();
|
SMDS_ElemIteratorPtr srcElems = srcGroup->GetElements();
|
||||||
SMDS_MeshNode *tmpNode =helper.AddNode(0,0,0);
|
SMDS_MeshNode *tmpNode =helper.AddNode(0,0,0);
|
||||||
while ( srcElems->more() ) // loop on group contents
|
while ( srcElems->more() ) // loop on group contents
|
||||||
@ -664,7 +694,7 @@ bool StdMeshers_Import_1D2D::Evaluate(SMESH_Mesh & theMesh,
|
|||||||
gp_XYZ gc(0,0,0);
|
gp_XYZ gc(0,0,0);
|
||||||
gc = accumulate( TXyzIterator(face->nodesIterator()), TXyzIterator(), gc)/face->NbNodes();
|
gc = accumulate( TXyzIterator(face->nodesIterator()), TXyzIterator(), gc)/face->NbNodes();
|
||||||
tmpNode->setXYZ( gc.X(), gc.Y(), gc.Z());
|
tmpNode->setXYZ( gc.X(), gc.Y(), gc.Z());
|
||||||
if ( helper.CheckNodeUV( geomFace, tmpNode, uv, 10 * faceTol, /*force=*/true ))
|
if ( helper.CheckNodeUV( geomFace, tmpNode, uv, groupTol, /*force=*/true ))
|
||||||
{
|
{
|
||||||
++aVec[ face->GetEntityType() ];
|
++aVec[ face->GetEntityType() ];
|
||||||
|
|
||||||
@ -710,8 +740,8 @@ bool StdMeshers_Import_1D2D::Evaluate(SMESH_Mesh & theMesh,
|
|||||||
bool eraseLink = ( nbFacesOfLink != 1 );
|
bool eraseLink = ( nbFacesOfLink != 1 );
|
||||||
if ( nbFacesOfLink == 1 )
|
if ( nbFacesOfLink == 1 )
|
||||||
{
|
{
|
||||||
if ( helper.CheckNodeU( geomEdge, link.node1(), u, 10*faceTol, /*force=*/true )&&
|
if ( helper.CheckNodeU( geomEdge, link.node1(), u, minGroupTol, /*force=*/true )&&
|
||||||
helper.CheckNodeU( geomEdge, link.node2(), u, 10*faceTol, /*force=*/true ))
|
helper.CheckNodeU( geomEdge, link.node2(), u, minGroupTol, /*force=*/true ))
|
||||||
{
|
{
|
||||||
bool isQuadratic = ( link2Nb->second < 0 );
|
bool isQuadratic = ( link2Nb->second < 0 );
|
||||||
++edgeVec[ isQuadratic ? SMDSEntity_Quad_Edge : SMDSEntity_Edge ];
|
++edgeVec[ isQuadratic ? SMDSEntity_Quad_Edge : SMDSEntity_Edge ];
|
||||||
|
Loading…
Reference in New Issue
Block a user