mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-15 10:08:34 +05:00
fix the case of already meshed sole straight edge
This commit is contained in:
parent
986c507e02
commit
0ead748d34
@ -50,6 +50,7 @@
|
|||||||
#include <Geom_TrimmedCurve.hxx>
|
#include <Geom_TrimmedCurve.hxx>
|
||||||
#include <TColgp_SequenceOfPnt.hxx>
|
#include <TColgp_SequenceOfPnt.hxx>
|
||||||
#include <TColgp_SequenceOfPnt2d.hxx>
|
#include <TColgp_SequenceOfPnt2d.hxx>
|
||||||
|
#include <TopExp.hxx>
|
||||||
#include <TopExp_Explorer.hxx>
|
#include <TopExp_Explorer.hxx>
|
||||||
#include <TopTools_ListIteratorOfListOfShape.hxx>
|
#include <TopTools_ListIteratorOfListOfShape.hxx>
|
||||||
#include <TopoDS.hxx>
|
#include <TopoDS.hxx>
|
||||||
@ -570,6 +571,8 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
|
|||||||
if (!GetSortedNodesOnEdge(aMesh.GetMeshDS(),LinEdge1,true,theNodes))
|
if (!GetSortedNodesOnEdge(aMesh.GetMeshDS(),LinEdge1,true,theNodes))
|
||||||
return error("Invalid mesh on a straight edge");
|
return error("Invalid mesh on a straight edge");
|
||||||
|
|
||||||
|
Nodes1.resize( myLayerPositions.size()+1 );
|
||||||
|
Nodes2.resize( myLayerPositions.size()+1 );
|
||||||
vector< const SMDS_MeshNode* > *pNodes1 = &Nodes1, *pNodes2 = &Nodes2;
|
vector< const SMDS_MeshNode* > *pNodes1 = &Nodes1, *pNodes2 = &Nodes2;
|
||||||
bool nodesFromP0ToP1 = ( theNodes.rbegin()->second == NF );
|
bool nodesFromP0ToP1 = ( theNodes.rbegin()->second == NF );
|
||||||
if ( !nodesFromP0ToP1 ) std::swap( pNodes1, pNodes2 );
|
if ( !nodesFromP0ToP1 ) std::swap( pNodes1, pNodes2 );
|
||||||
@ -580,8 +583,8 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
|
|||||||
{
|
{
|
||||||
(*pNodes1)[i] = ritn->second;
|
(*pNodes1)[i] = ritn->second;
|
||||||
(*pNodes2)[i] = itn->second;
|
(*pNodes2)[i] = itn->second;
|
||||||
Points.Append( gpXYZ( Nodes1[i]));
|
Points.Prepend( gpXYZ( Nodes1[i]));
|
||||||
Pnts2d1.Append( myHelper->GetNodeUV( F, Nodes1[i]));
|
Pnts2d1.Prepend( myHelper->GetNodeUV( F, Nodes1[i]));
|
||||||
}
|
}
|
||||||
NC = const_cast<SMDS_MeshNode*>( itn->second );
|
NC = const_cast<SMDS_MeshNode*>( itn->second );
|
||||||
Points.Remove( Nodes1.size() );
|
Points.Remove( Nodes1.size() );
|
||||||
@ -1030,9 +1033,25 @@ bool StdMeshers_RadialQuadrangle_1D2D::computeLayerPositions(const gp_Pnt&
|
|||||||
vector< double > nodeParams;
|
vector< double > nodeParams;
|
||||||
GetNodeParamOnEdge( mesh->GetMeshDS(), linEdge, nodeParams );
|
GetNodeParamOnEdge( mesh->GetMeshDS(), linEdge, nodeParams );
|
||||||
|
|
||||||
|
// nb of present nodes must be different in cases of 1 and 2 straight edges
|
||||||
|
|
||||||
|
TopoDS_Vertex VV[2];
|
||||||
|
TopExp::Vertices( linEdge, VV[0], VV[1]);
|
||||||
|
const gp_Pnt* points[] = { &p1, &p2 };
|
||||||
|
gp_Pnt vPoints[] = { BRep_Tool::Pnt(VV[0]), BRep_Tool::Pnt(VV[1]) };
|
||||||
|
const double tol[] = { BRep_Tool::Tolerance(VV[0]), BRep_Tool::Tolerance(VV[1]) };
|
||||||
|
bool pointsAreOnVertices = true;
|
||||||
|
for ( int iP = 0; iP < 2 && pointsAreOnVertices; ++iP )
|
||||||
|
pointsAreOnVertices = ( points[iP]->Distance( vPoints[0] ) < tol[0] ||
|
||||||
|
points[iP]->Distance( vPoints[1] ) < tol[1] );
|
||||||
|
|
||||||
|
int nbNodes = nodeParams.size() - 2; // 2 straight edges
|
||||||
|
if ( !pointsAreOnVertices )
|
||||||
|
nbNodes = ( nodeParams.size() - 3 ) / 2; // 1 straight edge
|
||||||
|
|
||||||
if ( myLayerPositions.empty() )
|
if ( myLayerPositions.empty() )
|
||||||
{
|
{
|
||||||
myLayerPositions.resize( nodeParams.size() - 2 );
|
myLayerPositions.resize( nbNodes );
|
||||||
}
|
}
|
||||||
else if ( myDistributionHypo || myNbLayerHypo )
|
else if ( myDistributionHypo || myNbLayerHypo )
|
||||||
{
|
{
|
||||||
@ -1048,8 +1067,10 @@ bool StdMeshers_RadialQuadrangle_1D2D::computeLayerPositions(const gp_Pnt&
|
|||||||
mesh->GetSubMesh( linEdge )->ComputeStateEngine( SMESH_subMesh::CLEAN );
|
mesh->GetSubMesh( linEdge )->ComputeStateEngine( SMESH_subMesh::CLEAN );
|
||||||
if ( linEdgeComputed ) *linEdgeComputed = false;
|
if ( linEdgeComputed ) *linEdgeComputed = false;
|
||||||
}
|
}
|
||||||
else if ( myLayerPositions.size() != nodeParams.size()-2 ) {
|
else {
|
||||||
return error("Radial edge is meshed by other algorithm");
|
|
||||||
|
if ( myLayerPositions.size() != nbNodes )
|
||||||
|
return error("Radial edge is meshed by other algorithm");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user