+//=======================================================================
+//function : GetHypothesis
+//purpose :
+//=======================================================================
+
+const SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const TopoDS_Shape & aSubShape,
+ const SMESH_HypoFilter& aFilter,
+ const bool andAncestors) const
+{
+ {
+ const list<const SMESHDS_Hypothesis*>& hypList = _myMeshDS->GetHypothesis(aSubShape);
+ list<const SMESHDS_Hypothesis*>::const_iterator hyp = hypList.begin();
+ for ( ; hyp != hypList.end(); hyp++ ) {
+ const SMESH_Hypothesis * h = static_cast<const SMESH_Hypothesis*>( *hyp );
+ if ( aFilter.IsOk( h, aSubShape))
+ return h;
+ }
+ }
+ if ( andAncestors )
+ {
+ TopTools_ListIteratorOfListOfShape it( GetAncestors( aSubShape ));
+ for (; it.More(); it.Next() )
+ {
+ const list<const SMESHDS_Hypothesis*>& hypList = _myMeshDS->GetHypothesis(it.Value());
+ list<const SMESHDS_Hypothesis*>::const_iterator hyp = hypList.begin();
+ for ( ; hyp != hypList.end(); hyp++ ) {
+ const SMESH_Hypothesis * h = static_cast<const SMESH_Hypothesis*>( *hyp );
+ if (aFilter.IsOk( h, it.Value() ))
+ return h;
+ }
+ }
+ }
+ return 0;
+}
+
+//=======================================================================
+//function : GetHypotheses
+//purpose :
+//=======================================================================
+
+//================================================================================
+/*!
+ * \brief Return hypothesis assigned to the shape
+ * \param aSubShape - the shape to check
+ * \param aFilter - the hypothesis filter
+ * \param aHypList - the list of the found hypotheses
+ * \param andAncestors - flag to check hypos assigned to ancestors of the shape
+ * \retval int - number of unique hypos in aHypList
+ */
+//================================================================================
+
+int SMESH_Mesh::GetHypotheses(const TopoDS_Shape & aSubShape,
+ const SMESH_HypoFilter& aFilter,
+ list <const SMESHDS_Hypothesis * >& aHypList,
+ const bool andAncestors) const
+{
+ set<string> hypTypes; // to exclude same type hypos from the result list
+ int nbHyps = 0;
+
+ // fill in hypTypes
+ list<const SMESHDS_Hypothesis*>::const_iterator hyp;
+ for ( hyp = aHypList.begin(); hyp != aHypList.end(); hyp++ )
+ if ( hypTypes.insert( (*hyp)->GetName() ).second )
+ nbHyps++;
+
+ // get hypos from aSubShape
+ {
+ const list<const SMESHDS_Hypothesis*>& hypList = _myMeshDS->GetHypothesis(aSubShape);
+ for ( hyp = hypList.begin(); hyp != hypList.end(); hyp++ )
+ if ( aFilter.IsOk (static_cast<const SMESH_Hypothesis*>( *hyp ), aSubShape) &&
+ hypTypes.insert( (*hyp)->GetName() ).second )
+ {
+ aHypList.push_back( *hyp );
+ nbHyps++;
+ }
+ }
+
+ // get hypos from ancestors of aSubShape
+ if ( andAncestors )
+ {
+ TopTools_MapOfShape map;
+ TopTools_ListIteratorOfListOfShape it( GetAncestors( aSubShape ));
+ for (; it.More(); it.Next() )
+ {
+ if ( !map.Add( it.Value() ))
+ continue;
+ const list<const SMESHDS_Hypothesis*>& hypList = _myMeshDS->GetHypothesis(it.Value());
+ for ( hyp = hypList.begin(); hyp != hypList.end(); hyp++ )
+ if (aFilter.IsOk( static_cast<const SMESH_Hypothesis*>( *hyp ), it.Value() ) &&
+ hypTypes.insert( (*hyp)->GetName() ).second ) {
+ aHypList.push_back( *hyp );
+ nbHyps++;
+ }
+ }
+ }
+ return nbHyps;
+}
+