#17828 [CEA 17805] Polyhedron Mesh volume calculation and volume orientation criterion

1) Fix BadOrientedVolume criterion to detect invalid polyhedrons
  2) Fix SMESH_MeshEditor::Reorient() to correct orientation of polyhedron facets
This commit is contained in:
eap 2019-10-15 21:25:46 +03:00
parent e67f8c2cab
commit 2cc662ea28
2 changed files with 41 additions and 11 deletions

View File

@ -2286,7 +2286,19 @@ bool BadOrientedVolume::IsSatisfy( long theId )
return false;
SMDS_VolumeTool vTool( myMesh->FindElement( theId ));
return !vTool.IsForward();
bool isOk = true;
if ( vTool.IsPoly() )
{
isOk = true;
for ( int i = 0; i < vTool.NbFaces() && isOk; ++i )
isOk = vTool.IsFaceExternal( i );
}
else
{
isOk = vTool.IsForward();
}
return !isOk;
}
SMDSAbs_ElementType BadOrientedVolume::GetType() const

View File

@ -1093,19 +1093,37 @@ bool SMESH_MeshEditor::Reorient (const SMDS_MeshElement * theElem)
MESSAGE("Warning: bad volumic element");
return false;
}
const int nbFaces = aPolyedre->NbFaces();
vector<const SMDS_MeshNode *> poly_nodes;
SMDS_VolumeTool vTool( aPolyedre );
const int nbFaces = vTool.NbFaces();
vector<int> quantities( nbFaces );
vector<const SMDS_MeshNode *> poly_nodes;
// reverse each face of the polyedre
for (int iface = 1; iface <= nbFaces; iface++) {
int inode, nbFaceNodes = aPolyedre->NbFaceNodes(iface);
quantities[iface - 1] = nbFaceNodes;
for (inode = nbFaceNodes; inode >= 1; inode--) {
const SMDS_MeshNode* curNode = aPolyedre->GetFaceNode(iface, inode);
poly_nodes.push_back(curNode);
// check if all facets are oriented equally
bool sameOri = true;
vector<int>& facetOri = quantities; // keep orientation in quantities so far
for (int iface = 0; iface < nbFaces; iface++)
{
facetOri[ iface ] = vTool.IsFaceExternal( iface );
if ( facetOri[ iface ] != facetOri[ 0 ])
sameOri = false;
}
// reverse faces of the polyhedron
int neededOri = sameOri ? 1 - facetOri[0] : 1;
poly_nodes.reserve( vTool.NbNodes() );
for ( int iface = 0; iface < nbFaces; iface++ )
{
int nbFaceNodes = vTool.NbFaceNodes( iface );
const SMDS_MeshNode** nodes = vTool.GetFaceNodes( iface );
bool toReverse = ( facetOri[ iface ] != neededOri );
quantities[ iface ] = nbFaceNodes;
if ( toReverse )
for ( int inode = nbFaceNodes - 1; inode >= 0; inode-- )
poly_nodes.push_back( nodes[ inode ]);
else
poly_nodes.insert( poly_nodes.end(), nodes, nodes + nbFaceNodes );
}
return GetMeshDS()->ChangePolyhedronNodes( theElem, poly_nodes, quantities );
}