mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-12 00:29:17 +05:00
23278: [EDF] Mesh computation fails for cylinder or sphere with projection algorythme
This commit is contained in:
parent
54644afede
commit
d0d20593a7
@ -1147,6 +1147,51 @@ namespace {
|
||||
return true;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
/*
|
||||
* Set initial association of VERTEXes for the case of projection
|
||||
* from a quadrangle FACE to a closed FACE, where opposite src EDGEs
|
||||
* have different nb of segments
|
||||
*/
|
||||
//=======================================================================
|
||||
|
||||
void initAssoc4Quad2Closed(const TopoDS_Shape& tgtFace,
|
||||
SMESH_MesherHelper& tgtHelper,
|
||||
const TopoDS_Shape& srcFace,
|
||||
SMESH_Mesh* srcMesh,
|
||||
TAssocTool::TShapeShapeMap & assocMap)
|
||||
{
|
||||
if ( !tgtHelper.HasRealSeam() )
|
||||
return; // no seam edge
|
||||
list< TopoDS_Edge > tgtEdges, srcEdges;
|
||||
list< int > tgtNbEW, srcNbEW;
|
||||
int tgtNbW = SMESH_Block::GetOrderedEdges( TopoDS::Face( tgtFace ), tgtEdges, tgtNbEW );
|
||||
int srcNbW = SMESH_Block::GetOrderedEdges( TopoDS::Face( srcFace ), srcEdges, srcNbEW );
|
||||
if ( tgtNbW != 1 || srcNbW != 1 ||
|
||||
tgtNbEW.front() != 4 || srcNbEW.front() != 4 )
|
||||
return; // not quads
|
||||
|
||||
int srcNbSeg[4];
|
||||
list< TopoDS_Edge >::iterator edgeS = srcEdges.begin(), edgeT = tgtEdges.begin();
|
||||
for ( int i = 0; edgeS != srcEdges.end(); ++i, ++edgeS )
|
||||
if ( SMESHDS_SubMesh* sm = srcMesh->GetMeshDS()->MeshElements( *edgeS ))
|
||||
srcNbSeg[ i ] = sm->NbNodes();
|
||||
else
|
||||
return; // not meshed
|
||||
if ( srcNbSeg[0] == srcNbSeg[2] && srcNbSeg[1] == srcNbSeg[3] )
|
||||
return; // same nb segments
|
||||
if ( srcNbSeg[0] != srcNbSeg[2] && srcNbSeg[1] != srcNbSeg[3] )
|
||||
return; // all different nb segments
|
||||
|
||||
edgeS = srcEdges.begin();
|
||||
if ( srcNbSeg[0] != srcNbSeg[2] )
|
||||
++edgeS;
|
||||
TAssocTool::InsertAssociation( tgtHelper.IthVertex( 0,*edgeT ),
|
||||
tgtHelper.IthVertex( 0,*edgeS ), assocMap );
|
||||
TAssocTool::InsertAssociation( tgtHelper.IthVertex( 1,*edgeT ),
|
||||
tgtHelper.IthVertex( 1,*edgeS ), assocMap );
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
@ -1177,8 +1222,12 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
|
||||
TopoDS_Face tgtFace = TopoDS::Face( theShape.Oriented(TopAbs_FORWARD));
|
||||
TopoDS_Shape srcShape = _sourceHypo->GetSourceFace().Oriented(TopAbs_FORWARD);
|
||||
|
||||
helper.SetSubShape( tgtFace );
|
||||
|
||||
TAssocTool::TShapeShapeMap shape2ShapeMap;
|
||||
TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap );
|
||||
if ( shape2ShapeMap.IsEmpty() )
|
||||
initAssoc4Quad2Closed( tgtFace, helper, srcShape, srcMesh, shape2ShapeMap );
|
||||
if ( !TAssocTool::FindSubShapeAssociation( tgtFace, tgtMesh, srcShape, srcMesh,
|
||||
shape2ShapeMap) ||
|
||||
!shape2ShapeMap.IsBound( tgtFace ))
|
||||
@ -1265,8 +1314,6 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
|
||||
// shape2ShapeMap, _src2tgtNodes, is1DComputed);
|
||||
}
|
||||
|
||||
helper.SetSubShape( tgtFace );
|
||||
|
||||
// it will remove mesh built on edges and vertices in failure case
|
||||
MeshCleaner cleaner( tgtSubMesh );
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user