From 00d55cb03032905dbf345be1fc4951441867d374 Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 19 May 2010 09:38:12 +0000 Subject: [PATCH] 0020809: [CEA 400] ParaMEDSPLITTER failure on blade.med * Fix SMESH_MesherHelper::GetNodeU() for a node on vertex of a closed geom edge double GetNodeU(const TopoDS_Edge& theEdge, const SMDS_MeshNode* theNode, + const SMDS_MeshNode* inEdgeNode=0, bool* check=0); --- src/SMESH/SMESH_MesherHelper.cxx | 29 +++++++++++++++++++------- src/SMESH/SMESH_MesherHelper.hxx | 1 + src/StdMeshers/StdMeshers_FaceSide.cxx | 4 ++-- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index 13b06a396..ac0de4e39 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -597,20 +597,33 @@ gp_XY SMESH_MesherHelper::GetMiddleUV(const Handle(Geom_Surface)& surface, double SMESH_MesherHelper::GetNodeU(const TopoDS_Edge& E, const SMDS_MeshNode* n, + const SMDS_MeshNode* inEdgeNode, bool* check) { double param = 0; const SMDS_PositionPtr Pos = n->GetPosition(); - if(Pos->GetTypeOfPosition()==SMDS_TOP_EDGE) { + if ( Pos->GetTypeOfPosition()==SMDS_TOP_EDGE ) + { const SMDS_EdgePosition* epos = static_cast(n->GetPosition().get()); param = epos->GetUParameter(); } - else if(Pos->GetTypeOfPosition()==SMDS_TOP_VERTEX) { - SMESHDS_Mesh * meshDS = GetMeshDS(); - int vertexID = n->GetPosition()->GetShapeId(); - const TopoDS_Vertex& V = TopoDS::Vertex(meshDS->IndexToShape(vertexID)); - param = BRep_Tool::Parameter( V, E ); + else if( Pos->GetTypeOfPosition() == SMDS_TOP_VERTEX ) + { + if ( inEdgeNode && TopExp::FirstVertex( E ).IsSame( TopExp::LastVertex( E ))) // issue 0020809 + { + Standard_Real f,l; + BRep_Tool::Range( E, f,l ); + double uInEdge = GetNodeU( E, inEdgeNode ); + param = ( fabs( uInEdge - f ) < fabs( l - uInEdge )) ? f : l; + } + else + { + SMESHDS_Mesh * meshDS = GetMeshDS(); + int vertexID = n->GetPosition()->GetShapeId(); + const TopoDS_Vertex& V = TopoDS::Vertex(meshDS->IndexToShape(vertexID)); + param = BRep_Tool::Parameter( V, E ); + } } if ( check ) *check = CheckNodeU( E, n, param, BRep_Tool::Tolerance( E )); @@ -739,8 +752,8 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1, E = TopoDS::Edge(myShape); edgeID = myShapeID; } - u[0] = GetNodeU(E,n1, force3d ? 0 : &uvOK[0]); - u[1] = GetNodeU(E,n2, force3d ? 0 : &uvOK[1]); + u[0] = GetNodeU(E,n1,n2, force3d ? 0 : &uvOK[0]); + u[1] = GetNodeU(E,n2,n1, force3d ? 0 : &uvOK[1]); } if(!force3d) { diff --git a/src/SMESH/SMESH_MesherHelper.hxx b/src/SMESH/SMESH_MesherHelper.hxx index f26ed4f6f..3fece8a82 100644 --- a/src/SMESH/SMESH_MesherHelper.hxx +++ b/src/SMESH/SMESH_MesherHelper.hxx @@ -269,6 +269,7 @@ public: */ double GetNodeU(const TopoDS_Edge& theEdge, const SMDS_MeshNode* theNode, + const SMDS_MeshNode* inEdgeNode=0, bool* check=0); /*! * \brief Return node UV on face diff --git a/src/StdMeshers/StdMeshers_FaceSide.cxx b/src/StdMeshers/StdMeshers_FaceSide.cxx index c0cef600d..19859a2b3 100644 --- a/src/StdMeshers/StdMeshers_FaceSide.cxx +++ b/src/StdMeshers/StdMeshers_FaceSide.cxx @@ -270,7 +270,7 @@ const vector& StdMeshers_FaceSide::GetUVPtStruct(bool isXConst, const SMDS_MeshNode* node = nItr->next(); if ( myIgnoreMediumNodes && SMESH_MeshEditor::IsMedium( node, SMDSAbs_Edge )) continue; - double u = helper.GetNodeU( myEdge[i], node, ¶mOK ); + double u = helper.GetNodeU( myEdge[i], node, 0, ¶mOK ); double aLenU = GCPnts_AbscissaPoint::Length ( const_cast( myC3dAdaptor[i]), myFirst[i], u ); if ( myEdgeLength[i] < aLenU ) // nonregression test "3D_mesh_NETGEN/G6" @@ -288,7 +288,7 @@ const vector& StdMeshers_FaceSide::GetUVPtStruct(bool isXConst, const SMDS_MeshNode* node = nItr->next(); if ( myIgnoreMediumNodes && SMESH_MeshEditor::IsMedium( node, SMDSAbs_Edge )) continue; - double u = helper.GetNodeU( myEdge[i], node, ¶mOK ); + double u = helper.GetNodeU( myEdge[i], node, 0, ¶mOK ); // paramSize is signed so orientation is taken into account double normPar = prevNormPar + r * ( u - myFirst[i] ) / paramSize; -- 2.39.2