X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MesherHelper.cxx;h=b0fd1351a89e21a14adeadee55e6f3d1ff56ee4f;hb=41ceaec82fa0bfe72df210b22ffeb6ee1f72fa34;hp=eba6db261caa420e17a105739efdee79334505a4;hpb=9484b374c3dbefa3579603f4044854a20c02203e;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index eba6db261..b0fd1351a 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -114,7 +114,7 @@ bool SMESH_MesherHelper::IsQuadraticSubMesh(const TopoDS_Shape& aSh) { SMESHDS_Mesh* meshDS = GetMeshDS(); // we can create quadratic elements only if all elements - // created on subshapes of given shape are quadratic + // created on sub-shapes of given shape are quadratic // also we have to fill myTLinkNodeMap myCreateQuadratic = true; mySeamShapeIds.clear(); @@ -279,7 +279,7 @@ void SMESH_MesherHelper::SetSubShape(const TopoDS_Shape& aSh) //function : GetNodeUVneedInFaceNode //purpose : Check if inFaceNode argument is necessary for call GetNodeUV(F,..) // Return true if the face is periodic. -// If F is Null, answer about subshape set through IsQuadraticSubMesh() or +// If F is Null, answer about sub-shape set through IsQuadraticSubMesh() or // * SetSubShape() //======================================================================= @@ -895,7 +895,8 @@ bool SMESH_MesherHelper::CheckNodeU(const TopoDS_Edge& E, //======================================================================= //function : GetMediumPos -//purpose : Return index and type of the shape to set a medium node on +//purpose : Return index and type of the shape (EDGE or FACE only) to +// set a medium node on //======================================================================= std::pair SMESH_MesherHelper::GetMediumPos(const SMDS_MeshNode* n1, @@ -910,51 +911,49 @@ std::pair SMESH_MesherHelper::GetMediumPos(const SMDS_Mes shapeType = myShape.ShapeType(); shapeID = myShapeID; } + else if ( n1->getshapeId() == n2->getshapeId() ) + { + shapeID = n2->getshapeId(); + shape = GetSubShapeByNode( n1, GetMeshDS() ); + } else { - const SMDS_PositionPtr Pos1 = n1->GetPosition(); - const SMDS_PositionPtr Pos2 = n2->GetPosition(); + const SMDS_TypeOfPosition Pos1 = n1->GetPosition()->GetTypeOfPosition(); + const SMDS_TypeOfPosition Pos2 = n2->GetPosition()->GetTypeOfPosition(); - if( Pos1->GetTypeOfPosition()==SMDS_TOP_FACE ) - { - shapeType = TopAbs_FACE; - shapeID = n1->getshapeId(); - } - else if( Pos2->GetTypeOfPosition()==SMDS_TOP_FACE ) + if ( Pos1 == SMDS_TOP_3DSPACE || Pos2 == SMDS_TOP_3DSPACE ) { - shapeType = TopAbs_FACE; - shapeID = n2->getshapeId(); } - else if (Pos1->GetTypeOfPosition()==SMDS_TOP_3DSPACE || - Pos2->GetTypeOfPosition()==SMDS_TOP_3DSPACE ) + else if ( Pos1 == SMDS_TOP_FACE || Pos2 == SMDS_TOP_FACE ) { - } - else if ( Pos1->GetTypeOfPosition()==SMDS_TOP_EDGE && - Pos2->GetTypeOfPosition()==SMDS_TOP_EDGE ) - { - if ( n1->getshapeId() == n2->getshapeId() ) - { - shapeType = TopAbs_EDGE; - shapeID = n1->getshapeId(); - } - else + if ( Pos1 != SMDS_TOP_FACE || Pos2 != SMDS_TOP_FACE ) { - TopoDS_Shape E1 = GetSubShapeByNode( n1, GetMeshDS() ); - TopoDS_Shape E2 = GetSubShapeByNode( n2, GetMeshDS() ); - shape = GetCommonAncestor( E1, E2, *myMesh, TopAbs_FACE ); + if ( Pos1 != SMDS_TOP_FACE ) std::swap( n1,n2 ); + TopoDS_Shape F = GetSubShapeByNode( n1, GetMeshDS() ); + TopoDS_Shape S = GetSubShapeByNode( n2, GetMeshDS() ); + if ( IsSubShape( S, F )) + { + shapeType = TopAbs_FACE; + shapeID = n1->getshapeId(); + } } } - else if ( Pos1->GetTypeOfPosition()==SMDS_TOP_VERTEX && - Pos2->GetTypeOfPosition()==SMDS_TOP_VERTEX ) + else if ( Pos1 == SMDS_TOP_EDGE && Pos2 == SMDS_TOP_EDGE ) + { + TopoDS_Shape E1 = GetSubShapeByNode( n1, GetMeshDS() ); + TopoDS_Shape E2 = GetSubShapeByNode( n2, GetMeshDS() ); + shape = GetCommonAncestor( E1, E2, *myMesh, TopAbs_FACE ); + } + else if ( Pos1 == SMDS_TOP_VERTEX && Pos2 == SMDS_TOP_VERTEX ) { TopoDS_Shape V1 = GetSubShapeByNode( n1, GetMeshDS() ); TopoDS_Shape V2 = GetSubShapeByNode( n2, GetMeshDS() ); - shape = GetCommonAncestor( V1, V2, *myMesh, TopAbs_FACE ); - if ( shape.IsNull() ) shape = GetCommonAncestor( V1, V2, *myMesh, TopAbs_EDGE ); + shape = GetCommonAncestor( V1, V2, *myMesh, TopAbs_EDGE ); + if ( shape.IsNull() ) shape = GetCommonAncestor( V1, V2, *myMesh, TopAbs_FACE ); } else // VERTEX and EDGE { - if ( Pos1->GetTypeOfPosition()!=SMDS_TOP_VERTEX ) std::swap( n1,n2 ); + if ( Pos1 != SMDS_TOP_VERTEX ) std::swap( n1,n2 ); TopoDS_Shape V = GetSubShapeByNode( n1, GetMeshDS() ); TopoDS_Shape E = GetSubShapeByNode( n2, GetMeshDS() ); if ( IsSubShape( V, E )) @@ -963,9 +962,11 @@ std::pair SMESH_MesherHelper::GetMediumPos(const SMDS_Mes shape = GetCommonAncestor( V, E, *myMesh, TopAbs_FACE ); } } + if ( !shape.IsNull() ) { - shapeID = GetMeshDS()->ShapeToIndex( shape ); + if ( shapeID < 1 ) + shapeID = GetMeshDS()->ShapeToIndex( shape ); shapeType = shape.ShapeType(); } return make_pair( shapeID, shapeType ); @@ -999,9 +1000,6 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1, // get type of shape for the new medium node int faceID = -1, edgeID = -1; - const SMDS_PositionPtr Pos1 = n1->GetPosition(); - const SMDS_PositionPtr Pos2 = n2->GetPosition(); - TopoDS_Edge E; double u [2]; TopoDS_Face F; gp_XY uv[2]; bool uvOK[2] = { false, false }; @@ -1017,23 +1015,27 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1, } else if ( pos.second == TopAbs_EDGE ) { + const SMDS_PositionPtr Pos1 = n1->GetPosition(); + const SMDS_PositionPtr Pos2 = n2->GetPosition(); if ( Pos1->GetTypeOfPosition()==SMDS_TOP_EDGE && Pos2->GetTypeOfPosition()==SMDS_TOP_EDGE && - n1->getshapeId() != n2->getshapeId() ) // issue 0021006 - return getMediumNodeOnComposedWire(n1,n2,force3d); - + n1->getshapeId() != n2->getshapeId() ) + { + // issue 0021006 + return getMediumNodeOnComposedWire(n1,n2,force3d); + } E = TopoDS::Edge(meshDS->IndexToShape( edgeID = pos.first )); u[0] = GetNodeU(E,n1,n2, force3d ? 0 : &uvOK[0]); u[1] = GetNodeU(E,n2,n1, force3d ? 0 : &uvOK[1]); } - if(!force3d) + if ( !force3d & uvOK[0] && uvOK[1] ) { // we try to create medium node using UV parameters of // nodes, else - medium between corresponding 3d points if( ! F.IsNull() ) { - if ( uvOK[0] && uvOK[1] ) + //if ( uvOK[0] && uvOK[1] ) { if ( IsDegenShape( n1->getshapeId() )) { if ( myParIndex & U_periodic ) uv[0].SetCoord( 1, uv[1].Coord( 1 )); @@ -1357,7 +1359,7 @@ SMDS_MeshFace* SMESH_MesherHelper::AddPolygonalFace (const vectorOrientation() == TopAbs_REVERSED ) std::swap( f, l ); - const double coeff = 1. / ( l - f ) / length[iE] / fullLen; + const double coeff = 1. / ( l - f ) * length[iE] / fullLen; const double prevPar = theParam2ColumnMap.empty() ? 0 : theParam2ColumnMap.rbegin()->first; map< double, const SMDS_MeshNode*>::iterator u_n = sortedBaseNodes.begin(); for ( ; u_n != sortedBaseNodes.end(); u_n++ )