mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-15 13:20:32 +05:00
PAL12886 (mesh 3D does not success but the 2D with Quadranle Preference seems correct)
fix for the bug case
This commit is contained in:
parent
b9d0d6c67b
commit
fccd8b61f0
@ -700,7 +700,7 @@ bool StdMeshers_PrismAsBlock::Init(SMESH_MesherHelper* helper,
|
|||||||
mySide = new TSideFace( sideFaces, params );
|
mySide = new TSideFace( sideFaces, params );
|
||||||
|
|
||||||
myHelper = helper;
|
myHelper = helper;
|
||||||
SMESHDS_Mesh* meshDS = myHelper->GetMesh()->GetMeshDS();
|
SMESHDS_Mesh* meshDS = myHelper->GetMeshDS();
|
||||||
|
|
||||||
SMESH_Block::init();
|
SMESH_Block::init();
|
||||||
myShapeIDMap.Clear();
|
myShapeIDMap.Clear();
|
||||||
@ -722,7 +722,8 @@ bool StdMeshers_PrismAsBlock::Init(SMESH_MesherHelper* helper,
|
|||||||
//
|
//
|
||||||
SMESH_subMesh* mainSubMesh = myHelper->GetMesh()->GetSubMeshContaining( shape3D );
|
SMESH_subMesh* mainSubMesh = myHelper->GetMesh()->GetSubMeshContaining( shape3D );
|
||||||
if ( !mainSubMesh ) RETURN_BAD_RESULT("Null submesh of shape3D");
|
if ( !mainSubMesh ) RETURN_BAD_RESULT("Null submesh of shape3D");
|
||||||
//
|
|
||||||
|
// analyse face submeshes
|
||||||
const map< int, SMESH_subMesh * >& subSM = mainSubMesh->DependsOn();
|
const map< int, SMESH_subMesh * >& subSM = mainSubMesh->DependsOn();
|
||||||
map< int, SMESH_subMesh * >::const_iterator i_subSM = subSM.begin();
|
map< int, SMESH_subMesh * >::const_iterator i_subSM = subSM.begin();
|
||||||
for ( ; i_subSM != subSM.end(); ++i_subSM )
|
for ( ; i_subSM != subSM.end(); ++i_subSM )
|
||||||
@ -734,14 +735,18 @@ bool StdMeshers_PrismAsBlock::Init(SMESH_MesherHelper* helper,
|
|||||||
nbFaces++;
|
nbFaces++;
|
||||||
|
|
||||||
// is quadrangle face?
|
// is quadrangle face?
|
||||||
if ( TAssocTool::Count( face, TopAbs_EDGE, 0 ) != 4 ||
|
list< TopoDS_Edge > orderedEdges;
|
||||||
TAssocTool::Count( face, TopAbs_WIRE, 0 ) != 1 )
|
list< int > nbEdgesInWires;
|
||||||
|
TopoDS_Vertex V000;
|
||||||
|
int nbWires = GetOrderedEdges( TopoDS::Face( face ),
|
||||||
|
V000, orderedEdges, nbEdgesInWires );
|
||||||
|
if ( nbWires != 1 || nbEdgesInWires.front() != 4 )
|
||||||
notQuadGeomSubMesh.push_back( sm );
|
notQuadGeomSubMesh.push_back( sm );
|
||||||
|
|
||||||
// count not quadrangle mesh elements
|
// look for not quadrangle mesh elements
|
||||||
if ( SMESHDS_SubMesh* smDS = sm->GetSubMeshDS() ) {
|
if ( SMESHDS_SubMesh* smDS = sm->GetSubMeshDS() ) {
|
||||||
SMDS_ElemIteratorPtr eIt = smDS->GetElements();
|
|
||||||
bool hasNotQuad = false;
|
bool hasNotQuad = false;
|
||||||
|
SMDS_ElemIteratorPtr eIt = smDS->GetElements();
|
||||||
while ( eIt->more() && !hasNotQuad ) {
|
while ( eIt->more() && !hasNotQuad ) {
|
||||||
const SMDS_MeshElement* elem = eIt->next();
|
const SMDS_MeshElement* elem = eIt->next();
|
||||||
if ( elem->GetType() == SMDSAbs_Face ) {
|
if ( elem->GetType() == SMDSAbs_Face ) {
|
||||||
@ -757,6 +762,27 @@ bool StdMeshers_PrismAsBlock::Init(SMESH_MesherHelper* helper,
|
|||||||
else {
|
else {
|
||||||
RETURN_BAD_RESULT("not meshed face");
|
RETURN_BAD_RESULT("not meshed face");
|
||||||
}
|
}
|
||||||
|
// check if a quadrangle face is meshed with a quadranglar grid
|
||||||
|
if ( notQuadGeomSubMesh.back() != sm &&
|
||||||
|
notQuadElemSubMesh.back() != sm )
|
||||||
|
{
|
||||||
|
// count nb edges on face sides
|
||||||
|
vector< int > nbEdges;
|
||||||
|
nbEdges.reserve( nbEdgesInWires.front() );
|
||||||
|
for ( list< TopoDS_Edge >::iterator edge = orderedEdges.begin();
|
||||||
|
edge != orderedEdges.end(); ++edge )
|
||||||
|
{
|
||||||
|
if ( SMESHDS_SubMesh* smDS = meshDS->MeshElements( *edge ))
|
||||||
|
nbEdges.push_back ( smDS->NbElements() );
|
||||||
|
else
|
||||||
|
nbEdges.push_back ( 0 );
|
||||||
|
}
|
||||||
|
int nbQuads = sm->GetSubMeshDS()->NbElements();
|
||||||
|
if ( nbEdges[0] * nbEdges[1] != nbQuads ||
|
||||||
|
nbEdges[0] != nbEdges[2] ||
|
||||||
|
nbEdges[1] != nbEdges[3] )
|
||||||
|
notQuadElemSubMesh.push_back( sm );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
@ -821,9 +847,17 @@ bool StdMeshers_PrismAsBlock::Init(SMESH_MesherHelper* helper,
|
|||||||
const TopoDS_Shape & ancestor = ancestIt.Value();
|
const TopoDS_Shape & ancestor = ancestIt.Value();
|
||||||
if ( ancestor.ShapeType() == TopAbs_EDGE && !edgeMap.FindIndex( ancestor ))
|
if ( ancestor.ShapeType() == TopAbs_EDGE && !edgeMap.FindIndex( ancestor ))
|
||||||
{
|
{
|
||||||
Vtop = TopExp::LastVertex( TopoDS::Edge( ancestor ));
|
TopoDS_Vertex V1, V2;
|
||||||
if ( Vbot.IsSame ( Vtop ))
|
TopExp::Vertices( TopoDS::Edge( ancestor ), V1, V2);
|
||||||
Vtop = TopExp::FirstVertex( TopoDS::Edge( ancestor ));
|
if ( Vbot.IsSame ( V1 )) Vtop = V2;
|
||||||
|
else if ( Vbot.IsSame ( V2 )) Vtop = V1;
|
||||||
|
// check that Vtop belongs to shape3D
|
||||||
|
TopExp_Explorer exp( shape3D, TopAbs_VERTEX );
|
||||||
|
for ( ; exp.More(); exp.Next() )
|
||||||
|
if ( Vtop.IsSame( exp.Current() ))
|
||||||
|
break;
|
||||||
|
if ( !exp.More() )
|
||||||
|
Vtop.Nullify();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1599,7 +1633,7 @@ TopoDS_Edge StdMeshers_PrismAsBlock::TSideFace::GetEdge(const int iEdge) const
|
|||||||
}
|
}
|
||||||
default:;
|
default:;
|
||||||
}
|
}
|
||||||
if ( !edge.IsNull() || edge.ShapeType() == TopAbs_EDGE )
|
if ( !edge.IsNull() && edge.ShapeType() == TopAbs_EDGE )
|
||||||
return TopoDS::Edge( edge );
|
return TopoDS::Edge( edge );
|
||||||
|
|
||||||
// find edge by 2 vertices
|
// find edge by 2 vertices
|
||||||
|
Loading…
Reference in New Issue
Block a user