mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-18 08:50:33 +05:00
0020978: EDF 1475 SMESH: Convert linear to quadratic on a submesh
+ void AddTLinks(const SMDS_MeshEdge* edge); + void AddTLinks(const SMDS_MeshFace* face); + void AddTLinks(const SMDS_MeshVolume* vol);
This commit is contained in:
parent
59fe802c13
commit
77e2a3970b
@ -316,6 +316,73 @@ void SMESH_MesherHelper::AddTLinkNode(const SMDS_MeshNode* n1,
|
||||
myTLinkNodeMap.insert( make_pair(link,n12));
|
||||
}
|
||||
|
||||
//================================================================================
|
||||
/*!
|
||||
* \brief Add quadratic links of edge to own data structure
|
||||
*/
|
||||
//================================================================================
|
||||
|
||||
void SMESH_MesherHelper::AddTLinks(const SMDS_MeshEdge* edge)
|
||||
{
|
||||
if ( edge->IsQuadratic() )
|
||||
AddTLinkNode(edge->GetNode(0), edge->GetNode(1), edge->GetNode(2));
|
||||
}
|
||||
|
||||
//================================================================================
|
||||
/*!
|
||||
* \brief Add quadratic links of face to own data structure
|
||||
*/
|
||||
//================================================================================
|
||||
|
||||
void SMESH_MesherHelper::AddTLinks(const SMDS_MeshFace* face)
|
||||
{
|
||||
if ( face->IsQuadratic() )
|
||||
{
|
||||
const int nbLinks = face->NbCornerNodes();
|
||||
for ( int i = 0; i < nbLinks; ++i )
|
||||
{
|
||||
const SMDS_MeshNode* n1 = face->GetNode( i );
|
||||
const SMDS_MeshNode* n2 = face->GetNode(( i + 1 ) % nbLinks );
|
||||
const SMDS_MeshNode* n12 = face->GetNode( i + nbLinks );
|
||||
AddTLinkNode( n1, n2, n12 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//================================================================================
|
||||
/*!
|
||||
* \brief Add quadratic links of volume to own data structure
|
||||
*/
|
||||
//================================================================================
|
||||
|
||||
void SMESH_MesherHelper::AddTLinks(const SMDS_MeshVolume* volume)
|
||||
{
|
||||
if ( volume->IsQuadratic() )
|
||||
{
|
||||
SMDS_VolumeTool vTool( volume );
|
||||
const SMDS_MeshNode** nodes = vTool.GetNodes();
|
||||
set<int> addedLinks;
|
||||
for ( int iF = 1; iF < vTool.NbFaces(); ++iF )
|
||||
{
|
||||
const int nbN = vTool.NbFaceNodes( iF );
|
||||
const int* iNodes = vTool.GetFaceNodesIndices( iF );
|
||||
for ( int i = 0; i < nbN; )
|
||||
{
|
||||
int iN1 = iNodes[i++];
|
||||
int iN12 = iNodes[i++];
|
||||
int iN2 = iNodes[i++];
|
||||
if ( iN1 > iN2 ) std::swap( iN1, iN2 );
|
||||
int linkID = iN1 * vTool.NbNodes() + iN2;
|
||||
pair< set<int>::iterator, bool > it_isNew = addedLinks.insert( linkID );
|
||||
if ( it_isNew.second )
|
||||
AddTLinkNode( nodes[iN1], nodes[iN2], nodes[iN12] );
|
||||
else
|
||||
addedLinks.erase( it_isNew.first ); // each link encounters only twice
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//================================================================================
|
||||
/*!
|
||||
* \brief Return true if position of nodes on the shape hasn't yet been checked or
|
||||
|
@ -455,6 +455,10 @@ public:
|
||||
void AddTLinkNodeMap(const TLinkNodeMap& aMap)
|
||||
{ myTLinkNodeMap.insert(aMap.begin(), aMap.end()); }
|
||||
|
||||
void AddTLinks(const SMDS_MeshEdge* edge);
|
||||
void AddTLinks(const SMDS_MeshFace* face);
|
||||
void AddTLinks(const SMDS_MeshVolume* vol);
|
||||
|
||||
/**
|
||||
* Returns myTLinkNodeMap
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user