mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-18 15:10:33 +05:00
0021358: [CEA 500] SMESH HEXAHEDRA from 2D quad skin detect a error
Fix detection of corner nodes for blocks of size 1x1x1
This commit is contained in:
parent
9b32250146
commit
9243678000
@ -33,19 +33,24 @@
|
|||||||
//#include "utilities.h"
|
//#include "utilities.h"
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
// Define error message
|
// Define error message and _MYDEBUG_ if needed
|
||||||
#ifdef _DEBUG_
|
#ifdef _DEBUG_
|
||||||
#define BAD_MESH_ERR \
|
#define BAD_MESH_ERR \
|
||||||
error(SMESH_Comment("Can't detect block-wise structure of the input 2D mesh.\n" \
|
error(SMESH_Comment("Can't detect block-wise structure of the input 2D mesh.\n" \
|
||||||
__FILE__ ":" )<<__LINE__)
|
__FILE__ ":" )<<__LINE__)
|
||||||
|
//#define _MYDEBUG_
|
||||||
#else
|
#else
|
||||||
#define BAD_MESH_ERR \
|
#define BAD_MESH_ERR \
|
||||||
error(SMESH_Comment("Can't detect block-wise structure of the input 2D mesh"))
|
error(SMESH_Comment("Can't detect block-wise structure of the input 2D mesh"))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Debug output
|
|
||||||
#define _DUMP_(msg) //cout << msg << endl
|
|
||||||
|
|
||||||
|
// Debug output
|
||||||
|
#ifdef _MYDEBUG_
|
||||||
|
#define _DUMP_(msg) cout << msg << endl
|
||||||
|
#else
|
||||||
|
#define _DUMP_(msg)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@ -54,10 +59,12 @@ namespace
|
|||||||
{
|
{
|
||||||
B_BOTTOM=0, B_RIGHT, B_TOP, B_LEFT, B_FRONT, B_BACK, NB_BLOCK_SIDES
|
B_BOTTOM=0, B_RIGHT, B_TOP, B_LEFT, B_FRONT, B_BACK, NB_BLOCK_SIDES
|
||||||
};
|
};
|
||||||
// const char* SBoxSides[] = //!< names of block sides -- needed for DEBUG only
|
#ifdef _MYDEBUG_
|
||||||
// {
|
const char* SBoxSides[] = //!< names of block sides -- needed for DEBUG only
|
||||||
// "BOTTOM", "RIGHT", "TOP", "LEFT", "FRONT", "BACK", "UNDEFINED"
|
{
|
||||||
// };
|
"BOTTOM", "RIGHT", "TOP", "LEFT", "FRONT", "BACK", "UNDEFINED"
|
||||||
|
};
|
||||||
|
#endif
|
||||||
enum EQuadEdge //!< edges of quadrangle side
|
enum EQuadEdge //!< edges of quadrangle side
|
||||||
{
|
{
|
||||||
Q_BOTTOM = 0, Q_RIGHT, Q_TOP, Q_LEFT, NB_QUAD_SIDES
|
Q_BOTTOM = 0, Q_RIGHT, Q_TOP, Q_LEFT, NB_QUAD_SIDES
|
||||||
@ -85,37 +92,6 @@ namespace
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//================================================================================
|
|
||||||
/*!
|
|
||||||
* \brief Description of node used to detect corner nodes
|
|
||||||
*/
|
|
||||||
struct _NodeDescriptor
|
|
||||||
{
|
|
||||||
int nbInverseFaces, nbNodesInInverseFaces;
|
|
||||||
|
|
||||||
_NodeDescriptor(const SMDS_MeshNode* n): nbInverseFaces(0), nbNodesInInverseFaces(0)
|
|
||||||
{
|
|
||||||
if ( n )
|
|
||||||
{
|
|
||||||
set<const SMDS_MeshNode*> nodes;
|
|
||||||
SMDS_ElemIteratorPtr fIt = n->GetInverseElementIterator(SMDSAbs_Face );
|
|
||||||
while ( fIt->more() )
|
|
||||||
{
|
|
||||||
const SMDS_MeshElement* face = fIt->next();
|
|
||||||
nodes.insert( face->begin_nodes(), face->end_nodes() );
|
|
||||||
nbInverseFaces++;
|
|
||||||
}
|
|
||||||
nbNodesInInverseFaces = nodes.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool operator==(const _NodeDescriptor& other) const
|
|
||||||
{
|
|
||||||
return
|
|
||||||
nbInverseFaces == other.nbInverseFaces &&
|
|
||||||
nbNodesInInverseFaces == other.nbNodesInInverseFaces;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//================================================================================
|
//================================================================================
|
||||||
/*!
|
/*!
|
||||||
* \brief return true if a node is at block corner
|
* \brief return true if a node is at block corner
|
||||||
@ -126,7 +102,19 @@ namespace
|
|||||||
|
|
||||||
bool isCornerNode( const SMDS_MeshNode* n )
|
bool isCornerNode( const SMDS_MeshNode* n )
|
||||||
{
|
{
|
||||||
return n && n->NbInverseElements( SMDSAbs_Face ) % 2;
|
int nbF = n ? n->NbInverseElements( SMDSAbs_Face ) : 1;
|
||||||
|
if ( nbF % 2 )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
set<const SMDS_MeshNode*> nodesInInverseFaces;
|
||||||
|
SMDS_ElemIteratorPtr fIt = n->GetInverseElementIterator(SMDSAbs_Face );
|
||||||
|
while ( fIt->more() )
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* face = fIt->next();
|
||||||
|
nodesInInverseFaces.insert( face->begin_nodes(), face->end_nodes() );
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodesInInverseFaces.size() != ( 6 + (nbF/2-1)*3 );
|
||||||
}
|
}
|
||||||
|
|
||||||
//================================================================================
|
//================================================================================
|
||||||
@ -849,14 +837,12 @@ namespace
|
|||||||
row2.push_back( n1 = oppositeNode( quad, i1 ));
|
row2.push_back( n1 = oppositeNode( quad, i1 ));
|
||||||
}
|
}
|
||||||
|
|
||||||
_NodeDescriptor nDesc( row1[1] );
|
if ( isCornerNode( row1[1] ))
|
||||||
if ( nDesc == _NodeDescriptor( row1[0] ))
|
return true;
|
||||||
return true; // row of 2 nodes
|
|
||||||
|
|
||||||
// Find the rest nodes
|
// Find the rest nodes
|
||||||
TIDSortedElemSet emptySet, avoidSet;
|
TIDSortedElemSet emptySet, avoidSet;
|
||||||
//while ( !isCornerNode( n2 ))
|
while ( !isCornerNode( n2 ) )
|
||||||
while ( nDesc == _NodeDescriptor( n2 ))
|
|
||||||
{
|
{
|
||||||
avoidSet.clear(); avoidSet.insert( quad );
|
avoidSet.clear(); avoidSet.insert( quad );
|
||||||
quad = SMESH_MeshEditor::FindFaceInSet( n1, n2, emptySet, avoidSet, &i1, &i2 );
|
quad = SMESH_MeshEditor::FindFaceInSet( n1, n2, emptySet, avoidSet, &i1, &i2 );
|
||||||
|
Loading…
Reference in New Issue
Block a user