}
// 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 )
{
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;
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() );
}
}
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));
}
//=======================================================================