+//================================================================================
+/*!
+ * @return true if group contents is computed
+ */
+//================================================================================
+
+CORBA::Boolean SMESH_GroupOnFilter_i::IsUpToDate()
+{
+ if ( myPreMeshInfo )
+ return false;
+
+ if ( SMESHDS_GroupOnFilter* grDS = dynamic_cast< SMESHDS_GroupOnFilter*>( GetGroupDS() ))
+ return grDS->IsUpToDate();
+
+ return false;
+}
+
+//=======================================================================
+//function : IsMeshInfoCorrect
+//purpose : Return false in two cases: 1) if mesh not loaded and GetMeshInfo() returns
+// incorrect information 2) mesh loaded but group contents is not computed
+//=======================================================================
+
+bool SMESH_GroupOnFilter_i::IsMeshInfoCorrect()
+{
+ return myPreMeshInfo ? myPreMeshInfo->IsMeshInfoCorrect() : IsUpToDate();
+}
+
+//=======================================================================
+//function : GetIDs
+//purpose : Return ids of members
+//=======================================================================
+
+SMESH::smIdType_array* SMESH_GroupOnFilter_i::GetListOfID()
+{
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
+ SMESH::smIdType_array_var aRes = new SMESH::smIdType_array();
+ SMESHDS_GroupBase* aGroupDS = GetGroupDS();
+ if ( SMESHDS_GroupOnFilter* grDS = dynamic_cast< SMESHDS_GroupOnFilter*>( GetGroupDS() ))
+ {
+ const SMDS_MeshInfo& meshInfo = aGroupDS->GetMesh()->GetMeshInfo();
+ aRes->length( meshInfo.NbElements( aGroupDS->GetType() ));
+ if ( aRes->length() ) // else aRes[0] -> SIGSEGV
+ aRes->length( grDS->GetElementIds( &aRes[0] ));
+
+ if ( 0 < aRes->length() && aRes->length() < 100 ) // for comfortable testing ;)
+ std::sort( &aRes[0], &aRes[0] + aRes->length() );
+ }
+ return aRes._retn();
+}
+
+//=============================================================================
+/*!
+ * Return statistic of mesh elements
+ * Result array of number enityties
+ * Inherited from SMESH_IDSource
+ */
+//=============================================================================
+
+SMESH::smIdType_array* SMESH_GroupOnFilter_i::GetMeshInfo()
+{
+ if ( myPreMeshInfo )
+ return myPreMeshInfo->GetMeshInfo();
+
+ SMESH::smIdType_array_var aRes = new SMESH::smIdType_array();
+ aRes->length(SMESH::Entity_Last);
+ for (int i = SMESH::Entity_Node; i < SMESH::Entity_Last; i++)
+ aRes[i] = 0;
+
+ if ( SMESHDS_GroupBase* g = GetGroupDS())
+ {
+ if ( g->GetType() == SMDSAbs_Node /*|| ( myNbNodes > -1 && g->GetTic() == myGroupDSTic)*/)
+ aRes[ SMDSEntity_Node ] = GetNumberOfNodes();
+
+ if ( g->GetType() != SMDSAbs_Node )
+ {
+ std::vector< smIdType > nbElems = static_cast< SMESHDS_GroupOnFilter* >( g )->GetMeshInfo();
+ for ( size_t i = SMESH::Entity_Node; i < SMESH::Entity_Last; i++)
+ if ( i < nbElems.size() )
+ aRes[i] = nbElems[ i ];
+ }
+ }
+
+ return aRes._retn();
+}
+