mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-15 18:18:34 +05:00
0021490: EDF 2114: RadialQuadrangle fails
Fix correspondence between LinEdge1 and LinEdge2 and P1 and P2
This commit is contained in:
parent
ebc415d946
commit
2b3a86e7ca
@ -427,7 +427,6 @@ void StdMeshers_RadialQuadrangle_1D2D::SubmeshRestored(SMESH_subMesh* faceSubMes
|
|||||||
bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
|
bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
|
||||||
const TopoDS_Shape& aShape)
|
const TopoDS_Shape& aShape)
|
||||||
{
|
{
|
||||||
TopExp_Explorer exp;
|
|
||||||
SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
|
SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
|
||||||
|
|
||||||
myHelper = new SMESH_MesherHelper( aMesh );
|
myHelper = new SMESH_MesherHelper( aMesh );
|
||||||
@ -490,8 +489,7 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
|
|||||||
if ( !computeLayerPositions(P0,P1))
|
if ( !computeLayerPositions(P0,P1))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
exp.Init( CircEdge, TopAbs_VERTEX );
|
TopoDS_Vertex V1 = myHelper->IthVertex(0, CircEdge );
|
||||||
TopoDS_Vertex V1 = TopoDS::Vertex( exp.Current() );
|
|
||||||
gp_Pnt2d p2dV = BRep_Tool::Parameters( V1, TopoDS::Face(aShape) );
|
gp_Pnt2d p2dV = BRep_Tool::Parameters( V1, TopoDS::Face(aShape) );
|
||||||
|
|
||||||
NC = meshDS->AddNode(P0.X(), P0.Y(), P0.Z());
|
NC = meshDS->AddNode(P0.X(), P0.Y(), P0.Z());
|
||||||
@ -698,6 +696,15 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
|
|||||||
gp_Pnt P2( NL->X(), NL->Y(), NL->Z() );
|
gp_Pnt P2( NL->X(), NL->Y(), NL->Z() );
|
||||||
P0 = aCirc->Location();
|
P0 = aCirc->Location();
|
||||||
|
|
||||||
|
// make P1 belong to LinEdge1
|
||||||
|
TopoDS_Vertex V1 = myHelper->IthVertex( 0, LinEdge1 );
|
||||||
|
TopoDS_Vertex V2 = myHelper->IthVertex( 1, LinEdge1 );
|
||||||
|
gp_Pnt PE1 = BRep_Tool::Pnt(V1);
|
||||||
|
gp_Pnt PE2 = BRep_Tool::Pnt(V2);
|
||||||
|
if( ( P1.Distance(PE1) > Precision::Confusion() ) &&
|
||||||
|
( P1.Distance(PE2) > Precision::Confusion() ) )
|
||||||
|
std::swap( LinEdge1, LinEdge2 );
|
||||||
|
|
||||||
bool linEdge1Computed, linEdge2Computed;
|
bool linEdge1Computed, linEdge2Computed;
|
||||||
if ( !computeLayerPositions(P0,P1,LinEdge1,&linEdge1Computed))
|
if ( !computeLayerPositions(P0,P1,LinEdge1,&linEdge1Computed))
|
||||||
return false;
|
return false;
|
||||||
@ -706,23 +713,12 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
|
|||||||
Nodes2.resize( myLayerPositions.size()+1 );
|
Nodes2.resize( myLayerPositions.size()+1 );
|
||||||
|
|
||||||
// check that both linear edges have same hypotheses
|
// check that both linear edges have same hypotheses
|
||||||
if ( !computeLayerPositions(P0,P1,LinEdge2, &linEdge2Computed))
|
if ( !computeLayerPositions(P0,P2,LinEdge2, &linEdge2Computed))
|
||||||
return false;
|
return false;
|
||||||
if ( Nodes1.size() != myLayerPositions.size()+1 )
|
if ( Nodes1.size() != myLayerPositions.size()+1 )
|
||||||
return error("Different hypotheses apply to radial edges");
|
return error("Different hypotheses apply to radial edges");
|
||||||
|
|
||||||
exp.Init( LinEdge1, TopAbs_VERTEX );
|
// find the central vertex
|
||||||
TopoDS_Vertex V1 = TopoDS::Vertex( exp.Current() );
|
|
||||||
exp.Next();
|
|
||||||
TopoDS_Vertex V2 = TopoDS::Vertex( exp.Current() );
|
|
||||||
gp_Pnt PE1 = BRep_Tool::Pnt(V1);
|
|
||||||
gp_Pnt PE2 = BRep_Tool::Pnt(V2);
|
|
||||||
if( ( P1.Distance(PE1) > Precision::Confusion() ) &&
|
|
||||||
( P1.Distance(PE2) > Precision::Confusion() ) )
|
|
||||||
{
|
|
||||||
std::swap( LinEdge1, LinEdge2 );
|
|
||||||
std::swap( linEdge1Computed, linEdge2Computed );
|
|
||||||
}
|
|
||||||
TopoDS_Vertex VC = V2;
|
TopoDS_Vertex VC = V2;
|
||||||
if( ( P1.Distance(PE1) > Precision::Confusion() ) &&
|
if( ( P1.Distance(PE1) > Precision::Confusion() ) &&
|
||||||
( P2.Distance(PE1) > Precision::Confusion() ) )
|
( P2.Distance(PE1) > Precision::Confusion() ) )
|
||||||
|
Loading…
Reference in New Issue
Block a user