X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MesherHelper.cxx;h=ed82de3b4110bc428859a181f2dec4bf7a011ef6;hp=aec095ec3c4d00cfadc7dbad0dd626023c9befeb;hb=8103f44f2df047ea49c06f3f0c132feb0fd74195;hpb=afb2a8e7814693a4c0b7348fa38fd05a340e7d97 diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index aec095ec3..ed82de3b4 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -31,8 +31,10 @@ #include "SMDS_FacePosition.hxx" #include "SMDS_IteratorOnIterators.hxx" #include "SMDS_VolumeTool.hxx" +#include "SMESHDS_Mesh.hxx" #include "SMESH_Block.hxx" #include "SMESH_HypoFilter.hxx" +#include "SMESH_Mesh.hxx" #include "SMESH_MeshAlgos.hxx" #include "SMESH_ProxyMesh.hxx" #include "SMESH_subMesh.hxx" @@ -113,6 +115,28 @@ SMESH_MesherHelper::~SMESH_MesherHelper() } } +//================================================================================ +/*! + * \brief Return SMESH_Gen + */ +//================================================================================ + +SMESH_Gen* SMESH_MesherHelper::GetGen() const +{ + return GetMesh()->GetGen(); +} + +//================================================================================ +/*! + * \brief Return mesh DS + */ +//================================================================================ + +SMESHDS_Mesh* SMESH_MesherHelper::GetMeshDS() const +{ + return GetMesh()->GetMeshDS(); +} + //======================================================================= //function : IsQuadraticSubMesh //purpose : Check submesh for given shape: if all elements on this shape @@ -139,7 +163,7 @@ bool SMESH_MesherHelper::IsQuadraticSubMesh(const TopoDS_Shape& aSh) SMDSAbs_ElementType elemType( subType==TopAbs_FACE ? SMDSAbs_Face : SMDSAbs_Edge ); - int nbOldLinks = myTLinkNodeMap.size(); + //int nbOldLinks = myTLinkNodeMap.size(); if ( !myMesh->HasShapeToMesh() ) { @@ -280,6 +304,7 @@ void SMESH_MesherHelper::SetSubShape(const TopoDS_Shape& aSh) double u2 = uv1.Coord(1); myPar1[0] = Min( u1, u2 ); myPar2[0] = Max( u1, u2 ); + myParIndex |= U_periodic; } else { @@ -289,6 +314,7 @@ void SMESH_MesherHelper::SetSubShape(const TopoDS_Shape& aSh) double v2 = uv1.Coord(2); myPar1[1] = Min( v1, v2 ); myPar2[1] = Max( v1, v2 ); + myParIndex |= V_periodic; } } else //if ( !isSeam ) @@ -308,11 +334,18 @@ void SMESH_MesherHelper::SetSubShape(const TopoDS_Shape& aSh) { double f,l, r = 0.2345; Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface( edge, face, f, l ); - uv2 = C2d->Value( f * r + l * ( 1.-r )); - if ( du < Precision::PConfusion() ) - isSeam = ( Abs( uv1.Coord(1) - uv2.Coord(1) ) < Precision::PConfusion() ); + if ( C2d.IsNull() ) + { + isSeam = false; + } else - isSeam = ( Abs( uv1.Coord(2) - uv2.Coord(2) ) < Precision::PConfusion() ); + { + uv2 = C2d->Value( f * r + l * ( 1.-r )); + if ( du < Precision::PConfusion() ) + isSeam = ( Abs( uv1.Coord(1) - uv2.Coord(1) ) < Precision::PConfusion() ); + else + isSeam = ( Abs( uv1.Coord(2) - uv2.Coord(2) ) < Precision::PConfusion() ); + } } } if ( isSeam ) @@ -340,6 +373,16 @@ void SMESH_MesherHelper::SetSubShape(const TopoDS_Shape& aSh) } } +//======================================================================= +//function : ShapeToIndex +//purpose : Convert a shape to its index in the SMESHDS_Mesh +//======================================================================= + +int SMESH_MesherHelper::ShapeToIndex( const TopoDS_Shape& S ) const +{ + return GetMeshDS()->ShapeToIndex( S ); +} + //======================================================================= //function : GetNodeUVneedInFaceNode //purpose : Check if inFaceNode argument is necessary for call GetNodeUV(F,..) @@ -649,12 +692,11 @@ gp_XY SMESH_MesherHelper::GetNodeUV(const TopoDS_Face& F, } catch (Standard_Failure& exc) { } - if ( !uvOK ) { - for ( TopExp_Explorer vert(F,TopAbs_VERTEX); !uvOK && vert.More(); vert.Next() ) - uvOK = ( V == vert.Current() ); - if ( !uvOK ) { - MESSAGE ( "SMESH_MesherHelper::GetNodeUV(); Vertex " << vertexID - << " not in face " << GetMeshDS()->ShapeToIndex( F ) ); + if ( !uvOK ) + { + if ( !IsSubShape( V, F )) + { + MESSAGE("GetNodeUV() Vertex "<< vertexID <<" not in face "<< GetMeshDS()->ShapeToIndex(F)); // get UV of a vertex closest to the node double dist = 1e100; gp_Pnt pn = XYZ( n ); @@ -669,7 +711,8 @@ gp_XY SMESH_MesherHelper::GetNodeUV(const TopoDS_Face& F, } } } - else { + else + { uvOK = false; TopTools_ListIteratorOfListOfShape it( myMesh->GetAncestors( V )); for ( ; it.More(); it.Next() ) { @@ -678,13 +721,23 @@ gp_XY SMESH_MesherHelper::GetNodeUV(const TopoDS_Face& F, double f,l; Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(edge, F, f, l); if ( !C2d.IsNull() ) { - double u = ( V == TopExp::FirstVertex( edge ) ) ? f : l; + double u = ( V == IthVertex( 0, edge )) ? f : l; uv = C2d->Value( u ); uvOK = true; break; } } } + if ( !uvOK && V.Orientation() == TopAbs_INTERNAL ) + { + Handle(ShapeAnalysis_Surface) projector = GetSurface( F ); + if ( n2 ) uv = GetNodeUV( F, n2 ); + if ( Precision::IsInfinite( uv.X() )) + uv = projector->NextValueOfUV( uv, BRep_Tool::Pnt( V ), BRep_Tool::Tolerance( F )); + else + uv = projector->ValueOfUV( BRep_Tool::Pnt( V ), BRep_Tool::Tolerance( F )); + uvOK = ( projector->Gap() < getFaceMaxTol( F )); + } } } if ( n2 && IsSeamShape( vertexID )) @@ -807,6 +860,24 @@ GeomAPI_ProjectPointOnSurf& SMESH_MesherHelper::GetProjector(const TopoDS_Face& return *( i_proj->second ); } +//======================================================================= +//function : GetSurface +//purpose : Return a cached ShapeAnalysis_Surface of a FACE +//======================================================================= + +Handle(ShapeAnalysis_Surface) SMESH_MesherHelper::GetSurface(const TopoDS_Face& F ) const +{ + Handle(Geom_Surface) surface = BRep_Tool::Surface( F ); + int faceID = GetMeshDS()->ShapeToIndex( F ); + TID2Surface::iterator i_surf = myFace2Surface.find( faceID ); + if ( i_surf == myFace2Surface.end() && faceID ) + { + Handle(ShapeAnalysis_Surface) surf( new ShapeAnalysis_Surface( surface )); + i_surf = myFace2Surface.insert( make_pair( faceID, surf )).first; + } + return i_surf->second; +} + namespace { gp_XY AverageUV(const gp_XY& uv1, const gp_XY& uv2) { return ( uv1 + uv2 ) / 2.; } @@ -1044,7 +1115,6 @@ bool SMESH_MesherHelper::CheckNodeU(const TopoDS_Edge& E, } Quantity_Parameter U = projector->LowerDistanceParameter(); u = double( U ); - MESSAGE(" f " << f << " l " << l << " u " << u); curvPnt = curve->Value( u ); dist = nodePnt.Distance( curvPnt ); if ( distXYZ ) { @@ -1054,8 +1124,7 @@ bool SMESH_MesherHelper::CheckNodeU(const TopoDS_Edge& E, } if ( dist > tol ) { - MESSAGE( "SMESH_MesherHelper::CheckNodeU(), invalid projection" ); - MESSAGE("distance " << dist << " " << tol ); + MESSAGE( "CheckNodeU(), invalid projection; distance " << dist << "; tol " << tol ); return false; } // store the fixed U on the edge @@ -1330,23 +1399,34 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetCentralNode(const SMDS_MeshNode* n1, bool toCheck = true; if ( !F.IsNull() && !force3d ) { - gp_XY uv[8] = { - GetNodeUV( F,n1, n3, &toCheck ), - GetNodeUV( F,n2, n4, &toCheck ), - GetNodeUV( F,n3, n1, &toCheck ), - GetNodeUV( F,n4, n2, &toCheck ), - GetNodeUV( F,n12, n3 ), - GetNodeUV( F,n23, n4 ), - GetNodeUV( F,n34, n2 ), - GetNodeUV( F,n41, n2 ) - }; - AdjustByPeriod( F, uv, 8 ); // put uv[] within a period (IPAL52698) - - uvAvg = calcTFI (0.5, 0.5, uv[0],uv[1],uv[2],uv[3], uv[4],uv[5],uv[6],uv[7] ); + Handle(ShapeAnalysis_Surface) surface = GetSurface( F ); + if ( HasDegeneratedEdges() || surface->HasSingularities( 1e-7 )) + { + gp_Pnt center = calcTFI (0.5, 0.5, // IPAL0052863 + SMESH_TNodeXYZ(n1), SMESH_TNodeXYZ(n2), + SMESH_TNodeXYZ(n3), SMESH_TNodeXYZ(n4), + SMESH_TNodeXYZ(n12), SMESH_TNodeXYZ(n23), + SMESH_TNodeXYZ(n34), SMESH_TNodeXYZ(n41)); + gp_Pnt2d uv12 = GetNodeUV( F, n12, n3, &toCheck ); + uvAvg = surface->NextValueOfUV( uv12, center, BRep_Tool::Tolerance( F )).XY(); + } + else + { + gp_XY uv[8] = { + GetNodeUV( F,n1, n3, &toCheck ), + GetNodeUV( F,n2, n4, &toCheck ), + GetNodeUV( F,n3, n1, &toCheck ), + GetNodeUV( F,n4, n2, &toCheck ), + GetNodeUV( F,n12, n3 ), + GetNodeUV( F,n23, n4 ), + GetNodeUV( F,n34, n2 ), + GetNodeUV( F,n41, n2 ) + }; + AdjustByPeriod( F, uv, 8 ); // put uv[] within a period (IPAL52698) - TopLoc_Location loc; - Handle( Geom_Surface ) S = BRep_Tool::Surface( F, loc ); - P = S->Value( uvAvg.X(), uvAvg.Y() ).Transformed( loc ); + uvAvg = calcTFI (0.5, 0.5, uv[0],uv[1],uv[2],uv[3], uv[4],uv[5],uv[6],uv[7] ); + } + P = surface->Value( uvAvg ); centralNode = meshDS->AddNode( P.X(), P.Y(), P.Z() ); // if ( mySetElemOnShape ) node is not elem! meshDS->SetNodeOnFace( centralNode, faceID, uvAvg.X(), uvAvg.Y() ); @@ -1569,7 +1649,7 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1, // get type of shape for the new medium node int faceID = -1, edgeID = -1; - TopoDS_Edge E; double u [2]; + TopoDS_Edge E; double u [2] = {0.,0.}; TopoDS_Face F; gp_XY uv[2]; bool uvOK[2] = { true, true }; const bool useCurSubShape = ( !myShape.IsNull() && myShape.ShapeType() == TopAbs_EDGE ); @@ -1581,6 +1661,28 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1, { F = TopoDS::Face(meshDS->IndexToShape( faceID = pos.first )); uv[0] = GetNodeUV(F,n1,n2, force3d ? 0 : &uvOK[0]); + if (( !force3d ) && + ( HasDegeneratedEdges() || GetSurface( F )->HasSingularities( 1e-7 ))) + { + // IPAL52850 (degen VERTEX not at singularity) + // project middle point to a surface + SMESH_TNodeXYZ p1( n1 ), p2( n2 ); + gp_Pnt pMid = 0.5 * ( p1 + p2 ); + Handle(ShapeAnalysis_Surface) projector = GetSurface( F ); + gp_Pnt2d uvMid; + if ( uvOK[0] ) + uvMid = projector->NextValueOfUV( uv[0], pMid, BRep_Tool::Tolerance( F )); + else + uvMid = projector->ValueOfUV( pMid, getFaceMaxTol( F )); + if ( projector->Gap() * projector->Gap() < ( p1 - p2 ).SquareModulus() / 4 ) + { + gp_Pnt pProj = projector->Value( uvMid ); + n12 = meshDS->AddNode( pProj.X(), pProj.Y(), pProj.Z() ); + meshDS->SetNodeOnFace( n12, faceID, uvMid.X(), uvMid.Y() ); + myTLinkNodeMap.insert( make_pair ( link, n12 )); + return n12; + } + } uv[1] = GetNodeUV(F,n2,n1, force3d ? 0 : &uvOK[1]); } else if ( pos.second == TopAbs_EDGE ) @@ -2008,7 +2110,7 @@ SMDS_MeshFace* SMESH_MesherHelper::AddPolygonalFace (const vector newNodes( nodes.size() * 2 ); newNodes = nodes; - for ( int i = 0; i < nodes.size(); ++i ) + for ( size_t i = 0; i < nodes.size(); ++i ) { const SMDS_MeshNode* n1 = nodes[i]; const SMDS_MeshNode* n2 = nodes[(i+1)%nodes.size()]; @@ -2331,7 +2433,7 @@ SMESH_MesherHelper::AddPolyhedralVolume (const std::vector { vector newNodes; vector newQuantities; - for ( int iFace=0, iN=0; iFace < quantities.size(); ++iFace) + for ( size_t iFace = 0, iN = 0; iFace < quantities.size(); ++iFace ) { int nbNodesInFace = quantities[iFace]; newQuantities.push_back(0); @@ -2340,10 +2442,10 @@ SMESH_MesherHelper::AddPolyhedralVolume (const std::vector const SMDS_MeshNode* n1 = nodes[ iN + i ]; newNodes.push_back( n1 ); newQuantities.back()++; - + const SMDS_MeshNode* n2 = nodes[ iN + ( i+1==nbNodesInFace ? 0 : i+1 )]; -// if ( n1->GetPosition()->GetTypeOfPosition() != SMDS_TOP_3DSPACE && -// n2->GetPosition()->GetTypeOfPosition() != SMDS_TOP_3DSPACE ) + // if ( n1->GetPosition()->GetTypeOfPosition() != SMDS_TOP_3DSPACE && + // n2->GetPosition()->GetTypeOfPosition() != SMDS_TOP_3DSPACE ) { const SMDS_MeshNode* n12 = GetMediumNode( n1, n2, force3d, TopAbs_SOLID ); newNodes.push_back( n12 ); @@ -2544,8 +2646,8 @@ bool SMESH_MesherHelper::LoadNodeColumns(TParam2ColumnMap & theParam2 } // nb rows of nodes - int prevNbRows = theParam2ColumnMap.begin()->second.size(); // current, at least 1 here - int expectedNbRows = faceSubMesh->NbElements() / ( theParam2ColumnMap.size()-1 ); // to be added + size_t prevNbRows = theParam2ColumnMap.begin()->second.size(); // current, at least 1 here + size_t expectNbRows = faceSubMesh->NbElements() / ( theParam2ColumnMap.size()-1 ); // to be added // fill theParam2ColumnMap column by column by passing from nodes on // theBaseEdge up via mesh faces on theFace @@ -2558,10 +2660,10 @@ bool SMESH_MesherHelper::LoadNodeColumns(TParam2ColumnMap & theParam2 { vector& nCol1 = par_nVec_1->second; vector& nCol2 = par_nVec_2->second; - nCol1.resize( prevNbRows + expectedNbRows ); - nCol2.resize( prevNbRows + expectedNbRows ); + nCol1.resize( prevNbRows + expectNbRows ); + nCol2.resize( prevNbRows + expectNbRows ); - int i1, i2, foundNbRows = 0; + int i1, i2; size_t foundNbRows = 0; const SMDS_MeshNode *n1 = nCol1[ prevNbRows-1 ]; const SMDS_MeshNode *n2 = nCol2[ prevNbRows-1 ]; // find face sharing node n1 and n2 and belonging to faceSubMesh @@ -2573,7 +2675,7 @@ bool SMESH_MesherHelper::LoadNodeColumns(TParam2ColumnMap & theParam2 int nbNodes = face->NbCornerNodes(); if ( nbNodes != 4 ) return false; - if ( foundNbRows + 1 > expectedNbRows ) + if ( foundNbRows + 1 > expectNbRows ) return false; n1 = face->GetNode( (i2+2) % 4 ); // opposite corner of quadrangle face n2 = face->GetNode( (i1+2) % 4 ); @@ -2583,12 +2685,12 @@ bool SMESH_MesherHelper::LoadNodeColumns(TParam2ColumnMap & theParam2 } avoidSet.insert( face ); } - if ( foundNbRows != expectedNbRows ) + if ((size_t) foundNbRows != expectNbRows ) return false; avoidSet.clear(); } return ( theParam2ColumnMap.size() > 1 && - theParam2ColumnMap.begin()->second.size() == prevNbRows + expectedNbRows ); + theParam2ColumnMap.begin()->second.size() == prevNbRows + expectNbRows ); } namespace @@ -2842,6 +2944,10 @@ bool SMESH_MesherHelper::IsReversedSubMesh (const TopoDS_Face& theFace) bool ok = true; double u0 = GetNodeU( TopoDS::Edge( E ), nn[0], nn[1], &ok ); double u1 = GetNodeU( TopoDS::Edge( E ), nn[1], nn[0], &ok ); + // check that the 2 nodes are connected with a segment (IPAL53055) + if ( SMESHDS_SubMesh* sm = GetMeshDS()->MeshElements( E )) + if ( sm->NbElements() > 0 && !GetMeshDS()->FindEdge( nn[0], nn[1] )) + ok = false; if ( ok ) { isReversed = ( u0 > u1 ); @@ -2983,8 +3089,6 @@ bool SMESH_MesherHelper::IsSubShape( const TopoDS_Shape& shape, if ( shape.IsSame( exp.Current() )) return true; } - SCRUTE((shape.IsNull())); - SCRUTE((mainShape.IsNull())); return false; } @@ -3491,11 +3595,11 @@ namespace { // Structures used by FixQuadraticElements() int NbVolumes() const { return !_volumes[0] ? 0 : !_volumes[1] ? 1 : 2; } void AddSelfToLinks() const { - for ( int i = 0; i < _sides.size(); ++i ) + for ( size_t i = 0; i < _sides.size(); ++i ) _sides[i]->_faces.push_back( this ); } int LinkIndex( const QLink* side ) const { - for (int i=0; i<_sides.size(); ++i ) if ( _sides[i] == side ) return i; + for (size_t i = 0; i<_sides.size(); ++i ) if ( _sides[i] == side ) return i; return -1; } bool GetLinkChain( int iSide, TChain& chain, SMDS_TypeOfPosition pos, int& err) const; @@ -3527,7 +3631,7 @@ namespace { // Structures used by FixQuadraticElements() const SMDS_MeshNode* nodeToContain) const; const SMDS_MeshNode* GetNodeInFace() const { - for ( int iL = 0; iL < _sides.size(); ++iL ) + for ( size_t iL = 0; iL < _sides.size(); ++iL ) if ( _sides[iL]->MediumPos() == SMDS_TOP_FACE ) return _sides[iL]->_mediumNode; return 0; } @@ -3580,7 +3684,7 @@ namespace { // Structures used by FixQuadraticElements() _sides = links; _sideIsAdded[0]=_sideIsAdded[1]=_sideIsAdded[2]=_sideIsAdded[3]=false; _normal.SetCoord(0,0,0); - for ( int i = 1; i < _sides.size(); ++i ) { + for ( size_t i = 1; i < _sides.size(); ++i ) { const QLink *l1 = _sides[i-1], *l2 = _sides[i]; insert( l1->node1() ); insert( l1->node2() ); // compute normal @@ -3614,7 +3718,7 @@ namespace { // Structures used by FixQuadraticElements() bool QFace::GetLinkChain( int iSide, TChain& chain, SMDS_TypeOfPosition pos, int& error) const { - if ( iSide >= _sides.size() ) // wrong argument iSide + if ( iSide >= (int)_sides.size() ) // wrong argument iSide return false; if ( _sideIsAdded[ iSide ]) // already in chain return true; @@ -3625,7 +3729,7 @@ namespace { // Structures used by FixQuadraticElements() list< const QFace* > faces( 1, this ); while ( !faces.empty() ) { const QFace* face = faces.front(); - for ( int i = 0; i < face->_sides.size(); ++i ) { + for ( size_t i = 0; i < face->_sides.size(); ++i ) { if ( !face->_sideIsAdded[i] && face->_sides[i] ) { face->_sideIsAdded[i] = true; // find a face side in the chain @@ -3708,7 +3812,7 @@ namespace { // Structures used by FixQuadraticElements() typedef list< pair< const QFace*, TLinkInSet > > TFaceLinkList; TFaceLinkList adjacentFaces; - for ( int iL = 0; iL < _sides.size(); ++iL ) + for ( size_t iL = 0; iL < _sides.size(); ++iL ) { if ( avoidLink._qlink == _sides[iL] ) continue; @@ -3761,10 +3865,10 @@ namespace { // Structures used by FixQuadraticElements() const TChainLink& avoidLink, const SMDS_MeshNode* nodeToContain) const { - for ( int i = 0; i < _sides.size(); ++i ) + for ( size_t i = 0; i < _sides.size(); ++i ) if ( avoidLink._qlink != _sides[i] && (_sides[i]->node1() == nodeToContain || _sides[i]->node2() == nodeToContain )) - return links.find( _sides[ i ]); + return links.find( _sides[i] ); return links.end(); } @@ -3815,7 +3919,7 @@ namespace { // Structures used by FixQuadraticElements() if ( !theStep ) return thePrevLen; // propagation limit reached - int iL; // index of theLink + size_t iL; // index of theLink for ( iL = 0; iL < _sides.size(); ++iL ) if ( theLink._qlink == _sides[ iL ]) break; @@ -3955,7 +4059,7 @@ namespace { // Structures used by FixQuadraticElements() int iFaceCont = -1, nbBoundary = 0, iBoundary[2]={-1,-1}; if ( _faces[0]->IsBoundary() ) iBoundary[ nbBoundary++ ] = 0; - for ( int iF = 1; iFaceCont < 0 && iF < _faces.size(); ++iF ) + for ( size_t iF = 1; iFaceCont < 0 && iF < _faces.size(); ++iF ) { // look for a face bounding none of volumes bound by _faces[0] bool sameVol = false; @@ -3997,12 +4101,13 @@ namespace { // Structures used by FixQuadraticElements() const QFace* QLink::GetContinuesFace( const QFace* face ) const { - for ( int i = 0; i < _faces.size(); ++i ) { - if ( _faces[i] == face ) { - int iF = i < 2 ? 1-i : 5-i; - return iF < _faces.size() ? _faces[iF] : 0; + if ( _faces.size() <= 4 ) + for ( size_t i = 0; i < _faces.size(); ++i ) { + if ( _faces[i] == face ) { + int iF = i < 2 ? 1-i : 5-i; + return iF < (int)_faces.size() ? _faces[iF] : 0; + } } - } return 0; } //================================================================================ @@ -4013,7 +4118,7 @@ namespace { // Structures used by FixQuadraticElements() bool QLink::OnBoundary() const { - for ( int i = 0; i < _faces.size(); ++i ) + for ( size_t i = 0; i < _faces.size(); ++i ) if (_faces[i] && _faces[i]->IsBoundary()) return true; return false; } @@ -4082,7 +4187,7 @@ namespace { // Structures used by FixQuadraticElements() for ( ; bnd != bndEnd; ++bnd ) { const QLink* bndLink = *bnd; - for ( int i = 0; i < bndLink->_faces.size(); ++i ) // loop on faces of bndLink + for ( size_t i = 0; i < bndLink->_faces.size(); ++i ) // loop on faces of bndLink { const QFace* face = bndLink->_faces[i]; // quadrange lateral face of a prism if ( !face ) continue; @@ -4149,7 +4254,7 @@ namespace { // Structures used by FixQuadraticElements() { // put links in the set and evalute number of result chains by number of boundary links TLinkSet linkSet; - int nbBndLinks = 0; + size_t nbBndLinks = 0; for ( TChain::iterator lnk = allLinks.begin(); lnk != allLinks.end(); ++lnk ) { linkSet.insert( *lnk ); nbBndLinks += lnk->IsBoundary(); @@ -4198,7 +4303,7 @@ namespace { // Structures used by FixQuadraticElements() TLinkInSet botLink = startLink; // current horizontal link to go up from corner = startCorner; // current corner the botLink ends at - int iRow = 0; + size_t iRow = 0; while ( botLink != linksEnd ) // loop on rows { // add botLink to the columnChain @@ -4295,7 +4400,7 @@ namespace { // Structures used by FixQuadraticElements() // In the linkSet, there must remain the last links of rowChains; add them if ( linkSet.size() != rowChains.size() ) return _BAD_SET_SIZE; - for ( int iRow = 0; iRow < rowChains.size(); ++iRow ) { + for ( size_t iRow = 0; iRow < rowChains.size(); ++iRow ) { // find the link (startLink) ending at startCorner corner = 0; for ( startLink = linkSet.begin(); startLink != linksEnd; ++startLink ) { @@ -4387,6 +4492,7 @@ namespace { // Structures used by FixQuadraticElements() { continue; } + default:; } // get nodes shared by faces that may be distorted SMDS_NodeIteratorPtr nodeIt; @@ -4500,6 +4606,7 @@ namespace { // Structures used by FixQuadraticElements() { concaveFaces.push_back( face ); } + default:; } } if ( concaveFaces.empty() ) @@ -4565,7 +4672,7 @@ namespace { // Structures used by FixQuadraticElements() while ( volIt->more() ) { const SMDS_MeshElement* vol = volIt->next(); - int nbN = vol->NbCornerNodes(); + size_t nbN = vol->NbCornerNodes(); if ( ( nbN != 4 && nbN != 5 ) || !solidSM->Contains( vol ) || !checkedVols.insert( vol ).second ) @@ -4705,7 +4812,8 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError, } // fix nodes on geom faces #ifdef _DEBUG_ - int nbfaces = faces.Extent(); /*avoid "unused varianbles": */ nbfaces++, nbfaces--; + int nbfaces = nbSolids; + nbfaces = faces.Extent(); /*avoid "unused varianbles": */ nbfaces++, nbfaces--; #endif for ( TopTools_MapIteratorOfMapOfShape fIt( faces ); fIt.More(); fIt.Next() ) { MSG("FIX FACE " << nbfaces-- << " #" << GetMeshDS()->ShapeToIndex(fIt.Key())); @@ -4895,7 +5003,7 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError, else { continue; } - for ( int iC = 0; iC < chains.size(); ++iC ) + for ( size_t iC = 0; iC < chains.size(); ++iC ) { TChain& chain = chains[iC]; if ( chain.empty() ) continue; @@ -5046,6 +5154,7 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError, "uv2: "<Move( move, /*sum=*/false, /*is2dFixed=*/true ); @@ -5064,7 +5173,6 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError, // ------------- TIDSortedElemSet biQuadQuas, biQuadTris, triQuadHexa; - const SMDS_MeshElement *biQuadQua, *triQuadHex; const bool toFixCentralNodes = ( myMesh->NbBiQuadQuadrangles() + myMesh->NbBiQuadTriangles() + myMesh->NbTriQuadraticHexas() ); @@ -5095,7 +5203,6 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError, // collect bi-quadratic elements if ( toFixCentralNodes ) { - biQuadQua = triQuadHex = 0; SMDS_ElemIteratorPtr eIt = pLink->_mediumNode->GetInverseElementIterator(); while ( eIt->more() ) { @@ -5254,4 +5361,24 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError, nCenterCoords.X(), nCenterCoords.Y(), nCenterCoords.Z()); } } +#ifdef _DEBUG_ + // avoid warning: defined but not used operator<<() + SMESH_Comment() << *links.begin() << *faces.begin(); +#endif } + +//================================================================================ +/*! + * \brief DEBUG + */ +//================================================================================ + +void SMESH_MesherHelper::WriteShape(const TopoDS_Shape& s) +{ + const char* name = "/tmp/shape.brep"; + BRepTools::Write( s, name ); +#ifdef _DEBUG_ + std::cout << name << std::endl; +#endif +} +