X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MesherHelper.cxx;h=ce4e90cc4bb21feeb8aaf93b691f02b79ade5444;hb=4a30c75bfca47f2793f5c7e0994ef9d41bbddb66;hp=c6c34ed47fda1f8f105c340b2135671ff3f2432c;hpb=831b40eb011a5f2ad1738518e86fdc6d924f891d;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index c6c34ed47..ce4e90cc4 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -1889,7 +1889,7 @@ const SMDS_MeshNode* SMESH_MesherHelper::getMediumNodeOnComposedWire(const SMDS_ if ( !bestEdge.IsNull() ) { - // move n12 to position of a successfull projection + // move n12 to position of a successful projection //double tol = BRep_Tool::Tolerance(edges[ iOkEdge ]); if ( !force3d /*&& distMiddleProj > 2*tol*/ ) { @@ -2568,6 +2568,7 @@ bool SMESH_MesherHelper::LoadNodeColumns(TParam2ColumnMap & theParam2 } // get nodes on theBaseEdge sorted by param on edge and initialize theParam2ColumnMap with them + const SMDS_MeshNode* prevEndNodes[2] = { 0, 0 }; edge = theBaseSide.begin(); for ( int iE = 0; edge != theBaseSide.end(); ++edge, ++iE ) { @@ -2635,11 +2636,16 @@ bool SMESH_MesherHelper::LoadNodeColumns(TParam2ColumnMap & theParam2 const double prevPar = theParam2ColumnMap.empty() ? 0 : theParam2ColumnMap.rbegin()->first; for ( u_n = sortedBaseNN.begin(); u_n != sortedBaseNN.end(); u_n++ ) { + if ( u_n->second == prevEndNodes[0] || + u_n->second == prevEndNodes[1] ) + continue; double par = prevPar + coeff * ( u_n->first - f ); TParam2ColumnMap::iterator u2nn = theParam2ColumnMap.insert( theParam2ColumnMap.end(), make_pair( par, TNodeColumn())); u2nn->second.push_back( u_n->second ); } + prevEndNodes[0] = sortedBaseNN.begin()->second; + prevEndNodes[1] = sortedBaseNN.rbegin()->second; } if ( theParam2ColumnMap.size() < 2 ) return false; @@ -3179,7 +3185,7 @@ double SMESH_MesherHelper::getFaceMaxTol( const TopoDS_Shape& face ) const * of the FACE normal * \return double - the angle (between -Pi and Pi), negative if the angle is concave, * 1e100 in case of failure - * \waring Care about order of the EDGEs and their orientation to be as they are + * \warning Care about order of the EDGEs and their orientation to be as they are * within the FACE! Don't pass degenerated EDGEs neither! */ //================================================================================ @@ -3402,11 +3408,16 @@ namespace { TopTools_ListIteratorOfListOfShape _ancIter; TopAbs_ShapeEnum _type; TopTools_MapOfShape _encountered; - TAncestorsIterator( const TopTools_ListOfShape& ancestors, TopAbs_ShapeEnum type) + TopTools_IndexedMapOfShape _allowed; + TAncestorsIterator( const TopTools_ListOfShape& ancestors, + TopAbs_ShapeEnum type, + const TopoDS_Shape* container/* = 0*/) : _ancIter( ancestors ), _type( type ) { + if ( container && !container->IsNull() ) + TopExp::MapShapes( *container, type, _allowed); if ( _ancIter.More() ) { - if ( _ancIter.Value().ShapeType() != _type ) next(); + if ( !isCurrentAllowed() ) next(); else _encountered.Add( _ancIter.Value() ); } } @@ -3419,25 +3430,32 @@ namespace { const TopoDS_Shape* s = _ancIter.More() ? & _ancIter.Value() : 0; if ( _ancIter.More() ) for ( _ancIter.Next(); _ancIter.More(); _ancIter.Next()) - if ( _ancIter.Value().ShapeType() == _type && _encountered.Add( _ancIter.Value() )) + if ( isCurrentAllowed() && _encountered.Add( _ancIter.Value() )) break; return s; } + bool isCurrentAllowed() + { + return (( _ancIter.Value().ShapeType() == _type ) && + ( _allowed.IsEmpty() || _allowed.Contains( _ancIter.Value() ))); + } }; } // namespace //======================================================================= /*! - * \brief Return iterator on ancestors of the given type + * \brief Return iterator on ancestors of the given type, included into a container shape */ //======================================================================= PShapeIteratorPtr SMESH_MesherHelper::GetAncestors(const TopoDS_Shape& shape, const SMESH_Mesh& mesh, - TopAbs_ShapeEnum ancestorType) + TopAbs_ShapeEnum ancestorType, + const TopoDS_Shape* container) { - return PShapeIteratorPtr( new TAncestorsIterator( mesh.GetAncestors(shape), ancestorType)); + return PShapeIteratorPtr + ( new TAncestorsIterator( mesh.GetAncestors(shape), ancestorType, container)); } //======================================================================= @@ -3715,7 +3733,7 @@ namespace { // Structures used by FixQuadraticElements() * \brief Make up a chain of links * \param iSide - link to add first * \param chain - chain to fill in - * \param pos - postion of medium nodes the links should have + * \param pos - position of medium nodes the links should have * \param error - out, specifies what is wrong * \retval bool - false if valid chain can't be built; "valid" means that links * of the chain belongs to rectangles bounding hexahedrons @@ -3729,7 +3747,7 @@ namespace { // Structures used by FixQuadraticElements() if ( _sideIsAdded[ iSide ]) // already in chain return true; - if ( _sides.size() != 4 ) { // triangle - visit all my continous faces + if ( _sides.size() != 4 ) { // triangle - visit all my continuous faces MSGBEG( *this ); TLinkSet links; list< const QFace* > faces( 1, this ); @@ -3775,7 +3793,7 @@ namespace { // Structures used by FixQuadraticElements() if ( link->MediumPos() >= pos ) { int nbLinkFaces = link->_faces.size(); if ( nbLinkFaces == 4 || (/*nbLinkFaces < 4 && */link->OnBoundary())) { - // hexahedral mesh or boundary quadrangles - goto a continous face + // hexahedral mesh or boundary quadrangles - goto a continuous face if ( const QFace* f = link->GetContinuesFace( this )) if ( f->_sides.size() == 4 ) return f->GetLinkChain( *chLink, chain, pos, error ); @@ -3903,7 +3921,7 @@ namespace { // Structures used by FixQuadraticElements() * \brief Move medium node of theLink according to its distance from boundary * \param theLink - link to fix * \param theRefVec - movement of boundary - * \param theLinks - all adjacent links of continous triangles + * \param theLinks - all adjacent links of continuous triangles * \param theFaceHelper - helper is not used so far * \param thePrevLen - distance from the boundary * \param theStep - number of steps till movement propagation limit @@ -4634,7 +4652,7 @@ namespace { // Structures used by FixQuadraticElements() < const SMDS_MeshElement*, vector< SMDS_ElemIteratorPtr > > TIterOnIter; SMDS_ElemIteratorPtr faceIter( new TIterOnIter( faceIterVec )); - // a seacher to check if a volume is close to a concave face + // search to check if a volume is close to a concave face SMESHUtils::Deleter< SMESH_ElementSearcher > faceSearcher ( SMESH_MeshAlgos::GetElementSearcher( *theHelper.GetMeshDS(), faceIter ));