+ {
+ 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 = cSMESH_Hyp( *hyp );
+ if ( aFilter.IsOk( h, aSubShape)) {
+ if ( assignedTo ) *assignedTo = aSubShape;
+ return h;
+ }
+ }
+ }
+ if ( andAncestors )
+ {
+ // user sorted submeshes of ancestors, according to stored submesh priority
+ const list<SMESH_subMesh*> smList = getAncestorsSubMeshes( aSubShape );
+ list<SMESH_subMesh*>::const_iterator smIt = smList.begin();
+ for ( ; smIt != smList.end(); smIt++ )
+ {
+ const TopoDS_Shape& curSh = (*smIt)->GetSubShape();
+ const list<const SMESHDS_Hypothesis*>& hypList = _myMeshDS->GetHypothesis(curSh);
+ list<const SMESHDS_Hypothesis*>::const_iterator hyp = hypList.begin();
+ for ( ; hyp != hypList.end(); hyp++ ) {
+ const SMESH_Hypothesis * h = cSMESH_Hyp( *hyp );
+ if (aFilter.IsOk( h, curSh )) {
+ if ( assignedTo ) *assignedTo = curSh;
+ return h;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+//================================================================================
+/*!
+ * \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,
+ list< TopoDS_Shape > * assignedTo/*=0*/) const
+{
+ set<string> hypTypes; // to exclude same type hypos from the result list
+ int nbHyps = 0;
+
+ // only one main hypothesis is allowed
+ bool mainHypFound = false;
+
+ // 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++;
+ if ( !cSMESH_Hyp(*hyp)->IsAuxiliary() )
+ mainHypFound = true;
+ }
+
+ // get hypos from aSubShape
+ {
+ const list<const SMESHDS_Hypothesis*>& hypList = _myMeshDS->GetHypothesis(aSubShape);
+ for ( hyp = hypList.begin(); hyp != hypList.end(); hyp++ )
+ if ( aFilter.IsOk (cSMESH_Hyp( *hyp ), aSubShape) &&
+ ( cSMESH_Hyp(*hyp)->IsAuxiliary() || !mainHypFound ) &&
+ hypTypes.insert( (*hyp)->GetName() ).second )
+ {
+ aHypList.push_back( *hyp );
+ nbHyps++;
+ if ( !cSMESH_Hyp(*hyp)->IsAuxiliary() )
+ mainHypFound = true;
+ if ( assignedTo ) assignedTo->push_back( aSubShape );
+ }
+ }
+
+ // get hypos from ancestors of aSubShape
+ if ( andAncestors )
+ {
+ TopTools_MapOfShape map;
+
+ // user sorted submeshes of ancestors, according to stored submesh priority
+ const list<SMESH_subMesh*> smList = getAncestorsSubMeshes( aSubShape );
+ list<SMESH_subMesh*>::const_iterator smIt = smList.begin();
+ for ( ; smIt != smList.end(); smIt++ )
+ {
+ const TopoDS_Shape& curSh = (*smIt)->GetSubShape();
+ if ( !map.Add( curSh ))
+ continue;
+ const list<const SMESHDS_Hypothesis*>& hypList = _myMeshDS->GetHypothesis(curSh);
+ for ( hyp = hypList.begin(); hyp != hypList.end(); hyp++ )
+ if (aFilter.IsOk( cSMESH_Hyp( *hyp ), curSh ) &&
+ ( cSMESH_Hyp(*hyp)->IsAuxiliary() || !mainHypFound ) &&
+ hypTypes.insert( (*hyp)->GetName() ).second )
+ {
+ aHypList.push_back( *hyp );
+ nbHyps++;
+ if ( !cSMESH_Hyp(*hyp)->IsAuxiliary() )
+ mainHypFound = true;
+ if ( assignedTo ) assignedTo->push_back( curSh );
+ }
+ }
+ }
+ return nbHyps;
+}
+
+//================================================================================
+/*!
+ * \brief Return a hypothesis by its ID
+ */
+//================================================================================
+
+SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const int anHypId) const
+{
+ StudyContextStruct *sc = _gen->GetStudyContext(_studyId);
+ if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end())
+ return NULL;
+
+ SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId];
+ return anHyp;