mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-11 16:19:16 +05:00
[bos #41867][CEA] Handle properly 3D VL when certain edges are not meshed.
This commit is contained in:
parent
e85c9d5b6b
commit
1a19565041
@ -2091,8 +2091,15 @@ SMESH_ComputeErrorPtr _ViscousBuilder::Compute(SMESH_Mesh& theMesh,
|
|||||||
if ( ! shrink(_sdVec[iSD]) ) // shrink 2D mesh on FACEs w/o layer
|
if ( ! shrink(_sdVec[iSD]) ) // shrink 2D mesh on FACEs w/o layer
|
||||||
return _error;
|
return _error;
|
||||||
|
|
||||||
addBoundaryElements(_sdVec[iSD]); // create quadrangles on prism bare sides
|
bool notMissingFaces = addBoundaryElements(_sdVec[iSD]); // create quadrangles on prism bare sides
|
||||||
|
|
||||||
|
if ( !notMissingFaces )
|
||||||
|
{
|
||||||
|
SMESH_MeshEditor editor( &theMesh );
|
||||||
|
TIDSortedElemSet elements;
|
||||||
|
editor.MakeBoundaryMesh( elements, SMESH_MeshEditor::BND_2DFROM3D );
|
||||||
|
}
|
||||||
|
|
||||||
_sdVec[iSD]._done = true;
|
_sdVec[iSD]._done = true;
|
||||||
|
|
||||||
const TopoDS_Shape& solid = _sdVec[iSD]._solid;
|
const TopoDS_Shape& solid = _sdVec[iSD]._solid;
|
||||||
@ -3412,14 +3419,14 @@ bool _ViscousBuilder::findShapesToSmooth( _SolidData& data )
|
|||||||
// Find C1 EDGEs
|
// Find C1 EDGEs
|
||||||
|
|
||||||
vector< pair< _EdgesOnShape*, gp_XYZ > > dirOfEdges;
|
vector< pair< _EdgesOnShape*, gp_XYZ > > dirOfEdges;
|
||||||
|
|
||||||
for ( size_t iS = 0; iS < edgesByGeom.size(); ++iS ) // check VERTEXes
|
for ( size_t iS = 0; iS < edgesByGeom.size(); ++iS ) // check VERTEXes
|
||||||
{
|
{
|
||||||
_EdgesOnShape& eov = edgesByGeom[iS];
|
_EdgesOnShape& eov = edgesByGeom[iS];
|
||||||
if ( eov._edges.empty() ||
|
if ( eov._edges.empty() ||
|
||||||
eov.ShapeType() != TopAbs_VERTEX ||
|
eov.ShapeType() != TopAbs_VERTEX ||
|
||||||
c1VV.Contains( eov._shape ))
|
c1VV.Contains( eov._shape ))
|
||||||
continue;
|
continue;
|
||||||
const TopoDS_Vertex& V = TopoDS::Vertex( eov._shape );
|
const TopoDS_Vertex& V = TopoDS::Vertex( eov._shape );
|
||||||
|
|
||||||
// get directions of surrounding EDGEs
|
// get directions of surrounding EDGEs
|
||||||
@ -3455,7 +3462,7 @@ bool _ViscousBuilder::findShapesToSmooth( _SolidData& data )
|
|||||||
if ( oppV.IsSame( V ))
|
if ( oppV.IsSame( V ))
|
||||||
oppV = SMESH_MesherHelper::IthVertex( 1, e );
|
oppV = SMESH_MesherHelper::IthVertex( 1, e );
|
||||||
_EdgesOnShape* eovOpp = data.GetShapeEdges( oppV );
|
_EdgesOnShape* eovOpp = data.GetShapeEdges( oppV );
|
||||||
if ( dirOfEdges[k].second * eovOpp->_edges[0]->_normal < 0 )
|
if ( !eovOpp->_edges.empty() && dirOfEdges[k].second * eovOpp->_edges[0]->_normal < 0 )
|
||||||
eov._eosC1.push_back( dirOfEdges[k].first );
|
eov._eosC1.push_back( dirOfEdges[k].first );
|
||||||
}
|
}
|
||||||
dirOfEdges[k].first = 0;
|
dirOfEdges[k].first = 0;
|
||||||
@ -12836,6 +12843,7 @@ bool _Mapper2D::ComputeNodePositions()
|
|||||||
|
|
||||||
bool _ViscousBuilder::addBoundaryElements(_SolidData& data)
|
bool _ViscousBuilder::addBoundaryElements(_SolidData& data)
|
||||||
{
|
{
|
||||||
|
bool addAllBoundaryElements = true;
|
||||||
SMESH_MesherHelper helper( *_mesh );
|
SMESH_MesherHelper helper( *_mesh );
|
||||||
|
|
||||||
vector< const SMDS_MeshNode* > faceNodes;
|
vector< const SMDS_MeshNode* > faceNodes;
|
||||||
@ -12857,7 +12865,7 @@ bool _ViscousBuilder::addBoundaryElements(_SolidData& data)
|
|||||||
map< double, const SMDS_MeshNode* > u2nodes;
|
map< double, const SMDS_MeshNode* > u2nodes;
|
||||||
if ( !SMESH_Algo::GetSortedNodesOnEdge( getMeshDS(), E, /*ignoreMedium=*/false, u2nodes))
|
if ( !SMESH_Algo::GetSortedNodesOnEdge( getMeshDS(), E, /*ignoreMedium=*/false, u2nodes))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
vector< _LayerEdge* > ledges; ledges.reserve( u2nodes.size() );
|
vector< _LayerEdge* > ledges; ledges.reserve( u2nodes.size() );
|
||||||
TNode2Edge & n2eMap = data._n2eMap;
|
TNode2Edge & n2eMap = data._n2eMap;
|
||||||
map< double, const SMDS_MeshNode* >::iterator u2n = u2nodes.begin();
|
map< double, const SMDS_MeshNode* >::iterator u2n = u2nodes.begin();
|
||||||
@ -12891,12 +12899,14 @@ bool _ViscousBuilder::addBoundaryElements(_SolidData& data)
|
|||||||
|
|
||||||
if ( getMeshDS()->FindElement( faceNodes, SMDSAbs_Face, /*noMedium=*/true))
|
if ( getMeshDS()->FindElement( faceNodes, SMDSAbs_Face, /*noMedium=*/true))
|
||||||
continue; // faces already created
|
continue; // faces already created
|
||||||
}
|
}
|
||||||
for ( ++u2n; u2n != u2nodes.end(); ++u2n )
|
for ( ++u2n; u2n != u2nodes.end(); ++u2n )
|
||||||
ledges.push_back( n2eMap[ u2n->second ]);
|
if ( n2eMap[ u2n->second ] != nullptr )
|
||||||
|
ledges.push_back( n2eMap[ u2n->second ]);
|
||||||
|
else /*some boundary elements might be lost because the connectivity of the face is not entirely defined on this edge*/
|
||||||
|
addAllBoundaryElements = false;
|
||||||
|
|
||||||
// Find out orientation and type of face to create
|
// Find out orientation and type of face to create
|
||||||
|
|
||||||
bool reverse = false, isOnFace;
|
bool reverse = false, isOnFace;
|
||||||
TopoDS_Shape F;
|
TopoDS_Shape F;
|
||||||
|
|
||||||
@ -13016,5 +13026,5 @@ bool _ViscousBuilder::addBoundaryElements(_SolidData& data)
|
|||||||
} // loop on EDGE's
|
} // loop on EDGE's
|
||||||
} // loop on _SolidData's
|
} // loop on _SolidData's
|
||||||
|
|
||||||
return true;
|
return addAllBoundaryElements;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user