X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_CompositeHexa_3D.cxx;h=310d135ddea256f087a589b84b94193ad99cd062;hb=1fb3ff621ac19da15742a5e8b9253b594977d14a;hp=ebdbd9ee47e0603cc27b89b7f55d12677945b6bd;hpb=80637e48ef0a19bb89acdf00c98959ab08b5dcc8;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx b/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx index ebdbd9ee4..310d135dd 100644 --- a/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx +++ b/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2019 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -267,8 +267,8 @@ private: */ //================================================================================ -StdMeshers_CompositeHexa_3D::StdMeshers_CompositeHexa_3D(int hypId, int studyId, SMESH_Gen* gen) - :SMESH_3D_Algo(hypId, studyId, gen) +StdMeshers_CompositeHexa_3D::StdMeshers_CompositeHexa_3D(int hypId, SMESH_Gen* gen) + :SMESH_3D_Algo(hypId, gen) { _name = "CompositeHexa_3D"; _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID); // 1 bit /shape type @@ -312,13 +312,15 @@ namespace if ( !TopExp::CommonVertex( E1, E2, V )) return false; const SMDS_MeshNode* n = SMESH_Algo::VertexNode( V, mesh.GetMeshDS() ); - if ( !n ) return false; + if ( !n ) return SMESH_Algo::IsContinuous( E1, E2 ); // meshed by "composite segment" SMESHDS_SubMesh* sm = mesh.GetSubMeshContaining( F )->GetSubMeshDS(); if ( !sm ) return false; int nbQuads = 0; SMDS_ElemIteratorPtr fIt = n->GetInverseElementIterator(SMDSAbs_Face); + if ( !fIt->more() ) + return SMESH_Algo::IsContinuous( E1, E2 ); // meshed by "composite segment" while ( fIt->more() ) { const SMDS_MeshElement* f = fIt->next(); @@ -332,6 +334,28 @@ namespace return nbQuads == 2; } + //================================================================================ + /*! + * \brief Return true if a vertex holds a node and this node is used by some quadrangle + */ + //================================================================================ + + // bool isMeshedVertex( TopoDS_Vertex& V, + // const SMESH_Mesh& mesh ) + // { + // const SMDS_MeshNode* n = SMESH_Algo::VertexNode( V, mesh.GetMeshDS() ); + // if ( !n ) return false; + + // SMDS_ElemIteratorPtr fIt = n->GetInverseElementIterator(SMDSAbs_Face); + // while ( fIt->more() ) + // { + // const SMDS_MeshElement* f = fIt->next(); + // if ( f->NbCornerNodes() == 4 ) + // return true; + // } + // return false; + // } + //================================================================================ /*! * \brief Finds VERTEXes located at block corners @@ -802,7 +826,7 @@ bool StdMeshers_CompositeHexa_3D::Evaluate(SMESH_Mesh& theMesh, nbSeg1 += Max( nbElems[ SMDSEntity_Edge ], nbElems[ SMDSEntity_Quad_Edge ]); } - // Get an 1D size of a box side ortogonal to lessComplexSide + // Get an 1D size of a box side orthogonal to lessComplexSide int nbSeg2 = 0; _QuadFaceGrid* ortoSide = lessComplexSide->FindAdjacentForSide( Q_LEFT, boxFaceContainer, B_UNDEFINED ); @@ -815,7 +839,7 @@ bool StdMeshers_CompositeHexa_3D::Evaluate(SMESH_Mesh& theMesh, nbSeg2 += Max( nbElems[ SMDSEntity_Edge ], nbElems[ SMDSEntity_Quad_Edge ]); } - // Get an 2D size of a box side ortogonal to lessComplexSide + // Get an 2D size of a box side orthogonal to lessComplexSide int nbFaces = 0, nbQuadFace = 0; list< TopoDS_Face > sideFaces; if ( ortoSide->IsComplex() ) @@ -893,14 +917,10 @@ bool _QuadFaceGrid::Init(const TopoDS_Face& f, SMESH_Mesh& mesh) while ( !edges.empty()) { sideEdges.clear(); sideEdges.splice( sideEdges.end(), edges, edges.begin());// edges.front()->sideEdges.back() + if ( SMESH_Algo::isDegenerated( sideEdges.back() )) + continue; while ( !edges.empty() ) { - if ( SMESH_Algo::IsContinuous( sideEdges.back(), edges.front() )) { - sideEdges.splice( sideEdges.end(), edges, edges.begin()); - } - else if ( SMESH_Algo::IsContinuous( sideEdges.front(), edges.back() )) { - sideEdges.splice( sideEdges.begin(), edges, --edges.end()); - } - else if ( isContinuousMesh( sideEdges.back(), edges.front(), f, mesh )) { + if ( isContinuousMesh( sideEdges.back(), edges.front(), f, mesh )) { sideEdges.splice( sideEdges.end(), edges, edges.begin()); } else if ( isContinuousMesh( sideEdges.front(), edges.back(), f, mesh )) { @@ -1944,6 +1964,13 @@ bool _FaceSide::StoreNodes(SMESH_Mesh& mesh, nodes); if ( !ok ) return false; + // skip nodes on VERTEXes not included in faces + if ( !nodes.begin()->second->GetInverseElementIterator(SMDSAbs_Face)->more() ) + nodes.erase( nodes.begin() ); + if ( !nodes.empty() && + !nodes.rbegin()->second->GetInverseElementIterator(SMDSAbs_Face)->more() ) + nodes.erase( --nodes.end() ); + bool forward = ( edge->Orientation() == TopAbs_FORWARD ); if ( reverse ) forward = !forward; if ( forward )